overtype 1.2.2 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/overtype.js", "../src/parser.js", "../node_modules/markdown-actions/src/core/formats.js", "../node_modules/markdown-actions/src/debug.js", "../node_modules/markdown-actions/src/core/insertion.js", "../node_modules/markdown-actions/src/core/selection.js", "../node_modules/markdown-actions/src/operations/block.js", "../node_modules/markdown-actions/src/operations/list.js", "../node_modules/markdown-actions/src/core/detection.js", "../node_modules/markdown-actions/src/index.js", "../src/shortcuts.js", "../src/themes.js", "../src/styles.js", "../src/icons.js", "../src/toolbar.js", "../src/link-tooltip.js"],
4
- "sourcesContent": ["/**\n * OverType - A lightweight markdown editor library with perfect WYSIWYG alignment\n * @version 1.0.0\n * @license MIT\n */\n\nimport { MarkdownParser } from './parser.js';\nimport { ShortcutsManager } from './shortcuts.js';\nimport { generateStyles } from './styles.js';\nimport { getTheme, mergeTheme, solar, themeToCSSVars } from './themes.js';\nimport { Toolbar } from './toolbar.js';\nimport { LinkTooltip } from './link-tooltip.js';\n\n/**\n * OverType Editor Class\n */\nclass OverType {\n // Static properties\n static instances = new WeakMap();\n static stylesInjected = false;\n static globalListenersInitialized = false;\n static instanceCount = 0;\n\n /**\n * Constructor - Always returns an array of instances\n * @param {string|Element|NodeList|Array} target - Target element(s)\n * @param {Object} options - Configuration options\n * @returns {Array} Array of OverType instances\n */\n constructor(target, options = {}) {\n // Convert target to array of elements\n let elements;\n \n if (typeof target === 'string') {\n elements = document.querySelectorAll(target);\n if (elements.length === 0) {\n throw new Error(`No elements found for selector: ${target}`);\n }\n elements = Array.from(elements);\n } else if (target instanceof Element) {\n elements = [target];\n } else if (target instanceof NodeList) {\n elements = Array.from(target);\n } else if (Array.isArray(target)) {\n elements = target;\n } else {\n throw new Error('Invalid target: must be selector string, Element, NodeList, or Array');\n }\n\n // Initialize all elements and return array\n const instances = elements.map(element => {\n // Check for existing instance\n if (element.overTypeInstance) {\n // Re-init existing instance\n element.overTypeInstance.reinit(options);\n return element.overTypeInstance;\n }\n\n // Create new instance\n const instance = Object.create(OverType.prototype);\n instance._init(element, options);\n element.overTypeInstance = instance;\n OverType.instances.set(element, instance);\n return instance;\n });\n\n return instances;\n }\n\n /**\n * Internal initialization\n * @private\n */\n _init(element, options = {}) {\n this.element = element;\n \n // Store the original theme option before merging\n this.instanceTheme = options.theme || null;\n \n this.options = this._mergeOptions(options);\n this.instanceId = ++OverType.instanceCount;\n this.initialized = false;\n\n // Inject styles if needed\n OverType.injectStyles();\n\n // Initialize global listeners\n OverType.initGlobalListeners();\n\n // Check for existing OverType DOM structure\n const container = element.querySelector('.overtype-container');\n const wrapper = element.querySelector('.overtype-wrapper');\n if (container || wrapper) {\n this._recoverFromDOM(container, wrapper);\n } else {\n this._buildFromScratch();\n }\n\n // Setup shortcuts manager\n this.shortcuts = new ShortcutsManager(this);\n \n // Setup link tooltip\n this.linkTooltip = new LinkTooltip(this);\n\n // Setup toolbar if enabled\n if (this.options.toolbar) {\n this.toolbar = new Toolbar(this);\n this.toolbar.create();\n \n // Update toolbar states on selection change\n this.textarea.addEventListener('selectionchange', () => {\n this.toolbar.updateButtonStates();\n });\n this.textarea.addEventListener('input', () => {\n this.toolbar.updateButtonStates();\n });\n }\n\n // Mark as initialized\n this.initialized = true;\n\n // Call onChange if provided\n if (this.options.onChange) {\n this.options.onChange(this.getValue(), this);\n }\n }\n\n /**\n * Merge user options with defaults\n * @private\n */\n _mergeOptions(options) {\n const defaults = {\n // Typography\n fontSize: '14px',\n lineHeight: 1.6,\n /* System-first, guaranteed monospaced; avoids Android 'ui-monospace' pitfalls */\n fontFamily: '\"SF Mono\", SFMono-Regular, Menlo, Monaco, \"Cascadia Code\", Consolas, \"Roboto Mono\", \"Noto Sans Mono\", \"Droid Sans Mono\", \"Ubuntu Mono\", \"DejaVu Sans Mono\", \"Liberation Mono\", \"Courier New\", Courier, monospace',\n padding: '16px',\n \n // Mobile styles\n mobile: {\n fontSize: '16px', // Prevent zoom on iOS\n padding: '12px',\n lineHeight: 1.5\n },\n \n // Native textarea properties\n textareaProps: {},\n \n // Behavior\n autofocus: false,\n autoResize: false, // Auto-expand height with content\n minHeight: '100px', // Minimum height for autoResize mode\n maxHeight: null, // Maximum height for autoResize mode (null = unlimited)\n placeholder: 'Start typing...',\n value: '',\n \n // Callbacks\n onChange: null,\n onKeydown: null,\n \n // Features\n showActiveLineRaw: false,\n showStats: false,\n toolbar: false,\n statsFormatter: null\n };\n \n // Remove theme and colors from options - these are now global\n const { theme, colors, ...cleanOptions } = options;\n \n return {\n ...defaults,\n ...cleanOptions\n };\n }\n\n /**\n * Recover from existing DOM structure\n * @private\n */\n _recoverFromDOM(container, wrapper) {\n // Handle old structure (wrapper only) or new structure (container + wrapper)\n if (container && container.classList.contains('overtype-container')) {\n this.container = container;\n this.wrapper = container.querySelector('.overtype-wrapper');\n } else if (wrapper) {\n // Old structure - just wrapper, no container\n this.wrapper = wrapper;\n // Wrap it in a container for consistency\n this.container = document.createElement('div');\n this.container.className = 'overtype-container';\n // Use instance theme if provided, otherwise use global theme\n const themeToUse = this.instanceTheme || OverType.currentTheme || solar;\n const themeName = typeof themeToUse === 'string' ? themeToUse : themeToUse.name;\n if (themeName) {\n this.container.setAttribute('data-theme', themeName);\n }\n \n // If using instance theme, apply CSS variables to container\n if (this.instanceTheme) {\n const themeObj = typeof this.instanceTheme === 'string' ? getTheme(this.instanceTheme) : this.instanceTheme;\n if (themeObj && themeObj.colors) {\n const cssVars = themeToCSSVars(themeObj.colors);\n this.container.style.cssText += cssVars;\n }\n }\n wrapper.parentNode.insertBefore(this.container, wrapper);\n this.container.appendChild(wrapper);\n }\n \n if (!this.wrapper) {\n // No valid structure found\n if (container) container.remove();\n if (wrapper) wrapper.remove();\n this._buildFromScratch();\n return;\n }\n \n this.textarea = this.wrapper.querySelector('.overtype-input');\n this.preview = this.wrapper.querySelector('.overtype-preview');\n\n if (!this.textarea || !this.preview) {\n // Partial DOM - clear and rebuild\n this.container.remove();\n this._buildFromScratch();\n return;\n }\n\n // Store reference on wrapper\n this.wrapper._instance = this;\n \n // Apply instance-specific styles via CSS custom properties\n if (this.options.fontSize) {\n this.wrapper.style.setProperty('--instance-font-size', this.options.fontSize);\n }\n if (this.options.lineHeight) {\n this.wrapper.style.setProperty('--instance-line-height', String(this.options.lineHeight));\n }\n if (this.options.padding) {\n this.wrapper.style.setProperty('--instance-padding', this.options.padding);\n }\n\n // Disable autofill, spellcheck, and extensions\n this._configureTextarea();\n\n // Apply any new options\n this._applyOptions();\n }\n\n /**\n * Build editor from scratch\n * @private\n */\n _buildFromScratch() {\n // Extract any existing content\n const content = this._extractContent();\n\n // Clear element\n this.element.innerHTML = '';\n\n // Create DOM structure\n this._createDOM();\n\n // Set initial content\n if (content || this.options.value) {\n this.setValue(content || this.options.value);\n }\n\n // Apply options\n this._applyOptions();\n }\n\n /**\n * Extract content from element\n * @private\n */\n _extractContent() {\n // Look for existing OverType textarea\n const textarea = this.element.querySelector('.overtype-input');\n if (textarea) return textarea.value;\n\n // Use element's text content as fallback\n return this.element.textContent || '';\n }\n\n /**\n * Create DOM structure\n * @private\n */\n _createDOM() {\n // Create container that will hold toolbar and editor\n this.container = document.createElement('div');\n this.container.className = 'overtype-container';\n \n // Set theme on container - use instance theme if provided\n const themeToUse = this.instanceTheme || OverType.currentTheme || solar;\n const themeName = typeof themeToUse === 'string' ? themeToUse : themeToUse.name;\n if (themeName) {\n this.container.setAttribute('data-theme', themeName);\n }\n \n // If using instance theme, apply CSS variables to container\n if (this.instanceTheme) {\n const themeObj = typeof this.instanceTheme === 'string' ? getTheme(this.instanceTheme) : this.instanceTheme;\n if (themeObj && themeObj.colors) {\n const cssVars = themeToCSSVars(themeObj.colors);\n this.container.style.cssText += cssVars;\n }\n }\n \n // Create wrapper for editor\n this.wrapper = document.createElement('div');\n this.wrapper.className = 'overtype-wrapper';\n \n \n // Apply instance-specific styles via CSS custom properties\n if (this.options.fontSize) {\n this.wrapper.style.setProperty('--instance-font-size', this.options.fontSize);\n }\n if (this.options.lineHeight) {\n this.wrapper.style.setProperty('--instance-line-height', String(this.options.lineHeight));\n }\n if (this.options.padding) {\n this.wrapper.style.setProperty('--instance-padding', this.options.padding);\n }\n \n this.wrapper._instance = this;\n\n // Create textarea\n this.textarea = document.createElement('textarea');\n this.textarea.className = 'overtype-input';\n this.textarea.placeholder = this.options.placeholder;\n this._configureTextarea();\n \n // Apply any native textarea properties\n if (this.options.textareaProps) {\n Object.entries(this.options.textareaProps).forEach(([key, value]) => {\n if (key === 'className' || key === 'class') {\n this.textarea.className += ' ' + value;\n } else if (key === 'style' && typeof value === 'object') {\n Object.assign(this.textarea.style, value);\n } else {\n this.textarea.setAttribute(key, value);\n }\n });\n }\n\n // Create preview div\n this.preview = document.createElement('div');\n this.preview.className = 'overtype-preview';\n this.preview.setAttribute('aria-hidden', 'true');\n\n // Assemble DOM\n this.wrapper.appendChild(this.textarea);\n this.wrapper.appendChild(this.preview);\n \n // No need to prevent link clicks - pointer-events handles this\n \n // Add wrapper to container first\n this.container.appendChild(this.wrapper);\n \n // Add stats bar at the end (bottom) if enabled\n if (this.options.showStats) {\n this.statsBar = document.createElement('div');\n this.statsBar.className = 'overtype-stats';\n this.container.appendChild(this.statsBar);\n this._updateStats();\n }\n \n // Add container to element\n this.element.appendChild(this.container);\n \n // Debug logging\n if (window.location.pathname.includes('demo.html')) {\n console.log('_createDOM completed:', {\n elementId: this.element.id,\n autoResize: this.options.autoResize,\n containerClasses: this.container.className,\n hasStats: !!this.statsBar,\n hasToolbar: this.options.toolbar\n });\n }\n \n // Setup auto-resize if enabled\n if (this.options.autoResize) {\n this._setupAutoResize();\n } else {\n // Ensure auto-resize class is removed if not using auto-resize\n this.container.classList.remove('overtype-auto-resize');\n \n if (window.location.pathname.includes('demo.html')) {\n console.log('Removed auto-resize class from:', this.element.id);\n }\n }\n }\n\n /**\n * Configure textarea attributes\n * @private\n */\n _configureTextarea() {\n this.textarea.setAttribute('autocomplete', 'off');\n this.textarea.setAttribute('autocorrect', 'off');\n this.textarea.setAttribute('autocapitalize', 'off');\n this.textarea.setAttribute('spellcheck', 'false');\n this.textarea.setAttribute('data-gramm', 'false');\n this.textarea.setAttribute('data-gramm_editor', 'false');\n this.textarea.setAttribute('data-enable-grammarly', 'false');\n }\n\n /**\n * Apply options to the editor\n * @private\n */\n _applyOptions() {\n // Apply autofocus\n if (this.options.autofocus) {\n this.textarea.focus();\n }\n \n // Setup or remove auto-resize\n if (this.options.autoResize) {\n if (!this.container.classList.contains('overtype-auto-resize')) {\n this._setupAutoResize();\n }\n } else {\n // Ensure auto-resize class is removed\n this.container.classList.remove('overtype-auto-resize');\n }\n\n // Update preview with initial content\n this.updatePreview();\n }\n\n /**\n * Update preview with parsed markdown\n */\n updatePreview() {\n const text = this.textarea.value;\n const cursorPos = this.textarea.selectionStart;\n const activeLine = this._getCurrentLine(text, cursorPos);\n \n // Parse markdown\n const html = MarkdownParser.parse(text, activeLine, this.options.showActiveLineRaw);\n this.preview.innerHTML = html || '<span style=\"color: #808080;\">Start typing...</span>';\n \n // Apply code block backgrounds\n this._applyCodeBlockBackgrounds();\n \n // Links always have real hrefs now - no need to update them\n \n // Update stats if enabled\n if (this.options.showStats && this.statsBar) {\n this._updateStats();\n }\n \n // Trigger onChange callback\n if (this.options.onChange && this.initialized) {\n this.options.onChange(text, this);\n }\n }\n\n /**\n * Apply background styling to code blocks\n * @private\n */\n _applyCodeBlockBackgrounds() {\n // Find all code fence elements\n const codeFences = this.preview.querySelectorAll('.code-fence');\n \n // Process pairs of code fences\n for (let i = 0; i < codeFences.length - 1; i += 2) {\n const openFence = codeFences[i];\n const closeFence = codeFences[i + 1];\n \n // Get parent divs\n const openParent = openFence.parentElement;\n const closeParent = closeFence.parentElement;\n \n if (!openParent || !closeParent) continue;\n \n // Make fences display: block\n openFence.style.display = 'block';\n closeFence.style.display = 'block';\n \n // Apply class to parent divs\n openParent.classList.add('code-block-line');\n closeParent.classList.add('code-block-line');\n \n // With the new structure, there's a <pre> block between fences, not DIVs\n // We don't need to process anything between the fences anymore\n // The <pre><code> structure already handles the content correctly\n }\n }\n\n /**\n * Get current line number from cursor position\n * @private\n */\n _getCurrentLine(text, cursorPos) {\n const lines = text.substring(0, cursorPos).split('\\n');\n return lines.length - 1;\n }\n\n /**\n * Handle input events\n * @private\n */\n handleInput(event) {\n this.updatePreview();\n }\n\n /**\n * Handle keydown events\n * @private\n */\n handleKeydown(event) {\n // Handle Tab key to prevent focus loss and insert spaces\n if (event.key === 'Tab') {\n event.preventDefault();\n \n const start = this.textarea.selectionStart;\n const end = this.textarea.selectionEnd;\n const value = this.textarea.value;\n \n // If there's a selection, indent/outdent based on shift key\n if (start !== end && event.shiftKey) {\n // Outdent: remove 2 spaces from start of each selected line\n const before = value.substring(0, start);\n const selection = value.substring(start, end);\n const after = value.substring(end);\n \n const lines = selection.split('\\n');\n const outdented = lines.map(line => line.replace(/^ /, '')).join('\\n');\n \n // Try to use execCommand first to preserve undo history\n if (document.execCommand) {\n // Select the text that needs to be replaced\n this.textarea.setSelectionRange(start, end);\n document.execCommand('insertText', false, outdented);\n } else {\n // Fallback to direct manipulation\n this.textarea.value = before + outdented + after;\n this.textarea.selectionStart = start;\n this.textarea.selectionEnd = start + outdented.length;\n }\n } else if (start !== end) {\n // Indent: add 2 spaces to start of each selected line\n const before = value.substring(0, start);\n const selection = value.substring(start, end);\n const after = value.substring(end);\n \n const lines = selection.split('\\n');\n const indented = lines.map(line => ' ' + line).join('\\n');\n \n // Try to use execCommand first to preserve undo history\n if (document.execCommand) {\n // Select the text that needs to be replaced\n this.textarea.setSelectionRange(start, end);\n document.execCommand('insertText', false, indented);\n } else {\n // Fallback to direct manipulation\n this.textarea.value = before + indented + after;\n this.textarea.selectionStart = start;\n this.textarea.selectionEnd = start + indented.length;\n }\n } else {\n // No selection: just insert 2 spaces\n // Use execCommand to preserve undo history\n if (document.execCommand) {\n document.execCommand('insertText', false, ' ');\n } else {\n // Fallback to direct manipulation\n this.textarea.value = value.substring(0, start) + ' ' + value.substring(end);\n this.textarea.selectionStart = this.textarea.selectionEnd = start + 2;\n }\n }\n \n // Trigger input event to update preview\n this.textarea.dispatchEvent(new Event('input', { bubbles: true }));\n return;\n }\n \n // Let shortcuts manager handle other keys\n const handled = this.shortcuts.handleKeydown(event);\n \n // Call user callback if provided\n if (!handled && this.options.onKeydown) {\n this.options.onKeydown(event, this);\n }\n }\n\n /**\n * Handle scroll events\n * @private\n */\n handleScroll(event) {\n // Sync preview scroll with textarea\n this.preview.scrollTop = this.textarea.scrollTop;\n this.preview.scrollLeft = this.textarea.scrollLeft;\n }\n\n /**\n * Get editor content\n * @returns {string} Current markdown content\n */\n getValue() {\n return this.textarea.value;\n }\n\n /**\n * Set editor content\n * @param {string} value - Markdown content to set\n */\n setValue(value) {\n this.textarea.value = value;\n this.updatePreview();\n \n // Update height if auto-resize is enabled\n if (this.options.autoResize) {\n this._updateAutoHeight();\n }\n }\n\n\n /**\n * Get the rendered HTML of the current content\n * @param {boolean} processForPreview - If true, post-processes HTML for preview mode (consolidates lists/code blocks)\n * @returns {string} Rendered HTML\n */\n getRenderedHTML(processForPreview = false) {\n const markdown = this.getValue();\n let html = MarkdownParser.parse(markdown);\n \n if (processForPreview) {\n // Post-process HTML for preview mode\n html = MarkdownParser.postProcessHTML(html);\n }\n \n return html;\n }\n\n /**\n * Get the current preview element's HTML\n * @returns {string} Current preview HTML (as displayed)\n */\n getPreviewHTML() {\n return this.preview.innerHTML;\n }\n\n /**\n * Focus the editor\n */\n focus() {\n this.textarea.focus();\n }\n\n /**\n * Blur the editor\n */\n blur() {\n this.textarea.blur();\n }\n\n /**\n * Check if editor is initialized\n * @returns {boolean}\n */\n isInitialized() {\n return this.initialized;\n }\n\n /**\n * Re-initialize with new options\n * @param {Object} options - New options to apply\n */\n reinit(options = {}) {\n this.options = this._mergeOptions({ ...this.options, ...options });\n this._applyOptions();\n this.updatePreview();\n }\n\n /**\n * Update stats bar\n * @private\n */\n _updateStats() {\n if (!this.statsBar) return;\n \n const value = this.textarea.value;\n const lines = value.split('\\n');\n const chars = value.length;\n const words = value.split(/\\s+/).filter(w => w.length > 0).length;\n \n // Calculate line and column\n const selectionStart = this.textarea.selectionStart;\n const beforeCursor = value.substring(0, selectionStart);\n const linesBeforeCursor = beforeCursor.split('\\n');\n const currentLine = linesBeforeCursor.length;\n const currentColumn = linesBeforeCursor[linesBeforeCursor.length - 1].length + 1;\n \n // Use custom formatter if provided\n if (this.options.statsFormatter) {\n this.statsBar.innerHTML = this.options.statsFormatter({\n chars,\n words,\n lines: lines.length,\n line: currentLine,\n column: currentColumn\n });\n } else {\n // Default format with live dot\n this.statsBar.innerHTML = `\n <div class=\"overtype-stat\">\n <span class=\"live-dot\"></span>\n <span>${chars} chars, ${words} words, ${lines.length} lines</span>\n </div>\n <div class=\"overtype-stat\">Line ${currentLine}, Col ${currentColumn}</div>\n `;\n }\n }\n \n /**\n * Setup auto-resize functionality\n * @private\n */\n _setupAutoResize() {\n // Add auto-resize class for styling\n this.container.classList.add('overtype-auto-resize');\n \n // Store previous height for comparison\n this.previousHeight = null;\n \n // Initial height update\n this._updateAutoHeight();\n \n // Listen for input events\n this.textarea.addEventListener('input', () => this._updateAutoHeight());\n \n // Listen for window resize\n window.addEventListener('resize', () => this._updateAutoHeight());\n }\n \n /**\n * Update height based on scrollHeight\n * @private\n */\n _updateAutoHeight() {\n if (!this.options.autoResize) return;\n \n const textarea = this.textarea;\n const preview = this.preview;\n const wrapper = this.wrapper;\n \n // Get computed styles\n const computed = window.getComputedStyle(textarea);\n const paddingTop = parseFloat(computed.paddingTop);\n const paddingBottom = parseFloat(computed.paddingBottom);\n \n // Store scroll positions\n const scrollTop = textarea.scrollTop;\n \n // Reset height to get accurate scrollHeight\n textarea.style.setProperty('height', 'auto', 'important');\n \n // Calculate new height based on scrollHeight\n let newHeight = textarea.scrollHeight;\n \n // Apply min height constraint\n if (this.options.minHeight) {\n const minHeight = parseInt(this.options.minHeight);\n newHeight = Math.max(newHeight, minHeight);\n }\n \n // Apply max height constraint\n let overflow = 'hidden';\n if (this.options.maxHeight) {\n const maxHeight = parseInt(this.options.maxHeight);\n if (newHeight > maxHeight) {\n newHeight = maxHeight;\n overflow = 'auto';\n }\n }\n \n // Apply the new height to all elements with !important to override base styles\n const heightPx = newHeight + 'px';\n textarea.style.setProperty('height', heightPx, 'important');\n textarea.style.setProperty('overflow-y', overflow, 'important');\n \n preview.style.setProperty('height', heightPx, 'important');\n preview.style.setProperty('overflow-y', overflow, 'important');\n \n wrapper.style.setProperty('height', heightPx, 'important');\n \n // Restore scroll position\n textarea.scrollTop = scrollTop;\n preview.scrollTop = scrollTop;\n \n // Track if height changed\n if (this.previousHeight !== newHeight) {\n this.previousHeight = newHeight;\n // Could dispatch a custom event here if needed\n }\n }\n \n /**\n * Show or hide stats bar\n * @param {boolean} show - Whether to show stats\n */\n showStats(show) {\n this.options.showStats = show;\n \n if (show && !this.statsBar) {\n // Create stats bar (add to container, not wrapper)\n this.statsBar = document.createElement('div');\n this.statsBar.className = 'overtype-stats';\n this.container.appendChild(this.statsBar);\n this._updateStats();\n } else if (!show && this.statsBar) {\n // Remove stats bar\n this.statsBar.remove();\n this.statsBar = null;\n }\n }\n \n /**\n * Show or hide the plain textarea (toggle overlay visibility)\n * @param {boolean} show - true to show plain textarea (hide overlay), false to show overlay\n * @returns {boolean} Current plain textarea state\n */\n showPlainTextarea(show) {\n if (show) {\n // Show plain textarea mode (hide overlay)\n this.container.classList.add('plain-mode');\n } else {\n // Show overlay mode (hide plain textarea text)\n this.container.classList.remove('plain-mode');\n }\n \n // Update toolbar button if exists\n if (this.toolbar) {\n const toggleBtn = this.container.querySelector('[data-action=\"toggle-plain\"]');\n if (toggleBtn) {\n // Button is active when showing overlay (not plain mode)\n toggleBtn.classList.toggle('active', !show);\n toggleBtn.title = show ? 'Show markdown preview' : 'Show plain textarea';\n }\n }\n \n return show;\n }\n\n /**\n * Show/hide preview mode\n * @param {boolean} show - Show preview mode if true, edit mode if false\n * @returns {boolean} Current preview mode state\n */\n showPreviewMode(show) {\n if (show) {\n // Show preview mode (hide textarea, make preview interactive)\n this.container.classList.add('preview-mode');\n } else {\n // Show edit mode\n this.container.classList.remove('preview-mode');\n }\n \n return show;\n }\n\n /**\n * Destroy the editor instance\n */\n destroy() {\n // Remove instance reference\n this.element.overTypeInstance = null;\n OverType.instances.delete(this.element);\n\n // Cleanup shortcuts\n if (this.shortcuts) {\n this.shortcuts.destroy();\n }\n\n // Remove DOM if created by us\n if (this.wrapper) {\n const content = this.getValue();\n this.wrapper.remove();\n \n // Restore original content\n this.element.textContent = content;\n }\n\n this.initialized = false;\n }\n\n // ===== Static Methods =====\n\n /**\n * Initialize multiple editors (static convenience method)\n * @param {string|Element|NodeList|Array} target - Target element(s)\n * @param {Object} options - Configuration options\n * @returns {Array} Array of OverType instances\n */\n static init(target, options = {}) {\n return new OverType(target, options);\n }\n\n /**\n * Get instance from element\n * @param {Element} element - DOM element\n * @returns {OverType|null} OverType instance or null\n */\n static getInstance(element) {\n return element.overTypeInstance || OverType.instances.get(element) || null;\n }\n\n /**\n * Destroy all instances\n */\n static destroyAll() {\n const elements = document.querySelectorAll('[data-overtype-instance]');\n elements.forEach(element => {\n const instance = OverType.getInstance(element);\n if (instance) {\n instance.destroy();\n }\n });\n }\n\n /**\n * Inject styles into the document\n * @param {boolean} force - Force re-injection\n */\n static injectStyles(force = false) {\n if (OverType.stylesInjected && !force) return;\n\n // Remove any existing OverType styles\n const existing = document.querySelector('style.overtype-styles');\n if (existing) {\n existing.remove();\n }\n\n // Generate and inject new styles with current theme\n const theme = OverType.currentTheme || solar;\n const styles = generateStyles({ theme });\n const styleEl = document.createElement('style');\n styleEl.className = 'overtype-styles';\n styleEl.textContent = styles;\n document.head.appendChild(styleEl);\n\n OverType.stylesInjected = true;\n }\n \n /**\n * Set global theme for all OverType instances\n * @param {string|Object} theme - Theme name or custom theme object\n * @param {Object} customColors - Optional color overrides\n */\n static setTheme(theme, customColors = null) {\n // Process theme\n let themeObj = typeof theme === 'string' ? getTheme(theme) : theme;\n \n // Apply custom colors if provided\n if (customColors) {\n themeObj = mergeTheme(themeObj, customColors);\n }\n \n // Store as current theme\n OverType.currentTheme = themeObj;\n \n // Re-inject styles with new theme\n OverType.injectStyles(true);\n \n // Update all existing instances - update container theme attribute\n document.querySelectorAll('.overtype-container').forEach(container => {\n const themeName = typeof themeObj === 'string' ? themeObj : themeObj.name;\n if (themeName) {\n container.setAttribute('data-theme', themeName);\n }\n });\n \n // Also handle any old-style wrappers without containers\n document.querySelectorAll('.overtype-wrapper').forEach(wrapper => {\n if (!wrapper.closest('.overtype-container')) {\n const themeName = typeof themeObj === 'string' ? themeObj : themeObj.name;\n if (themeName) {\n wrapper.setAttribute('data-theme', themeName);\n }\n }\n \n // Trigger preview update for the instance\n const instance = wrapper._instance;\n if (instance) {\n instance.updatePreview();\n }\n });\n }\n\n /**\n * Initialize global event listeners\n */\n static initGlobalListeners() {\n if (OverType.globalListenersInitialized) return;\n\n // Input event\n document.addEventListener('input', (e) => {\n if (e.target && e.target.classList && e.target.classList.contains('overtype-input')) {\n const wrapper = e.target.closest('.overtype-wrapper');\n const instance = wrapper?._instance;\n if (instance) instance.handleInput(e);\n }\n });\n\n // Keydown event\n document.addEventListener('keydown', (e) => {\n if (e.target && e.target.classList && e.target.classList.contains('overtype-input')) {\n const wrapper = e.target.closest('.overtype-wrapper');\n const instance = wrapper?._instance;\n if (instance) instance.handleKeydown(e);\n }\n });\n\n // Scroll event\n document.addEventListener('scroll', (e) => {\n if (e.target && e.target.classList && e.target.classList.contains('overtype-input')) {\n const wrapper = e.target.closest('.overtype-wrapper');\n const instance = wrapper?._instance;\n if (instance) instance.handleScroll(e);\n }\n }, true);\n\n // Selection change event\n document.addEventListener('selectionchange', (e) => {\n const activeElement = document.activeElement;\n if (activeElement && activeElement.classList.contains('overtype-input')) {\n const wrapper = activeElement.closest('.overtype-wrapper');\n const instance = wrapper?._instance;\n if (instance) {\n // Update stats bar for cursor position\n if (instance.options.showStats && instance.statsBar) {\n instance._updateStats();\n }\n // Debounce updates\n clearTimeout(instance._selectionTimeout);\n instance._selectionTimeout = setTimeout(() => {\n instance.updatePreview();\n }, 50);\n }\n }\n });\n\n OverType.globalListenersInitialized = true;\n }\n}\n\n// Export classes for advanced usage\nOverType.MarkdownParser = MarkdownParser;\nOverType.ShortcutsManager = ShortcutsManager;\n\n// Export theme utilities\nOverType.themes = { solar, cave: getTheme('cave') };\nOverType.getTheme = getTheme;\n\n// Set default theme\nOverType.currentTheme = solar;\n\n// Only attach to global in browser environments (not Node.js)\nif (typeof window !== 'undefined' && typeof window.document !== 'undefined') {\n // Browser environment - attach to window\n window.OverType = OverType;\n}\n\n// Export for module systems\nexport default OverType;\nexport { OverType };", "/**\n * MarkdownParser - Parses markdown into HTML while preserving character alignment\n * \n * Key principles:\n * - Every character must occupy the exact same position as in the textarea\n * - No font-size changes, no padding/margin on inline elements\n * - Markdown tokens remain visible but styled\n */\nexport class MarkdownParser {\n // Track link index for anchor naming\n static linkIndex = 0;\n \n /**\n * Reset link index (call before parsing a new document)\n */\n static resetLinkIndex() {\n this.linkIndex = 0;\n }\n \n /**\n * Escape HTML special characters\n * @param {string} text - Raw text to escape\n * @returns {string} Escaped HTML-safe text\n */\n static escapeHtml(text) {\n const map = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\n };\n return text.replace(/[&<>\"']/g, m => map[m]);\n }\n\n /**\n * Preserve leading spaces as non-breaking spaces\n * @param {string} html - HTML string\n * @param {string} originalLine - Original line with spaces\n * @returns {string} HTML with preserved indentation\n */\n static preserveIndentation(html, originalLine) {\n const leadingSpaces = originalLine.match(/^(\\s*)/)[1];\n const indentation = leadingSpaces.replace(/ /g, '&nbsp;');\n return html.replace(/^\\s*/, indentation);\n }\n\n /**\n * Parse headers (h1-h3 only)\n * @param {string} html - HTML line to parse\n * @returns {string} Parsed HTML with header styling\n */\n static parseHeader(html) {\n return html.replace(/^(#{1,3})\\s(.+)$/, (match, hashes, content) => {\n const level = hashes.length;\n return `<h${level}><span class=\"syntax-marker\">${hashes} </span>${content}</h${level}>`;\n });\n }\n\n /**\n * Parse horizontal rules\n * @param {string} html - HTML line to parse\n * @returns {string|null} Parsed horizontal rule or null\n */\n static parseHorizontalRule(html) {\n if (html.match(/^(-{3,}|\\*{3,}|_{3,})$/)) {\n return `<div><span class=\"hr-marker\">${html}</span></div>`;\n }\n return null;\n }\n\n /**\n * Parse blockquotes\n * @param {string} html - HTML line to parse\n * @returns {string} Parsed blockquote\n */\n static parseBlockquote(html) {\n return html.replace(/^&gt; (.+)$/, (match, content) => {\n return `<span class=\"blockquote\"><span class=\"syntax-marker\">&gt;</span> ${content}</span>`;\n });\n }\n\n /**\n * Parse bullet lists\n * @param {string} html - HTML line to parse\n * @returns {string} Parsed bullet list item\n */\n static parseBulletList(html) {\n return html.replace(/^((?:&nbsp;)*)([-*])\\s(.+)$/, (match, indent, marker, content) => {\n return `${indent}<li class=\"bullet-list\"><span class=\"syntax-marker\">${marker} </span>${content}</li>`;\n });\n }\n\n /**\n * Parse numbered lists\n * @param {string} html - HTML line to parse\n * @returns {string} Parsed numbered list item\n */\n static parseNumberedList(html) {\n return html.replace(/^((?:&nbsp;)*)(\\d+\\.)\\s(.+)$/, (match, indent, marker, content) => {\n return `${indent}<li class=\"ordered-list\"><span class=\"syntax-marker\">${marker} </span>${content}</li>`;\n });\n }\n\n /**\n * Parse code blocks (markers only)\n * @param {string} html - HTML line to parse\n * @returns {string|null} Parsed code fence or null\n */\n static parseCodeBlock(html) {\n // The line must start with three backticks and have no backticks after subsequent text\n const codeFenceRegex = /^`{3}[^`]*$/;\n if (codeFenceRegex.test(html)) {\n return `<div><span class=\"code-fence\">${html}</span></div>`;\n }\n return null;\n }\n\n /**\n * Parse bold text\n * @param {string} html - HTML with potential bold markdown\n * @returns {string} HTML with bold styling\n */\n static parseBold(html) {\n html = html.replace(/\\*\\*(.+?)\\*\\*/g, '<strong><span class=\"syntax-marker\">**</span>$1<span class=\"syntax-marker\">**</span></strong>');\n html = html.replace(/__(.+?)__/g, '<strong><span class=\"syntax-marker\">__</span>$1<span class=\"syntax-marker\">__</span></strong>');\n return html;\n }\n\n /**\n * Parse italic text\n * Note: Uses lookbehind assertions - requires modern browsers\n * @param {string} html - HTML with potential italic markdown\n * @returns {string} HTML with italic styling\n */\n static parseItalic(html) {\n html = html.replace(/(?<!\\*)\\*(?!\\*)(.+?)(?<!\\*)\\*(?!\\*)/g, '<em><span class=\"syntax-marker\">*</span>$1<span class=\"syntax-marker\">*</span></em>');\n html = html.replace(/(?<!_)_(?!_)(.+?)(?<!_)_(?!_)/g, '<em><span class=\"syntax-marker\">_</span>$1<span class=\"syntax-marker\">_</span></em>');\n return html;\n }\n\n /**\n * Parse inline code\n * @param {string} html - HTML with potential code markdown\n * @returns {string} HTML with code styling\n */\n static parseInlineCode(html) {\n // Must have equal number of backticks before and after inline code\n //\n // Regex explainer:\n // (?<!`): A negative lookbehind ensuring the opening backticks are not preceded by another backtick.\n // (`+): A capturing group that matches and remembers the opening sequence of one or more backticks. This is Group 1.\n // ((?:(?!\\1).)+?): A capturing group that greedily matches any character that is not the exact sequence of backticks captured in Group 1. This is Group 2.\n // (\\1): A backreference to Group 1, ensuring the closing sequence has the exact same number of backticks as the opening sequence. This is Group 3.\n // (?!`): A negative lookahead ensuring the closing backticks are not followed by another backtick.\n return html.replace(/(?<!`)(`+)(?!`)((?:(?!\\1).)+?)(\\1)(?!`)/g, '<code><span class=\"syntax-marker\">$1</span>$2<span class=\"syntax-marker\">$3</span></code>');\n }\n\n /**\n * Sanitize URL to prevent XSS attacks\n * @param {string} url - URL to sanitize\n * @returns {string} Safe URL or '#' if dangerous\n */\n static sanitizeUrl(url) {\n // Trim whitespace and convert to lowercase for protocol check\n const trimmed = url.trim();\n const lower = trimmed.toLowerCase();\n \n // Allow safe protocols\n const safeProtocols = [\n 'http://',\n 'https://',\n 'mailto:',\n 'ftp://',\n 'ftps://'\n ];\n \n // Check if URL starts with a safe protocol\n const hasSafeProtocol = safeProtocols.some(protocol => lower.startsWith(protocol));\n \n // Allow relative URLs (starting with / or # or no protocol)\n const isRelative = trimmed.startsWith('/') || \n trimmed.startsWith('#') || \n trimmed.startsWith('?') ||\n trimmed.startsWith('.') ||\n (!trimmed.includes(':') && !trimmed.includes('//'));\n \n // If safe protocol or relative URL, return as-is\n if (hasSafeProtocol || isRelative) {\n return url;\n }\n \n // Block dangerous protocols (javascript:, data:, vbscript:, etc.)\n return '#';\n }\n\n /**\n * Parse links\n * @param {string} html - HTML with potential link markdown\n * @returns {string} HTML with link styling\n */\n static parseLinks(html) {\n return html.replace(/\\[(.+?)\\]\\((.+?)\\)/g, (match, text, url) => {\n const anchorName = `--link-${this.linkIndex++}`;\n // Sanitize URL to prevent XSS attacks\n const safeUrl = this.sanitizeUrl(url);\n // Use real href - pointer-events handles click prevention in normal mode\n return `<a href=\"${safeUrl}\" style=\"anchor-name: ${anchorName}\"><span class=\"syntax-marker\">[</span>${text}<span class=\"syntax-marker url-part\">](${url})</span></a>`;\n });\n }\n\n /**\n * Parse all inline elements in correct order\n * @param {string} text - Text with potential inline markdown\n * @returns {string} HTML with all inline styling\n */\n static parseInlineElements(text) {\n let html = text;\n // Order matters: parse code first\n html = this.parseInlineCode(html);\n \n // Use placeholders to protect inline code while preserving formatting spans\n // We use Unicode Private Use Area (U+E000-U+F8FF) as placeholders because:\n // 1. These characters are reserved for application-specific use\n // 2. They'll never appear in user text\n // 3. They maintain single-character width (important for alignment)\n // 4. They're invisible if accidentally rendered\n const sanctuaries = new Map();\n \n // Protect code blocks\n html = html.replace(/(<code>.*?<\\/code>)/g, (match) => {\n const placeholder = `\\uE000${sanctuaries.size}\\uE001`;\n sanctuaries.set(placeholder, match);\n return placeholder;\n });\n \n // Parse links AFTER protecting code but BEFORE bold/italic\n // This ensures link URLs don't get processed as markdown\n html = this.parseLinks(html);\n \n // Protect entire link elements (not just the URL part)\n html = html.replace(/(<a[^>]*>.*?<\\/a>)/g, (match) => {\n const placeholder = `\\uE000${sanctuaries.size}\\uE001`;\n sanctuaries.set(placeholder, match);\n return placeholder;\n });\n \n // Process other inline elements on text with placeholders\n html = this.parseBold(html);\n html = this.parseItalic(html);\n \n // Restore all sanctuaries\n sanctuaries.forEach((content, placeholder) => {\n html = html.replace(placeholder, content);\n });\n \n return html;\n }\n\n /**\n * Parse a single line of markdown\n * @param {string} line - Raw markdown line\n * @returns {string} Parsed HTML line\n */\n static parseLine(line) {\n let html = this.escapeHtml(line);\n \n // Preserve indentation\n html = this.preserveIndentation(html, line);\n \n // Check for block elements first\n const horizontalRule = this.parseHorizontalRule(html);\n if (horizontalRule) return horizontalRule;\n \n const codeBlock = this.parseCodeBlock(html);\n if (codeBlock) return codeBlock;\n \n // Parse block elements\n html = this.parseHeader(html);\n html = this.parseBlockquote(html);\n html = this.parseBulletList(html);\n html = this.parseNumberedList(html);\n \n // Parse inline elements\n html = this.parseInlineElements(html);\n \n // Wrap in div to maintain line structure\n if (html.trim() === '') {\n // Intentionally use &nbsp; for empty lines to maintain vertical spacing\n // This causes a 0->1 character count difference but preserves visual alignment\n return '<div>&nbsp;</div>';\n }\n \n return `<div>${html}</div>`;\n }\n\n /**\n * Parse full markdown text\n * @param {string} text - Full markdown text\n * @param {number} activeLine - Currently active line index (optional)\n * @param {boolean} showActiveLineRaw - Show raw markdown on active line\n * @returns {string} Parsed HTML\n */\n static parse(text, activeLine = -1, showActiveLineRaw = false) {\n // Reset link counter for each parse\n this.resetLinkIndex();\n \n const lines = text.split('\\n');\n let inCodeBlock = false;\n \n const parsedLines = lines.map((line, index) => {\n // Show raw markdown on active line if requested\n if (showActiveLineRaw && index === activeLine) {\n const content = this.escapeHtml(line) || '&nbsp;';\n return `<div class=\"raw-line\">${content}</div>`;\n }\n \n // Check if this line is a code fence\n const codeFenceRegex = /^```[^`]*$/;\n if (codeFenceRegex.test(line)) {\n inCodeBlock = !inCodeBlock;\n // Parse fence markers normally to get styled output\n return this.parseLine(line);\n }\n \n // If we're inside a code block, don't parse as markdown\n if (inCodeBlock) {\n const escaped = this.escapeHtml(line);\n const indented = this.preserveIndentation(escaped, line);\n return `<div>${indented || '&nbsp;'}</div>`;\n }\n \n // Otherwise, parse the markdown normally\n return this.parseLine(line);\n });\n \n // Join without newlines to prevent extra spacing\n const html = parsedLines.join('');\n \n // Apply post-processing for list consolidation\n return this.postProcessHTML(html);\n }\n\n /**\n * Post-process HTML to consolidate lists and code blocks\n * @param {string} html - HTML to post-process\n * @returns {string} Post-processed HTML with consolidated lists and code blocks\n */\n static postProcessHTML(html) {\n // Check if we're in a browser environment\n if (typeof document === 'undefined' || !document) {\n // In Node.js environment - do manual post-processing\n return this.postProcessHTMLManual(html);\n }\n \n // Parse HTML string into DOM\n const container = document.createElement('div');\n container.innerHTML = html;\n \n let currentList = null;\n let listType = null;\n let currentCodeBlock = null;\n let inCodeBlock = false;\n \n // Process all direct children - need to be careful with live NodeList\n const children = Array.from(container.children);\n \n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n \n // Skip if child was already processed/removed\n if (!child.parentNode) continue;\n \n // Check for code fence start/end\n const codeFence = child.querySelector('.code-fence');\n if (codeFence) {\n const fenceText = codeFence.textContent;\n if (fenceText.startsWith('```')) {\n if (!inCodeBlock) {\n // Start of code block - keep fence visible, then add pre/code\n inCodeBlock = true;\n \n // Create the code block that will follow the fence\n currentCodeBlock = document.createElement('pre');\n const codeElement = document.createElement('code');\n currentCodeBlock.appendChild(codeElement);\n currentCodeBlock.className = 'code-block';\n \n // Extract language if present\n const lang = fenceText.slice(3).trim();\n if (lang) {\n codeElement.className = `language-${lang}`;\n }\n \n // Insert code block after the fence div (don't remove the fence)\n container.insertBefore(currentCodeBlock, child.nextSibling);\n \n // Store reference to the code element for adding content\n currentCodeBlock._codeElement = codeElement;\n continue;\n } else {\n // End of code block - fence stays visible\n inCodeBlock = false;\n currentCodeBlock = null;\n continue;\n }\n }\n }\n \n // Check if we're in a code block - any div that's not a code fence\n if (inCodeBlock && currentCodeBlock && child.tagName === 'DIV' && !child.querySelector('.code-fence')) {\n const codeElement = currentCodeBlock._codeElement || currentCodeBlock.querySelector('code');\n // Add the line content to the code block\n if (codeElement.textContent.length > 0) {\n codeElement.textContent += '\\n';\n }\n // Get the actual text content, preserving spaces\n // Use textContent instead of innerHTML to avoid double-escaping\n // textContent automatically decodes HTML entities\n const lineText = child.textContent.replace(/\\u00A0/g, ' '); // \\u00A0 is nbsp\n codeElement.textContent += lineText;\n child.remove();\n continue;\n }\n \n // Check if this div contains a list item\n let listItem = null;\n if (child.tagName === 'DIV') {\n // Look for li inside the div\n listItem = child.querySelector('li');\n }\n \n if (listItem) {\n const isBullet = listItem.classList.contains('bullet-list');\n const isOrdered = listItem.classList.contains('ordered-list');\n \n if (!isBullet && !isOrdered) {\n currentList = null;\n listType = null;\n continue;\n }\n \n const newType = isBullet ? 'ul' : 'ol';\n \n // Start new list or continue current\n if (!currentList || listType !== newType) {\n currentList = document.createElement(newType);\n container.insertBefore(currentList, child);\n listType = newType;\n }\n \n // Move the list item to the current list\n currentList.appendChild(listItem);\n \n // Remove the now-empty div wrapper\n child.remove();\n } else {\n // Non-list element ends current list\n currentList = null;\n listType = null;\n }\n }\n \n return container.innerHTML;\n }\n\n /**\n * Manual post-processing for Node.js environments (without DOM)\n * @param {string} html - HTML to post-process\n * @returns {string} Post-processed HTML\n */\n static postProcessHTMLManual(html) {\n let processed = html;\n \n // Process unordered lists\n processed = processed.replace(/((?:<div>(?:&nbsp;)*<li class=\"bullet-list\">.*?<\\/li><\\/div>\\s*)+)/gs, (match) => {\n const items = match.match(/<li class=\"bullet-list\">.*?<\\/li>/gs) || [];\n if (items.length > 0) {\n return '<ul>' + items.join('') + '</ul>';\n }\n return match;\n });\n \n // Process ordered lists\n processed = processed.replace(/((?:<div>(?:&nbsp;)*<li class=\"ordered-list\">.*?<\\/li><\\/div>\\s*)+)/gs, (match) => {\n const items = match.match(/<li class=\"ordered-list\">.*?<\\/li>/gs) || [];\n if (items.length > 0) {\n return '<ol>' + items.join('') + '</ol>';\n }\n return match;\n });\n \n // Process code blocks - KEEP the fence markers for alignment AND use semantic pre/code\n const codeBlockRegex = /<div><span class=\"code-fence\">(```[^<]*)<\\/span><\\/div>(.*?)<div><span class=\"code-fence\">(```)<\\/span><\\/div>/gs;\n processed = processed.replace(codeBlockRegex, (match, openFence, content, closeFence) => {\n // Extract the content between fences\n const lines = content.match(/<div>(.*?)<\\/div>/gs) || [];\n const codeContent = lines.map(line => {\n // Extract text from each div - content is already escaped\n const text = line.replace(/<div>(.*?)<\\/div>/s, '$1')\n .replace(/&nbsp;/g, ' ');\n return text;\n }).join('\\n');\n \n // Extract language from the opening fence\n const lang = openFence.slice(3).trim();\n const langClass = lang ? ` class=\"language-${lang}\"` : '';\n \n // Keep fence markers visible as separate divs, with pre/code block between them\n let result = `<div><span class=\"code-fence\">${openFence}</span></div>`;\n // Content is already escaped, don't double-escape\n result += `<pre class=\"code-block\"><code${langClass}>${codeContent}</code></pre>`;\n result += `<div><span class=\"code-fence\">${closeFence}</span></div>`;\n \n return result;\n });\n \n return processed;\n }\n}", "/**\n * Format definitions for markdown syntax\n */\n\nexport const FORMATS = {\n bold: {\n prefix: '**',\n suffix: '**',\n trimFirst: true\n },\n italic: {\n prefix: '_',\n suffix: '_',\n trimFirst: true\n },\n code: {\n prefix: '`',\n suffix: '`',\n blockPrefix: '```',\n blockSuffix: '```'\n },\n link: {\n prefix: '[',\n suffix: '](url)',\n replaceNext: 'url',\n scanFor: 'https?://'\n },\n bulletList: {\n prefix: '- ',\n multiline: true,\n unorderedList: true\n },\n numberedList: {\n prefix: '1. ',\n multiline: true,\n orderedList: true\n },\n quote: {\n prefix: '> ',\n multiline: true,\n surroundWithNewlines: true\n },\n taskList: {\n prefix: '- [ ] ',\n multiline: true,\n surroundWithNewlines: true\n },\n header1: { prefix: '# ' },\n header2: { prefix: '## ' },\n header3: { prefix: '### ' },\n header4: { prefix: '#### ' },\n header5: { prefix: '##### ' },\n header6: { prefix: '###### ' }\n}\n\n/**\n * Default style configuration\n */\nexport function getDefaultStyle() {\n return {\n prefix: '',\n suffix: '',\n blockPrefix: '',\n blockSuffix: '',\n multiline: false,\n replaceNext: '',\n prefixSpace: false,\n scanFor: '',\n surroundWithNewlines: false,\n orderedList: false,\n unorderedList: false,\n trimFirst: false\n }\n}\n\n/**\n * Merge format with defaults\n */\nexport function mergeWithDefaults(format) {\n return { ...getDefaultStyle(), ...format }\n}", "/**\n * Debug utilities for markdown-actions\n * Add console logging to track what's happening\n */\n\n// Debug mode flag - disabled by default\nlet debugMode = false;\n\n/**\n * Enable or disable debug mode\n * @param {boolean} enabled - Whether to enable debug mode\n */\nexport function setDebugMode(enabled) {\n debugMode = enabled;\n}\n\n/**\n * Get current debug mode status\n * @returns {boolean} Whether debug mode is enabled\n */\nexport function getDebugMode() {\n return debugMode;\n}\n\nexport function debugLog(funcName, message, data) {\n // These will be completely removed by esbuild's drop: ['console'] in production\n if (!debugMode) return;\n \n console.group(`\uD83D\uDD0D ${funcName}`);\n console.log(message);\n if (data) {\n console.log('Data:', data);\n }\n console.groupEnd();\n}\n\nexport function debugSelection(textarea, label) {\n // These will be completely removed by esbuild's drop: ['console'] in production\n if (!debugMode) return;\n \n const selected = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd);\n console.group(`\uD83D\uDCCD Selection: ${label}`);\n console.log('Position:', `${textarea.selectionStart}-${textarea.selectionEnd}`);\n console.log('Selected text:', JSON.stringify(selected));\n console.log('Length:', selected.length);\n \n // Show context around selection\n const before = textarea.value.slice(Math.max(0, textarea.selectionStart - 10), textarea.selectionStart);\n const after = textarea.value.slice(textarea.selectionEnd, Math.min(textarea.value.length, textarea.selectionEnd + 10));\n console.log('Context:', JSON.stringify(before) + '[SELECTION]' + JSON.stringify(after));\n console.groupEnd();\n}\n\nexport function debugResult(result) {\n // These will be completely removed by esbuild's drop: ['console'] in production\n if (!debugMode) return;\n \n console.group('\uD83D\uDCDD Result');\n console.log('Text to insert:', JSON.stringify(result.text));\n console.log('New selection:', `${result.selectionStart}-${result.selectionEnd}`);\n console.groupEnd();\n}", "/**\n * Text insertion system with undo/redo support\n * Extracted and adapted from GitHub's markdown-toolbar-element\n */\n\nimport { getDebugMode } from '../debug.js'\n\nlet canInsertText = null\n\n/**\n * Insert text at current position with undo/redo support\n * @param {HTMLTextAreaElement} textarea - Target textarea\n * @param {Object} options - Text and selection options\n * @param {string} options.text - Text to insert\n * @param {number} [options.selectionStart] - New selection start\n * @param {number} [options.selectionEnd] - New selection end\n */\nexport function insertText(textarea, { text, selectionStart, selectionEnd }) {\n const debugMode = getDebugMode();\n \n if (debugMode) {\n console.group('\uD83D\uDD27 insertText');\n console.log('Current selection:', `${textarea.selectionStart}-${textarea.selectionEnd}`);\n console.log('Text to insert:', JSON.stringify(text));\n console.log('New selection to set:', selectionStart, '-', selectionEnd);\n }\n \n // Make sure the textarea is focused\n textarea.focus();\n \n const originalSelectionStart = textarea.selectionStart\n const originalSelectionEnd = textarea.selectionEnd\n const before = textarea.value.slice(0, originalSelectionStart)\n const after = textarea.value.slice(originalSelectionEnd)\n \n if (debugMode) {\n console.log('Before text (last 20):', JSON.stringify(before.slice(-20)));\n console.log('After text (first 20):', JSON.stringify(after.slice(0, 20)));\n console.log('Selected text being replaced:', JSON.stringify(textarea.value.slice(originalSelectionStart, originalSelectionEnd)));\n }\n \n // Store the original value to check if execCommand actually changed it\n const originalValue = textarea.value\n\n // Try execCommand for both insertions and replacements to preserve undo history\n // execCommand('insertText') can handle replacing selected text\n const hasSelection = originalSelectionStart !== originalSelectionEnd\n \n if (canInsertText === null || canInsertText === true) {\n textarea.contentEditable = 'true'\n try {\n canInsertText = document.execCommand('insertText', false, text)\n if (debugMode) console.log('execCommand returned:', canInsertText, 'for text with', text.split('\\n').length, 'lines');\n } catch (error) {\n canInsertText = false\n if (debugMode) console.log('execCommand threw error:', error);\n }\n textarea.contentEditable = 'false'\n }\n\n if (debugMode) {\n console.log('canInsertText before:', canInsertText);\n console.log('execCommand result:', canInsertText);\n }\n \n // Check if execCommand actually worked by comparing the value\n if (canInsertText) {\n const expectedValue = before + text + after\n const actualValue = textarea.value\n \n if (debugMode) {\n console.log('Expected length:', expectedValue.length);\n console.log('Actual length:', actualValue.length);\n }\n \n if (actualValue !== expectedValue) {\n if (debugMode) {\n console.log('execCommand changed the value but not as expected');\n console.log('Expected:', JSON.stringify(expectedValue.slice(0, 100)));\n console.log('Actual:', JSON.stringify(actualValue.slice(0, 100)));\n }\n // Don't set canInsertText to false here - execCommand did work\n // We just need to not double-insert\n }\n }\n\n if (!canInsertText) {\n if (debugMode) console.log('Using manual insertion');\n // Only do manual insertion if execCommand didn't change the value\n if (textarea.value === originalValue) {\n if (debugMode) console.log('Value unchanged, doing manual replacement');\n try {\n document.execCommand('ms-beginUndoUnit')\n } catch (e) {\n // Do nothing.\n }\n textarea.value = before + text + after\n try {\n document.execCommand('ms-endUndoUnit')\n } catch (e) {\n // Do nothing.\n }\n textarea.dispatchEvent(new CustomEvent('input', { bubbles: true, cancelable: true }))\n } else {\n if (debugMode) console.log('Value was changed by execCommand, skipping manual insertion');\n }\n }\n\n if (debugMode) console.log('Setting selection range:', selectionStart, selectionEnd);\n if (selectionStart != null && selectionEnd != null) {\n textarea.setSelectionRange(selectionStart, selectionEnd)\n } else {\n textarea.setSelectionRange(originalSelectionStart, textarea.selectionEnd)\n }\n \n if (debugMode) {\n console.log('Final value length:', textarea.value.length);\n console.groupEnd();\n }\n}\n\n/**\n * Configure undo method\n * @param {'native' | 'manual' | 'auto'} method - Undo method to use\n */\nexport function setUndoMethod(method) {\n switch (method) {\n case 'native':\n canInsertText = true\n break\n case 'manual':\n canInsertText = false\n break\n case 'auto':\n canInsertText = null\n break\n }\n}", "/**\n * Core selection utilities extracted and adapted from GitHub's markdown-toolbar-element\n */\n\n/**\n * Check if string contains multiple lines\n */\nexport function isMultipleLines(string) {\n return string.trim().split('\\n').length > 1\n}\n\n/**\n * Find the start of the word at position i\n */\nexport function wordSelectionStart(text, i) {\n let index = i\n while (text[index] && text[index - 1] != null && !text[index - 1].match(/\\s/)) {\n index--\n }\n return index\n}\n\n/**\n * Find the end of the word at position i\n */\nexport function wordSelectionEnd(text, i, multiline) {\n let index = i\n const breakpoint = multiline ? /\\n/ : /\\s/\n while (text[index] && !text[index].match(breakpoint)) {\n index++\n }\n return index\n}\n\n/**\n * Expand selection to line boundaries\n */\nexport function expandSelectionToLine(textarea) {\n const lines = textarea.value.split('\\n')\n let counter = 0\n for (let index = 0; index < lines.length; index++) {\n const lineLength = lines[index].length + 1\n if (textarea.selectionStart >= counter && textarea.selectionStart < counter + lineLength) {\n textarea.selectionStart = counter\n }\n if (textarea.selectionEnd >= counter && textarea.selectionEnd < counter + lineLength) {\n // For the last line, don't go past the actual text length\n if (index === lines.length - 1) {\n textarea.selectionEnd = Math.min(counter + lines[index].length, textarea.value.length)\n } else {\n textarea.selectionEnd = counter + lineLength - 1\n }\n }\n counter += lineLength\n }\n}\n\n/**\n * Expand selected text with smart boundary detection\n */\nexport function expandSelectedText(textarea, prefixToUse, suffixToUse, multiline = false) {\n if (textarea.selectionStart === textarea.selectionEnd) {\n textarea.selectionStart = wordSelectionStart(textarea.value, textarea.selectionStart)\n textarea.selectionEnd = wordSelectionEnd(textarea.value, textarea.selectionEnd, multiline)\n } else {\n const expandedSelectionStart = textarea.selectionStart - prefixToUse.length\n const expandedSelectionEnd = textarea.selectionEnd + suffixToUse.length\n const beginsWithPrefix = textarea.value.slice(expandedSelectionStart, textarea.selectionStart) === prefixToUse\n const endsWithSuffix = textarea.value.slice(textarea.selectionEnd, expandedSelectionEnd) === suffixToUse\n if (beginsWithPrefix && endsWithSuffix) {\n textarea.selectionStart = expandedSelectionStart\n textarea.selectionEnd = expandedSelectionEnd\n }\n }\n return textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n}\n\n/**\n * Calculate newlines needed to surround selected text\n */\nexport function newlinesToSurroundSelectedText(textarea) {\n const beforeSelection = textarea.value.slice(0, textarea.selectionStart)\n const afterSelection = textarea.value.slice(textarea.selectionEnd)\n\n const breaksBefore = beforeSelection.match(/\\n*$/)\n const breaksAfter = afterSelection.match(/^\\n*/)\n const newlinesBeforeSelection = breaksBefore ? breaksBefore[0].length : 0\n const newlinesAfterSelection = breaksAfter ? breaksAfter[0].length : 0\n\n let newlinesToAppend = ''\n let newlinesToPrepend = ''\n\n if (beforeSelection.match(/\\S/) && newlinesBeforeSelection < 2) {\n newlinesToAppend = '\\n'.repeat(2 - newlinesBeforeSelection)\n }\n\n if (afterSelection.match(/\\S/) && newlinesAfterSelection < 2) {\n newlinesToPrepend = '\\n'.repeat(2 - newlinesAfterSelection)\n }\n\n return { newlinesToAppend, newlinesToPrepend }\n}\n\n/**\n * Utility to preserve selection during operations\n */\nexport function preserveSelection(textarea, callback) {\n const start = textarea.selectionStart\n const end = textarea.selectionEnd\n const scrollTop = textarea.scrollTop\n \n callback()\n \n textarea.selectionStart = start\n textarea.selectionEnd = end\n textarea.scrollTop = scrollTop\n}\n\n/**\n * Apply a line-based operation with cursor preservation\n * This function handles expanding to line boundaries and preserving cursor position\n * @param {HTMLTextAreaElement} textarea - The textarea element\n * @param {Function} operation - The operation to perform (receives textarea and returns result)\n * @param {Object} options - Options for the operation\n * @param {string} options.prefix - The prefix being added/removed (for cursor adjustment)\n * @param {Function} options.adjustSelection - Custom selection adjustment function\n * @returns {Object} The result from the operation with adjusted cursor position\n */\nexport function applyLineOperation(textarea, operation, options = {}) {\n // Save original cursor position AND selection before any expansion\n const originalStart = textarea.selectionStart\n const originalEnd = textarea.selectionEnd\n const noInitialSelection = originalStart === originalEnd\n \n // Store the line start position to calculate offset later\n const value = textarea.value\n let lineStart = originalStart\n \n // Find start of the line containing the selection start\n while (lineStart > 0 && value[lineStart - 1] !== '\\n') {\n lineStart--\n }\n \n // Expand selection to line boundaries for the operation\n if (noInitialSelection) {\n // Expand to current line when no selection\n let lineEnd = originalStart\n \n // Find end of current line\n while (lineEnd < value.length && value[lineEnd] !== '\\n') {\n lineEnd++\n }\n \n textarea.selectionStart = lineStart\n textarea.selectionEnd = lineEnd\n } else {\n // For selections, expand to full lines\n expandSelectionToLine(textarea)\n }\n \n // Apply the operation\n const result = operation(textarea)\n \n // Restore original selection/cursor with prefix adjustment\n if (options.adjustSelection) {\n // Use custom selection adjustment logic\n const selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n const isRemoving = selectedText.startsWith(options.prefix)\n const adjusted = options.adjustSelection(isRemoving, originalStart, originalEnd, lineStart)\n result.selectionStart = adjusted.start\n result.selectionEnd = adjusted.end\n } else if (options.prefix) {\n // Use default prefix-based adjustment\n const selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n const isRemoving = selectedText.startsWith(options.prefix)\n \n if (noInitialSelection) {\n // No selection - just restore cursor position\n if (isRemoving) {\n // When removing prefix, adjust cursor position\n result.selectionStart = Math.max(originalStart - options.prefix.length, lineStart)\n result.selectionEnd = result.selectionStart\n } else {\n // When adding prefix, adjust cursor position\n result.selectionStart = originalStart + options.prefix.length\n result.selectionEnd = result.selectionStart\n }\n } else {\n // Had a selection - restore it with adjustment\n if (isRemoving) {\n // When removing prefix, shift selection back\n result.selectionStart = Math.max(originalStart - options.prefix.length, lineStart)\n result.selectionEnd = Math.max(originalEnd - options.prefix.length, lineStart)\n } else {\n // When adding prefix, shift selection forward\n result.selectionStart = originalStart + options.prefix.length\n result.selectionEnd = originalEnd + options.prefix.length\n }\n }\n }\n \n return result\n}", "/**\n * Block-level text formatting operations\n * Handles inline formats like bold, italic, code, and links\n */\n\nimport { expandSelectedText, newlinesToSurroundSelectedText, isMultipleLines } from '../core/selection.js'\nimport { insertText } from '../core/insertion.js'\n\n/**\n * Apply block-level styling to selected text\n */\nexport function blockStyle(textarea, style) {\n let newlinesToAppend\n let newlinesToPrepend\n\n const { prefix, suffix, blockPrefix, blockSuffix, replaceNext, prefixSpace, scanFor, surroundWithNewlines, trimFirst } = style\n const originalSelectionStart = textarea.selectionStart\n const originalSelectionEnd = textarea.selectionEnd\n\n let selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n let prefixToUse = isMultipleLines(selectedText) && blockPrefix && blockPrefix.length > 0 ? `${blockPrefix}\\n` : prefix\n let suffixToUse = isMultipleLines(selectedText) && blockSuffix && blockSuffix.length > 0 ? `\\n${blockSuffix}` : suffix\n\n if (prefixSpace) {\n const beforeSelection = textarea.value[textarea.selectionStart - 1]\n if (textarea.selectionStart !== 0 && beforeSelection != null && !beforeSelection.match(/\\s/)) {\n prefixToUse = ` ${prefixToUse}`\n }\n }\n \n selectedText = expandSelectedText(textarea, prefixToUse, suffixToUse, style.multiline)\n let selectionStart = textarea.selectionStart\n let selectionEnd = textarea.selectionEnd\n const hasReplaceNext = replaceNext && replaceNext.length > 0 && suffixToUse.indexOf(replaceNext) > -1 && selectedText.length > 0\n \n if (surroundWithNewlines) {\n const ref = newlinesToSurroundSelectedText(textarea)\n newlinesToAppend = ref.newlinesToAppend\n newlinesToPrepend = ref.newlinesToPrepend\n prefixToUse = newlinesToAppend + prefix\n suffixToUse += newlinesToPrepend\n }\n\n // Check if we should remove formatting (toggle off)\n if (selectedText.startsWith(prefixToUse) && selectedText.endsWith(suffixToUse)) {\n const replacementText = selectedText.slice(prefixToUse.length, selectedText.length - suffixToUse.length)\n if (originalSelectionStart === originalSelectionEnd) {\n let position = originalSelectionStart - prefixToUse.length\n position = Math.max(position, selectionStart)\n position = Math.min(position, selectionStart + replacementText.length)\n selectionStart = selectionEnd = position\n } else {\n selectionEnd = selectionStart + replacementText.length\n }\n return { text: replacementText, selectionStart, selectionEnd }\n } else if (!hasReplaceNext) {\n // Add formatting\n let replacementText = prefixToUse + selectedText + suffixToUse\n selectionStart = originalSelectionStart + prefixToUse.length\n selectionEnd = originalSelectionEnd + prefixToUse.length\n const whitespaceEdges = selectedText.match(/^\\s*|\\s*$/g)\n if (trimFirst && whitespaceEdges) {\n const leadingWhitespace = whitespaceEdges[0] || ''\n const trailingWhitespace = whitespaceEdges[1] || ''\n replacementText = leadingWhitespace + prefixToUse + selectedText.trim() + suffixToUse + trailingWhitespace\n selectionStart += leadingWhitespace.length\n selectionEnd -= trailingWhitespace.length\n }\n return { text: replacementText, selectionStart, selectionEnd }\n } else if (scanFor && scanFor.length > 0 && selectedText.match(scanFor)) {\n // Handle link/image with URL detection\n suffixToUse = suffixToUse.replace(replaceNext, selectedText)\n const replacementText = prefixToUse + suffixToUse\n selectionStart = selectionEnd = selectionStart + prefixToUse.length\n return { text: replacementText, selectionStart, selectionEnd }\n } else {\n // Handle link/image with placeholder\n const replacementText = prefixToUse + selectedText + suffixToUse\n selectionStart = selectionStart + prefixToUse.length + selectedText.length + suffixToUse.indexOf(replaceNext)\n selectionEnd = selectionStart + replaceNext.length\n return { text: replacementText, selectionStart, selectionEnd }\n }\n}\n\n/**\n * Apply style to selected text in textarea\n */\nexport function styleSelectedText(textarea, style) {\n const text = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n \n let result\n if (style.orderedList || style.unorderedList) {\n // Will be handled by list operations\n return\n } else if (style.multiline && isMultipleLines(text)) {\n result = multilineStyle(textarea, style)\n } else {\n result = blockStyle(textarea, style)\n }\n\n insertText(textarea, result)\n}\n\n/**\n * Apply multiline styling (quotes, task lists, etc)\n * Note: This does NOT expand selection to line - that should be done by the caller if needed\n */\nexport function multilineStyle(textarea, style) {\n const { prefix, suffix, surroundWithNewlines } = style\n let text = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n let selectionStart = textarea.selectionStart\n let selectionEnd = textarea.selectionEnd\n const lines = text.split('\\n')\n \n // Check if we need to undo (all lines have the format)\n const undoStyle = lines.every(line => line.startsWith(prefix) && (!suffix || line.endsWith(suffix)))\n\n if (undoStyle) {\n // Remove the formatting\n text = lines.map(line => {\n let result = line.slice(prefix.length)\n if (suffix) {\n result = result.slice(0, result.length - suffix.length)\n }\n return result\n }).join('\\n')\n selectionEnd = selectionStart + text.length\n } else {\n // Apply the formatting\n text = lines.map(line => prefix + line + (suffix || '')).join('\\n')\n if (surroundWithNewlines) {\n const { newlinesToAppend, newlinesToPrepend } = newlinesToSurroundSelectedText(textarea)\n selectionStart += newlinesToAppend.length\n selectionEnd = selectionStart + text.length\n text = newlinesToAppend + text + newlinesToPrepend\n }\n }\n\n return { text, selectionStart, selectionEnd }\n}", "/**\n * List operations for bullet and numbered lists\n */\n\nimport { expandSelectionToLine, newlinesToSurroundSelectedText, applyLineOperation } from '../core/selection.js'\nimport { insertText } from '../core/insertion.js'\n\n/**\n * Undo ordered list formatting\n */\nfunction undoOrderedListStyle(text) {\n const lines = text.split('\\n')\n const orderedListRegex = /^\\d+\\.\\s+/\n const shouldUndoOrderedList = lines.every(line => orderedListRegex.test(line))\n let result = lines\n if (shouldUndoOrderedList) {\n result = lines.map(line => line.replace(orderedListRegex, ''))\n }\n\n return {\n text: result.join('\\n'),\n processed: shouldUndoOrderedList\n }\n}\n\n/**\n * Undo unordered list formatting\n */\nfunction undoUnorderedListStyle(text) {\n const lines = text.split('\\n')\n const unorderedListPrefix = '- '\n const shouldUndoUnorderedList = lines.every(line => line.startsWith(unorderedListPrefix))\n let result = lines\n if (shouldUndoUnorderedList) {\n result = lines.map(line => line.slice(unorderedListPrefix.length))\n }\n\n return {\n text: result.join('\\n'),\n processed: shouldUndoUnorderedList\n }\n}\n\n/**\n * Make prefix for list item\n */\nfunction makePrefix(index, unorderedList) {\n if (unorderedList) {\n return '- '\n } else {\n return `${index + 1}. `\n }\n}\n\n/**\n * Clear existing list style\n */\nfunction clearExistingListStyle(style, selectedText) {\n let undoResult\n let undoResultOppositeList\n let pristineText\n \n if (style.orderedList) {\n undoResult = undoOrderedListStyle(selectedText)\n undoResultOppositeList = undoUnorderedListStyle(undoResult.text)\n pristineText = undoResultOppositeList.text\n } else {\n undoResult = undoUnorderedListStyle(selectedText)\n undoResultOppositeList = undoOrderedListStyle(undoResult.text)\n pristineText = undoResultOppositeList.text\n }\n \n return [undoResult, undoResultOppositeList, pristineText]\n}\n\n/**\n * Apply list styling to selected text\n */\nexport function listStyle(textarea, style) {\n const noInitialSelection = textarea.selectionStart === textarea.selectionEnd\n let selectionStart = textarea.selectionStart\n let selectionEnd = textarea.selectionEnd\n\n // Select whole line\n expandSelectionToLine(textarea)\n\n const selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n\n // Clear any existing list formatting\n const [undoResult, undoResultOppositeList, pristineText] = clearExistingListStyle(style, selectedText)\n\n const prefixedLines = pristineText.split('\\n').map((value, index) => {\n return `${makePrefix(index, style.unorderedList)}${value}`\n })\n\n const totalPrefixLength = prefixedLines.reduce((previousValue, _currentValue, currentIndex) => {\n return previousValue + makePrefix(currentIndex, style.unorderedList).length\n }, 0)\n\n const totalPrefixLengthOppositeList = prefixedLines.reduce((previousValue, _currentValue, currentIndex) => {\n return previousValue + makePrefix(currentIndex, !style.unorderedList).length\n }, 0)\n\n // If we're undoing the same list type, just return the pristine text\n if (undoResult.processed) {\n if (noInitialSelection) {\n selectionStart = Math.max(selectionStart - makePrefix(0, style.unorderedList).length, 0)\n selectionEnd = selectionStart\n } else {\n selectionStart = textarea.selectionStart\n selectionEnd = textarea.selectionEnd - totalPrefixLength\n }\n return { text: pristineText, selectionStart, selectionEnd }\n }\n\n // Apply new list formatting\n const { newlinesToAppend, newlinesToPrepend } = newlinesToSurroundSelectedText(textarea)\n const text = newlinesToAppend + prefixedLines.join('\\n') + newlinesToPrepend\n\n if (noInitialSelection) {\n selectionStart = Math.max(selectionStart + makePrefix(0, style.unorderedList).length + newlinesToAppend.length, 0)\n selectionEnd = selectionStart\n } else {\n if (undoResultOppositeList.processed) {\n // Converting from one list type to another\n selectionStart = Math.max(textarea.selectionStart + newlinesToAppend.length, 0)\n selectionEnd = textarea.selectionEnd + newlinesToAppend.length + totalPrefixLength - totalPrefixLengthOppositeList\n } else {\n // Adding list formatting to plain text\n selectionStart = Math.max(textarea.selectionStart + newlinesToAppend.length, 0)\n selectionEnd = textarea.selectionEnd + newlinesToAppend.length + totalPrefixLength\n }\n }\n\n return { text, selectionStart, selectionEnd }\n}\n\n/**\n * Apply list style to textarea\n */\nexport function applyListStyle(textarea, style) {\n // Use applyLineOperation for consistent selection preservation\n const result = applyLineOperation(\n textarea,\n (ta) => listStyle(ta, style),\n {\n // Custom selection adjustment for lists\n adjustSelection: (isRemoving, selStart, selEnd, lineStart) => {\n // Get the current line to check if we're removing\n const currentLine = textarea.value.slice(lineStart, textarea.selectionEnd)\n const orderedListRegex = /^\\d+\\.\\s+/\n const unorderedListRegex = /^- /\n \n // Check if we're removing a list\n const hasOrderedList = orderedListRegex.test(currentLine)\n const hasUnorderedList = unorderedListRegex.test(currentLine)\n const isRemovingCurrent = (style.orderedList && hasOrderedList) || (style.unorderedList && hasUnorderedList)\n \n if (selStart === selEnd) {\n // No selection - cursor position\n if (isRemovingCurrent) {\n // Removing list - adjust cursor back\n const prefixMatch = currentLine.match(style.orderedList ? orderedListRegex : unorderedListRegex)\n const prefixLength = prefixMatch ? prefixMatch[0].length : 0\n return {\n start: Math.max(selStart - prefixLength, lineStart),\n end: Math.max(selStart - prefixLength, lineStart)\n }\n } else if (hasOrderedList || hasUnorderedList) {\n // Converting from one list type to another\n const oldPrefixMatch = currentLine.match(hasOrderedList ? orderedListRegex : unorderedListRegex)\n const oldPrefixLength = oldPrefixMatch ? oldPrefixMatch[0].length : 0\n const newPrefixLength = style.unorderedList ? 2 : 3 // \"- \" or \"1. \"\n const adjustment = newPrefixLength - oldPrefixLength\n return {\n start: selStart + adjustment,\n end: selStart + adjustment\n }\n } else {\n // Adding new list\n const prefixLength = style.unorderedList ? 2 : 3 // \"- \" or \"1. \"\n return {\n start: selStart + prefixLength,\n end: selStart + prefixLength\n }\n }\n } else {\n // Has selection - preserve it\n if (isRemovingCurrent) {\n // Removing current list type\n const prefixMatch = currentLine.match(style.orderedList ? orderedListRegex : unorderedListRegex)\n const prefixLength = prefixMatch ? prefixMatch[0].length : 0\n return {\n start: Math.max(selStart - prefixLength, lineStart),\n end: Math.max(selEnd - prefixLength, lineStart)\n }\n } else if (hasOrderedList || hasUnorderedList) {\n // Converting from one list type to another\n const oldPrefixMatch = currentLine.match(hasOrderedList ? orderedListRegex : unorderedListRegex)\n const oldPrefixLength = oldPrefixMatch ? oldPrefixMatch[0].length : 0\n const newPrefixLength = style.unorderedList ? 2 : 3 // \"- \" or \"1. \"\n const adjustment = newPrefixLength - oldPrefixLength\n return {\n start: selStart + adjustment,\n end: selEnd + adjustment\n }\n } else {\n // Adding new list\n const prefixLength = style.unorderedList ? 2 : 3 // \"- \" or \"1. \"\n return {\n start: selStart + prefixLength,\n end: selEnd + prefixLength\n }\n }\n }\n }\n }\n )\n \n insertText(textarea, result)\n}", "/**\n * Format detection utilities\n */\n\nimport { FORMATS } from './formats.js'\n\n/**\n * Check if text has a specific format applied\n */\nfunction hasFormatApplied(text, format) {\n if (!format.prefix) return false\n \n if (format.suffix) {\n return text.startsWith(format.prefix) && text.endsWith(format.suffix)\n } else {\n return text.startsWith(format.prefix)\n }\n}\n\n/**\n * Get active formats at cursor position\n */\nexport function getActiveFormats(textarea) {\n if (!textarea) return []\n \n const formats = []\n const { selectionStart, selectionEnd, value } = textarea\n \n // Get current line for line-based formats\n const lines = value.split('\\n')\n let lineStart = 0\n let currentLine = ''\n \n for (const line of lines) {\n if (selectionStart >= lineStart && selectionStart <= lineStart + line.length) {\n currentLine = line\n break\n }\n lineStart += line.length + 1\n }\n \n // Check line-based formats\n if (currentLine.startsWith('- ')) {\n if (currentLine.startsWith('- [ ] ') || currentLine.startsWith('- [x] ')) {\n formats.push('task-list')\n } else {\n formats.push('bullet-list')\n }\n }\n \n if (/^\\d+\\.\\s/.test(currentLine)) {\n formats.push('numbered-list')\n }\n \n if (currentLine.startsWith('> ')) {\n formats.push('quote')\n }\n \n if (currentLine.startsWith('# ')) formats.push('header')\n if (currentLine.startsWith('## ')) formats.push('header-2')\n if (currentLine.startsWith('### ')) formats.push('header-3')\n \n // Check inline formats by looking around cursor\n const lookBehind = Math.max(0, selectionStart - 10)\n const lookAhead = Math.min(value.length, selectionEnd + 10)\n const surrounding = value.slice(lookBehind, lookAhead)\n \n // Check for bold\n if (surrounding.includes('**')) {\n const beforeCursor = value.slice(Math.max(0, selectionStart - 100), selectionStart)\n const afterCursor = value.slice(selectionEnd, Math.min(value.length, selectionEnd + 100))\n const lastOpenBold = beforeCursor.lastIndexOf('**')\n const nextCloseBold = afterCursor.indexOf('**')\n if (lastOpenBold !== -1 && nextCloseBold !== -1) {\n formats.push('bold')\n }\n }\n \n // Check for italic\n if (surrounding.includes('_')) {\n const beforeCursor = value.slice(Math.max(0, selectionStart - 100), selectionStart)\n const afterCursor = value.slice(selectionEnd, Math.min(value.length, selectionEnd + 100))\n const lastOpenItalic = beforeCursor.lastIndexOf('_')\n const nextCloseItalic = afterCursor.indexOf('_')\n if (lastOpenItalic !== -1 && nextCloseItalic !== -1) {\n formats.push('italic')\n }\n }\n \n // Check for code\n if (surrounding.includes('`')) {\n const beforeCursor = value.slice(Math.max(0, selectionStart - 100), selectionStart)\n const afterCursor = value.slice(selectionEnd, Math.min(value.length, selectionEnd + 100))\n if (beforeCursor.includes('`') && afterCursor.includes('`')) {\n formats.push('code')\n }\n }\n \n // Check for link\n if (surrounding.includes('[') && surrounding.includes(']')) {\n const beforeCursor = value.slice(Math.max(0, selectionStart - 100), selectionStart)\n const afterCursor = value.slice(selectionEnd, Math.min(value.length, selectionEnd + 100))\n const lastOpenBracket = beforeCursor.lastIndexOf('[')\n const nextCloseBracket = afterCursor.indexOf(']')\n if (lastOpenBracket !== -1 && nextCloseBracket !== -1) {\n const afterBracket = value.slice(selectionEnd + nextCloseBracket + 1, selectionEnd + nextCloseBracket + 10)\n if (afterBracket.startsWith('(')) {\n formats.push('link')\n }\n }\n }\n \n return formats\n}\n\n/**\n * Check if specific format is active at cursor\n */\nexport function hasFormat(textarea, format) {\n const activeFormats = getActiveFormats(textarea)\n return activeFormats.includes(format)\n}\n\n/**\n * Expand selection based on options\n */\nexport function expandSelection(textarea, options = {}) {\n if (!textarea) return\n \n const { toWord, toLine, toFormat } = options\n const { selectionStart, selectionEnd, value } = textarea\n \n if (toLine) {\n // Find line boundaries\n const lines = value.split('\\n')\n let lineStart = 0\n let lineEnd = 0\n let currentPos = 0\n \n for (const line of lines) {\n if (selectionStart >= currentPos && selectionStart <= currentPos + line.length) {\n lineStart = currentPos\n lineEnd = currentPos + line.length\n break\n }\n currentPos += line.length + 1\n }\n \n textarea.selectionStart = lineStart\n textarea.selectionEnd = lineEnd\n } else if (toWord && selectionStart === selectionEnd) {\n // Find word boundaries\n let start = selectionStart\n let end = selectionEnd\n \n // Move start back to word boundary\n while (start > 0 && !/\\s/.test(value[start - 1])) {\n start--\n }\n \n // Move end forward to word boundary\n while (end < value.length && !/\\s/.test(value[end])) {\n end++\n }\n \n textarea.selectionStart = start\n textarea.selectionEnd = end\n }\n}", "/**\n * markdown-actions - Lightweight markdown toolbar functionality\n * Based on GitHub's markdown-toolbar-element\n */\n\nimport { FORMATS, mergeWithDefaults } from './core/formats.js'\nimport { insertText, setUndoMethod } from './core/insertion.js'\nimport { preserveSelection, isMultipleLines, expandSelectionToLine, applyLineOperation } from './core/selection.js'\nimport { blockStyle, multilineStyle } from './operations/block.js'\nimport { applyListStyle } from './operations/list.js'\nimport { getActiveFormats as getActive, hasFormat as has, expandSelection as expand } from './core/detection.js'\nimport { debugLog, debugSelection, debugResult, setDebugMode, getDebugMode } from './debug.js'\n\n/**\n * Toggle bold formatting\n */\nexport function toggleBold(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n \n debugLog('toggleBold', 'Starting');\n debugSelection(textarea, 'Before');\n \n const style = mergeWithDefaults(FORMATS.bold)\n const result = blockStyle(textarea, style)\n \n debugResult(result);\n \n insertText(textarea, result)\n \n debugSelection(textarea, 'After');\n}\n\n/**\n * Toggle italic formatting\n */\nexport function toggleItalic(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n const style = mergeWithDefaults(FORMATS.italic)\n const result = blockStyle(textarea, style)\n insertText(textarea, result)\n}\n\n/**\n * Toggle code formatting\n */\nexport function toggleCode(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n \n // blockStyle already handles both inline and block code correctly\n const style = mergeWithDefaults(FORMATS.code)\n const result = blockStyle(textarea, style)\n insertText(textarea, result)\n}\n\n/**\n * Insert or toggle link formatting\n */\nexport function insertLink(textarea, options = {}) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n \n const selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n let style = mergeWithDefaults(FORMATS.link)\n \n // Check if selected text is a URL\n const isURL = selectedText && selectedText.match(/^https?:\\/\\//)\n \n if (isURL && !options.url) {\n // If selected text is a URL, use it as both link text and URL\n style.suffix = `](${selectedText})`\n style.replaceNext = ''\n // Don't change the selected text, it becomes the link text\n } else if (options.url) {\n // Override with custom URL if provided\n style.suffix = `](${options.url})`\n style.replaceNext = ''\n }\n \n // Override with custom text if provided\n if (options.text && !selectedText) {\n // Insert the text and select it\n const pos = textarea.selectionStart\n textarea.value = textarea.value.slice(0, pos) + options.text + textarea.value.slice(pos)\n textarea.selectionStart = pos\n textarea.selectionEnd = pos + options.text.length\n }\n \n const result = blockStyle(textarea, style)\n insertText(textarea, result)\n}\n\n/**\n * Toggle bullet list formatting\n */\nexport function toggleBulletList(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n const style = mergeWithDefaults(FORMATS.bulletList)\n applyListStyle(textarea, style)\n}\n\n/**\n * Toggle numbered list formatting\n */\nexport function toggleNumberedList(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n const style = mergeWithDefaults(FORMATS.numberedList)\n applyListStyle(textarea, style)\n}\n\n/**\n * Toggle quote formatting\n * Matches GitHub's implementation for quotes\n */\nexport function toggleQuote(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n \n debugLog('toggleQuote', 'Starting');\n debugSelection(textarea, 'Initial');\n \n const style = mergeWithDefaults(FORMATS.quote)\n \n // Use the reusable line operation helper\n const result = applyLineOperation(\n textarea,\n (ta) => multilineStyle(ta, style),\n { prefix: style.prefix }\n )\n \n debugResult(result);\n insertText(textarea, result)\n debugSelection(textarea, 'Final');\n}\n\n/**\n * Toggle task list formatting\n * Matches GitHub's implementation for task lists\n */\nexport function toggleTaskList(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n \n const style = mergeWithDefaults(FORMATS.taskList)\n \n // Use the reusable line operation helper\n const result = applyLineOperation(\n textarea,\n (ta) => multilineStyle(ta, style),\n { prefix: style.prefix }\n )\n \n insertText(textarea, result)\n}\n\n/**\n * Insert or toggle header with specific level\n */\nexport function insertHeader(textarea, level = 1, toggle = false) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n if (level < 1 || level > 6) level = 1\n \n debugLog('insertHeader', `============ START ============`);\n debugLog('insertHeader', `Level: ${level}, Toggle: ${toggle}`);\n debugLog('insertHeader', `Initial cursor: ${textarea.selectionStart}-${textarea.selectionEnd}`);\n \n const headerKey = `header${level === 1 ? '1' : level}`\n const style = mergeWithDefaults(FORMATS[headerKey] || FORMATS.header1)\n debugLog('insertHeader', `Style prefix: \"${style.prefix}\"`);\n \n // Save original positions and get line info BEFORE applyLineOperation\n const value = textarea.value\n const originalStart = textarea.selectionStart\n const originalEnd = textarea.selectionEnd\n \n // Find the current line boundaries to check existing header\n let lineStart = originalStart\n while (lineStart > 0 && value[lineStart - 1] !== '\\n') {\n lineStart--\n }\n let lineEnd = originalEnd\n while (lineEnd < value.length && value[lineEnd] !== '\\n') {\n lineEnd++\n }\n \n // Get current line and check for existing header\n const currentLineContent = value.slice(lineStart, lineEnd)\n debugLog('insertHeader', `Current line (before): \"${currentLineContent}\"`);\n \n const existingHeaderMatch = currentLineContent.match(/^(#{1,6})\\s*/)\n const existingLevel = existingHeaderMatch ? existingHeaderMatch[1].length : 0\n const existingPrefixLength = existingHeaderMatch ? existingHeaderMatch[0].length : 0\n \n debugLog('insertHeader', `Existing header check:`);\n debugLog('insertHeader', ` - Match: ${existingHeaderMatch ? `\"${existingHeaderMatch[0]}\"` : 'none'}`);\n debugLog('insertHeader', ` - Existing level: ${existingLevel}`);\n debugLog('insertHeader', ` - Existing prefix length: ${existingPrefixLength}`);\n debugLog('insertHeader', ` - Target level: ${level}`);\n \n // Determine if we're toggling off\n const shouldToggleOff = toggle && existingLevel === level\n debugLog('insertHeader', `Should toggle OFF: ${shouldToggleOff} (toggle=${toggle}, existingLevel=${existingLevel}, level=${level})`);\n \n // Use applyLineOperation for consistent behavior\n const result = applyLineOperation(\n textarea,\n (ta) => {\n const currentLine = ta.value.slice(ta.selectionStart, ta.selectionEnd)\n debugLog('insertHeader', `Line in operation: \"${currentLine}\"`);\n \n // Remove any existing header formatting\n const cleanedLine = currentLine.replace(/^#{1,6}\\s*/, '')\n debugLog('insertHeader', `Cleaned line: \"${cleanedLine}\"`);\n \n let newLine\n \n if (shouldToggleOff) {\n // Toggle off - just use the cleaned line\n debugLog('insertHeader', 'ACTION: Toggling OFF - removing header');\n newLine = cleanedLine\n } else if (existingLevel > 0) {\n // Replace existing header with new one\n debugLog('insertHeader', `ACTION: Replacing H${existingLevel} with H${level}`);\n newLine = style.prefix + cleanedLine\n } else {\n // Add new header\n debugLog('insertHeader', 'ACTION: Adding new header');\n newLine = style.prefix + cleanedLine\n }\n \n debugLog('insertHeader', `New line: \"${newLine}\"`);\n \n return {\n text: newLine,\n selectionStart: ta.selectionStart,\n selectionEnd: ta.selectionEnd\n }\n },\n {\n prefix: style.prefix,\n // Custom selection adjustment for headers\n adjustSelection: (isRemoving, selStart, selEnd, lineStartPos) => {\n debugLog('insertHeader', `Adjusting selection:`);\n debugLog('insertHeader', ` - isRemoving param: ${isRemoving}`);\n debugLog('insertHeader', ` - shouldToggleOff: ${shouldToggleOff}`);\n debugLog('insertHeader', ` - selStart: ${selStart}, selEnd: ${selEnd}`);\n debugLog('insertHeader', ` - lineStartPos: ${lineStartPos}`);\n \n if (shouldToggleOff) {\n // Removing the header entirely\n const adjustment = Math.max(selStart - existingPrefixLength, lineStartPos)\n debugLog('insertHeader', ` - Removing header, adjusting by -${existingPrefixLength}`);\n return {\n start: adjustment,\n end: selStart === selEnd ? adjustment : Math.max(selEnd - existingPrefixLength, lineStartPos)\n }\n } else if (existingPrefixLength > 0) {\n // Replacing existing header with new one\n const prefixDiff = style.prefix.length - existingPrefixLength\n debugLog('insertHeader', ` - Replacing header, adjusting by ${prefixDiff}`);\n return {\n start: selStart + prefixDiff,\n end: selEnd + prefixDiff\n }\n } else {\n // Adding new header\n debugLog('insertHeader', ` - Adding header, adjusting by +${style.prefix.length}`);\n return {\n start: selStart + style.prefix.length,\n end: selEnd + style.prefix.length\n }\n }\n }\n }\n )\n \n debugLog('insertHeader', `Final result: text=\"${result.text}\", cursor=${result.selectionStart}-${result.selectionEnd}`);\n debugLog('insertHeader', `============ END ============`);\n \n insertText(textarea, result)\n}\n\n/**\n * Toggle H1 header\n */\nexport function toggleH1(textarea) {\n insertHeader(textarea, 1, true)\n}\n\n/**\n * Toggle H2 header\n */\nexport function toggleH2(textarea) {\n insertHeader(textarea, 2, true)\n}\n\n/**\n * Toggle H3 header\n */\nexport function toggleH3(textarea) {\n insertHeader(textarea, 3, true)\n}\n\n/**\n * Get active formats at cursor position\n */\nexport function getActiveFormats(textarea) {\n return getActive(textarea)\n}\n\n/**\n * Check if format is active at cursor\n */\nexport function hasFormat(textarea, format) {\n return has(textarea, format)\n}\n\n/**\n * Expand selection based on options\n */\nexport function expandSelection(textarea, options = {}) {\n expand(textarea, options)\n}\n\n/**\n * Apply custom format\n */\nexport function applyCustomFormat(textarea, format) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n \n const style = mergeWithDefaults(format)\n let result\n \n if (style.multiline) {\n const selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n if (isMultipleLines(selectedText)) {\n result = multilineStyle(textarea, style)\n } else {\n result = blockStyle(textarea, style)\n }\n } else {\n result = blockStyle(textarea, style)\n }\n \n insertText(textarea, result)\n}\n\n/**\n * Preserve selection during callback\n */\nexport { preserveSelection }\n\n/**\n * Configure undo method\n */\nexport { setUndoMethod }\n\n/**\n * Debug mode control\n */\nexport { setDebugMode, getDebugMode }\n\n/**\n * Default export with all functions\n */\nexport default {\n toggleBold,\n toggleItalic,\n toggleCode,\n insertLink,\n toggleBulletList,\n toggleNumberedList,\n toggleQuote,\n toggleTaskList,\n insertHeader,\n toggleH1,\n toggleH2,\n toggleH3,\n getActiveFormats,\n hasFormat,\n expandSelection,\n applyCustomFormat,\n preserveSelection,\n setUndoMethod,\n setDebugMode,\n getDebugMode\n}", "/**\n * Keyboard shortcuts handler for OverType editor\n * Uses the same handleAction method as toolbar for consistency\n */\n\nimport * as markdownActions from 'markdown-actions';\n\n/**\n * ShortcutsManager - Handles keyboard shortcuts for the editor\n */\nexport class ShortcutsManager {\n constructor(editor) {\n this.editor = editor;\n this.textarea = editor.textarea;\n // No need to add our own listener - OverType will call handleKeydown\n }\n\n /**\n * Handle keydown events - called by OverType\n * @param {KeyboardEvent} event - The keyboard event\n * @returns {boolean} Whether the event was handled\n */\n handleKeydown(event) {\n const isMac = navigator.platform.toLowerCase().includes('mac');\n const modKey = isMac ? event.metaKey : event.ctrlKey;\n\n if (!modKey) return false;\n\n let action = null;\n\n // Map keyboard shortcuts to toolbar actions\n switch(event.key.toLowerCase()) {\n case 'b':\n if (!event.shiftKey) {\n action = 'toggleBold';\n }\n break;\n\n case 'i':\n if (!event.shiftKey) {\n action = 'toggleItalic';\n }\n break;\n\n case 'k':\n if (!event.shiftKey) {\n action = 'insertLink';\n }\n break;\n\n case '7':\n if (event.shiftKey) {\n action = 'toggleNumberedList';\n }\n break;\n\n case '8':\n if (event.shiftKey) {\n action = 'toggleBulletList';\n }\n break;\n }\n\n // If we have an action, handle it exactly like the toolbar does\n if (action) {\n event.preventDefault();\n \n // If toolbar exists, use its handleAction method (exact same code path)\n if (this.editor.toolbar) {\n this.editor.toolbar.handleAction(action);\n } else {\n // Fallback: duplicate the toolbar's handleAction logic\n this.handleAction(action);\n }\n \n return true;\n }\n\n return false;\n }\n\n /**\n * Handle action - fallback when no toolbar exists\n * This duplicates toolbar.handleAction for consistency\n */\n async handleAction(action) {\n const textarea = this.textarea;\n if (!textarea) return;\n\n // Focus textarea\n textarea.focus();\n \n try {\n switch (action) {\n case 'toggleBold':\n markdownActions.toggleBold(textarea);\n break;\n case 'toggleItalic':\n markdownActions.toggleItalic(textarea);\n break;\n case 'insertLink':\n markdownActions.insertLink(textarea);\n break;\n case 'toggleBulletList':\n markdownActions.toggleBulletList(textarea);\n break;\n case 'toggleNumberedList':\n markdownActions.toggleNumberedList(textarea);\n break;\n }\n\n // Trigger input event to update preview\n textarea.dispatchEvent(new Event('input', { bubbles: true }));\n } catch (error) {\n console.error('Error in markdown action:', error);\n }\n }\n\n /**\n * Cleanup\n */\n destroy() {\n // Nothing to clean up since we don't add our own listener\n }\n}", "/**\n * Built-in themes for OverType editor\n * Each theme provides a complete color palette for the editor\n */\n\n/**\n * Solar theme - Light, warm and bright\n */\nexport const solar = {\n name: 'solar',\n colors: {\n bgPrimary: '#faf0ca', // Lemon Chiffon - main background\n bgSecondary: '#ffffff', // White - editor background\n text: '#0d3b66', // Yale Blue - main text\n h1: '#f95738', // Tomato - h1 headers\n h2: '#ee964b', // Sandy Brown - h2 headers \n h3: '#3d8a51', // Forest green - h3 headers\n strong: '#ee964b', // Sandy Brown - bold text\n em: '#f95738', // Tomato - italic text\n link: '#0d3b66', // Yale Blue - links\n code: '#0d3b66', // Yale Blue - inline code\n codeBg: 'rgba(244, 211, 94, 0.4)', // Naples Yellow with transparency\n blockquote: '#5a7a9b', // Muted blue - blockquotes\n hr: '#5a7a9b', // Muted blue - horizontal rules\n syntaxMarker: 'rgba(13, 59, 102, 0.52)', // Yale Blue with transparency\n cursor: '#f95738', // Tomato - cursor\n selection: 'rgba(244, 211, 94, 0.4)', // Naples Yellow with transparency\n listMarker: '#ee964b', // Sandy Brown - list markers\n // Toolbar colors\n toolbarBg: '#ffffff', // White - toolbar background\n toolbarBorder: 'rgba(13, 59, 102, 0.15)', // Yale Blue border\n toolbarIcon: '#0d3b66', // Yale Blue - icon color\n toolbarHover: '#f5f5f5', // Light gray - hover background\n toolbarActive: '#faf0ca', // Lemon Chiffon - active button background\n }\n};\n\n/**\n * Cave theme - Dark ocean depths\n */\nexport const cave = {\n name: 'cave',\n colors: {\n bgPrimary: '#141E26', // Deep ocean - main background\n bgSecondary: '#1D2D3E', // Darker charcoal - editor background\n text: '#c5dde8', // Light blue-gray - main text\n h1: '#d4a5ff', // Rich lavender - h1 headers\n h2: '#f6ae2d', // Hunyadi Yellow - h2 headers\n h3: '#9fcfec', // Brighter blue - h3 headers\n strong: '#f6ae2d', // Hunyadi Yellow - bold text\n em: '#9fcfec', // Brighter blue - italic text\n link: '#9fcfec', // Brighter blue - links\n code: '#c5dde8', // Light blue-gray - inline code\n codeBg: '#1a232b', // Very dark blue - code background\n blockquote: '#9fcfec', // Brighter blue - same as italic\n hr: '#c5dde8', // Light blue-gray - horizontal rules\n syntaxMarker: 'rgba(159, 207, 236, 0.73)', // Brighter blue semi-transparent\n cursor: '#f26419', // Orange Pantone - cursor\n selection: 'rgba(51, 101, 138, 0.4)', // Lapis Lazuli with transparency\n listMarker: '#f6ae2d', // Hunyadi Yellow - list markers\n // Toolbar colors for dark theme\n toolbarBg: '#1D2D3E', // Darker charcoal - toolbar background\n toolbarBorder: 'rgba(197, 221, 232, 0.1)', // Light blue-gray border\n toolbarIcon: '#c5dde8', // Light blue-gray - icon color\n toolbarHover: '#243546', // Slightly lighter charcoal - hover background\n toolbarActive: '#2a3f52', // Even lighter - active button background\n }\n};\n\n/**\n * Default themes registry\n */\nexport const themes = {\n solar,\n cave,\n // Aliases for backward compatibility\n light: solar,\n dark: cave\n};\n\n/**\n * Get theme by name or return custom theme object\n * @param {string|Object} theme - Theme name or custom theme object\n * @returns {Object} Theme configuration\n */\nexport function getTheme(theme) {\n if (typeof theme === 'string') {\n const themeObj = themes[theme] || themes.solar;\n // Preserve the requested theme name (important for 'light' and 'dark' aliases)\n return { ...themeObj, name: theme };\n }\n return theme;\n}\n\n/**\n * Apply theme colors to CSS variables\n * @param {Object} colors - Theme colors object\n * @returns {string} CSS custom properties string\n */\nexport function themeToCSSVars(colors) {\n const vars = [];\n for (const [key, value] of Object.entries(colors)) {\n // Convert camelCase to kebab-case\n const varName = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n vars.push(`--${varName}: ${value};`);\n }\n return vars.join('\\n');\n}\n\n/**\n * Merge custom colors with base theme\n * @param {Object} baseTheme - Base theme object\n * @param {Object} customColors - Custom color overrides\n * @returns {Object} Merged theme object\n */\nexport function mergeTheme(baseTheme, customColors = {}) {\n return {\n ...baseTheme,\n colors: {\n ...baseTheme.colors,\n ...customColors\n }\n };\n}", "/**\n * CSS styles for OverType editor\n * Embedded in JavaScript to ensure single-file distribution\n */\n\nimport { themeToCSSVars } from './themes.js';\n\n/**\n * Generate the complete CSS for the editor\n * @param {Object} options - Configuration options\n * @returns {string} Complete CSS string\n */\nexport function generateStyles(options = {}) {\n const {\n fontSize = '14px',\n lineHeight = 1.6,\n /* System-first, guaranteed monospaced; avoids Android 'ui-monospace' pitfalls */\n fontFamily = '\"SF Mono\", SFMono-Regular, Menlo, Monaco, \"Cascadia Code\", Consolas, \"Roboto Mono\", \"Noto Sans Mono\", \"Droid Sans Mono\", \"Ubuntu Mono\", \"DejaVu Sans Mono\", \"Liberation Mono\", \"Courier New\", Courier, monospace',\n padding = '20px',\n theme = null,\n mobile = {}\n } = options;\n\n // Generate mobile overrides\n const mobileStyles = Object.keys(mobile).length > 0 ? `\n @media (max-width: 640px) {\n .overtype-wrapper .overtype-input,\n .overtype-wrapper .overtype-preview {\n ${Object.entries(mobile)\n .map(([prop, val]) => {\n const cssProp = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `${cssProp}: ${val} !important;`;\n })\n .join('\\n ')}\n }\n }\n ` : '';\n\n // Generate theme variables if provided\n const themeVars = theme && theme.colors ? themeToCSSVars(theme.colors) : '';\n\n return `\n /* OverType Editor Styles */\n \n /* Middle-ground CSS Reset - Prevent parent styles from leaking in */\n .overtype-container * {\n /* Box model - these commonly leak */\n margin: 0 !important;\n padding: 0 !important;\n border: 0 !important;\n \n /* Layout - these can break our layout */\n /* Don't reset position - it breaks dropdowns */\n float: none !important;\n clear: none !important;\n \n /* Typography - only reset decorative aspects */\n text-decoration: none !important;\n text-transform: none !important;\n letter-spacing: normal !important;\n \n /* Visual effects that can interfere */\n box-shadow: none !important;\n text-shadow: none !important;\n \n /* Ensure box-sizing is consistent */\n box-sizing: border-box !important;\n \n /* Keep inheritance for these */\n /* font-family, color, line-height, font-size - inherit */\n }\n \n /* Container base styles after reset */\n .overtype-container {\n display: grid !important;\n grid-template-rows: auto 1fr auto !important;\n width: 100% !important;\n height: 100% !important;\n position: relative !important; /* Override reset - needed for absolute children */\n overflow: visible !important; /* Allow dropdown to overflow container */\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n text-align: left !important;\n ${themeVars ? `\n /* Theme Variables */\n ${themeVars}` : ''}\n }\n \n /* Force left alignment for all elements in the editor */\n .overtype-container .overtype-wrapper * {\n text-align: left !important;\n }\n \n /* Auto-resize mode styles */\n .overtype-container.overtype-auto-resize {\n height: auto !important;\n grid-template-rows: auto auto auto !important;\n }\n \n .overtype-container.overtype-auto-resize .overtype-wrapper {\n height: auto !important;\n min-height: 60px !important;\n overflow: visible !important;\n }\n \n .overtype-wrapper {\n position: relative !important; /* Override reset - needed for absolute children */\n width: 100% !important;\n height: 100% !important; /* Take full height of grid cell */\n min-height: 60px !important; /* Minimum usable height */\n overflow: hidden !important;\n background: var(--bg-secondary, #ffffff) !important;\n grid-row: 2 !important; /* Always second row in grid */\n z-index: 1; /* Below toolbar and dropdown */\n }\n\n /* Critical alignment styles - must be identical for both layers */\n .overtype-wrapper .overtype-input,\n .overtype-wrapper .overtype-preview {\n /* Positioning - must be identical */\n position: absolute !important; /* Override reset - required for overlay */\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n \n /* Font properties - any difference breaks alignment */\n font-family: ${fontFamily} !important;\n font-variant-ligatures: none !important; /* keep metrics stable for code */\n font-size: var(--instance-font-size, ${fontSize}) !important;\n line-height: var(--instance-line-height, ${lineHeight}) !important;\n font-weight: normal !important;\n font-style: normal !important;\n font-variant: normal !important;\n font-stretch: normal !important;\n font-kerning: none !important;\n font-feature-settings: normal !important;\n \n /* Box model - must match exactly */\n padding: var(--instance-padding, ${padding}) !important;\n margin: 0 !important;\n border: none !important;\n outline: none !important;\n box-sizing: border-box !important;\n \n /* Text layout - critical for character positioning */\n white-space: pre-wrap !important;\n word-wrap: break-word !important;\n word-break: normal !important;\n overflow-wrap: break-word !important;\n tab-size: 2 !important;\n -moz-tab-size: 2 !important;\n text-align: left !important;\n text-indent: 0 !important;\n letter-spacing: normal !important;\n word-spacing: normal !important;\n \n /* Text rendering */\n text-transform: none !important;\n text-rendering: auto !important;\n -webkit-font-smoothing: auto !important;\n -webkit-text-size-adjust: 100% !important;\n \n /* Direction and writing */\n direction: ltr !important;\n writing-mode: horizontal-tb !important;\n unicode-bidi: normal !important;\n text-orientation: mixed !important;\n \n /* Visual effects that could shift perception */\n text-shadow: none !important;\n filter: none !important;\n transform: none !important;\n zoom: 1 !important;\n \n /* Vertical alignment */\n vertical-align: baseline !important;\n \n /* Size constraints */\n min-width: 0 !important;\n min-height: 0 !important;\n max-width: none !important;\n max-height: none !important;\n \n /* Overflow */\n overflow-y: auto !important;\n overflow-x: auto !important;\n /* overscroll-behavior removed to allow scroll-through to parent */\n scrollbar-width: auto !important;\n scrollbar-gutter: auto !important;\n \n /* Animation/transition - disabled to prevent movement */\n animation: none !important;\n transition: none !important;\n }\n\n /* Input layer styles */\n .overtype-wrapper .overtype-input {\n /* Layer positioning */\n z-index: 1 !important;\n \n /* Text visibility */\n color: transparent !important;\n caret-color: var(--cursor, #f95738) !important;\n background-color: transparent !important;\n \n /* Textarea-specific */\n resize: none !important;\n appearance: none !important;\n -webkit-appearance: none !important;\n -moz-appearance: none !important;\n \n /* Prevent mobile zoom on focus */\n touch-action: manipulation !important;\n \n /* Disable autofill and spellcheck */\n autocomplete: off !important;\n autocorrect: off !important;\n autocapitalize: off !important;\n spellcheck: false !important;\n }\n\n .overtype-wrapper .overtype-input::selection {\n background-color: var(--selection, rgba(244, 211, 94, 0.4));\n }\n\n /* Preview layer styles */\n .overtype-wrapper .overtype-preview {\n /* Layer positioning */\n z-index: 0 !important;\n pointer-events: none !important;\n color: var(--text, #0d3b66) !important;\n background-color: transparent !important;\n \n /* Prevent text selection */\n user-select: none !important;\n -webkit-user-select: none !important;\n -moz-user-select: none !important;\n -ms-user-select: none !important;\n }\n\n /* Defensive styles for preview child divs */\n .overtype-wrapper .overtype-preview div {\n /* Reset any inherited styles */\n margin: 0 !important;\n padding: 0 !important;\n border: none !important;\n text-align: left !important;\n text-indent: 0 !important;\n display: block !important;\n position: static !important;\n transform: none !important;\n min-height: 0 !important;\n max-height: none !important;\n line-height: inherit !important;\n font-size: inherit !important;\n font-family: inherit !important;\n }\n\n /* Markdown element styling - NO SIZE CHANGES */\n .overtype-wrapper .overtype-preview .header {\n font-weight: bold !important;\n }\n\n /* Header colors */\n .overtype-wrapper .overtype-preview .h1 { \n color: var(--h1, #f95738) !important; \n }\n .overtype-wrapper .overtype-preview .h2 { \n color: var(--h2, #ee964b) !important; \n }\n .overtype-wrapper .overtype-preview .h3 { \n color: var(--h3, #3d8a51) !important; \n }\n\n /* Semantic headers - flatten in edit mode */\n .overtype-wrapper .overtype-preview h1,\n .overtype-wrapper .overtype-preview h2,\n .overtype-wrapper .overtype-preview h3 {\n font-size: inherit !important;\n font-weight: bold !important;\n margin: 0 !important;\n padding: 0 !important;\n display: inline !important;\n line-height: inherit !important;\n }\n\n /* Header colors for semantic headers */\n .overtype-wrapper .overtype-preview h1 { \n color: var(--h1, #f95738) !important; \n }\n .overtype-wrapper .overtype-preview h2 { \n color: var(--h2, #ee964b) !important; \n }\n .overtype-wrapper .overtype-preview h3 { \n color: var(--h3, #3d8a51) !important; \n }\n\n /* Lists - remove styling in edit mode */\n .overtype-wrapper .overtype-preview ul,\n .overtype-wrapper .overtype-preview ol {\n list-style: none !important;\n margin: 0 !important;\n padding: 0 !important;\n display: block !important; /* Lists need to be block for line breaks */\n }\n\n .overtype-wrapper .overtype-preview li {\n display: block !important; /* Each item on its own line */\n margin: 0 !important;\n padding: 0 !important;\n /* Don't set list-style here - let ul/ol control it */\n }\n\n /* Bold text */\n .overtype-wrapper .overtype-preview strong {\n color: var(--strong, #ee964b) !important;\n font-weight: bold !important;\n }\n\n /* Italic text */\n .overtype-wrapper .overtype-preview em {\n color: var(--em, #f95738) !important;\n text-decoration-color: var(--em, #f95738) !important;\n text-decoration-thickness: 1px !important;\n font-style: italic !important;\n }\n\n /* Inline code */\n .overtype-wrapper .overtype-preview code {\n background: var(--code-bg, rgba(244, 211, 94, 0.4)) !important;\n color: var(--code, #0d3b66) !important;\n padding: 0 !important;\n border-radius: 2px !important;\n font-family: inherit !important;\n font-size: inherit !important;\n line-height: inherit !important;\n font-weight: normal !important;\n }\n\n /* Code blocks - consolidated pre blocks */\n .overtype-wrapper .overtype-preview pre {\n padding: 0 !important;\n margin: 0 !important;\n border-radius: 4px !important;\n overflow-x: auto !important;\n }\n \n /* Code block styling in normal mode - yellow background */\n .overtype-wrapper .overtype-preview pre.code-block {\n background: var(--code-bg, rgba(244, 211, 94, 0.4)) !important;\n }\n\n /* Code inside pre blocks - remove background */\n .overtype-wrapper .overtype-preview pre code {\n background: transparent !important;\n color: var(--code, #0d3b66) !important;\n }\n\n /* Blockquotes */\n .overtype-wrapper .overtype-preview .blockquote {\n color: var(--blockquote, #5a7a9b) !important;\n padding: 0 !important;\n margin: 0 !important;\n border: none !important;\n }\n\n /* Links */\n .overtype-wrapper .overtype-preview a {\n color: var(--link, #0d3b66) !important;\n text-decoration: underline !important;\n font-weight: normal !important;\n }\n\n .overtype-wrapper .overtype-preview a:hover {\n text-decoration: underline !important;\n color: var(--link, #0d3b66) !important;\n }\n\n /* Lists - no list styling */\n .overtype-wrapper .overtype-preview ul,\n .overtype-wrapper .overtype-preview ol {\n list-style: none !important;\n margin: 0 !important;\n padding: 0 !important;\n }\n\n\n /* Horizontal rules */\n .overtype-wrapper .overtype-preview hr {\n border: none !important;\n color: var(--hr, #5a7a9b) !important;\n margin: 0 !important;\n padding: 0 !important;\n }\n\n .overtype-wrapper .overtype-preview .hr-marker {\n color: var(--hr, #5a7a9b) !important;\n opacity: 0.6 !important;\n }\n\n /* Code fence markers - with background when not in code block */\n .overtype-wrapper .overtype-preview .code-fence {\n color: var(--code, #0d3b66) !important;\n background: var(--code-bg, rgba(244, 211, 94, 0.4)) !important;\n }\n \n /* Code block lines - background for entire code block */\n .overtype-wrapper .overtype-preview .code-block-line {\n background: var(--code-bg, rgba(244, 211, 94, 0.4)) !important;\n }\n \n /* Remove background from code fence when inside code block line */\n .overtype-wrapper .overtype-preview .code-block-line .code-fence {\n background: transparent !important;\n }\n\n /* Raw markdown line */\n .overtype-wrapper .overtype-preview .raw-line {\n color: var(--raw-line, #5a7a9b) !important;\n font-style: normal !important;\n font-weight: normal !important;\n }\n\n /* Syntax markers */\n .overtype-wrapper .overtype-preview .syntax-marker {\n color: var(--syntax-marker, rgba(13, 59, 102, 0.52)) !important;\n opacity: 0.7 !important;\n }\n\n /* List markers */\n .overtype-wrapper .overtype-preview .list-marker {\n color: var(--list-marker, #ee964b) !important;\n }\n\n /* Stats bar */\n \n /* Stats bar - positioned by grid, not absolute */\n .overtype-stats {\n height: 40px !important;\n padding: 0 20px !important;\n background: #f8f9fa !important;\n border-top: 1px solid #e0e0e0 !important;\n display: flex !important;\n justify-content: space-between !important;\n align-items: center !important;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;\n font-size: 0.85rem !important;\n color: #666 !important;\n grid-row: 3 !important; /* Always third row in grid */\n }\n \n /* Dark theme stats bar */\n .overtype-container[data-theme=\"cave\"] .overtype-stats {\n background: var(--bg-secondary, #1D2D3E) !important;\n border-top: 1px solid rgba(197, 221, 232, 0.1) !important;\n color: var(--text, #c5dde8) !important;\n }\n \n .overtype-stats .overtype-stat {\n display: flex !important;\n align-items: center !important;\n gap: 5px !important;\n white-space: nowrap !important;\n }\n \n .overtype-stats .live-dot {\n width: 8px !important;\n height: 8px !important;\n background: #4caf50 !important;\n border-radius: 50% !important;\n animation: pulse 2s infinite !important;\n }\n \n @keyframes pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.6; transform: scale(1.2); }\n }\n \n\n /* Toolbar Styles */\n .overtype-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px !important; /* Override reset */\n background: var(--toolbar-bg, var(--bg-primary, #f8f9fa)) !important; /* Override reset */\n overflow-x: auto !important; /* Allow horizontal scrolling */\n overflow-y: hidden !important; /* Hide vertical overflow */\n -webkit-overflow-scrolling: touch;\n flex-shrink: 0;\n height: auto !important;\n grid-row: 1 !important; /* Always first row in grid */\n position: relative !important; /* Override reset */\n z-index: 100; /* Ensure toolbar is above wrapper */\n scrollbar-width: thin; /* Thin scrollbar on Firefox */\n }\n \n /* Thin scrollbar styling */\n .overtype-toolbar::-webkit-scrollbar {\n height: 4px;\n }\n \n .overtype-toolbar::-webkit-scrollbar-track {\n background: transparent;\n }\n \n .overtype-toolbar::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.2);\n border-radius: 2px;\n }\n\n .overtype-toolbar-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--toolbar-icon, var(--text-secondary, #666));\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n }\n\n .overtype-toolbar-button svg {\n width: 20px;\n height: 20px;\n fill: currentColor;\n }\n\n .overtype-toolbar-button:hover {\n background: var(--toolbar-hover, var(--bg-secondary, #e9ecef));\n color: var(--toolbar-icon, var(--text-primary, #333));\n }\n\n .overtype-toolbar-button:active {\n transform: scale(0.95);\n }\n\n .overtype-toolbar-button.active {\n background: var(--toolbar-active, var(--primary, #007bff));\n color: var(--toolbar-icon, var(--text-primary, #333));\n }\n\n .overtype-toolbar-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .overtype-toolbar-separator {\n width: 1px;\n height: 24px;\n background: var(--border, #e0e0e0);\n margin: 0 4px;\n flex-shrink: 0;\n }\n\n /* Adjust wrapper when toolbar is present */\n .overtype-container .overtype-toolbar + .overtype-wrapper {\n }\n\n /* Mobile toolbar adjustments */\n @media (max-width: 640px) {\n .overtype-toolbar {\n padding: 6px;\n gap: 2px;\n }\n\n .overtype-toolbar-button {\n width: 36px;\n height: 36px;\n }\n\n .overtype-toolbar-separator {\n margin: 0 2px;\n }\n }\n \n /* Plain mode - hide preview and show textarea text */\n .overtype-container.plain-mode .overtype-preview {\n display: none !important;\n }\n \n .overtype-container.plain-mode .overtype-input {\n color: var(--text, #0d3b66) !important;\n /* Use system font stack for better plain text readability */\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \n \"Helvetica Neue\", Arial, sans-serif !important;\n }\n \n /* Ensure textarea remains transparent in overlay mode */\n .overtype-container:not(.plain-mode) .overtype-input {\n color: transparent !important;\n }\n\n /* Dropdown menu styles */\n .overtype-toolbar-button {\n position: relative !important; /* Override reset - needed for dropdown */\n }\n\n .overtype-toolbar-button.dropdown-active {\n background: var(--toolbar-active, var(--hover-bg, #f0f0f0));\n }\n\n .overtype-dropdown-menu {\n position: fixed !important; /* Fixed positioning relative to viewport */\n background: var(--bg-secondary, white) !important; /* Override reset */\n border: 1px solid var(--border, #e0e0e0) !important; /* Override reset */\n border-radius: 6px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1) !important; /* Override reset */\n z-index: 10000; /* Very high z-index to ensure visibility */\n min-width: 150px;\n padding: 4px 0 !important; /* Override reset */\n /* Position will be set via JavaScript based on button position */\n }\n\n .overtype-dropdown-item {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 8px 12px;\n border: none;\n background: none;\n text-align: left;\n cursor: pointer;\n font-size: 14px;\n color: var(--text, #333);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n }\n\n .overtype-dropdown-item:hover {\n background: var(--hover-bg, #f0f0f0);\n }\n\n .overtype-dropdown-item.active {\n font-weight: 600;\n }\n\n .overtype-dropdown-check {\n width: 16px;\n margin-right: 8px;\n color: var(--h1, #007bff);\n }\n\n /* Preview mode styles */\n .overtype-container.preview-mode .overtype-input {\n display: none !important;\n }\n\n .overtype-container.preview-mode .overtype-preview {\n pointer-events: auto !important;\n user-select: text !important;\n cursor: text !important;\n }\n\n /* Hide syntax markers in preview mode */\n .overtype-container.preview-mode .syntax-marker {\n display: none !important;\n }\n \n /* Hide URL part of links in preview mode - extra specificity */\n .overtype-container.preview-mode .syntax-marker.url-part,\n .overtype-container.preview-mode .url-part {\n display: none !important;\n }\n \n /* Hide all syntax markers inside links too */\n .overtype-container.preview-mode a .syntax-marker {\n display: none !important;\n }\n\n /* Headers - restore proper sizing in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview h1, \n .overtype-container.preview-mode .overtype-wrapper .overtype-preview h2, \n .overtype-container.preview-mode .overtype-wrapper .overtype-preview h3 {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-weight: 600 !important;\n margin: 0 !important;\n display: block !important;\n color: inherit !important; /* Use parent text color */\n line-height: 1 !important; /* Tight line height for headings */\n }\n \n .overtype-container.preview-mode .overtype-wrapper .overtype-preview h1 { \n font-size: 2em !important; \n }\n \n .overtype-container.preview-mode .overtype-wrapper .overtype-preview h2 { \n font-size: 1.5em !important; \n }\n \n .overtype-container.preview-mode .overtype-wrapper .overtype-preview h3 { \n font-size: 1.17em !important; \n }\n\n /* Lists - restore list styling in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview ul {\n display: block !important;\n list-style: disc !important;\n padding-left: 2em !important;\n margin: 1em 0 !important;\n }\n\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview ol {\n display: block !important;\n list-style: decimal !important;\n padding-left: 2em !important;\n margin: 1em 0 !important;\n }\n \n .overtype-container.preview-mode .overtype-wrapper .overtype-preview li {\n display: list-item !important;\n margin: 0 !important;\n padding: 0 !important;\n }\n\n /* Links - make clickable in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview a {\n pointer-events: auto !important;\n cursor: pointer !important;\n color: var(--link, #0066cc) !important;\n text-decoration: underline !important;\n }\n\n /* Code blocks - proper pre/code styling in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview pre.code-block {\n background: #2d2d2d !important;\n color: #f8f8f2 !important;\n padding: 1.2em !important;\n border-radius: 3px !important;\n overflow-x: auto !important;\n margin: 0 !important;\n display: block !important;\n }\n \n /* Cave theme code block background in preview mode */\n .overtype-container[data-theme=\"cave\"].preview-mode .overtype-wrapper .overtype-preview pre.code-block {\n background: #11171F !important;\n }\n\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview pre.code-block code {\n background: transparent !important;\n color: inherit !important;\n padding: 0 !important;\n font-family: ${fontFamily} !important;\n font-size: 0.9em !important;\n line-height: 1.4 !important;\n }\n\n /* Hide old code block lines and fences in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview .code-block-line {\n display: none !important;\n }\n\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview .code-fence {\n display: none !important;\n }\n\n /* Blockquotes - enhanced styling in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview .blockquote {\n display: block !important;\n border-left: 4px solid var(--blockquote, #ddd) !important;\n padding-left: 1em !important;\n margin: 1em 0 !important;\n font-style: italic !important;\n }\n\n /* Typography improvements in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview {\n font-family: Georgia, 'Times New Roman', serif !important;\n font-size: 16px !important;\n line-height: 1.8 !important;\n color: var(--text, #333) !important; /* Consistent text color */\n }\n\n /* Inline code in preview mode - keep monospace */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview code {\n font-family: ${fontFamily} !important;\n font-size: 0.9em !important;\n background: rgba(135, 131, 120, 0.15) !important;\n padding: 0.2em 0.4em !important;\n border-radius: 3px !important;\n }\n\n /* Strong and em elements in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview strong {\n font-weight: 700 !important;\n color: inherit !important; /* Use parent text color */\n }\n\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview em {\n font-style: italic !important;\n color: inherit !important; /* Use parent text color */\n }\n\n /* HR in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview .hr-marker {\n display: block !important;\n border-top: 2px solid var(--hr, #ddd) !important;\n text-indent: -9999px !important;\n height: 2px !important;\n }\n\n ${mobileStyles}\n `;\n}", "/**\n * SVG icons for OverType toolbar\n * Quill-style icons with inline styles\n */\n\nexport const boldIcon = `<svg viewBox=\"0 0 18 18\">\n <path stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5,4H9.5A2.5,2.5,0,0,1,12,6.5v0A2.5,2.5,0,0,1,9.5,9H5A0,0,0,0,1,5,9V4A0,0,0,0,1,5,4Z\"></path>\n <path stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5,9h5.5A2.5,2.5,0,0,1,13,11.5v0A2.5,2.5,0,0,1,10.5,14H5a0,0,0,0,1,0,0V9A0,0,0,0,1,5,9Z\"></path>\n</svg>`;\n\nexport const italicIcon = `<svg viewBox=\"0 0 18 18\">\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"7\" x2=\"13\" y1=\"4\" y2=\"4\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"5\" x2=\"11\" y1=\"14\" y2=\"14\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"8\" x2=\"10\" y1=\"14\" y2=\"4\"></line>\n</svg>`;\n\nexport const h1Icon = `<svg viewBox=\"0 0 18 18\">\n <path fill=\"currentColor\" d=\"M10,4V14a1,1,0,0,1-2,0V10H3v4a1,1,0,0,1-2,0V4A1,1,0,0,1,3,4V8H8V4a1,1,0,0,1,2,0Zm6.06787,9.209H14.98975V7.59863a.54085.54085,0,0,0-.605-.60547h-.62744a1.01119,1.01119,0,0,0-.748.29688L11.645,8.56641a.5435.5435,0,0,0-.022.8584l.28613.30762a.53861.53861,0,0,0,.84717.0332l.09912-.08789a1.2137,1.2137,0,0,0,.2417-.35254h.02246s-.01123.30859-.01123.60547V13.209H12.041a.54085.54085,0,0,0-.605.60547v.43945a.54085.54085,0,0,0,.605.60547h4.02686a.54085.54085,0,0,0,.605-.60547v-.43945A.54085.54085,0,0,0,16.06787,13.209Z\"></path>\n</svg>`;\n\nexport const h2Icon = `<svg viewBox=\"0 0 18 18\">\n <path fill=\"currentColor\" d=\"M16.73975,13.81445v.43945a.54085.54085,0,0,1-.605.60547H11.855a.58392.58392,0,0,1-.64893-.60547V14.0127c0-2.90527,3.39941-3.42187,3.39941-4.55469a.77675.77675,0,0,0-.84717-.78125,1.17684,1.17684,0,0,0-.83594.38477c-.2749.26367-.561.374-.85791.13184l-.4292-.34082c-.30811-.24219-.38525-.51758-.1543-.81445a2.97155,2.97155,0,0,1,2.45361-1.17676,2.45393,2.45393,0,0,1,2.68408,2.40918c0,2.45312-3.1792,2.92676-3.27832,3.93848h2.79443A.54085.54085,0,0,1,16.73975,13.81445ZM9,3A.99974.99974,0,0,0,8,4V8H3V4A1,1,0,0,0,1,4V14a1,1,0,0,0,2,0V10H8v4a1,1,0,0,0,2,0V4A.99974.99974,0,0,0,9,3Z\"></path>\n</svg>`;\n\nexport const h3Icon = `<svg viewBox=\"0 0 18 18\">\n <path fill=\"currentColor\" d=\"M16.65186,12.30664a2.6742,2.6742,0,0,1-2.915,2.68457,3.96592,3.96592,0,0,1-2.25537-.6709.56007.56007,0,0,1-.13232-.83594L11.64648,13c.209-.34082.48389-.36328.82471-.1543a2.32654,2.32654,0,0,0,1.12256.33008c.71484,0,1.12207-.35156,1.12207-.78125,0-.61523-.61621-.86816-1.46338-.86816H13.2085a.65159.65159,0,0,1-.68213-.41895l-.05518-.10937a.67114.67114,0,0,1,.14307-.78125l.71533-.86914a8.55289,8.55289,0,0,1,.68213-.7373V8.58887a3.93913,3.93913,0,0,1-.748.05469H11.9873a.54085.54085,0,0,1-.605-.60547V7.59863a.54085.54085,0,0,1,.605-.60547h3.75146a.53773.53773,0,0,1,.60547.59375v.17676a1.03723,1.03723,0,0,1-.27539.748L14.74854,10.0293A2.31132,2.31132,0,0,1,16.65186,12.30664ZM9,3A.99974.99974,0,0,0,8,4V8H3V4A1,1,0,0,0,1,4V14a1,1,0,0,0,2,0V10H8v4a1,1,0,0,0,2,0V4A.99974.99974,0,0,0,9,3Z\"></path>\n</svg>`;\n\nexport const linkIcon = `<svg viewBox=\"0 0 18 18\">\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"7\" x2=\"11\" y1=\"7\" y2=\"11\"></line>\n <path stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8.9,4.577a3.476,3.476,0,0,1,.36,4.679A3.476,3.476,0,0,1,4.577,8.9C3.185,7.5,2.035,6.4,4.217,4.217S7.5,3.185,8.9,4.577Z\"></path>\n <path stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13.423,9.1a3.476,3.476,0,0,0-4.679-.36,3.476,3.476,0,0,0,.36,4.679c1.392,1.392,2.5,2.542,4.679.36S14.815,10.5,13.423,9.1Z\"></path>\n</svg>`;\n\nexport const codeIcon = `<svg viewBox=\"0 0 18 18\">\n <polyline stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" points=\"5 7 3 9 5 11\"></polyline>\n <polyline stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" points=\"13 7 15 9 13 11\"></polyline>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"10\" x2=\"8\" y1=\"5\" y2=\"13\"></line>\n</svg>`;\n\n\nexport const bulletListIcon = `<svg viewBox=\"0 0 18 18\">\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"6\" x2=\"15\" y1=\"4\" y2=\"4\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"6\" x2=\"15\" y1=\"9\" y2=\"9\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"6\" x2=\"15\" y1=\"14\" y2=\"14\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"3\" x2=\"3\" y1=\"4\" y2=\"4\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"3\" x2=\"3\" y1=\"9\" y2=\"9\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"3\" x2=\"3\" y1=\"14\" y2=\"14\"></line>\n</svg>`;\n\nexport const orderedListIcon = `<svg viewBox=\"0 0 18 18\">\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"7\" x2=\"15\" y1=\"4\" y2=\"4\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"7\" x2=\"15\" y1=\"9\" y2=\"9\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"7\" x2=\"15\" y1=\"14\" y2=\"14\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1\" x1=\"2.5\" x2=\"4.5\" y1=\"5.5\" y2=\"5.5\"></line>\n <path fill=\"currentColor\" d=\"M3.5,6A0.5,0.5,0,0,1,3,5.5V3.085l-0.276.138A0.5,0.5,0,0,1,2.053,3c-0.124-.247-0.023-0.324.224-0.447l1-.5A0.5,0.5,0,0,1,4,2.5v3A0.5,0.5,0,0,1,3.5,6Z\"></path>\n <path stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1\" d=\"M4.5,10.5h-2c0-.234,1.85-1.076,1.85-2.234A0.959,0.959,0,0,0,2.5,8.156\"></path>\n <path stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1\" d=\"M2.5,14.846a0.959,0.959,0,0,0,1.85-.109A0.7,0.7,0,0,0,3.75,14a0.688,0.688,0,0,0,.6-0.736,0.959,0.959,0,0,0-1.85-.109\"></path>\n</svg>`;\n\nexport const quoteIcon = `<svg viewBox=\"2 2 20 20\">\n <path stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M10 10.8182L9 10.8182C8.80222 10.8182 8.60888 10.7649 8.44443 10.665C8.27998 10.5651 8.15181 10.4231 8.07612 10.257C8.00043 10.0909 7.98063 9.90808 8.01922 9.73174C8.0578 9.55539 8.15304 9.39341 8.29289 9.26627C8.43275 9.13913 8.61093 9.05255 8.80491 9.01747C8.99889 8.98239 9.19996 9.00039 9.38268 9.0692C9.56541 9.13801 9.72159 9.25453 9.83147 9.40403C9.94135 9.55353 10 9.72929 10 9.90909L10 12.1818C10 12.664 9.78929 13.1265 9.41421 13.4675C9.03914 13.8084 8.53043 14 8 14\"></path>\n <path stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16 10.8182L15 10.8182C14.8022 10.8182 14.6089 10.7649 14.4444 10.665C14.28 10.5651 14.1518 10.4231 14.0761 10.257C14.0004 10.0909 13.9806 9.90808 14.0192 9.73174C14.0578 9.55539 14.153 9.39341 14.2929 9.26627C14.4327 9.13913 14.6109 9.05255 14.8049 9.01747C14.9989 8.98239 15.2 9.00039 15.3827 9.0692C15.5654 9.13801 15.7216 9.25453 15.8315 9.40403C15.9414 9.55353 16 9.72929 16 9.90909L16 12.1818C16 12.664 15.7893 13.1265 15.4142 13.4675C15.0391 13.8084 14.5304 14 14 14\"></path>\n</svg>`;\n\nexport const taskListIcon = `<svg viewBox=\"0 0 18 18\">\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"8\" x2=\"16\" y1=\"4\" y2=\"4\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"8\" x2=\"16\" y1=\"9\" y2=\"9\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"8\" x2=\"16\" y1=\"14\" y2=\"14\"></line>\n <rect stroke=\"currentColor\" fill=\"none\" stroke-width=\"1.5\" x=\"2\" y=\"3\" width=\"3\" height=\"3\" rx=\"0.5\"></rect>\n <rect stroke=\"currentColor\" fill=\"none\" stroke-width=\"1.5\" x=\"2\" y=\"13\" width=\"3\" height=\"3\" rx=\"0.5\"></rect>\n <polyline stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" points=\"2.65 9.5 3.5 10.5 5 8.5\"></polyline>\n</svg>`;\n\nexport const eyeIcon = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" fill=\"none\"></path>\n <circle cx=\"12\" cy=\"12\" r=\"3\" fill=\"none\"></circle>\n</svg>`;", "/**\n * Toolbar component for OverType editor\n * Provides markdown formatting buttons with icons\n */\n\nimport * as icons from './icons.js';\nimport * as markdownActions from 'markdown-actions';\n\nexport class Toolbar {\n constructor(editor) {\n this.editor = editor;\n this.container = null;\n this.buttons = {};\n }\n\n /**\n * Create and attach toolbar to editor\n */\n create() {\n // Create toolbar container\n this.container = document.createElement('div');\n this.container.className = 'overtype-toolbar';\n this.container.setAttribute('role', 'toolbar');\n this.container.setAttribute('aria-label', 'Text formatting');\n\n // Define toolbar buttons\n const buttonConfig = [\n { name: 'bold', icon: icons.boldIcon, title: 'Bold (Ctrl+B)', action: 'toggleBold' },\n { name: 'italic', icon: icons.italicIcon, title: 'Italic (Ctrl+I)', action: 'toggleItalic' },\n { separator: true },\n { name: 'h1', icon: icons.h1Icon, title: 'Heading 1', action: 'insertH1' },\n { name: 'h2', icon: icons.h2Icon, title: 'Heading 2', action: 'insertH2' },\n { name: 'h3', icon: icons.h3Icon, title: 'Heading 3', action: 'insertH3' },\n { separator: true },\n { name: 'link', icon: icons.linkIcon, title: 'Insert Link (Ctrl+K)', action: 'insertLink' },\n { name: 'code', icon: icons.codeIcon, title: 'Code (Ctrl+`)', action: 'toggleCode' },\n { separator: true },\n { name: 'quote', icon: icons.quoteIcon, title: 'Quote', action: 'toggleQuote' },\n { separator: true },\n { name: 'bulletList', icon: icons.bulletListIcon, title: 'Bullet List', action: 'toggleBulletList' },\n { name: 'orderedList', icon: icons.orderedListIcon, title: 'Numbered List', action: 'toggleNumberedList' },\n { name: 'taskList', icon: icons.taskListIcon, title: 'Task List', action: 'toggleTaskList' },\n { separator: true },\n { name: 'viewMode', icon: icons.eyeIcon, title: 'View mode', action: 'toggle-view-menu', hasDropdown: true }\n ];\n\n // Create buttons\n buttonConfig.forEach(config => {\n if (config.separator) {\n const separator = document.createElement('div');\n separator.className = 'overtype-toolbar-separator';\n separator.setAttribute('role', 'separator');\n this.container.appendChild(separator);\n } else {\n const button = this.createButton(config);\n this.buttons[config.name] = button;\n this.container.appendChild(button);\n }\n });\n\n // Insert toolbar into container before editor wrapper\n const container = this.editor.element.querySelector('.overtype-container');\n const wrapper = this.editor.element.querySelector('.overtype-wrapper');\n if (container && wrapper) {\n container.insertBefore(this.container, wrapper);\n }\n\n return this.container;\n }\n\n /**\n * Create individual toolbar button\n */\n createButton(config) {\n const button = document.createElement('button');\n button.className = 'overtype-toolbar-button';\n button.type = 'button';\n button.title = config.title;\n button.setAttribute('aria-label', config.title);\n button.setAttribute('data-action', config.action);\n button.innerHTML = config.icon;\n\n // Add dropdown if needed\n if (config.hasDropdown) {\n button.classList.add('has-dropdown');\n // Store reference for dropdown\n if (config.name === 'viewMode') {\n this.viewModeButton = button;\n }\n }\n\n // Add click handler\n button.addEventListener('click', (e) => {\n e.preventDefault();\n this.handleAction(config.action, button);\n });\n\n return button;\n }\n\n /**\n * Handle toolbar button actions\n */\n async handleAction(action, button) {\n const textarea = this.editor.textarea;\n if (!textarea) return;\n\n // Handle dropdown toggle\n if (action === 'toggle-view-menu') {\n this.toggleViewDropdown(button);\n return;\n }\n\n // Focus textarea for other actions\n textarea.focus();\n\n try {\n \n switch (action) {\n case 'toggleBold':\n markdownActions.toggleBold(textarea);\n break;\n case 'toggleItalic':\n markdownActions.toggleItalic(textarea);\n break;\n case 'insertH1':\n markdownActions.toggleH1(textarea);\n break;\n case 'insertH2':\n markdownActions.toggleH2(textarea);\n break;\n case 'insertH3':\n markdownActions.toggleH3(textarea);\n break;\n case 'insertLink':\n markdownActions.insertLink(textarea);\n break;\n case 'toggleCode':\n markdownActions.toggleCode(textarea);\n break;\n case 'toggleBulletList':\n markdownActions.toggleBulletList(textarea);\n break;\n case 'toggleNumberedList':\n markdownActions.toggleNumberedList(textarea);\n break;\n case 'toggleQuote':\n markdownActions.toggleQuote(textarea);\n break;\n case 'toggleTaskList':\n markdownActions.toggleTaskList(textarea);\n break;\n case 'toggle-plain':\n // Toggle between plain textarea and overlay mode\n const isPlain = this.editor.container.classList.contains('plain-mode');\n this.editor.showPlainTextarea(!isPlain);\n break;\n }\n\n // Trigger input event to update preview\n textarea.dispatchEvent(new Event('input', { bubbles: true }));\n } catch (error) {\n console.error('Error loading markdown-actions:', error);\n }\n }\n\n /**\n * Update toolbar button states based on current selection\n */\n async updateButtonStates() {\n const textarea = this.editor.textarea;\n if (!textarea) return;\n\n try {\n const activeFormats = markdownActions.getActiveFormats(textarea);\n\n // Update button states\n Object.entries(this.buttons).forEach(([name, button]) => {\n let isActive = false;\n \n switch (name) {\n case 'bold':\n isActive = activeFormats.includes('bold');\n break;\n case 'italic':\n isActive = activeFormats.includes('italic');\n break;\n case 'code':\n // Disabled: code detection is unreliable in code blocks\n // isActive = activeFormats.includes('code');\n isActive = false;\n break;\n case 'bulletList':\n isActive = activeFormats.includes('bullet-list');\n break;\n case 'orderedList':\n isActive = activeFormats.includes('numbered-list');\n break;\n case 'quote':\n isActive = activeFormats.includes('quote');\n break;\n case 'taskList':\n isActive = activeFormats.includes('task-list');\n break;\n case 'h1':\n isActive = activeFormats.includes('header');\n break;\n case 'h2':\n isActive = activeFormats.includes('header-2');\n break;\n case 'h3':\n isActive = activeFormats.includes('header-3');\n break;\n case 'togglePlain':\n // Button is active when in overlay mode (not plain mode)\n isActive = !this.editor.container.classList.contains('plain-mode');\n break;\n }\n\n button.classList.toggle('active', isActive);\n button.setAttribute('aria-pressed', isActive.toString());\n });\n } catch (error) {\n // Silently fail if markdown-actions not available\n }\n }\n\n /**\n * Toggle view mode dropdown menu\n */\n toggleViewDropdown(button) {\n // Close any existing dropdown\n const existingDropdown = document.querySelector('.overtype-dropdown-menu');\n if (existingDropdown) {\n existingDropdown.remove();\n button.classList.remove('dropdown-active');\n document.removeEventListener('click', this.handleDocumentClick);\n return;\n }\n\n // Create dropdown menu\n const dropdown = this.createViewDropdown();\n \n // Position dropdown relative to button\n const rect = button.getBoundingClientRect();\n dropdown.style.top = `${rect.bottom + 4}px`;\n dropdown.style.left = `${rect.left}px`;\n \n // Append to body instead of button\n document.body.appendChild(dropdown);\n button.classList.add('dropdown-active');\n \n // Store reference for document click handler\n this.handleDocumentClick = (e) => {\n if (!button.contains(e.target) && !dropdown.contains(e.target)) {\n dropdown.remove();\n button.classList.remove('dropdown-active');\n document.removeEventListener('click', this.handleDocumentClick);\n }\n };\n \n // Close on click outside\n setTimeout(() => {\n document.addEventListener('click', this.handleDocumentClick);\n }, 0);\n }\n\n /**\n * Create view mode dropdown menu\n */\n createViewDropdown() {\n const dropdown = document.createElement('div');\n dropdown.className = 'overtype-dropdown-menu';\n \n // Determine current mode\n const isPlain = this.editor.container.classList.contains('plain-mode');\n const isPreview = this.editor.container.classList.contains('preview-mode');\n const currentMode = isPreview ? 'preview' : (isPlain ? 'plain' : 'normal');\n \n // Create menu items\n const modes = [\n { id: 'normal', label: 'Normal Edit', icon: '\u2713' },\n { id: 'plain', label: 'Plain Textarea', icon: '\u2713' },\n { id: 'preview', label: 'Preview Mode', icon: '\u2713' }\n ];\n \n modes.forEach(mode => {\n const item = document.createElement('button');\n item.className = 'overtype-dropdown-item';\n item.type = 'button';\n \n const check = document.createElement('span');\n check.className = 'overtype-dropdown-check';\n check.textContent = currentMode === mode.id ? mode.icon : '';\n \n const label = document.createElement('span');\n label.textContent = mode.label;\n \n item.appendChild(check);\n item.appendChild(label);\n \n if (currentMode === mode.id) {\n item.classList.add('active');\n }\n \n item.addEventListener('click', (e) => {\n e.stopPropagation();\n this.setViewMode(mode.id);\n dropdown.remove();\n this.viewModeButton.classList.remove('dropdown-active');\n document.removeEventListener('click', this.handleDocumentClick);\n });\n \n dropdown.appendChild(item);\n });\n \n return dropdown;\n }\n\n /**\n * Set view mode\n */\n setViewMode(mode) {\n // Clear all mode classes\n this.editor.container.classList.remove('plain-mode', 'preview-mode');\n \n switch(mode) {\n case 'plain':\n this.editor.showPlainTextarea(true);\n break;\n case 'preview':\n this.editor.showPreviewMode(true);\n break;\n case 'normal':\n default:\n // Normal edit mode\n this.editor.showPlainTextarea(false);\n if (typeof this.editor.showPreviewMode === 'function') {\n this.editor.showPreviewMode(false);\n }\n break;\n }\n }\n\n /**\n * Destroy toolbar\n */\n destroy() {\n if (this.container) {\n // Clean up event listeners\n if (this.handleDocumentClick) {\n document.removeEventListener('click', this.handleDocumentClick);\n }\n this.container.remove();\n this.container = null;\n this.buttons = {};\n }\n }\n}", "/**\n * Link Tooltip - CSS Anchor Positioning with index-based anchors\n * Shows a clickable tooltip when cursor is within a link\n * Uses CSS anchor positioning with dynamically selected anchor\n */\n\nexport class LinkTooltip {\n constructor(editor) {\n this.editor = editor;\n this.tooltip = null;\n this.currentLink = null;\n this.hideTimeout = null;\n \n this.init();\n }\n \n init() {\n // Check for CSS anchor positioning support\n const supportsAnchor = \n CSS.supports('position-anchor: --x') &&\n CSS.supports('position-area: center');\n \n if (!supportsAnchor) {\n // Don't show anything if not supported\n return;\n }\n \n // Create tooltip element\n this.createTooltip();\n \n // Listen for cursor position changes\n this.editor.textarea.addEventListener('selectionchange', () => this.checkCursorPosition());\n this.editor.textarea.addEventListener('keyup', (e) => {\n if (e.key.includes('Arrow') || e.key === 'Home' || e.key === 'End') {\n this.checkCursorPosition();\n }\n });\n \n // Hide tooltip when typing or scrolling\n this.editor.textarea.addEventListener('input', () => this.hide());\n this.editor.textarea.addEventListener('scroll', () => this.hide());\n \n // Keep tooltip visible on hover\n this.tooltip.addEventListener('mouseenter', () => this.cancelHide());\n this.tooltip.addEventListener('mouseleave', () => this.scheduleHide());\n }\n \n createTooltip() {\n // Create tooltip element\n this.tooltip = document.createElement('div');\n this.tooltip.className = 'overtype-link-tooltip';\n \n // Add CSS anchor positioning styles\n const tooltipStyles = document.createElement('style');\n tooltipStyles.textContent = `\n @supports (position-anchor: --x) and (position-area: center) {\n .overtype-link-tooltip {\n position: absolute;\n position-anchor: var(--target-anchor, --link-0);\n position-area: block-end center;\n margin-top: 8px;\n \n background: #333;\n color: white;\n padding: 6px 10px;\n border-radius: 16px;\n font-size: 12px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n display: none;\n z-index: 10000;\n cursor: pointer;\n box-shadow: 0 2px 8px rgba(0,0,0,0.3);\n max-width: 300px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n \n position-try: most-width block-end inline-end, flip-inline, block-start center;\n position-visibility: anchors-visible;\n }\n \n .overtype-link-tooltip.visible {\n display: flex;\n }\n }\n `;\n document.head.appendChild(tooltipStyles);\n \n // Add link icon and text container\n this.tooltip.innerHTML = `\n <span style=\"display: flex; align-items: center; gap: 6px;\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 20 20\" fill=\"currentColor\" style=\"flex-shrink: 0;\">\n <path d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"></path>\n <path d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"></path>\n </svg>\n <span class=\"overtype-link-tooltip-url\"></span>\n </span>\n `;\n \n // Click handler to open link\n this.tooltip.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (this.currentLink) {\n window.open(this.currentLink.url, '_blank');\n this.hide();\n }\n });\n \n // Append tooltip to editor container\n this.editor.container.appendChild(this.tooltip);\n }\n \n checkCursorPosition() {\n const cursorPos = this.editor.textarea.selectionStart;\n const text = this.editor.textarea.value;\n \n // Find if cursor is within a markdown link\n const linkInfo = this.findLinkAtPosition(text, cursorPos);\n \n if (linkInfo) {\n if (!this.currentLink || this.currentLink.url !== linkInfo.url || this.currentLink.index !== linkInfo.index) {\n this.show(linkInfo);\n }\n } else {\n this.scheduleHide();\n }\n }\n \n findLinkAtPosition(text, position) {\n // Regex to find markdown links: [text](url)\n const linkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n let match;\n let linkIndex = 0;\n \n while ((match = linkRegex.exec(text)) !== null) {\n const start = match.index;\n const end = match.index + match[0].length;\n \n if (position >= start && position <= end) {\n return {\n text: match[1],\n url: match[2],\n index: linkIndex,\n start: start,\n end: end\n };\n }\n linkIndex++;\n }\n \n return null;\n }\n \n show(linkInfo) {\n this.currentLink = linkInfo;\n this.cancelHide();\n \n // Update tooltip content\n const urlSpan = this.tooltip.querySelector('.overtype-link-tooltip-url');\n urlSpan.textContent = linkInfo.url;\n \n // Set the CSS variable to point to the correct anchor\n this.tooltip.style.setProperty('--target-anchor', `--link-${linkInfo.index}`);\n \n // Show tooltip (CSS anchor positioning handles the rest)\n this.tooltip.classList.add('visible');\n }\n \n hide() {\n this.tooltip.classList.remove('visible');\n this.currentLink = null;\n }\n \n scheduleHide() {\n this.cancelHide();\n this.hideTimeout = setTimeout(() => this.hide(), 300);\n }\n \n cancelHide() {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n }\n \n destroy() {\n this.cancelHide();\n if (this.tooltip && this.tooltip.parentNode) {\n this.tooltip.parentNode.removeChild(this.tooltip);\n }\n this.tooltip = null;\n this.currentLink = null;\n }\n}"],
5
- "mappings": "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A;AAAA,6CAEc,QAAQ;AAAA,iDACJ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCASlB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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",
4
+ "sourcesContent": ["/**\n * OverType - A lightweight markdown editor library with perfect WYSIWYG alignment\n * @version 1.0.0\n * @license MIT\n */\n\nimport { MarkdownParser } from './parser.js';\nimport { ShortcutsManager } from './shortcuts.js';\nimport { generateStyles } from './styles.js';\nimport { getTheme, mergeTheme, solar, themeToCSSVars } from './themes.js';\nimport { Toolbar } from './toolbar.js';\nimport { LinkTooltip } from './link-tooltip.js';\n\n/**\n * OverType Editor Class\n */\nclass OverType {\n // Static properties\n static instances = new WeakMap();\n static stylesInjected = false;\n static globalListenersInitialized = false;\n static instanceCount = 0;\n\n /**\n * Constructor - Always returns an array of instances\n * @param {string|Element|NodeList|Array} target - Target element(s)\n * @param {Object} options - Configuration options\n * @returns {Array} Array of OverType instances\n */\n constructor(target, options = {}) {\n // Convert target to array of elements\n let elements;\n \n if (typeof target === 'string') {\n elements = document.querySelectorAll(target);\n if (elements.length === 0) {\n throw new Error(`No elements found for selector: ${target}`);\n }\n elements = Array.from(elements);\n } else if (target instanceof Element) {\n elements = [target];\n } else if (target instanceof NodeList) {\n elements = Array.from(target);\n } else if (Array.isArray(target)) {\n elements = target;\n } else {\n throw new Error('Invalid target: must be selector string, Element, NodeList, or Array');\n }\n\n // Initialize all elements and return array\n const instances = elements.map(element => {\n // Check for existing instance\n if (element.overTypeInstance) {\n // Re-init existing instance\n element.overTypeInstance.reinit(options);\n return element.overTypeInstance;\n }\n\n // Create new instance\n const instance = Object.create(OverType.prototype);\n instance._init(element, options);\n element.overTypeInstance = instance;\n OverType.instances.set(element, instance);\n return instance;\n });\n\n return instances;\n }\n\n /**\n * Internal initialization\n * @private\n */\n _init(element, options = {}) {\n this.element = element;\n \n // Store the original theme option before merging\n this.instanceTheme = options.theme || null;\n \n this.options = this._mergeOptions(options);\n this.instanceId = ++OverType.instanceCount;\n this.initialized = false;\n\n // Inject styles if needed\n OverType.injectStyles();\n\n // Initialize global listeners\n OverType.initGlobalListeners();\n\n // Check for existing OverType DOM structure\n const container = element.querySelector('.overtype-container');\n const wrapper = element.querySelector('.overtype-wrapper');\n if (container || wrapper) {\n this._recoverFromDOM(container, wrapper);\n } else {\n this._buildFromScratch();\n }\n\n // Setup shortcuts manager\n this.shortcuts = new ShortcutsManager(this);\n \n // Setup link tooltip\n this.linkTooltip = new LinkTooltip(this);\n\n // Setup toolbar if enabled\n if (this.options.toolbar) {\n this.toolbar = new Toolbar(this);\n this.toolbar.create();\n \n // Update toolbar states on selection change\n this.textarea.addEventListener('selectionchange', () => {\n this.toolbar.updateButtonStates();\n });\n this.textarea.addEventListener('input', () => {\n this.toolbar.updateButtonStates();\n });\n }\n\n // Mark as initialized\n this.initialized = true;\n\n // Call onChange if provided\n if (this.options.onChange) {\n this.options.onChange(this.getValue(), this);\n }\n }\n\n /**\n * Merge user options with defaults\n * @private\n */\n _mergeOptions(options) {\n const defaults = {\n // Typography\n fontSize: '14px',\n lineHeight: 1.6,\n /* System-first, guaranteed monospaced; avoids Android 'ui-monospace' pitfalls */\n fontFamily: '\"SF Mono\", SFMono-Regular, Menlo, Monaco, \"Cascadia Code\", Consolas, \"Roboto Mono\", \"Noto Sans Mono\", \"Droid Sans Mono\", \"Ubuntu Mono\", \"DejaVu Sans Mono\", \"Liberation Mono\", \"Courier New\", Courier, monospace',\n padding: '16px',\n \n // Mobile styles\n mobile: {\n fontSize: '16px', // Prevent zoom on iOS\n padding: '12px',\n lineHeight: 1.5\n },\n \n // Native textarea properties\n textareaProps: {},\n \n // Behavior\n autofocus: false,\n autoResize: false, // Auto-expand height with content\n minHeight: '100px', // Minimum height for autoResize mode\n maxHeight: null, // Maximum height for autoResize mode (null = unlimited)\n placeholder: 'Start typing...',\n value: '',\n \n // Callbacks\n onChange: null,\n onKeydown: null,\n \n // Features\n showActiveLineRaw: false,\n showStats: false,\n toolbar: false,\n statsFormatter: null,\n smartLists: true // Enable smart list continuation\n };\n \n // Remove theme and colors from options - these are now global\n const { theme, colors, ...cleanOptions } = options;\n \n return {\n ...defaults,\n ...cleanOptions\n };\n }\n\n /**\n * Recover from existing DOM structure\n * @private\n */\n _recoverFromDOM(container, wrapper) {\n // Handle old structure (wrapper only) or new structure (container + wrapper)\n if (container && container.classList.contains('overtype-container')) {\n this.container = container;\n this.wrapper = container.querySelector('.overtype-wrapper');\n } else if (wrapper) {\n // Old structure - just wrapper, no container\n this.wrapper = wrapper;\n // Wrap it in a container for consistency\n this.container = document.createElement('div');\n this.container.className = 'overtype-container';\n // Use instance theme if provided, otherwise use global theme\n const themeToUse = this.instanceTheme || OverType.currentTheme || solar;\n const themeName = typeof themeToUse === 'string' ? themeToUse : themeToUse.name;\n if (themeName) {\n this.container.setAttribute('data-theme', themeName);\n }\n \n // If using instance theme, apply CSS variables to container\n if (this.instanceTheme) {\n const themeObj = typeof this.instanceTheme === 'string' ? getTheme(this.instanceTheme) : this.instanceTheme;\n if (themeObj && themeObj.colors) {\n const cssVars = themeToCSSVars(themeObj.colors);\n this.container.style.cssText += cssVars;\n }\n }\n wrapper.parentNode.insertBefore(this.container, wrapper);\n this.container.appendChild(wrapper);\n }\n \n if (!this.wrapper) {\n // No valid structure found\n if (container) container.remove();\n if (wrapper) wrapper.remove();\n this._buildFromScratch();\n return;\n }\n \n this.textarea = this.wrapper.querySelector('.overtype-input');\n this.preview = this.wrapper.querySelector('.overtype-preview');\n\n if (!this.textarea || !this.preview) {\n // Partial DOM - clear and rebuild\n this.container.remove();\n this._buildFromScratch();\n return;\n }\n\n // Store reference on wrapper\n this.wrapper._instance = this;\n \n // Apply instance-specific styles via CSS custom properties\n if (this.options.fontSize) {\n this.wrapper.style.setProperty('--instance-font-size', this.options.fontSize);\n }\n if (this.options.lineHeight) {\n this.wrapper.style.setProperty('--instance-line-height', String(this.options.lineHeight));\n }\n if (this.options.padding) {\n this.wrapper.style.setProperty('--instance-padding', this.options.padding);\n }\n\n // Disable autofill, spellcheck, and extensions\n this._configureTextarea();\n\n // Apply any new options\n this._applyOptions();\n }\n\n /**\n * Build editor from scratch\n * @private\n */\n _buildFromScratch() {\n // Extract any existing content\n const content = this._extractContent();\n\n // Clear element\n this.element.innerHTML = '';\n\n // Create DOM structure\n this._createDOM();\n\n // Set initial content\n if (content || this.options.value) {\n this.setValue(content || this.options.value);\n }\n\n // Apply options\n this._applyOptions();\n }\n\n /**\n * Extract content from element\n * @private\n */\n _extractContent() {\n // Look for existing OverType textarea\n const textarea = this.element.querySelector('.overtype-input');\n if (textarea) return textarea.value;\n\n // Use element's text content as fallback\n return this.element.textContent || '';\n }\n\n /**\n * Create DOM structure\n * @private\n */\n _createDOM() {\n // Create container that will hold toolbar and editor\n this.container = document.createElement('div');\n this.container.className = 'overtype-container';\n \n // Set theme on container - use instance theme if provided\n const themeToUse = this.instanceTheme || OverType.currentTheme || solar;\n const themeName = typeof themeToUse === 'string' ? themeToUse : themeToUse.name;\n if (themeName) {\n this.container.setAttribute('data-theme', themeName);\n }\n \n // If using instance theme, apply CSS variables to container\n if (this.instanceTheme) {\n const themeObj = typeof this.instanceTheme === 'string' ? getTheme(this.instanceTheme) : this.instanceTheme;\n if (themeObj && themeObj.colors) {\n const cssVars = themeToCSSVars(themeObj.colors);\n this.container.style.cssText += cssVars;\n }\n }\n \n // Create wrapper for editor\n this.wrapper = document.createElement('div');\n this.wrapper.className = 'overtype-wrapper';\n \n \n // Apply instance-specific styles via CSS custom properties\n if (this.options.fontSize) {\n this.wrapper.style.setProperty('--instance-font-size', this.options.fontSize);\n }\n if (this.options.lineHeight) {\n this.wrapper.style.setProperty('--instance-line-height', String(this.options.lineHeight));\n }\n if (this.options.padding) {\n this.wrapper.style.setProperty('--instance-padding', this.options.padding);\n }\n \n this.wrapper._instance = this;\n\n // Create textarea\n this.textarea = document.createElement('textarea');\n this.textarea.className = 'overtype-input';\n this.textarea.placeholder = this.options.placeholder;\n this._configureTextarea();\n \n // Apply any native textarea properties\n if (this.options.textareaProps) {\n Object.entries(this.options.textareaProps).forEach(([key, value]) => {\n if (key === 'className' || key === 'class') {\n this.textarea.className += ' ' + value;\n } else if (key === 'style' && typeof value === 'object') {\n Object.assign(this.textarea.style, value);\n } else {\n this.textarea.setAttribute(key, value);\n }\n });\n }\n\n // Create preview div\n this.preview = document.createElement('div');\n this.preview.className = 'overtype-preview';\n this.preview.setAttribute('aria-hidden', 'true');\n\n // Assemble DOM\n this.wrapper.appendChild(this.textarea);\n this.wrapper.appendChild(this.preview);\n \n // No need to prevent link clicks - pointer-events handles this\n \n // Add wrapper to container first\n this.container.appendChild(this.wrapper);\n \n // Add stats bar at the end (bottom) if enabled\n if (this.options.showStats) {\n this.statsBar = document.createElement('div');\n this.statsBar.className = 'overtype-stats';\n this.container.appendChild(this.statsBar);\n this._updateStats();\n }\n \n // Add container to element\n this.element.appendChild(this.container);\n \n // Debug logging\n if (window.location.pathname.includes('demo.html')) {\n console.log('_createDOM completed:', {\n elementId: this.element.id,\n autoResize: this.options.autoResize,\n containerClasses: this.container.className,\n hasStats: !!this.statsBar,\n hasToolbar: this.options.toolbar\n });\n }\n \n // Setup auto-resize if enabled\n if (this.options.autoResize) {\n this._setupAutoResize();\n } else {\n // Ensure auto-resize class is removed if not using auto-resize\n this.container.classList.remove('overtype-auto-resize');\n \n if (window.location.pathname.includes('demo.html')) {\n console.log('Removed auto-resize class from:', this.element.id);\n }\n }\n }\n\n /**\n * Configure textarea attributes\n * @private\n */\n _configureTextarea() {\n this.textarea.setAttribute('autocomplete', 'off');\n this.textarea.setAttribute('autocorrect', 'off');\n this.textarea.setAttribute('autocapitalize', 'off');\n this.textarea.setAttribute('spellcheck', 'false');\n this.textarea.setAttribute('data-gramm', 'false');\n this.textarea.setAttribute('data-gramm_editor', 'false');\n this.textarea.setAttribute('data-enable-grammarly', 'false');\n }\n\n /**\n * Apply options to the editor\n * @private\n */\n _applyOptions() {\n // Apply autofocus\n if (this.options.autofocus) {\n this.textarea.focus();\n }\n \n // Setup or remove auto-resize\n if (this.options.autoResize) {\n if (!this.container.classList.contains('overtype-auto-resize')) {\n this._setupAutoResize();\n }\n } else {\n // Ensure auto-resize class is removed\n this.container.classList.remove('overtype-auto-resize');\n }\n\n // Update preview with initial content\n this.updatePreview();\n }\n\n /**\n * Update preview with parsed markdown\n */\n updatePreview() {\n const text = this.textarea.value;\n const cursorPos = this.textarea.selectionStart;\n const activeLine = this._getCurrentLine(text, cursorPos);\n \n // Parse markdown\n const html = MarkdownParser.parse(text, activeLine, this.options.showActiveLineRaw);\n this.preview.innerHTML = html || '<span style=\"color: #808080;\">Start typing...</span>';\n \n // Apply code block backgrounds\n this._applyCodeBlockBackgrounds();\n \n // Links always have real hrefs now - no need to update them\n \n // Update stats if enabled\n if (this.options.showStats && this.statsBar) {\n this._updateStats();\n }\n \n // Trigger onChange callback\n if (this.options.onChange && this.initialized) {\n this.options.onChange(text, this);\n }\n }\n\n /**\n * Apply background styling to code blocks\n * @private\n */\n _applyCodeBlockBackgrounds() {\n // Find all code fence elements\n const codeFences = this.preview.querySelectorAll('.code-fence');\n \n // Process pairs of code fences\n for (let i = 0; i < codeFences.length - 1; i += 2) {\n const openFence = codeFences[i];\n const closeFence = codeFences[i + 1];\n \n // Get parent divs\n const openParent = openFence.parentElement;\n const closeParent = closeFence.parentElement;\n \n if (!openParent || !closeParent) continue;\n \n // Make fences display: block\n openFence.style.display = 'block';\n closeFence.style.display = 'block';\n \n // Apply class to parent divs\n openParent.classList.add('code-block-line');\n closeParent.classList.add('code-block-line');\n \n // With the new structure, there's a <pre> block between fences, not DIVs\n // We don't need to process anything between the fences anymore\n // The <pre><code> structure already handles the content correctly\n }\n }\n\n /**\n * Get current line number from cursor position\n * @private\n */\n _getCurrentLine(text, cursorPos) {\n const lines = text.substring(0, cursorPos).split('\\n');\n return lines.length - 1;\n }\n\n /**\n * Handle input events\n * @private\n */\n handleInput(event) {\n this.updatePreview();\n }\n\n /**\n * Handle keydown events\n * @private\n */\n handleKeydown(event) {\n // Handle Tab key to prevent focus loss and insert spaces\n if (event.key === 'Tab') {\n event.preventDefault();\n \n const start = this.textarea.selectionStart;\n const end = this.textarea.selectionEnd;\n const value = this.textarea.value;\n \n // If there's a selection, indent/outdent based on shift key\n if (start !== end && event.shiftKey) {\n // Outdent: remove 2 spaces from start of each selected line\n const before = value.substring(0, start);\n const selection = value.substring(start, end);\n const after = value.substring(end);\n \n const lines = selection.split('\\n');\n const outdented = lines.map(line => line.replace(/^ /, '')).join('\\n');\n \n // Try to use execCommand first to preserve undo history\n if (document.execCommand) {\n // Select the text that needs to be replaced\n this.textarea.setSelectionRange(start, end);\n document.execCommand('insertText', false, outdented);\n } else {\n // Fallback to direct manipulation\n this.textarea.value = before + outdented + after;\n this.textarea.selectionStart = start;\n this.textarea.selectionEnd = start + outdented.length;\n }\n } else if (start !== end) {\n // Indent: add 2 spaces to start of each selected line\n const before = value.substring(0, start);\n const selection = value.substring(start, end);\n const after = value.substring(end);\n \n const lines = selection.split('\\n');\n const indented = lines.map(line => ' ' + line).join('\\n');\n \n // Try to use execCommand first to preserve undo history\n if (document.execCommand) {\n // Select the text that needs to be replaced\n this.textarea.setSelectionRange(start, end);\n document.execCommand('insertText', false, indented);\n } else {\n // Fallback to direct manipulation\n this.textarea.value = before + indented + after;\n this.textarea.selectionStart = start;\n this.textarea.selectionEnd = start + indented.length;\n }\n } else {\n // No selection: just insert 2 spaces\n // Use execCommand to preserve undo history\n if (document.execCommand) {\n document.execCommand('insertText', false, ' ');\n } else {\n // Fallback to direct manipulation\n this.textarea.value = value.substring(0, start) + ' ' + value.substring(end);\n this.textarea.selectionStart = this.textarea.selectionEnd = start + 2;\n }\n }\n \n // Trigger input event to update preview\n this.textarea.dispatchEvent(new Event('input', { bubbles: true }));\n return;\n }\n \n // Handle Enter key for smart list continuation\n if (event.key === 'Enter' && !event.shiftKey && !event.metaKey && !event.ctrlKey && this.options.smartLists) {\n if (this.handleSmartListContinuation()) {\n event.preventDefault();\n return;\n }\n }\n \n // Let shortcuts manager handle other keys\n const handled = this.shortcuts.handleKeydown(event);\n \n // Call user callback if provided\n if (!handled && this.options.onKeydown) {\n this.options.onKeydown(event, this);\n }\n }\n\n /**\n * Handle smart list continuation\n * @returns {boolean} Whether the event was handled\n */\n handleSmartListContinuation() {\n const textarea = this.textarea;\n const cursorPos = textarea.selectionStart;\n const context = MarkdownParser.getListContext(textarea.value, cursorPos);\n \n if (!context || !context.inList) return false;\n \n // Handle empty list item (exit list)\n if (context.content.trim() === '' && cursorPos >= context.markerEndPos) {\n this.deleteListMarker(context);\n return true;\n }\n \n // Handle text splitting if cursor is in middle of content\n if (cursorPos > context.markerEndPos && cursorPos < context.lineEnd) {\n this.splitListItem(context, cursorPos);\n } else {\n // Just add new item after current line\n this.insertNewListItem(context);\n }\n \n // Handle numbered list renumbering\n if (context.listType === 'numbered') {\n this.scheduleNumberedListUpdate();\n }\n \n return true;\n }\n \n /**\n * Delete list marker and exit list\n * @private\n */\n deleteListMarker(context) {\n // Select from line start to marker end\n this.textarea.setSelectionRange(context.lineStart, context.markerEndPos);\n document.execCommand('delete');\n \n // Trigger input event\n this.textarea.dispatchEvent(new Event('input', { bubbles: true }));\n }\n \n /**\n * Insert new list item\n * @private\n */\n insertNewListItem(context) {\n const newItem = MarkdownParser.createNewListItem(context);\n document.execCommand('insertText', false, '\\n' + newItem);\n \n // Trigger input event\n this.textarea.dispatchEvent(new Event('input', { bubbles: true }));\n }\n \n /**\n * Split list item at cursor position\n * @private\n */\n splitListItem(context, cursorPos) {\n // Get text after cursor\n const textAfterCursor = context.content.substring(cursorPos - context.markerEndPos);\n \n // Delete text after cursor\n this.textarea.setSelectionRange(cursorPos, context.lineEnd);\n document.execCommand('delete');\n \n // Insert new list item with remaining text\n const newItem = MarkdownParser.createNewListItem(context);\n document.execCommand('insertText', false, '\\n' + newItem + textAfterCursor);\n \n // Position cursor after new list marker\n const newCursorPos = this.textarea.selectionStart - textAfterCursor.length;\n this.textarea.setSelectionRange(newCursorPos, newCursorPos);\n \n // Trigger input event\n this.textarea.dispatchEvent(new Event('input', { bubbles: true }));\n }\n \n /**\n * Schedule numbered list renumbering\n * @private\n */\n scheduleNumberedListUpdate() {\n // Clear any pending update\n if (this.numberUpdateTimeout) {\n clearTimeout(this.numberUpdateTimeout);\n }\n \n // Schedule update after current input cycle\n this.numberUpdateTimeout = setTimeout(() => {\n this.updateNumberedLists();\n }, 10);\n }\n \n /**\n * Update/renumber all numbered lists\n * @private\n */\n updateNumberedLists() {\n const value = this.textarea.value;\n const cursorPos = this.textarea.selectionStart;\n \n const newValue = MarkdownParser.renumberLists(value);\n \n if (newValue !== value) {\n // Calculate cursor offset\n let offset = 0;\n const oldLines = value.split('\\n');\n const newLines = newValue.split('\\n');\n let charCount = 0;\n \n for (let i = 0; i < oldLines.length && charCount < cursorPos; i++) {\n if (oldLines[i] !== newLines[i]) {\n const diff = newLines[i].length - oldLines[i].length;\n if (charCount + oldLines[i].length < cursorPos) {\n offset += diff;\n }\n }\n charCount += oldLines[i].length + 1; // +1 for newline\n }\n \n // Update textarea\n this.textarea.value = newValue;\n const newCursorPos = cursorPos + offset;\n this.textarea.setSelectionRange(newCursorPos, newCursorPos);\n \n // Trigger update\n this.textarea.dispatchEvent(new Event('input', { bubbles: true }));\n }\n }\n\n /**\n * Handle scroll events\n * @private\n */\n handleScroll(event) {\n // Sync preview scroll with textarea\n this.preview.scrollTop = this.textarea.scrollTop;\n this.preview.scrollLeft = this.textarea.scrollLeft;\n }\n\n /**\n * Get editor content\n * @returns {string} Current markdown content\n */\n getValue() {\n return this.textarea.value;\n }\n\n /**\n * Set editor content\n * @param {string} value - Markdown content to set\n */\n setValue(value) {\n this.textarea.value = value;\n this.updatePreview();\n \n // Update height if auto-resize is enabled\n if (this.options.autoResize) {\n this._updateAutoHeight();\n }\n }\n\n\n /**\n * Get the rendered HTML of the current content\n * @param {boolean} processForPreview - If true, post-processes HTML for preview mode (consolidates lists/code blocks)\n * @returns {string} Rendered HTML\n */\n getRenderedHTML(processForPreview = false) {\n const markdown = this.getValue();\n let html = MarkdownParser.parse(markdown);\n \n if (processForPreview) {\n // Post-process HTML for preview mode\n html = MarkdownParser.postProcessHTML(html);\n }\n \n return html;\n }\n\n /**\n * Get the current preview element's HTML\n * @returns {string} Current preview HTML (as displayed)\n */\n getPreviewHTML() {\n return this.preview.innerHTML;\n }\n\n /**\n * Focus the editor\n */\n focus() {\n this.textarea.focus();\n }\n\n /**\n * Blur the editor\n */\n blur() {\n this.textarea.blur();\n }\n\n /**\n * Check if editor is initialized\n * @returns {boolean}\n */\n isInitialized() {\n return this.initialized;\n }\n\n /**\n * Re-initialize with new options\n * @param {Object} options - New options to apply\n */\n reinit(options = {}) {\n this.options = this._mergeOptions({ ...this.options, ...options });\n this._applyOptions();\n this.updatePreview();\n }\n\n /**\n * Update stats bar\n * @private\n */\n _updateStats() {\n if (!this.statsBar) return;\n \n const value = this.textarea.value;\n const lines = value.split('\\n');\n const chars = value.length;\n const words = value.split(/\\s+/).filter(w => w.length > 0).length;\n \n // Calculate line and column\n const selectionStart = this.textarea.selectionStart;\n const beforeCursor = value.substring(0, selectionStart);\n const linesBeforeCursor = beforeCursor.split('\\n');\n const currentLine = linesBeforeCursor.length;\n const currentColumn = linesBeforeCursor[linesBeforeCursor.length - 1].length + 1;\n \n // Use custom formatter if provided\n if (this.options.statsFormatter) {\n this.statsBar.innerHTML = this.options.statsFormatter({\n chars,\n words,\n lines: lines.length,\n line: currentLine,\n column: currentColumn\n });\n } else {\n // Default format with live dot\n this.statsBar.innerHTML = `\n <div class=\"overtype-stat\">\n <span class=\"live-dot\"></span>\n <span>${chars} chars, ${words} words, ${lines.length} lines</span>\n </div>\n <div class=\"overtype-stat\">Line ${currentLine}, Col ${currentColumn}</div>\n `;\n }\n }\n \n /**\n * Setup auto-resize functionality\n * @private\n */\n _setupAutoResize() {\n // Add auto-resize class for styling\n this.container.classList.add('overtype-auto-resize');\n \n // Store previous height for comparison\n this.previousHeight = null;\n \n // Initial height update\n this._updateAutoHeight();\n \n // Listen for input events\n this.textarea.addEventListener('input', () => this._updateAutoHeight());\n \n // Listen for window resize\n window.addEventListener('resize', () => this._updateAutoHeight());\n }\n \n /**\n * Update height based on scrollHeight\n * @private\n */\n _updateAutoHeight() {\n if (!this.options.autoResize) return;\n \n const textarea = this.textarea;\n const preview = this.preview;\n const wrapper = this.wrapper;\n \n // Get computed styles\n const computed = window.getComputedStyle(textarea);\n const paddingTop = parseFloat(computed.paddingTop);\n const paddingBottom = parseFloat(computed.paddingBottom);\n \n // Store scroll positions\n const scrollTop = textarea.scrollTop;\n \n // Reset height to get accurate scrollHeight\n textarea.style.setProperty('height', 'auto', 'important');\n \n // Calculate new height based on scrollHeight\n let newHeight = textarea.scrollHeight;\n \n // Apply min height constraint\n if (this.options.minHeight) {\n const minHeight = parseInt(this.options.minHeight);\n newHeight = Math.max(newHeight, minHeight);\n }\n \n // Apply max height constraint\n let overflow = 'hidden';\n if (this.options.maxHeight) {\n const maxHeight = parseInt(this.options.maxHeight);\n if (newHeight > maxHeight) {\n newHeight = maxHeight;\n overflow = 'auto';\n }\n }\n \n // Apply the new height to all elements with !important to override base styles\n const heightPx = newHeight + 'px';\n textarea.style.setProperty('height', heightPx, 'important');\n textarea.style.setProperty('overflow-y', overflow, 'important');\n \n preview.style.setProperty('height', heightPx, 'important');\n preview.style.setProperty('overflow-y', overflow, 'important');\n \n wrapper.style.setProperty('height', heightPx, 'important');\n \n // Restore scroll position\n textarea.scrollTop = scrollTop;\n preview.scrollTop = scrollTop;\n \n // Track if height changed\n if (this.previousHeight !== newHeight) {\n this.previousHeight = newHeight;\n // Could dispatch a custom event here if needed\n }\n }\n \n /**\n * Show or hide stats bar\n * @param {boolean} show - Whether to show stats\n */\n showStats(show) {\n this.options.showStats = show;\n \n if (show && !this.statsBar) {\n // Create stats bar (add to container, not wrapper)\n this.statsBar = document.createElement('div');\n this.statsBar.className = 'overtype-stats';\n this.container.appendChild(this.statsBar);\n this._updateStats();\n } else if (!show && this.statsBar) {\n // Remove stats bar\n this.statsBar.remove();\n this.statsBar = null;\n }\n }\n \n /**\n * Show or hide the plain textarea (toggle overlay visibility)\n * @param {boolean} show - true to show plain textarea (hide overlay), false to show overlay\n * @returns {boolean} Current plain textarea state\n */\n showPlainTextarea(show) {\n if (show) {\n // Show plain textarea mode (hide overlay)\n this.container.classList.add('plain-mode');\n } else {\n // Show overlay mode (hide plain textarea text)\n this.container.classList.remove('plain-mode');\n }\n \n // Update toolbar button if exists\n if (this.toolbar) {\n const toggleBtn = this.container.querySelector('[data-action=\"toggle-plain\"]');\n if (toggleBtn) {\n // Button is active when showing overlay (not plain mode)\n toggleBtn.classList.toggle('active', !show);\n toggleBtn.title = show ? 'Show markdown preview' : 'Show plain textarea';\n }\n }\n \n return show;\n }\n\n /**\n * Show/hide preview mode\n * @param {boolean} show - Show preview mode if true, edit mode if false\n * @returns {boolean} Current preview mode state\n */\n showPreviewMode(show) {\n if (show) {\n // Show preview mode (hide textarea, make preview interactive)\n this.container.classList.add('preview-mode');\n } else {\n // Show edit mode\n this.container.classList.remove('preview-mode');\n }\n \n return show;\n }\n\n /**\n * Destroy the editor instance\n */\n destroy() {\n // Remove instance reference\n this.element.overTypeInstance = null;\n OverType.instances.delete(this.element);\n\n // Cleanup shortcuts\n if (this.shortcuts) {\n this.shortcuts.destroy();\n }\n\n // Remove DOM if created by us\n if (this.wrapper) {\n const content = this.getValue();\n this.wrapper.remove();\n \n // Restore original content\n this.element.textContent = content;\n }\n\n this.initialized = false;\n }\n\n // ===== Static Methods =====\n\n /**\n * Initialize multiple editors (static convenience method)\n * @param {string|Element|NodeList|Array} target - Target element(s)\n * @param {Object} options - Configuration options\n * @returns {Array} Array of OverType instances\n */\n static init(target, options = {}) {\n return new OverType(target, options);\n }\n\n /**\n * Get instance from element\n * @param {Element} element - DOM element\n * @returns {OverType|null} OverType instance or null\n */\n static getInstance(element) {\n return element.overTypeInstance || OverType.instances.get(element) || null;\n }\n\n /**\n * Destroy all instances\n */\n static destroyAll() {\n const elements = document.querySelectorAll('[data-overtype-instance]');\n elements.forEach(element => {\n const instance = OverType.getInstance(element);\n if (instance) {\n instance.destroy();\n }\n });\n }\n\n /**\n * Inject styles into the document\n * @param {boolean} force - Force re-injection\n */\n static injectStyles(force = false) {\n if (OverType.stylesInjected && !force) return;\n\n // Remove any existing OverType styles\n const existing = document.querySelector('style.overtype-styles');\n if (existing) {\n existing.remove();\n }\n\n // Generate and inject new styles with current theme\n const theme = OverType.currentTheme || solar;\n const styles = generateStyles({ theme });\n const styleEl = document.createElement('style');\n styleEl.className = 'overtype-styles';\n styleEl.textContent = styles;\n document.head.appendChild(styleEl);\n\n OverType.stylesInjected = true;\n }\n \n /**\n * Set global theme for all OverType instances\n * @param {string|Object} theme - Theme name or custom theme object\n * @param {Object} customColors - Optional color overrides\n */\n static setTheme(theme, customColors = null) {\n // Process theme\n let themeObj = typeof theme === 'string' ? getTheme(theme) : theme;\n \n // Apply custom colors if provided\n if (customColors) {\n themeObj = mergeTheme(themeObj, customColors);\n }\n \n // Store as current theme\n OverType.currentTheme = themeObj;\n \n // Re-inject styles with new theme\n OverType.injectStyles(true);\n \n // Update all existing instances - update container theme attribute\n document.querySelectorAll('.overtype-container').forEach(container => {\n const themeName = typeof themeObj === 'string' ? themeObj : themeObj.name;\n if (themeName) {\n container.setAttribute('data-theme', themeName);\n }\n });\n \n // Also handle any old-style wrappers without containers\n document.querySelectorAll('.overtype-wrapper').forEach(wrapper => {\n if (!wrapper.closest('.overtype-container')) {\n const themeName = typeof themeObj === 'string' ? themeObj : themeObj.name;\n if (themeName) {\n wrapper.setAttribute('data-theme', themeName);\n }\n }\n \n // Trigger preview update for the instance\n const instance = wrapper._instance;\n if (instance) {\n instance.updatePreview();\n }\n });\n }\n\n /**\n * Initialize global event listeners\n */\n static initGlobalListeners() {\n if (OverType.globalListenersInitialized) return;\n\n // Input event\n document.addEventListener('input', (e) => {\n if (e.target && e.target.classList && e.target.classList.contains('overtype-input')) {\n const wrapper = e.target.closest('.overtype-wrapper');\n const instance = wrapper?._instance;\n if (instance) instance.handleInput(e);\n }\n });\n\n // Keydown event\n document.addEventListener('keydown', (e) => {\n if (e.target && e.target.classList && e.target.classList.contains('overtype-input')) {\n const wrapper = e.target.closest('.overtype-wrapper');\n const instance = wrapper?._instance;\n if (instance) instance.handleKeydown(e);\n }\n });\n\n // Scroll event\n document.addEventListener('scroll', (e) => {\n if (e.target && e.target.classList && e.target.classList.contains('overtype-input')) {\n const wrapper = e.target.closest('.overtype-wrapper');\n const instance = wrapper?._instance;\n if (instance) instance.handleScroll(e);\n }\n }, true);\n\n // Selection change event\n document.addEventListener('selectionchange', (e) => {\n const activeElement = document.activeElement;\n if (activeElement && activeElement.classList.contains('overtype-input')) {\n const wrapper = activeElement.closest('.overtype-wrapper');\n const instance = wrapper?._instance;\n if (instance) {\n // Update stats bar for cursor position\n if (instance.options.showStats && instance.statsBar) {\n instance._updateStats();\n }\n // Debounce updates\n clearTimeout(instance._selectionTimeout);\n instance._selectionTimeout = setTimeout(() => {\n instance.updatePreview();\n }, 50);\n }\n }\n });\n\n OverType.globalListenersInitialized = true;\n }\n}\n\n// Export classes for advanced usage\nOverType.MarkdownParser = MarkdownParser;\nOverType.ShortcutsManager = ShortcutsManager;\n\n// Export theme utilities\nOverType.themes = { solar, cave: getTheme('cave') };\nOverType.getTheme = getTheme;\n\n// Set default theme\nOverType.currentTheme = solar;\n\n// Only attach to global in browser environments (not Node.js)\nif (typeof window !== 'undefined' && typeof window.document !== 'undefined') {\n // Browser environment - attach to window\n window.OverType = OverType;\n}\n\n// Export for module systems\nexport default OverType;\nexport { OverType };", "/**\n * MarkdownParser - Parses markdown into HTML while preserving character alignment\n * \n * Key principles:\n * - Every character must occupy the exact same position as in the textarea\n * - No font-size changes, no padding/margin on inline elements\n * - Markdown tokens remain visible but styled\n */\nexport class MarkdownParser {\n // Track link index for anchor naming\n static linkIndex = 0;\n \n /**\n * Reset link index (call before parsing a new document)\n */\n static resetLinkIndex() {\n this.linkIndex = 0;\n }\n \n /**\n * Escape HTML special characters\n * @param {string} text - Raw text to escape\n * @returns {string} Escaped HTML-safe text\n */\n static escapeHtml(text) {\n const map = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\n };\n return text.replace(/[&<>\"']/g, m => map[m]);\n }\n\n /**\n * Preserve leading spaces as non-breaking spaces\n * @param {string} html - HTML string\n * @param {string} originalLine - Original line with spaces\n * @returns {string} HTML with preserved indentation\n */\n static preserveIndentation(html, originalLine) {\n const leadingSpaces = originalLine.match(/^(\\s*)/)[1];\n const indentation = leadingSpaces.replace(/ /g, '&nbsp;');\n return html.replace(/^\\s*/, indentation);\n }\n\n /**\n * Parse headers (h1-h3 only)\n * @param {string} html - HTML line to parse\n * @returns {string} Parsed HTML with header styling\n */\n static parseHeader(html) {\n return html.replace(/^(#{1,3})\\s(.+)$/, (match, hashes, content) => {\n const level = hashes.length;\n return `<h${level}><span class=\"syntax-marker\">${hashes} </span>${content}</h${level}>`;\n });\n }\n\n /**\n * Parse horizontal rules\n * @param {string} html - HTML line to parse\n * @returns {string|null} Parsed horizontal rule or null\n */\n static parseHorizontalRule(html) {\n if (html.match(/^(-{3,}|\\*{3,}|_{3,})$/)) {\n return `<div><span class=\"hr-marker\">${html}</span></div>`;\n }\n return null;\n }\n\n /**\n * Parse blockquotes\n * @param {string} html - HTML line to parse\n * @returns {string} Parsed blockquote\n */\n static parseBlockquote(html) {\n return html.replace(/^&gt; (.+)$/, (match, content) => {\n return `<span class=\"blockquote\"><span class=\"syntax-marker\">&gt;</span> ${content}</span>`;\n });\n }\n\n /**\n * Parse bullet lists\n * @param {string} html - HTML line to parse\n * @returns {string} Parsed bullet list item\n */\n static parseBulletList(html) {\n return html.replace(/^((?:&nbsp;)*)([-*])\\s(.+)$/, (match, indent, marker, content) => {\n return `${indent}<li class=\"bullet-list\"><span class=\"syntax-marker\">${marker} </span>${content}</li>`;\n });\n }\n\n /**\n * Parse numbered lists\n * @param {string} html - HTML line to parse\n * @returns {string} Parsed numbered list item\n */\n static parseNumberedList(html) {\n return html.replace(/^((?:&nbsp;)*)(\\d+\\.)\\s(.+)$/, (match, indent, marker, content) => {\n return `${indent}<li class=\"ordered-list\"><span class=\"syntax-marker\">${marker} </span>${content}</li>`;\n });\n }\n\n /**\n * Parse code blocks (markers only)\n * @param {string} html - HTML line to parse\n * @returns {string|null} Parsed code fence or null\n */\n static parseCodeBlock(html) {\n // The line must start with three backticks and have no backticks after subsequent text\n const codeFenceRegex = /^`{3}[^`]*$/;\n if (codeFenceRegex.test(html)) {\n return `<div><span class=\"code-fence\">${html}</span></div>`;\n }\n return null;\n }\n\n /**\n * Parse bold text\n * @param {string} html - HTML with potential bold markdown\n * @returns {string} HTML with bold styling\n */\n static parseBold(html) {\n html = html.replace(/\\*\\*(.+?)\\*\\*/g, '<strong><span class=\"syntax-marker\">**</span>$1<span class=\"syntax-marker\">**</span></strong>');\n html = html.replace(/__(.+?)__/g, '<strong><span class=\"syntax-marker\">__</span>$1<span class=\"syntax-marker\">__</span></strong>');\n return html;\n }\n\n /**\n * Parse italic text\n * Note: Uses lookbehind assertions - requires modern browsers\n * @param {string} html - HTML with potential italic markdown\n * @returns {string} HTML with italic styling\n */\n static parseItalic(html) {\n html = html.replace(/(?<!\\*)\\*(?!\\*)(.+?)(?<!\\*)\\*(?!\\*)/g, '<em><span class=\"syntax-marker\">*</span>$1<span class=\"syntax-marker\">*</span></em>');\n html = html.replace(/(?<!_)_(?!_)(.+?)(?<!_)_(?!_)/g, '<em><span class=\"syntax-marker\">_</span>$1<span class=\"syntax-marker\">_</span></em>');\n return html;\n }\n\n /**\n * Parse inline code\n * @param {string} html - HTML with potential code markdown\n * @returns {string} HTML with code styling\n */\n static parseInlineCode(html) {\n // Must have equal number of backticks before and after inline code\n //\n // Regex explainer:\n // (?<!`): A negative lookbehind ensuring the opening backticks are not preceded by another backtick.\n // (`+): A capturing group that matches and remembers the opening sequence of one or more backticks. This is Group 1.\n // ((?:(?!\\1).)+?): A capturing group that greedily matches any character that is not the exact sequence of backticks captured in Group 1. This is Group 2.\n // (\\1): A backreference to Group 1, ensuring the closing sequence has the exact same number of backticks as the opening sequence. This is Group 3.\n // (?!`): A negative lookahead ensuring the closing backticks are not followed by another backtick.\n return html.replace(/(?<!`)(`+)(?!`)((?:(?!\\1).)+?)(\\1)(?!`)/g, '<code><span class=\"syntax-marker\">$1</span>$2<span class=\"syntax-marker\">$3</span></code>');\n }\n\n /**\n * Sanitize URL to prevent XSS attacks\n * @param {string} url - URL to sanitize\n * @returns {string} Safe URL or '#' if dangerous\n */\n static sanitizeUrl(url) {\n // Trim whitespace and convert to lowercase for protocol check\n const trimmed = url.trim();\n const lower = trimmed.toLowerCase();\n \n // Allow safe protocols\n const safeProtocols = [\n 'http://',\n 'https://',\n 'mailto:',\n 'ftp://',\n 'ftps://'\n ];\n \n // Check if URL starts with a safe protocol\n const hasSafeProtocol = safeProtocols.some(protocol => lower.startsWith(protocol));\n \n // Allow relative URLs (starting with / or # or no protocol)\n const isRelative = trimmed.startsWith('/') || \n trimmed.startsWith('#') || \n trimmed.startsWith('?') ||\n trimmed.startsWith('.') ||\n (!trimmed.includes(':') && !trimmed.includes('//'));\n \n // If safe protocol or relative URL, return as-is\n if (hasSafeProtocol || isRelative) {\n return url;\n }\n \n // Block dangerous protocols (javascript:, data:, vbscript:, etc.)\n return '#';\n }\n\n /**\n * Parse links\n * @param {string} html - HTML with potential link markdown\n * @returns {string} HTML with link styling\n */\n static parseLinks(html) {\n return html.replace(/\\[(.+?)\\]\\((.+?)\\)/g, (match, text, url) => {\n const anchorName = `--link-${this.linkIndex++}`;\n // Sanitize URL to prevent XSS attacks\n const safeUrl = this.sanitizeUrl(url);\n // Use real href - pointer-events handles click prevention in normal mode\n return `<a href=\"${safeUrl}\" style=\"anchor-name: ${anchorName}\"><span class=\"syntax-marker\">[</span>${text}<span class=\"syntax-marker url-part\">](${url})</span></a>`;\n });\n }\n\n /**\n * Parse all inline elements in correct order\n * @param {string} text - Text with potential inline markdown\n * @returns {string} HTML with all inline styling\n */\n static parseInlineElements(text) {\n let html = text;\n // Order matters: parse code first\n html = this.parseInlineCode(html);\n \n // Use placeholders to protect inline code while preserving formatting spans\n // We use Unicode Private Use Area (U+E000-U+F8FF) as placeholders because:\n // 1. These characters are reserved for application-specific use\n // 2. They'll never appear in user text\n // 3. They maintain single-character width (important for alignment)\n // 4. They're invisible if accidentally rendered\n const sanctuaries = new Map();\n \n // Protect code blocks\n html = html.replace(/(<code>.*?<\\/code>)/g, (match) => {\n const placeholder = `\\uE000${sanctuaries.size}\\uE001`;\n sanctuaries.set(placeholder, match);\n return placeholder;\n });\n \n // Parse links AFTER protecting code but BEFORE bold/italic\n // This ensures link URLs don't get processed as markdown\n html = this.parseLinks(html);\n \n // Protect entire link elements (not just the URL part)\n html = html.replace(/(<a[^>]*>.*?<\\/a>)/g, (match) => {\n const placeholder = `\\uE000${sanctuaries.size}\\uE001`;\n sanctuaries.set(placeholder, match);\n return placeholder;\n });\n \n // Process other inline elements on text with placeholders\n html = this.parseBold(html);\n html = this.parseItalic(html);\n \n // Restore all sanctuaries\n sanctuaries.forEach((content, placeholder) => {\n html = html.replace(placeholder, content);\n });\n \n return html;\n }\n\n /**\n * Parse a single line of markdown\n * @param {string} line - Raw markdown line\n * @returns {string} Parsed HTML line\n */\n static parseLine(line) {\n let html = this.escapeHtml(line);\n \n // Preserve indentation\n html = this.preserveIndentation(html, line);\n \n // Check for block elements first\n const horizontalRule = this.parseHorizontalRule(html);\n if (horizontalRule) return horizontalRule;\n \n const codeBlock = this.parseCodeBlock(html);\n if (codeBlock) return codeBlock;\n \n // Parse block elements\n html = this.parseHeader(html);\n html = this.parseBlockquote(html);\n html = this.parseBulletList(html);\n html = this.parseNumberedList(html);\n \n // Parse inline elements\n html = this.parseInlineElements(html);\n \n // Wrap in div to maintain line structure\n if (html.trim() === '') {\n // Intentionally use &nbsp; for empty lines to maintain vertical spacing\n // This causes a 0->1 character count difference but preserves visual alignment\n return '<div>&nbsp;</div>';\n }\n \n return `<div>${html}</div>`;\n }\n\n /**\n * Parse full markdown text\n * @param {string} text - Full markdown text\n * @param {number} activeLine - Currently active line index (optional)\n * @param {boolean} showActiveLineRaw - Show raw markdown on active line\n * @returns {string} Parsed HTML\n */\n static parse(text, activeLine = -1, showActiveLineRaw = false) {\n // Reset link counter for each parse\n this.resetLinkIndex();\n \n const lines = text.split('\\n');\n let inCodeBlock = false;\n \n const parsedLines = lines.map((line, index) => {\n // Show raw markdown on active line if requested\n if (showActiveLineRaw && index === activeLine) {\n const content = this.escapeHtml(line) || '&nbsp;';\n return `<div class=\"raw-line\">${content}</div>`;\n }\n \n // Check if this line is a code fence\n const codeFenceRegex = /^```[^`]*$/;\n if (codeFenceRegex.test(line)) {\n inCodeBlock = !inCodeBlock;\n // Parse fence markers normally to get styled output\n return this.parseLine(line);\n }\n \n // If we're inside a code block, don't parse as markdown\n if (inCodeBlock) {\n const escaped = this.escapeHtml(line);\n const indented = this.preserveIndentation(escaped, line);\n return `<div>${indented || '&nbsp;'}</div>`;\n }\n \n // Otherwise, parse the markdown normally\n return this.parseLine(line);\n });\n \n // Join without newlines to prevent extra spacing\n const html = parsedLines.join('');\n \n // Apply post-processing for list consolidation\n return this.postProcessHTML(html);\n }\n\n /**\n * Post-process HTML to consolidate lists and code blocks\n * @param {string} html - HTML to post-process\n * @returns {string} Post-processed HTML with consolidated lists and code blocks\n */\n static postProcessHTML(html) {\n // Check if we're in a browser environment\n if (typeof document === 'undefined' || !document) {\n // In Node.js environment - do manual post-processing\n return this.postProcessHTMLManual(html);\n }\n \n // Parse HTML string into DOM\n const container = document.createElement('div');\n container.innerHTML = html;\n \n let currentList = null;\n let listType = null;\n let currentCodeBlock = null;\n let inCodeBlock = false;\n \n // Process all direct children - need to be careful with live NodeList\n const children = Array.from(container.children);\n \n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n \n // Skip if child was already processed/removed\n if (!child.parentNode) continue;\n \n // Check for code fence start/end\n const codeFence = child.querySelector('.code-fence');\n if (codeFence) {\n const fenceText = codeFence.textContent;\n if (fenceText.startsWith('```')) {\n if (!inCodeBlock) {\n // Start of code block - keep fence visible, then add pre/code\n inCodeBlock = true;\n \n // Create the code block that will follow the fence\n currentCodeBlock = document.createElement('pre');\n const codeElement = document.createElement('code');\n currentCodeBlock.appendChild(codeElement);\n currentCodeBlock.className = 'code-block';\n \n // Extract language if present\n const lang = fenceText.slice(3).trim();\n if (lang) {\n codeElement.className = `language-${lang}`;\n }\n \n // Insert code block after the fence div (don't remove the fence)\n container.insertBefore(currentCodeBlock, child.nextSibling);\n \n // Store reference to the code element for adding content\n currentCodeBlock._codeElement = codeElement;\n continue;\n } else {\n // End of code block - fence stays visible\n inCodeBlock = false;\n currentCodeBlock = null;\n continue;\n }\n }\n }\n \n // Check if we're in a code block - any div that's not a code fence\n if (inCodeBlock && currentCodeBlock && child.tagName === 'DIV' && !child.querySelector('.code-fence')) {\n const codeElement = currentCodeBlock._codeElement || currentCodeBlock.querySelector('code');\n // Add the line content to the code block\n if (codeElement.textContent.length > 0) {\n codeElement.textContent += '\\n';\n }\n // Get the actual text content, preserving spaces\n // Use textContent instead of innerHTML to avoid double-escaping\n // textContent automatically decodes HTML entities\n const lineText = child.textContent.replace(/\\u00A0/g, ' '); // \\u00A0 is nbsp\n codeElement.textContent += lineText;\n child.remove();\n continue;\n }\n \n // Check if this div contains a list item\n let listItem = null;\n if (child.tagName === 'DIV') {\n // Look for li inside the div\n listItem = child.querySelector('li');\n }\n \n if (listItem) {\n const isBullet = listItem.classList.contains('bullet-list');\n const isOrdered = listItem.classList.contains('ordered-list');\n \n if (!isBullet && !isOrdered) {\n currentList = null;\n listType = null;\n continue;\n }\n \n const newType = isBullet ? 'ul' : 'ol';\n \n // Start new list or continue current\n if (!currentList || listType !== newType) {\n currentList = document.createElement(newType);\n container.insertBefore(currentList, child);\n listType = newType;\n }\n \n // Move the list item to the current list\n currentList.appendChild(listItem);\n \n // Remove the now-empty div wrapper\n child.remove();\n } else {\n // Non-list element ends current list\n currentList = null;\n listType = null;\n }\n }\n \n return container.innerHTML;\n }\n\n /**\n * Manual post-processing for Node.js environments (without DOM)\n * @param {string} html - HTML to post-process\n * @returns {string} Post-processed HTML\n */\n static postProcessHTMLManual(html) {\n let processed = html;\n \n // Process unordered lists\n processed = processed.replace(/((?:<div>(?:&nbsp;)*<li class=\"bullet-list\">.*?<\\/li><\\/div>\\s*)+)/gs, (match) => {\n const items = match.match(/<li class=\"bullet-list\">.*?<\\/li>/gs) || [];\n if (items.length > 0) {\n return '<ul>' + items.join('') + '</ul>';\n }\n return match;\n });\n \n // Process ordered lists\n processed = processed.replace(/((?:<div>(?:&nbsp;)*<li class=\"ordered-list\">.*?<\\/li><\\/div>\\s*)+)/gs, (match) => {\n const items = match.match(/<li class=\"ordered-list\">.*?<\\/li>/gs) || [];\n if (items.length > 0) {\n return '<ol>' + items.join('') + '</ol>';\n }\n return match;\n });\n \n // Process code blocks - KEEP the fence markers for alignment AND use semantic pre/code\n const codeBlockRegex = /<div><span class=\"code-fence\">(```[^<]*)<\\/span><\\/div>(.*?)<div><span class=\"code-fence\">(```)<\\/span><\\/div>/gs;\n processed = processed.replace(codeBlockRegex, (match, openFence, content, closeFence) => {\n // Extract the content between fences\n const lines = content.match(/<div>(.*?)<\\/div>/gs) || [];\n const codeContent = lines.map(line => {\n // Extract text from each div - content is already escaped\n const text = line.replace(/<div>(.*?)<\\/div>/s, '$1')\n .replace(/&nbsp;/g, ' ');\n return text;\n }).join('\\n');\n \n // Extract language from the opening fence\n const lang = openFence.slice(3).trim();\n const langClass = lang ? ` class=\"language-${lang}\"` : '';\n \n // Keep fence markers visible as separate divs, with pre/code block between them\n let result = `<div><span class=\"code-fence\">${openFence}</span></div>`;\n // Content is already escaped, don't double-escape\n result += `<pre class=\"code-block\"><code${langClass}>${codeContent}</code></pre>`;\n result += `<div><span class=\"code-fence\">${closeFence}</span></div>`;\n \n return result;\n });\n \n return processed;\n }\n\n /**\n * List pattern definitions\n */\n static LIST_PATTERNS = {\n bullet: /^(\\s*)([-*+])\\s+(.*)$/,\n numbered: /^(\\s*)(\\d+)\\.\\s+(.*)$/,\n checkbox: /^(\\s*)-\\s+\\[([ x])\\]\\s+(.*)$/\n };\n\n /**\n * Get list context at cursor position\n * @param {string} text - Full text content\n * @param {number} cursorPosition - Current cursor position\n * @returns {Object} List context information\n */\n static getListContext(text, cursorPosition) {\n // Find the line containing the cursor\n const lines = text.split('\\n');\n let currentPos = 0;\n let lineIndex = 0;\n let lineStart = 0;\n \n for (let i = 0; i < lines.length; i++) {\n const lineLength = lines[i].length;\n if (currentPos + lineLength >= cursorPosition) {\n lineIndex = i;\n lineStart = currentPos;\n break;\n }\n currentPos += lineLength + 1; // +1 for newline\n }\n \n const currentLine = lines[lineIndex];\n const lineEnd = lineStart + currentLine.length;\n \n // Check for checkbox first (most specific)\n const checkboxMatch = currentLine.match(this.LIST_PATTERNS.checkbox);\n if (checkboxMatch) {\n return {\n inList: true,\n listType: 'checkbox',\n indent: checkboxMatch[1],\n marker: '-',\n checked: checkboxMatch[2] === 'x',\n content: checkboxMatch[3],\n lineStart,\n lineEnd,\n markerEndPos: lineStart + checkboxMatch[1].length + checkboxMatch[2].length + 5 // indent + \"- [ ] \"\n };\n }\n \n // Check for bullet list\n const bulletMatch = currentLine.match(this.LIST_PATTERNS.bullet);\n if (bulletMatch) {\n return {\n inList: true,\n listType: 'bullet',\n indent: bulletMatch[1],\n marker: bulletMatch[2],\n content: bulletMatch[3],\n lineStart,\n lineEnd,\n markerEndPos: lineStart + bulletMatch[1].length + bulletMatch[2].length + 1 // indent + marker + space\n };\n }\n \n // Check for numbered list\n const numberedMatch = currentLine.match(this.LIST_PATTERNS.numbered);\n if (numberedMatch) {\n return {\n inList: true,\n listType: 'numbered',\n indent: numberedMatch[1],\n marker: parseInt(numberedMatch[2]),\n content: numberedMatch[3],\n lineStart,\n lineEnd,\n markerEndPos: lineStart + numberedMatch[1].length + numberedMatch[2].length + 2 // indent + number + \". \"\n };\n }\n \n // Not in a list\n return {\n inList: false,\n listType: null,\n indent: '',\n marker: null,\n content: currentLine,\n lineStart,\n lineEnd,\n markerEndPos: lineStart\n };\n }\n\n /**\n * Create a new list item based on context\n * @param {Object} context - List context from getListContext\n * @returns {string} New list item text\n */\n static createNewListItem(context) {\n switch (context.listType) {\n case 'bullet':\n return `${context.indent}${context.marker} `;\n case 'numbered':\n return `${context.indent}${context.marker + 1}. `;\n case 'checkbox':\n return `${context.indent}- [ ] `;\n default:\n return '';\n }\n }\n\n /**\n * Renumber all numbered lists in text\n * @param {string} text - Text containing numbered lists\n * @returns {string} Text with renumbered lists\n */\n static renumberLists(text) {\n const lines = text.split('\\n');\n const numbersByIndent = new Map();\n let inList = false;\n \n const result = lines.map(line => {\n const match = line.match(this.LIST_PATTERNS.numbered);\n \n if (match) {\n const indent = match[1];\n const indentLevel = indent.length;\n const content = match[3];\n \n // If we weren't in a list or indent changed, reset lower levels\n if (!inList) {\n numbersByIndent.clear();\n }\n \n // Get the next number for this indent level\n const currentNumber = (numbersByIndent.get(indentLevel) || 0) + 1;\n numbersByIndent.set(indentLevel, currentNumber);\n \n // Clear deeper indent levels\n for (const [level] of numbersByIndent) {\n if (level > indentLevel) {\n numbersByIndent.delete(level);\n }\n }\n \n inList = true;\n return `${indent}${currentNumber}. ${content}`;\n } else {\n // Not a numbered list item\n if (line.trim() === '' || !line.match(/^\\s/)) {\n // Empty line or non-indented line breaks the list\n inList = false;\n numbersByIndent.clear();\n }\n return line;\n }\n });\n \n return result.join('\\n');\n }\n}", "/**\n * Format definitions for markdown syntax\n */\n\nexport const FORMATS = {\n bold: {\n prefix: '**',\n suffix: '**',\n trimFirst: true\n },\n italic: {\n prefix: '_',\n suffix: '_',\n trimFirst: true\n },\n code: {\n prefix: '`',\n suffix: '`',\n blockPrefix: '```',\n blockSuffix: '```'\n },\n link: {\n prefix: '[',\n suffix: '](url)',\n replaceNext: 'url',\n scanFor: 'https?://'\n },\n bulletList: {\n prefix: '- ',\n multiline: true,\n unorderedList: true\n },\n numberedList: {\n prefix: '1. ',\n multiline: true,\n orderedList: true\n },\n quote: {\n prefix: '> ',\n multiline: true,\n surroundWithNewlines: true\n },\n taskList: {\n prefix: '- [ ] ',\n multiline: true,\n surroundWithNewlines: true\n },\n header1: { prefix: '# ' },\n header2: { prefix: '## ' },\n header3: { prefix: '### ' },\n header4: { prefix: '#### ' },\n header5: { prefix: '##### ' },\n header6: { prefix: '###### ' }\n}\n\n/**\n * Default style configuration\n */\nexport function getDefaultStyle() {\n return {\n prefix: '',\n suffix: '',\n blockPrefix: '',\n blockSuffix: '',\n multiline: false,\n replaceNext: '',\n prefixSpace: false,\n scanFor: '',\n surroundWithNewlines: false,\n orderedList: false,\n unorderedList: false,\n trimFirst: false\n }\n}\n\n/**\n * Merge format with defaults\n */\nexport function mergeWithDefaults(format) {\n return { ...getDefaultStyle(), ...format }\n}", "/**\n * Debug utilities for markdown-actions\n * Add console logging to track what's happening\n */\n\n// Debug mode flag - disabled by default\nlet debugMode = false;\n\n/**\n * Enable or disable debug mode\n * @param {boolean} enabled - Whether to enable debug mode\n */\nexport function setDebugMode(enabled) {\n debugMode = enabled;\n}\n\n/**\n * Get current debug mode status\n * @returns {boolean} Whether debug mode is enabled\n */\nexport function getDebugMode() {\n return debugMode;\n}\n\nexport function debugLog(funcName, message, data) {\n // These will be completely removed by esbuild's drop: ['console'] in production\n if (!debugMode) return;\n \n console.group(`\uD83D\uDD0D ${funcName}`);\n console.log(message);\n if (data) {\n console.log('Data:', data);\n }\n console.groupEnd();\n}\n\nexport function debugSelection(textarea, label) {\n // These will be completely removed by esbuild's drop: ['console'] in production\n if (!debugMode) return;\n \n const selected = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd);\n console.group(`\uD83D\uDCCD Selection: ${label}`);\n console.log('Position:', `${textarea.selectionStart}-${textarea.selectionEnd}`);\n console.log('Selected text:', JSON.stringify(selected));\n console.log('Length:', selected.length);\n \n // Show context around selection\n const before = textarea.value.slice(Math.max(0, textarea.selectionStart - 10), textarea.selectionStart);\n const after = textarea.value.slice(textarea.selectionEnd, Math.min(textarea.value.length, textarea.selectionEnd + 10));\n console.log('Context:', JSON.stringify(before) + '[SELECTION]' + JSON.stringify(after));\n console.groupEnd();\n}\n\nexport function debugResult(result) {\n // These will be completely removed by esbuild's drop: ['console'] in production\n if (!debugMode) return;\n \n console.group('\uD83D\uDCDD Result');\n console.log('Text to insert:', JSON.stringify(result.text));\n console.log('New selection:', `${result.selectionStart}-${result.selectionEnd}`);\n console.groupEnd();\n}", "/**\n * Text insertion system with undo/redo support\n * Extracted and adapted from GitHub's markdown-toolbar-element\n */\n\nimport { getDebugMode } from '../debug.js'\n\nlet canInsertText = null\n\n/**\n * Insert text at current position with undo/redo support\n * @param {HTMLTextAreaElement} textarea - Target textarea\n * @param {Object} options - Text and selection options\n * @param {string} options.text - Text to insert\n * @param {number} [options.selectionStart] - New selection start\n * @param {number} [options.selectionEnd] - New selection end\n */\nexport function insertText(textarea, { text, selectionStart, selectionEnd }) {\n const debugMode = getDebugMode();\n \n if (debugMode) {\n console.group('\uD83D\uDD27 insertText');\n console.log('Current selection:', `${textarea.selectionStart}-${textarea.selectionEnd}`);\n console.log('Text to insert:', JSON.stringify(text));\n console.log('New selection to set:', selectionStart, '-', selectionEnd);\n }\n \n // Make sure the textarea is focused\n textarea.focus();\n \n const originalSelectionStart = textarea.selectionStart\n const originalSelectionEnd = textarea.selectionEnd\n const before = textarea.value.slice(0, originalSelectionStart)\n const after = textarea.value.slice(originalSelectionEnd)\n \n if (debugMode) {\n console.log('Before text (last 20):', JSON.stringify(before.slice(-20)));\n console.log('After text (first 20):', JSON.stringify(after.slice(0, 20)));\n console.log('Selected text being replaced:', JSON.stringify(textarea.value.slice(originalSelectionStart, originalSelectionEnd)));\n }\n \n // Store the original value to check if execCommand actually changed it\n const originalValue = textarea.value\n\n // Try execCommand for both insertions and replacements to preserve undo history\n // execCommand('insertText') can handle replacing selected text\n const hasSelection = originalSelectionStart !== originalSelectionEnd\n \n if (canInsertText === null || canInsertText === true) {\n textarea.contentEditable = 'true'\n try {\n canInsertText = document.execCommand('insertText', false, text)\n if (debugMode) console.log('execCommand returned:', canInsertText, 'for text with', text.split('\\n').length, 'lines');\n } catch (error) {\n canInsertText = false\n if (debugMode) console.log('execCommand threw error:', error);\n }\n textarea.contentEditable = 'false'\n }\n\n if (debugMode) {\n console.log('canInsertText before:', canInsertText);\n console.log('execCommand result:', canInsertText);\n }\n \n // Check if execCommand actually worked by comparing the value\n if (canInsertText) {\n const expectedValue = before + text + after\n const actualValue = textarea.value\n \n if (debugMode) {\n console.log('Expected length:', expectedValue.length);\n console.log('Actual length:', actualValue.length);\n }\n \n if (actualValue !== expectedValue) {\n if (debugMode) {\n console.log('execCommand changed the value but not as expected');\n console.log('Expected:', JSON.stringify(expectedValue.slice(0, 100)));\n console.log('Actual:', JSON.stringify(actualValue.slice(0, 100)));\n }\n // Don't set canInsertText to false here - execCommand did work\n // We just need to not double-insert\n }\n }\n\n if (!canInsertText) {\n if (debugMode) console.log('Using manual insertion');\n // Only do manual insertion if execCommand didn't change the value\n if (textarea.value === originalValue) {\n if (debugMode) console.log('Value unchanged, doing manual replacement');\n try {\n document.execCommand('ms-beginUndoUnit')\n } catch (e) {\n // Do nothing.\n }\n textarea.value = before + text + after\n try {\n document.execCommand('ms-endUndoUnit')\n } catch (e) {\n // Do nothing.\n }\n textarea.dispatchEvent(new CustomEvent('input', { bubbles: true, cancelable: true }))\n } else {\n if (debugMode) console.log('Value was changed by execCommand, skipping manual insertion');\n }\n }\n\n if (debugMode) console.log('Setting selection range:', selectionStart, selectionEnd);\n if (selectionStart != null && selectionEnd != null) {\n textarea.setSelectionRange(selectionStart, selectionEnd)\n } else {\n textarea.setSelectionRange(originalSelectionStart, textarea.selectionEnd)\n }\n \n if (debugMode) {\n console.log('Final value length:', textarea.value.length);\n console.groupEnd();\n }\n}\n\n/**\n * Configure undo method\n * @param {'native' | 'manual' | 'auto'} method - Undo method to use\n */\nexport function setUndoMethod(method) {\n switch (method) {\n case 'native':\n canInsertText = true\n break\n case 'manual':\n canInsertText = false\n break\n case 'auto':\n canInsertText = null\n break\n }\n}", "/**\n * Core selection utilities extracted and adapted from GitHub's markdown-toolbar-element\n */\n\n/**\n * Check if string contains multiple lines\n */\nexport function isMultipleLines(string) {\n return string.trim().split('\\n').length > 1\n}\n\n/**\n * Find the start of the word at position i\n */\nexport function wordSelectionStart(text, i) {\n let index = i\n while (text[index] && text[index - 1] != null && !text[index - 1].match(/\\s/)) {\n index--\n }\n return index\n}\n\n/**\n * Find the end of the word at position i\n */\nexport function wordSelectionEnd(text, i, multiline) {\n let index = i\n const breakpoint = multiline ? /\\n/ : /\\s/\n while (text[index] && !text[index].match(breakpoint)) {\n index++\n }\n return index\n}\n\n/**\n * Expand selection to line boundaries\n */\nexport function expandSelectionToLine(textarea) {\n const lines = textarea.value.split('\\n')\n let counter = 0\n for (let index = 0; index < lines.length; index++) {\n const lineLength = lines[index].length + 1\n if (textarea.selectionStart >= counter && textarea.selectionStart < counter + lineLength) {\n textarea.selectionStart = counter\n }\n if (textarea.selectionEnd >= counter && textarea.selectionEnd < counter + lineLength) {\n // For the last line, don't go past the actual text length\n if (index === lines.length - 1) {\n textarea.selectionEnd = Math.min(counter + lines[index].length, textarea.value.length)\n } else {\n textarea.selectionEnd = counter + lineLength - 1\n }\n }\n counter += lineLength\n }\n}\n\n/**\n * Expand selected text with smart boundary detection\n */\nexport function expandSelectedText(textarea, prefixToUse, suffixToUse, multiline = false) {\n if (textarea.selectionStart === textarea.selectionEnd) {\n textarea.selectionStart = wordSelectionStart(textarea.value, textarea.selectionStart)\n textarea.selectionEnd = wordSelectionEnd(textarea.value, textarea.selectionEnd, multiline)\n } else {\n const expandedSelectionStart = textarea.selectionStart - prefixToUse.length\n const expandedSelectionEnd = textarea.selectionEnd + suffixToUse.length\n const beginsWithPrefix = textarea.value.slice(expandedSelectionStart, textarea.selectionStart) === prefixToUse\n const endsWithSuffix = textarea.value.slice(textarea.selectionEnd, expandedSelectionEnd) === suffixToUse\n if (beginsWithPrefix && endsWithSuffix) {\n textarea.selectionStart = expandedSelectionStart\n textarea.selectionEnd = expandedSelectionEnd\n }\n }\n return textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n}\n\n/**\n * Calculate newlines needed to surround selected text\n */\nexport function newlinesToSurroundSelectedText(textarea) {\n const beforeSelection = textarea.value.slice(0, textarea.selectionStart)\n const afterSelection = textarea.value.slice(textarea.selectionEnd)\n\n const breaksBefore = beforeSelection.match(/\\n*$/)\n const breaksAfter = afterSelection.match(/^\\n*/)\n const newlinesBeforeSelection = breaksBefore ? breaksBefore[0].length : 0\n const newlinesAfterSelection = breaksAfter ? breaksAfter[0].length : 0\n\n let newlinesToAppend = ''\n let newlinesToPrepend = ''\n\n if (beforeSelection.match(/\\S/) && newlinesBeforeSelection < 2) {\n newlinesToAppend = '\\n'.repeat(2 - newlinesBeforeSelection)\n }\n\n if (afterSelection.match(/\\S/) && newlinesAfterSelection < 2) {\n newlinesToPrepend = '\\n'.repeat(2 - newlinesAfterSelection)\n }\n\n return { newlinesToAppend, newlinesToPrepend }\n}\n\n/**\n * Utility to preserve selection during operations\n */\nexport function preserveSelection(textarea, callback) {\n const start = textarea.selectionStart\n const end = textarea.selectionEnd\n const scrollTop = textarea.scrollTop\n \n callback()\n \n textarea.selectionStart = start\n textarea.selectionEnd = end\n textarea.scrollTop = scrollTop\n}\n\n/**\n * Apply a line-based operation with cursor preservation\n * This function handles expanding to line boundaries and preserving cursor position\n * @param {HTMLTextAreaElement} textarea - The textarea element\n * @param {Function} operation - The operation to perform (receives textarea and returns result)\n * @param {Object} options - Options for the operation\n * @param {string} options.prefix - The prefix being added/removed (for cursor adjustment)\n * @param {Function} options.adjustSelection - Custom selection adjustment function\n * @returns {Object} The result from the operation with adjusted cursor position\n */\nexport function applyLineOperation(textarea, operation, options = {}) {\n // Save original cursor position AND selection before any expansion\n const originalStart = textarea.selectionStart\n const originalEnd = textarea.selectionEnd\n const noInitialSelection = originalStart === originalEnd\n \n // Store the line start position to calculate offset later\n const value = textarea.value\n let lineStart = originalStart\n \n // Find start of the line containing the selection start\n while (lineStart > 0 && value[lineStart - 1] !== '\\n') {\n lineStart--\n }\n \n // Expand selection to line boundaries for the operation\n if (noInitialSelection) {\n // Expand to current line when no selection\n let lineEnd = originalStart\n \n // Find end of current line\n while (lineEnd < value.length && value[lineEnd] !== '\\n') {\n lineEnd++\n }\n \n textarea.selectionStart = lineStart\n textarea.selectionEnd = lineEnd\n } else {\n // For selections, expand to full lines\n expandSelectionToLine(textarea)\n }\n \n // Apply the operation\n const result = operation(textarea)\n \n // Restore original selection/cursor with prefix adjustment\n if (options.adjustSelection) {\n // Use custom selection adjustment logic\n const selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n const isRemoving = selectedText.startsWith(options.prefix)\n const adjusted = options.adjustSelection(isRemoving, originalStart, originalEnd, lineStart)\n result.selectionStart = adjusted.start\n result.selectionEnd = adjusted.end\n } else if (options.prefix) {\n // Use default prefix-based adjustment\n const selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n const isRemoving = selectedText.startsWith(options.prefix)\n \n if (noInitialSelection) {\n // No selection - just restore cursor position\n if (isRemoving) {\n // When removing prefix, adjust cursor position\n result.selectionStart = Math.max(originalStart - options.prefix.length, lineStart)\n result.selectionEnd = result.selectionStart\n } else {\n // When adding prefix, adjust cursor position\n result.selectionStart = originalStart + options.prefix.length\n result.selectionEnd = result.selectionStart\n }\n } else {\n // Had a selection - restore it with adjustment\n if (isRemoving) {\n // When removing prefix, shift selection back\n result.selectionStart = Math.max(originalStart - options.prefix.length, lineStart)\n result.selectionEnd = Math.max(originalEnd - options.prefix.length, lineStart)\n } else {\n // When adding prefix, shift selection forward\n result.selectionStart = originalStart + options.prefix.length\n result.selectionEnd = originalEnd + options.prefix.length\n }\n }\n }\n \n return result\n}", "/**\n * Block-level text formatting operations\n * Handles inline formats like bold, italic, code, and links\n */\n\nimport { expandSelectedText, newlinesToSurroundSelectedText, isMultipleLines } from '../core/selection.js'\nimport { insertText } from '../core/insertion.js'\n\n/**\n * Apply block-level styling to selected text\n */\nexport function blockStyle(textarea, style) {\n let newlinesToAppend\n let newlinesToPrepend\n\n const { prefix, suffix, blockPrefix, blockSuffix, replaceNext, prefixSpace, scanFor, surroundWithNewlines, trimFirst } = style\n const originalSelectionStart = textarea.selectionStart\n const originalSelectionEnd = textarea.selectionEnd\n\n let selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n let prefixToUse = isMultipleLines(selectedText) && blockPrefix && blockPrefix.length > 0 ? `${blockPrefix}\\n` : prefix\n let suffixToUse = isMultipleLines(selectedText) && blockSuffix && blockSuffix.length > 0 ? `\\n${blockSuffix}` : suffix\n\n if (prefixSpace) {\n const beforeSelection = textarea.value[textarea.selectionStart - 1]\n if (textarea.selectionStart !== 0 && beforeSelection != null && !beforeSelection.match(/\\s/)) {\n prefixToUse = ` ${prefixToUse}`\n }\n }\n \n selectedText = expandSelectedText(textarea, prefixToUse, suffixToUse, style.multiline)\n let selectionStart = textarea.selectionStart\n let selectionEnd = textarea.selectionEnd\n const hasReplaceNext = replaceNext && replaceNext.length > 0 && suffixToUse.indexOf(replaceNext) > -1 && selectedText.length > 0\n \n if (surroundWithNewlines) {\n const ref = newlinesToSurroundSelectedText(textarea)\n newlinesToAppend = ref.newlinesToAppend\n newlinesToPrepend = ref.newlinesToPrepend\n prefixToUse = newlinesToAppend + prefix\n suffixToUse += newlinesToPrepend\n }\n\n // Check if we should remove formatting (toggle off)\n if (selectedText.startsWith(prefixToUse) && selectedText.endsWith(suffixToUse)) {\n const replacementText = selectedText.slice(prefixToUse.length, selectedText.length - suffixToUse.length)\n if (originalSelectionStart === originalSelectionEnd) {\n let position = originalSelectionStart - prefixToUse.length\n position = Math.max(position, selectionStart)\n position = Math.min(position, selectionStart + replacementText.length)\n selectionStart = selectionEnd = position\n } else {\n selectionEnd = selectionStart + replacementText.length\n }\n return { text: replacementText, selectionStart, selectionEnd }\n } else if (!hasReplaceNext) {\n // Add formatting\n let replacementText = prefixToUse + selectedText + suffixToUse\n selectionStart = originalSelectionStart + prefixToUse.length\n selectionEnd = originalSelectionEnd + prefixToUse.length\n const whitespaceEdges = selectedText.match(/^\\s*|\\s*$/g)\n if (trimFirst && whitespaceEdges) {\n const leadingWhitespace = whitespaceEdges[0] || ''\n const trailingWhitespace = whitespaceEdges[1] || ''\n replacementText = leadingWhitespace + prefixToUse + selectedText.trim() + suffixToUse + trailingWhitespace\n selectionStart += leadingWhitespace.length\n selectionEnd -= trailingWhitespace.length\n }\n return { text: replacementText, selectionStart, selectionEnd }\n } else if (scanFor && scanFor.length > 0 && selectedText.match(scanFor)) {\n // Handle link/image with URL detection\n suffixToUse = suffixToUse.replace(replaceNext, selectedText)\n const replacementText = prefixToUse + suffixToUse\n selectionStart = selectionEnd = selectionStart + prefixToUse.length\n return { text: replacementText, selectionStart, selectionEnd }\n } else {\n // Handle link/image with placeholder\n const replacementText = prefixToUse + selectedText + suffixToUse\n selectionStart = selectionStart + prefixToUse.length + selectedText.length + suffixToUse.indexOf(replaceNext)\n selectionEnd = selectionStart + replaceNext.length\n return { text: replacementText, selectionStart, selectionEnd }\n }\n}\n\n/**\n * Apply style to selected text in textarea\n */\nexport function styleSelectedText(textarea, style) {\n const text = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n \n let result\n if (style.orderedList || style.unorderedList) {\n // Will be handled by list operations\n return\n } else if (style.multiline && isMultipleLines(text)) {\n result = multilineStyle(textarea, style)\n } else {\n result = blockStyle(textarea, style)\n }\n\n insertText(textarea, result)\n}\n\n/**\n * Apply multiline styling (quotes, task lists, etc)\n * Note: This does NOT expand selection to line - that should be done by the caller if needed\n */\nexport function multilineStyle(textarea, style) {\n const { prefix, suffix, surroundWithNewlines } = style\n let text = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n let selectionStart = textarea.selectionStart\n let selectionEnd = textarea.selectionEnd\n const lines = text.split('\\n')\n \n // Check if we need to undo (all lines have the format)\n const undoStyle = lines.every(line => line.startsWith(prefix) && (!suffix || line.endsWith(suffix)))\n\n if (undoStyle) {\n // Remove the formatting\n text = lines.map(line => {\n let result = line.slice(prefix.length)\n if (suffix) {\n result = result.slice(0, result.length - suffix.length)\n }\n return result\n }).join('\\n')\n selectionEnd = selectionStart + text.length\n } else {\n // Apply the formatting\n text = lines.map(line => prefix + line + (suffix || '')).join('\\n')\n if (surroundWithNewlines) {\n const { newlinesToAppend, newlinesToPrepend } = newlinesToSurroundSelectedText(textarea)\n selectionStart += newlinesToAppend.length\n selectionEnd = selectionStart + text.length\n text = newlinesToAppend + text + newlinesToPrepend\n }\n }\n\n return { text, selectionStart, selectionEnd }\n}", "/**\n * List operations for bullet and numbered lists\n */\n\nimport { expandSelectionToLine, newlinesToSurroundSelectedText, applyLineOperation } from '../core/selection.js'\nimport { insertText } from '../core/insertion.js'\n\n/**\n * Undo ordered list formatting\n */\nfunction undoOrderedListStyle(text) {\n const lines = text.split('\\n')\n const orderedListRegex = /^\\d+\\.\\s+/\n const shouldUndoOrderedList = lines.every(line => orderedListRegex.test(line))\n let result = lines\n if (shouldUndoOrderedList) {\n result = lines.map(line => line.replace(orderedListRegex, ''))\n }\n\n return {\n text: result.join('\\n'),\n processed: shouldUndoOrderedList\n }\n}\n\n/**\n * Undo unordered list formatting\n */\nfunction undoUnorderedListStyle(text) {\n const lines = text.split('\\n')\n const unorderedListPrefix = '- '\n const shouldUndoUnorderedList = lines.every(line => line.startsWith(unorderedListPrefix))\n let result = lines\n if (shouldUndoUnorderedList) {\n result = lines.map(line => line.slice(unorderedListPrefix.length))\n }\n\n return {\n text: result.join('\\n'),\n processed: shouldUndoUnorderedList\n }\n}\n\n/**\n * Make prefix for list item\n */\nfunction makePrefix(index, unorderedList) {\n if (unorderedList) {\n return '- '\n } else {\n return `${index + 1}. `\n }\n}\n\n/**\n * Clear existing list style\n */\nfunction clearExistingListStyle(style, selectedText) {\n let undoResult\n let undoResultOppositeList\n let pristineText\n \n if (style.orderedList) {\n undoResult = undoOrderedListStyle(selectedText)\n undoResultOppositeList = undoUnorderedListStyle(undoResult.text)\n pristineText = undoResultOppositeList.text\n } else {\n undoResult = undoUnorderedListStyle(selectedText)\n undoResultOppositeList = undoOrderedListStyle(undoResult.text)\n pristineText = undoResultOppositeList.text\n }\n \n return [undoResult, undoResultOppositeList, pristineText]\n}\n\n/**\n * Apply list styling to selected text\n */\nexport function listStyle(textarea, style) {\n const noInitialSelection = textarea.selectionStart === textarea.selectionEnd\n let selectionStart = textarea.selectionStart\n let selectionEnd = textarea.selectionEnd\n\n // Select whole line\n expandSelectionToLine(textarea)\n\n const selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n\n // Clear any existing list formatting\n const [undoResult, undoResultOppositeList, pristineText] = clearExistingListStyle(style, selectedText)\n\n const prefixedLines = pristineText.split('\\n').map((value, index) => {\n return `${makePrefix(index, style.unorderedList)}${value}`\n })\n\n const totalPrefixLength = prefixedLines.reduce((previousValue, _currentValue, currentIndex) => {\n return previousValue + makePrefix(currentIndex, style.unorderedList).length\n }, 0)\n\n const totalPrefixLengthOppositeList = prefixedLines.reduce((previousValue, _currentValue, currentIndex) => {\n return previousValue + makePrefix(currentIndex, !style.unorderedList).length\n }, 0)\n\n // If we're undoing the same list type, just return the pristine text\n if (undoResult.processed) {\n if (noInitialSelection) {\n selectionStart = Math.max(selectionStart - makePrefix(0, style.unorderedList).length, 0)\n selectionEnd = selectionStart\n } else {\n selectionStart = textarea.selectionStart\n selectionEnd = textarea.selectionEnd - totalPrefixLength\n }\n return { text: pristineText, selectionStart, selectionEnd }\n }\n\n // Apply new list formatting\n const { newlinesToAppend, newlinesToPrepend } = newlinesToSurroundSelectedText(textarea)\n const text = newlinesToAppend + prefixedLines.join('\\n') + newlinesToPrepend\n\n if (noInitialSelection) {\n selectionStart = Math.max(selectionStart + makePrefix(0, style.unorderedList).length + newlinesToAppend.length, 0)\n selectionEnd = selectionStart\n } else {\n if (undoResultOppositeList.processed) {\n // Converting from one list type to another\n selectionStart = Math.max(textarea.selectionStart + newlinesToAppend.length, 0)\n selectionEnd = textarea.selectionEnd + newlinesToAppend.length + totalPrefixLength - totalPrefixLengthOppositeList\n } else {\n // Adding list formatting to plain text\n selectionStart = Math.max(textarea.selectionStart + newlinesToAppend.length, 0)\n selectionEnd = textarea.selectionEnd + newlinesToAppend.length + totalPrefixLength\n }\n }\n\n return { text, selectionStart, selectionEnd }\n}\n\n/**\n * Apply list style to textarea\n */\nexport function applyListStyle(textarea, style) {\n // Use applyLineOperation for consistent selection preservation\n const result = applyLineOperation(\n textarea,\n (ta) => listStyle(ta, style),\n {\n // Custom selection adjustment for lists\n adjustSelection: (isRemoving, selStart, selEnd, lineStart) => {\n // Get the current line to check if we're removing\n const currentLine = textarea.value.slice(lineStart, textarea.selectionEnd)\n const orderedListRegex = /^\\d+\\.\\s+/\n const unorderedListRegex = /^- /\n \n // Check if we're removing a list\n const hasOrderedList = orderedListRegex.test(currentLine)\n const hasUnorderedList = unorderedListRegex.test(currentLine)\n const isRemovingCurrent = (style.orderedList && hasOrderedList) || (style.unorderedList && hasUnorderedList)\n \n if (selStart === selEnd) {\n // No selection - cursor position\n if (isRemovingCurrent) {\n // Removing list - adjust cursor back\n const prefixMatch = currentLine.match(style.orderedList ? orderedListRegex : unorderedListRegex)\n const prefixLength = prefixMatch ? prefixMatch[0].length : 0\n return {\n start: Math.max(selStart - prefixLength, lineStart),\n end: Math.max(selStart - prefixLength, lineStart)\n }\n } else if (hasOrderedList || hasUnorderedList) {\n // Converting from one list type to another\n const oldPrefixMatch = currentLine.match(hasOrderedList ? orderedListRegex : unorderedListRegex)\n const oldPrefixLength = oldPrefixMatch ? oldPrefixMatch[0].length : 0\n const newPrefixLength = style.unorderedList ? 2 : 3 // \"- \" or \"1. \"\n const adjustment = newPrefixLength - oldPrefixLength\n return {\n start: selStart + adjustment,\n end: selStart + adjustment\n }\n } else {\n // Adding new list\n const prefixLength = style.unorderedList ? 2 : 3 // \"- \" or \"1. \"\n return {\n start: selStart + prefixLength,\n end: selStart + prefixLength\n }\n }\n } else {\n // Has selection - preserve it\n if (isRemovingCurrent) {\n // Removing current list type\n const prefixMatch = currentLine.match(style.orderedList ? orderedListRegex : unorderedListRegex)\n const prefixLength = prefixMatch ? prefixMatch[0].length : 0\n return {\n start: Math.max(selStart - prefixLength, lineStart),\n end: Math.max(selEnd - prefixLength, lineStart)\n }\n } else if (hasOrderedList || hasUnorderedList) {\n // Converting from one list type to another\n const oldPrefixMatch = currentLine.match(hasOrderedList ? orderedListRegex : unorderedListRegex)\n const oldPrefixLength = oldPrefixMatch ? oldPrefixMatch[0].length : 0\n const newPrefixLength = style.unorderedList ? 2 : 3 // \"- \" or \"1. \"\n const adjustment = newPrefixLength - oldPrefixLength\n return {\n start: selStart + adjustment,\n end: selEnd + adjustment\n }\n } else {\n // Adding new list\n const prefixLength = style.unorderedList ? 2 : 3 // \"- \" or \"1. \"\n return {\n start: selStart + prefixLength,\n end: selEnd + prefixLength\n }\n }\n }\n }\n }\n )\n \n insertText(textarea, result)\n}", "/**\n * Format detection utilities\n */\n\nimport { FORMATS } from './formats.js'\n\n/**\n * Check if text has a specific format applied\n */\nfunction hasFormatApplied(text, format) {\n if (!format.prefix) return false\n \n if (format.suffix) {\n return text.startsWith(format.prefix) && text.endsWith(format.suffix)\n } else {\n return text.startsWith(format.prefix)\n }\n}\n\n/**\n * Get active formats at cursor position\n */\nexport function getActiveFormats(textarea) {\n if (!textarea) return []\n \n const formats = []\n const { selectionStart, selectionEnd, value } = textarea\n \n // Get current line for line-based formats\n const lines = value.split('\\n')\n let lineStart = 0\n let currentLine = ''\n \n for (const line of lines) {\n if (selectionStart >= lineStart && selectionStart <= lineStart + line.length) {\n currentLine = line\n break\n }\n lineStart += line.length + 1\n }\n \n // Check line-based formats\n if (currentLine.startsWith('- ')) {\n if (currentLine.startsWith('- [ ] ') || currentLine.startsWith('- [x] ')) {\n formats.push('task-list')\n } else {\n formats.push('bullet-list')\n }\n }\n \n if (/^\\d+\\.\\s/.test(currentLine)) {\n formats.push('numbered-list')\n }\n \n if (currentLine.startsWith('> ')) {\n formats.push('quote')\n }\n \n if (currentLine.startsWith('# ')) formats.push('header')\n if (currentLine.startsWith('## ')) formats.push('header-2')\n if (currentLine.startsWith('### ')) formats.push('header-3')\n \n // Check inline formats by looking around cursor\n const lookBehind = Math.max(0, selectionStart - 10)\n const lookAhead = Math.min(value.length, selectionEnd + 10)\n const surrounding = value.slice(lookBehind, lookAhead)\n \n // Check for bold\n if (surrounding.includes('**')) {\n const beforeCursor = value.slice(Math.max(0, selectionStart - 100), selectionStart)\n const afterCursor = value.slice(selectionEnd, Math.min(value.length, selectionEnd + 100))\n const lastOpenBold = beforeCursor.lastIndexOf('**')\n const nextCloseBold = afterCursor.indexOf('**')\n if (lastOpenBold !== -1 && nextCloseBold !== -1) {\n formats.push('bold')\n }\n }\n \n // Check for italic\n if (surrounding.includes('_')) {\n const beforeCursor = value.slice(Math.max(0, selectionStart - 100), selectionStart)\n const afterCursor = value.slice(selectionEnd, Math.min(value.length, selectionEnd + 100))\n const lastOpenItalic = beforeCursor.lastIndexOf('_')\n const nextCloseItalic = afterCursor.indexOf('_')\n if (lastOpenItalic !== -1 && nextCloseItalic !== -1) {\n formats.push('italic')\n }\n }\n \n // Check for code\n if (surrounding.includes('`')) {\n const beforeCursor = value.slice(Math.max(0, selectionStart - 100), selectionStart)\n const afterCursor = value.slice(selectionEnd, Math.min(value.length, selectionEnd + 100))\n if (beforeCursor.includes('`') && afterCursor.includes('`')) {\n formats.push('code')\n }\n }\n \n // Check for link\n if (surrounding.includes('[') && surrounding.includes(']')) {\n const beforeCursor = value.slice(Math.max(0, selectionStart - 100), selectionStart)\n const afterCursor = value.slice(selectionEnd, Math.min(value.length, selectionEnd + 100))\n const lastOpenBracket = beforeCursor.lastIndexOf('[')\n const nextCloseBracket = afterCursor.indexOf(']')\n if (lastOpenBracket !== -1 && nextCloseBracket !== -1) {\n const afterBracket = value.slice(selectionEnd + nextCloseBracket + 1, selectionEnd + nextCloseBracket + 10)\n if (afterBracket.startsWith('(')) {\n formats.push('link')\n }\n }\n }\n \n return formats\n}\n\n/**\n * Check if specific format is active at cursor\n */\nexport function hasFormat(textarea, format) {\n const activeFormats = getActiveFormats(textarea)\n return activeFormats.includes(format)\n}\n\n/**\n * Expand selection based on options\n */\nexport function expandSelection(textarea, options = {}) {\n if (!textarea) return\n \n const { toWord, toLine, toFormat } = options\n const { selectionStart, selectionEnd, value } = textarea\n \n if (toLine) {\n // Find line boundaries\n const lines = value.split('\\n')\n let lineStart = 0\n let lineEnd = 0\n let currentPos = 0\n \n for (const line of lines) {\n if (selectionStart >= currentPos && selectionStart <= currentPos + line.length) {\n lineStart = currentPos\n lineEnd = currentPos + line.length\n break\n }\n currentPos += line.length + 1\n }\n \n textarea.selectionStart = lineStart\n textarea.selectionEnd = lineEnd\n } else if (toWord && selectionStart === selectionEnd) {\n // Find word boundaries\n let start = selectionStart\n let end = selectionEnd\n \n // Move start back to word boundary\n while (start > 0 && !/\\s/.test(value[start - 1])) {\n start--\n }\n \n // Move end forward to word boundary\n while (end < value.length && !/\\s/.test(value[end])) {\n end++\n }\n \n textarea.selectionStart = start\n textarea.selectionEnd = end\n }\n}", "/**\n * markdown-actions - Lightweight markdown toolbar functionality\n * Based on GitHub's markdown-toolbar-element\n */\n\nimport { FORMATS, mergeWithDefaults } from './core/formats.js'\nimport { insertText, setUndoMethod } from './core/insertion.js'\nimport { preserveSelection, isMultipleLines, expandSelectionToLine, applyLineOperation } from './core/selection.js'\nimport { blockStyle, multilineStyle } from './operations/block.js'\nimport { applyListStyle } from './operations/list.js'\nimport { getActiveFormats as getActive, hasFormat as has, expandSelection as expand } from './core/detection.js'\nimport { debugLog, debugSelection, debugResult, setDebugMode, getDebugMode } from './debug.js'\n\n/**\n * Toggle bold formatting\n */\nexport function toggleBold(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n \n debugLog('toggleBold', 'Starting');\n debugSelection(textarea, 'Before');\n \n const style = mergeWithDefaults(FORMATS.bold)\n const result = blockStyle(textarea, style)\n \n debugResult(result);\n \n insertText(textarea, result)\n \n debugSelection(textarea, 'After');\n}\n\n/**\n * Toggle italic formatting\n */\nexport function toggleItalic(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n const style = mergeWithDefaults(FORMATS.italic)\n const result = blockStyle(textarea, style)\n insertText(textarea, result)\n}\n\n/**\n * Toggle code formatting\n */\nexport function toggleCode(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n \n // blockStyle already handles both inline and block code correctly\n const style = mergeWithDefaults(FORMATS.code)\n const result = blockStyle(textarea, style)\n insertText(textarea, result)\n}\n\n/**\n * Insert or toggle link formatting\n */\nexport function insertLink(textarea, options = {}) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n \n const selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n let style = mergeWithDefaults(FORMATS.link)\n \n // Check if selected text is a URL\n const isURL = selectedText && selectedText.match(/^https?:\\/\\//)\n \n if (isURL && !options.url) {\n // If selected text is a URL, use it as both link text and URL\n style.suffix = `](${selectedText})`\n style.replaceNext = ''\n // Don't change the selected text, it becomes the link text\n } else if (options.url) {\n // Override with custom URL if provided\n style.suffix = `](${options.url})`\n style.replaceNext = ''\n }\n \n // Override with custom text if provided\n if (options.text && !selectedText) {\n // Insert the text and select it\n const pos = textarea.selectionStart\n textarea.value = textarea.value.slice(0, pos) + options.text + textarea.value.slice(pos)\n textarea.selectionStart = pos\n textarea.selectionEnd = pos + options.text.length\n }\n \n const result = blockStyle(textarea, style)\n insertText(textarea, result)\n}\n\n/**\n * Toggle bullet list formatting\n */\nexport function toggleBulletList(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n const style = mergeWithDefaults(FORMATS.bulletList)\n applyListStyle(textarea, style)\n}\n\n/**\n * Toggle numbered list formatting\n */\nexport function toggleNumberedList(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n const style = mergeWithDefaults(FORMATS.numberedList)\n applyListStyle(textarea, style)\n}\n\n/**\n * Toggle quote formatting\n * Matches GitHub's implementation for quotes\n */\nexport function toggleQuote(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n \n debugLog('toggleQuote', 'Starting');\n debugSelection(textarea, 'Initial');\n \n const style = mergeWithDefaults(FORMATS.quote)\n \n // Use the reusable line operation helper\n const result = applyLineOperation(\n textarea,\n (ta) => multilineStyle(ta, style),\n { prefix: style.prefix }\n )\n \n debugResult(result);\n insertText(textarea, result)\n debugSelection(textarea, 'Final');\n}\n\n/**\n * Toggle task list formatting\n * Matches GitHub's implementation for task lists\n */\nexport function toggleTaskList(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n \n const style = mergeWithDefaults(FORMATS.taskList)\n \n // Use the reusable line operation helper\n const result = applyLineOperation(\n textarea,\n (ta) => multilineStyle(ta, style),\n { prefix: style.prefix }\n )\n \n insertText(textarea, result)\n}\n\n/**\n * Insert or toggle header with specific level\n */\nexport function insertHeader(textarea, level = 1, toggle = false) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n if (level < 1 || level > 6) level = 1\n \n debugLog('insertHeader', `============ START ============`);\n debugLog('insertHeader', `Level: ${level}, Toggle: ${toggle}`);\n debugLog('insertHeader', `Initial cursor: ${textarea.selectionStart}-${textarea.selectionEnd}`);\n \n const headerKey = `header${level === 1 ? '1' : level}`\n const style = mergeWithDefaults(FORMATS[headerKey] || FORMATS.header1)\n debugLog('insertHeader', `Style prefix: \"${style.prefix}\"`);\n \n // Save original positions and get line info BEFORE applyLineOperation\n const value = textarea.value\n const originalStart = textarea.selectionStart\n const originalEnd = textarea.selectionEnd\n \n // Find the current line boundaries to check existing header\n let lineStart = originalStart\n while (lineStart > 0 && value[lineStart - 1] !== '\\n') {\n lineStart--\n }\n let lineEnd = originalEnd\n while (lineEnd < value.length && value[lineEnd] !== '\\n') {\n lineEnd++\n }\n \n // Get current line and check for existing header\n const currentLineContent = value.slice(lineStart, lineEnd)\n debugLog('insertHeader', `Current line (before): \"${currentLineContent}\"`);\n \n const existingHeaderMatch = currentLineContent.match(/^(#{1,6})\\s*/)\n const existingLevel = existingHeaderMatch ? existingHeaderMatch[1].length : 0\n const existingPrefixLength = existingHeaderMatch ? existingHeaderMatch[0].length : 0\n \n debugLog('insertHeader', `Existing header check:`);\n debugLog('insertHeader', ` - Match: ${existingHeaderMatch ? `\"${existingHeaderMatch[0]}\"` : 'none'}`);\n debugLog('insertHeader', ` - Existing level: ${existingLevel}`);\n debugLog('insertHeader', ` - Existing prefix length: ${existingPrefixLength}`);\n debugLog('insertHeader', ` - Target level: ${level}`);\n \n // Determine if we're toggling off\n const shouldToggleOff = toggle && existingLevel === level\n debugLog('insertHeader', `Should toggle OFF: ${shouldToggleOff} (toggle=${toggle}, existingLevel=${existingLevel}, level=${level})`);\n \n // Use applyLineOperation for consistent behavior\n const result = applyLineOperation(\n textarea,\n (ta) => {\n const currentLine = ta.value.slice(ta.selectionStart, ta.selectionEnd)\n debugLog('insertHeader', `Line in operation: \"${currentLine}\"`);\n \n // Remove any existing header formatting\n const cleanedLine = currentLine.replace(/^#{1,6}\\s*/, '')\n debugLog('insertHeader', `Cleaned line: \"${cleanedLine}\"`);\n \n let newLine\n \n if (shouldToggleOff) {\n // Toggle off - just use the cleaned line\n debugLog('insertHeader', 'ACTION: Toggling OFF - removing header');\n newLine = cleanedLine\n } else if (existingLevel > 0) {\n // Replace existing header with new one\n debugLog('insertHeader', `ACTION: Replacing H${existingLevel} with H${level}`);\n newLine = style.prefix + cleanedLine\n } else {\n // Add new header\n debugLog('insertHeader', 'ACTION: Adding new header');\n newLine = style.prefix + cleanedLine\n }\n \n debugLog('insertHeader', `New line: \"${newLine}\"`);\n \n return {\n text: newLine,\n selectionStart: ta.selectionStart,\n selectionEnd: ta.selectionEnd\n }\n },\n {\n prefix: style.prefix,\n // Custom selection adjustment for headers\n adjustSelection: (isRemoving, selStart, selEnd, lineStartPos) => {\n debugLog('insertHeader', `Adjusting selection:`);\n debugLog('insertHeader', ` - isRemoving param: ${isRemoving}`);\n debugLog('insertHeader', ` - shouldToggleOff: ${shouldToggleOff}`);\n debugLog('insertHeader', ` - selStart: ${selStart}, selEnd: ${selEnd}`);\n debugLog('insertHeader', ` - lineStartPos: ${lineStartPos}`);\n \n if (shouldToggleOff) {\n // Removing the header entirely\n const adjustment = Math.max(selStart - existingPrefixLength, lineStartPos)\n debugLog('insertHeader', ` - Removing header, adjusting by -${existingPrefixLength}`);\n return {\n start: adjustment,\n end: selStart === selEnd ? adjustment : Math.max(selEnd - existingPrefixLength, lineStartPos)\n }\n } else if (existingPrefixLength > 0) {\n // Replacing existing header with new one\n const prefixDiff = style.prefix.length - existingPrefixLength\n debugLog('insertHeader', ` - Replacing header, adjusting by ${prefixDiff}`);\n return {\n start: selStart + prefixDiff,\n end: selEnd + prefixDiff\n }\n } else {\n // Adding new header\n debugLog('insertHeader', ` - Adding header, adjusting by +${style.prefix.length}`);\n return {\n start: selStart + style.prefix.length,\n end: selEnd + style.prefix.length\n }\n }\n }\n }\n )\n \n debugLog('insertHeader', `Final result: text=\"${result.text}\", cursor=${result.selectionStart}-${result.selectionEnd}`);\n debugLog('insertHeader', `============ END ============`);\n \n insertText(textarea, result)\n}\n\n/**\n * Toggle H1 header\n */\nexport function toggleH1(textarea) {\n insertHeader(textarea, 1, true)\n}\n\n/**\n * Toggle H2 header\n */\nexport function toggleH2(textarea) {\n insertHeader(textarea, 2, true)\n}\n\n/**\n * Toggle H3 header\n */\nexport function toggleH3(textarea) {\n insertHeader(textarea, 3, true)\n}\n\n/**\n * Get active formats at cursor position\n */\nexport function getActiveFormats(textarea) {\n return getActive(textarea)\n}\n\n/**\n * Check if format is active at cursor\n */\nexport function hasFormat(textarea, format) {\n return has(textarea, format)\n}\n\n/**\n * Expand selection based on options\n */\nexport function expandSelection(textarea, options = {}) {\n expand(textarea, options)\n}\n\n/**\n * Apply custom format\n */\nexport function applyCustomFormat(textarea, format) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n \n const style = mergeWithDefaults(format)\n let result\n \n if (style.multiline) {\n const selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n if (isMultipleLines(selectedText)) {\n result = multilineStyle(textarea, style)\n } else {\n result = blockStyle(textarea, style)\n }\n } else {\n result = blockStyle(textarea, style)\n }\n \n insertText(textarea, result)\n}\n\n/**\n * Preserve selection during callback\n */\nexport { preserveSelection }\n\n/**\n * Configure undo method\n */\nexport { setUndoMethod }\n\n/**\n * Debug mode control\n */\nexport { setDebugMode, getDebugMode }\n\n/**\n * Default export with all functions\n */\nexport default {\n toggleBold,\n toggleItalic,\n toggleCode,\n insertLink,\n toggleBulletList,\n toggleNumberedList,\n toggleQuote,\n toggleTaskList,\n insertHeader,\n toggleH1,\n toggleH2,\n toggleH3,\n getActiveFormats,\n hasFormat,\n expandSelection,\n applyCustomFormat,\n preserveSelection,\n setUndoMethod,\n setDebugMode,\n getDebugMode\n}", "/**\n * Keyboard shortcuts handler for OverType editor\n * Uses the same handleAction method as toolbar for consistency\n */\n\nimport * as markdownActions from 'markdown-actions';\n\n/**\n * ShortcutsManager - Handles keyboard shortcuts for the editor\n */\nexport class ShortcutsManager {\n constructor(editor) {\n this.editor = editor;\n this.textarea = editor.textarea;\n // No need to add our own listener - OverType will call handleKeydown\n }\n\n /**\n * Handle keydown events - called by OverType\n * @param {KeyboardEvent} event - The keyboard event\n * @returns {boolean} Whether the event was handled\n */\n handleKeydown(event) {\n const isMac = navigator.platform.toLowerCase().includes('mac');\n const modKey = isMac ? event.metaKey : event.ctrlKey;\n\n if (!modKey) return false;\n\n let action = null;\n\n // Map keyboard shortcuts to toolbar actions\n switch(event.key.toLowerCase()) {\n case 'b':\n if (!event.shiftKey) {\n action = 'toggleBold';\n }\n break;\n\n case 'i':\n if (!event.shiftKey) {\n action = 'toggleItalic';\n }\n break;\n\n case 'k':\n if (!event.shiftKey) {\n action = 'insertLink';\n }\n break;\n\n case '7':\n if (event.shiftKey) {\n action = 'toggleNumberedList';\n }\n break;\n\n case '8':\n if (event.shiftKey) {\n action = 'toggleBulletList';\n }\n break;\n }\n\n // If we have an action, handle it exactly like the toolbar does\n if (action) {\n event.preventDefault();\n \n // If toolbar exists, use its handleAction method (exact same code path)\n if (this.editor.toolbar) {\n this.editor.toolbar.handleAction(action);\n } else {\n // Fallback: duplicate the toolbar's handleAction logic\n this.handleAction(action);\n }\n \n return true;\n }\n\n return false;\n }\n\n /**\n * Handle action - fallback when no toolbar exists\n * This duplicates toolbar.handleAction for consistency\n */\n async handleAction(action) {\n const textarea = this.textarea;\n if (!textarea) return;\n\n // Focus textarea\n textarea.focus();\n \n try {\n switch (action) {\n case 'toggleBold':\n markdownActions.toggleBold(textarea);\n break;\n case 'toggleItalic':\n markdownActions.toggleItalic(textarea);\n break;\n case 'insertLink':\n markdownActions.insertLink(textarea);\n break;\n case 'toggleBulletList':\n markdownActions.toggleBulletList(textarea);\n break;\n case 'toggleNumberedList':\n markdownActions.toggleNumberedList(textarea);\n break;\n }\n\n // Trigger input event to update preview\n textarea.dispatchEvent(new Event('input', { bubbles: true }));\n } catch (error) {\n console.error('Error in markdown action:', error);\n }\n }\n\n /**\n * Cleanup\n */\n destroy() {\n // Nothing to clean up since we don't add our own listener\n }\n}", "/**\n * Built-in themes for OverType editor\n * Each theme provides a complete color palette for the editor\n */\n\n/**\n * Solar theme - Light, warm and bright\n */\nexport const solar = {\n name: 'solar',\n colors: {\n bgPrimary: '#faf0ca', // Lemon Chiffon - main background\n bgSecondary: '#ffffff', // White - editor background\n text: '#0d3b66', // Yale Blue - main text\n h1: '#f95738', // Tomato - h1 headers\n h2: '#ee964b', // Sandy Brown - h2 headers \n h3: '#3d8a51', // Forest green - h3 headers\n strong: '#ee964b', // Sandy Brown - bold text\n em: '#f95738', // Tomato - italic text\n link: '#0d3b66', // Yale Blue - links\n code: '#0d3b66', // Yale Blue - inline code\n codeBg: 'rgba(244, 211, 94, 0.4)', // Naples Yellow with transparency\n blockquote: '#5a7a9b', // Muted blue - blockquotes\n hr: '#5a7a9b', // Muted blue - horizontal rules\n syntaxMarker: 'rgba(13, 59, 102, 0.52)', // Yale Blue with transparency\n cursor: '#f95738', // Tomato - cursor\n selection: 'rgba(244, 211, 94, 0.4)', // Naples Yellow with transparency\n listMarker: '#ee964b', // Sandy Brown - list markers\n // Toolbar colors\n toolbarBg: '#ffffff', // White - toolbar background\n toolbarBorder: 'rgba(13, 59, 102, 0.15)', // Yale Blue border\n toolbarIcon: '#0d3b66', // Yale Blue - icon color\n toolbarHover: '#f5f5f5', // Light gray - hover background\n toolbarActive: '#faf0ca', // Lemon Chiffon - active button background\n }\n};\n\n/**\n * Cave theme - Dark ocean depths\n */\nexport const cave = {\n name: 'cave',\n colors: {\n bgPrimary: '#141E26', // Deep ocean - main background\n bgSecondary: '#1D2D3E', // Darker charcoal - editor background\n text: '#c5dde8', // Light blue-gray - main text\n h1: '#d4a5ff', // Rich lavender - h1 headers\n h2: '#f6ae2d', // Hunyadi Yellow - h2 headers\n h3: '#9fcfec', // Brighter blue - h3 headers\n strong: '#f6ae2d', // Hunyadi Yellow - bold text\n em: '#9fcfec', // Brighter blue - italic text\n link: '#9fcfec', // Brighter blue - links\n code: '#c5dde8', // Light blue-gray - inline code\n codeBg: '#1a232b', // Very dark blue - code background\n blockquote: '#9fcfec', // Brighter blue - same as italic\n hr: '#c5dde8', // Light blue-gray - horizontal rules\n syntaxMarker: 'rgba(159, 207, 236, 0.73)', // Brighter blue semi-transparent\n cursor: '#f26419', // Orange Pantone - cursor\n selection: 'rgba(51, 101, 138, 0.4)', // Lapis Lazuli with transparency\n listMarker: '#f6ae2d', // Hunyadi Yellow - list markers\n // Toolbar colors for dark theme\n toolbarBg: '#1D2D3E', // Darker charcoal - toolbar background\n toolbarBorder: 'rgba(197, 221, 232, 0.1)', // Light blue-gray border\n toolbarIcon: '#c5dde8', // Light blue-gray - icon color\n toolbarHover: '#243546', // Slightly lighter charcoal - hover background\n toolbarActive: '#2a3f52', // Even lighter - active button background\n }\n};\n\n/**\n * Default themes registry\n */\nexport const themes = {\n solar,\n cave,\n // Aliases for backward compatibility\n light: solar,\n dark: cave\n};\n\n/**\n * Get theme by name or return custom theme object\n * @param {string|Object} theme - Theme name or custom theme object\n * @returns {Object} Theme configuration\n */\nexport function getTheme(theme) {\n if (typeof theme === 'string') {\n const themeObj = themes[theme] || themes.solar;\n // Preserve the requested theme name (important for 'light' and 'dark' aliases)\n return { ...themeObj, name: theme };\n }\n return theme;\n}\n\n/**\n * Apply theme colors to CSS variables\n * @param {Object} colors - Theme colors object\n * @returns {string} CSS custom properties string\n */\nexport function themeToCSSVars(colors) {\n const vars = [];\n for (const [key, value] of Object.entries(colors)) {\n // Convert camelCase to kebab-case\n const varName = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n vars.push(`--${varName}: ${value};`);\n }\n return vars.join('\\n');\n}\n\n/**\n * Merge custom colors with base theme\n * @param {Object} baseTheme - Base theme object\n * @param {Object} customColors - Custom color overrides\n * @returns {Object} Merged theme object\n */\nexport function mergeTheme(baseTheme, customColors = {}) {\n return {\n ...baseTheme,\n colors: {\n ...baseTheme.colors,\n ...customColors\n }\n };\n}", "/**\n * CSS styles for OverType editor\n * Embedded in JavaScript to ensure single-file distribution\n */\n\nimport { themeToCSSVars } from './themes.js';\n\n/**\n * Generate the complete CSS for the editor\n * @param {Object} options - Configuration options\n * @returns {string} Complete CSS string\n */\nexport function generateStyles(options = {}) {\n const {\n fontSize = '14px',\n lineHeight = 1.6,\n /* System-first, guaranteed monospaced; avoids Android 'ui-monospace' pitfalls */\n fontFamily = '\"SF Mono\", SFMono-Regular, Menlo, Monaco, \"Cascadia Code\", Consolas, \"Roboto Mono\", \"Noto Sans Mono\", \"Droid Sans Mono\", \"Ubuntu Mono\", \"DejaVu Sans Mono\", \"Liberation Mono\", \"Courier New\", Courier, monospace',\n padding = '20px',\n theme = null,\n mobile = {}\n } = options;\n\n // Generate mobile overrides\n const mobileStyles = Object.keys(mobile).length > 0 ? `\n @media (max-width: 640px) {\n .overtype-wrapper .overtype-input,\n .overtype-wrapper .overtype-preview {\n ${Object.entries(mobile)\n .map(([prop, val]) => {\n const cssProp = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `${cssProp}: ${val} !important;`;\n })\n .join('\\n ')}\n }\n }\n ` : '';\n\n // Generate theme variables if provided\n const themeVars = theme && theme.colors ? themeToCSSVars(theme.colors) : '';\n\n return `\n /* OverType Editor Styles */\n \n /* Middle-ground CSS Reset - Prevent parent styles from leaking in */\n .overtype-container * {\n /* Box model - these commonly leak */\n margin: 0 !important;\n padding: 0 !important;\n border: 0 !important;\n \n /* Layout - these can break our layout */\n /* Don't reset position - it breaks dropdowns */\n float: none !important;\n clear: none !important;\n \n /* Typography - only reset decorative aspects */\n text-decoration: none !important;\n text-transform: none !important;\n letter-spacing: normal !important;\n \n /* Visual effects that can interfere */\n box-shadow: none !important;\n text-shadow: none !important;\n \n /* Ensure box-sizing is consistent */\n box-sizing: border-box !important;\n \n /* Keep inheritance for these */\n /* font-family, color, line-height, font-size - inherit */\n }\n \n /* Container base styles after reset */\n .overtype-container {\n display: grid !important;\n grid-template-rows: auto 1fr auto !important;\n width: 100% !important;\n height: 100% !important;\n position: relative !important; /* Override reset - needed for absolute children */\n overflow: visible !important; /* Allow dropdown to overflow container */\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n text-align: left !important;\n ${themeVars ? `\n /* Theme Variables */\n ${themeVars}` : ''}\n }\n \n /* Force left alignment for all elements in the editor */\n .overtype-container .overtype-wrapper * {\n text-align: left !important;\n }\n \n /* Auto-resize mode styles */\n .overtype-container.overtype-auto-resize {\n height: auto !important;\n grid-template-rows: auto auto auto !important;\n }\n \n .overtype-container.overtype-auto-resize .overtype-wrapper {\n height: auto !important;\n min-height: 60px !important;\n overflow: visible !important;\n }\n \n .overtype-wrapper {\n position: relative !important; /* Override reset - needed for absolute children */\n width: 100% !important;\n height: 100% !important; /* Take full height of grid cell */\n min-height: 60px !important; /* Minimum usable height */\n overflow: hidden !important;\n background: var(--bg-secondary, #ffffff) !important;\n grid-row: 2 !important; /* Always second row in grid */\n z-index: 1; /* Below toolbar and dropdown */\n }\n\n /* Critical alignment styles - must be identical for both layers */\n .overtype-wrapper .overtype-input,\n .overtype-wrapper .overtype-preview {\n /* Positioning - must be identical */\n position: absolute !important; /* Override reset - required for overlay */\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n \n /* Font properties - any difference breaks alignment */\n font-family: ${fontFamily} !important;\n font-variant-ligatures: none !important; /* keep metrics stable for code */\n font-size: var(--instance-font-size, ${fontSize}) !important;\n line-height: var(--instance-line-height, ${lineHeight}) !important;\n font-weight: normal !important;\n font-style: normal !important;\n font-variant: normal !important;\n font-stretch: normal !important;\n font-kerning: none !important;\n font-feature-settings: normal !important;\n \n /* Box model - must match exactly */\n padding: var(--instance-padding, ${padding}) !important;\n margin: 0 !important;\n border: none !important;\n outline: none !important;\n box-sizing: border-box !important;\n \n /* Text layout - critical for character positioning */\n white-space: pre-wrap !important;\n word-wrap: break-word !important;\n word-break: normal !important;\n overflow-wrap: break-word !important;\n tab-size: 2 !important;\n -moz-tab-size: 2 !important;\n text-align: left !important;\n text-indent: 0 !important;\n letter-spacing: normal !important;\n word-spacing: normal !important;\n \n /* Text rendering */\n text-transform: none !important;\n text-rendering: auto !important;\n -webkit-font-smoothing: auto !important;\n -webkit-text-size-adjust: 100% !important;\n \n /* Direction and writing */\n direction: ltr !important;\n writing-mode: horizontal-tb !important;\n unicode-bidi: normal !important;\n text-orientation: mixed !important;\n \n /* Visual effects that could shift perception */\n text-shadow: none !important;\n filter: none !important;\n transform: none !important;\n zoom: 1 !important;\n \n /* Vertical alignment */\n vertical-align: baseline !important;\n \n /* Size constraints */\n min-width: 0 !important;\n min-height: 0 !important;\n max-width: none !important;\n max-height: none !important;\n \n /* Overflow */\n overflow-y: auto !important;\n overflow-x: auto !important;\n /* overscroll-behavior removed to allow scroll-through to parent */\n scrollbar-width: auto !important;\n scrollbar-gutter: auto !important;\n \n /* Animation/transition - disabled to prevent movement */\n animation: none !important;\n transition: none !important;\n }\n\n /* Input layer styles */\n .overtype-wrapper .overtype-input {\n /* Layer positioning */\n z-index: 1 !important;\n \n /* Text visibility */\n color: transparent !important;\n caret-color: var(--cursor, #f95738) !important;\n background-color: transparent !important;\n \n /* Textarea-specific */\n resize: none !important;\n appearance: none !important;\n -webkit-appearance: none !important;\n -moz-appearance: none !important;\n \n /* Prevent mobile zoom on focus */\n touch-action: manipulation !important;\n \n /* Disable autofill and spellcheck */\n autocomplete: off !important;\n autocorrect: off !important;\n autocapitalize: off !important;\n spellcheck: false !important;\n }\n\n .overtype-wrapper .overtype-input::selection {\n background-color: var(--selection, rgba(244, 211, 94, 0.4));\n }\n\n /* Preview layer styles */\n .overtype-wrapper .overtype-preview {\n /* Layer positioning */\n z-index: 0 !important;\n pointer-events: none !important;\n color: var(--text, #0d3b66) !important;\n background-color: transparent !important;\n \n /* Prevent text selection */\n user-select: none !important;\n -webkit-user-select: none !important;\n -moz-user-select: none !important;\n -ms-user-select: none !important;\n }\n\n /* Defensive styles for preview child divs */\n .overtype-wrapper .overtype-preview div {\n /* Reset any inherited styles */\n margin: 0 !important;\n padding: 0 !important;\n border: none !important;\n text-align: left !important;\n text-indent: 0 !important;\n display: block !important;\n position: static !important;\n transform: none !important;\n min-height: 0 !important;\n max-height: none !important;\n line-height: inherit !important;\n font-size: inherit !important;\n font-family: inherit !important;\n }\n\n /* Markdown element styling - NO SIZE CHANGES */\n .overtype-wrapper .overtype-preview .header {\n font-weight: bold !important;\n }\n\n /* Header colors */\n .overtype-wrapper .overtype-preview .h1 { \n color: var(--h1, #f95738) !important; \n }\n .overtype-wrapper .overtype-preview .h2 { \n color: var(--h2, #ee964b) !important; \n }\n .overtype-wrapper .overtype-preview .h3 { \n color: var(--h3, #3d8a51) !important; \n }\n\n /* Semantic headers - flatten in edit mode */\n .overtype-wrapper .overtype-preview h1,\n .overtype-wrapper .overtype-preview h2,\n .overtype-wrapper .overtype-preview h3 {\n font-size: inherit !important;\n font-weight: bold !important;\n margin: 0 !important;\n padding: 0 !important;\n display: inline !important;\n line-height: inherit !important;\n }\n\n /* Header colors for semantic headers */\n .overtype-wrapper .overtype-preview h1 { \n color: var(--h1, #f95738) !important; \n }\n .overtype-wrapper .overtype-preview h2 { \n color: var(--h2, #ee964b) !important; \n }\n .overtype-wrapper .overtype-preview h3 { \n color: var(--h3, #3d8a51) !important; \n }\n\n /* Lists - remove styling in edit mode */\n .overtype-wrapper .overtype-preview ul,\n .overtype-wrapper .overtype-preview ol {\n list-style: none !important;\n margin: 0 !important;\n padding: 0 !important;\n display: block !important; /* Lists need to be block for line breaks */\n }\n\n .overtype-wrapper .overtype-preview li {\n display: block !important; /* Each item on its own line */\n margin: 0 !important;\n padding: 0 !important;\n /* Don't set list-style here - let ul/ol control it */\n }\n\n /* Bold text */\n .overtype-wrapper .overtype-preview strong {\n color: var(--strong, #ee964b) !important;\n font-weight: bold !important;\n }\n\n /* Italic text */\n .overtype-wrapper .overtype-preview em {\n color: var(--em, #f95738) !important;\n text-decoration-color: var(--em, #f95738) !important;\n text-decoration-thickness: 1px !important;\n font-style: italic !important;\n }\n\n /* Inline code */\n .overtype-wrapper .overtype-preview code {\n background: var(--code-bg, rgba(244, 211, 94, 0.4)) !important;\n color: var(--code, #0d3b66) !important;\n padding: 0 !important;\n border-radius: 2px !important;\n font-family: inherit !important;\n font-size: inherit !important;\n line-height: inherit !important;\n font-weight: normal !important;\n }\n\n /* Code blocks - consolidated pre blocks */\n .overtype-wrapper .overtype-preview pre {\n padding: 0 !important;\n margin: 0 !important;\n border-radius: 4px !important;\n overflow-x: auto !important;\n }\n \n /* Code block styling in normal mode - yellow background */\n .overtype-wrapper .overtype-preview pre.code-block {\n background: var(--code-bg, rgba(244, 211, 94, 0.4)) !important;\n }\n\n /* Code inside pre blocks - remove background */\n .overtype-wrapper .overtype-preview pre code {\n background: transparent !important;\n color: var(--code, #0d3b66) !important;\n }\n\n /* Blockquotes */\n .overtype-wrapper .overtype-preview .blockquote {\n color: var(--blockquote, #5a7a9b) !important;\n padding: 0 !important;\n margin: 0 !important;\n border: none !important;\n }\n\n /* Links */\n .overtype-wrapper .overtype-preview a {\n color: var(--link, #0d3b66) !important;\n text-decoration: underline !important;\n font-weight: normal !important;\n }\n\n .overtype-wrapper .overtype-preview a:hover {\n text-decoration: underline !important;\n color: var(--link, #0d3b66) !important;\n }\n\n /* Lists - no list styling */\n .overtype-wrapper .overtype-preview ul,\n .overtype-wrapper .overtype-preview ol {\n list-style: none !important;\n margin: 0 !important;\n padding: 0 !important;\n }\n\n\n /* Horizontal rules */\n .overtype-wrapper .overtype-preview hr {\n border: none !important;\n color: var(--hr, #5a7a9b) !important;\n margin: 0 !important;\n padding: 0 !important;\n }\n\n .overtype-wrapper .overtype-preview .hr-marker {\n color: var(--hr, #5a7a9b) !important;\n opacity: 0.6 !important;\n }\n\n /* Code fence markers - with background when not in code block */\n .overtype-wrapper .overtype-preview .code-fence {\n color: var(--code, #0d3b66) !important;\n background: var(--code-bg, rgba(244, 211, 94, 0.4)) !important;\n }\n \n /* Code block lines - background for entire code block */\n .overtype-wrapper .overtype-preview .code-block-line {\n background: var(--code-bg, rgba(244, 211, 94, 0.4)) !important;\n }\n \n /* Remove background from code fence when inside code block line */\n .overtype-wrapper .overtype-preview .code-block-line .code-fence {\n background: transparent !important;\n }\n\n /* Raw markdown line */\n .overtype-wrapper .overtype-preview .raw-line {\n color: var(--raw-line, #5a7a9b) !important;\n font-style: normal !important;\n font-weight: normal !important;\n }\n\n /* Syntax markers */\n .overtype-wrapper .overtype-preview .syntax-marker {\n color: var(--syntax-marker, rgba(13, 59, 102, 0.52)) !important;\n opacity: 0.7 !important;\n }\n\n /* List markers */\n .overtype-wrapper .overtype-preview .list-marker {\n color: var(--list-marker, #ee964b) !important;\n }\n\n /* Stats bar */\n \n /* Stats bar - positioned by grid, not absolute */\n .overtype-stats {\n height: 40px !important;\n padding: 0 20px !important;\n background: #f8f9fa !important;\n border-top: 1px solid #e0e0e0 !important;\n display: flex !important;\n justify-content: space-between !important;\n align-items: center !important;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;\n font-size: 0.85rem !important;\n color: #666 !important;\n grid-row: 3 !important; /* Always third row in grid */\n }\n \n /* Dark theme stats bar */\n .overtype-container[data-theme=\"cave\"] .overtype-stats {\n background: var(--bg-secondary, #1D2D3E) !important;\n border-top: 1px solid rgba(197, 221, 232, 0.1) !important;\n color: var(--text, #c5dde8) !important;\n }\n \n .overtype-stats .overtype-stat {\n display: flex !important;\n align-items: center !important;\n gap: 5px !important;\n white-space: nowrap !important;\n }\n \n .overtype-stats .live-dot {\n width: 8px !important;\n height: 8px !important;\n background: #4caf50 !important;\n border-radius: 50% !important;\n animation: pulse 2s infinite !important;\n }\n \n @keyframes pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.6; transform: scale(1.2); }\n }\n \n\n /* Toolbar Styles */\n .overtype-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px !important; /* Override reset */\n background: var(--toolbar-bg, var(--bg-primary, #f8f9fa)) !important; /* Override reset */\n overflow-x: auto !important; /* Allow horizontal scrolling */\n overflow-y: hidden !important; /* Hide vertical overflow */\n -webkit-overflow-scrolling: touch;\n flex-shrink: 0;\n height: auto !important;\n grid-row: 1 !important; /* Always first row in grid */\n position: relative !important; /* Override reset */\n z-index: 100; /* Ensure toolbar is above wrapper */\n scrollbar-width: thin; /* Thin scrollbar on Firefox */\n }\n \n /* Thin scrollbar styling */\n .overtype-toolbar::-webkit-scrollbar {\n height: 4px;\n }\n \n .overtype-toolbar::-webkit-scrollbar-track {\n background: transparent;\n }\n \n .overtype-toolbar::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.2);\n border-radius: 2px;\n }\n\n .overtype-toolbar-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--toolbar-icon, var(--text-secondary, #666));\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n }\n\n .overtype-toolbar-button svg {\n width: 20px;\n height: 20px;\n fill: currentColor;\n }\n\n .overtype-toolbar-button:hover {\n background: var(--toolbar-hover, var(--bg-secondary, #e9ecef));\n color: var(--toolbar-icon, var(--text-primary, #333));\n }\n\n .overtype-toolbar-button:active {\n transform: scale(0.95);\n }\n\n .overtype-toolbar-button.active {\n background: var(--toolbar-active, var(--primary, #007bff));\n color: var(--toolbar-icon, var(--text-primary, #333));\n }\n\n .overtype-toolbar-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .overtype-toolbar-separator {\n width: 1px;\n height: 24px;\n background: var(--border, #e0e0e0);\n margin: 0 4px;\n flex-shrink: 0;\n }\n\n /* Adjust wrapper when toolbar is present */\n .overtype-container .overtype-toolbar + .overtype-wrapper {\n }\n\n /* Mobile toolbar adjustments */\n @media (max-width: 640px) {\n .overtype-toolbar {\n padding: 6px;\n gap: 2px;\n }\n\n .overtype-toolbar-button {\n width: 36px;\n height: 36px;\n }\n\n .overtype-toolbar-separator {\n margin: 0 2px;\n }\n }\n \n /* Plain mode - hide preview and show textarea text */\n .overtype-container.plain-mode .overtype-preview {\n display: none !important;\n }\n \n .overtype-container.plain-mode .overtype-input {\n color: var(--text, #0d3b66) !important;\n /* Use system font stack for better plain text readability */\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \n \"Helvetica Neue\", Arial, sans-serif !important;\n }\n \n /* Ensure textarea remains transparent in overlay mode */\n .overtype-container:not(.plain-mode) .overtype-input {\n color: transparent !important;\n }\n\n /* Dropdown menu styles */\n .overtype-toolbar-button {\n position: relative !important; /* Override reset - needed for dropdown */\n }\n\n .overtype-toolbar-button.dropdown-active {\n background: var(--toolbar-active, var(--hover-bg, #f0f0f0));\n }\n\n .overtype-dropdown-menu {\n position: fixed !important; /* Fixed positioning relative to viewport */\n background: var(--bg-secondary, white) !important; /* Override reset */\n border: 1px solid var(--border, #e0e0e0) !important; /* Override reset */\n border-radius: 6px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1) !important; /* Override reset */\n z-index: 10000; /* Very high z-index to ensure visibility */\n min-width: 150px;\n padding: 4px 0 !important; /* Override reset */\n /* Position will be set via JavaScript based on button position */\n }\n\n .overtype-dropdown-item {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 8px 12px;\n border: none;\n background: none;\n text-align: left;\n cursor: pointer;\n font-size: 14px;\n color: var(--text, #333);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n }\n\n .overtype-dropdown-item:hover {\n background: var(--hover-bg, #f0f0f0);\n }\n\n .overtype-dropdown-item.active {\n font-weight: 600;\n }\n\n .overtype-dropdown-check {\n width: 16px;\n margin-right: 8px;\n color: var(--h1, #007bff);\n }\n\n /* Preview mode styles */\n .overtype-container.preview-mode .overtype-input {\n display: none !important;\n }\n\n .overtype-container.preview-mode .overtype-preview {\n pointer-events: auto !important;\n user-select: text !important;\n cursor: text !important;\n }\n\n /* Hide syntax markers in preview mode */\n .overtype-container.preview-mode .syntax-marker {\n display: none !important;\n }\n \n /* Hide URL part of links in preview mode - extra specificity */\n .overtype-container.preview-mode .syntax-marker.url-part,\n .overtype-container.preview-mode .url-part {\n display: none !important;\n }\n \n /* Hide all syntax markers inside links too */\n .overtype-container.preview-mode a .syntax-marker {\n display: none !important;\n }\n\n /* Headers - restore proper sizing in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview h1, \n .overtype-container.preview-mode .overtype-wrapper .overtype-preview h2, \n .overtype-container.preview-mode .overtype-wrapper .overtype-preview h3 {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-weight: 600 !important;\n margin: 0 !important;\n display: block !important;\n color: inherit !important; /* Use parent text color */\n line-height: 1 !important; /* Tight line height for headings */\n }\n \n .overtype-container.preview-mode .overtype-wrapper .overtype-preview h1 { \n font-size: 2em !important; \n }\n \n .overtype-container.preview-mode .overtype-wrapper .overtype-preview h2 { \n font-size: 1.5em !important; \n }\n \n .overtype-container.preview-mode .overtype-wrapper .overtype-preview h3 { \n font-size: 1.17em !important; \n }\n\n /* Lists - restore list styling in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview ul {\n display: block !important;\n list-style: disc !important;\n padding-left: 2em !important;\n margin: 1em 0 !important;\n }\n\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview ol {\n display: block !important;\n list-style: decimal !important;\n padding-left: 2em !important;\n margin: 1em 0 !important;\n }\n \n .overtype-container.preview-mode .overtype-wrapper .overtype-preview li {\n display: list-item !important;\n margin: 0 !important;\n padding: 0 !important;\n }\n\n /* Links - make clickable in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview a {\n pointer-events: auto !important;\n cursor: pointer !important;\n color: var(--link, #0066cc) !important;\n text-decoration: underline !important;\n }\n\n /* Code blocks - proper pre/code styling in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview pre.code-block {\n background: #2d2d2d !important;\n color: #f8f8f2 !important;\n padding: 1.2em !important;\n border-radius: 3px !important;\n overflow-x: auto !important;\n margin: 0 !important;\n display: block !important;\n }\n \n /* Cave theme code block background in preview mode */\n .overtype-container[data-theme=\"cave\"].preview-mode .overtype-wrapper .overtype-preview pre.code-block {\n background: #11171F !important;\n }\n\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview pre.code-block code {\n background: transparent !important;\n color: inherit !important;\n padding: 0 !important;\n font-family: ${fontFamily} !important;\n font-size: 0.9em !important;\n line-height: 1.4 !important;\n }\n\n /* Hide old code block lines and fences in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview .code-block-line {\n display: none !important;\n }\n\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview .code-fence {\n display: none !important;\n }\n\n /* Blockquotes - enhanced styling in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview .blockquote {\n display: block !important;\n border-left: 4px solid var(--blockquote, #ddd) !important;\n padding-left: 1em !important;\n margin: 1em 0 !important;\n font-style: italic !important;\n }\n\n /* Typography improvements in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview {\n font-family: Georgia, 'Times New Roman', serif !important;\n font-size: 16px !important;\n line-height: 1.8 !important;\n color: var(--text, #333) !important; /* Consistent text color */\n }\n\n /* Inline code in preview mode - keep monospace */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview code {\n font-family: ${fontFamily} !important;\n font-size: 0.9em !important;\n background: rgba(135, 131, 120, 0.15) !important;\n padding: 0.2em 0.4em !important;\n border-radius: 3px !important;\n }\n\n /* Strong and em elements in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview strong {\n font-weight: 700 !important;\n color: inherit !important; /* Use parent text color */\n }\n\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview em {\n font-style: italic !important;\n color: inherit !important; /* Use parent text color */\n }\n\n /* HR in preview mode */\n .overtype-container.preview-mode .overtype-wrapper .overtype-preview .hr-marker {\n display: block !important;\n border-top: 2px solid var(--hr, #ddd) !important;\n text-indent: -9999px !important;\n height: 2px !important;\n }\n\n ${mobileStyles}\n `;\n}", "/**\n * SVG icons for OverType toolbar\n * Quill-style icons with inline styles\n */\n\nexport const boldIcon = `<svg viewBox=\"0 0 18 18\">\n <path stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5,4H9.5A2.5,2.5,0,0,1,12,6.5v0A2.5,2.5,0,0,1,9.5,9H5A0,0,0,0,1,5,9V4A0,0,0,0,1,5,4Z\"></path>\n <path stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5,9h5.5A2.5,2.5,0,0,1,13,11.5v0A2.5,2.5,0,0,1,10.5,14H5a0,0,0,0,1,0,0V9A0,0,0,0,1,5,9Z\"></path>\n</svg>`;\n\nexport const italicIcon = `<svg viewBox=\"0 0 18 18\">\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"7\" x2=\"13\" y1=\"4\" y2=\"4\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"5\" x2=\"11\" y1=\"14\" y2=\"14\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"8\" x2=\"10\" y1=\"14\" y2=\"4\"></line>\n</svg>`;\n\nexport const h1Icon = `<svg viewBox=\"0 0 18 18\">\n <path fill=\"currentColor\" d=\"M10,4V14a1,1,0,0,1-2,0V10H3v4a1,1,0,0,1-2,0V4A1,1,0,0,1,3,4V8H8V4a1,1,0,0,1,2,0Zm6.06787,9.209H14.98975V7.59863a.54085.54085,0,0,0-.605-.60547h-.62744a1.01119,1.01119,0,0,0-.748.29688L11.645,8.56641a.5435.5435,0,0,0-.022.8584l.28613.30762a.53861.53861,0,0,0,.84717.0332l.09912-.08789a1.2137,1.2137,0,0,0,.2417-.35254h.02246s-.01123.30859-.01123.60547V13.209H12.041a.54085.54085,0,0,0-.605.60547v.43945a.54085.54085,0,0,0,.605.60547h4.02686a.54085.54085,0,0,0,.605-.60547v-.43945A.54085.54085,0,0,0,16.06787,13.209Z\"></path>\n</svg>`;\n\nexport const h2Icon = `<svg viewBox=\"0 0 18 18\">\n <path fill=\"currentColor\" d=\"M16.73975,13.81445v.43945a.54085.54085,0,0,1-.605.60547H11.855a.58392.58392,0,0,1-.64893-.60547V14.0127c0-2.90527,3.39941-3.42187,3.39941-4.55469a.77675.77675,0,0,0-.84717-.78125,1.17684,1.17684,0,0,0-.83594.38477c-.2749.26367-.561.374-.85791.13184l-.4292-.34082c-.30811-.24219-.38525-.51758-.1543-.81445a2.97155,2.97155,0,0,1,2.45361-1.17676,2.45393,2.45393,0,0,1,2.68408,2.40918c0,2.45312-3.1792,2.92676-3.27832,3.93848h2.79443A.54085.54085,0,0,1,16.73975,13.81445ZM9,3A.99974.99974,0,0,0,8,4V8H3V4A1,1,0,0,0,1,4V14a1,1,0,0,0,2,0V10H8v4a1,1,0,0,0,2,0V4A.99974.99974,0,0,0,9,3Z\"></path>\n</svg>`;\n\nexport const h3Icon = `<svg viewBox=\"0 0 18 18\">\n <path fill=\"currentColor\" d=\"M16.65186,12.30664a2.6742,2.6742,0,0,1-2.915,2.68457,3.96592,3.96592,0,0,1-2.25537-.6709.56007.56007,0,0,1-.13232-.83594L11.64648,13c.209-.34082.48389-.36328.82471-.1543a2.32654,2.32654,0,0,0,1.12256.33008c.71484,0,1.12207-.35156,1.12207-.78125,0-.61523-.61621-.86816-1.46338-.86816H13.2085a.65159.65159,0,0,1-.68213-.41895l-.05518-.10937a.67114.67114,0,0,1,.14307-.78125l.71533-.86914a8.55289,8.55289,0,0,1,.68213-.7373V8.58887a3.93913,3.93913,0,0,1-.748.05469H11.9873a.54085.54085,0,0,1-.605-.60547V7.59863a.54085.54085,0,0,1,.605-.60547h3.75146a.53773.53773,0,0,1,.60547.59375v.17676a1.03723,1.03723,0,0,1-.27539.748L14.74854,10.0293A2.31132,2.31132,0,0,1,16.65186,12.30664ZM9,3A.99974.99974,0,0,0,8,4V8H3V4A1,1,0,0,0,1,4V14a1,1,0,0,0,2,0V10H8v4a1,1,0,0,0,2,0V4A.99974.99974,0,0,0,9,3Z\"></path>\n</svg>`;\n\nexport const linkIcon = `<svg viewBox=\"0 0 18 18\">\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"7\" x2=\"11\" y1=\"7\" y2=\"11\"></line>\n <path stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8.9,4.577a3.476,3.476,0,0,1,.36,4.679A3.476,3.476,0,0,1,4.577,8.9C3.185,7.5,2.035,6.4,4.217,4.217S7.5,3.185,8.9,4.577Z\"></path>\n <path stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13.423,9.1a3.476,3.476,0,0,0-4.679-.36,3.476,3.476,0,0,0,.36,4.679c1.392,1.392,2.5,2.542,4.679.36S14.815,10.5,13.423,9.1Z\"></path>\n</svg>`;\n\nexport const codeIcon = `<svg viewBox=\"0 0 18 18\">\n <polyline stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" points=\"5 7 3 9 5 11\"></polyline>\n <polyline stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" points=\"13 7 15 9 13 11\"></polyline>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"10\" x2=\"8\" y1=\"5\" y2=\"13\"></line>\n</svg>`;\n\n\nexport const bulletListIcon = `<svg viewBox=\"0 0 18 18\">\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"6\" x2=\"15\" y1=\"4\" y2=\"4\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"6\" x2=\"15\" y1=\"9\" y2=\"9\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"6\" x2=\"15\" y1=\"14\" y2=\"14\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"3\" x2=\"3\" y1=\"4\" y2=\"4\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"3\" x2=\"3\" y1=\"9\" y2=\"9\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"3\" x2=\"3\" y1=\"14\" y2=\"14\"></line>\n</svg>`;\n\nexport const orderedListIcon = `<svg viewBox=\"0 0 18 18\">\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"7\" x2=\"15\" y1=\"4\" y2=\"4\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"7\" x2=\"15\" y1=\"9\" y2=\"9\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"7\" x2=\"15\" y1=\"14\" y2=\"14\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1\" x1=\"2.5\" x2=\"4.5\" y1=\"5.5\" y2=\"5.5\"></line>\n <path fill=\"currentColor\" d=\"M3.5,6A0.5,0.5,0,0,1,3,5.5V3.085l-0.276.138A0.5,0.5,0,0,1,2.053,3c-0.124-.247-0.023-0.324.224-0.447l1-.5A0.5,0.5,0,0,1,4,2.5v3A0.5,0.5,0,0,1,3.5,6Z\"></path>\n <path stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1\" d=\"M4.5,10.5h-2c0-.234,1.85-1.076,1.85-2.234A0.959,0.959,0,0,0,2.5,8.156\"></path>\n <path stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1\" d=\"M2.5,14.846a0.959,0.959,0,0,0,1.85-.109A0.7,0.7,0,0,0,3.75,14a0.688,0.688,0,0,0,.6-0.736,0.959,0.959,0,0,0-1.85-.109\"></path>\n</svg>`;\n\nexport const quoteIcon = `<svg viewBox=\"2 2 20 20\">\n <path stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M10 10.8182L9 10.8182C8.80222 10.8182 8.60888 10.7649 8.44443 10.665C8.27998 10.5651 8.15181 10.4231 8.07612 10.257C8.00043 10.0909 7.98063 9.90808 8.01922 9.73174C8.0578 9.55539 8.15304 9.39341 8.29289 9.26627C8.43275 9.13913 8.61093 9.05255 8.80491 9.01747C8.99889 8.98239 9.19996 9.00039 9.38268 9.0692C9.56541 9.13801 9.72159 9.25453 9.83147 9.40403C9.94135 9.55353 10 9.72929 10 9.90909L10 12.1818C10 12.664 9.78929 13.1265 9.41421 13.4675C9.03914 13.8084 8.53043 14 8 14\"></path>\n <path stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16 10.8182L15 10.8182C14.8022 10.8182 14.6089 10.7649 14.4444 10.665C14.28 10.5651 14.1518 10.4231 14.0761 10.257C14.0004 10.0909 13.9806 9.90808 14.0192 9.73174C14.0578 9.55539 14.153 9.39341 14.2929 9.26627C14.4327 9.13913 14.6109 9.05255 14.8049 9.01747C14.9989 8.98239 15.2 9.00039 15.3827 9.0692C15.5654 9.13801 15.7216 9.25453 15.8315 9.40403C15.9414 9.55353 16 9.72929 16 9.90909L16 12.1818C16 12.664 15.7893 13.1265 15.4142 13.4675C15.0391 13.8084 14.5304 14 14 14\"></path>\n</svg>`;\n\nexport const taskListIcon = `<svg viewBox=\"0 0 18 18\">\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"8\" x2=\"16\" y1=\"4\" y2=\"4\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"8\" x2=\"16\" y1=\"9\" y2=\"9\"></line>\n <line stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" x1=\"8\" x2=\"16\" y1=\"14\" y2=\"14\"></line>\n <rect stroke=\"currentColor\" fill=\"none\" stroke-width=\"1.5\" x=\"2\" y=\"3\" width=\"3\" height=\"3\" rx=\"0.5\"></rect>\n <rect stroke=\"currentColor\" fill=\"none\" stroke-width=\"1.5\" x=\"2\" y=\"13\" width=\"3\" height=\"3\" rx=\"0.5\"></rect>\n <polyline stroke=\"currentColor\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" points=\"2.65 9.5 3.5 10.5 5 8.5\"></polyline>\n</svg>`;\n\nexport const eyeIcon = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" fill=\"none\"></path>\n <circle cx=\"12\" cy=\"12\" r=\"3\" fill=\"none\"></circle>\n</svg>`;", "/**\n * Toolbar component for OverType editor\n * Provides markdown formatting buttons with icons\n */\n\nimport * as icons from './icons.js';\nimport * as markdownActions from 'markdown-actions';\n\nexport class Toolbar {\n constructor(editor) {\n this.editor = editor;\n this.container = null;\n this.buttons = {};\n }\n\n /**\n * Create and attach toolbar to editor\n */\n create() {\n // Create toolbar container\n this.container = document.createElement('div');\n this.container.className = 'overtype-toolbar';\n this.container.setAttribute('role', 'toolbar');\n this.container.setAttribute('aria-label', 'Text formatting');\n\n // Define toolbar buttons\n const buttonConfig = [\n { name: 'bold', icon: icons.boldIcon, title: 'Bold (Ctrl+B)', action: 'toggleBold' },\n { name: 'italic', icon: icons.italicIcon, title: 'Italic (Ctrl+I)', action: 'toggleItalic' },\n { separator: true },\n { name: 'h1', icon: icons.h1Icon, title: 'Heading 1', action: 'insertH1' },\n { name: 'h2', icon: icons.h2Icon, title: 'Heading 2', action: 'insertH2' },\n { name: 'h3', icon: icons.h3Icon, title: 'Heading 3', action: 'insertH3' },\n { separator: true },\n { name: 'link', icon: icons.linkIcon, title: 'Insert Link (Ctrl+K)', action: 'insertLink' },\n { name: 'code', icon: icons.codeIcon, title: 'Code (Ctrl+`)', action: 'toggleCode' },\n { separator: true },\n { name: 'quote', icon: icons.quoteIcon, title: 'Quote', action: 'toggleQuote' },\n { separator: true },\n { name: 'bulletList', icon: icons.bulletListIcon, title: 'Bullet List', action: 'toggleBulletList' },\n { name: 'orderedList', icon: icons.orderedListIcon, title: 'Numbered List', action: 'toggleNumberedList' },\n { name: 'taskList', icon: icons.taskListIcon, title: 'Task List', action: 'toggleTaskList' },\n { separator: true },\n { name: 'viewMode', icon: icons.eyeIcon, title: 'View mode', action: 'toggle-view-menu', hasDropdown: true }\n ];\n\n // Create buttons\n buttonConfig.forEach(config => {\n if (config.separator) {\n const separator = document.createElement('div');\n separator.className = 'overtype-toolbar-separator';\n separator.setAttribute('role', 'separator');\n this.container.appendChild(separator);\n } else {\n const button = this.createButton(config);\n this.buttons[config.name] = button;\n this.container.appendChild(button);\n }\n });\n\n // Insert toolbar into container before editor wrapper\n const container = this.editor.element.querySelector('.overtype-container');\n const wrapper = this.editor.element.querySelector('.overtype-wrapper');\n if (container && wrapper) {\n container.insertBefore(this.container, wrapper);\n }\n\n return this.container;\n }\n\n /**\n * Create individual toolbar button\n */\n createButton(config) {\n const button = document.createElement('button');\n button.className = 'overtype-toolbar-button';\n button.type = 'button';\n button.title = config.title;\n button.setAttribute('aria-label', config.title);\n button.setAttribute('data-action', config.action);\n button.innerHTML = config.icon;\n\n // Add dropdown if needed\n if (config.hasDropdown) {\n button.classList.add('has-dropdown');\n // Store reference for dropdown\n if (config.name === 'viewMode') {\n this.viewModeButton = button;\n }\n }\n\n // Add click handler\n button.addEventListener('click', (e) => {\n e.preventDefault();\n this.handleAction(config.action, button);\n });\n\n return button;\n }\n\n /**\n * Handle toolbar button actions\n */\n async handleAction(action, button) {\n const textarea = this.editor.textarea;\n if (!textarea) return;\n\n // Handle dropdown toggle\n if (action === 'toggle-view-menu') {\n this.toggleViewDropdown(button);\n return;\n }\n\n // Focus textarea for other actions\n textarea.focus();\n\n try {\n \n switch (action) {\n case 'toggleBold':\n markdownActions.toggleBold(textarea);\n break;\n case 'toggleItalic':\n markdownActions.toggleItalic(textarea);\n break;\n case 'insertH1':\n markdownActions.toggleH1(textarea);\n break;\n case 'insertH2':\n markdownActions.toggleH2(textarea);\n break;\n case 'insertH3':\n markdownActions.toggleH3(textarea);\n break;\n case 'insertLink':\n markdownActions.insertLink(textarea);\n break;\n case 'toggleCode':\n markdownActions.toggleCode(textarea);\n break;\n case 'toggleBulletList':\n markdownActions.toggleBulletList(textarea);\n break;\n case 'toggleNumberedList':\n markdownActions.toggleNumberedList(textarea);\n break;\n case 'toggleQuote':\n markdownActions.toggleQuote(textarea);\n break;\n case 'toggleTaskList':\n markdownActions.toggleTaskList(textarea);\n break;\n case 'toggle-plain':\n // Toggle between plain textarea and overlay mode\n const isPlain = this.editor.container.classList.contains('plain-mode');\n this.editor.showPlainTextarea(!isPlain);\n break;\n }\n\n // Trigger input event to update preview\n textarea.dispatchEvent(new Event('input', { bubbles: true }));\n } catch (error) {\n console.error('Error loading markdown-actions:', error);\n }\n }\n\n /**\n * Update toolbar button states based on current selection\n */\n async updateButtonStates() {\n const textarea = this.editor.textarea;\n if (!textarea) return;\n\n try {\n const activeFormats = markdownActions.getActiveFormats(textarea);\n\n // Update button states\n Object.entries(this.buttons).forEach(([name, button]) => {\n let isActive = false;\n \n switch (name) {\n case 'bold':\n isActive = activeFormats.includes('bold');\n break;\n case 'italic':\n isActive = activeFormats.includes('italic');\n break;\n case 'code':\n // Disabled: code detection is unreliable in code blocks\n // isActive = activeFormats.includes('code');\n isActive = false;\n break;\n case 'bulletList':\n isActive = activeFormats.includes('bullet-list');\n break;\n case 'orderedList':\n isActive = activeFormats.includes('numbered-list');\n break;\n case 'quote':\n isActive = activeFormats.includes('quote');\n break;\n case 'taskList':\n isActive = activeFormats.includes('task-list');\n break;\n case 'h1':\n isActive = activeFormats.includes('header');\n break;\n case 'h2':\n isActive = activeFormats.includes('header-2');\n break;\n case 'h3':\n isActive = activeFormats.includes('header-3');\n break;\n case 'togglePlain':\n // Button is active when in overlay mode (not plain mode)\n isActive = !this.editor.container.classList.contains('plain-mode');\n break;\n }\n\n button.classList.toggle('active', isActive);\n button.setAttribute('aria-pressed', isActive.toString());\n });\n } catch (error) {\n // Silently fail if markdown-actions not available\n }\n }\n\n /**\n * Toggle view mode dropdown menu\n */\n toggleViewDropdown(button) {\n // Close any existing dropdown\n const existingDropdown = document.querySelector('.overtype-dropdown-menu');\n if (existingDropdown) {\n existingDropdown.remove();\n button.classList.remove('dropdown-active');\n document.removeEventListener('click', this.handleDocumentClick);\n return;\n }\n\n // Create dropdown menu\n const dropdown = this.createViewDropdown();\n \n // Position dropdown relative to button\n const rect = button.getBoundingClientRect();\n dropdown.style.top = `${rect.bottom + 4}px`;\n dropdown.style.left = `${rect.left}px`;\n \n // Append to body instead of button\n document.body.appendChild(dropdown);\n button.classList.add('dropdown-active');\n \n // Store reference for document click handler\n this.handleDocumentClick = (e) => {\n if (!button.contains(e.target) && !dropdown.contains(e.target)) {\n dropdown.remove();\n button.classList.remove('dropdown-active');\n document.removeEventListener('click', this.handleDocumentClick);\n }\n };\n \n // Close on click outside\n setTimeout(() => {\n document.addEventListener('click', this.handleDocumentClick);\n }, 0);\n }\n\n /**\n * Create view mode dropdown menu\n */\n createViewDropdown() {\n const dropdown = document.createElement('div');\n dropdown.className = 'overtype-dropdown-menu';\n \n // Determine current mode\n const isPlain = this.editor.container.classList.contains('plain-mode');\n const isPreview = this.editor.container.classList.contains('preview-mode');\n const currentMode = isPreview ? 'preview' : (isPlain ? 'plain' : 'normal');\n \n // Create menu items\n const modes = [\n { id: 'normal', label: 'Normal Edit', icon: '\u2713' },\n { id: 'plain', label: 'Plain Textarea', icon: '\u2713' },\n { id: 'preview', label: 'Preview Mode', icon: '\u2713' }\n ];\n \n modes.forEach(mode => {\n const item = document.createElement('button');\n item.className = 'overtype-dropdown-item';\n item.type = 'button';\n \n const check = document.createElement('span');\n check.className = 'overtype-dropdown-check';\n check.textContent = currentMode === mode.id ? mode.icon : '';\n \n const label = document.createElement('span');\n label.textContent = mode.label;\n \n item.appendChild(check);\n item.appendChild(label);\n \n if (currentMode === mode.id) {\n item.classList.add('active');\n }\n \n item.addEventListener('click', (e) => {\n e.stopPropagation();\n this.setViewMode(mode.id);\n dropdown.remove();\n this.viewModeButton.classList.remove('dropdown-active');\n document.removeEventListener('click', this.handleDocumentClick);\n });\n \n dropdown.appendChild(item);\n });\n \n return dropdown;\n }\n\n /**\n * Set view mode\n */\n setViewMode(mode) {\n // Clear all mode classes\n this.editor.container.classList.remove('plain-mode', 'preview-mode');\n \n switch(mode) {\n case 'plain':\n this.editor.showPlainTextarea(true);\n break;\n case 'preview':\n this.editor.showPreviewMode(true);\n break;\n case 'normal':\n default:\n // Normal edit mode\n this.editor.showPlainTextarea(false);\n if (typeof this.editor.showPreviewMode === 'function') {\n this.editor.showPreviewMode(false);\n }\n break;\n }\n }\n\n /**\n * Destroy toolbar\n */\n destroy() {\n if (this.container) {\n // Clean up event listeners\n if (this.handleDocumentClick) {\n document.removeEventListener('click', this.handleDocumentClick);\n }\n this.container.remove();\n this.container = null;\n this.buttons = {};\n }\n }\n}", "/**\n * Link Tooltip - CSS Anchor Positioning with index-based anchors\n * Shows a clickable tooltip when cursor is within a link\n * Uses CSS anchor positioning with dynamically selected anchor\n */\n\nexport class LinkTooltip {\n constructor(editor) {\n this.editor = editor;\n this.tooltip = null;\n this.currentLink = null;\n this.hideTimeout = null;\n \n this.init();\n }\n \n init() {\n // Check for CSS anchor positioning support\n const supportsAnchor = \n CSS.supports('position-anchor: --x') &&\n CSS.supports('position-area: center');\n \n if (!supportsAnchor) {\n // Don't show anything if not supported\n return;\n }\n \n // Create tooltip element\n this.createTooltip();\n \n // Listen for cursor position changes\n this.editor.textarea.addEventListener('selectionchange', () => this.checkCursorPosition());\n this.editor.textarea.addEventListener('keyup', (e) => {\n if (e.key.includes('Arrow') || e.key === 'Home' || e.key === 'End') {\n this.checkCursorPosition();\n }\n });\n \n // Hide tooltip when typing or scrolling\n this.editor.textarea.addEventListener('input', () => this.hide());\n this.editor.textarea.addEventListener('scroll', () => this.hide());\n \n // Keep tooltip visible on hover\n this.tooltip.addEventListener('mouseenter', () => this.cancelHide());\n this.tooltip.addEventListener('mouseleave', () => this.scheduleHide());\n }\n \n createTooltip() {\n // Create tooltip element\n this.tooltip = document.createElement('div');\n this.tooltip.className = 'overtype-link-tooltip';\n \n // Add CSS anchor positioning styles\n const tooltipStyles = document.createElement('style');\n tooltipStyles.textContent = `\n @supports (position-anchor: --x) and (position-area: center) {\n .overtype-link-tooltip {\n position: absolute;\n position-anchor: var(--target-anchor, --link-0);\n position-area: block-end center;\n margin-top: 8px;\n \n background: #333;\n color: white;\n padding: 6px 10px;\n border-radius: 16px;\n font-size: 12px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n display: none;\n z-index: 10000;\n cursor: pointer;\n box-shadow: 0 2px 8px rgba(0,0,0,0.3);\n max-width: 300px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n \n position-try: most-width block-end inline-end, flip-inline, block-start center;\n position-visibility: anchors-visible;\n }\n \n .overtype-link-tooltip.visible {\n display: flex;\n }\n }\n `;\n document.head.appendChild(tooltipStyles);\n \n // Add link icon and text container\n this.tooltip.innerHTML = `\n <span style=\"display: flex; align-items: center; gap: 6px;\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 20 20\" fill=\"currentColor\" style=\"flex-shrink: 0;\">\n <path d=\"M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z\"></path>\n <path d=\"M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z\"></path>\n </svg>\n <span class=\"overtype-link-tooltip-url\"></span>\n </span>\n `;\n \n // Click handler to open link\n this.tooltip.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (this.currentLink) {\n window.open(this.currentLink.url, '_blank');\n this.hide();\n }\n });\n \n // Append tooltip to editor container\n this.editor.container.appendChild(this.tooltip);\n }\n \n checkCursorPosition() {\n const cursorPos = this.editor.textarea.selectionStart;\n const text = this.editor.textarea.value;\n \n // Find if cursor is within a markdown link\n const linkInfo = this.findLinkAtPosition(text, cursorPos);\n \n if (linkInfo) {\n if (!this.currentLink || this.currentLink.url !== linkInfo.url || this.currentLink.index !== linkInfo.index) {\n this.show(linkInfo);\n }\n } else {\n this.scheduleHide();\n }\n }\n \n findLinkAtPosition(text, position) {\n // Regex to find markdown links: [text](url)\n const linkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n let match;\n let linkIndex = 0;\n \n while ((match = linkRegex.exec(text)) !== null) {\n const start = match.index;\n const end = match.index + match[0].length;\n \n if (position >= start && position <= end) {\n return {\n text: match[1],\n url: match[2],\n index: linkIndex,\n start: start,\n end: end\n };\n }\n linkIndex++;\n }\n \n return null;\n }\n \n show(linkInfo) {\n this.currentLink = linkInfo;\n this.cancelHide();\n \n // Update tooltip content\n const urlSpan = this.tooltip.querySelector('.overtype-link-tooltip-url');\n urlSpan.textContent = linkInfo.url;\n \n // Set the CSS variable to point to the correct anchor\n this.tooltip.style.setProperty('--target-anchor', `--link-${linkInfo.index}`);\n \n // Show tooltip (CSS anchor positioning handles the rest)\n this.tooltip.classList.add('visible');\n }\n \n hide() {\n this.tooltip.classList.remove('visible');\n this.currentLink = null;\n }\n \n scheduleHide() {\n this.cancelHide();\n this.hideTimeout = setTimeout(() => this.hide(), 300);\n }\n \n cancelHide() {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n }\n \n destroy() {\n this.cancelHide();\n if (this.tooltip && this.tooltip.parentNode) {\n this.tooltip.parentNode.removeChild(this.tooltip);\n }\n this.tooltip = null;\n this.currentLink = null;\n }\n}"],
5
+ "mappings": "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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBA0CH,UAAU;AAAA;AAAA,6CAEc,QAAQ;AAAA,iDACJ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCASlB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAimB3B,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAiCV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA0BzB,YAAY;AAAA;AAElB;;;ACnyBO,IAAM,WAAW;AAAA;AAAA;AAAA;A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",
6
6
  "names": ["debugMode", "getActiveFormats"]
7
7
  }