overtype 1.1.0 → 1.1.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.
- package/README.md +28 -0
- package/dist/overtype.esm.js +203 -1327
- package/dist/overtype.esm.js.map +4 -4
- package/dist/overtype.js +203 -1327
- package/dist/overtype.js.map +4 -4
- package/dist/overtype.min.js +112 -90
- package/package.json +1 -2
- package/src/link-tooltip.js +75 -149
- package/src/overtype.js +147 -13
- package/src/parser.js +20 -2
- package/src/styles.js +29 -20
package/dist/overtype.esm.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../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", "../
|
|
4
|
-
"sourcesContent": ["/**\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 /**\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 '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\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, ' ');\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 const levelClasses = ['h1', 'h2', 'h3'];\n return `<span class=\"header ${levelClasses[level-1]}\"><span class=\"syntax-marker\">${hashes}</span> ${content}</span>`;\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(/^> (.+)$/, (match, content) => {\n return `<span class=\"blockquote\"><span class=\"syntax-marker\">></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(/^((?: )*)([-*])\\s(.+)$/, (match, indent, marker, content) => {\n return `${indent}<span class=\"syntax-marker\">${marker}</span> ${content}`;\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(/^((?: )*)(\\d+\\.)\\s(.+)$/, (match, indent, marker, content) => {\n return `${indent}<span class=\"syntax-marker\">${marker}</span> ${content}`;\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 if (html.startsWith('```')) {\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 return html.replace(/`(.+?)`/g, '<code><span class=\"syntax-marker\">`</span>$1<span class=\"syntax-marker\">`</span></code>');\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, '<a href=\"$2\"><span class=\"syntax-marker\">[</span>$1<span class=\"syntax-marker\">](</span><span class=\"syntax-marker\">$2</span><span class=\"syntax-marker\">)</span></a>');\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 to avoid conflicts\n html = this.parseInlineCode(html);\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 // This allows formatting like *text `code` text* to span across code blocks\n // while preventing formatting inside code like `__init__` from being bolded\n const codeBlocks = new Map();\n html = html.replace(/(<code>.*?<\\/code>)/g, (match) => {\n const placeholder = `\\uE000${codeBlocks.size}\\uE001`;\n codeBlocks.set(placeholder, match);\n return placeholder;\n });\n // Process other inline elements on text with placeholders\n html = this.parseLinks(html);\n html = this.parseBold(html);\n html = this.parseItalic(html);\n // Restore code blocks\n codeBlocks.forEach((codeBlock, placeholder) => {\n html = html.replace(placeholder, codeBlock);\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 return '<div> </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 const lines = text.split('\\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) || ' ';\n return `<div class=\"raw-line\">${content}</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 return parsedLines.join('');\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 fontFamily = \"ui-monospace, 'SFMono-Regular', 'Menlo', 'Consolas', 'Liberation Mono', 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 .overtype-container {\n position: relative !important;\n width: 100% !important;\n height: 100% !important;\n ${themeVars ? `\n /* Theme Variables */\n ${themeVars}` : ''}\n }\n \n .overtype-wrapper {\n position: relative !important;\n width: 100% !important;\n height: 100% !important;\n overflow: hidden !important;\n background: var(--bg-secondary, #ffffff) !important;\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;\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-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 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 /* 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 */\n .overtype-wrapper .overtype-preview pre {\n background: #1e1e1e !important;\n padding: 0 !important;\n margin: 0 !important;\n border-radius: 4px !important;\n overflow-x: auto !important;\n }\n\n .overtype-wrapper .overtype-preview pre code {\n background: none !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 .overtype-wrapper .overtype-preview li {\n margin: 0 !important;\n padding: 0 !important;\n list-style: none !important;\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 .overtype-wrapper.with-stats {\n padding-bottom: 40px !important;\n }\n \n .overtype-wrapper .overtype-stats {\n position: absolute !important;\n bottom: 0 !important;\n left: 0 !important;\n right: 0 !important;\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 z-index: 2 !important;\n }\n \n /* Dark theme stats bar */\n .overtype-wrapper[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-wrapper .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-wrapper .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 /* Adjust textarea and preview for stats bar */\n .overtype-wrapper.with-stats .overtype-input,\n .overtype-wrapper.with-stats .overtype-preview {\n height: calc(100% - 40px) !important;\n }\n\n /* Toolbar Styles */\n .overtype-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px;\n background: var(--toolbar-bg, var(--bg-primary, #f8f9fa));\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\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 ${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 * 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 ];\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 click handler\n button.addEventListener('click', (e) => {\n e.preventDefault();\n this.handleAction(config.action);\n });\n\n return button;\n }\n\n /**\n * Handle toolbar button actions\n */\n async handleAction(action) {\n const textarea = this.editor.textarea;\n if (!textarea) return;\n\n // Focus textarea\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 }\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 }\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 * Destroy toolbar\n */\n destroy() {\n if (this.container) {\n this.container.remove();\n this.container = null;\n this.buttons = {};\n }\n }\n}", "/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nconst yAxisSides = /*#__PURE__*/new Set(['top', 'bottom']);\nfunction getSideAxis(placement) {\n return yAxisSides.has(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nconst lrPlacement = ['left', 'right'];\nconst rlPlacement = ['right', 'left'];\nconst tbPlacement = ['top', 'bottom'];\nconst btPlacement = ['bottom', 'top'];\nfunction getSideList(side, isStart, rtl) {\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rlPlacement : lrPlacement;\n return isStart ? lrPlacement : rlPlacement;\n case 'left':\n case 'right':\n return isStart ? tbPlacement : btPlacement;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n", "import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n if (!ignoreCrossAxisOverflow ||\n // We leave the current main axis only if every placement on that axis\n // overflows the main axis.\n overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\nconst originSides = /*#__PURE__*/new Set(['left', 'top']);\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = originSides.has(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = originSides.has(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element \u2014\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n", "function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nconst invalidOverflowDisplayValues = /*#__PURE__*/new Set(['inline', 'contents']);\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display);\n}\nconst tableElements = /*#__PURE__*/new Set(['table', 'td', 'th']);\nfunction isTableElement(element) {\n return tableElements.has(getNodeName(element));\n}\nconst topLayerSelectors = [':popover-open', ':modal'];\nfunction isTopLayer(element) {\n return topLayerSelectors.some(selector => {\n try {\n return element.matches(selector);\n } catch (_e) {\n return false;\n }\n });\n}\nconst transformProperties = ['transform', 'translate', 'scale', 'rotate', 'perspective'];\nconst willChangeValues = ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'];\nconst containValues = ['paint', 'layout', 'strict', 'content'];\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return transformProperties.some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || willChangeValues.some(value => (css.willChange || '').includes(value)) || containValues.some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nconst lastTraversableNodeNames = /*#__PURE__*/new Set(['html', 'body', '#document']);\nfunction isLastTraversableNode(node) {\n return lastTraversableNodeNames.has(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n", "import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll, ignoreScrollbarX) {\n if (ignoreScrollbarX === void 0) {\n ignoreScrollbarX = false;\n }\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - (ignoreScrollbarX ? 0 :\n // RTL <body> scrollbar.\n getWindowScrollBarX(documentElement, htmlRect));\n const y = htmlRect.top + scroll.scrollTop;\n return {\n x,\n y\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll, true) : createCoords(0);\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nconst absoluteOrFixed = /*#__PURE__*/new Set(['absolute', 'fixed']);\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n\n // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n function setLeftRTLScrollbarOffset() {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n setLeftRTLScrollbarOffset();\n }\n }\n if (isFixed && !isOffsetParentAnElement && documentElement) {\n setLeftRTLScrollbarOffset();\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (_e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n resizeObserver.observe(floating);\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element \u2014\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n", "/**\n * Link Tooltip - Gmail/Google Docs style link preview\n * Shows a clickable tooltip when cursor is within a link\n */\n\nimport { computePosition, flip, shift, offset } from '@floating-ui/dom';\n\nexport class LinkTooltip {\n constructor(editor) {\n this.editor = editor;\n this.tooltip = null;\n this.currentLink = null;\n this.hideTimeout = null;\n this.isMouseInTooltip = false;\n this.isMouseInLink = false;\n \n this.init();\n }\n \n init() {\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('input', () => this.checkCursorPosition());\n this.editor.textarea.addEventListener('keyup', (e) => {\n // Arrow keys might move cursor\n if (e.key.includes('Arrow')) {\n this.checkCursorPosition();\n }\n });\n \n // Hide tooltip when scrolling\n this.editor.textarea.addEventListener('scroll', () => this.hide());\n \n // Mouse events for tooltip persistence\n this.tooltip.addEventListener('mouseenter', () => {\n this.isMouseInTooltip = true;\n this.cancelHide();\n });\n \n this.tooltip.addEventListener('mouseleave', () => {\n this.isMouseInTooltip = false;\n this.scheduleHide();\n });\n }\n \n createTooltip() {\n this.tooltip = document.createElement('div');\n this.tooltip.className = 'overtype-link-tooltip';\n this.tooltip.style.cssText = `\n position: absolute;\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 transition: opacity 0.2s;\n opacity: 0;\n `;\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 to document body for proper positioning\n document.body.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 link = this.findLinkAtPosition(text, cursorPos);\n \n if (link) {\n this.isMouseInLink = true;\n if (!this.currentLink || \n this.currentLink.start !== link.start || \n this.currentLink.url !== link.url) {\n // New link or different link\n this.show(link);\n }\n } else {\n // Not in a link\n this.isMouseInLink = false;\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 \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 start: start,\n end: end,\n text: match[1],\n url: match[2],\n fullMatch: match[0]\n };\n }\n }\n \n return null;\n }\n \n async show(link) {\n this.currentLink = link;\n this.cancelHide();\n \n // Update tooltip content\n const urlSpan = this.tooltip.querySelector('.overtype-link-tooltip-url');\n urlSpan.textContent = link.url;\n \n // Get the position of the link in the preview\n const linkElement = this.findLinkElementInPreview(link);\n \n if (linkElement) {\n // Use the link element as reference\n await this.positionTooltip(linkElement);\n } else {\n // Fallback: position based on cursor\n await this.positionTooltipAtCursor(link);\n }\n \n // Show tooltip with animation\n this.tooltip.style.display = 'block';\n // Force reflow\n this.tooltip.offsetHeight;\n this.tooltip.style.opacity = '1';\n }\n \n findLinkElementInPreview(link) {\n // Find the corresponding link element in the preview\n const links = this.editor.preview.querySelectorAll('a');\n \n for (const linkEl of links) {\n // Check if this link contains our URL\n const urlSpans = linkEl.querySelectorAll('.syntax-marker');\n for (const span of urlSpans) {\n if (span.textContent === link.url) {\n return linkEl;\n }\n }\n }\n \n return null;\n }\n \n async positionTooltip(referenceEl) {\n const { x, y } = await computePosition(referenceEl, this.tooltip, {\n placement: 'bottom',\n middleware: [\n offset(6),\n flip(),\n shift({ padding: 10 })\n ]\n });\n \n Object.assign(this.tooltip.style, {\n left: `${x}px`,\n top: `${y}px`\n });\n }\n \n async positionTooltipAtCursor(link) {\n // Get cursor position in the textarea\n const textarea = this.editor.textarea;\n \n // Create a temporary element to measure text position\n const measurer = document.createElement('div');\n measurer.style.cssText = window.getComputedStyle(textarea).cssText;\n measurer.style.position = 'absolute';\n measurer.style.visibility = 'hidden';\n measurer.style.whiteSpace = 'pre-wrap';\n measurer.style.wordWrap = 'break-word';\n \n // Get text up to cursor\n const textBeforeCursor = textarea.value.substring(0, link.start + link.fullMatch.length / 2);\n measurer.textContent = textBeforeCursor;\n \n document.body.appendChild(measurer);\n const textHeight = measurer.offsetHeight;\n document.body.removeChild(measurer);\n \n // Get textarea position\n const rect = textarea.getBoundingClientRect();\n \n // Estimate position (this is approximate)\n const x = rect.left + rect.width / 2;\n const y = rect.top + Math.min(textHeight, rect.height - 50);\n \n Object.assign(this.tooltip.style, {\n left: `${x}px`,\n top: `${y}px`,\n transform: 'translateX(-50%)'\n });\n }\n \n hide() {\n this.tooltip.style.opacity = '0';\n setTimeout(() => {\n if (this.tooltip.style.opacity === '0') {\n this.tooltip.style.display = 'none';\n this.currentLink = null;\n }\n }, 200);\n }\n \n scheduleHide() {\n this.cancelHide();\n this.hideTimeout = setTimeout(() => {\n if (!this.isMouseInTooltip && !this.isMouseInLink) {\n this.hide();\n }\n }, 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}", "/**\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 fontFamily: \"ui-monospace, 'SFMono-Regular', 'Menlo', 'Consolas', 'Liberation Mono', 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 // Behavior\n autofocus: false,\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 // Add stats wrapper class if stats are enabled\n if (this.options.showStats) {\n this.wrapper.classList.add('with-stats');\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 // 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 // Add stats bar if enabled\n if (this.options.showStats) {\n this.statsBar = document.createElement('div');\n this.statsBar.className = 'overtype-stats';\n this.wrapper.appendChild(this.statsBar);\n this._updateStats();\n }\n \n // Add wrapper to container\n this.container.appendChild(this.wrapper);\n \n // Add container to element\n this.element.appendChild(this.container);\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 // 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 // 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 // Apply class to all divs between the parent divs\n let currentDiv = openParent.nextElementSibling;\n while (currentDiv && currentDiv !== closeParent) {\n // Apply class to divs between the fences\n if (currentDiv.tagName === 'DIV') {\n currentDiv.classList.add('code-block-line');\n }\n \n // Move to next sibling\n currentDiv = currentDiv.nextElementSibling;\n \n // Safety check to prevent infinite loop\n if (!currentDiv) break;\n }\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 // Insert 2 spaces at cursor position\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 this.textarea.value = before + outdented + after;\n this.textarea.selectionStart = start;\n this.textarea.selectionEnd = start + outdented.length;\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 this.textarea.value = before + indented + after;\n this.textarea.selectionStart = start;\n this.textarea.selectionEnd = start + indented.length;\n } else {\n // No selection: just insert 2 spaces\n this.textarea.value = value.substring(0, start) + ' ' + value.substring(end);\n this.textarea.selectionStart = this.textarea.selectionEnd = start + 2;\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\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 * 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\n this.statsBar = document.createElement('div');\n this.statsBar.className = 'overtype-stats';\n this.wrapper.appendChild(this.statsBar);\n this.wrapper.classList.add('with-stats');\n this._updateStats();\n } else if (!show && this.statsBar) {\n // Remove stats bar\n this.statsBar.remove();\n this.statsBar = null;\n this.wrapper.classList.remove('with-stats');\n }\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// For IIFE builds, esbuild needs the class as the default export\nexport default OverType;\n// Also export as named for ESM compatibility\nexport { OverType };"],
|
|
5
|
-
"mappings": "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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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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",
|
|
6
|
-
"names": ["debugMode", "getActiveFormats"
|
|
3
|
+
"sources": ["../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", "../src/overtype.js"],
|
|
4
|
+
"sourcesContent": ["/**\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 '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\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, ' ');\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 const levelClasses = ['h1', 'h2', 'h3'];\n return `<span class=\"header ${levelClasses[level-1]}\"><span class=\"syntax-marker\">${hashes}</span> ${content}</span>`;\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(/^> (.+)$/, (match, content) => {\n return `<span class=\"blockquote\"><span class=\"syntax-marker\">></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(/^((?: )*)([-*])\\s(.+)$/, (match, indent, marker, content) => {\n return `${indent}<span class=\"syntax-marker\">${marker}</span> ${content}`;\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(/^((?: )*)(\\d+\\.)\\s(.+)$/, (match, indent, marker, content) => {\n return `${indent}<span class=\"syntax-marker\">${marker}</span> ${content}`;\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 // Only treat as code block if ``` is alone or followed by a language identifier\n // This prevents ```some code``` from being treated as a code fence\n if (html.match(/^```(\\s*|\\w*)$/)) {\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 return html.replace(/`(.+?)`/g, '<code><span class=\"syntax-marker\">`</span>$1<span class=\"syntax-marker\">`</span></code>');\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 return `<a href=\"${url}\" style=\"anchor-name: ${anchorName}\"><span class=\"syntax-marker\">[</span>${text}<span class=\"syntax-marker\">](</span><span class=\"syntax-marker\">${url}</span><span class=\"syntax-marker\">)</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 to avoid conflicts\n html = this.parseInlineCode(html);\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 // This allows formatting like *text `code` text* to span across code blocks\n // while preventing formatting inside code like `__init__` from being bolded\n const codeBlocks = new Map();\n html = html.replace(/(<code>.*?<\\/code>)/g, (match) => {\n const placeholder = `\\uE000${codeBlocks.size}\\uE001`;\n codeBlocks.set(placeholder, match);\n return placeholder;\n });\n // Process other inline elements on text with placeholders\n html = this.parseLinks(html);\n html = this.parseBold(html);\n html = this.parseItalic(html);\n // Restore code blocks\n codeBlocks.forEach((codeBlock, placeholder) => {\n html = html.replace(placeholder, codeBlock);\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 return '<div> </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 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) || ' ';\n return `<div class=\"raw-line\">${content}</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 return parsedLines.join('');\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 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 .overtype-container {\n display: grid !important;\n grid-template-rows: auto 1fr auto !important;\n width: 100% !important;\n height: 100% !important;\n ${themeVars ? `\n /* Theme Variables */\n ${themeVars}` : ''}\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;\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 }\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;\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-synthesis: none !important; /* no faux bold/italic width drift */\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 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 /* 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 */\n .overtype-wrapper .overtype-preview pre {\n background: #1e1e1e !important;\n padding: 0 !important;\n margin: 0 !important;\n border-radius: 4px !important;\n overflow-x: auto !important;\n }\n\n .overtype-wrapper .overtype-preview pre code {\n background: none !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 .overtype-wrapper .overtype-preview li {\n margin: 0 !important;\n padding: 0 !important;\n list-style: none !important;\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;\n background: var(--toolbar-bg, var(--bg-primary, #f8f9fa));\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n flex-shrink: 0;\n height: auto !important;\n grid-row: 1 !important; /* Always first row in grid */\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 ${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 * 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 ];\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 click handler\n button.addEventListener('click', (e) => {\n e.preventDefault();\n this.handleAction(config.action);\n });\n\n return button;\n }\n\n /**\n * Handle toolbar button actions\n */\n async handleAction(action) {\n const textarea = this.editor.textarea;\n if (!textarea) return;\n\n // Focus textarea\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 }\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 }\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 * Destroy toolbar\n */\n destroy() {\n if (this.container) {\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}", "/**\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 fontFamily: \"ui-monospace, 'SFMono-Regular', 'Menlo', 'Consolas', 'Liberation Mono', 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 // 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 // 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 // Apply class to all divs between the parent divs\n let currentDiv = openParent.nextElementSibling;\n while (currentDiv && currentDiv !== closeParent) {\n // Apply class to divs between the fences\n if (currentDiv.tagName === 'DIV') {\n currentDiv.classList.add('code-block-line');\n }\n \n // Move to next sibling\n currentDiv = currentDiv.nextElementSibling;\n \n // Safety check to prevent infinite loop\n if (!currentDiv) break;\n }\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 // Insert 2 spaces at cursor position\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 this.textarea.value = before + outdented + after;\n this.textarea.selectionStart = start;\n this.textarea.selectionEnd = start + outdented.length;\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 this.textarea.value = before + indented + after;\n this.textarea.selectionStart = start;\n this.textarea.selectionEnd = start + indented.length;\n } else {\n // No selection: just insert 2 spaces\n this.textarea.value = value.substring(0, start) + ' ' + value.substring(end);\n this.textarea.selectionStart = this.textarea.selectionEnd = start + 2;\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 * 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 * 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// For IIFE builds, esbuild needs the class as the default export\nexport default OverType;\n// Also export as named for ESM compatibility\nexport { OverType };"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;AAQO,IAAM,iBAAN,MAAqB;AAAA;AAAA;AAAA;AAAA,EAO1B,OAAO,iBAAiB;AACtB,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,WAAW,MAAM;AACtB,UAAM,MAAM;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AACA,WAAO,KAAK,QAAQ,YAAY,OAAK,IAAI,CAAC,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,oBAAoB,MAAM,cAAc;AAC7C,UAAM,gBAAgB,aAAa,MAAM,QAAQ,EAAE,CAAC;AACpD,UAAM,cAAc,cAAc,QAAQ,MAAM,QAAQ;AACxD,WAAO,KAAK,QAAQ,QAAQ,WAAW;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,YAAY,MAAM;AACvB,WAAO,KAAK,QAAQ,oBAAoB,CAAC,OAAO,QAAQ,YAAY;AAClE,YAAM,QAAQ,OAAO;AACrB,YAAM,eAAe,CAAC,MAAM,MAAM,IAAI;AACtC,aAAO,uBAAuB,aAAa,QAAM,CAAC,CAAC,iCAAiC,MAAM,WAAW,OAAO;AAAA,IAC9G,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,oBAAoB,MAAM;AAC/B,QAAI,KAAK,MAAM,wBAAwB,GAAG;AACxC,aAAO,gCAAgC,IAAI;AAAA,IAC7C;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,gBAAgB,MAAM;AAC3B,WAAO,KAAK,QAAQ,eAAe,CAAC,OAAO,YAAY;AACrD,aAAO,oEAAoE,OAAO;AAAA,IACpF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,gBAAgB,MAAM;AAC3B,WAAO,KAAK,QAAQ,+BAA+B,CAAC,OAAO,QAAQ,QAAQ,YAAY;AACrF,aAAO,GAAG,MAAM,+BAA+B,MAAM,WAAW,OAAO;AAAA,IACzE,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,kBAAkB,MAAM;AAC7B,WAAO,KAAK,QAAQ,gCAAgC,CAAC,OAAO,QAAQ,QAAQ,YAAY;AACtF,aAAO,GAAG,MAAM,+BAA+B,MAAM,WAAW,OAAO;AAAA,IACzE,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,eAAe,MAAM;AAG1B,QAAI,KAAK,MAAM,gBAAgB,GAAG;AAChC,aAAO,iCAAiC,IAAI;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,UAAU,MAAM;AACrB,WAAO,KAAK,QAAQ,kBAAkB,+FAA+F;AACrI,WAAO,KAAK,QAAQ,cAAc,+FAA+F;AACjI,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,YAAY,MAAM;AACvB,WAAO,KAAK,QAAQ,WAAC,6CAAoC,GAAC,GAAE,qFAAqF;AACjJ,WAAO,KAAK,QAAQ,WAAC,iCAA8B,GAAC,GAAE,qFAAqF;AAC3I,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,gBAAgB,MAAM;AAC3B,WAAO,KAAK,QAAQ,YAAY,yFAAyF;AAAA,EAC3H;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,WAAW,MAAM;AACtB,WAAO,KAAK,QAAQ,uBAAuB,CAAC,OAAO,MAAM,QAAQ;AAC/D,YAAM,aAAa,UAAU,KAAK,WAAW;AAC7C,aAAO,YAAY,GAAG,yBAAyB,UAAU,yCAAyC,IAAI,oEAAoE,GAAG;AAAA,IAC/K,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,oBAAoB,MAAM;AAC/B,QAAI,OAAO;AAEX,WAAO,KAAK,gBAAgB,IAAI;AAShC,UAAM,aAAa,oBAAI,IAAI;AAC3B,WAAO,KAAK,QAAQ,wBAAwB,CAAC,UAAU;AACrD,YAAM,cAAc,SAAS,WAAW,IAAI;AAC5C,iBAAW,IAAI,aAAa,KAAK;AACjC,aAAO;AAAA,IACT,CAAC;AAED,WAAO,KAAK,WAAW,IAAI;AAC3B,WAAO,KAAK,UAAU,IAAI;AAC1B,WAAO,KAAK,YAAY,IAAI;AAE5B,eAAW,QAAQ,CAAC,WAAW,gBAAgB;AAC7C,aAAO,KAAK,QAAQ,aAAa,SAAS;AAAA,IAC5C,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,UAAU,MAAM;AACrB,QAAI,OAAO,KAAK,WAAW,IAAI;AAG/B,WAAO,KAAK,oBAAoB,MAAM,IAAI;AAG1C,UAAM,iBAAiB,KAAK,oBAAoB,IAAI;AACpD,QAAI;AAAgB,aAAO;AAE3B,UAAM,YAAY,KAAK,eAAe,IAAI;AAC1C,QAAI;AAAW,aAAO;AAGtB,WAAO,KAAK,YAAY,IAAI;AAC5B,WAAO,KAAK,gBAAgB,IAAI;AAChC,WAAO,KAAK,gBAAgB,IAAI;AAChC,WAAO,KAAK,kBAAkB,IAAI;AAGlC,WAAO,KAAK,oBAAoB,IAAI;AAGpC,QAAI,KAAK,KAAK,MAAM,IAAI;AACtB,aAAO;AAAA,IACT;AAEA,WAAO,QAAQ,IAAI;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,MAAM,MAAM,aAAa,IAAI,oBAAoB,OAAO;AAE7D,SAAK,eAAe;AAEpB,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,UAAM,cAAc,MAAM,IAAI,CAAC,MAAM,UAAU;AAE7C,UAAI,qBAAqB,UAAU,YAAY;AAC7C,cAAM,UAAU,KAAK,WAAW,IAAI,KAAK;AACzC,eAAO,yBAAyB,OAAO;AAAA,MACzC;AAGA,aAAO,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAGD,WAAO,YAAY,KAAK,EAAE;AAAA,EAC5B;AACF;AAAA;AAxPE,cAFW,gBAEJ,aAAY;;;;;;;;;;;;;;;;;;;ACNd,IAAM,UAAU;EACrB,MAAM;IACJ,QAAQ;IACR,QAAQ;IACR,WAAW;EACb;EACA,QAAQ;IACN,QAAQ;IACR,QAAQ;IACR,WAAW;EACb;EACA,MAAM;IACJ,QAAQ;IACR,QAAQ;IACR,aAAa;IACb,aAAa;EACf;EACA,MAAM;IACJ,QAAQ;IACR,QAAQ;IACR,aAAa;IACb,SAAS;EACX;EACA,YAAY;IACV,QAAQ;IACR,WAAW;IACX,eAAe;EACjB;EACA,cAAc;IACZ,QAAQ;IACR,WAAW;IACX,aAAa;EACf;EACA,OAAO;IACL,QAAQ;IACR,WAAW;IACX,sBAAsB;EACxB;EACA,UAAU;IACR,QAAQ;IACR,WAAW;IACX,sBAAsB;EACxB;EACA,SAAS,EAAE,QAAQ,KAAK;EACxB,SAAS,EAAE,QAAQ,MAAM;EACzB,SAAS,EAAE,QAAQ,OAAO;EAC1B,SAAS,EAAE,QAAQ,QAAQ;EAC3B,SAAS,EAAE,QAAQ,SAAS;EAC5B,SAAS,EAAE,QAAQ,UAAU;AAC/B;AAKO,SAAS,kBAAkB;AAChC,SAAO;IACL,QAAQ;IACR,QAAQ;IACR,aAAa;IACb,aAAa;IACb,WAAW;IACX,aAAa;IACb,aAAa;IACb,SAAS;IACT,sBAAsB;IACtB,aAAa;IACb,eAAe;IACf,WAAW;EACb;AACF;AAKO,SAAS,kBAAkB,QAAQ;AACxC,SAAO,eAAA,eAAA,CAAA,GAAK,gBAAgB,CAAA,GAAM,MAAA;AACpC;AC1EA,IAAI,YAAY;AAcT,SAAS,eAAe;AAC7B,SAAO;AACT;AAEO,SAAS,SAAS,UAAU,SAAS,MAAM;AAEhD,MAAI,CAAC;AAAW;AAEhB,UAAQ,MAAM,aAAM,QAAQ,EAAE;AAC9B,UAAQ,IAAI,OAAO;AACnB,MAAI,MAAM;AACR,YAAQ,IAAI,SAAS,IAAI;EAC3B;AACA,UAAQ,SAAS;AACnB;AAEO,SAAS,eAAe,UAAU,OAAO;AAE9C,MAAI,CAAC;AAAW;AAEhB,QAAM,WAAW,SAAS,MAAM,MAAM,SAAS,gBAAgB,SAAS,YAAY;AACpF,UAAQ,MAAM,wBAAiB,KAAK,EAAE;AACtC,UAAQ,IAAI,aAAa,GAAG,SAAS,cAAc,IAAI,SAAS,YAAY,EAAE;AAC9E,UAAQ,IAAI,kBAAkB,KAAK,UAAU,QAAQ,CAAC;AACtD,UAAQ,IAAI,WAAW,SAAS,MAAM;AAGtC,QAAM,SAAS,SAAS,MAAM,MAAM,KAAK,IAAI,GAAG,SAAS,iBAAiB,EAAE,GAAG,SAAS,cAAc;AACtG,QAAM,QAAQ,SAAS,MAAM,MAAM,SAAS,cAAc,KAAK,IAAI,SAAS,MAAM,QAAQ,SAAS,eAAe,EAAE,CAAC;AACrH,UAAQ,IAAI,YAAY,KAAK,UAAU,MAAM,IAAI,gBAAgB,KAAK,UAAU,KAAK,CAAC;AACtF,UAAQ,SAAS;AACnB;AAEO,SAAS,YAAY,QAAQ;AAElC,MAAI,CAAC;AAAW;AAEhB,UAAQ,MAAM,kBAAW;AACzB,UAAQ,IAAI,mBAAmB,KAAK,UAAU,OAAO,IAAI,CAAC;AAC1D,UAAQ,IAAI,kBAAkB,GAAG,OAAO,cAAc,IAAI,OAAO,YAAY,EAAE;AAC/E,UAAQ,SAAS;AACnB;ACtDA,IAAI,gBAAgB;AAUb,SAAS,WAAW,UAAU,EAAE,MAAM,gBAAgB,aAAa,GAAG;AAC3E,QAAMA,aAAY,aAAa;AAE/B,MAAIA,YAAW;AACb,YAAQ,MAAM,sBAAe;AAC7B,YAAQ,IAAI,sBAAsB,GAAG,SAAS,cAAc,IAAI,SAAS,YAAY,EAAE;AACvF,YAAQ,IAAI,mBAAmB,KAAK,UAAU,IAAI,CAAC;AACnD,YAAQ,IAAI,yBAAyB,gBAAgB,KAAK,YAAY;EACxE;AAGA,WAAS,MAAM;AAEf,QAAM,yBAAyB,SAAS;AACxC,QAAM,uBAAuB,SAAS;AACtC,QAAM,SAAS,SAAS,MAAM,MAAM,GAAG,sBAAsB;AAC7D,QAAM,QAAQ,SAAS,MAAM,MAAM,oBAAoB;AAEvD,MAAIA,YAAW;AACb,YAAQ,IAAI,0BAA0B,KAAK,UAAU,OAAO,MAAM,GAAG,CAAC,CAAC;AACvE,YAAQ,IAAI,0BAA0B,KAAK,UAAU,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC;AACxE,YAAQ,IAAI,iCAAiC,KAAK,UAAU,SAAS,MAAM,MAAM,wBAAwB,oBAAoB,CAAC,CAAC;EACjI;AAGA,QAAM,gBAAgB,SAAS;AAI/B,QAAM,eAAe,2BAA2B;AAEhD,MAAI,kBAAkB,QAAQ,kBAAkB,MAAM;AACpD,aAAS,kBAAkB;AAC3B,QAAI;AACF,sBAAgB,SAAS,YAAY,cAAc,OAAO,IAAI;AAC9D,UAAIA;AAAW,gBAAQ,IAAI,yBAAyB,eAAe,iBAAiB,KAAK,MAAM,IAAI,EAAE,QAAQ,OAAO;IACtH,SAAS,OAAO;AACd,sBAAgB;AAChB,UAAIA;AAAW,gBAAQ,IAAI,4BAA4B,KAAK;IAC9D;AACA,aAAS,kBAAkB;EAC7B;AAEA,MAAIA,YAAW;AACb,YAAQ,IAAI,yBAAyB,aAAa;AAClD,YAAQ,IAAI,uBAAuB,aAAa;EAClD;AAGA,MAAI,eAAe;AACjB,UAAM,gBAAgB,SAAS,OAAO;AACtC,UAAM,cAAc,SAAS;AAE7B,QAAIA,YAAW;AACb,cAAQ,IAAI,oBAAoB,cAAc,MAAM;AACpD,cAAQ,IAAI,kBAAkB,YAAY,MAAM;IAClD;AAEA,QAAI,gBAAgB,eAAe;AACjC,UAAIA,YAAW;AACb,gBAAQ,IAAI,mDAAmD;AAC/D,gBAAQ,IAAI,aAAa,KAAK,UAAU,cAAc,MAAM,GAAG,GAAG,CAAC,CAAC;AACpE,gBAAQ,IAAI,WAAW,KAAK,UAAU,YAAY,MAAM,GAAG,GAAG,CAAC,CAAC;MAClE;IAGF;EACF;AAEA,MAAI,CAAC,eAAe;AAClB,QAAIA;AAAW,cAAQ,IAAI,wBAAwB;AAEnD,QAAI,SAAS,UAAU,eAAe;AACpC,UAAIA;AAAW,gBAAQ,IAAI,2CAA2C;AACtE,UAAI;AACF,iBAAS,YAAY,kBAAkB;MACzC,SAAS,GAAG;MAEZ;AACA,eAAS,QAAQ,SAAS,OAAO;AACjC,UAAI;AACF,iBAAS,YAAY,gBAAgB;MACvC,SAAS,GAAG;MAEZ;AACA,eAAS,cAAc,IAAI,YAAY,SAAS,EAAE,SAAS,MAAM,YAAY,KAAK,CAAC,CAAC;IACtF,OAAO;AACL,UAAIA;AAAW,gBAAQ,IAAI,6DAA6D;IAC1F;EACF;AAEA,MAAIA;AAAW,YAAQ,IAAI,4BAA4B,gBAAgB,YAAY;AACnF,MAAI,kBAAkB,QAAQ,gBAAgB,MAAM;AAClD,aAAS,kBAAkB,gBAAgB,YAAY;EACzD,OAAO;AACL,aAAS,kBAAkB,wBAAwB,SAAS,YAAY;EAC1E;AAEA,MAAIA,YAAW;AACb,YAAQ,IAAI,uBAAuB,SAAS,MAAM,MAAM;AACxD,YAAQ,SAAS;EACnB;AACF;AChHO,SAAS,gBAAgB,QAAQ;AACtC,SAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,SAAS;AAC5C;AAKO,SAAS,mBAAmB,MAAM,GAAG;AAC1C,MAAI,QAAQ;AACZ,SAAO,KAAK,KAAK,KAAK,KAAK,QAAQ,CAAC,KAAK,QAAQ,CAAC,KAAK,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG;AAC7E;EACF;AACA,SAAO;AACT;AAKO,SAAS,iBAAiB,MAAM,GAAG,WAAW;AACnD,MAAI,QAAQ;AACZ,QAAM,aAAa,YAAY,OAAO;AACtC,SAAO,KAAK,KAAK,KAAK,CAAC,KAAK,KAAK,EAAE,MAAM,UAAU,GAAG;AACpD;EACF;AACA,SAAO;AACT;AAKO,SAAS,sBAAsB,UAAU;AAC9C,QAAM,QAAQ,SAAS,MAAM,MAAM,IAAI;AACvC,MAAI,UAAU;AACd,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,UAAM,aAAa,MAAM,KAAK,EAAE,SAAS;AACzC,QAAI,SAAS,kBAAkB,WAAW,SAAS,iBAAiB,UAAU,YAAY;AACxF,eAAS,iBAAiB;IAC5B;AACA,QAAI,SAAS,gBAAgB,WAAW,SAAS,eAAe,UAAU,YAAY;AAEpF,UAAI,UAAU,MAAM,SAAS,GAAG;AAC9B,iBAAS,eAAe,KAAK,IAAI,UAAU,MAAM,KAAK,EAAE,QAAQ,SAAS,MAAM,MAAM;MACvF,OAAO;AACL,iBAAS,eAAe,UAAU,aAAa;MACjD;IACF;AACA,eAAW;EACb;AACF;AAKO,SAAS,mBAAmB,UAAU,aAAa,aAAa,YAAY,OAAO;AACxF,MAAI,SAAS,mBAAmB,SAAS,cAAc;AACrD,aAAS,iBAAiB,mBAAmB,SAAS,OAAO,SAAS,cAAc;AACpF,aAAS,eAAe,iBAAiB,SAAS,OAAO,SAAS,cAAc,SAAS;EAC3F,OAAO;AACL,UAAM,yBAAyB,SAAS,iBAAiB,YAAY;AACrE,UAAM,uBAAuB,SAAS,eAAe,YAAY;AACjE,UAAM,mBAAmB,SAAS,MAAM,MAAM,wBAAwB,SAAS,cAAc,MAAM;AACnG,UAAM,iBAAiB,SAAS,MAAM,MAAM,SAAS,cAAc,oBAAoB,MAAM;AAC7F,QAAI,oBAAoB,gBAAgB;AACtC,eAAS,iBAAiB;AAC1B,eAAS,eAAe;IAC1B;EACF;AACA,SAAO,SAAS,MAAM,MAAM,SAAS,gBAAgB,SAAS,YAAY;AAC5E;AAKO,SAAS,+BAA+B,UAAU;AACvD,QAAM,kBAAkB,SAAS,MAAM,MAAM,GAAG,SAAS,cAAc;AACvE,QAAM,iBAAiB,SAAS,MAAM,MAAM,SAAS,YAAY;AAEjE,QAAM,eAAe,gBAAgB,MAAM,MAAM;AACjD,QAAM,cAAc,eAAe,MAAM,MAAM;AAC/C,QAAM,0BAA0B,eAAe,aAAa,CAAC,EAAE,SAAS;AACxE,QAAM,yBAAyB,cAAc,YAAY,CAAC,EAAE,SAAS;AAErE,MAAI,mBAAmB;AACvB,MAAI,oBAAoB;AAExB,MAAI,gBAAgB,MAAM,IAAI,KAAK,0BAA0B,GAAG;AAC9D,uBAAmB,KAAK,OAAO,IAAI,uBAAuB;EAC5D;AAEA,MAAI,eAAe,MAAM,IAAI,KAAK,yBAAyB,GAAG;AAC5D,wBAAoB,KAAK,OAAO,IAAI,sBAAsB;EAC5D;AAEA,SAAO,EAAE,kBAAkB,kBAAkB;AAC/C;AA2BO,SAAS,mBAAmB,UAAU,WAAW,UAAU,CAAC,GAAG;AAEpE,QAAM,gBAAgB,SAAS;AAC/B,QAAM,cAAc,SAAS;AAC7B,QAAM,qBAAqB,kBAAkB;AAG7C,QAAM,QAAQ,SAAS;AACvB,MAAI,YAAY;AAGhB,SAAO,YAAY,KAAK,MAAM,YAAY,CAAC,MAAM,MAAM;AACrD;EACF;AAGA,MAAI,oBAAoB;AAEtB,QAAI,UAAU;AAGd,WAAO,UAAU,MAAM,UAAU,MAAM,OAAO,MAAM,MAAM;AACxD;IACF;AAEA,aAAS,iBAAiB;AAC1B,aAAS,eAAe;EAC1B,OAAO;AAEL,0BAAsB,QAAQ;EAChC;AAGA,QAAM,SAAS,UAAU,QAAQ;AAGjC,MAAI,QAAQ,iBAAiB;AAE3B,UAAM,eAAe,SAAS,MAAM,MAAM,SAAS,gBAAgB,SAAS,YAAY;AACxF,UAAM,aAAa,aAAa,WAAW,QAAQ,MAAM;AACzD,UAAM,WAAW,QAAQ,gBAAgB,YAAY,eAAe,aAAa,SAAS;AAC1F,WAAO,iBAAiB,SAAS;AACjC,WAAO,eAAe,SAAS;EACjC,WAAW,QAAQ,QAAQ;AAEzB,UAAM,eAAe,SAAS,MAAM,MAAM,SAAS,gBAAgB,SAAS,YAAY;AACxF,UAAM,aAAa,aAAa,WAAW,QAAQ,MAAM;AAEzD,QAAI,oBAAoB;AAEtB,UAAI,YAAY;AAEd,eAAO,iBAAiB,KAAK,IAAI,gBAAgB,QAAQ,OAAO,QAAQ,SAAS;AACjF,eAAO,eAAe,OAAO;MAC/B,OAAO;AAEL,eAAO,iBAAiB,gBAAgB,QAAQ,OAAO;AACvD,eAAO,eAAe,OAAO;MAC/B;IACF,OAAO;AAEL,UAAI,YAAY;AAEd,eAAO,iBAAiB,KAAK,IAAI,gBAAgB,QAAQ,OAAO,QAAQ,SAAS;AACjF,eAAO,eAAe,KAAK,IAAI,cAAc,QAAQ,OAAO,QAAQ,SAAS;MAC/E,OAAO;AAEL,eAAO,iBAAiB,gBAAgB,QAAQ,OAAO;AACvD,eAAO,eAAe,cAAc,QAAQ,OAAO;MACrD;IACF;EACF;AAEA,SAAO;AACT;AC/LO,SAAS,WAAW,UAAU,OAAO;AAC1C,MAAI;AACJ,MAAI;AAEJ,QAAM,EAAE,QAAQ,QAAQ,aAAa,aAAa,aAAa,aAAa,SAAS,sBAAsB,UAAU,IAAI;AACzH,QAAM,yBAAyB,SAAS;AACxC,QAAM,uBAAuB,SAAS;AAEtC,MAAI,eAAe,SAAS,MAAM,MAAM,SAAS,gBAAgB,SAAS,YAAY;AACtF,MAAI,cAAc,gBAAgB,YAAY,KAAK,eAAe,YAAY,SAAS,IAAI,GAAG,WAAW;IAAO;AAChH,MAAI,cAAc,gBAAgB,YAAY,KAAK,eAAe,YAAY,SAAS,IAAI;EAAK,WAAW,KAAK;AAEhH,MAAI,aAAa;AACf,UAAM,kBAAkB,SAAS,MAAM,SAAS,iBAAiB,CAAC;AAClE,QAAI,SAAS,mBAAmB,KAAK,mBAAmB,QAAQ,CAAC,gBAAgB,MAAM,IAAI,GAAG;AAC5F,oBAAc,IAAI,WAAW;IAC/B;EACF;AAEA,iBAAe,mBAAmB,UAAU,aAAa,aAAa,MAAM,SAAS;AACrF,MAAI,iBAAiB,SAAS;AAC9B,MAAI,eAAe,SAAS;AAC5B,QAAM,iBAAiB,eAAe,YAAY,SAAS,KAAK,YAAY,QAAQ,WAAW,IAAI,MAAM,aAAa,SAAS;AAE/H,MAAI,sBAAsB;AACxB,UAAM,MAAM,+BAA+B,QAAQ;AACnD,uBAAmB,IAAI;AACvB,wBAAoB,IAAI;AACxB,kBAAc,mBAAmB;AACjC,mBAAe;EACjB;AAGA,MAAI,aAAa,WAAW,WAAW,KAAK,aAAa,SAAS,WAAW,GAAG;AAC9E,UAAM,kBAAkB,aAAa,MAAM,YAAY,QAAQ,aAAa,SAAS,YAAY,MAAM;AACvG,QAAI,2BAA2B,sBAAsB;AACnD,UAAI,WAAW,yBAAyB,YAAY;AACpD,iBAAW,KAAK,IAAI,UAAU,cAAc;AAC5C,iBAAW,KAAK,IAAI,UAAU,iBAAiB,gBAAgB,MAAM;AACrE,uBAAiB,eAAe;IAClC,OAAO;AACL,qBAAe,iBAAiB,gBAAgB;IAClD;AACA,WAAO,EAAE,MAAM,iBAAiB,gBAAgB,aAAa;EAC/D,WAAW,CAAC,gBAAgB;AAE1B,QAAI,kBAAkB,cAAc,eAAe;AACnD,qBAAiB,yBAAyB,YAAY;AACtD,mBAAe,uBAAuB,YAAY;AAClD,UAAM,kBAAkB,aAAa,MAAM,YAAY;AACvD,QAAI,aAAa,iBAAiB;AAChC,YAAM,oBAAoB,gBAAgB,CAAC,KAAK;AAChD,YAAM,qBAAqB,gBAAgB,CAAC,KAAK;AACjD,wBAAkB,oBAAoB,cAAc,aAAa,KAAK,IAAI,cAAc;AACxF,wBAAkB,kBAAkB;AACpC,sBAAgB,mBAAmB;IACrC;AACA,WAAO,EAAE,MAAM,iBAAiB,gBAAgB,aAAa;EAC/D,WAAW,WAAW,QAAQ,SAAS,KAAK,aAAa,MAAM,OAAO,GAAG;AAEvE,kBAAc,YAAY,QAAQ,aAAa,YAAY;AAC3D,UAAM,kBAAkB,cAAc;AACtC,qBAAiB,eAAe,iBAAiB,YAAY;AAC7D,WAAO,EAAE,MAAM,iBAAiB,gBAAgB,aAAa;EAC/D,OAAO;AAEL,UAAM,kBAAkB,cAAc,eAAe;AACrD,qBAAiB,iBAAiB,YAAY,SAAS,aAAa,SAAS,YAAY,QAAQ,WAAW;AAC5G,mBAAe,iBAAiB,YAAY;AAC5C,WAAO,EAAE,MAAM,iBAAiB,gBAAgB,aAAa;EAC/D;AACF;AAyBO,SAAS,eAAe,UAAU,OAAO;AAC9C,QAAM,EAAE,QAAQ,QAAQ,qBAAqB,IAAI;AACjD,MAAI,OAAO,SAAS,MAAM,MAAM,SAAS,gBAAgB,SAAS,YAAY;AAC9E,MAAI,iBAAiB,SAAS;AAC9B,MAAI,eAAe,SAAS;AAC5B,QAAM,QAAQ,KAAK,MAAM,IAAI;AAG7B,QAAM,YAAY,MAAM,MAAM,CAAA,SAAQ,KAAK,WAAW,MAAM,MAAM,CAAC,UAAU,KAAK,SAAS,MAAM,EAAE;AAEnG,MAAI,WAAW;AAEb,WAAO,MAAM,IAAI,CAAA,SAAQ;AACvB,UAAI,SAAS,KAAK,MAAM,OAAO,MAAM;AACrC,UAAI,QAAQ;AACV,iBAAS,OAAO,MAAM,GAAG,OAAO,SAAS,OAAO,MAAM;MACxD;AACA,aAAO;IACT,CAAC,EAAE,KAAK,IAAI;AACZ,mBAAe,iBAAiB,KAAK;EACvC,OAAO;AAEL,WAAO,MAAM,IAAI,CAAA,SAAQ,SAAS,QAAQ,UAAU,GAAG,EAAE,KAAK,IAAI;AAClE,QAAI,sBAAsB;AACxB,YAAM,EAAE,kBAAkB,kBAAkB,IAAI,+BAA+B,QAAQ;AACvF,wBAAkB,iBAAiB;AACnC,qBAAe,iBAAiB,KAAK;AACrC,aAAO,mBAAmB,OAAO;IACnC;EACF;AAEA,SAAO,EAAE,MAAM,gBAAgB,aAAa;AAC9C;ACjIA,SAAS,qBAAqB,MAAM;AAClC,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAM,mBAAmB;AACzB,QAAM,wBAAwB,MAAM,MAAM,CAAA,SAAQ,iBAAiB,KAAK,IAAI,CAAC;AAC7E,MAAI,SAAS;AACb,MAAI,uBAAuB;AACzB,aAAS,MAAM,IAAI,CAAA,SAAQ,KAAK,QAAQ,kBAAkB,EAAE,CAAC;EAC/D;AAEA,SAAO;IACL,MAAM,OAAO,KAAK,IAAI;IACtB,WAAW;EACb;AACF;AAKA,SAAS,uBAAuB,MAAM;AACpC,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAM,sBAAsB;AAC5B,QAAM,0BAA0B,MAAM,MAAM,CAAA,SAAQ,KAAK,WAAW,mBAAmB,CAAC;AACxF,MAAI,SAAS;AACb,MAAI,yBAAyB;AAC3B,aAAS,MAAM,IAAI,CAAA,SAAQ,KAAK,MAAM,oBAAoB,MAAM,CAAC;EACnE;AAEA,SAAO;IACL,MAAM,OAAO,KAAK,IAAI;IACtB,WAAW;EACb;AACF;AAKA,SAAS,WAAW,OAAO,eAAe;AACxC,MAAI,eAAe;AACjB,WAAO;EACT,OAAO;AACL,WAAO,GAAG,QAAQ,CAAC;EACrB;AACF;AAKA,SAAS,uBAAuB,OAAO,cAAc;AACnD,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI,MAAM,aAAa;AACrB,iBAAa,qBAAqB,YAAY;AAC9C,6BAAyB,uBAAuB,WAAW,IAAI;AAC/D,mBAAe,uBAAuB;EACxC,OAAO;AACL,iBAAa,uBAAuB,YAAY;AAChD,6BAAyB,qBAAqB,WAAW,IAAI;AAC7D,mBAAe,uBAAuB;EACxC;AAEA,SAAO,CAAC,YAAY,wBAAwB,YAAY;AAC1D;AAKO,SAAS,UAAU,UAAU,OAAO;AACzC,QAAM,qBAAqB,SAAS,mBAAmB,SAAS;AAChE,MAAI,iBAAiB,SAAS;AAC9B,MAAI,eAAe,SAAS;AAG5B,wBAAsB,QAAQ;AAE9B,QAAM,eAAe,SAAS,MAAM,MAAM,SAAS,gBAAgB,SAAS,YAAY;AAGxF,QAAM,CAAC,YAAY,wBAAwB,YAAY,IAAI,uBAAuB,OAAO,YAAY;AAErG,QAAM,gBAAgB,aAAa,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU;AACnE,WAAO,GAAG,WAAW,OAAO,MAAM,aAAa,CAAC,GAAG,KAAK;EAC1D,CAAC;AAED,QAAM,oBAAoB,cAAc,OAAO,CAAC,eAAe,eAAe,iBAAiB;AAC7F,WAAO,gBAAgB,WAAW,cAAc,MAAM,aAAa,EAAE;EACvE,GAAG,CAAC;AAEJ,QAAM,gCAAgC,cAAc,OAAO,CAAC,eAAe,eAAe,iBAAiB;AACzG,WAAO,gBAAgB,WAAW,cAAc,CAAC,MAAM,aAAa,EAAE;EACxE,GAAG,CAAC;AAGJ,MAAI,WAAW,WAAW;AACxB,QAAI,oBAAoB;AACtB,uBAAiB,KAAK,IAAI,iBAAiB,WAAW,GAAG,MAAM,aAAa,EAAE,QAAQ,CAAC;AACvF,qBAAe;IACjB,OAAO;AACL,uBAAiB,SAAS;AAC1B,qBAAe,SAAS,eAAe;IACzC;AACA,WAAO,EAAE,MAAM,cAAc,gBAAgB,aAAa;EAC5D;AAGA,QAAM,EAAE,kBAAkB,kBAAkB,IAAI,+BAA+B,QAAQ;AACvF,QAAM,OAAO,mBAAmB,cAAc,KAAK,IAAI,IAAI;AAE3D,MAAI,oBAAoB;AACtB,qBAAiB,KAAK,IAAI,iBAAiB,WAAW,GAAG,MAAM,aAAa,EAAE,SAAS,iBAAiB,QAAQ,CAAC;AACjH,mBAAe;EACjB,OAAO;AACL,QAAI,uBAAuB,WAAW;AAEpC,uBAAiB,KAAK,IAAI,SAAS,iBAAiB,iBAAiB,QAAQ,CAAC;AAC9E,qBAAe,SAAS,eAAe,iBAAiB,SAAS,oBAAoB;IACvF,OAAO;AAEL,uBAAiB,KAAK,IAAI,SAAS,iBAAiB,iBAAiB,QAAQ,CAAC;AAC9E,qBAAe,SAAS,eAAe,iBAAiB,SAAS;IACnE;EACF;AAEA,SAAO,EAAE,MAAM,gBAAgB,aAAa;AAC9C;AAKO,SAAS,eAAe,UAAU,OAAO;AAE9C,QAAM,SAAS;IACb;IACA,CAAC,OAAO,UAAU,IAAI,KAAK;IAC3B;;MAEE,iBAAiB,CAAC,YAAY,UAAU,QAAQ,cAAc;AAE5D,cAAM,cAAc,SAAS,MAAM,MAAM,WAAW,SAAS,YAAY;AACzE,cAAM,mBAAmB;AACzB,cAAM,qBAAqB;AAG3B,cAAM,iBAAiB,iBAAiB,KAAK,WAAW;AACxD,cAAM,mBAAmB,mBAAmB,KAAK,WAAW;AAC5D,cAAM,oBAAqB,MAAM,eAAe,kBAAoB,MAAM,iBAAiB;AAE3F,YAAI,aAAa,QAAQ;AAEvB,cAAI,mBAAmB;AAErB,kBAAM,cAAc,YAAY,MAAM,MAAM,cAAc,mBAAmB,kBAAkB;AAC/F,kBAAM,eAAe,cAAc,YAAY,CAAC,EAAE,SAAS;AAC3D,mBAAO;cACL,OAAO,KAAK,IAAI,WAAW,cAAc,SAAS;cAClD,KAAK,KAAK,IAAI,WAAW,cAAc,SAAS;YAClD;UACF,WAAW,kBAAkB,kBAAkB;AAE7C,kBAAM,iBAAiB,YAAY,MAAM,iBAAiB,mBAAmB,kBAAkB;AAC/F,kBAAM,kBAAkB,iBAAiB,eAAe,CAAC,EAAE,SAAS;AACpE,kBAAM,kBAAkB,MAAM,gBAAgB,IAAI;AAClD,kBAAM,aAAa,kBAAkB;AACrC,mBAAO;cACL,OAAO,WAAW;cAClB,KAAK,WAAW;YAClB;UACF,OAAO;AAEL,kBAAM,eAAe,MAAM,gBAAgB,IAAI;AAC/C,mBAAO;cACL,OAAO,WAAW;cAClB,KAAK,WAAW;YAClB;UACF;QACF,OAAO;AAEL,cAAI,mBAAmB;AAErB,kBAAM,cAAc,YAAY,MAAM,MAAM,cAAc,mBAAmB,kBAAkB;AAC/F,kBAAM,eAAe,cAAc,YAAY,CAAC,EAAE,SAAS;AAC3D,mBAAO;cACL,OAAO,KAAK,IAAI,WAAW,cAAc,SAAS;cAClD,KAAK,KAAK,IAAI,SAAS,cAAc,SAAS;YAChD;UACF,WAAW,kBAAkB,kBAAkB;AAE7C,kBAAM,iBAAiB,YAAY,MAAM,iBAAiB,mBAAmB,kBAAkB;AAC/F,kBAAM,kBAAkB,iBAAiB,eAAe,CAAC,EAAE,SAAS;AACpE,kBAAM,kBAAkB,MAAM,gBAAgB,IAAI;AAClD,kBAAM,aAAa,kBAAkB;AACrC,mBAAO;cACL,OAAO,WAAW;cAClB,KAAK,SAAS;YAChB;UACF,OAAO;AAEL,kBAAM,eAAe,MAAM,gBAAgB,IAAI;AAC/C,mBAAO;cACL,OAAO,WAAW;cAClB,KAAK,SAAS;YAChB;UACF;QACF;MACF;IACF;EACF;AAEA,aAAW,UAAU,MAAM;AAC7B;ACtMO,SAAS,iBAAiB,UAAU;AACzC,MAAI,CAAC;AAAU,WAAO,CAAC;AAEvB,QAAM,UAAU,CAAC;AACjB,QAAM,EAAE,gBAAgB,cAAc,MAAM,IAAI;AAGhD,QAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,MAAI,YAAY;AAChB,MAAI,cAAc;AAElB,aAAW,QAAQ,OAAO;AACxB,QAAI,kBAAkB,aAAa,kBAAkB,YAAY,KAAK,QAAQ;AAC5E,oBAAc;AACd;IACF;AACA,iBAAa,KAAK,SAAS;EAC7B;AAGA,MAAI,YAAY,WAAW,IAAI,GAAG;AAChC,QAAI,YAAY,WAAW,QAAQ,KAAK,YAAY,WAAW,QAAQ,GAAG;AACxE,cAAQ,KAAK,WAAW;IAC1B,OAAO;AACL,cAAQ,KAAK,aAAa;IAC5B;EACF;AAEA,MAAI,WAAW,KAAK,WAAW,GAAG;AAChC,YAAQ,KAAK,eAAe;EAC9B;AAEA,MAAI,YAAY,WAAW,IAAI,GAAG;AAChC,YAAQ,KAAK,OAAO;EACtB;AAEA,MAAI,YAAY,WAAW,IAAI;AAAG,YAAQ,KAAK,QAAQ;AACvD,MAAI,YAAY,WAAW,KAAK;AAAG,YAAQ,KAAK,UAAU;AAC1D,MAAI,YAAY,WAAW,MAAM;AAAG,YAAQ,KAAK,UAAU;AAG3D,QAAM,aAAa,KAAK,IAAI,GAAG,iBAAiB,EAAE;AAClD,QAAM,YAAY,KAAK,IAAI,MAAM,QAAQ,eAAe,EAAE;AAC1D,QAAM,cAAc,MAAM,MAAM,YAAY,SAAS;AAGrD,MAAI,YAAY,SAAS,IAAI,GAAG;AAC9B,UAAM,eAAe,MAAM,MAAM,KAAK,IAAI,GAAG,iBAAiB,GAAG,GAAG,cAAc;AAClF,UAAM,cAAc,MAAM,MAAM,cAAc,KAAK,IAAI,MAAM,QAAQ,eAAe,GAAG,CAAC;AACxF,UAAM,eAAe,aAAa,YAAY,IAAI;AAClD,UAAM,gBAAgB,YAAY,QAAQ,IAAI;AAC9C,QAAI,iBAAiB,MAAM,kBAAkB,IAAI;AAC/C,cAAQ,KAAK,MAAM;IACrB;EACF;AAGA,MAAI,YAAY,SAAS,GAAG,GAAG;AAC7B,UAAM,eAAe,MAAM,MAAM,KAAK,IAAI,GAAG,iBAAiB,GAAG,GAAG,cAAc;AAClF,UAAM,cAAc,MAAM,MAAM,cAAc,KAAK,IAAI,MAAM,QAAQ,eAAe,GAAG,CAAC;AACxF,UAAM,iBAAiB,aAAa,YAAY,GAAG;AACnD,UAAM,kBAAkB,YAAY,QAAQ,GAAG;AAC/C,QAAI,mBAAmB,MAAM,oBAAoB,IAAI;AACnD,cAAQ,KAAK,QAAQ;IACvB;EACF;AAGA,MAAI,YAAY,SAAS,GAAG,GAAG;AAC7B,UAAM,eAAe,MAAM,MAAM,KAAK,IAAI,GAAG,iBAAiB,GAAG,GAAG,cAAc;AAClF,UAAM,cAAc,MAAM,MAAM,cAAc,KAAK,IAAI,MAAM,QAAQ,eAAe,GAAG,CAAC;AACxF,QAAI,aAAa,SAAS,GAAG,KAAK,YAAY,SAAS,GAAG,GAAG;AAC3D,cAAQ,KAAK,MAAM;IACrB;EACF;AAGA,MAAI,YAAY,SAAS,GAAG,KAAK,YAAY,SAAS,GAAG,GAAG;AAC1D,UAAM,eAAe,MAAM,MAAM,KAAK,IAAI,GAAG,iBAAiB,GAAG,GAAG,cAAc;AAClF,UAAM,cAAc,MAAM,MAAM,cAAc,KAAK,IAAI,MAAM,QAAQ,eAAe,GAAG,CAAC;AACxF,UAAM,kBAAkB,aAAa,YAAY,GAAG;AACpD,UAAM,mBAAmB,YAAY,QAAQ,GAAG;AAChD,QAAI,oBAAoB,MAAM,qBAAqB,IAAI;AACrD,YAAM,eAAe,MAAM,MAAM,eAAe,mBAAmB,GAAG,eAAe,mBAAmB,EAAE;AAC1G,UAAI,aAAa,WAAW,GAAG,GAAG;AAChC,gBAAQ,KAAK,MAAM;MACrB;IACF;EACF;AAEA,SAAO;AACT;ACjGO,SAAS,WAAW,UAAU;AACnC,MAAI,CAAC,YAAY,SAAS,YAAY,SAAS;AAAU;AAEzD,WAAS,cAAc,UAAU;AACjC,iBAAe,UAAU,QAAQ;AAEjC,QAAM,QAAQ,kBAAkB,QAAQ,IAAI;AAC5C,QAAM,SAAS,WAAW,UAAU,KAAK;AAEzC,cAAY,MAAM;AAElB,aAAW,UAAU,MAAM;AAE3B,iBAAe,UAAU,OAAO;AAClC;AAKO,SAAS,aAAa,UAAU;AACrC,MAAI,CAAC,YAAY,SAAS,YAAY,SAAS;AAAU;AACzD,QAAM,QAAQ,kBAAkB,QAAQ,MAAM;AAC9C,QAAM,SAAS,WAAW,UAAU,KAAK;AACzC,aAAW,UAAU,MAAM;AAC7B;AAKO,SAAS,WAAW,UAAU;AACnC,MAAI,CAAC,YAAY,SAAS,YAAY,SAAS;AAAU;AAGzD,QAAM,QAAQ,kBAAkB,QAAQ,IAAI;AAC5C,QAAM,SAAS,WAAW,UAAU,KAAK;AACzC,aAAW,UAAU,MAAM;AAC7B;AAKO,SAAS,WAAW,UAAU,UAAU,CAAC,GAAG;AACjD,MAAI,CAAC,YAAY,SAAS,YAAY,SAAS;AAAU;AAEzD,QAAM,eAAe,SAAS,MAAM,MAAM,SAAS,gBAAgB,SAAS,YAAY;AACxF,MAAI,QAAQ,kBAAkB,QAAQ,IAAI;AAG1C,QAAM,QAAQ,gBAAgB,aAAa,MAAM,cAAc;AAE/D,MAAI,SAAS,CAAC,QAAQ,KAAK;AAEzB,UAAM,SAAS,KAAK,YAAY;AAChC,UAAM,cAAc;EAEtB,WAAW,QAAQ,KAAK;AAEtB,UAAM,SAAS,KAAK,QAAQ,GAAG;AAC/B,UAAM,cAAc;EACtB;AAGA,MAAI,QAAQ,QAAQ,CAAC,cAAc;AAEjC,UAAM,MAAM,SAAS;AACrB,aAAS,QAAQ,SAAS,MAAM,MAAM,GAAG,GAAG,IAAI,QAAQ,OAAO,SAAS,MAAM,MAAM,GAAG;AACvF,aAAS,iBAAiB;AAC1B,aAAS,eAAe,MAAM,QAAQ,KAAK;EAC7C;AAEA,QAAM,SAAS,WAAW,UAAU,KAAK;AACzC,aAAW,UAAU,MAAM;AAC7B;AAKO,SAAS,iBAAiB,UAAU;AACzC,MAAI,CAAC,YAAY,SAAS,YAAY,SAAS;AAAU;AACzD,QAAM,QAAQ,kBAAkB,QAAQ,UAAU;AAClD,iBAAe,UAAU,KAAK;AAChC;AAKO,SAAS,mBAAmB,UAAU;AAC3C,MAAI,CAAC,YAAY,SAAS,YAAY,SAAS;AAAU;AACzD,QAAM,QAAQ,kBAAkB,QAAQ,YAAY;AACpD,iBAAe,UAAU,KAAK;AAChC;AAMO,SAAS,YAAY,UAAU;AACpC,MAAI,CAAC,YAAY,SAAS,YAAY,SAAS;AAAU;AAEzD,WAAS,eAAe,UAAU;AAClC,iBAAe,UAAU,SAAS;AAElC,QAAM,QAAQ,kBAAkB,QAAQ,KAAK;AAG7C,QAAM,SAAS;IACb;IACA,CAAC,OAAO,eAAe,IAAI,KAAK;IAChC,EAAE,QAAQ,MAAM,OAAO;EACzB;AAEA,cAAY,MAAM;AAClB,aAAW,UAAU,MAAM;AAC3B,iBAAe,UAAU,OAAO;AAClC;AAMO,SAAS,eAAe,UAAU;AACvC,MAAI,CAAC,YAAY,SAAS,YAAY,SAAS;AAAU;AAEzD,QAAM,QAAQ,kBAAkB,QAAQ,QAAQ;AAGhD,QAAM,SAAS;IACb;IACA,CAAC,OAAO,eAAe,IAAI,KAAK;IAChC,EAAE,QAAQ,MAAM,OAAO;EACzB;AAEA,aAAW,UAAU,MAAM;AAC7B;AAKO,SAAS,aAAa,UAAU,QAAQ,GAAG,SAAS,OAAO;AAChE,MAAI,CAAC,YAAY,SAAS,YAAY,SAAS;AAAU;AACzD,MAAI,QAAQ,KAAK,QAAQ;AAAG,YAAQ;AAEpC,WAAS,gBAAgB,iCAAiC;AAC1D,WAAS,gBAAgB,UAAU,KAAK,aAAa,MAAM,EAAE;AAC7D,WAAS,gBAAgB,mBAAmB,SAAS,cAAc,IAAI,SAAS,YAAY,EAAE;AAE9F,QAAM,YAAY,SAAS,UAAU,IAAI,MAAM,KAAK;AACpD,QAAM,QAAQ,kBAAkB,QAAQ,SAAS,KAAK,QAAQ,OAAO;AACrE,WAAS,gBAAgB,kBAAkB,MAAM,MAAM,GAAG;AAG1D,QAAM,QAAQ,SAAS;AACvB,QAAM,gBAAgB,SAAS;AAC/B,QAAM,cAAc,SAAS;AAG7B,MAAI,YAAY;AAChB,SAAO,YAAY,KAAK,MAAM,YAAY,CAAC,MAAM,MAAM;AACrD;EACF;AACA,MAAI,UAAU;AACd,SAAO,UAAU,MAAM,UAAU,MAAM,OAAO,MAAM,MAAM;AACxD;EACF;AAGA,QAAM,qBAAqB,MAAM,MAAM,WAAW,OAAO;AACzD,WAAS,gBAAgB,2BAA2B,kBAAkB,GAAG;AAEzE,QAAM,sBAAsB,mBAAmB,MAAM,cAAc;AACnE,QAAM,gBAAgB,sBAAsB,oBAAoB,CAAC,EAAE,SAAS;AAC5E,QAAM,uBAAuB,sBAAsB,oBAAoB,CAAC,EAAE,SAAS;AAEnF,WAAS,gBAAgB,wBAAwB;AACjD,WAAS,gBAAgB,cAAc,sBAAsB,IAAI,oBAAoB,CAAC,CAAC,MAAM,MAAM,EAAE;AACrG,WAAS,gBAAgB,uBAAuB,aAAa,EAAE;AAC/D,WAAS,gBAAgB,+BAA+B,oBAAoB,EAAE;AAC9E,WAAS,gBAAgB,qBAAqB,KAAK,EAAE;AAGrD,QAAM,kBAAkB,UAAU,kBAAkB;AACpD,WAAS,gBAAgB,sBAAsB,eAAe,YAAY,MAAM,mBAAmB,aAAa,WAAW,KAAK,GAAG;AAGnI,QAAM,SAAS;IACb;IACA,CAAC,OAAO;AACN,YAAM,cAAc,GAAG,MAAM,MAAM,GAAG,gBAAgB,GAAG,YAAY;AACrE,eAAS,gBAAgB,uBAAuB,WAAW,GAAG;AAG9D,YAAM,cAAc,YAAY,QAAQ,cAAc,EAAE;AACxD,eAAS,gBAAgB,kBAAkB,WAAW,GAAG;AAEzD,UAAI;AAEJ,UAAI,iBAAiB;AAEnB,iBAAS,gBAAgB,wCAAwC;AACjE,kBAAU;MACZ,WAAW,gBAAgB,GAAG;AAE5B,iBAAS,gBAAgB,sBAAsB,aAAa,UAAU,KAAK,EAAE;AAC7E,kBAAU,MAAM,SAAS;MAC3B,OAAO;AAEL,iBAAS,gBAAgB,2BAA2B;AACpD,kBAAU,MAAM,SAAS;MAC3B;AAEA,eAAS,gBAAgB,cAAc,OAAO,GAAG;AAEjD,aAAO;QACL,MAAM;QACN,gBAAgB,GAAG;QACnB,cAAc,GAAG;MACnB;IACF;IACA;MACE,QAAQ,MAAM;;MAEd,iBAAiB,CAAC,YAAY,UAAU,QAAQ,iBAAiB;AAC/D,iBAAS,gBAAgB,sBAAsB;AAC/C,iBAAS,gBAAgB,yBAAyB,UAAU,EAAE;AAC9D,iBAAS,gBAAgB,wBAAwB,eAAe,EAAE;AAClE,iBAAS,gBAAgB,iBAAiB,QAAQ,aAAa,MAAM,EAAE;AACvE,iBAAS,gBAAgB,qBAAqB,YAAY,EAAE;AAE5D,YAAI,iBAAiB;AAEnB,gBAAM,aAAa,KAAK,IAAI,WAAW,sBAAsB,YAAY;AACzE,mBAAS,gBAAgB,sCAAsC,oBAAoB,EAAE;AACrF,iBAAO;YACL,OAAO;YACP,KAAK,aAAa,SAAS,aAAa,KAAK,IAAI,SAAS,sBAAsB,YAAY;UAC9F;QACF,WAAW,uBAAuB,GAAG;AAEnC,gBAAM,aAAa,MAAM,OAAO,SAAS;AACzC,mBAAS,gBAAgB,sCAAsC,UAAU,EAAE;AAC3E,iBAAO;YACL,OAAO,WAAW;YAClB,KAAK,SAAS;UAChB;QACF,OAAO;AAEL,mBAAS,gBAAgB,oCAAoC,MAAM,OAAO,MAAM,EAAE;AAClF,iBAAO;YACL,OAAO,WAAW,MAAM,OAAO;YAC/B,KAAK,SAAS,MAAM,OAAO;UAC7B;QACF;MACF;IACF;EACF;AAEA,WAAS,gBAAgB,uBAAuB,OAAO,IAAI,aAAa,OAAO,cAAc,IAAI,OAAO,YAAY,EAAE;AACtH,WAAS,gBAAgB,+BAA+B;AAExD,aAAW,UAAU,MAAM;AAC7B;AAKO,SAAS,SAAS,UAAU;AACjC,eAAa,UAAU,GAAG,IAAI;AAChC;AAKO,SAAS,SAAS,UAAU;AACjC,eAAa,UAAU,GAAG,IAAI;AAChC;AAKO,SAAS,SAAS,UAAU;AACjC,eAAa,UAAU,GAAG,IAAI;AAChC;AAKO,SAASC,kBAAiB,UAAU;AACzC,SAAO,iBAAU,QAAQ;AAC3B;;;ACtSO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAAY,QAAQ;AAClB,SAAK,SAAS;AACd,SAAK,WAAW,OAAO;AAAA,EAEzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,OAAO;AACnB,UAAM,QAAQ,UAAU,SAAS,YAAY,EAAE,SAAS,KAAK;AAC7D,UAAM,SAAS,QAAQ,MAAM,UAAU,MAAM;AAE7C,QAAI,CAAC;AAAQ,aAAO;AAEpB,QAAI,SAAS;AAGb,YAAO,MAAM,IAAI,YAAY,GAAG;AAAA,MAC9B,KAAK;AACH,YAAI,CAAC,MAAM,UAAU;AACnB,mBAAS;AAAA,QACX;AACA;AAAA,MAEF,KAAK;AACH,YAAI,CAAC,MAAM,UAAU;AACnB,mBAAS;AAAA,QACX;AACA;AAAA,MAEF,KAAK;AACH,YAAI,CAAC,MAAM,UAAU;AACnB,mBAAS;AAAA,QACX;AACA;AAAA,MAEF,KAAK;AACH,YAAI,MAAM,UAAU;AAClB,mBAAS;AAAA,QACX;AACA;AAAA,MAEF,KAAK;AACH,YAAI,MAAM,UAAU;AAClB,mBAAS;AAAA,QACX;AACA;AAAA,IACJ;AAGA,QAAI,QAAQ;AACV,YAAM,eAAe;AAGrB,UAAI,KAAK,OAAO,SAAS;AACvB,aAAK,OAAO,QAAQ,aAAa,MAAM;AAAA,MACzC,OAAO;AAEL,aAAK,aAAa,MAAM;AAAA,MAC1B;AAEA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,QAAQ;AACzB,UAAM,WAAW,KAAK;AACtB,QAAI,CAAC;AAAU;AAGf,aAAS,MAAM;AAEf,QAAI;AACF,cAAQ,QAAQ;AAAA,QACd,KAAK;AACH,UAAgB,WAAW,QAAQ;AACnC;AAAA,QACF,KAAK;AACH,UAAgB,aAAa,QAAQ;AACrC;AAAA,QACF,KAAK;AACH,UAAgB,WAAW,QAAQ;AACnC;AAAA,QACF,KAAK;AACH,UAAgB,iBAAiB,QAAQ;AACzC;AAAA,QACF,KAAK;AACH,UAAgB,mBAAmB,QAAQ;AAC3C;AAAA,MACJ;AAGA,eAAS,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;AAAA,IAC9D,SAAS,OAAO;AACd,cAAQ,MAAM,6BAA6B,KAAK;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AAAA,EAEV;AACF;;;ACpHO,IAAM,QAAQ;AAAA,EACnB,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,WAAW;AAAA;AAAA,IACX,aAAa;AAAA;AAAA,IACb,MAAM;AAAA;AAAA,IACN,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,IACJ,QAAQ;AAAA;AAAA,IACR,IAAI;AAAA;AAAA,IACJ,MAAM;AAAA;AAAA,IACN,MAAM;AAAA;AAAA,IACN,QAAQ;AAAA;AAAA,IACR,YAAY;AAAA;AAAA,IACZ,IAAI;AAAA;AAAA,IACJ,cAAc;AAAA;AAAA,IACd,QAAQ;AAAA;AAAA,IACR,WAAW;AAAA;AAAA,IACX,YAAY;AAAA;AAAA;AAAA,IAEZ,WAAW;AAAA;AAAA,IACX,eAAe;AAAA;AAAA,IACf,aAAa;AAAA;AAAA,IACb,cAAc;AAAA;AAAA,IACd,eAAe;AAAA;AAAA,EACjB;AACF;AAKO,IAAM,OAAO;AAAA,EAClB,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,WAAW;AAAA;AAAA,IACX,aAAa;AAAA;AAAA,IACb,MAAM;AAAA;AAAA,IACN,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,IACJ,QAAQ;AAAA;AAAA,IACR,IAAI;AAAA;AAAA,IACJ,MAAM;AAAA;AAAA,IACN,MAAM;AAAA;AAAA,IACN,QAAQ;AAAA;AAAA,IACR,YAAY;AAAA;AAAA,IACZ,IAAI;AAAA;AAAA,IACJ,cAAc;AAAA;AAAA,IACd,QAAQ;AAAA;AAAA,IACR,WAAW;AAAA;AAAA,IACX,YAAY;AAAA;AAAA;AAAA,IAEZ,WAAW;AAAA;AAAA,IACX,eAAe;AAAA;AAAA,IACf,aAAa;AAAA;AAAA,IACb,cAAc;AAAA;AAAA,IACd,eAAe;AAAA;AAAA,EACjB;AACF;AAKO,IAAM,SAAS;AAAA,EACpB;AAAA,EACA;AAAA;AAAA,EAEA,OAAO;AAAA,EACP,MAAM;AACR;AAOO,SAAS,SAAS,OAAO;AAC9B,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,WAAW,OAAO,KAAK,KAAK,OAAO;AAEzC,WAAO,EAAE,GAAG,UAAU,MAAM,MAAM;AAAA,EACpC;AACA,SAAO;AACT;AAOO,SAAS,eAAe,QAAQ;AACrC,QAAM,OAAO,CAAC;AACd,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAEjD,UAAM,UAAU,IAAI,QAAQ,YAAY,KAAK,EAAE,YAAY;AAC3D,SAAK,KAAK,KAAK,OAAO,KAAK,KAAK,GAAG;AAAA,EACrC;AACA,SAAO,KAAK,KAAK,IAAI;AACvB;AAQO,SAAS,WAAW,WAAW,eAAe,CAAC,GAAG;AACvD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ;AAAA,MACN,GAAG,UAAU;AAAA,MACb,GAAG;AAAA,IACL;AAAA,EACF;AACF;;;AC/GO,SAAS,eAAe,UAAU,CAAC,GAAG;AAC3C,QAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS,CAAC;AAAA,EACZ,IAAI;AAGJ,QAAM,eAAe,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI;AAAA;AAAA;AAAA;AAAA,UAI9C,OAAO,QAAQ,MAAM,EACpB,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM;AACpB,UAAM,UAAU,KAAK,QAAQ,YAAY,KAAK,EAAE,YAAY;AAC5D,WAAO,GAAG,OAAO,KAAK,GAAG;AAAA,EAC3B,CAAC,EACA,KAAK,YAAY,CAAC;AAAA;AAAA;AAAA,MAGvB;AAGJ,QAAM,YAAY,SAAS,MAAM,SAAS,eAAe,MAAM,MAAM,IAAI;AAEzE,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOD,YAAY;AAAA;AAAA,QAEZ,SAAS,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAoCH,UAAU;AAAA;AAAA;AAAA,6CAGc,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;A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",
|
|
6
|
+
"names": ["debugMode", "getActiveFormats"]
|
|
7
7
|
}
|