/** * Monaco Editor Component * VS Code's editor in the browser with tab system * * Features: * - Tab-based multi-file editing * - Syntax highlighting for 100+ languages * - Auto-save on Ctrl+S * - Dirty state indicators * - Mobile responsive (CodeMirror fallback on touch devices) */ class MonacoEditor { constructor(containerId) { this.container = document.getElementById(containerId); if (!this.container) { console.error('[MonacoEditor] Container not found:', containerId); return; } this.editors = new Map(); // tabId -> editor instance this.models = new Map(); // tabId -> model instance this.tabs = []; this.activeTab = null; this.monaco = null; this.isMobile = this.detectMobile(); this.initialized = false; } detectMobile() { // Check for actual mobile device (not just touch-enabled laptop) const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); // Also check screen width as additional heuristic const isSmallScreen = window.innerWidth < 768; return isMobile || isSmallScreen; } async initialize() { if (this.initialized) return; if (this.isMobile) { // Use CodeMirror for mobile (touch-friendly) console.log('[MonacoEditor] Mobile detected, using fallback'); this.initializeFallback(); return; } try { // Wrap AMD loader in promise await new Promise((resolve, reject) => { // Configure Monaco loader require.config({ paths: { 'vs': 'https://unpkg.com/monaco-editor@0.45.0/min/vs' } }); // Load Monaco require(['vs/editor/editor.main'], (monaco) => { this.monaco = monaco; this.setupContainer(); this.setupKeyboardShortcuts(); this.loadPersistedTabs(); this.initialized = true; console.log('[MonacoEditor] Initialized successfully'); resolve(); }, (error) => { console.error('[MonacoEditor] AMD loader error:', error); reject(error); }); }); } catch (error) { console.error('[MonacoEditor] Failed to initialize:', error); this.initializeFallback(); this.initialized = true; } } setupContainer() { this.container.innerHTML = `
Select a file from the sidebar to start editing
Files are automatically editable
Select a file from the sidebar to start editing
Full code editing coming soon to mobile!
For now, please use a desktop or tablet device.
${this.escapeHtml(content || '')}