@synclineapi/editor 4.0.1 → 4.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncline-editor.es.js","sources":["../src/core/constants.ts","../src/core/document.ts","../src/core/wrap-map.ts","../src/core/tokeniser.ts","../src/themes/built-in-themes.ts","../src/themes/theme-manager.ts","../src/ui/styles.ts","../src/utils/dom.ts","../src/utils/string.ts","../src/utils/validation.ts","../src/features/bracket-matcher.ts","../src/features/code-folding.ts","../src/features/emmet.ts","../src/features/snippets.ts","../src/features/multi-cursor.ts","../src/features/find-replace.ts","../src/features/word-highlight.ts","../src/features/autocomplete.ts","../src/features/hover.ts","../src/renderer/row-renderer.ts","../src/renderer/minimap-renderer.ts","../src/SynclineEditor.ts","../src/index.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────────────\n// syncline-editor · core/constants.ts\n// All magic numbers in one place — change here, changes everywhere.\n// ─────────────────────────────────────────────────────────────\n\n/** Default line height in pixels. */\nexport const DEFAULT_LINE_HEIGHT = 22;\n\n/** Overscan rows above/below the visible region for virtual rendering. */\nexport const VIRTUAL_OVERSCAN = 6;\n\n/** Maximum undo/redo stack depth. */\nexport const DEFAULT_MAX_UNDO = 300;\n\n/** Default gutter width in pixels. */\nexport const DEFAULT_GUTTER_WIDTH = 60;\n\n/** Left padding inside the code area (px). */\nexport const CODE_PADDING_LEFT = 14;\n\n/** Right padding inside the code area (px). */\nexport const CODE_PADDING_RIGHT = 20;\n\n/** Default monospace character width (px) — JetBrains Mono 13px. */\nexport const DEFAULT_CHAR_WIDTH = 7.82;\n\n/** Default font size (px). */\nexport const DEFAULT_FONT_SIZE = 13;\n\n/** Default tab size (spaces). */\nexport const DEFAULT_TAB_SIZE = 2;\n\n/** Default word-wrap column. */\nexport const DEFAULT_WRAP_COLUMN = 80;\n\n/** Minimap: pixels per doc line. */\nexport const MM_LINE_HEIGHT = 2;\n\n/** Minimap: pixels per character column. */\nexport const MM_CHAR_WIDTH = 1.1;\n\n/** Minimap: left padding. */\nexport const MM_PADDING = 3;\n\n/** Default minimap width (px). */\nexport const DEFAULT_MINIMAP_WIDTH = 120;\n\n/** Undo batching window (ms) — keystrokes within this window are grouped. */\nexport const UNDO_BATCH_MS = 700;\n\n/** Cursor blink period (ms). */\nexport const DEFAULT_BLINK_RATE = 1050;\n\n/**\n * Autocomplete debounce window (ms).\n * The suggestion engine is not invoked until the user pauses typing for\n * this many milliseconds — prevents expensive re-computation on every keystroke.\n */\nexport const AC_DEBOUNCE_MS = 120;\n\n/**\n * Per-language default line-comment token for the toggle-comment command.\n * Languages not listed here have no line-comment support by default.\n */\nexport const LANGUAGE_COMMENT_TOKEN: Record<string, string> = {\n typescript: '//',\n javascript: '//',\n css: '//',\n json: '',\n markdown: '',\n text: '',\n};\n\n// ─── Per-language keyword sets ───────────────────────────────\n\n/** TypeScript keywords (superset of JavaScript). */\nexport const KEYWORDS_TS = new Set([\n 'function','const','let','var','return','if','else','for','while','class',\n 'import','export','default','async','await','new','this','typeof','instanceof',\n 'try','catch','finally','throw','extends','interface','type','readonly',\n 'private','public','protected','static','override','implements','enum',\n 'namespace','declare','abstract','as','from','of','in','void','switch','case',\n 'break','continue','do','delete','yield','super','null','true','false',\n 'undefined','require','constructor',\n]);\n\n/** JavaScript keywords (TypeScript minus TypeScript-only syntax). */\nexport const KEYWORDS_JS = new Set([\n 'function','const','let','var','return','if','else','for','while','class',\n 'import','export','default','async','await','new','this','typeof','instanceof',\n 'try','catch','finally','throw','extends','as','from','of','in','void','switch',\n 'case','break','continue','do','delete','yield','super','null','true','false',\n 'undefined','require','constructor','static',\n]);\n\n/** CSS keywords — at-rule names, layout values, and common single-word values. */\nexport const KEYWORDS_CSS = new Set([\n // At-rules (without @)\n 'media','keyframes','import','charset','supports','layer','container','namespace','page',\n // Position values\n 'static','relative','absolute','fixed','sticky',\n // Display values\n 'block','inline','flex','grid','none','contents','table',\n // Overflow / visibility\n 'hidden','visible','scroll','clip','auto',\n // Text / font values\n 'bold','normal','italic','underline','uppercase','lowercase','capitalize',\n 'left','right','center','justify',\n // Sizing keywords\n 'inherit','initial','unset','revert',\n // Misc values\n 'pointer','default','transparent','solid','dashed','dotted','double',\n 'cover','contain','no-repeat','repeat',\n // CSS functions (used as values)\n 'var','calc','min','max','clamp',\n]);\n\n/** JSON keywords. */\nexport const KEYWORDS_JSON = new Set(['null','true','false']);\n\n/** Markdown / plain-text — no keywords. */\nexport const KEYWORDS_MD: Set<string> = new Set();\n\n// ─── Per-language type sets ───────────────────────────────────\n\n/** TypeScript built-in types. */\nexport const TYPES_TS = new Set([\n 'number','string','boolean','any','never','unknown','object','Promise','Array',\n 'Map','Set','Record','Partial','Required','Readonly','HTMLElement',\n 'KeyboardEvent','Float64Array','EventListener','Document','Window',\n 'Node','Element','Event','MouseEvent','CustomEvent',\n]);\n\n/** JavaScript built-in types (no pure TypeScript utility types). */\nexport const TYPES_JS = new Set([\n 'number','string','boolean','object','Promise','Array','Map','Set',\n 'HTMLElement','KeyboardEvent','Float64Array','EventListener',\n 'Document','Window','Node','Element','Event','MouseEvent','CustomEvent',\n]);\n\n/** CSS / JSON / Markdown — no \"type\" concept. */\nexport const TYPES_CSS: Set<string> = new Set();\nexport const TYPES_JSON: Set<string> = new Set();\nexport const TYPES_MD: Set<string> = new Set();\n\n// ─── Lookup maps for language-aware code ─────────────────────\n\n/** Map from language string to the keyword Set for that language. */\nexport const LANGUAGE_KEYWORDS: Record<string, Set<string>> = {\n typescript: KEYWORDS_TS,\n javascript: KEYWORDS_JS,\n css: KEYWORDS_CSS,\n json: KEYWORDS_JSON,\n markdown: KEYWORDS_MD,\n text: KEYWORDS_MD,\n};\n\n/** Map from language string to the type Set for that language. */\nexport const LANGUAGE_TYPES: Record<string, Set<string>> = {\n typescript: TYPES_TS,\n javascript: TYPES_JS,\n css: TYPES_CSS,\n json: TYPES_JSON,\n markdown: TYPES_MD,\n text: TYPES_MD,\n};\n\n/** Auto-close pairs. */\nexport const AUTO_CLOSE_PAIRS: Record<string, string> = {\n '(': ')', '[': ']', '{': '}', '\"': '\"', \"'\": \"'\", '`': '`',\n};\n\n/** Characters that should be skipped over when typed at close position. */\nexport const SKIP_CLOSE_CHARS = new Set([')', ']', '}']);\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · core/document.ts\n// Immutable-snapshot document model with undo/redo history.\n// ─────────────────────────────────────────────────────────────\n\nimport type { CursorPosition, Selection, HistorySnapshot, EditorTab } from '../types/index.js';\nimport { DEFAULT_MAX_UNDO } from './constants.js';\n\nlet _nextTabId = 1;\n\n/** Create a fresh tab from content lines. */\nexport function createTab(fileId: number, lines: string[]): EditorTab {\n return {\n fileId,\n doc: [...lines],\n cur: { row: 0, col: 0 },\n sel: null,\n dirty: false,\n undoStack: [],\n redoStack: [],\n scrollTop: 0,\n };\n}\n\nexport function nextTabId(): number {\n return _nextTabId++;\n}\n\n/** Push a snapshot onto the undo stack, clearing redo. */\nexport function pushSnapshot(tab: EditorTab, maxHistory = DEFAULT_MAX_UNDO): void {\n const snap: HistorySnapshot = {\n doc: [...tab.doc],\n cur: { ...tab.cur },\n sel: tab.sel ? { ...tab.sel } : null,\n };\n tab.undoStack.push(snap);\n if (tab.undoStack.length > maxHistory) tab.undoStack.shift();\n tab.redoStack = [];\n tab.dirty = true;\n}\n\n/** Undo: restore previous snapshot, return true if successful. */\nexport function applyUndo(tab: EditorTab): boolean {\n if (!tab.undoStack.length) return false;\n const current: HistorySnapshot = {\n doc: [...tab.doc],\n cur: { ...tab.cur },\n sel: tab.sel ? { ...tab.sel } : null,\n };\n tab.redoStack.push(current);\n const prev = tab.undoStack.pop()!;\n tab.doc = prev.doc;\n tab.cur = prev.cur;\n tab.sel = prev.sel;\n return true;\n}\n\n/** Redo: restore next snapshot, return true if successful. */\nexport function applyRedo(tab: EditorTab): boolean {\n if (!tab.redoStack.length) return false;\n const current: HistorySnapshot = {\n doc: [...tab.doc],\n cur: { ...tab.cur },\n sel: tab.sel ? { ...tab.sel } : null,\n };\n tab.undoStack.push(current);\n const next = tab.redoStack.pop()!;\n tab.doc = next.doc;\n tab.cur = next.cur;\n tab.sel = next.sel;\n return true;\n}\n\n/** Clamp cursor to valid document bounds. */\nexport function clampCursor(tab: EditorTab): void {\n const { doc, cur } = tab;\n cur.row = Math.max(0, Math.min(doc.length - 1, cur.row));\n cur.col = Math.max(0, Math.min((doc[cur.row] ?? '').length, cur.col));\n}\n\n/** Normalise a selection so anchor ≤ focus. */\nexport function normaliseSelection(sel: Selection): Selection {\n const { ar, ac, fr, fc } = sel;\n if (ar < fr || (ar === fr && ac <= fc)) return sel;\n return { ar: fr, ac: fc, fr: ar, fc: ac };\n}\n\n/** Get the selected range on a specific doc line, or null. */\nexport function selectionOnLine(\n sel: Selection | null,\n docLine: number,\n lineLength: number,\n): { start: number; end: number } | null {\n if (!sel) return null;\n const ns = normaliseSelection(sel);\n if (docLine < ns.ar || docLine > ns.fr) return null;\n return {\n start: docLine === ns.ar ? ns.ac : 0,\n end: docLine === ns.fr ? ns.fc : lineLength,\n };\n}\n\n/** Count the total characters covered by a selection. */\nexport function selectionCharCount(tab: EditorTab): number {\n if (!tab.sel) return 0;\n const ns = normaliseSelection(tab.sel);\n let n = 0;\n for (let r = ns.ar; r <= ns.fr; r++) {\n const line = tab.doc[r] ?? '';\n const from = r === ns.ar ? ns.ac : 0;\n const to = r === ns.fr ? ns.fc : line.length;\n n += to - from;\n }\n return n;\n}\n\n/** Return the selected text. */\nexport function getSelectedText(tab: EditorTab): string {\n if (!tab.sel) return '';\n const ns = normaliseSelection(tab.sel);\n const lines: string[] = [];\n for (let r = ns.ar; r <= ns.fr; r++) {\n const line = tab.doc[r] ?? '';\n lines.push(line.slice(r === ns.ar ? ns.ac : 0, r === ns.fr ? ns.fc : line.length));\n }\n return lines.join('\\n');\n}\n\n/** Delete the current selection in-place. Returns the new cursor. */\nexport function deleteSelection(tab: EditorTab): CursorPosition {\n const sel = tab.sel;\n if (!sel) return tab.cur;\n const ns = normaliseSelection(sel);\n const before = (tab.doc[ns.ar] ?? '').slice(0, ns.ac);\n const after = (tab.doc[ns.fr] ?? '').slice(ns.fc);\n tab.doc.splice(ns.ar, ns.fr - ns.ar + 1, before + after);\n tab.sel = null;\n return { row: ns.ar, col: ns.ac };\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · core/wrap-map.ts\n// Builds the visual-row ↔ doc-line mapping for word wrap.\n// ─────────────────────────────────────────────────────────────\n\nimport type { VisualRow } from '../types/index.js';\n\nexport interface WrapMap {\n /** wrapMap[docLine] = array of segment strings */\n segments: string[][];\n /** visualRows[visIdx] = {docLine, segIdx, text} */\n visualRows: VisualRow[];\n /** docToVisArr[docLine] = first visual row index for that doc line */\n docToVisArr: number[];\n}\n\n/** Split one doc line into visual segments for the given wrap width.\n * Wraps at word boundaries (spaces) when possible so words are never\n * split mid-character. Falls back to a hard break only when no space\n * is found within the wrap column range. The trailing space is kept at\n * the end of the previous segment so segment lengths always sum to the\n * total line length — cursor mapping remains exact. */\nexport function wrapLine(text: string, wrapWidth: number, enabled: boolean): string[] {\n if (!enabled || text.length <= wrapWidth) return [text];\n const segs: string[] = [];\n let i = 0;\n while (i < text.length) {\n if (text.length - i <= wrapWidth) { segs.push(text.slice(i)); break; }\n const end = i + wrapWidth;\n // Search backward from the hard-break position for the last space.\n // We search from `end` down to `i+1` so we always include at least\n // one character in the segment.\n let breakAt = -1;\n for (let j = end; j > i; j--) {\n if (text[j - 1] === ' ') { breakAt = j; break; } // break after the space\n }\n if (breakAt === -1) {\n // No word boundary found — hard break at wrapWidth.\n segs.push(text.slice(i, end));\n i = end;\n } else {\n segs.push(text.slice(i, breakAt));\n i = breakAt;\n }\n }\n return segs;\n}\n\n/** Build the full wrap map for a document, skipping folded lines. */\nexport function buildWrapMap(\n doc: string[],\n wrapWidth: number,\n wrapEnabled: boolean,\n foldedLines: Map<number, number>,\n): WrapMap {\n const segments: string[][] = [];\n const visualRows: VisualRow[] = [];\n const docToVisArr: number[] = [];\n\n let skipUntil = -1;\n\n for (let d = 0; d < doc.length; d++) {\n if (d > 0 && d <= skipUntil) {\n // Folded — record position but emit no visual rows\n docToVisArr.push(visualRows.length);\n segments.push([doc[d] ?? '']);\n continue;\n }\n\n docToVisArr.push(visualRows.length);\n const segs = wrapLine(doc[d] ?? '', wrapWidth, wrapEnabled);\n segments.push(segs);\n segs.forEach((text, segIdx) => visualRows.push({ docLine: d, segIdx, text }));\n\n if (foldedLines.has(d)) {\n skipUntil = foldedLines.get(d)!;\n }\n }\n\n return { segments, visualRows, docToVisArr };\n}\n\n/** Convert a doc {row, col} to a visual row index + column-in-segment. */\nexport function docToVisualPos(\n wm: WrapMap,\n row: number,\n col: number,\n): { visRow: number; colInSeg: number } {\n const segs = wm.segments[row] ?? [''];\n let rem = col;\n for (let s = 0; s < segs.length; s++) {\n if (rem <= segs[s].length || s === segs.length - 1) {\n return {\n visRow: wm.docToVisArr[row] + s,\n colInSeg: Math.min(rem, segs[s].length),\n };\n }\n rem -= segs[s].length;\n }\n return { visRow: wm.docToVisArr[row] ?? 0, colInSeg: 0 };\n}\n\n/** Convert a visual row index + column-in-segment to doc {row, col}. */\nexport function visualToDocPos(\n wm: WrapMap,\n visIdx: number,\n colInSeg: number,\n): { row: number; col: number } {\n const vr = wm.visualRows[visIdx];\n if (!vr) return { row: 0, col: 0 };\n const segs = wm.segments[vr.docLine] ?? [''];\n let col = Math.min(colInSeg, segs[vr.segIdx]?.length ?? 0);\n for (let s = 0; s < vr.segIdx; s++) col += segs[s].length;\n return { row: vr.docLine, col };\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · core/tokeniser.ts\n// Hand-written regex-free syntax tokeniser for JS/TS/CSS/JSON.\n// Zero dependencies. Single responsibility: produce token segments.\n// ─────────────────────────────────────────────────────────────\n\nimport type { TokenSegment } from '../types/index.js';\nimport { LANGUAGE_KEYWORDS, LANGUAGE_TYPES, KEYWORDS_TS, TYPES_TS } from './constants.js';\n\nexport interface TokeniserOptions {\n /** Language selects the base keyword/type set. Default: `'typescript'`. */\n language?: string;\n /** Extra keywords merged on top of the language defaults. */\n extraKeywords?: Set<string>;\n /** Extra types merged on top of the language defaults. */\n extraTypes?: Set<string>;\n}\n\n/** Tokenise a single line of text into coloured segments. */\nexport function tokeniseLine(\n text: string,\n opts: TokeniserOptions = {},\n): TokenSegment[] {\n const segs: TokenSegment[] = [];\n const len = text.length;\n let i = 0;\n\n const push = (cls: TokenSegment['cls'], start: number, end: number): void => {\n if (end > start) segs.push({ cls, start, end });\n };\n\n const baseKws = LANGUAGE_KEYWORDS[opts.language ?? 'typescript'] ?? KEYWORDS_TS;\n const baseTypes = LANGUAGE_TYPES[opts.language ?? 'typescript'] ?? TYPES_TS;\n\n const kws = opts.extraKeywords?.size ? new Set([...baseKws, ...opts.extraKeywords]) : baseKws;\n const types = opts.extraTypes?.size ? new Set([...baseTypes, ...opts.extraTypes]) : baseTypes;\n\n while (i < len) {\n // ── Line comment\n if (text[i] === '/' && text[i + 1] === '/') { push('cmt', i, len); break; }\n // ── Block comment fragment (already opened on prev line)\n if (text[i] === '*' || (text[i] === '/' && text[i + 1] === '*')) {\n push('cmt', i, len); break;\n }\n // ── Decorator\n if (text[i] === '@') {\n let j = i + 1;\n while (j < len && /\\w/.test(text[j])) j++;\n push('dec', i, j); i = j; continue;\n }\n // ── String / template literal\n if (text[i] === '\"' || text[i] === \"'\" || text[i] === '`') {\n const q = text[i]; let j = i + 1;\n while (j < len) {\n if (text[j] === '\\\\') { j += 2; continue; }\n if (text[j] === q) { j++; break; }\n j++;\n }\n push('str', i, j); i = j; continue;\n }\n // ── Number literal\n if (/\\d/.test(text[i]) && (i === 0 || !/\\w/.test(text[i - 1]))) {\n let j = i;\n while (j < len && /[\\d._xXa-fA-F]/.test(text[j])) j++;\n push('num', i, j); i = j; continue;\n }\n // ── Identifier / keyword / type\n if (/[a-zA-Z_$]/.test(text[i])) {\n let j = i;\n while (j < len && /[\\w$]/.test(text[j])) j++;\n const word = text.slice(i, j);\n if (kws.has(word)) push('kw', i, j);\n else if (types.has(word)) push('typ', i, j);\n else if (j < len && text[j] === '(') push('fn', i, j);\n else if (/^[A-Z]/.test(word)) push('cls', i, j);\n i = j; continue;\n }\n // ── Operator / punctuation\n if (/[=<>!&|+\\-*/%^~?:,;.[\\]{}()]/.test(text[i])) {\n push('op', i, i + 1); i++; continue;\n }\n i++;\n }\n\n return segs;\n}\n\n/** Build a per-character class array from token segments. */\nexport function buildCharClasses(text: string, segs: TokenSegment[]): string[] {\n const arr = new Array<string>(text.length).fill('');\n for (const seg of segs) {\n for (let c = seg.start; c < seg.end; c++) arr[c] = seg.cls;\n }\n return arr;\n}\n\n/**\n * Snapshot of token cache performance counters.\n * Useful for monitoring and diagnosing tokeniser regressions.\n */\nexport interface CacheMetrics {\n /** Number of successful cache lookups (cache hits). */\n hits: number;\n /** Number of failed lookups that required re-tokenising a line. */\n misses: number;\n /** Number of entries evicted to stay within `maxSize`. */\n evictions: number;\n /** Current number of entries in the cache. */\n size: number;\n}\n\n/** Simple LRU token cache — keyed by `\"docLine:segIdx\"`. */\nexport class TokenCache {\n private readonly _cache = new Map<string, { src: string; segs: TokenSegment[] }>();\n private readonly _maxSize: number;\n\n // ── Performance counters ──────────────────────────────────\n private _hits = 0;\n private _misses = 0;\n private _evictions = 0;\n\n constructor(maxSize = 5000) {\n this._maxSize = maxSize;\n }\n\n /** Live snapshot of cache performance. Useful for observability. */\n get metrics(): CacheMetrics {\n return {\n hits: this._hits,\n misses: this._misses,\n evictions: this._evictions,\n size: this._cache.size,\n };\n }\n\n get(key: string, text: string): TokenSegment[] | null {\n const entry = this._cache.get(key);\n if (entry && entry.src === text) { this._hits++; return entry.segs; }\n this._misses++;\n return null;\n }\n\n set(key: string, text: string, segs: TokenSegment[]): void {\n if (this._cache.size >= this._maxSize) {\n this._cache.delete(this._cache.keys().next().value!);\n this._evictions++;\n }\n this._cache.set(key, { src: text, segs });\n }\n\n invalidateLine(docLine: number, segCount: number): void {\n for (let s = 0; s < segCount; s++) {\n this._cache.delete(`${docLine}:${s}`);\n }\n }\n\n /** Clear all cached entries and reset performance counters. */\n clear(): void {\n this._cache.clear();\n this._hits = 0;\n this._misses = 0;\n this._evictions = 0;\n }\n\n /** Reset performance counters without clearing cached entries. */\n resetMetrics(): void {\n this._hits = 0;\n this._misses = 0;\n this._evictions = 0;\n }\n}\n\n/**\n * Error-safe wrapper around `tokeniseLine`.\n * Returns an empty segment array (renders as plain text) instead of\n * throwing when the tokeniser encounters an unexpected input.\n *\n * @internal - Used by the row renderer. Prefer this over calling\n * `tokeniseLine` directly so one bad line can never crash the editor.\n */\nexport function tokeniseLineSafe(text: string, opts: TokeniserOptions = {}): TokenSegment[] {\n try {\n return tokeniseLine(text, opts);\n } catch (err) {\n // Surface the error to developers but keep rendering — the line will\n // appear as unstyled plain text rather than breaking the editor.\n console.warn('[syncline-editor] tokeniser error:', JSON.stringify(text), err);\n return [];\n }\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · themes/built-in-themes.ts\n// All built-in theme definitions — pixel-accurate CSS tokens.\n// ─────────────────────────────────────────────────────────────\n\nimport type { ThemeDefinition } from '../types/index.js';\n\nexport const THEME_VR_DARK: ThemeDefinition = {\n id: '',\n name: 'VR Dark',\n description: 'Default deep dark theme',\n light: false,\n tokens: {\n bg0: '#0d0d0f', bg1: '#111115', bg2: '#16161b', bg3: '#1d1d24', bg4: '#24242d',\n border: 'rgba(255,255,255,.07)', border2: 'rgba(255,255,255,.12)', border3: 'rgba(255,255,255,.19)',\n text: '#c9c7c0', text2: '#8b8994', text3: '#4e4c58',\n accent: '#6e9fff', accent2: '#2f5db0',\n green: '#4ec9a0', orange: '#d4976e', purple: '#b48eff', red: '#f28b82', yellow: '#e8c97a',\n cur: '#6e9fff', curGlow: 'rgba(110,159,255,.65)',\n curLineBg: 'rgba(255,255,255,.032)', curLineGutter: '#181820',\n gutterBg: '#0f0f12', gutterHover: '#181820', gutterBorder: 'rgba(255,255,255,.06)',\n gutterNum: '#4e4c58', gutterNumAct: '#9997a2',\n selBg: 'rgba(110,159,255,.22)',\n wordHlBg: 'rgba(200,198,210,.09)', wordHlBorder: 'rgba(200,198,210,.28)',\n bmBorder: 'rgba(110,159,255,.65)',\n foldBg: 'rgba(110,159,255,.07)', foldBorder: 'rgba(110,159,255,.30)',\n findBg: 'rgba(234,180,86,.18)', findBorder: 'rgba(234,180,86,.50)',\n findCurBg: 'rgba(234,180,86,.80)', findCurBorder: 'rgba(234,180,86,.95)', findCurText: '#1a1000',\n fileActiveBg: 'rgba(110,159,255,.11)', fileActiveText: '#6e9fff',\n mmBg: '#0d0d0f', mmSlider: 'rgba(255,255,255,.07)', mmDim: 'rgba(0,0,0,.30)', mmEdge: 'rgba(255,255,255,.18)',\n indentGuide: 'rgba(255,255,255,.06)',\n tokKw: '#6e9fff', tokStr: '#4ec9a0', tokCmt: '#4e4c58', tokFn: '#d4976e',\n tokNum: '#b48eff', tokCls: '#e8c97a', tokOp: '#55536a', tokTyp: '#6ec9d4', tokDec: '#f28b82',\n },\n};\n\nexport const THEME_VSCODE_DARK: ThemeDefinition = {\n id: 'vscode-dark',\n name: 'VSCode Dark+',\n description: 'Visual Studio Code dark',\n light: false,\n tokens: {\n bg0: '#1e1e1e', bg1: '#252526', bg2: '#1e1e1e', bg3: '#2d2d30', bg4: '#3a3a3d',\n border: 'rgba(255,255,255,.09)', border2: 'rgba(255,255,255,.15)', border3: 'rgba(255,255,255,.24)',\n text: '#d4d4d4', text2: '#9a9a9a', text3: '#505050',\n accent: '#569cd6', accent2: '#0e639c',\n green: '#4ec9b0', orange: '#ce9178', purple: '#c586c0', red: '#f44747', yellow: '#dcdcaa',\n cur: '#aeafad', curGlow: 'rgba(174,175,173,.40)',\n curLineBg: 'rgba(255,255,255,.038)', curLineGutter: '#282828',\n gutterBg: '#1e1e1e', gutterHover: '#282828', gutterBorder: 'rgba(255,255,255,.07)',\n gutterNum: '#838383', gutterNumAct: '#c8c8c8',\n selBg: 'rgba(38,79,120,.65)',\n wordHlBg: 'rgba(173,214,255,.06)', wordHlBorder: 'rgba(173,214,255,.28)',\n bmBorder: 'rgba(86,156,214,.70)',\n foldBg: 'rgba(86,156,214,.07)', foldBorder: 'rgba(86,156,214,.35)',\n findBg: 'rgba(255,215,0,.13)', findBorder: 'rgba(255,215,0,.52)',\n findCurBg: '#f6f6a0', findCurBorder: '#d4d400', findCurText: '#000',\n fileActiveBg: 'rgba(255,255,255,.07)', fileActiveText: '#d4d4d4',\n mmBg: '#1e1e1e', mmSlider: 'rgba(255,255,255,.07)', mmDim: 'rgba(0,0,0,.32)', mmEdge: 'rgba(255,255,255,.20)',\n indentGuide: 'rgba(255,255,255,.07)',\n tokKw: '#569cd6', tokStr: '#ce9178', tokCmt: '#6a9955', tokFn: '#dcdcaa',\n tokNum: '#b5cea8', tokCls: '#4ec9b0', tokOp: '#d4d4d4', tokTyp: '#4ec9b0', tokDec: '#9cdcfe',\n },\n};\n\nexport const THEME_MONOKAI: ThemeDefinition = {\n id: 'monokai',\n name: 'Monokai',\n description: 'Classic Sublime Text theme',\n light: false,\n tokens: {\n bg0: '#272822', bg1: '#1e1f1c', bg2: '#272822', bg3: '#3a3930', bg4: '#48473d',\n border: 'rgba(255,255,255,.08)', border2: 'rgba(255,255,255,.13)', border3: 'rgba(255,255,255,.20)',\n text: '#f8f8f2', text2: '#a8a7a0', text3: '#58574e',\n accent: '#a6e22e', accent2: '#3d5a10',\n green: '#a6e22e', orange: '#fd971f', purple: '#ae81ff', red: '#f92672', yellow: '#e6db74',\n cur: '#f8f8f2', curGlow: 'rgba(248,248,242,.25)',\n curLineBg: 'rgba(255,255,255,.042)', curLineGutter: '#2c2d27',\n gutterBg: '#1e1f1c', gutterHover: '#2c2d27', gutterBorder: 'rgba(255,255,255,.06)',\n gutterNum: '#6e6d64', gutterNumAct: '#cccac0',\n selBg: 'rgba(73,72,62,.80)',\n wordHlBg: 'rgba(248,248,242,.06)', wordHlBorder: 'rgba(248,248,242,.22)',\n bmBorder: 'rgba(166,226,46,.65)',\n foldBg: 'rgba(166,226,46,.07)', foldBorder: 'rgba(166,226,46,.30)',\n findBg: 'rgba(230,219,116,.16)', findBorder: 'rgba(230,219,116,.52)',\n findCurBg: '#e6db74', findCurBorder: '#c9be50', findCurText: '#272822',\n fileActiveBg: 'rgba(166,226,46,.10)', fileActiveText: '#a6e22e',\n mmBg: '#1e1f1c', mmSlider: 'rgba(255,255,255,.06)', mmDim: 'rgba(0,0,0,.32)', mmEdge: 'rgba(255,255,255,.18)',\n indentGuide: 'rgba(255,255,255,.06)',\n tokKw: '#f92672', tokStr: '#e6db74', tokCmt: '#75715e', tokFn: '#a6e22e',\n tokNum: '#ae81ff', tokCls: '#66d9e8', tokOp: '#f8f8f2', tokTyp: '#66d9e8', tokDec: '#fd971f',\n },\n};\n\nexport const THEME_DRACULA: ThemeDefinition = {\n id: 'dracula',\n name: 'Dracula',\n description: 'Purple-tinted dark theme',\n light: false,\n tokens: {\n bg0: '#282a36', bg1: '#21222c', bg2: '#282a36', bg3: '#333545', bg4: '#44475a',\n border: 'rgba(255,255,255,.08)', border2: 'rgba(255,255,255,.14)', border3: 'rgba(255,255,255,.22)',\n text: '#f8f8f2', text2: '#b2b5c8', text3: '#5a5e78',\n accent: '#bd93f9', accent2: '#5b3fa8',\n green: '#50fa7b', orange: '#ffb86c', purple: '#bd93f9', red: '#ff5555', yellow: '#f1fa8c',\n cur: '#f8f8f2', curGlow: 'rgba(189,147,249,.55)',\n curLineBg: 'rgba(255,255,255,.045)', curLineGutter: '#2f3144',\n gutterBg: '#21222c', gutterHover: '#2f3144', gutterBorder: 'rgba(255,255,255,.07)',\n gutterNum: '#5e638a', gutterNumAct: '#f8f8f2',\n selBg: 'rgba(68,71,90,.85)',\n wordHlBg: 'rgba(248,248,242,.05)', wordHlBorder: 'rgba(248,248,242,.20)',\n bmBorder: 'rgba(189,147,249,.70)',\n foldBg: 'rgba(189,147,249,.08)', foldBorder: 'rgba(189,147,249,.35)',\n findBg: 'rgba(241,250,140,.14)', findBorder: 'rgba(241,250,140,.52)',\n findCurBg: '#f1fa8c', findCurBorder: '#d4dc50', findCurText: '#282a36',\n fileActiveBg: 'rgba(189,147,249,.12)', fileActiveText: '#bd93f9',\n mmBg: '#21222c', mmSlider: 'rgba(255,255,255,.07)', mmDim: 'rgba(0,0,0,.32)', mmEdge: 'rgba(255,255,255,.20)',\n indentGuide: 'rgba(255,255,255,.07)',\n tokKw: '#ff79c6', tokStr: '#f1fa8c', tokCmt: '#6272a4', tokFn: '#50fa7b',\n tokNum: '#bd93f9', tokCls: '#8be9fd', tokOp: '#f8f8f2', tokTyp: '#8be9fd', tokDec: '#ffb86c',\n },\n};\n\nexport const THEME_GITHUB_LIGHT: ThemeDefinition = {\n id: 'github-light',\n name: 'GitHub Light',\n description: \"GitHub's clean light theme\",\n light: true,\n tokens: {\n bg0: '#ffffff', bg1: '#f6f8fa', bg2: '#ffffff', bg3: '#f0f3f6', bg4: '#e7eaee',\n border: '#d0d7de', border2: '#bdc4cc', border3: '#aab1ba',\n text: '#1f2328', text2: '#57606a', text3: '#8c959f',\n accent: '#0969da', accent2: '#0550ae',\n green: '#1a7f37', orange: '#bc4c00', purple: '#8250df', red: '#cf222e', yellow: '#7d4e00',\n cur: '#0969da', curGlow: 'rgba(9,105,218,.30)',\n curLineBg: 'rgba(9,105,218,.055)', curLineGutter: '#ebf0f8',\n gutterBg: '#f6f8fa', gutterHover: '#eaedf1', gutterBorder: '#d0d7de',\n gutterNum: '#9da5b0', gutterNumAct: '#1f2328',\n selBg: 'rgba(9,105,218,.15)',\n wordHlBg: 'rgba(9,105,218,.07)', wordHlBorder: 'rgba(9,105,218,.28)',\n bmBorder: 'rgba(9,105,218,.60)',\n foldBg: 'rgba(9,105,218,.06)', foldBorder: 'rgba(9,105,218,.28)',\n findBg: 'rgba(180,100,0,.09)', findBorder: 'rgba(180,100,0,.42)',\n findCurBg: 'rgba(180,100,0,.75)', findCurBorder: 'rgba(180,100,0,.95)', findCurText: '#fff',\n fileActiveBg: 'rgba(9,105,218,.09)', fileActiveText: '#0969da',\n mmBg: '#f6f8fa', mmSlider: 'rgba(0,0,0,.06)', mmDim: 'rgba(0,0,0,.055)', mmEdge: 'rgba(0,0,0,.18)',\n indentGuide: 'rgba(0,0,0,.09)',\n tokKw: '#cf222e', tokStr: '#0a3069', tokCmt: '#6e7781', tokFn: '#8250df',\n tokNum: '#0550ae', tokCls: '#953800', tokOp: '#1f2328', tokTyp: '#0550ae', tokDec: '#0969da',\n },\n};\n\nexport const THEME_SOLARIZED_LIGHT: ThemeDefinition = {\n id: 'solarized-light',\n name: 'Solarized Light',\n description: 'Warm precision light theme',\n light: true,\n tokens: {\n bg0: '#fdf6e3', bg1: '#eee8d5', bg2: '#fdf6e3', bg3: '#e5dfcc', bg4: '#dad4c1',\n border: '#cdc7b4', border2: '#bab4a2', border3: '#a9a390',\n text: '#002b36', text2: '#586e75', text3: '#93a1a1',\n accent: '#268bd2', accent2: '#1a6fa8',\n green: '#859900', orange: '#cb4b16', purple: '#6c71c4', red: '#dc322f', yellow: '#b58900',\n cur: '#268bd2', curGlow: 'rgba(38,139,210,.32)',\n curLineBg: 'rgba(38,139,210,.07)', curLineGutter: '#e2dcc8',\n gutterBg: '#eee8d5', gutterHover: '#e2dcc8', gutterBorder: '#cdc7b4',\n gutterNum: '#93a1a1', gutterNumAct: '#002b36',\n selBg: 'rgba(38,139,210,.18)',\n wordHlBg: 'rgba(38,139,210,.08)', wordHlBorder: 'rgba(38,139,210,.28)',\n bmBorder: 'rgba(38,139,210,.58)',\n foldBg: 'rgba(38,139,210,.07)', foldBorder: 'rgba(38,139,210,.28)',\n findBg: 'rgba(181,137,0,.11)', findBorder: 'rgba(181,137,0,.42)',\n findCurBg: 'rgba(181,137,0,.75)', findCurBorder: 'rgba(181,137,0,.95)', findCurText: '#fff',\n fileActiveBg: 'rgba(38,139,210,.10)', fileActiveText: '#268bd2',\n mmBg: '#eee8d5', mmSlider: 'rgba(0,0,0,.06)', mmDim: 'rgba(0,0,0,.055)', mmEdge: 'rgba(0,0,0,.16)',\n indentGuide: 'rgba(0,0,0,.08)',\n tokKw: '#859900', tokStr: '#2aa198', tokCmt: '#93a1a1', tokFn: '#268bd2',\n tokNum: '#d33682', tokCls: '#b58900', tokOp: '#657b83', tokTyp: '#268bd2', tokDec: '#cb4b16',\n },\n};\n\n\n// ── MDX Dark ─────────────────────────────────────────────────────────────────\n// Catppuccin Mocha backgrounds + single-colour tokens (text colour = token colour)\n// matching the .smdx-dark MDX editor chrome. Distraction-free for prose editing.\nexport const THEME_MDX_DARK: ThemeDefinition = {\n id: 'mdx-dark',\n name: 'MDX Dark',\n description: 'Catppuccin Mocha — matches .smdx-dark MDX editor chrome, single-colour tokens',\n light: false,\n tokens: {\n bg0: '#181825', bg1: '#1e1e2e', bg2: '#1e1e2e', bg3: '#2a2a3c', bg4: '#313147',\n border: '#374151', border2: 'rgba(129,140,248,.22)', border3: 'rgba(129,140,248,.40)',\n text: '#e2e8f0', text2: '#94a3b8', text3: '#475569',\n accent: '#818cf8', accent2: '#6366f1',\n green: '#c3e88d', orange: '#f78c6c', purple: '#c792ea', red: '#f07178', yellow: '#ffcb6b',\n cur: '#818cf8', curGlow: 'rgba(129,140,248,.55)',\n curLineBg: 'rgba(129,140,248,.055)', curLineGutter: '#252540',\n gutterBg: '#181825', gutterHover: '#252540', gutterBorder: '#374151',\n gutterNum: '#475569', gutterNumAct: '#94a3b8',\n selBg: 'rgba(129,140,248,.24)',\n wordHlBg: 'rgba(226,232,240,.07)', wordHlBorder: 'rgba(226,232,240,.25)',\n bmBorder: 'rgba(137,221,255,.70)',\n foldBg: 'rgba(129,140,248,.07)', foldBorder: 'rgba(129,140,248,.30)',\n findBg: 'rgba(251,191,36,.16)', findBorder: 'rgba(251,191,36,.50)',\n findCurBg: 'rgba(251,191,36,.85)', findCurBorder: 'rgba(251,191,36,.95)', findCurText: '#1a1000',\n fileActiveBg: 'rgba(129,140,248,.12)', fileActiveText: '#818cf8',\n mmBg: '#181825', mmSlider: 'rgba(255,255,255,.07)', mmDim: 'rgba(0,0,0,.30)', mmEdge: 'rgba(255,255,255,.18)',\n indentGuide: 'rgba(255,255,255,.06)',\n // All tokens match prose text — single-colour, distraction-free editing\n tokKw: '#e2e8f0', tokStr: '#e2e8f0', tokCmt: '#e2e8f0', tokFn: '#e2e8f0',\n tokNum: '#e2e8f0', tokCls: '#e2e8f0', tokOp: '#e2e8f0', tokTyp: '#e2e8f0', tokDec: '#e2e8f0',\n },\n};\n\n// ── MDX Light ────────────────────────────────────────────────────────────────\nexport const THEME_MDX_LIGHT: ThemeDefinition = {\n id: 'mdx-light',\n name: 'MDX Light',\n description: 'Clean light — matches default .smdx-editor MDX chrome, single-colour tokens',\n light: true,\n tokens: {\n bg0: '#f1f5f9', bg1: '#ffffff', bg2: '#ffffff', bg3: '#f8fafc', bg4: '#f1f5f9',\n border: '#e2e8f0', border2: 'rgba(99,102,241,.20)', border3: 'rgba(99,102,241,.40)',\n text: '#1e293b', text2: '#64748b', text3: '#94a3b8',\n accent: '#6366f1', accent2: '#4f46e5',\n green: '#15803d', orange: '#c2410c', purple: '#7c3aed', red: '#dc2626', yellow: '#b45309',\n cur: '#6366f1', curGlow: 'rgba(99,102,241,.35)',\n curLineBg: 'rgba(99,102,241,.05)', curLineGutter: '#eef2ff',\n gutterBg: '#f8fafc', gutterHover: '#eef2ff', gutterBorder: '#e2e8f0',\n gutterNum: '#94a3b8', gutterNumAct: '#475569',\n selBg: 'rgba(99,102,241,.18)',\n wordHlBg: 'rgba(99,102,241,.07)', wordHlBorder: 'rgba(99,102,241,.30)',\n bmBorder: 'rgba(14,116,144,.60)',\n foldBg: 'rgba(99,102,241,.06)', foldBorder: 'rgba(99,102,241,.28)',\n findBg: 'rgba(180,83,9,.09)', findBorder: 'rgba(180,83,9,.40)',\n findCurBg: 'rgba(180,83,9,.75)', findCurBorder: 'rgba(180,83,9,.95)', findCurText: '#ffffff',\n fileActiveBg: 'rgba(99,102,241,.10)', fileActiveText: '#6366f1',\n mmBg: '#f8fafc', mmSlider: 'rgba(0,0,0,.06)', mmDim: 'rgba(0,0,0,.05)', mmEdge: 'rgba(0,0,0,.18)',\n indentGuide: 'rgba(0,0,0,.08)',\n // All tokens match prose text — single-colour, distraction-free editing\n tokKw: '#1e293b', tokStr: '#1e293b', tokCmt: '#1e293b', tokFn: '#1e293b',\n tokNum: '#1e293b', tokCls: '#1e293b', tokOp: '#1e293b', tokTyp: '#1e293b', tokDec: '#1e293b',\n },\n};\n\nexport const BUILT_IN_THEMES: ThemeDefinition[] = [\n THEME_VR_DARK,\n THEME_VSCODE_DARK,\n THEME_MONOKAI,\n THEME_DRACULA,\n THEME_GITHUB_LIGHT,\n THEME_SOLARIZED_LIGHT,\n THEME_MDX_DARK,\n THEME_MDX_LIGHT,\n];\n\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · themes/theme-manager.ts\n// Applies themes by writing CSS custom properties onto the\n// editor root element. No global document pollution.\n// ─────────────────────────────────────────────────────────────\n\nimport type { ThemeDefinition, ThemeTokens } from '../types/index.js';\nimport { BUILT_IN_THEMES } from './built-in-themes.js';\n\n/** Maps ThemeTokens keys → CSS variable names. */\nconst TOKEN_TO_VAR: Record<keyof ThemeTokens, string> = {\n bg0:'--bg0', bg1:'--bg1', bg2:'--bg2', bg3:'--bg3', bg4:'--bg4',\n border:'--border', border2:'--border2', border3:'--border3',\n text:'--text', text2:'--text2', text3:'--text3',\n accent:'--accent', accent2:'--accent2',\n green:'--green', orange:'--orange', purple:'--purple', red:'--red', yellow:'--yellow',\n cur:'--cur', curGlow:'--cur-glow',\n curLineBg:'--cur-line-bg', curLineGutter:'--cur-line-gutter',\n gutterBg:'--gutter-bg', gutterHover:'--gutter-hover', gutterBorder:'--gutter-border',\n gutterNum:'--gutter-num', gutterNumAct:'--gutter-num-act',\n selBg:'--sel-bg',\n wordHlBg:'--word-hl-bg', wordHlBorder:'--word-hl-border',\n bmBorder:'--bm-border',\n foldBg:'--fold-bg', foldBorder:'--fold-border',\n findBg:'--find-bg', findBorder:'--find-border',\n findCurBg:'--find-cur-bg', findCurBorder:'--find-cur-border', findCurText:'--find-cur-text',\n fileActiveBg:'--file-active-bg', fileActiveText:'--file-active-text',\n mmBg:'--mm-bg', mmSlider:'--mm-slider', mmDim:'--mm-dim', mmEdge:'--mm-edge',\n indentGuide:'--indent-guide',\n tokKw:'--tok-kw', tokStr:'--tok-str', tokCmt:'--tok-cmt', tokFn:'--tok-fn',\n tokNum:'--tok-num', tokCls:'--tok-cls', tokOp:'--tok-op', tokTyp:'--tok-typ', tokDec:'--tok-dec',\n};\n\nexport class ThemeManager {\n private readonly _registry = new Map<string, ThemeDefinition>();\n private _activeId = '';\n private readonly _root: HTMLElement;\n\n constructor(root: HTMLElement) {\n this._root = root;\n // Register all built-in themes\n for (const theme of BUILT_IN_THEMES) {\n this._registry.set(theme.id, theme);\n }\n }\n\n /** Register a custom or override theme. */\n register(theme: ThemeDefinition): void {\n this._registry.set(theme.id, theme);\n }\n\n /** Apply a theme by id or by definition. */\n apply(idOrDef: string | ThemeDefinition): void {\n let theme: ThemeDefinition | undefined;\n\n if (typeof idOrDef === 'string') {\n theme = this._registry.get(idOrDef);\n if (!theme) {\n console.warn(`[syncline-editor] Unknown theme: \"${idOrDef}\". Falling back to VR Dark.`);\n theme = this._registry.get('')!;\n }\n } else {\n theme = idOrDef;\n this._registry.set(theme.id, theme);\n }\n\n this._activeId = theme.id;\n this._applyTokens(theme.tokens);\n }\n\n get activeId(): string { return this._activeId; }\n\n get activeTheme(): ThemeDefinition | undefined {\n return this._registry.get(this._activeId);\n }\n\n get allIds(): string[] {\n return [...this._registry.keys()];\n }\n\n get all(): ThemeDefinition[] {\n return [...this._registry.values()];\n }\n\n private _applyTokens(tokens: ThemeTokens): void {\n const style = this._root.style;\n for (const [key, cssVar] of Object.entries(TOKEN_TO_VAR) as [keyof ThemeTokens, string][]) {\n style.setProperty(cssVar, tokens[key]);\n }\n }\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · ui/styles.ts\n// All component CSS injected into a shadow DOM or <style> tag.\n// Every colour uses a CSS variable — no hardcoded hex values.\n// ─────────────────────────────────────────────────────────────\n\nexport const EDITOR_STYLES = `\n/* ── Reset ── */\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\n\n/* ── Host element ── */\n:host,.sl-host{\n display:flex;flex-direction:column;\n height:100%;overflow:hidden;\n font-family:var(--sans,'Geist',system-ui,sans-serif);\n color:var(--text,#c9c7c0);\n background:var(--bg0,#0d0d0f);\n\n /* Default token vars (can be overridden by theme) */\n --sans:'Geist',system-ui,sans-serif;\n --mono:'JetBrains Mono',monospace;\n\n /* ── VR Dark defaults ── */\n --bg0:#0d0d0f; --bg1:#111115; --bg2:#16161b; --bg3:#1d1d24; --bg4:#24242d;\n --border:rgba(255,255,255,.07);\n --border2:rgba(255,255,255,.12);\n --border3:rgba(255,255,255,.19);\n --text:#c9c7c0; --text2:#8b8994; --text3:#4e4c58;\n --accent:#6e9fff; --accent2:#2f5db0;\n --green:#4ec9a0; --orange:#d4976e; --purple:#b48eff;\n --red:#f28b82; --yellow:#e8c97a;\n --cur:#6e9fff; --cur-glow:rgba(110,159,255,.65);\n --cur-line-bg:rgba(255,255,255,.032);\n --cur-line-gutter:#181820;\n --gutter-bg:#0f0f12; --gutter-hover:#181820;\n --gutter-border:rgba(255,255,255,.06);\n --gutter-num:#4e4c58; --gutter-num-act:#9997a2;\n --sel-bg:rgba(110,159,255,.22);\n --word-hl-bg:rgba(200,198,210,.09);\n --word-hl-border:rgba(200,198,210,.28);\n --bm-border:rgba(110,159,255,.65);\n --fold-bg:rgba(110,159,255,.07);\n --fold-border:rgba(110,159,255,.30);\n --find-bg:rgba(234,180,86,.18);\n --find-border:rgba(234,180,86,.50);\n --find-cur-bg:rgba(234,180,86,.80);\n --find-cur-border:rgba(234,180,86,.95);\n --find-cur-text:#1a1000;\n --file-active-bg:rgba(110,159,255,.11);\n --file-active-text:#6e9fff;\n --mm-bg:#0d0d0f; --mm-slider:rgba(255,255,255,.07);\n --mm-dim:rgba(0,0,0,.30); --mm-edge:rgba(255,255,255,.18);\n --indent-guide:rgba(255,255,255,.06);\n --tok-kw:#6e9fff; --tok-str:#4ec9a0; --tok-cmt:#4e4c58;\n --tok-fn:#d4976e; --tok-num:#b48eff; --tok-cls:#e8c97a;\n --tok-op:#55536a; --tok-typ:#6ec9d4; --tok-dec:#f28b82;\n}\n\n/* ── Layout ── */\n.sl-layout{display:flex;flex:1;overflow:hidden}\n.sl-ed-pane{flex:1;display:flex;flex-direction:column;overflow:hidden;position:relative;background:var(--bg2)}\n\n/* ── Hidden textarea (input capture) ── */\n.sl-input{position:fixed;left:-9999px;top:0;width:200px;height:40px;\n opacity:0;resize:none;border:none;outline:none;padding:0;margin:0;\n font-size:16px;background:transparent;color:transparent;\n caret-color:transparent;pointer-events:none}\n\n/* ── Editor scroll container ── */\n.sl-editor{flex:1;overflow-y:scroll;overflow-x:auto;position:relative;\n cursor:text;scrollbar-width:thin;scrollbar-color:var(--border3) transparent}\n.sl-editor::-webkit-scrollbar{width:10px;height:8px}\n.sl-editor::-webkit-scrollbar-track{background:transparent}\n.sl-editor::-webkit-scrollbar-thumb{background:var(--border3);border-radius:5px;border:2px solid var(--bg2)}\n.sl-spacer{position:absolute;left:0;top:0;width:1px;pointer-events:none}\n.sl-vp{position:absolute;left:0;right:0;overflow-x:hidden;will-change:transform}\n\n/* ── Editor row ── */\n.sl-er{display:flex;align-items:stretch;position:relative}\n.sl-er:hover .sl-eg{background:var(--gutter-hover)}\n.sl-er.sl-cur-row{background:var(--cur-line-bg)}\n.sl-er.sl-cur-row .sl-eg{background:var(--cur-line-gutter)!important}\n.sl-eg{min-width:60px;font-family:var(--mono);font-size:11px;color:var(--gutter-num);\n user-select:none;border-right:1px solid var(--gutter-border);\n background:var(--gutter-bg);flex-shrink:0;position:sticky;left:0;z-index:2;\n display:flex;flex-direction:column;justify-content:flex-start;\n transition:background .12s,color .12s}\n.sl-er.sl-cur-row .sl-eg{color:var(--gutter-num-act)}\n.sl-egn{height:22px;line-height:22px;padding-right:10px;text-align:right;display:block}\n.sl-er.sl-wrap-cont .sl-egn{visibility:hidden}\n.sl-el{flex:1;font-family:var(--mono);font-size:13px;line-height:22px;\n color:var(--text);position:relative;min-width:0}\n.sl-cl{display:block;height:22px;line-height:22px;\n padding:0 20px 0 14px;white-space:pre;position:relative}\n.sl-wrap-mode .sl-cl{white-space:pre-wrap;word-break:break-all;height:auto;overflow-wrap:anywhere}\n\n/* ── Cursor ── */\n.sl-cur{display:inline;width:0;height:0;position:relative}\n.sl-cur::after{content:'';position:absolute;left:0;top:2px;width:2px;height:18px;\n background:var(--cur);border-radius:1px;\n box-shadow:0 0 8px var(--cur-glow);\n animation:sl-blink 1.05s step-end infinite;pointer-events:none}\n@keyframes sl-blink{0%,100%{opacity:1}45%,55%{opacity:0}}\n\n/* ── Multi-cursor extra beams ── */\n.sl-cur-extra{display:inline;width:0;height:0;position:relative}\n.sl-cur-extra::after{content:'';position:absolute;left:0;top:2px;width:2px;height:18px;\n background:var(--cur);border-radius:1px;\n box-shadow:0 0 8px var(--cur-glow);\n animation:sl-blink 1.05s step-end infinite;pointer-events:none}\n\n/* ── Snippet tab-stop ghost markers ── */\n.sl-snip-stop{display:inline;width:0;height:0;position:relative}\n.sl-snip-stop::after{content:'';position:absolute;left:0;top:2px;width:2px;height:18px;\n background:var(--cur);border-radius:1px;opacity:0.28;pointer-events:none}\n\n/* ── Overlays ── */\n.sl-sh{background:var(--sel-bg);border-radius:2px}\n.sl-fh{background:var(--find-bg);box-shadow:0 0 0 1px var(--find-border);border-radius:2px}\n.sl-fh.sl-fh-cur{background:var(--find-cur-bg);box-shadow:0 0 0 1px var(--find-cur-border);color:var(--find-cur-text)}\n.sl-wh{background:var(--word-hl-bg);box-shadow:0 0 0 1px var(--word-hl-border);border-radius:2px}\n.sl-bm{box-shadow:0 0 0 1px var(--bm-border);border-radius:2px}\n.sl-ig{position:absolute;top:0;bottom:0;width:1px;background:var(--indent-guide);pointer-events:none}\n\n/* ── Code folding ── */\n.sl-fold-btn{position:absolute;left:3px;top:4px;width:13px;height:13px;border-radius:3px;\n display:flex;align-items:center;justify-content:center;font-size:9px;\n color:var(--gutter-num);cursor:pointer;opacity:0;\n transition:opacity .15s,background .1s;user-select:none;line-height:1}\n.sl-er:hover .sl-fold-btn{opacity:1}\n.sl-fold-btn:hover{background:var(--border3);color:var(--gutter-num-act)}\n.sl-folded{background:var(--fold-bg);border-bottom:1px dashed var(--fold-border)}\n\n/* ── Syntax tokens ── */\n.kw{color:var(--tok-kw)}.str{color:var(--tok-str)}.cmt{color:var(--tok-cmt);font-style:italic}\n.fn{color:var(--tok-fn)}.num{color:var(--tok-num)}.cls{color:var(--tok-cls)}\n.op{color:var(--tok-op)}.typ{color:var(--tok-typ)}.dec{color:var(--tok-dec)}\n\n/* ── Minimap ── */\n.sl-minimap{background:var(--mm-bg);border-left:1px solid var(--border);\n overflow:hidden;position:relative;flex-shrink:0;cursor:pointer;user-select:none}\n.sl-minimap canvas{display:block;position:absolute;top:0;left:0}\n.sl-mm-slider{position:absolute;left:0;right:0;pointer-events:none}\n\n/* ── Status bar ── */\n.sl-statusbar{height:26px;background:var(--accent2);display:flex;align-items:center;\n padding:0 6px;font-size:11px;color:rgba(255,255,255,.85);flex-shrink:0;gap:0}\n.sl-sb-item{display:flex;align-items:center;gap:4px;padding:0 8px;height:100%;\n cursor:pointer;transition:background .1s;white-space:nowrap;border-radius:3px}\n.sl-sb-item:hover{background:rgba(255,255,255,.15)}\n.sl-sb-item.sl-no-click{cursor:default}\n.sl-sb-item.sl-no-click:hover{background:transparent}\n.sl-sb-sep{width:1px;height:14px;background:rgba(255,255,255,.22);margin:0 1px;flex-shrink:0}\n.sl-sb-right{margin-left:auto;display:flex;align-items:center}\n.sl-sb-wrap.sl-on{font-weight:700}\n\n/* ── Placeholder ── */\n.sl-placeholder{position:absolute;top:0;right:0;pointer-events:none;user-select:none;\n color:var(--text3);white-space:pre;overflow:hidden;z-index:1}\n\n/* ── Go to Line bar ── */\n.sl-gtl-bar{position:absolute;top:0;left:50%;z-index:50;background:var(--bg3);\n border:1px solid var(--border3);border-top:none;border-radius:0 0 10px 10px;\n display:flex;align-items:center;gap:8px;padding:8px 12px;\n transform:translateX(-50%) translateY(-100%);transition:transform .18s,box-shadow .18s;pointer-events:none}\n.sl-gtl-bar.sl-open{transform:translateX(-50%) translateY(0);pointer-events:all;box-shadow:0 8px 28px rgba(0,0,0,.4)}\n.sl-gtl-label{font-size:12px;color:var(--text2);white-space:nowrap}\n.sl-gtl-input{width:72px;background:var(--bg4);border:1px solid var(--border3);\n border-radius:5px;padding:4px 8px;font-size:12px;font-family:var(--mono);\n color:var(--text);outline:none;transition:border-color .15s;text-align:center}\n.sl-gtl-input:focus{border-color:var(--accent)}\n.sl-gtl-input.sl-gtl-err{border-color:#e05252}\n.sl-gtl-hint{font-size:11px;color:var(--text3);font-family:var(--mono);min-width:40px}\n\n/* ── Find + Replace bar ── */\n.sl-find-bar{position:absolute;top:0;right:125px;z-index:50;background:var(--bg3);\n border:1px solid var(--border3);border-top:none;border-radius:0 0 10px 10px;\n display:flex;flex-direction:column;overflow:hidden;\n transform:translateY(-100%);transition:transform .18s,box-shadow .18s;pointer-events:none}\n.sl-find-bar.sl-open{transform:translateY(0);pointer-events:all;box-shadow:0 8px 28px rgba(0,0,0,.4)}\n.sl-find-row{display:flex;align-items:center;gap:6px;padding:7px 10px}\n.sl-find-row+.sl-find-row{border-top:1px solid var(--border)}\n.sl-find-bar input{width:180px;background:var(--bg4);border:1px solid var(--border3);\n border-radius:5px;padding:4px 8px;font-size:12px;font-family:var(--mono);\n color:var(--text);outline:none;transition:border-color .15s}\n.sl-find-bar input:focus{border-color:var(--accent)}\n.sl-find-btn{padding:3px 8px;font-size:11px;border:1px solid var(--border3);\n border-radius:4px;background:transparent;color:var(--text2);cursor:pointer;\n transition:background .1s;white-space:nowrap}\n.sl-find-btn:hover{background:var(--border3);color:var(--text)}\n.sl-find-btn.sl-active{background:var(--accent);border-color:var(--accent);color:#fff}\n.sl-find-count{font-size:11px;color:var(--text3);font-family:var(--mono);min-width:52px}\n.sl-find-x{font-size:14px;color:var(--text3);cursor:pointer;padding:2px 5px;\n border-radius:3px;margin-left:2px}\n.sl-find-x:hover{color:var(--text);background:var(--border3)}\n\n/* ── Autocomplete popup (VS Code-style with optional description panel) ── */\n.sl-ac-popup{position:fixed;z-index:400;background:var(--bg3);\n border:1px solid var(--border3);border-radius:8px;overflow:hidden;\n box-shadow:0 12px 40px rgba(0,0,0,.55);\n display:flex;flex-direction:row;\n animation:sl-acIn .1s ease;pointer-events:all}\n@keyframes sl-acIn{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}\n/* Left: item list */\n.sl-ac-list{min-width:240px;max-width:300px;max-height:320px;overflow-y:auto;flex-shrink:0}\n.sl-ac-list::-webkit-scrollbar{width:4px}\n.sl-ac-list::-webkit-scrollbar-thumb{background:var(--border3);border-radius:2px}\n.sl-ac-item{display:flex;align-items:center;gap:8px;padding:4px 10px;font-size:12px;\n font-family:var(--mono);cursor:pointer;color:var(--text2);transition:background .07s;\n white-space:nowrap}\n.sl-ac-item:hover,.sl-ac-item.sl-sel{background:var(--bg4);color:var(--text)}\n.sl-ac-badge{width:18px;height:18px;border-radius:4px;display:flex;align-items:center;\n justify-content:center;font-size:9px;font-weight:700;flex-shrink:0;font-family:var(--sans)}\n.sl-ac-badge.kw{background:rgba(110,159,255,.18);color:var(--tok-kw)}\n.sl-ac-badge.fn{background:rgba(212,151,110,.18);color:var(--tok-fn)}\n.sl-ac-badge.typ{background:rgba(110,201,212,.18);color:var(--tok-typ)}\n.sl-ac-badge.cls{background:rgba(232,201,122,.18);color:var(--tok-cls)}\n.sl-ac-badge.var{background:rgba(78,201,160,.18);color:var(--tok-str)}\n.sl-ac-badge.snip{background:rgba(155,100,255,.18);color:#a78bfa}\n.sl-ac-badge.emmet{background:rgba(255,140,0,.18);color:#fb923c}\n.sl-ac-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.sl-ac-detail{font-size:10px;color:var(--text3);flex-shrink:0;max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-left:4px}\n/* Right: description / docs panel */\n.sl-ac-desc{width:260px;max-height:320px;overflow-y:auto;\n border-left:1px solid var(--border3);padding:10px 12px;flex-shrink:0}\n.sl-ac-desc::-webkit-scrollbar{width:4px}\n.sl-ac-desc::-webkit-scrollbar-thumb{background:var(--border3);border-radius:2px}\n.sl-ac-desc-body{margin:0;font-size:11.5px;font-family:var(--mono);\n color:var(--text2);line-height:1.6;white-space:pre-wrap;word-break:break-word}\n\n/* ── Hover documentation tooltip ── */\n.sl-hover-tip{position:fixed;z-index:500;background:var(--bg3);\n border:1px solid var(--border3);border-radius:8px;\n box-shadow:0 8px 32px rgba(0,0,0,.55);\n max-width:380px;min-width:180px;padding:10px 14px;\n pointer-events:all;cursor:default;\n animation:sl-hoverIn .12s ease}\n@keyframes sl-hoverIn{from{opacity:0;transform:translateY(3px)}to{opacity:1;transform:none}}\n.sl-ht-sig{display:flex;align-items:baseline;flex-wrap:wrap;gap:8px;margin-bottom:5px}\n.sl-ht-title{font-size:12.5px;font-family:var(--mono);font-weight:600;color:var(--tok-fn)}\n.sl-ht-type{font-size:11px;font-family:var(--mono);color:var(--tok-typ);opacity:.9;word-break:break-all}\n.sl-ht-body{font-size:12px;font-family:var(--sans);color:var(--text2);line-height:1.55;\n max-height:120px;overflow-y:auto}\n.sl-ht-body::-webkit-scrollbar{width:3px}\n.sl-ht-body::-webkit-scrollbar-thumb{background:var(--border3);border-radius:2px}\n.sl-hover-tip .sl-ht-divider{height:1px;background:var(--border);margin:6px 0}\n\n/* ── Emmet tooltip ── */\n.sl-emmet-tip{position:fixed;z-index:600;background:var(--bg3);\n border:1px solid var(--border3);border-radius:6px;padding:4px 10px;\n font-size:11px;font-family:var(--mono);color:var(--accent);\n pointer-events:none;box-shadow:0 4px 16px rgba(0,0,0,.45);\n white-space:nowrap;max-width:400px;overflow:hidden;text-overflow:ellipsis}\n\n/* ── Theme picker ── */\n.sl-theme-overlay{position:fixed;inset:0;z-index:700;\n background:rgba(0,0,0,.50);backdrop-filter:blur(2px)}\n.sl-theme-panel{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);\n z-index:701;background:var(--bg2);border:1px solid var(--border3);\n border-radius:14px;overflow:hidden;width:420px;\n box-shadow:0 32px 80px rgba(0,0,0,.65),0 0 0 1px var(--border2)}\n.sl-theme-header{padding:16px 20px 12px;display:flex;align-items:center;\n justify-content:space-between;border-bottom:1px solid var(--border)}\n.sl-theme-title{font-size:13px;font-weight:600;color:var(--text);letter-spacing:.01em}\n.sl-theme-close{width:24px;height:24px;border-radius:6px;display:flex;align-items:center;\n justify-content:center;font-size:14px;color:var(--text3);cursor:pointer;\n transition:background .1s,color .1s}\n.sl-theme-close:hover{background:var(--border3);color:var(--text)}\n.sl-theme-list{padding:8px 8px 10px}\n.sl-theme-item{display:flex;align-items:center;gap:14px;padding:10px 12px;\n border-radius:9px;cursor:pointer;transition:background .1s;\n border:1px solid transparent;margin-bottom:2px}\n.sl-theme-item:hover{background:var(--bg4)}\n.sl-theme-item.sl-active{background:var(--bg4);border-color:var(--border3)}\n.sl-theme-check{width:18px;height:18px;margin-left:auto;color:var(--accent);\n font-size:13px;font-weight:700;flex-shrink:0;opacity:0}\n.sl-theme-item.sl-active .sl-theme-check{opacity:1}\n.sl-theme-swatch{width:46px;height:30px;border-radius:7px;flex-shrink:0;\n overflow:hidden;border:1px solid rgba(0,0,0,.15);\n display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr}\n.sl-theme-swatch span{display:block}\n.sl-theme-name{font-size:13px;color:var(--text);font-weight:500;line-height:1.3}\n.sl-theme-desc{font-size:11px;color:var(--text3);margin-top:2px}\n.sl-theme-tag{display:inline-block;font-size:9px;font-weight:600;letter-spacing:.08em;\n text-transform:uppercase;padding:1px 5px;border-radius:3px;margin-left:6px;\n background:var(--border3);color:var(--text3);vertical-align:middle}\n.sl-theme-tag.sl-light{background:rgba(255,200,50,.15);color:#b58900}\n\n/* ── Empty state ── */\n.sl-empty{flex:1;display:flex;flex-direction:column;align-items:center;\n justify-content:center;gap:10px;color:var(--text3);font-size:13px}\n`;\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · utils/dom.ts\n// Lightweight DOM helpers — no external dependencies.\n// ─────────────────────────────────────────────────────────────\n\n/** Create an element with optional class names and attributes. */\nexport function el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className?: string,\n attrs?: Record<string, string>,\n): HTMLElementTagNameMap[K] {\n const e = document.createElement(tag);\n if (className) e.className = className;\n if (attrs) {\n for (const [k, v] of Object.entries(attrs)) {\n e.setAttribute(k, v);\n }\n }\n return e;\n}\n\n/** Escape HTML special characters. */\nexport function escapeHtml(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\n/** Read a CSS variable from an element (or document root). */\nexport function getCssVar(name: string, root: HTMLElement = document.documentElement): string {\n return getComputedStyle(root).getPropertyValue(name).trim();\n}\n\n/** Set a CSS variable on an element. */\nexport function setCssVar(name: string, value: string, root: HTMLElement = document.documentElement): void {\n root.style.setProperty(name, value);\n}\n\n/** Convert a hex colour + alpha to rgba string. */\nexport function hexToRgba(hex: string, alpha: number): string {\n const clean = hex.replace('#', '');\n const r = parseInt(clean.slice(0, 2), 16);\n const g = parseInt(clean.slice(2, 4), 16);\n const b = parseInt(clean.slice(4, 6), 16);\n return `rgba(${r},${g},${b},${alpha})`;\n}\n\n/** Clamp a number between min and max. */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/** Debounce a function. */\nexport function debounce<T extends (...args: unknown[]) => void>(\n fn: T,\n wait: number,\n): (...args: Parameters<T>) => void {\n let timer: ReturnType<typeof setTimeout> | null = null;\n return (...args: Parameters<T>) => {\n if (timer !== null) clearTimeout(timer);\n timer = setTimeout(() => fn(...args), wait);\n };\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · utils/string.ts\n// Pure string utilities with no side-effects.\n// ─────────────────────────────────────────────────────────────\n\n/** Split a string into lines, preserving all content. */\nexport function splitLines(text: string): string[] {\n return text.split('\\n');\n}\n\n/** Join lines into a string. */\nexport function joinLines(lines: string[]): string {\n return lines.join('\\n');\n}\n\n/** Get the leading whitespace (indentation) of a line. */\nexport function getIndent(line: string): string {\n return (line.match(/^(\\s*)/) ?? ['', ''])[1];\n}\n\n/** Count leading spaces on a line. */\nexport function getIndentLevel(line: string, tabSize: number): number {\n return Math.floor(getIndent(line).length / tabSize);\n}\n\n/** Build a string of `n` spaces. */\nexport function spaces(n: number): string {\n return ' '.repeat(Math.max(0, n));\n}\n\n/** Test if a character is a word character (\\w). */\nexport function isWordChar(ch: string): boolean {\n return /[\\w$]/.test(ch);\n}\n\n/** Find the start of the word at `col` in `line`. */\nexport function wordStart(line: string, col: number, isWord: (ch: string) => boolean = isWordChar): number {\n let s = col;\n while (s > 0 && isWord(line[s - 1]!)) s--;\n return s;\n}\n\n/** Find the end of the word at `col` in `line`. */\nexport function wordEnd(line: string, col: number, isWord: (ch: string) => boolean = isWordChar): number {\n let e = col;\n while (e < line.length && isWord(line[e]!)) e++;\n return e;\n}\n\n/** Return the word under (or before) `col` in `line`. */\nexport function wordAt(line: string, col: number): string {\n return line.slice(wordStart(line, col), wordEnd(line, col));\n}\n\n/**\n * Throttle a function so it fires at most once per `ms` milliseconds.\n * The first call fires immediately; subsequent calls within the window are\n * coalesced and the last one fires at the end of the current interval.\n *\n * @param fn - Function to throttle.\n * @param ms - Minimum interval between invocations in milliseconds.\n */\nexport function throttle<A extends unknown[]>(\n fn: (...args: A) => void,\n ms: number,\n): (...args: A) => void {\n let last = 0;\n let timer: ReturnType<typeof setTimeout> | null = null;\n return (...args: A): void => {\n const now = Date.now();\n const remaining = ms - (now - last);\n if (remaining <= 0) {\n if (timer !== null) { clearTimeout(timer); timer = null; }\n last = now;\n fn(...args);\n } else if (timer === null) {\n timer = setTimeout(() => {\n last = Date.now();\n timer = null;\n fn(...args);\n }, remaining);\n }\n };\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · utils/validation.ts\n// Runtime config validation and sanitisation.\n// All numeric options are clamped to sensible bounds so callers\n// never have to guard against NaN, negative values, or extremes.\n// ─────────────────────────────────────────────────────────────\n\nimport type { EditorConfig } from '../types/index.js';\n\n// ── Bounds table ──────────────────────────────────────────────\n// [min, max, fallback] — matches DEFAULT_CONFIG values\nconst BOUNDS: Partial<Record<keyof EditorConfig, [number, number, number]>> = {\n fontSize: [8, 72, 13 ],\n lineHeight: [14, 64, 22 ],\n tabSize: [1, 16, 2 ],\n wrapColumn: [20, 500, 80 ],\n maxCompletions: [1, 50, 14 ],\n autocompletePrefixLength:[1, 10, 2 ],\n gutterWidth: [30, 200, 60 ],\n minimapWidth: [60, 300, 120 ],\n cursorBlinkRate: [200, 5000, 1050],\n maxUndoHistory: [10, 5000, 300 ],\n undoBatchMs: [0, 5000, 700 ],\n};\n\n/**\n * Clamp `value` to `[min, max]`.\n * Returns `fallback` if the value is not a finite number.\n */\nexport function clampNum(value: number, min: number, max: number, fallback: number): number {\n const n = Number(value);\n if (!Number.isFinite(n)) return fallback;\n return Math.max(min, Math.min(max, Math.round(n)));\n}\n\n/**\n * Validate and sanitise a (possibly partial) `EditorConfig`.\n * Every numeric field present in the input is clamped to its allowed range.\n * Unknown or non-numeric fields are passed through untouched.\n *\n * @example\n * ```ts\n * const safe = validateConfig({ fontSize: -4, tabSize: 999 });\n * // safe.fontSize === 8 (clamped to min)\n * // safe.tabSize === 16 (clamped to max)\n * ```\n */\nexport function validateConfig<T extends Partial<EditorConfig>>(config: T): T {\n const out = { ...config } as Record<string, unknown>;\n\n for (const [key, bounds] of Object.entries(BOUNDS) as [keyof EditorConfig, [number, number, number]][]) {\n if (key in config && config[key] !== undefined) {\n const [min, max, fallback] = bounds;\n out[key as string] = clampNum(config[key] as number, min, max, fallback);\n }\n }\n\n return out as T;\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · features/bracket-matcher.ts\n// Finds the matching bracket pair for the character at cursor.\n// ─────────────────────────────────────────────────────────────\n\nimport type { CursorPosition } from '../types/index.js';\n\nexport interface BracketMatch {\n open: CursorPosition;\n close: CursorPosition;\n}\n\nconst OPEN_MAP: Record<string, string> = { '(': ')', '{': '}', '[': ']' };\nconst CLOSE_MAP: Record<string, string> = { ')': '(', '}': '{', ']': '[' };\n\n/**\n * Find the matching bracket for the character at or before the cursor.\n * Searches up to 500 lines in each direction.\n */\nexport function findBracketMatch(\n doc: string[],\n cursor: CursorPosition,\n): BracketMatch | null {\n const { row, col } = cursor;\n const line = doc[row] ?? '';\n\n // Prefer the char at col, then char before col\n let ch = line[col];\n let charCol = col;\n if (!OPEN_MAP[ch] && !CLOSE_MAP[ch]) {\n ch = line[col - 1];\n charCol = col - 1;\n }\n if (!ch) return null;\n\n if (OPEN_MAP[ch]) {\n // Search forward for matching close\n const close = OPEN_MAP[ch];\n let depth = 0;\n for (let r = row; r < Math.min(doc.length, row + 500); r++) {\n const l = doc[r] ?? '';\n const from = r === row ? charCol : 0;\n for (let c = from; c < l.length; c++) {\n if (l[c] === ch) depth++;\n else if (l[c] === close) {\n depth--;\n if (depth === 0) return {\n open: { row, col: charCol },\n close: { row: r, col: c },\n };\n }\n }\n }\n } else if (CLOSE_MAP[ch]) {\n // Search backward for matching open\n const open = CLOSE_MAP[ch];\n let depth = 0;\n for (let r = row; r >= Math.max(0, row - 500); r--) {\n const l = doc[r] ?? '';\n const from = r === row ? charCol : l.length - 1;\n for (let c = from; c >= 0; c--) {\n if (l[c] === ch) depth++;\n else if (l[c] === open) {\n depth--;\n if (depth === 0) return {\n open: { row: r, col: c },\n close: { row, col: charCol },\n };\n }\n }\n }\n }\n return null;\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · features/code-folding.ts\n// Determines foldable regions and manages fold state.\n// ─────────────────────────────────────────────────────────────\n\n/** Returns true if the line has an unmatched { (net opens > closes). */\nexport function isFoldable(doc: string[], row: number): boolean {\n const line = doc[row] ?? '';\n let net = 0;\n for (const ch of line) {\n if (ch === '{') net++;\n else if (ch === '}') net--;\n }\n return net > 0;\n}\n\n/** Find the line index where the block opened on `row` closes. */\nexport function findFoldEnd(doc: string[], row: number): number | null {\n let depth = 0;\n for (let r = row; r < doc.length; r++) {\n for (const ch of doc[r] ?? '') {\n if (ch === '{') depth++;\n else if (ch === '}') {\n depth--;\n if (depth === 0) return r;\n }\n }\n }\n return null;\n}\n\n/** Toggle a fold at `row`. Returns updated map. */\nexport function toggleFold(\n foldedLines: Map<number, number>,\n doc: string[],\n row: number,\n): Map<number, number> {\n const next = new Map(foldedLines);\n if (next.has(row)) {\n next.delete(row);\n } else {\n const end = findFoldEnd(doc, row);\n if (end !== null && end > row) next.set(row, end);\n }\n return next;\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · features/emmet.ts\n// Emmet abbreviation expansion — zero dependencies.\n// ─────────────────────────────────────────────────────────────\n\nconst SELF_CLOSE = new Set([\n 'img','input','br','hr','meta','link','area','base',\n 'col','embed','param','source','track','wbr',\n]);\n\n/** Parse an Emmet abbreviation into expanded HTML. Returns null if invalid. */\nexport function expandEmmet(abbr: string): string | null {\n const trimmed = abbr.trim();\n if (!trimmed) return null;\n try {\n const result = parseAbbr(trimmed);\n return result === trimmed ? null : result;\n } catch {\n return null;\n }\n}\n\nfunction parseAbbr(abbr: string): string {\n if (abbr.includes('>')) {\n const idx = abbr.indexOf('>');\n return buildTag(abbr.slice(0, idx), parseAbbr(abbr.slice(idx + 1)));\n }\n if (abbr.includes('+')) {\n return abbr.split('+').map(a => parseAbbr(a.trim())).join('\\n');\n }\n const repMatch = abbr.match(/^(.+)\\*(\\d+)$/);\n if (repMatch) {\n const n = parseInt(repMatch[2], 10);\n return Array.from({ length: n }, (_, i) => buildTag(repMatch[1], `$${i + 1}`)).join('\\n');\n }\n return buildTag(abbr, '$1');\n}\n\nfunction buildTag(spec: string, inner: string): string {\n const idMatch = spec.match(/#([\\w-]+)/);\n const clsMatch = spec.match(/\\.([\\w.-]+)/g);\n const attrMatch = spec.match(/\\[([^\\]]+)\\]/);\n\n let tag = spec\n .replace(/#[\\w-]+/g, '')\n .replace(/\\.[\\w.-]+/g, '')\n .replace(/\\[[^\\]]+\\]/g, '')\n .trim() || 'div';\n\n let attrs = '';\n if (idMatch) attrs += ` id=\"${idMatch[1]}\"`;\n if (clsMatch) attrs += ` class=\"${clsMatch.map(c => c.slice(1)).join(' ')}\"`;\n if (attrMatch) attrs += ` ${attrMatch[1]}`;\n\n if (SELF_CLOSE.has(tag)) return `<${tag}${attrs}>`;\n return `<${tag}${attrs}>${inner}</${tag}>`;\n}\n\n/** Find the Emmet abbreviation that ends at `col` in `line`. */\nexport function findAbbrBefore(line: string, col: number): { abbr: string; start: number } | null {\n let start = col;\n while (start > 0 && /[\\w#.[\\]*>+{}()$@:-]/.test(line[start - 1])) start--;\n const abbr = line.slice(start, col);\n if (abbr.length < 2) return null;\n return { abbr, start };\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · features/snippets.ts\n// Snippet expansion — type a trigger word and press Tab.\n// ─────────────────────────────────────────────────────────────\n\nimport type { CompletionItem } from '../types/index.js';\n\n// ── Built-in TypeScript / JavaScript snippets ─────────────────\n\nconst TS_JS_SNIPPETS: CompletionItem[] = [\n {\n label: 'fn',\n kind: 'snip',\n detail: 'function declaration',\n description: 'Declares a named function.\\n\\nfunction name(params) {\\n // body\\n}',\n body: 'function $1($2) {\\n $3\\n}',\n },\n {\n label: 'afn',\n kind: 'snip',\n detail: 'arrow function',\n description: 'Declares a const arrow function.\\n\\nconst name = (params) => {\\n // body\\n};',\n body: 'const $1 = ($2) => {\\n $3\\n};',\n },\n {\n label: 'asyncfn',\n kind: 'snip',\n detail: 'async function',\n description: 'Declares an async function returning a Promise.\\n\\nasync function name(params): Promise<T> {\\n // body\\n}',\n body: 'async function $1($2): Promise<$3> {\\n $4\\n}',\n },\n {\n label: 'cl',\n kind: 'snip',\n detail: 'class declaration',\n description: 'Declares a class with a constructor.\\n\\nclass Name {\\n constructor(params) { ... }\\n}',\n body: 'class $1 {\\n constructor($2) {\\n $3\\n }\\n}',\n },\n {\n label: 'forof',\n kind: 'snip',\n detail: 'for…of loop',\n description: 'Iterates over the values of an iterable (array, string, Map, etc.).\\n\\nfor (const item of iterable) { ... }',\n body: 'for (const $1 of $2) {\\n $3\\n}',\n },\n {\n label: 'forin',\n kind: 'snip',\n detail: 'for…in loop',\n description: 'Iterates over the enumerable property keys of an object.\\n\\nfor (const key in object) { ... }',\n body: 'for (const $1 in $2) {\\n $3\\n}',\n },\n {\n label: 'trycatch',\n kind: 'snip',\n detail: 'try / catch block',\n description: 'Wraps code in a try/catch to handle runtime errors.\\n\\ntry {\\n ...\\n} catch (error) {\\n ...\\n}',\n body: 'try {\\n $1\\n} catch ($2error) {\\n $3\\n}',\n },\n {\n label: 'promise',\n kind: 'snip',\n detail: 'new Promise',\n description: 'Creates a new Promise with resolve and reject handlers.\\n\\nnew Promise<T>((resolve, reject) => { ... })',\n body: 'new Promise<$1>((resolve, reject) => {\\n $2\\n})',\n },\n {\n label: 'imp',\n kind: 'snip',\n detail: 'import statement',\n description: \"Adds a named import from a module.\\n\\nimport { name } from 'module';\",\n body: \"import { $1 } from '$2';\",\n },\n {\n label: 'iface',\n kind: 'snip',\n detail: 'interface (TypeScript)',\n description: 'Declares a TypeScript interface.\\n\\ninterface Name {\\n field: Type;\\n}',\n body: 'interface $1 {\\n $2: $3;\\n}',\n language: ['typescript'],\n },\n {\n label: 'ife',\n kind: 'snip',\n detail: 'immediately-invoked function expression',\n description: 'An IIFE — defines and immediately calls a function.\\n\\n((params) => {\\n ...\\n})(args);',\n body: '(($1) => {\\n $2\\n})($3);',\n },\n {\n label: 'sw',\n kind: 'snip',\n detail: 'switch statement',\n description: 'A switch/case statement with a default branch.\\n\\nswitch (expr) {\\n case value:\\n ...\\n break;\\n default:\\n ...\\n}',\n body: 'switch ($1) {\\n case $2:\\n $3\\n break;\\n default:\\n $4\\n}',\n },\n];\n\n// ── Built-in CSS snippets ──────────────────────────────────────\n\nconst CSS_SNIPPETS: CompletionItem[] = [\n {\n label: 'flex',\n kind: 'snip',\n detail: 'flexbox container',\n description: 'Sets up a flex container with centered alignment.\\n\\ndisplay: flex;\\nalign-items: center;\\njustify-content: center;',\n body: 'display: flex;\\nalign-items: $1center;\\njustify-content: $2center;',\n language: ['css'],\n },\n {\n label: 'grid',\n kind: 'snip',\n detail: 'CSS grid',\n description: 'Sets up a CSS grid with equal columns and gap.\\n\\ndisplay: grid;\\ngrid-template-columns: repeat(3, 1fr);\\ngap: 16px;',\n body: 'display: grid;\\ngrid-template-columns: $1repeat(3, 1fr);\\ngap: $2;',\n language: ['css'],\n },\n {\n label: 'media',\n kind: 'snip',\n detail: '@media query',\n description: 'A responsive media query breakpoint.\\n\\n@media (max-width: 768px) {\\n ...\\n}',\n body: '@media ($1max-width: 768px) {\\n $2\\n}',\n language: ['css'],\n },\n {\n label: 'anim',\n kind: 'snip',\n detail: '@keyframes animation',\n description: 'A CSS keyframes animation block.\\n\\n@keyframes name {\\n from { ... }\\n to { ... }\\n}',\n body: '@keyframes $1 {\\n from { $2 }\\n to { $3 }\\n}',\n language: ['css'],\n },\n {\n label: 'var',\n kind: 'snip',\n detail: 'CSS custom property',\n description: 'Declares a CSS custom property (variable).\\n\\n--name: value;',\n body: '--$1: $2;',\n language: ['css'],\n },\n];\n\n// ── Built-in general / HTML snippets ──────────────────────────\n\nconst GENERAL_SNIPPETS: CompletionItem[] = [\n {\n label: 'accordion',\n kind: 'snip',\n detail: 'HTML details/summary',\n description: 'An accessible accordion using the native <details> and <summary> elements.\\n\\n<details>\\n <summary>Title</summary>\\n <div>content</div>\\n</details>',\n body: '<details>\\n <summary>$1Title</summary>\\n <div>\\n $2\\n </div>\\n</details>',\n },\n {\n label: 'card',\n kind: 'snip',\n detail: 'card component',\n description: 'A generic card component with header, body, and footer sections.',\n body: '<div class=\"card\">\\n <div class=\"card-header\">$1</div>\\n <div class=\"card-body\">$2</div>\\n <div class=\"card-footer\">$3</div>\\n</div>',\n },\n {\n label: 'navbar',\n kind: 'snip',\n detail: 'navigation bar',\n description: 'A simple navigation bar with anchor links.\\n\\n<nav class=\"navbar\">\\n <a href=\"#\">Home</a> ...\\n</nav>',\n body: '<nav class=\"navbar\">\\n <a href=\"$1#\">Home</a>\\n <a href=\"$2#\">About</a>\\n <a href=\"$3#\">Contact</a>\\n</nav>',\n },\n {\n label: 'modal',\n kind: 'snip',\n detail: 'modal dialog',\n description: 'A modal dialog layout with header, body, and footer.\\n\\n<div class=\"modal\">\\n <div class=\"modal-dialog\"> ... </div>\\n</div>',\n body: '<div class=\"modal\">\\n <div class=\"modal-dialog\">\\n <div class=\"modal-header\">$1</div>\\n <div class=\"modal-body\">$2</div>\\n <div class=\"modal-footer\">$3</div>\\n </div>\\n</div>',\n },\n {\n label: 'table',\n kind: 'snip',\n detail: 'HTML table',\n description: 'A semantic HTML table with thead and tbody.\\n\\n<table>\\n <thead><tr><th>...</th></tr></thead>\\n <tbody><tr><td>...</td></tr></tbody>\\n</table>',\n body: '<table>\\n <thead>\\n <tr>\\n <th>$1</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <td>$2</td>\\n </tr>\\n </tbody>\\n</table>',\n },\n];\n\n// ── Public helpers ─────────────────────────────────────────────\n\n/** Returns the built-in snippets (as CompletionItems) that apply to `language`. */\nexport function getBuiltinSnippets(language: string): CompletionItem[] {\n const items: CompletionItem[] = [...GENERAL_SNIPPETS];\n if (language === 'typescript' || language === 'javascript') {\n items.push(...TS_JS_SNIPPETS.filter(s => !s.language || (Array.isArray(s.language) ? s.language.includes(language) : s.language === language)));\n }\n if (language === 'css') {\n items.push(...CSS_SNIPPETS);\n }\n return items;\n}\n\n/**\n * Returns the CompletionItem (kind='snip') whose label exactly matches the word\n * immediately before `col` in `line`, or `null` if no match is found.\n */\nexport function findSnippetTriggerBefore(\n line: string,\n col: number,\n snippets: CompletionItem[],\n): { snippet: CompletionItem; start: number } | null {\n let start = col;\n while (start > 0 && /\\w/.test(line[start - 1])) start--;\n const word = line.slice(start, col);\n if (!word) return null;\n const found = snippets.find(s => s.kind === 'snip' && s.label === word);\n return found ? { snippet: found, start } : null;\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · features/multi-cursor.ts\n// Multi-cursor state management and simultaneous editing.\n// ─────────────────────────────────────────────────────────────\n\nimport type { ExtraCursor, Selection } from '../types/index.js';\nimport { wordStart, wordEnd } from '../utils/string.js';\n\nexport interface MultiCursorState {\n cursors: ExtraCursor[];\n searchWord: string;\n lastMatchRow: number;\n lastMatchCol: number;\n}\n\nexport function createMultiCursorState(): MultiCursorState {\n return { cursors: [], searchWord: '', lastMatchRow: -1, lastMatchCol: -1 };\n}\n\nexport function addCursor(state: MultiCursorState, row: number, col: number, sel: Selection | null): void {\n const exists = state.cursors.some(c => c.row === row && c.col === col);\n if (!exists) state.cursors.push({ row, col, sel });\n}\n\nexport function clearExtraCursors(state: MultiCursorState): void {\n state.cursors = [];\n state.searchWord = '';\n state.lastMatchRow = -1;\n state.lastMatchCol = -1;\n}\n\n/** Insert text at every cursor position (bottom-to-top to preserve indices). */\nexport function multiInsert(\n doc: string[],\n primaryRow: number,\n primaryCol: number,\n extraCursors: ExtraCursor[],\n text: string,\n): { doc: string[]; primaryRow: number; primaryCol: number; extraCursors: ExtraCursor[] } {\n // Build unified list of all cursor positions\n const all: Array<{ row: number; col: number; isPrimary: boolean; idx: number }> = [\n { row: primaryRow, col: primaryCol, isPrimary: true, idx: 0 },\n ...extraCursors.map((c, i) => ({ row: c.row, col: c.col, isPrimary: false, idx: i + 1 })),\n ];\n\n // Sort bottom-to-top, right-to-left so earlier positions stay valid\n all.sort((a, b) => b.row !== a.row ? b.row - a.row : b.col - a.col);\n\n const newDoc = doc.map(l => l);\n let newPrimaryRow = primaryRow;\n let newPrimaryCol = primaryCol;\n const newExtra = extraCursors.map(c => ({ ...c }));\n\n for (const cur of all) {\n const line = newDoc[cur.row] ?? '';\n newDoc[cur.row] = line.slice(0, cur.col) + text + line.slice(cur.col);\n\n // Shift all cursors on the same row that come after this col\n for (const other of all) {\n if (other !== cur && other.row === cur.row && other.col >= cur.col) {\n other.col += text.length;\n }\n }\n cur.col += text.length;\n\n if (cur.isPrimary) {\n newPrimaryRow = cur.row;\n newPrimaryCol = cur.col;\n } else {\n newExtra[cur.idx - 1].row = cur.row;\n newExtra[cur.idx - 1].col = cur.col;\n }\n }\n\n return { doc: newDoc, primaryRow: newPrimaryRow, primaryCol: newPrimaryCol, extraCursors: newExtra };\n}\n\n/** Backspace at every cursor position. */\nexport function multiBackspace(\n doc: string[],\n primaryRow: number,\n primaryCol: number,\n extraCursors: ExtraCursor[],\n): { doc: string[]; primaryRow: number; primaryCol: number; extraCursors: ExtraCursor[] } {\n const all: Array<{ row: number; col: number; isPrimary: boolean; idx: number }> = [\n { row: primaryRow, col: primaryCol, isPrimary: true, idx: 0 },\n ...extraCursors.map((c, i) => ({ row: c.row, col: c.col, isPrimary: false, idx: i + 1 })),\n ];\n\n all.sort((a, b) => b.row !== a.row ? b.row - a.row : b.col - a.col);\n\n const newDoc = doc.map(l => l);\n let newPrimaryRow = primaryRow;\n let newPrimaryCol = primaryCol;\n const newExtra = extraCursors.map(c => ({ ...c }));\n\n for (const cur of all) {\n if (cur.col <= 0) continue;\n const line = newDoc[cur.row] ?? '';\n newDoc[cur.row] = line.slice(0, cur.col - 1) + line.slice(cur.col);\n\n for (const other of all) {\n if (other !== cur && other.row === cur.row && other.col > cur.col) {\n other.col--;\n }\n }\n cur.col--;\n\n if (cur.isPrimary) {\n newPrimaryRow = cur.row;\n newPrimaryCol = cur.col;\n } else {\n newExtra[cur.idx - 1].col = cur.col;\n }\n }\n\n return { doc: newDoc, primaryRow: newPrimaryRow, primaryCol: newPrimaryCol, extraCursors: newExtra };\n}\n\n/**\n * Ctrl+D: find the next occurrence of the word at primary cursor,\n * add a cursor+selection for it.\n */\nexport function selectNextOccurrence(\n state: MultiCursorState,\n doc: string[],\n primaryRow: number,\n primaryCol: number,\n currentSel: Selection | null,\n): { word: string; sel: Selection; row: number; col: number } | null {\n // Determine the search word\n let word = state.searchWord;\n\n if (!word) {\n // First press: derive word from primary cursor\n if (currentSel && currentSel.ar === currentSel.fr) {\n const line = doc[currentSel.ar] ?? '';\n word = line.slice(currentSel.ac, currentSel.fc);\n }\n if (!word) {\n const line = doc[primaryRow] ?? '';\n const s = wordStart(line, primaryCol);\n const e = wordEnd(line, primaryCol);\n word = line.slice(s, e);\n }\n if (!word) return null;\n state.searchWord = word;\n state.lastMatchRow = primaryRow;\n state.lastMatchCol = primaryCol;\n }\n\n const startRow = state.lastMatchRow;\n const startCol = state.lastMatchCol;\n\n // Search from lastMatch position forward\n for (let r = startRow; r < doc.length; r++) {\n const line = doc[r] ?? '';\n const from = r === startRow ? startCol : 0;\n let ci = from;\n while (ci <= line.length - word.length) {\n const idx = line.indexOf(word, ci);\n if (idx < 0) break;\n const wb = idx === 0 || !/\\w/.test(line[idx - 1]);\n const wa = idx + word.length >= line.length || !/\\w/.test(line[idx + word.length]);\n if (wb && wa) {\n state.lastMatchRow = r;\n state.lastMatchCol = idx + word.length;\n return {\n word,\n sel: { ar: r, ac: idx, fr: r, fc: idx + word.length },\n row: r,\n col: idx + word.length,\n };\n }\n ci = idx + 1;\n }\n }\n\n // Wrap around\n for (let r = 0; r <= startRow; r++) {\n const line = doc[r] ?? '';\n const endAt = r === startRow ? startCol : line.length;\n let ci = 0;\n while (ci < endAt) {\n const idx = line.indexOf(word, ci);\n if (idx < 0 || idx >= endAt) break;\n const wb = idx === 0 || !/\\w/.test(line[idx - 1]);\n const wa = idx + word.length >= line.length || !/\\w/.test(line[idx + word.length]);\n if (wb && wa) {\n state.lastMatchRow = r;\n state.lastMatchCol = idx + word.length;\n return {\n word,\n sel: { ar: r, ac: idx, fr: r, fc: idx + word.length },\n row: r,\n col: idx + word.length,\n };\n }\n ci = idx + 1;\n }\n }\n\n return null;\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · features/find-replace.ts\n// Find and replace logic — pure functions, no DOM access.\n// ─────────────────────────────────────────────────────────────\n\nimport type { FindMatch } from '../types/index.js';\n\nexport interface FindOptions {\n caseSensitive: boolean;\n useRegex: boolean;\n}\n\n/** Run a search and return all matches. */\nexport function findAll(doc: string[], query: string, opts: FindOptions): FindMatch[] {\n if (!query) return [];\n const matches: FindMatch[] = [];\n\n for (let r = 0; r < doc.length; r++) {\n const line = doc[r] ?? '';\n\n if (opts.useRegex) {\n try {\n const re = new RegExp(query, opts.caseSensitive ? 'g' : 'gi');\n let m: RegExpExecArray | null;\n while ((m = re.exec(line)) !== null) {\n matches.push({ row: r, col: m.index, len: m[0].length });\n if (!m[0].length) break; // prevent infinite loop on zero-width match\n }\n } catch {\n // Invalid regex — return empty\n }\n } else {\n const hay = opts.caseSensitive ? line : line.toLowerCase();\n const needle = opts.caseSensitive ? query : query.toLowerCase();\n let ci = 0;\n while (true) {\n const idx = hay.indexOf(needle, ci);\n if (idx === -1) break;\n matches.push({ row: r, col: idx, len: query.length });\n ci = idx + 1;\n }\n }\n }\n\n return matches;\n}\n\n/** Replace the match at `matchIdx` with `replacement`. Returns updated doc. */\nexport function replaceOne(\n doc: string[],\n matches: FindMatch[],\n matchIdx: number,\n replacement: string,\n): string[] {\n const m = matches[matchIdx];\n if (!m) return doc;\n const newDoc = [...doc];\n const line = newDoc[m.row] ?? '';\n newDoc[m.row] = line.slice(0, m.col) + replacement + line.slice(m.col + m.len);\n return newDoc;\n}\n\n/** Replace all matches with `replacement`. Returns updated doc. */\nexport function replaceAll(\n doc: string[],\n matches: FindMatch[],\n replacement: string,\n): string[] {\n const newDoc = [...doc];\n // Process in reverse order so earlier positions stay valid\n for (let i = matches.length - 1; i >= 0; i--) {\n const m = matches[i];\n const line = newDoc[m.row] ?? '';\n newDoc[m.row] = line.slice(0, m.col) + replacement + line.slice(m.col + m.len);\n }\n return newDoc;\n}\n\n/** Return the index of the next match after the given position. */\nexport function nextMatchIndex(\n matches: FindMatch[],\n currentIdx: number,\n direction: 1 | -1,\n): number {\n if (!matches.length) return -1;\n return (currentIdx + direction + matches.length) % matches.length;\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · features/word-highlight.ts\n// Finds all occurrences of the word under the cursor\n// (excluding the cursor position itself).\n// ─────────────────────────────────────────────────────────────\n\nimport type { FindMatch, Selection } from '../types/index.js';\nimport { wordStart, wordEnd } from '../utils/string.js';\n\n/** Compute word-highlight matches for the current cursor position. */\nexport function computeWordHighlights(\n doc: string[],\n curRow: number,\n curCol: number,\n sel: Selection | null,\n): FindMatch[] {\n // Don't highlight when there's an active selection\n if (sel) return [];\n\n const line = doc[curRow] ?? '';\n const s = wordStart(line, curCol);\n const e = wordEnd(line, curCol);\n const word = line.slice(s, e);\n\n if (!word || word.length < 2) return [];\n\n const results: FindMatch[] = [];\n for (let r = 0; r < doc.length; r++) {\n const l = doc[r] ?? '';\n let ci = 0;\n while (ci <= l.length - word.length) {\n const idx = l.indexOf(word, ci);\n if (idx < 0) break;\n\n const wb = idx === 0 || !/\\w/.test(l[idx - 1]);\n const wa = idx + word.length >= l.length || !/\\w/.test(l[idx + word.length]);\n\n // Exclude the occurrence the cursor is sitting on\n const isCursorPos = r === curRow && idx === s;\n\n if (wb && wa && !isCursorPos) {\n results.push({ row: r, col: idx, len: word.length });\n }\n ci = idx + 1;\n }\n }\n return results;\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · features/autocomplete.ts\n// Autocomplete suggestion engine — language-aware, fully customisable.\n// ─────────────────────────────────────────────────────────────\n\nimport type { CompletionItem, CompletionKind } from '../types/index.js';\nimport { LANGUAGE_KEYWORDS, LANGUAGE_TYPES, KEYWORDS_TS, TYPES_TS } from '../core/constants.js';\n\n// Re-export so callers can import from this module too\nexport type { CompletionItem, CompletionKind };\n\n// ─────────────────────────────────────────────────────────────\n// Per-language built-in function/property completions\n// (beyond keywords and types, which come from constants.ts)\n// ─────────────────────────────────────────────────────────────\n\nconst BUILTIN_FNS_TS_JS: CompletionItem[] = [\n { label: 'console.log', kind: 'fn', detail: 'void' },\n { label: 'console.error', kind: 'fn', detail: 'void' },\n { label: 'console.warn', kind: 'fn', detail: 'void' },\n { label: 'console.info', kind: 'fn', detail: 'void' },\n { label: 'console.table', kind: 'fn', detail: 'void' },\n { label: 'document.getElementById', kind: 'fn', detail: 'HTMLElement | null' },\n { label: 'document.querySelector', kind: 'fn', detail: 'Element | null' },\n { label: 'document.querySelectorAll',kind: 'fn', detail: 'NodeList' },\n { label: 'document.createElement', kind: 'fn', detail: 'HTMLElement' },\n { label: 'document.createTextNode', kind: 'fn', detail: 'Text' },\n { label: 'addEventListener', kind: 'fn', detail: '(ev, cb) => void' },\n { label: 'removeEventListener', kind: 'fn', detail: '(ev, cb) => void' },\n { label: 'requestAnimationFrame', kind: 'fn', detail: '(cb) => number' },\n { label: 'cancelAnimationFrame', kind: 'fn', detail: '(id) => void' },\n { label: 'setTimeout', kind: 'fn', detail: '(cb, ms) => id' },\n { label: 'clearTimeout', kind: 'fn', detail: '(id) => void' },\n { label: 'setInterval', kind: 'fn', detail: '(cb, ms) => id' },\n { label: 'clearInterval', kind: 'fn', detail: '(id) => void' },\n { label: 'JSON.stringify', kind: 'fn', detail: 'string' },\n { label: 'JSON.parse', kind: 'fn', detail: 'any' },\n { label: 'Math.max', kind: 'fn', detail: 'number' },\n { label: 'Math.min', kind: 'fn', detail: 'number' },\n { label: 'Math.floor', kind: 'fn', detail: 'number' },\n { label: 'Math.ceil', kind: 'fn', detail: 'number' },\n { label: 'Math.round', kind: 'fn', detail: 'number' },\n { label: 'Math.abs', kind: 'fn', detail: 'number' },\n { label: 'Math.pow', kind: 'fn', detail: 'number' },\n { label: 'Math.sqrt', kind: 'fn', detail: 'number' },\n { label: 'Math.random', kind: 'fn', detail: 'number' },\n { label: 'Object.keys', kind: 'fn', detail: 'string[]' },\n { label: 'Object.values', kind: 'fn', detail: 'any[]' },\n { label: 'Object.entries', kind: 'fn', detail: '[string, any][]' },\n { label: 'Object.assign', kind: 'fn', detail: 'T & U' },\n { label: 'Object.freeze', kind: 'fn', detail: 'Readonly<T>' },\n { label: 'Object.create', kind: 'fn', detail: 'object' },\n { label: 'Array.from', kind: 'fn', detail: 'T[]' },\n { label: 'Array.isArray', kind: 'fn', detail: 'boolean' },\n { label: 'Promise.all', kind: 'fn', detail: 'Promise<T[]>' },\n { label: 'Promise.resolve', kind: 'fn', detail: 'Promise<T>' },\n { label: 'Promise.reject', kind: 'fn', detail: 'Promise<never>' },\n { label: 'Promise.allSettled', kind: 'fn', detail: 'Promise<...>' },\n { label: 'parseInt', kind: 'fn', detail: 'number' },\n { label: 'parseFloat', kind: 'fn', detail: 'number' },\n { label: 'isNaN', kind: 'fn', detail: 'boolean' },\n { label: 'isFinite', kind: 'fn', detail: 'boolean' },\n { label: 'encodeURIComponent', kind: 'fn', detail: 'string' },\n { label: 'decodeURIComponent', kind: 'fn', detail: 'string' },\n { label: 'structuredClone', kind: 'fn', detail: 'T' },\n { label: 'queueMicrotask', kind: 'fn', detail: 'void' },\n { label: 'fetch', kind: 'fn', detail: 'Promise<Response>' },\n];\n\n/** CSS property and function completions. */\nconst BUILTIN_FNS_CSS: CompletionItem[] = [\n // ── Layout ────────────────────────────────────────────────\n { label: 'display', kind: 'var', detail: 'property' },\n { label: 'position', kind: 'var', detail: 'property' },\n { label: 'top', kind: 'var', detail: 'property' },\n { label: 'right', kind: 'var', detail: 'property' },\n { label: 'bottom', kind: 'var', detail: 'property' },\n { label: 'left', kind: 'var', detail: 'property' },\n { label: 'width', kind: 'var', detail: 'property' },\n { label: 'height', kind: 'var', detail: 'property' },\n { label: 'min-width', kind: 'var', detail: 'property' },\n { label: 'max-width', kind: 'var', detail: 'property' },\n { label: 'min-height', kind: 'var', detail: 'property' },\n { label: 'max-height', kind: 'var', detail: 'property' },\n { label: 'z-index', kind: 'var', detail: 'property' },\n { label: 'overflow', kind: 'var', detail: 'property' },\n { label: 'overflow-x', kind: 'var', detail: 'property' },\n { label: 'overflow-y', kind: 'var', detail: 'property' },\n { label: 'box-sizing', kind: 'var', detail: 'property' },\n // ── Flexbox ───────────────────────────────────────────────\n { label: 'flex', kind: 'var', detail: 'property' },\n { label: 'flex-direction', kind: 'var', detail: 'property' },\n { label: 'flex-wrap', kind: 'var', detail: 'property' },\n { label: 'flex-grow', kind: 'var', detail: 'property' },\n { label: 'flex-shrink', kind: 'var', detail: 'property' },\n { label: 'flex-basis', kind: 'var', detail: 'property' },\n { label: 'flex-flow', kind: 'var', detail: 'property' },\n { label: 'align-items', kind: 'var', detail: 'property' },\n { label: 'align-content', kind: 'var', detail: 'property' },\n { label: 'align-self', kind: 'var', detail: 'property' },\n { label: 'justify-content', kind: 'var', detail: 'property' },\n { label: 'justify-items', kind: 'var', detail: 'property' },\n { label: 'justify-self', kind: 'var', detail: 'property' },\n { label: 'gap', kind: 'var', detail: 'property' },\n { label: 'row-gap', kind: 'var', detail: 'property' },\n { label: 'column-gap', kind: 'var', detail: 'property' },\n // ── Grid ──────────────────────────────────────────────────\n { label: 'grid', kind: 'var', detail: 'property' },\n { label: 'grid-template', kind: 'var', detail: 'property' },\n { label: 'grid-template-columns', kind: 'var', detail: 'property' },\n { label: 'grid-template-rows', kind: 'var', detail: 'property' },\n { label: 'grid-template-areas', kind: 'var', detail: 'property' },\n { label: 'grid-column', kind: 'var', detail: 'property' },\n { label: 'grid-row', kind: 'var', detail: 'property' },\n { label: 'grid-area', kind: 'var', detail: 'property' },\n { label: 'grid-auto-flow', kind: 'var', detail: 'property' },\n // ── Spacing ───────────────────────────────────────────────\n { label: 'margin', kind: 'var', detail: 'property' },\n { label: 'margin-top', kind: 'var', detail: 'property' },\n { label: 'margin-right', kind: 'var', detail: 'property' },\n { label: 'margin-bottom', kind: 'var', detail: 'property' },\n { label: 'margin-left', kind: 'var', detail: 'property' },\n { label: 'padding', kind: 'var', detail: 'property' },\n { label: 'padding-top', kind: 'var', detail: 'property' },\n { label: 'padding-right', kind: 'var', detail: 'property' },\n { label: 'padding-bottom', kind: 'var', detail: 'property' },\n { label: 'padding-left', kind: 'var', detail: 'property' },\n // ── Typography ────────────────────────────────────────────\n { label: 'color', kind: 'var', detail: 'property' },\n { label: 'font', kind: 'var', detail: 'property' },\n { label: 'font-family', kind: 'var', detail: 'property' },\n { label: 'font-size', kind: 'var', detail: 'property' },\n { label: 'font-weight', kind: 'var', detail: 'property' },\n { label: 'font-style', kind: 'var', detail: 'property' },\n { label: 'line-height', kind: 'var', detail: 'property' },\n { label: 'text-align', kind: 'var', detail: 'property' },\n { label: 'text-decoration', kind: 'var', detail: 'property' },\n { label: 'text-transform', kind: 'var', detail: 'property' },\n { label: 'letter-spacing', kind: 'var', detail: 'property' },\n { label: 'word-spacing', kind: 'var', detail: 'property' },\n { label: 'white-space', kind: 'var', detail: 'property' },\n { label: 'word-break', kind: 'var', detail: 'property' },\n { label: 'word-wrap', kind: 'var', detail: 'property' },\n { label: 'text-overflow', kind: 'var', detail: 'property' },\n // ── Background ────────────────────────────────────────────\n { label: 'background', kind: 'var', detail: 'property' },\n { label: 'background-color', kind: 'var', detail: 'property' },\n { label: 'background-image', kind: 'var', detail: 'property' },\n { label: 'background-size', kind: 'var', detail: 'property' },\n { label: 'background-position', kind: 'var', detail: 'property' },\n { label: 'background-repeat', kind: 'var', detail: 'property' },\n { label: 'background-clip', kind: 'var', detail: 'property' },\n { label: 'background-attachment', kind: 'var', detail: 'property' },\n // ── Border ────────────────────────────────────────────────\n { label: 'border', kind: 'var', detail: 'property' },\n { label: 'border-width', kind: 'var', detail: 'property' },\n { label: 'border-style', kind: 'var', detail: 'property' },\n { label: 'border-color', kind: 'var', detail: 'property' },\n { label: 'border-radius', kind: 'var', detail: 'property' },\n { label: 'border-top', kind: 'var', detail: 'property' },\n { label: 'border-right', kind: 'var', detail: 'property' },\n { label: 'border-bottom', kind: 'var', detail: 'property' },\n { label: 'border-left', kind: 'var', detail: 'property' },\n { label: 'outline', kind: 'var', detail: 'property' },\n { label: 'outline-width', kind: 'var', detail: 'property' },\n { label: 'outline-style', kind: 'var', detail: 'property' },\n { label: 'outline-color', kind: 'var', detail: 'property' },\n { label: 'outline-offset', kind: 'var', detail: 'property' },\n // ── Effects ───────────────────────────────────────────────\n { label: 'opacity', kind: 'var', detail: 'property' },\n { label: 'box-shadow', kind: 'var', detail: 'property' },\n { label: 'text-shadow', kind: 'var', detail: 'property' },\n { label: 'filter', kind: 'var', detail: 'property' },\n { label: 'backdrop-filter', kind: 'var', detail: 'property' },\n { label: 'transform', kind: 'var', detail: 'property' },\n { label: 'transform-origin', kind: 'var', detail: 'property' },\n { label: 'transition', kind: 'var', detail: 'property' },\n { label: 'animation', kind: 'var', detail: 'property' },\n { label: 'animation-name', kind: 'var', detail: 'property' },\n { label: 'animation-duration', kind: 'var', detail: 'property' },\n { label: 'animation-timing-function',kind: 'var', detail: 'property' },\n { label: 'animation-delay', kind: 'var', detail: 'property' },\n { label: 'animation-iteration-count',kind: 'var', detail: 'property' },\n { label: 'animation-fill-mode', kind: 'var', detail: 'property' },\n // ── Interaction ───────────────────────────────────────────\n { label: 'cursor', kind: 'var', detail: 'property' },\n { label: 'pointer-events', kind: 'var', detail: 'property' },\n { label: 'user-select', kind: 'var', detail: 'property' },\n { label: 'resize', kind: 'var', detail: 'property' },\n // ── Misc ──────────────────────────────────────────────────\n { label: 'visibility', kind: 'var', detail: 'property' },\n { label: 'content', kind: 'var', detail: 'property' },\n { label: 'list-style', kind: 'var', detail: 'property' },\n { label: 'will-change', kind: 'var', detail: 'property' },\n { label: 'appearance', kind: 'var', detail: 'property' },\n { label: 'clip-path', kind: 'var', detail: 'property' },\n { label: 'object-fit', kind: 'var', detail: 'property' },\n { label: 'object-position',kind: 'var', detail: 'property' },\n { label: 'scroll-behavior',kind: 'var', detail: 'property' },\n { label: 'aspect-ratio', kind: 'var', detail: 'property' },\n // ── CSS functions ─────────────────────────────────────────\n { label: 'var', kind: 'fn', detail: 'css fn' },\n { label: 'calc', kind: 'fn', detail: 'css fn' },\n { label: 'min', kind: 'fn', detail: 'css fn' },\n { label: 'max', kind: 'fn', detail: 'css fn' },\n { label: 'clamp', kind: 'fn', detail: 'css fn' },\n { label: 'rgb', kind: 'fn', detail: 'css fn' },\n { label: 'rgba', kind: 'fn', detail: 'css fn' },\n { label: 'hsl', kind: 'fn', detail: 'css fn' },\n { label: 'hsla', kind: 'fn', detail: 'css fn' },\n { label: 'oklch', kind: 'fn', detail: 'css fn' },\n { label: 'linear-gradient', kind: 'fn', detail: 'css fn' },\n { label: 'radial-gradient', kind: 'fn', detail: 'css fn' },\n { label: 'conic-gradient', kind: 'fn', detail: 'css fn' },\n { label: 'translate', kind: 'fn', detail: 'css fn' },\n { label: 'scale', kind: 'fn', detail: 'css fn' },\n { label: 'rotate', kind: 'fn', detail: 'css fn' },\n { label: 'skew', kind: 'fn', detail: 'css fn' },\n { label: 'matrix', kind: 'fn', detail: 'css fn' },\n { label: 'perspective', kind: 'fn', detail: 'css fn' },\n { label: 'url', kind: 'fn', detail: 'css fn' },\n { label: 'attr', kind: 'fn', detail: 'css fn' },\n { label: 'env', kind: 'fn', detail: 'css fn' },\n { label: 'repeat', kind: 'fn', detail: 'css fn' },\n { label: 'minmax', kind: 'fn', detail: 'css fn' },\n { label: 'fit-content', kind: 'fn', detail: 'css fn' },\n];\n\n/** Language → built-in function/property completion items. */\nconst BUILTIN_FNS_BY_LANG: Record<string, CompletionItem[]> = {\n typescript: BUILTIN_FNS_TS_JS,\n javascript: BUILTIN_FNS_TS_JS,\n css: BUILTIN_FNS_CSS,\n json: [],\n markdown: [],\n text: [],\n};\n\n// ─────────────────────────────────────────────────────────────\n// Base-completion builder\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Build the base completion list for a language.\n * Returns `baseCompletions` unchanged when it is non-empty (user override).\n * Otherwise combines language keywords + types + built-in functions + extras.\n */\nfunction buildBaseCompletions(\n language: string,\n extraKeywords: string[],\n extraTypes: string[],\n): CompletionItem[] {\n const kwSet = LANGUAGE_KEYWORDS[language] ?? KEYWORDS_TS;\n const typeSet = LANGUAGE_TYPES[language] ?? TYPES_TS;\n const builtins = BUILTIN_FNS_BY_LANG[language] ?? BUILTIN_FNS_TS_JS;\n\n return [\n ...[...kwSet, ...extraKeywords].map(w => ({ label: w, kind: 'kw' as const, detail: 'keyword' })),\n ...[...typeSet, ...extraTypes ].map(w => ({ label: w, kind: 'typ' as const, detail: 'type' })),\n ...builtins,\n ];\n}\n\n// ─────────────────────────────────────────────────────────────\n// Document-word extraction\n// ─────────────────────────────────────────────────────────────\n\n/** Extract all identifiers from the document for in-file completions. */\nfunction extractDocWords(doc: string[], exclude: string): Set<string> {\n const words = new Set<string>();\n for (const line of doc) {\n const matches = line.match(/[a-zA-Z_$][\\w$]*/g) ?? [];\n for (const w of matches) {\n if (w !== exclude && w.length > 2) words.add(w);\n }\n }\n return words;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Public API\n// ─────────────────────────────────────────────────────────────\n\nexport interface AutocompleteOptions {\n /** Active language — selects built-in keywords, types, and functions. Default: `'typescript'`. */\n language?: string;\n /** Extra keywords added to the base list (also highlighted by the tokeniser). */\n extraKeywords?: string[];\n /** Extra types added to the base list (also highlighted by the tokeniser). */\n extraTypes?: string[];\n /**\n * The unified completions array. Items with `kind: 'snip'` and `body` are treated as\n * snippets. All items support a `language` filter and a `description` for the docs panel.\n */\n completions?: CompletionItem[];\n /**\n * When `true`, `completions` replaces the built-in language keywords/types/functions\n * instead of being merged on top. Defaults to `false`.\n */\n replaceBuiltins?: boolean;\n /** Maximum popup entries. Default: `14`. */\n maxResults?: number;\n provideCompletions?: (context: import('../types/index.js').CompletionContext) => CompletionItem[] | null | undefined;\n}\n\n/** Returns true when `item.language` matches (or is absent). */\nfunction matchesLanguage(item: CompletionItem, language: string): boolean {\n if (!item.language) return true;\n return Array.isArray(item.language)\n ? item.language.includes(language)\n : item.language === language;\n}\n\n/** Get completion suggestions for the current prefix. */\nexport function getSuggestions(\n doc: string[],\n prefix: string,\n opts: AutocompleteOptions = {},\n row = 0,\n col = 0,\n): CompletionItem[] {\n if (prefix.length < 2) return [];\n const lp = prefix.toLowerCase();\n\n const {\n language = 'typescript',\n extraKeywords = [],\n extraTypes = [],\n completions = [],\n replaceBuiltins = false,\n maxResults = 14,\n } = opts;\n\n // Split user completions into snippets (kind='snip' + body) and regular items\n const userSnippets = completions.filter(c => c.kind === 'snip' && !!c.body && matchesLanguage(c, language));\n const userRegular = completions.filter(c => !(c.kind === 'snip' && !!c.body) && matchesLanguage(c, language));\n\n // Snippet items matched by prefix\n const snippetItems = userSnippets.filter(s => s.label.toLowerCase().startsWith(lp));\n\n // Try custom provider first — wrapped in an error boundary so a throwing\n // callback never crashes the editor; it falls through to built-ins instead.\n let base: CompletionItem[];\n if (opts.provideCompletions) {\n const ctx: import('../types/index.js').CompletionContext = {\n line: doc[row] ?? '',\n col,\n prefix,\n language,\n doc,\n };\n let provided: CompletionItem[] | null | undefined;\n try {\n provided = opts.provideCompletions(ctx);\n } catch (err) {\n console.error('[syncline-editor] provideCompletions threw an error:', err);\n provided = null;\n }\n base = provided != null\n ? [...provided, ...userRegular]\n : [...(replaceBuiltins ? [] : buildBaseCompletions(language, extraKeywords, extraTypes)), ...userRegular];\n } else {\n base = replaceBuiltins\n ? userRegular\n : [...buildBaseCompletions(language, extraKeywords, extraTypes), ...userRegular];\n }\n\n const baseSet = new Set(base.map(b => b.label));\n\n // Filter base items that match the prefix\n const baseMatches = base.filter(\n item => item.label.toLowerCase().startsWith(lp) && item.label !== prefix,\n );\n\n // In-file words not already in base or snippets\n const snippetSet = new Set(snippetItems.map(s => s.label));\n const docWords = extractDocWords(doc, prefix);\n const docItems: CompletionItem[] = [...docWords]\n .filter(w => w.toLowerCase().startsWith(lp) && !baseSet.has(w) && !snippetSet.has(w))\n .slice(0, 8)\n .map(w => ({ label: w, kind: 'var' as const, detail: 'in file' }));\n\n // Snippet items first, then keyword/type/fn completions, then in-file words\n return [\n ...snippetItems,\n ...baseMatches.filter(b => !snippetSet.has(b.label)),\n ...docItems,\n ].slice(0, maxResults);\n}\n\n/**\n * Find the identifier prefix before the cursor position.\n * Includes hyphens when `allowHyphen` is `true` (for CSS property names).\n */\nexport function getPrefixAt(\n line: string,\n col: number,\n allowHyphen = false,\n): { prefix: string; start: number } {\n let start = col;\n while (start > 0 && (allowHyphen ? /[\\w$.\\-]/ : /[\\w$.]/).test(line[start - 1])) start--;\n return { prefix: line.slice(start, col), start };\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · features/hover.ts\n// Hover documentation — built-in doc lookup + identifier extraction.\n// ─────────────────────────────────────────────────────────────\n\nimport type { HoverDoc, HoverContext } from '../types/index.js';\n\nexport type { HoverDoc, HoverContext };\n\n// ─────────────────────────────────────────────────────────────\n// Identifier extraction\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Extracts the full (possibly dotted) identifier under the cursor.\n * Hovering over `log` in `console.log(x)` returns `\"console.log\"`.\n * Hovering over `console` returns `\"console\"`.\n */\nexport function getHoverIdentifier(line: string, col: number): string {\n const isIdChar = (ch: string) => /[\\w$]/.test(ch);\n\n // Find right boundary\n let end = col;\n while (end < line.length && isIdChar(line[end]!)) end++;\n\n // Find left boundary of the rightmost word segment\n let start = col;\n while (start > 0 && isIdChar(line[start - 1]!)) start--;\n\n if (start === end) return '';\n\n // Check for a dot-prefix — include one level of object (e.g. \"console.log\")\n if (start > 0 && line[start - 1] === '.') {\n let objEnd = start - 1; // position of '.'\n let objStart = objEnd;\n while (objStart > 0 && isIdChar(line[objStart - 1]!)) objStart--;\n if (objStart < objEnd) {\n return line.slice(objStart, end);\n }\n }\n\n return line.slice(start, end);\n}\n\n// ─────────────────────────────────────────────────────────────\n// Built-in documentation database\n// ─────────────────────────────────────────────────────────────\n\nconst DOCS: Record<string, HoverDoc> = {\n // ── console ───────────────────────────────────────────────\n 'console': {\n title: 'console',\n type: 'Console',\n body: 'Provides access to the browser\\'s debugging console. Useful for logging, timing, profiling, and inspecting values during development.',\n language: ['typescript', 'javascript'],\n },\n 'console.log': {\n title: 'console.log()',\n type: '(...data: any[]) => void',\n body: 'Outputs a message to the web console. Accepts any number of arguments — objects are logged as expandable trees, primitives as their string form.',\n language: ['typescript', 'javascript'],\n },\n 'console.error': {\n title: 'console.error()',\n type: '(...data: any[]) => void',\n body: 'Logs an error message to the console, typically rendered in red with a stack trace. Use for unrecoverable failures.',\n language: ['typescript', 'javascript'],\n },\n 'console.warn': {\n title: 'console.warn()',\n type: '(...data: any[]) => void',\n body: 'Logs a warning message to the console, typically rendered in yellow. Use for non-fatal issues or deprecation notices.',\n language: ['typescript', 'javascript'],\n },\n 'console.info': {\n title: 'console.info()',\n type: '(...data: any[]) => void',\n body: 'Logs an informational message. Behaves identically to console.log in most environments.',\n language: ['typescript', 'javascript'],\n },\n 'console.table': {\n title: 'console.table()',\n type: '(data: any, columns?: string[]) => void',\n body: 'Displays an array or object as a formatted table in the console. Optionally restrict displayed columns.',\n language: ['typescript', 'javascript'],\n },\n 'console.time': {\n title: 'console.time()',\n type: '(label?: string) => void',\n body: 'Starts a timer with the given label. Call console.timeEnd() with the same label to log the elapsed time.',\n language: ['typescript', 'javascript'],\n },\n 'console.timeEnd': {\n title: 'console.timeEnd()',\n type: '(label?: string) => void',\n body: 'Stops the timer started by console.time() and logs the elapsed duration in milliseconds.',\n language: ['typescript', 'javascript'],\n },\n 'console.group': {\n title: 'console.group()',\n type: '(...label: any[]) => void',\n body: 'Creates a new inline group in the console output, indenting subsequent messages until console.groupEnd() is called.',\n language: ['typescript', 'javascript'],\n },\n 'console.groupEnd': {\n title: 'console.groupEnd()',\n type: '() => void',\n body: 'Closes the current inline group in the console, exiting the indented group created by console.group().',\n language: ['typescript', 'javascript'],\n },\n\n // ── Math ──────────────────────────────────────────────────\n 'Math': {\n title: 'Math',\n type: 'namespace Math',\n body: 'A built-in object with properties and methods for mathematical constants and functions. Not a constructor — all properties and methods are static.',\n language: ['typescript', 'javascript'],\n },\n 'Math.max': {\n title: 'Math.max()',\n type: '(...values: number[]) => number',\n body: 'Returns the largest of the given numbers. Returns -Infinity if no arguments, or NaN if any argument is not a number.',\n language: ['typescript', 'javascript'],\n },\n 'Math.min': {\n title: 'Math.min()',\n type: '(...values: number[]) => number',\n body: 'Returns the smallest of the given numbers. Returns Infinity if no arguments, or NaN if any argument is not a number.',\n language: ['typescript', 'javascript'],\n },\n 'Math.floor': {\n title: 'Math.floor()',\n type: '(x: number) => number',\n body: 'Returns the largest integer less than or equal to x. Rounds toward negative infinity.',\n language: ['typescript', 'javascript'],\n },\n 'Math.ceil': {\n title: 'Math.ceil()',\n type: '(x: number) => number',\n body: 'Returns the smallest integer greater than or equal to x. Rounds toward positive infinity.',\n language: ['typescript', 'javascript'],\n },\n 'Math.round': {\n title: 'Math.round()',\n type: '(x: number) => number',\n body: 'Returns the value of x rounded to the nearest integer. Values with a fractional part of exactly 0.5 round up.',\n language: ['typescript', 'javascript'],\n },\n 'Math.abs': {\n title: 'Math.abs()',\n type: '(x: number) => number',\n body: 'Returns the absolute (non-negative) value of x.',\n language: ['typescript', 'javascript'],\n },\n 'Math.sqrt': {\n title: 'Math.sqrt()',\n type: '(x: number) => number',\n body: 'Returns the square root of x. Returns NaN if x is negative.',\n language: ['typescript', 'javascript'],\n },\n 'Math.pow': {\n title: 'Math.pow()',\n type: '(base: number, exponent: number) => number',\n body: 'Returns base raised to the power of exponent. Equivalent to the ** operator.',\n language: ['typescript', 'javascript'],\n },\n 'Math.random': {\n title: 'Math.random()',\n type: '() => number',\n body: 'Returns a pseudo-random floating-point number in the range [0, 1). Not cryptographically secure — use crypto.getRandomValues() for security-sensitive code.',\n language: ['typescript', 'javascript'],\n },\n 'Math.PI': {\n title: 'Math.PI',\n type: 'number',\n body: 'The ratio of a circle\\'s circumference to its diameter: approximately 3.14159265358979.',\n language: ['typescript', 'javascript'],\n },\n 'Math.trunc': {\n title: 'Math.trunc()',\n type: '(x: number) => number',\n body: 'Returns the integer part of x by removing any fractional digits. Does not round — simply truncates toward zero.',\n language: ['typescript', 'javascript'],\n },\n 'Math.sign': {\n title: 'Math.sign()',\n type: '(x: number) => number',\n body: 'Returns 1 if x is positive, -1 if x is negative, 0 if x is zero, or NaN if x is not a number.',\n language: ['typescript', 'javascript'],\n },\n 'Math.clamp': {\n title: 'Math.clamp()',\n type: '(value: number, min: number, max: number) => number',\n body: 'Clamps value between min and max. Note: not yet standard — use Math.min(Math.max(value, min), max) for compatibility.',\n language: ['typescript', 'javascript'],\n },\n\n // ── JSON ──────────────────────────────────────────────────\n 'JSON': {\n title: 'JSON',\n type: 'namespace JSON',\n body: 'Provides methods for parsing and serializing JSON (JavaScript Object Notation). All methods are static.',\n language: ['typescript', 'javascript'],\n },\n 'JSON.stringify': {\n title: 'JSON.stringify()',\n type: '(value: any, replacer?: any, space?: string | number) => string',\n body: 'Converts a JavaScript value to a JSON string. Pass a number or string as the third argument to pretty-print with indentation. Throws on circular references.',\n language: ['typescript', 'javascript'],\n },\n 'JSON.parse': {\n title: 'JSON.parse()',\n type: '(text: string, reviver?: (key: string, value: any) => any) => any',\n body: 'Parses a JSON string and returns the corresponding JavaScript value. Throws SyntaxError if the string is not valid JSON.',\n language: ['typescript', 'javascript'],\n },\n\n // ── Array ─────────────────────────────────────────────────\n 'Array': {\n title: 'Array',\n type: 'interface Array<T>',\n body: 'Represents an ordered list of values. Provides methods for traversal, mutation, searching, and transformation.',\n language: ['typescript', 'javascript'],\n },\n 'Array.from': {\n title: 'Array.from()',\n type: '<T>(arrayLike: Iterable<T> | ArrayLike<T>, mapFn?: (v: T, i: number) => T) => T[]',\n body: 'Creates a new Array from an array-like or iterable object (e.g. NodeList, Set, Map, string). Optionally applies a mapping function.',\n language: ['typescript', 'javascript'],\n },\n 'Array.isArray': {\n title: 'Array.isArray()',\n type: '(value: unknown) => value is any[]',\n body: 'Returns true if the given value is an Array. More reliable than instanceof Array across iframe boundaries.',\n language: ['typescript', 'javascript'],\n },\n\n // ── Object ────────────────────────────────────────────────\n 'Object': {\n title: 'Object',\n type: 'interface Object',\n body: 'The base class of all JavaScript objects. Provides static methods for working with object properties, prototypes, and descriptors.',\n language: ['typescript', 'javascript'],\n },\n 'Object.keys': {\n title: 'Object.keys()',\n type: '(obj: object) => string[]',\n body: 'Returns an array of an object\\'s own enumerable string-keyed property names, in insertion order.',\n language: ['typescript', 'javascript'],\n },\n 'Object.values': {\n title: 'Object.values()',\n type: '(obj: object) => any[]',\n body: 'Returns an array of an object\\'s own enumerable string-keyed property values, in insertion order.',\n language: ['typescript', 'javascript'],\n },\n 'Object.entries': {\n title: 'Object.entries()',\n type: '(obj: object) => [string, any][]',\n body: 'Returns an array of [key, value] pairs for all own enumerable string-keyed properties of an object.',\n language: ['typescript', 'javascript'],\n },\n 'Object.assign': {\n title: 'Object.assign()',\n type: '<T, U>(target: T, source: U) => T & U',\n body: 'Copies own enumerable properties from one or more source objects into a target object. Returns the modified target. Does a shallow copy.',\n language: ['typescript', 'javascript'],\n },\n 'Object.freeze': {\n title: 'Object.freeze()',\n type: '<T>(obj: T) => Readonly<T>',\n body: 'Freezes an object — prevents adding, removing, or changing its properties. Returns the same object. Shallow — nested objects are not frozen.',\n language: ['typescript', 'javascript'],\n },\n 'Object.create': {\n title: 'Object.create()',\n type: '(proto: object | null, propertiesObject?: PropertyDescriptorMap) => any',\n body: 'Creates a new object with the specified prototype object and optional property descriptors.',\n language: ['typescript', 'javascript'],\n },\n 'Object.fromEntries': {\n title: 'Object.fromEntries()',\n type: '<T>(entries: Iterable<[string, T]>) => Record<string, T>',\n body: 'Creates an object from an array of [key, value] pairs or any iterable of key-value entries. The inverse of Object.entries().',\n language: ['typescript', 'javascript'],\n },\n\n // ── Promise ───────────────────────────────────────────────\n 'Promise': {\n title: 'Promise',\n type: 'interface Promise<T>',\n body: 'Represents an asynchronous operation that will eventually complete (or fail) and produce a value. Use .then(), .catch(), and .finally() to handle outcomes.',\n language: ['typescript', 'javascript'],\n },\n 'Promise.all': {\n title: 'Promise.all()',\n type: '<T>(promises: Iterable<Promise<T>>) => Promise<T[]>',\n body: 'Waits for all promises to resolve and returns an array of results. If any promise rejects, the entire result rejects immediately (fail-fast).',\n language: ['typescript', 'javascript'],\n },\n 'Promise.allSettled': {\n title: 'Promise.allSettled()',\n type: '<T>(promises: Iterable<Promise<T>>) => Promise<PromiseSettledResult<T>[]>',\n body: 'Waits for all promises to settle (resolve or reject) and returns an array of result objects, each with a status of \"fulfilled\" or \"rejected\". Never rejects.',\n language: ['typescript', 'javascript'],\n },\n 'Promise.race': {\n title: 'Promise.race()',\n type: '<T>(promises: Iterable<Promise<T>>) => Promise<T>',\n body: 'Returns a promise that resolves or rejects as soon as one of the given promises resolves or rejects, with that value or reason.',\n language: ['typescript', 'javascript'],\n },\n 'Promise.resolve': {\n title: 'Promise.resolve()',\n type: '<T>(value: T | PromiseLike<T>) => Promise<T>',\n body: 'Returns a Promise object that is resolved with the given value. If the value is a thenable, the returned promise follows it.',\n language: ['typescript', 'javascript'],\n },\n 'Promise.reject': {\n title: 'Promise.reject()',\n type: '(reason?: any) => Promise<never>',\n body: 'Returns a Promise that is rejected with the given reason. Useful for creating pre-rejected promises in control flow.',\n language: ['typescript', 'javascript'],\n },\n\n // ── Timers ────────────────────────────────────────────────\n 'setTimeout': {\n title: 'setTimeout()',\n type: '(callback: () => void, delay?: number, ...args: any[]) => number',\n body: 'Executes a function after a specified delay in milliseconds. Returns a timer ID that can be passed to clearTimeout() to cancel.',\n language: ['typescript', 'javascript'],\n },\n 'clearTimeout': {\n title: 'clearTimeout()',\n type: '(id: number) => void',\n body: 'Cancels a timeout previously established by setTimeout(), preventing its callback from running.',\n language: ['typescript', 'javascript'],\n },\n 'setInterval': {\n title: 'setInterval()',\n type: '(callback: () => void, delay?: number, ...args: any[]) => number',\n body: 'Repeatedly executes a function with a fixed time delay between each call. Returns a timer ID for cancellation via clearInterval().',\n language: ['typescript', 'javascript'],\n },\n 'clearInterval': {\n title: 'clearInterval()',\n type: '(id: number) => void',\n body: 'Cancels a repeating timer established by setInterval().',\n language: ['typescript', 'javascript'],\n },\n 'requestAnimationFrame': {\n title: 'requestAnimationFrame()',\n type: '(callback: (timestamp: DOMHighResTimeStamp) => void) => number',\n body: 'Schedules a callback to run before the next browser repaint. Ideal for animations — the browser can batch and throttle calls to 60fps or the display refresh rate.',\n language: ['typescript', 'javascript'],\n },\n 'cancelAnimationFrame': {\n title: 'cancelAnimationFrame()',\n type: '(id: number) => void',\n body: 'Cancels an animation frame request previously scheduled with requestAnimationFrame().',\n language: ['typescript', 'javascript'],\n },\n 'queueMicrotask': {\n title: 'queueMicrotask()',\n type: '(callback: () => void) => void',\n body: 'Queues a microtask to be executed before the next task in the event loop. Runs after the current JavaScript execution but before any setTimeout callbacks.',\n language: ['typescript', 'javascript'],\n },\n\n // ── Network ───────────────────────────────────────────────\n 'fetch': {\n title: 'fetch()',\n type: '(input: RequestInfo | URL, init?: RequestInit) => Promise<Response>',\n body: 'Fetches a resource from the network. Returns a Promise that resolves to a Response. Use .json(), .text(), or .blob() on the response to read the body.',\n language: ['typescript', 'javascript'],\n },\n\n // ── Global utils ──────────────────────────────────────────\n 'parseInt': {\n title: 'parseInt()',\n type: '(string: string, radix?: number) => number',\n body: 'Parses a string and returns an integer in the specified radix (base). Always provide the radix (typically 10) to avoid unexpected behavior with leading zeros.',\n language: ['typescript', 'javascript'],\n },\n 'parseFloat': {\n title: 'parseFloat()',\n type: '(string: string) => number',\n body: 'Parses a string and returns a floating-point number. Returns NaN if the string cannot be converted.',\n language: ['typescript', 'javascript'],\n },\n 'isNaN': {\n title: 'isNaN()',\n type: '(value: number) => boolean',\n body: 'Returns true if the value is NaN (Not a Number). Note: coerces the argument to number first — use Number.isNaN() for strict checking without coercion.',\n language: ['typescript', 'javascript'],\n },\n 'isFinite': {\n title: 'isFinite()',\n type: '(value: number) => boolean',\n body: 'Returns true if the value is a finite number. Returns false for ±Infinity and NaN. Coerces the argument to number first.',\n language: ['typescript', 'javascript'],\n },\n 'encodeURIComponent': {\n title: 'encodeURIComponent()',\n type: '(uriComponent: string | number | boolean) => string',\n body: 'Encodes a URI component by replacing special characters with their UTF-8 escape sequences. Use for encoding query string values before appending to a URL.',\n language: ['typescript', 'javascript'],\n },\n 'decodeURIComponent': {\n title: 'decodeURIComponent()',\n type: '(encodedURIComponent: string) => string',\n body: 'Decodes a URI component that was previously encoded with encodeURIComponent(). Throws URIError on malformed sequences.',\n language: ['typescript', 'javascript'],\n },\n 'structuredClone': {\n title: 'structuredClone()',\n type: '<T>(value: T, options?: StructuredSerializeOptions) => T',\n body: 'Creates a deep clone of the given value using the structured clone algorithm. Handles cycles, Maps, Sets, Dates, and typed arrays. Does not clone functions or class instances.',\n language: ['typescript', 'javascript'],\n },\n\n // ── DOM ───────────────────────────────────────────────────\n 'document.getElementById': {\n title: 'document.getElementById()',\n type: '(elementId: string) => HTMLElement | null',\n body: 'Returns the first element in the document with the specified ID, or null if not found. IDs must be unique per document.',\n language: ['typescript', 'javascript'],\n },\n 'document.querySelector': {\n title: 'document.querySelector()',\n type: '(selectors: string) => Element | null',\n body: 'Returns the first Element matching the given CSS selector string, or null if no match. Use querySelectorAll() for all matches.',\n language: ['typescript', 'javascript'],\n },\n 'document.querySelectorAll': {\n title: 'document.querySelectorAll()',\n type: '(selectors: string) => NodeListOf<Element>',\n body: 'Returns a static NodeList of all Elements matching the given CSS selector string. Does not update as the document changes.',\n language: ['typescript', 'javascript'],\n },\n 'document.createElement': {\n title: 'document.createElement()',\n type: '<K extends keyof HTMLElementTagNameMap>(tagName: K) => HTMLElementTagNameMap[K]',\n body: 'Creates a new HTML element with the specified tag name. The element is not attached to the DOM until you call appendChild() or similar.',\n language: ['typescript', 'javascript'],\n },\n 'addEventListener': {\n title: 'addEventListener()',\n type: '(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions) => void',\n body: 'Registers an event listener on the target element. The listener is called whenever the specified event fires. Remember to call removeEventListener() to clean up.',\n language: ['typescript', 'javascript'],\n },\n 'removeEventListener': {\n title: 'removeEventListener()',\n type: '(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions) => void',\n body: 'Removes an event listener previously added with addEventListener(). The listener reference must be the same function object.',\n language: ['typescript', 'javascript'],\n },\n\n // ── TypeScript keywords ────────────────────────────────────\n 'const': {\n title: 'const',\n type: 'keyword',\n body: 'Declares a block-scoped variable that cannot be reassigned. The binding is immutable — but for objects and arrays, their contents can still be mutated.',\n language: ['typescript', 'javascript'],\n },\n 'let': {\n title: 'let',\n type: 'keyword',\n body: 'Declares a block-scoped variable that can be reassigned. Prefer const for bindings that never change.',\n language: ['typescript', 'javascript'],\n },\n 'var': {\n title: 'var',\n type: 'keyword',\n body: 'Declares a function-scoped (or globally-scoped) variable. Hoisted to the top of its scope. Prefer const or let in modern code.',\n language: ['typescript', 'javascript'],\n },\n 'function': {\n title: 'function',\n type: 'keyword',\n body: 'Defines a named function declaration, or introduces a function expression. Function declarations are hoisted; expressions are not.',\n language: ['typescript', 'javascript'],\n },\n 'class': {\n title: 'class',\n type: 'keyword',\n body: 'Declares a class — a blueprint for creating objects with shared methods and properties. Classes support extends, implements, constructors, getters, setters, and static members.',\n language: ['typescript', 'javascript'],\n },\n 'async': {\n title: 'async',\n type: 'keyword',\n body: 'Marks a function as asynchronous, making it return a Promise implicitly. Enables the use of the await keyword inside the function body.',\n language: ['typescript', 'javascript'],\n },\n 'await': {\n title: 'await',\n type: 'keyword',\n body: 'Pauses execution of an async function until the Promise settles, then returns the resolved value. Must be used inside an async function.',\n language: ['typescript', 'javascript'],\n },\n 'return': {\n title: 'return',\n type: 'keyword',\n body: 'Exits the current function and optionally returns a value to the caller. In an async function, the value is wrapped in a resolved Promise.',\n language: ['typescript', 'javascript'],\n },\n 'interface': {\n title: 'interface',\n type: 'keyword',\n body: 'Defines a TypeScript interface — a named contract describing the shape of an object. Interfaces can be extended, merged (declaration merging), and implemented by classes.',\n language: ['typescript'],\n },\n 'type': {\n title: 'type',\n type: 'keyword',\n body: 'Declares a TypeScript type alias — a name for any type expression including unions, intersections, tuples, mapped types, and conditional types.',\n language: ['typescript'],\n },\n 'extends': {\n title: 'extends',\n type: 'keyword',\n body: 'Establishes inheritance (class extends Base) or constrains a generic type parameter (T extends object). Also used in conditional types (T extends U ? X : Y).',\n language: ['typescript', 'javascript'],\n },\n 'implements': {\n title: 'implements',\n type: 'keyword',\n body: 'Declares that a class satisfies the shape of one or more interfaces. TypeScript verifies at compile time that all required members are present.',\n language: ['typescript'],\n },\n 'export': {\n title: 'export',\n type: 'keyword',\n body: 'Makes a declaration (variable, function, class, type, interface) available for import in other modules. Use export default for a single primary export.',\n language: ['typescript', 'javascript'],\n },\n 'import': {\n title: 'import',\n type: 'keyword',\n body: 'Imports bindings from another module. Supports named imports ({ foo, bar }), default imports (Foo), namespace imports (* as Foo), and side-effect imports.',\n language: ['typescript', 'javascript'],\n },\n 'typeof': {\n title: 'typeof',\n type: 'keyword',\n body: 'Returns a string describing the type of its operand at runtime (\"string\", \"number\", \"boolean\", \"object\", \"function\", \"undefined\", \"symbol\", \"bigint\"). In TypeScript, also used as a type operator to capture the type of a value.',\n language: ['typescript', 'javascript'],\n },\n 'instanceof': {\n title: 'instanceof',\n type: 'keyword',\n body: 'Tests whether an object has a given constructor in its prototype chain. Returns true if the object is an instance of the constructor.',\n language: ['typescript', 'javascript'],\n },\n 'new': {\n title: 'new',\n type: 'keyword',\n body: 'Creates a new instance of a class or constructor function. Allocates memory, sets the prototype, calls the constructor with `this` bound to the new object, and returns it.',\n language: ['typescript', 'javascript'],\n },\n 'throw': {\n title: 'throw',\n type: 'keyword',\n body: 'Throws a user-defined exception, stopping execution of the current function and propagating up the call stack until caught by a try...catch block.',\n language: ['typescript', 'javascript'],\n },\n 'try': {\n title: 'try...catch...finally',\n type: 'keyword',\n body: 'Wraps code that might throw an exception. The catch block handles errors; the finally block always runs whether or not an error occurred.',\n language: ['typescript', 'javascript'],\n },\n\n // ── TypeScript built-in types ──────────────────────────────\n 'string': {\n title: 'string',\n type: 'primitive type',\n body: 'Represents a sequence of UTF-16 code units. In TypeScript, the string type accepts any text value. Literal types like \"hello\" narrow to specific string values.',\n language: ['typescript'],\n },\n 'number': {\n title: 'number',\n type: 'primitive type',\n body: 'Represents a double-precision 64-bit IEEE 754 floating-point value. Includes integers, decimals, NaN, and Infinity. TypeScript does not have a separate int type.',\n language: ['typescript'],\n },\n 'boolean': {\n title: 'boolean',\n type: 'primitive type',\n body: 'Represents a logical true or false value. Literal types true and false narrow to specific boolean values.',\n language: ['typescript'],\n },\n 'any': {\n title: 'any',\n type: 'TypeScript type',\n body: 'Disables type checking for a value — allows any operation without compile errors. Avoid using any; prefer unknown when the type is genuinely uncertain.',\n language: ['typescript'],\n },\n 'unknown': {\n title: 'unknown',\n type: 'TypeScript type',\n body: 'The type-safe alternative to any. You cannot perform operations on an unknown value without first narrowing its type with typeof, instanceof, or a type guard.',\n language: ['typescript'],\n },\n 'void': {\n title: 'void',\n type: 'TypeScript type',\n body: 'Represents the absence of a value, typically used as the return type of functions that do not return anything meaningful.',\n language: ['typescript'],\n },\n 'never': {\n title: 'never',\n type: 'TypeScript type',\n body: 'A type with no values — used for functions that never return (throw or infinite loop) and for exhaustive checks in union type switches.',\n language: ['typescript'],\n },\n 'Record': {\n title: 'Record<K, V>',\n type: 'type Record<K extends keyof any, T> = { [P in K]: T }',\n body: 'A utility type that constructs an object type whose keys are of type K and values are of type V. Useful for dictionaries and lookup tables.',\n language: ['typescript'],\n },\n 'Partial': {\n title: 'Partial<T>',\n type: 'type Partial<T> = { [P in keyof T]?: T[P] }',\n body: 'A utility type that makes all properties of T optional. Useful for update payloads, patches, and configuration objects with defaults.',\n language: ['typescript'],\n },\n 'Required': {\n title: 'Required<T>',\n type: 'type Required<T> = { [P in keyof T]-?: T[P] }',\n body: 'A utility type that makes all properties of T required (removes optionality). The inverse of Partial<T>.',\n language: ['typescript'],\n },\n 'Readonly': {\n title: 'Readonly<T>',\n type: 'type Readonly<T> = { readonly [P in keyof T]: T[P] }',\n body: 'A utility type that makes all properties of T readonly. Prevents property reassignment at the type level.',\n language: ['typescript'],\n },\n 'ReturnType': {\n title: 'ReturnType<T>',\n type: 'type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any',\n body: 'A utility type that extracts the return type of a function type T.',\n language: ['typescript'],\n },\n 'Omit': {\n title: 'Omit<T, K>',\n type: 'type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>',\n body: 'A utility type that constructs a type by picking all properties from T then removing those in K.',\n language: ['typescript'],\n },\n 'Pick': {\n title: 'Pick<T, K>',\n type: 'type Pick<T, K extends keyof T> = { [P in K]: T[P] }',\n body: 'A utility type that constructs a type by picking the set of properties K from T.',\n language: ['typescript'],\n },\n 'NonNullable': {\n title: 'NonNullable<T>',\n type: 'type NonNullable<T> = T extends null | undefined ? never : T',\n body: 'A utility type that removes null and undefined from the type T.',\n language: ['typescript'],\n },\n 'keyof': {\n title: 'keyof',\n type: 'TypeScript type operator',\n body: 'Produces a union type of all property keys of an object type. keyof { a: string; b: number } is \"a\" | \"b\".',\n language: ['typescript'],\n },\n};\n\n// ─────────────────────────────────────────────────────────────\n// Lookup\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Looks up built-in hover documentation for a given identifier.\n * Returns null if no built-in docs are found.\n */\nexport function lookupHover(identifier: string, language: string): HoverDoc | null {\n const doc = DOCS[identifier];\n if (!doc) return null;\n\n // Filter by language if the doc has a language restriction\n if (doc.language) {\n const langs = Array.isArray(doc.language) ? doc.language : [doc.language];\n if (!langs.includes(language)) return null;\n }\n\n return doc;\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · renderer/row-renderer.ts\n// Converts a single visual row into an HTML string.\n// Uses run-length encoding so highlights span whole words,\n// not individual characters.\n// ─────────────────────────────────────────────────────────────\n\nimport type {\n VisualRow, FindMatch, ExtraCursor, Selection,\n} from '../types/index.js';\nimport { escapeHtml } from '../utils/dom.js';\nimport { tokeniseLine, buildCharClasses, TokenCache } from '../core/tokeniser.js';\nimport { selectionOnLine } from '../core/document.js';\nimport { docToVisualPos } from '../core/wrap-map.js';\nimport type { WrapMap } from '../core/wrap-map.js';\nimport type { BracketMatch } from '../features/bracket-matcher.js';\nimport type { TokeniserOptions } from '../core/tokeniser.js';\n\nexport interface RowRendererOptions {\n tokeniserOpts: TokeniserOptions;\n showIndentGuides: boolean;\n highlightActiveLine: boolean;\n charWidth: number;\n codePaddingLeft: number;\n tabSize: number;\n lineHeight: number;\n renderWhitespace: 'none' | 'boundary' | 'all';\n}\n\nexport interface RowRenderContext {\n vr: VisualRow;\n visIdx: number;\n curVisRow: number;\n curColInSeg: number;\n docSel: Selection | null;\n findMatches: FindMatch[];\n findIdx: number;\n wordHighlights: FindMatch[];\n bracketMatch: BracketMatch | null;\n extraCursors: ExtraCursor[];\n /** Column-in-segment positions of upcoming snippet tab-stop ghost markers on this visual row. */\n snippetStopCols: number[];\n foldedLines: Map<number, number>;\n isFoldable: boolean;\n wm: WrapMap;\n tokenCache: TokenCache;\n opts: RowRendererOptions;\n}\n\n// ── Public entry point ────────────────────────────────────────\n\nexport function renderVisualRow(ctx: RowRenderContext): string {\n const { vr, visIdx, curVisRow, wm, foldedLines, isFoldable: foldable, opts } = ctx;\n const { docLine, segIdx, text } = vr;\n\n const isCurVisRow = visIdx === curVisRow;\n const isCurDocLine = docLine === wm.visualRows[curVisRow]?.docLine;\n const isCont = segIdx > 0;\n\n const segOffset = wm.segments[docLine]?.slice(0, segIdx).reduce((a, s) => a + s.length, 0) ?? 0;\n\n // Selection on this segment\n const rawSel = ctx.docSel ? selectionOnLine(ctx.docSel, docLine, (wm.segments[docLine] ?? [''])[segIdx]?.length ?? 0) : null;\n let segSel: { start: number; end: number } | null = null;\n if (rawSel) {\n const lineLen = (wm.segments[docLine] ?? [''])[segIdx]?.length ?? 0;\n const ds = selectionOnLine(ctx.docSel, docLine, lineLen + segOffset);\n if (ds) {\n const s = ds.start - segOffset;\n const e = ds.end - segOffset;\n if (e > 0 && s < text.length) {\n segSel = { start: Math.max(0, s), end: Math.min(text.length, e) };\n }\n }\n }\n\n // Find highlights for this segment\n const segFind = ctx.findMatches\n .filter(m => m.row === docLine)\n .map(m => {\n const ms = m.col - segOffset;\n const me = m.col + m.len - segOffset;\n if (me <= 0 || ms >= text.length) return null;\n const isCur = ctx.findIdx >= 0 &&\n ctx.findMatches[ctx.findIdx]?.row === m.row &&\n ctx.findMatches[ctx.findIdx]?.col === m.col;\n return { start: Math.max(0, ms), end: Math.min(text.length, me), isCur };\n })\n .filter(Boolean) as Array<{ start: number; end: number; isCur: boolean }>;\n\n // Word highlights for this segment\n const segWord = ctx.wordHighlights\n .filter(m => m.row === docLine)\n .map(m => {\n const s = m.col - segOffset;\n const e = m.col + m.len - segOffset;\n if (e <= 0 || s >= text.length) return null;\n return { start: Math.max(0, s), end: Math.min(text.length, e) };\n })\n .filter(Boolean) as Array<{ start: number; end: number }>;\n\n // Bracket match for this segment\n const segBm: Array<{ start: number; end: number }> = [];\n if (ctx.bracketMatch) {\n for (const pos of [ctx.bracketMatch.open, ctx.bracketMatch.close]) {\n if (pos.row === docLine) {\n const s = pos.col - segOffset;\n if (s >= 0 && s < text.length) segBm.push({ start: s, end: s + 1 });\n }\n }\n }\n\n // Extra cursor beams and selections for this visual row\n const extraCurCols: number[] = [];\n const extraSelRanges: Array<{ start: number; end: number }> = [];\n for (const ec of ctx.extraCursors) {\n const evp = docToVisualPos(wm, ec.row, ec.col);\n if (evp.visRow === visIdx) extraCurCols.push(evp.colInSeg);\n if (ec.sel) {\n const ns = normaliseSelection(ec.sel);\n if (docLine >= ns.ar && docLine <= ns.fr) {\n const start = docLine === ns.ar ? ns.ac - segOffset : -segOffset;\n const end = docLine === ns.fr ? ns.fc - segOffset : text.length + 999;\n if (end > 0 && start < text.length) {\n extraSelRanges.push({ start: Math.max(0, start), end: Math.min(text.length, end) });\n }\n }\n }\n }\n\n // Apply whitespace rendering\n const displayText = applyRenderWhitespace(text, opts.renderWhitespace);\n\n // Choose fast path (no overlays) vs. rich path\n const needRich = isCurVisRow || segSel || segFind.length || extraCurCols.length ||\n segWord.length || segBm.length || extraSelRanges.length || ctx.snippetStopCols.length > 0;\n\n let codeHtml: string;\n if (!needRich) {\n // Fast path: use cached token HTML (key includes renderWhitespace so changes invalidate)\n const cacheKey = `${docLine}:${segIdx}:${opts.renderWhitespace}`;\n let cached = ctx.tokenCache.get(cacheKey, displayText);\n if (!cached) {\n cached = tokeniseLine(displayText, opts.tokeniserOpts);\n ctx.tokenCache.set(cacheKey, displayText, cached);\n }\n codeHtml = renderTokensOnly(displayText, cached) || '&#8203;';\n } else {\n codeHtml = renderSegRich(\n displayText,\n isCurVisRow ? ctx.curColInSeg : -1,\n segSel,\n segFind,\n extraCurCols,\n ctx.snippetStopCols,\n segWord,\n segBm,\n extraSelRanges,\n opts.tokeniserOpts,\n );\n }\n\n // Indent guides (first segment only)\n let guidesHtml = '';\n if (segIdx === 0 && opts.showIndentGuides) {\n const indent = (text.match(/^(\\s*)/) ?? ['', ''])[1].length;\n const level = Math.floor(indent / opts.tabSize);\n for (let g = 1; g < level; g++) {\n const x = opts.codePaddingLeft + g * opts.tabSize * opts.charWidth;\n guidesHtml += `<span class=\"sl-ig\" style=\"left:${x}px\"></span>`;\n }\n }\n\n // Fold button (first segment only)\n let foldHtml = '';\n if (segIdx === 0 && foldable) {\n const folded = foldedLines.has(docLine);\n foldHtml = `<span class=\"sl-fold-btn\" data-row=\"${docLine}\">${folded ? '▸' : '▾'}</span>`;\n }\n\n const isFolded = foldedLines.has(docLine) && segIdx === 0;\n const lineNum = segIdx === 0 ? String(docLine + 1) : '';\n const rowCls = [\n 'sl-er',\n opts.highlightActiveLine && isCurDocLine ? 'sl-cur-row' : '',\n isCont ? 'sl-wrap-cont' : '',\n isFolded ? 'sl-folded' : '',\n ].filter(Boolean).join(' ');\n\n return (\n `<div class=\"${rowCls}\" style=\"height:${opts.lineHeight}px\" data-v=\"${visIdx}\" data-doc=\"${docLine}\">` +\n `<div class=\"sl-eg\" style=\"position:relative\">${foldHtml}<span class=\"sl-egn\">${lineNum}</span></div>` +\n `<div class=\"sl-el\"><span class=\"sl-cl\">${guidesHtml}${codeHtml}</span></div>` +\n `</div>`\n );\n}\n\n// ── Whitespace rendering ─────────────────────────────────────\n\n/** Replace spaces/tabs with visible glyphs for renderWhitespace modes. */\nfunction applyRenderWhitespace(text: string, mode: 'none' | 'boundary' | 'all'): string {\n if (mode === 'none') return text;\n if (mode === 'all') {\n return text.replace(/ /g, '\\u00b7').replace(/\\t/g, '\\u2192');\n }\n // 'boundary': leading and trailing whitespace only\n const leadingSpaces = (text.match(/^ +/) ?? [''])[0].length;\n const trailingSpaces = (text.match(/ +$/) ?? [''])[0].length;\n let result = text;\n if (leadingSpaces) result = '\\u00b7'.repeat(leadingSpaces) + result.slice(leadingSpaces);\n if (trailingSpaces) result = result.slice(0, result.length - trailingSpaces) + '\\u00b7'.repeat(trailingSpaces);\n return result.replace(/\\t/g, '\\u2192');\n}\n\n// ── Internal helpers ──────────────────────────────────────────\n\nfunction normaliseSelection(sel: Selection): Selection {\n if (sel.ar < sel.fr || (sel.ar === sel.fr && sel.ac <= sel.fc)) return sel;\n return { ar: sel.fr, ac: sel.fc, fr: sel.ar, fc: sel.ac };\n}\n\n/** Fast path: emit token-coloured spans with no overlay logic. */\nfunction renderTokensOnly(text: string, segs: ReturnType<typeof tokeniseLine>): string {\n if (!text) return '';\n const charCls = buildCharClasses(text, segs);\n let html = '';\n let runStart = 0;\n let runCls = charCls[0];\n\n const flush = (end: number) => {\n if (end <= runStart) return;\n const chunk = escapeHtml(text.slice(runStart, end));\n html += runCls ? `<span class=\"${runCls}\">${chunk}</span>` : chunk;\n };\n\n for (let c = 1; c <= text.length; c++) {\n const cls = c < text.length ? charCls[c] : null;\n if (cls !== runCls) {\n flush(c);\n runStart = c;\n runCls = cls ?? '';\n }\n }\n return html;\n}\n\n/** Rich path: overlays (selection, find, word-hl, bm) + cursors. */\nfunction renderSegRich(\n text: string,\n curCol: number,\n segSel: { start: number; end: number } | null,\n findHls: Array<{ start: number; end: number; isCur: boolean }>,\n extraCurCols: number[],\n snippetStopCols: number[],\n wordHls: Array<{ start: number; end: number }>,\n bmHls: Array<{ start: number; end: number }>,\n extraSelRanges: Array<{ start: number; end: number }>,\n tokenOpts: TokeniserOptions,\n): string {\n if (text.length === 0) {\n let h = curCol >= 0 ? '<span class=\"sl-cur\"></span>' : '';\n for (const _ of extraCurCols) h += '<span class=\"sl-cur-extra\"></span>';\n for (const _ of snippetStopCols) h += '<span class=\"sl-snip-stop\"></span>';\n return h || '&#8203;';\n }\n\n const segs = tokeniseLine(text, tokenOpts);\n const charCls = buildCharClasses(text, segs);\n\n let html = '';\n let runStart = 0;\n let runOverlay = '';\n let runTok = '';\n\n const flush = (end: number) => {\n if (end <= runStart) return;\n const chunk = escapeHtml(text.slice(runStart, end));\n const cls = [runOverlay, runTok].filter(Boolean).join(' ');\n html += cls ? `<span class=\"${cls}\">${chunk}</span>` : chunk;\n };\n\n for (let c = 0; c <= text.length; c++) {\n // Cursor beams (zero-width)\n if (curCol === c) { flush(c); runStart = c; html += '<span class=\"sl-cur\"></span>'; }\n for (const ec of extraCurCols) {\n if (ec === c) { flush(c); runStart = c; html += '<span class=\"sl-cur-extra\"></span>'; }\n }\n for (const sc of snippetStopCols) {\n if (sc === c) { flush(c); runStart = c; html += '<span class=\"sl-snip-stop\"></span>'; }\n }\n if (c === text.length) { flush(c); break; }\n\n const tok = charCls[c];\n const fhl = findHls.find(f => c >= f.start && c < f.end);\n const inSel = (segSel && c >= segSel.start && c < segSel.end) ||\n extraSelRanges.some(r => c >= r.start && c < r.end);\n const inWord = !inSel && !fhl && wordHls.some(w => c >= w.start && c < w.end);\n const inBm = !inSel && !fhl && bmHls.some(b => c >= b.start && c < b.end);\n\n let overlay = '';\n if (inSel) overlay = 'sl-sh';\n else if (fhl) overlay = 'sl-fh' + (fhl.isCur ? ' sl-fh-cur' : '');\n else if (inBm) overlay = 'sl-bm';\n else if (inWord) overlay = 'sl-wh';\n\n if (overlay !== runOverlay || tok !== runTok) {\n flush(c);\n runStart = c;\n runOverlay = overlay;\n runTok = tok;\n }\n }\n return html || '&#8203;';\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · renderer/minimap-renderer.ts\n// Minimap canvas rendering — VSCode-accurate scroll formula.\n// ─────────────────────────────────────────────────────────────\n\nimport type { FindMatch, Selection } from '../types/index.js';\nimport type { MinimapColors } from '../types/index.js';\nimport { tokeniseLine } from '../core/tokeniser.js';\nimport { MM_LINE_HEIGHT, MM_CHAR_WIDTH, MM_PADDING } from '../core/constants.js';\nimport { hexToRgba } from '../utils/dom.js';\n\nexport interface MinimapScrollState {\n mmScroll: number;\n sliderTop: number;\n sliderHeight: number;\n}\n\n/** Compute minimap scroll/slider state from editor scroll. */\nexport function computeMinimapState(\n totalLines: number,\n editorScrollTop: number,\n editorHeight: number,\n minimapHeight: number,\n lineHeight: number,\n): MinimapScrollState {\n const eExtra = Math.max(0, totalLines * lineHeight - editorHeight);\n const mExtra = Math.max(0, totalLines * MM_LINE_HEIGHT - minimapHeight);\n const eFrac = eExtra > 0 ? editorScrollTop / eExtra : 0;\n const mmScroll = eFrac * mExtra;\n const sliderHeight = Math.max(20, (editorHeight / lineHeight) * MM_LINE_HEIGHT);\n const sliderTop = (editorScrollTop / lineHeight) * MM_LINE_HEIGHT - mmScroll;\n return { mmScroll, sliderTop, sliderHeight };\n}\n\n/** Convert a minimap slider top (wrapper coords) back to editorScrollTop. */\nexport function sliderTopToEditorScroll(\n sliderTop: number,\n totalLines: number,\n editorHeight: number,\n minimapHeight: number,\n lineHeight: number,\n): number {\n const eExtra = Math.max(0, totalLines * lineHeight - editorHeight);\n const mExtra = Math.max(0, totalLines * MM_LINE_HEIGHT - minimapHeight);\n if (eExtra <= 0) return 0;\n const coeff = MM_LINE_HEIGHT / lineHeight - mExtra / eExtra;\n if (Math.abs(coeff) < 1e-9) {\n const sH = Math.max(20, (editorHeight / lineHeight) * MM_LINE_HEIGHT);\n return Math.max(0, Math.min(eExtra, (sliderTop / Math.max(1, minimapHeight - sH)) * eExtra));\n }\n return Math.max(0, Math.min(eExtra, sliderTop / coeff));\n}\n\n/** Convert a click at wrapY in the minimap to editorScrollTop. */\nexport function minimapClickToEditorScroll(\n wrapY: number,\n totalLines: number,\n editorScrollTop: number,\n editorHeight: number,\n minimapHeight: number,\n lineHeight: number,\n): number {\n const eExtra = Math.max(0, totalLines * lineHeight - editorHeight);\n const mExtra = Math.max(0, totalLines * MM_LINE_HEIGHT - minimapHeight);\n if (eExtra <= 0) return 0;\n const mScroll = (editorScrollTop / eExtra) * mExtra;\n const docLine = (wrapY + mScroll) / MM_LINE_HEIGHT;\n return Math.max(0, Math.min(eExtra, docLine * lineHeight - editorHeight / 2));\n}\n\n/** Build minimap token colours from CSS variable values. */\nexport function buildMinimapColors(getCssVar: (name: string) => string): MinimapColors {\n const tok = (v: string): string => {\n const raw = getCssVar(v);\n if (raw.startsWith('#') && raw.length === 7) return hexToRgba(raw, 0.85);\n return raw;\n };\n return {\n kw : tok('--tok-kw'), fn : tok('--tok-fn'),\n cls: tok('--tok-cls'), typ: tok('--tok-typ'),\n str: tok('--tok-str'), num: tok('--tok-num'),\n cmt: tok('--tok-cmt'), dec: tok('--tok-dec'),\n op : tok('--tok-op'),\n txt: (() => {\n const t2 = getCssVar('--text2');\n if (t2.startsWith('#') && t2.length === 7) return hexToRgba(t2, 0.28);\n return 'rgba(150,148,140,0.28)';\n })(),\n };\n}\n\nexport interface PaintMinimapOptions {\n canvas: HTMLCanvasElement;\n doc: string[];\n firstLine: number;\n lastLine: number;\n subPx: number;\n wrapperWidth: number;\n canvasHeight: number;\n cursorRow: number;\n sel: Selection | null;\n findMatches: FindMatch[];\n findIdx: number;\n sliderTop: number;\n sliderHeight: number;\n colors: MinimapColors;\n getCssVar: (name: string) => string;\n dpr: number;\n}\n\n/** Paint the minimap canvas for the given options. */\nexport function paintMinimap(opts: PaintMinimapOptions): void {\n const {\n canvas, doc, firstLine, lastLine, subPx,\n wrapperWidth: wW, canvasHeight, cursorRow, sel,\n findMatches, findIdx, sliderTop, sliderHeight,\n colors, getCssVar, dpr,\n } = opts;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n\n const mmBg = getCssVar('--mm-bg') || '#0d0d0f';\n const mmDim = getCssVar('--mm-dim') || 'rgba(0,0,0,.30)';\n const mmEdge = getCssVar('--mm-edge') || 'rgba(255,255,255,.18)';\n const mmSlider = getCssVar('--mm-slider') || 'rgba(255,255,255,.07)';\n const selBg = getCssVar('--sel-bg') || 'rgba(110,159,255,.22)';\n const curLineBg = getCssVar('--cur-line-bg') || 'rgba(255,255,255,.05)';\n const findBorder = getCssVar('--find-border') || 'rgba(234,180,86,.50)';\n const findCurBg = getCssVar('--find-cur-bg') || 'rgba(234,180,86,.80)';\n\n const lineY = (d: number) => (d - firstLine) * MM_LINE_HEIGHT;\n\n // Background\n ctx.fillStyle = mmBg;\n ctx.fillRect(0, 0, wW, canvasHeight);\n\n // Cursor line\n if (cursorRow >= firstLine && cursorRow < lastLine) {\n ctx.fillStyle = curLineBg;\n ctx.fillRect(0, lineY(cursorRow), wW, MM_LINE_HEIGHT);\n }\n\n // Selection\n if (sel) {\n const r0 = Math.max(firstLine, sel.ar);\n const r1 = Math.min(lastLine - 1, sel.fr);\n if (r1 >= r0) {\n ctx.fillStyle = selBg;\n ctx.fillRect(0, lineY(r0), wW, (r1 - r0 + 1) * MM_LINE_HEIGHT);\n }\n }\n\n // Find highlights\n for (const m of findMatches) {\n if (m.row < firstLine || m.row >= lastLine) continue;\n const active = findIdx >= 0 &&\n findMatches[findIdx]?.row === m.row &&\n findMatches[findIdx]?.col === m.col;\n ctx.fillStyle = active ? findCurBg : findBorder;\n ctx.fillRect(\n MM_PADDING + m.col * MM_CHAR_WIDTH,\n lineY(m.row),\n Math.max(3, m.len * MM_CHAR_WIDTH),\n MM_LINE_HEIGHT,\n );\n }\n\n // Token rendering\n const maxC = Math.floor((wW - MM_PADDING) / MM_CHAR_WIDTH);\n for (let d = firstLine; d < lastLine; d++) {\n const line = doc[d] ?? '';\n if (!line.trim()) continue;\n const y = lineY(d);\n const rh = 1.5;\n const segs = tokeniseLine(line);\n let cov = 0;\n for (const seg of segs) {\n if (seg.start >= maxC) break;\n if (seg.start > cov) {\n ctx.fillStyle = colors.txt;\n ctx.fillRect(MM_PADDING + cov * MM_CHAR_WIDTH, y, (Math.min(seg.start, maxC) - cov) * MM_CHAR_WIDTH, rh);\n }\n const col = (colors as Record<string, string>)[seg.cls] ?? colors.txt;\n const sw = Math.min(seg.end, maxC) - seg.start;\n if (sw > 0) {\n ctx.fillStyle = col;\n ctx.fillRect(MM_PADDING + seg.start * MM_CHAR_WIDTH, y, sw * MM_CHAR_WIDTH, rh);\n }\n cov = Math.max(cov, Math.min(seg.end, maxC));\n }\n const le = Math.min(line.length, maxC);\n if (cov < le) {\n ctx.fillStyle = colors.txt;\n ctx.fillRect(MM_PADDING + cov * MM_CHAR_WIDTH, y, (le - cov) * MM_CHAR_WIDTH, rh);\n }\n }\n\n // Slider\n const cSlTop = sliderTop + subPx;\n const cSlBot = cSlTop + sliderHeight;\n\n ctx.fillStyle = mmDim;\n if (cSlTop > 0) ctx.fillRect(0, 0, wW, cSlTop);\n if (cSlBot < canvasHeight) ctx.fillRect(0, cSlBot, wW, canvasHeight - cSlBot);\n\n ctx.fillStyle = mmSlider;\n ctx.fillRect(0, cSlTop, wW, sliderHeight);\n\n ctx.fillStyle = mmEdge;\n ctx.fillRect(0, Math.max(0, cSlTop), wW, 1);\n ctx.fillRect(0, Math.max(0, cSlBot - 1), wW, 1);\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · SynclineEditor.ts\n// Main editor class — orchestrates all subsystems.\n// ─────────────────────────────────────────────────────────────\n\nimport type {\n EditorConfig, EditorAPI, CursorPosition, Selection,\n ThemeDefinition, FindMatch, ExtraCursor, CompletionItem, HoverDoc,\n} from './types/index.js';\n\nimport {\n DEFAULT_LINE_HEIGHT, VIRTUAL_OVERSCAN, DEFAULT_MAX_UNDO,\n DEFAULT_GUTTER_WIDTH, CODE_PADDING_LEFT, CODE_PADDING_RIGHT, DEFAULT_CHAR_WIDTH,\n DEFAULT_FONT_SIZE, DEFAULT_TAB_SIZE, DEFAULT_WRAP_COLUMN,\n DEFAULT_MINIMAP_WIDTH, UNDO_BATCH_MS, AC_DEBOUNCE_MS,\n LANGUAGE_COMMENT_TOKEN,\n} from './core/constants.js';\n\nimport {\n createTab, pushSnapshot, applyUndo, applyRedo, clampCursor,\n normaliseSelection, selectionCharCount,\n getSelectedText, deleteSelection,\n} from './core/document.js';\n\nimport {\n buildWrapMap, docToVisualPos, visualToDocPos,\n} from './core/wrap-map.js';\nimport type { WrapMap } from './core/wrap-map.js';\n\nimport { TokenCache } from './core/tokeniser.js';\nimport { ThemeManager } from './themes/theme-manager.js';\nimport { EDITOR_STYLES } from './ui/styles.js';\nimport { el, escapeHtml, getCssVar } from './utils/dom.js';\nimport { splitLines, joinLines, getIndent, spaces, wordStart, wordEnd, throttle } from './utils/string.js';\nimport { validateConfig } from './utils/validation.js';\n\nimport { findBracketMatch } from './features/bracket-matcher.js';\nimport type { BracketMatch } from './features/bracket-matcher.js';\nimport { isFoldable, toggleFold } from './features/code-folding.js';\nimport { expandEmmet, findAbbrBefore } from './features/emmet.js';\nimport { getBuiltinSnippets, findSnippetTriggerBefore } from './features/snippets.js';\nimport {\n createMultiCursorState, addCursor, clearExtraCursors,\n multiInsert, multiBackspace, selectNextOccurrence,\n} from './features/multi-cursor.js';\nimport type { MultiCursorState } from './features/multi-cursor.js';\nimport { findAll, replaceOne, replaceAll, nextMatchIndex } from './features/find-replace.js';\nimport { computeWordHighlights } from './features/word-highlight.js';\nimport { getSuggestions, getPrefixAt } from './features/autocomplete.js';\nimport { lookupHover, getHoverIdentifier } from './features/hover.js';\n\nimport { renderVisualRow } from './renderer/row-renderer.js';\nimport {\n computeMinimapState, sliderTopToEditorScroll,\n minimapClickToEditorScroll, buildMinimapColors, paintMinimap,\n} from './renderer/minimap-renderer.js';\nimport type { MinimapColors } from './types/index.js';\n\n// ─────────────────────────────────────────────────────────────\n\nconst DEFAULT_CONFIG: Required<Omit<EditorConfig, 'onChange' | 'onCursorChange' | 'onSelectionChange' | 'onFocus' | 'onBlur' | 'provideCompletions' | 'provideHover'>> = {\n value: '',\n language: 'typescript',\n theme: '',\n showGutter: true,\n showMinimap: true,\n showStatusBar: true,\n wordWrap: false,\n wrapColumn: DEFAULT_WRAP_COLUMN,\n fontFamily: \"'JetBrains Mono', monospace\",\n fontSize: DEFAULT_FONT_SIZE,\n lineHeight: DEFAULT_LINE_HEIGHT,\n tabSize: DEFAULT_TAB_SIZE,\n insertSpaces: true,\n maxUndoHistory: DEFAULT_MAX_UNDO,\n showIndentGuides: true,\n bracketMatching: true,\n codeFolding: true,\n emmet: true,\n snippetExpansion: true,\n autocomplete: true,\n multiCursor: true,\n find: true,\n findReplace: true,\n wordSelection: true,\n wordHighlight: true,\n highlightActiveLine: true,\n autocompletePrefixLength: 2,\n readOnly: false,\n extraKeywords: [],\n extraTypes: [],\n completions: [],\n replaceBuiltins: false,\n maxCompletions: 14,\n autoClosePairs: { '(': ')', '[': ']', '{': '}', '\"': '\"', \"'\": \"'\", '`': '`' },\n lineCommentToken: '',\n wordSeparators: '',\n undoBatchMs: UNDO_BATCH_MS,\n gutterWidth: DEFAULT_GUTTER_WIDTH,\n minimapWidth: DEFAULT_MINIMAP_WIDTH,\n cursorBlinkRate: 1050,\n cursorStyle: 'line',\n renderWhitespace: 'none',\n tokenColors: {},\n hover: true,\n placeholder: '',\n goToLine: false,\n};\n\nexport class SynclineEditor implements EditorAPI {\n // ── DOM ───────────────────────────────────────────────────\n private readonly _host: HTMLElement;\n private readonly _shadow: ShadowRoot;\n private readonly _editorEl: HTMLElement;\n private readonly _spacerEl: HTMLElement;\n private readonly _vpEl: HTMLElement;\n private readonly _inputEl: HTMLTextAreaElement;\n private readonly _minimapWrap: HTMLElement;\n private readonly _mmCanvas: HTMLCanvasElement;\n private readonly _mmSlider: HTMLElement;\n private readonly _statusBar: HTMLElement;\n private readonly _findBar: HTMLElement;\n private readonly _findInput: HTMLInputElement;\n private readonly _replaceInput: HTMLInputElement;\n private readonly _findCount: HTMLElement;\n private readonly _replaceRow: HTMLElement;\n private readonly _acPopup: HTMLElement;\n private readonly _emmetTip: HTMLElement;\n private readonly _snippetTip: HTMLElement;\n private readonly _hoverTip: HTMLElement;\n private readonly _themeOverlay: HTMLElement;\n private readonly _themePanel: HTMLElement;\n private readonly _placeholderEl: HTMLElement;\n private readonly _goToLineBar: HTMLElement;\n private readonly _goToLineInput: HTMLInputElement;\n private readonly _goToLineHint: HTMLElement;\n\n // ── State ─────────────────────────────────────────────────\n private _config: Required<EditorConfig>;\n private _tab = createTab(1, ['']);\n private _wm: WrapMap = { segments: [['']], visualRows: [{ docLine: 0, segIdx: 0, text: '' }], docToVisArr: [0] };\n private _foldedLines = new Map<number, number>();\n private _tokenCache = new TokenCache();\n private _themeManager: ThemeManager;\n\n // Find\n private _findMatches: FindMatch[] = [];\n private _findIdx = -1;\n private _findCaseSensitive = false;\n private _findRegex = false;\n\n // Highlights\n private _wordHighlights: FindMatch[] = [];\n private _bracketMatch: BracketMatch | null = null;\n\n // Autocomplete\n private _acItems: CompletionItem[] = [];\n private _acSel = 0;\n private _acPrefix = '';\n private _acStartCol = 0;\n private _emmetAcStartCol = 0; // start col of the emmet abbreviation (may differ from _acStartCol)\n\n // Multi-cursor\n private _mc: MultiCursorState = createMultiCursorState();\n private _extraCursors: ExtraCursor[] = [];\n\n // Mouse drag\n private _isDragging = false;\n private _dragAnchor: CursorPosition | null = null;\n\n // Hover\n private _hoverTimer: ReturnType<typeof setTimeout> | null = null;\n private _hoverPinned = false;\n\n // Minimap drag\n private _mmDragMode: 'none' | 'slider' | 'jump' = 'none';\n private _mmDragStartY = 0;\n private _mmDragStartScroll = 0;\n private _mmSliderOffset = 0;\n private _mmColors: MinimapColors;\n\n // Undo batching\n private _lastInputTime = 0;\n\n // Dynamic styles\n private _dynamicStyleEl!: HTMLStyleElement;\n\n // Emmet\n private _emmetExpanded: { abbr: string; result: string; start: number } | null = null;\n\n // Snippets\n private _snippetExpanded: { snippet: CompletionItem; start: number } | null = null;\n /** Active snippet tab-stop session. Cleared on click, Escape, or structural edit. */\n private _snippetSession: { stops: Array<{ row: number; col: number }>; idx: number } | null = null;\n\n // ── Lifecycle / performance ───────────────────────────────\n /** Pending debounce timer ID for autocomplete re-computation. */\n private _acDebounceTimer: ReturnType<typeof setTimeout> | null = null;\n /** Pending requestAnimationFrame ID for coalesced renders. */\n private _rafId: number | null = null;\n\n // ── Bound window listener refs ────────────────────────────\n // Stored as named references so they can be removed precisely in destroy().\n private readonly _onWinMouseUp: () => void;\n private readonly _onWinResize: () => void;\n private readonly _onEditorScroll: () => void;\n private readonly _onWinMmMouseMove: (e: MouseEvent) => void;\n private readonly _onWinMmMouseUp: () => void;\n\n // ── ResizeObserver — tracks container size changes ────────\n private _ro: ResizeObserver | null = null;\n\n // ── Constructor ───────────────────────────────────────────\n\n constructor(container: HTMLElement, config: EditorConfig = {}) {\n this._config = { ...DEFAULT_CONFIG, ...validateConfig(config) } as Required<EditorConfig>;\n\n // ── Bound window listener refs ─────────────────────────\n // Initialised here (before bind calls) so TypeScript can confirm\n // all `readonly` fields are assigned in the constructor.\n this._onWinMouseUp = (): void => { this._isDragging = false; this._dragAnchor = null; };\n this._onEditorScroll = throttle((): void => { this._hideHover(); this._scheduleRender(); this._updateMinimap(); }, 16);\n this._onWinResize = throttle((): void => {\n if (this._config.wordWrap) this._rebuildWrapMap();\n this._scheduleRender();\n }, 100);\n this._onWinMmMouseMove = (e: MouseEvent): void => {\n if (this._mmDragMode === 'none') return;\n const wH = this._minimapWrap.clientHeight;\n if (this._mmDragMode === 'slider') {\n const wrapY = e.clientY - this._minimapWrap.getBoundingClientRect().top;\n this._editorEl.scrollTop = sliderTopToEditorScroll(\n wrapY - this._mmSliderOffset,\n this._tab.doc.length, this._editorEl.clientHeight, wH, this._config.lineHeight,\n );\n } else {\n const dy = e.clientY - this._mmDragStartY;\n const eExtra = Math.max(0, this._tab.doc.length * this._config.lineHeight - this._editorEl.clientHeight);\n this._editorEl.scrollTop = Math.max(0, Math.min(eExtra, this._mmDragStartScroll + (dy / 2) * this._config.lineHeight));\n }\n this._render();\n };\n this._onWinMmMouseUp = (): void => {\n if (this._mmDragMode !== 'none') {\n this._mmDragMode = 'none';\n this._minimapWrap.style.cursor = 'pointer';\n }\n };\n\n // ── Build shadow DOM ──────────────────────────────────\n this._host = container;\n this._host.classList.add('sl-host');\n this._shadow = this._host.attachShadow({ mode: 'open' });\n\n const styleEl = el('style');\n styleEl.textContent = EDITOR_STYLES;\n this._shadow.appendChild(styleEl);\n\n this._dynamicStyleEl = el('style') as HTMLStyleElement;\n this._shadow.appendChild(this._dynamicStyleEl);\n\n // ── Theme ─────────────────────────────────────────────\n this._themeManager = new ThemeManager(this._host);\n const initTheme = typeof this._config.theme === 'string'\n ? this._config.theme\n : this._config.theme;\n this._themeManager.apply(initTheme);\n\n // ── Layout ────────────────────────────────────────────\n const layout = el('div', 'sl-layout');\n\n // Editor pane\n const edPane = el('div', 'sl-ed-pane');\n\n this._inputEl = el('textarea', 'sl-input') as HTMLTextAreaElement;\n this._inputEl.setAttribute('autocomplete', 'off');\n this._inputEl.setAttribute('autocorrect', 'off');\n this._inputEl.setAttribute('autocapitalize', 'off');\n this._inputEl.setAttribute('spellcheck', 'false');\n // ── Accessibility ─────────────────────────────────────\n this._inputEl.setAttribute('role', 'textbox');\n this._inputEl.setAttribute('aria-multiline', 'true');\n this._inputEl.setAttribute('aria-label', 'Code editor');\n this._inputEl.setAttribute('aria-readonly', String(!!this._config.readOnly));\n this._inputEl.setAttribute('aria-haspopup', 'listbox');\n\n this._editorEl = el('div', 'sl-editor');\n this._spacerEl = el('div', 'sl-spacer');\n this._vpEl = el('div', 'sl-vp');\n this._editorEl.appendChild(this._spacerEl);\n this._editorEl.appendChild(this._vpEl);\n\n // Find bar\n this._findBar = this._buildFindBar();\n this._findInput = this._findBar.querySelector<HTMLInputElement>('.sl-find-input')!;\n this._replaceInput = this._findBar.querySelector<HTMLInputElement>('.sl-find-replace-input')!;\n this._findCount = this._findBar.querySelector<HTMLElement>('.sl-find-count')!;\n this._replaceRow = this._findBar.querySelector<HTMLElement>('.sl-replace-row')!;\n\n // Go to Line bar\n this._goToLineBar = this._buildGoToLineBar();\n this._goToLineInput = this._goToLineBar.querySelector<HTMLInputElement>('.sl-gtl-input')!;\n this._goToLineHint = this._goToLineBar.querySelector<HTMLElement>('.sl-gtl-hint')!;\n\n // Placeholder\n this._placeholderEl = el('div', 'sl-placeholder');\n this._placeholderEl.textContent = this._config.placeholder;\n this._placeholderEl.style.display = 'none';\n\n edPane.appendChild(this._inputEl);\n edPane.appendChild(this._findBar);\n edPane.appendChild(this._goToLineBar);\n edPane.appendChild(this._placeholderEl);\n edPane.appendChild(this._editorEl);\n\n // Minimap\n this._minimapWrap = el('div', 'sl-minimap');\n this._minimapWrap.style.width = `${this._config.minimapWidth}px`;\n this._mmCanvas = el('canvas', '') as HTMLCanvasElement;\n this._mmSlider = el('div', 'sl-mm-slider');\n this._minimapWrap.appendChild(this._mmCanvas);\n this._minimapWrap.appendChild(this._mmSlider);\n\n layout.appendChild(edPane);\n if (this._config.showMinimap) layout.appendChild(this._minimapWrap);\n\n // Status bar\n this._statusBar = this._buildStatusBar();\n\n // Autocomplete\n this._acPopup = el('div', 'sl-ac-popup');\n this._acPopup.setAttribute('role', 'listbox');\n this._acPopup.setAttribute('aria-label', 'Code suggestions');\n this._acPopup.style.display = 'none';\n\n // Emmet tip\n this._emmetTip = el('div', 'sl-emmet-tip');\n this._emmetTip.style.display = 'none';\n\n // Snippet tip\n this._snippetTip = el('div', 'sl-emmet-tip');\n this._snippetTip.style.display = 'none';\n\n // Hover documentation tooltip\n this._hoverTip = el('div', 'sl-hover-tip');\n this._hoverTip.style.display = 'none';\n this._hoverTip.addEventListener('mouseenter', () => { this._hoverPinned = true; });\n this._hoverTip.addEventListener('mouseleave', () => { this._hoverPinned = false; this._hideHover(); });\n\n // Theme picker\n this._themeOverlay = el('div', 'sl-theme-overlay');\n this._themeOverlay.style.display = 'none';\n this._themePanel = el('div', 'sl-theme-panel');\n this._themeOverlay.appendChild(this._themePanel);\n\n // Assemble shadow root\n this._shadow.appendChild(layout);\n if (this._config.showStatusBar) this._shadow.appendChild(this._statusBar);\n this._shadow.appendChild(this._acPopup);\n this._shadow.appendChild(this._emmetTip);\n this._shadow.appendChild(this._snippetTip);\n this._shadow.appendChild(this._hoverTip);\n this._shadow.appendChild(this._themeOverlay);\n\n // ── Initialise doc ────────────────────────────────────\n const initLines = typeof this._config.value === 'string'\n ? splitLines(this._config.value)\n : this._config.value;\n this._tab = createTab(1, initLines.length ? initLines : ['']);\n\n // ── Minimap colors ────────────────────────────────────\n this._mmColors = buildMinimapColors(name => getCssVar(name, this._host));\n\n // ── Wire events ───────────────────────────────────────\n this._bindEditorEvents();\n this._bindMinimapEvents();\n this._bindFindEvents();\n\n // ── Dynamic styles ────────────────────────────────────\n this._applyDynamicStyles();\n\n // ── ResizeObserver — reflow wrap map on container resize ──\n // Watches the host element so any CSS-driven size change (flex/grid\n // layout, split-pane drag, window resize) immediately re-wraps lines\n // to the new pixel width without requiring a full page reload.\n if (typeof ResizeObserver !== 'undefined') {\n this._ro = new ResizeObserver(throttle(() => {\n if (this._config.wordWrap) {\n this._rebuildWrapMap();\n this._scheduleRender();\n }\n }, 60));\n this._ro.observe(this._host);\n }\n\n // ── Initial render ────────────────────────────────────\n this._rebuildWrapMap();\n this._render();\n }\n\n // ── Public API ────────────────────────────────────────────\n\n getValue(): string {\n return joinLines(this._tab.doc);\n }\n\n setValue(value: string): void {\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n this._tab.doc = splitLines(value);\n this._tab.cur = { row: 0, col: 0 };\n this._tab.sel = null;\n this._tokenCache.clear();\n this._foldedLines.clear();\n this._rebuildWrapMap();\n this._render();\n this._config.onChange?.(value);\n }\n\n getCursor(): CursorPosition {\n return { ...this._tab.cur };\n }\n\n setCursor(pos: CursorPosition): void {\n this._tab.cur = { ...pos };\n clampCursor(this._tab);\n this._scrollIntoView();\n this._render();\n }\n\n getSelection(): Selection | null {\n return this._tab.sel ? { ...this._tab.sel } : null;\n }\n\n setSelection(sel: Selection | null): void {\n this._tab.sel = sel;\n this._render();\n }\n\n insertText(text: string): void {\n if (this._config.readOnly) return;\n this._insertStr(text, false);\n this._rebuildWrapMap();\n clampCursor(this._tab);\n this._scrollIntoView();\n this._render();\n }\n\n setTheme(theme: string | ThemeDefinition): void {\n this._themeManager.apply(theme);\n // Re-apply token overrides so user colours survive a theme switch\n this._applyTokenOverrides();\n this._mmColors = buildMinimapColors(name => getCssVar(name, this._host));\n this._tokenCache.clear();\n this._render();\n }\n\n updateConfig(patch: Partial<EditorConfig>): void {\n // Validate and sanitise numeric bounds before applying\n const safePatch = validateConfig(patch);\n\n // autoClosePairs: additive merge — passing one pair adds/updates it\n // without wiping all the others. To clear all pairs, pass {} explicitly.\n if (safePatch.autoClosePairs !== undefined) {\n const incoming = safePatch.autoClosePairs;\n this._config.autoClosePairs = Object.keys(incoming).length === 0\n ? {} // {} = intentional clear\n : { ...this._config.autoClosePairs, ...incoming }; // partial update = merge\n const { autoClosePairs: _removed, ...rest } = safePatch;\n void _removed;\n Object.assign(this._config, rest);\n } else {\n Object.assign(this._config, safePatch);\n }\n\n // Reflect readOnly changes in accessibility attributes\n if (safePatch.readOnly !== undefined) {\n this._inputEl.setAttribute('aria-readonly', String(!!safePatch.readOnly));\n }\n if (patch.theme !== undefined) this.setTheme(patch.theme);\n if (patch.wordWrap !== undefined || patch.wrapColumn !== undefined) {\n this._rebuildWrapMap();\n }\n if (patch.showMinimap !== undefined) {\n const layout = this._shadow.querySelector('.sl-layout')!;\n if (patch.showMinimap) {\n if (!layout.contains(this._minimapWrap)) layout.appendChild(this._minimapWrap);\n } else {\n this._minimapWrap.remove();\n }\n }\n if (patch.showStatusBar !== undefined) {\n if (patch.showStatusBar) {\n if (!this._shadow.contains(this._statusBar)) this._shadow.appendChild(this._statusBar);\n } else {\n this._statusBar.remove();\n }\n }\n if (\n patch.fontFamily !== undefined || patch.fontSize !== undefined ||\n patch.lineHeight !== undefined || patch.cursorBlinkRate !== undefined ||\n patch.cursorStyle !== undefined || patch.gutterWidth !== undefined ||\n patch.minimapWidth !== undefined || patch.showGutter !== undefined ||\n patch.tokenColors !== undefined\n ) {\n this._applyDynamicStyles();\n }\n if (\n patch.language !== undefined || patch.extraKeywords !== undefined ||\n patch.extraTypes !== undefined || patch.renderWhitespace !== undefined ||\n patch.completions !== undefined\n ) {\n this._tokenCache.clear();\n }\n if (patch.find === false) {\n this._closeFind();\n } else if (patch.findReplace === false) {\n this._replaceRow.style.display = 'none';\n }\n if (patch.goToLine === false) {\n this._closeGoToLine();\n }\n if (patch.placeholder !== undefined) {\n this._placeholderEl.textContent = patch.placeholder;\n }\n this._render();\n }\n\n focus(): void {\n this._focusInput();\n }\n\n getThemes(): string[] {\n return this._themeManager.allIds;\n }\n\n registerTheme(theme: ThemeDefinition): void {\n this._themeManager.register(theme);\n }\n\n undo(): void {\n if (applyUndo(this._tab)) {\n this._tokenCache.clear();\n this._rebuildWrapMap();\n clampCursor(this._tab);\n this._scrollIntoView();\n this._render();\n this._config.onChange?.(joinLines(this._tab.doc));\n }\n }\n\n redo(): void {\n if (applyRedo(this._tab)) {\n this._tokenCache.clear();\n this._rebuildWrapMap();\n clampCursor(this._tab);\n this._scrollIntoView();\n this._render();\n this._config.onChange?.(joinLines(this._tab.doc));\n }\n }\n\n executeCommand(command: string): void {\n const ro = this._config.readOnly;\n switch (command) {\n case 'undo': if (!ro) this.undo(); break;\n case 'redo': if (!ro) this.redo(); break;\n case 'selectAll': this._selectAll(); break;\n case 'copy': this._doCopy(); break;\n case 'cut': if (!ro) this._doCut(); break;\n case 'toggleComment': if (!ro) this._toggleComment(); break;\n case 'duplicateLine': if (!ro) this._duplicateLine(); break;\n case 'deleteLine': if (!ro) this._deleteLine(); break;\n case 'toggleWordWrap': this._toggleWrap(); break;\n case 'find': if (this._config.find) this._openFind(false); break;\n case 'findReplace': if (this._config.find && this._config.findReplace) this._openFind(true); break;\n case 'indentLine': if (!ro) this._indentSel(); break;\n case 'outdentLine': if (!ro) this._unindentSel(); break;\n default:\n // Warn on unknown commands so typos are surfaced immediately during\n // development rather than silently no-oping.\n console.warn(`[syncline-editor] executeCommand: unknown command \"${command}\"`);\n break;\n }\n }\n\n destroy(): void {\n // ── Cancel pending async work ──────────────────────────\n if (this._acDebounceTimer !== null) {\n clearTimeout(this._acDebounceTimer);\n this._acDebounceTimer = null;\n }\n if (this._hoverTimer !== null) {\n clearTimeout(this._hoverTimer);\n this._hoverTimer = null;\n }\n if (this._rafId !== null) {\n cancelAnimationFrame(this._rafId);\n this._rafId = null;\n }\n\n // ── Remove window-level listeners ─────────────────────\n // These were added in _bindEditorEvents / _bindMinimapEvents and\n // must be removed to allow this instance to be garbage-collected.\n window.removeEventListener('mouseup', this._onWinMouseUp);\n window.removeEventListener('resize', this._onWinResize);\n window.removeEventListener('mousemove', this._onWinMmMouseMove);\n window.removeEventListener('mouseup', this._onWinMmMouseUp);\n this._ro?.disconnect();\n\n // ── Release canvas resources ──────────────────────────\n const ctx = this._mmCanvas.getContext('2d');\n if (ctx) ctx.clearRect(0, 0, this._mmCanvas.width, this._mmCanvas.height);\n\n // ── Tear down shadow DOM ───────────────────────────────\n this._shadow.innerHTML = '';\n this._host.classList.remove('sl-host');\n }\n\n // ── DOM builders ──────────────────────────────────────────\n\n private _buildFindBar(): HTMLElement {\n const bar = el('div', 'sl-find-bar');\n bar.innerHTML = `\n <div class=\"sl-find-row\">\n <input class=\"sl-find-input\" placeholder=\"Find…\" autocomplete=\"off\" spellcheck=\"false\">\n <span class=\"sl-find-count\">–</span>\n <button class=\"sl-find-btn sl-find-prev\" title=\"Previous\">↑</button>\n <button class=\"sl-find-btn sl-find-next\" title=\"Next\">↓</button>\n <button class=\"sl-find-btn sl-find-case\" title=\"Match case\">Aa</button>\n <button class=\"sl-find-btn sl-find-regex\" title=\"Regex\">.*</button>\n <span class=\"sl-find-x sl-find-close\">✕</span>\n </div>\n <div class=\"sl-find-row sl-replace-row\" style=\"display:none\">\n <input class=\"sl-find-replace-input\" placeholder=\"Replace…\" autocomplete=\"off\" spellcheck=\"false\">\n <button class=\"sl-find-btn sl-replace-one\">Replace</button>\n <button class=\"sl-find-btn sl-replace-all\">All</button>\n </div>\n `;\n return bar;\n }\n\n private _buildGoToLineBar(): HTMLElement {\n const bar = el('div', 'sl-gtl-bar');\n bar.innerHTML = `\n <span class=\"sl-gtl-label\">Go to line</span>\n <input class=\"sl-gtl-input\" type=\"text\" inputmode=\"numeric\" autocomplete=\"off\" spellcheck=\"false\" placeholder=\"…\">\n <span class=\"sl-gtl-hint\"></span>\n <span class=\"sl-find-x sl-gtl-close\" title=\"Close\">✕</span>\n `;\n const input = bar.querySelector<HTMLInputElement>('.sl-gtl-input')!;\n const hint = bar.querySelector<HTMLElement>('.sl-gtl-hint')!;\n\n input.addEventListener('input', () => {\n const n = parseInt(input.value, 10);\n const valid = !isNaN(n) && n >= 1 && n <= this._tab.doc.length;\n input.classList.toggle('sl-gtl-err', input.value !== '' && !valid);\n hint.textContent = `(1–${this._tab.doc.length})`;\n });\n\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n const n = parseInt(input.value, 10);\n if (!isNaN(n) && n >= 1 && n <= this._tab.doc.length) {\n this._tab.cur.row = n - 1;\n this._tab.cur.col = Math.min(this._tab.cur.col, (this._tab.doc[n - 1] ?? '').length);\n clampCursor(this._tab);\n this._tab.sel = null;\n this._closeGoToLine();\n this._scrollIntoView();\n this._render();\n this._config.onCursorChange?.({ ...this._tab.cur });\n }\n } else if (e.key === 'Escape') {\n e.preventDefault();\n this._closeGoToLine();\n }\n e.stopPropagation(); // keep editor keydown from firing\n });\n\n bar.querySelector('.sl-gtl-close')!.addEventListener('click', () => this._closeGoToLine());\n return bar;\n }\n\n private _openGoToLine(): void {\n if (this._goToLineBar.classList.contains('sl-open')) { this._closeGoToLine(); return; }\n this._goToLineHint.textContent = `(1–${this._tab.doc.length})`;\n this._goToLineInput.value = String(this._tab.cur.row + 1);\n this._goToLineInput.classList.remove('sl-gtl-err');\n this._goToLineBar.classList.add('sl-open');\n this._goToLineInput.focus();\n this._goToLineInput.select();\n }\n\n private _closeGoToLine(): void {\n this._goToLineBar.classList.remove('sl-open');\n this._focusInput();\n }\n\n private _buildStatusBar(): HTMLElement {\n const sb = el('div', 'sl-statusbar');\n sb.innerHTML = `\n <div class=\"sl-sb-item sl-no-click sl-sb-lang\">⬡ TypeScript</div>\n <div class=\"sl-sb-sep\"></div>\n <div class=\"sl-sb-item sl-no-click sl-sb-pos\">Ln 1, Col 1</div>\n <div class=\"sl-sb-sep\"></div>\n <div class=\"sl-sb-item sl-no-click sl-sb-sel\"></div>\n <div class=\"sl-sb-sep sl-sb-sel-sep\" style=\"display:none\"></div>\n <div class=\"sl-sb-item sl-no-click sl-sb-lines\">1 line</div>\n <div class=\"sl-sb-sep\"></div>\n <div class=\"sl-sb-item sl-no-click\">UTF-8 LF</div>\n <div class=\"sl-sb-right\">\n <div class=\"sl-sb-item sl-no-click sl-sb-mc\" style=\"display:none\">⊕ <span class=\"sl-sb-mc-count\">1</span> cursors</div>\n <div class=\"sl-sb-item sl-sb-wrap sl-sb-wrap-btn\">⇥ Wrap: OFF</div>\n <div class=\"sl-sb-sep\"></div>\n <div class=\"sl-sb-item sl-sb-theme-btn\">🎨 Theme</div>\n <div class=\"sl-sb-sep\"></div>\n <div class=\"sl-sb-item sl-no-click sl-sb-undo\">↩0 ↪0</div>\n </div>\n `;\n sb.querySelector('.sl-sb-wrap-btn')!.addEventListener('click', () => this._toggleWrap());\n sb.querySelector('.sl-sb-theme-btn')!.addEventListener('click', () => this._openThemePicker());\n return sb;\n }\n\n // ── Dynamic styles ────────────────────────────────────────\n\n private _applyDynamicStyles(): void {\n const {\n fontFamily, fontSize, lineHeight, cursorBlinkRate,\n cursorStyle, gutterWidth, minimapWidth, showGutter,\n } = this._config;\n\n const curH = Math.max(2, lineHeight - 4);\n const curTop = Math.floor((lineHeight - curH) / 2);\n\n let cursorExtra = '';\n if (cursorStyle === 'block') {\n cursorExtra = `width:${DEFAULT_CHAR_WIDTH}px;opacity:.5;border-radius:1px;`;\n } else if (cursorStyle === 'underline') {\n cursorExtra = `width:${DEFAULT_CHAR_WIDTH}px;height:2px;top:${lineHeight - 2}px;border-radius:0;`;\n }\n\n const gw = showGutter ? gutterWidth : 0;\n\n this._dynamicStyleEl.textContent = `\n .sl-el{font-family:${fontFamily};font-size:${fontSize}px;line-height:${lineHeight}px}\n .sl-cl{height:${lineHeight}px;line-height:${lineHeight}px}\n .sl-egn{height:${lineHeight}px;line-height:${lineHeight}px}\n .sl-eg{min-width:${gw}px;width:${gw}px;${!showGutter ? 'display:none' : ''}}\n .sl-cur::after{height:${curH}px;top:${curTop}px;animation-duration:${cursorBlinkRate}ms;${cursorExtra}}\n .sl-cur-extra::after{height:${curH}px;top:${curTop}px;animation-duration:${cursorBlinkRate}ms;${cursorExtra}}\n `;\n\n // Apply token-colour overrides as inline styles on the host element —\n // same mechanism used by ThemeManager so they take precedence correctly.\n this._applyTokenOverrides();\n\n this._minimapWrap.style.width = `${minimapWidth}px`;\n\n // Keep placeholder aligned with the first character of the code area\n this._placeholderEl.style.left = `${gw + CODE_PADDING_LEFT}px`;\n this._placeholderEl.style.fontFamily = fontFamily;\n this._placeholderEl.style.fontSize = `${fontSize}px`;\n this._placeholderEl.style.lineHeight = `${lineHeight}px`;\n }\n\n /**\n * Apply tokenColors overrides as inline styles on the host element.\n * Must be called AFTER the theme has applied its own inline styles so\n * our values win (last writer wins for element.style.setProperty).\n * When a token field is empty/absent, restore the active theme's value.\n */\n private _applyTokenOverrides(): void {\n const tc = this._config.tokenColors ?? {};\n const activeTheme = this._themeManager.activeTheme;\n const s = this._host.style;\n\n const apply = (cssVar: string, override: string | undefined, themeVal: string) => {\n s.setProperty(cssVar, override || themeVal);\n };\n\n const t = activeTheme?.tokens;\n apply('--tok-kw', tc.keyword, t?.tokKw ?? '');\n apply('--tok-str', tc.string, t?.tokStr ?? '');\n apply('--tok-cmt', tc.comment, t?.tokCmt ?? '');\n apply('--tok-fn', tc.function, t?.tokFn ?? '');\n apply('--tok-num', tc.number, t?.tokNum ?? '');\n apply('--tok-cls', tc.class, t?.tokCls ?? '');\n apply('--tok-op', tc.operator, t?.tokOp ?? '');\n apply('--tok-typ', tc.type, t?.tokTyp ?? '');\n apply('--tok-dec', tc.decorator, t?.tokDec ?? '');\n }\n\n // ── Core render ───────────────────────────────────────────\n\n /**\n * Schedule a render on the next animation frame.\n * Multiple calls within a single frame are coalesced into one render —\n * ideal for scroll and resize handlers which can fire at 60+ Hz.\n */\n private _scheduleRender(): void {\n if (this._rafId !== null) return;\n this._rafId = requestAnimationFrame(() => {\n this._rafId = null;\n this._render();\n });\n }\n\n private _render(): void {\n const { doc, cur, sel } = this._tab;\n const { lineHeight: LH } = this._config;\n\n // Compute highlights\n this._wordHighlights = this._config.wordHighlight\n ? computeWordHighlights(doc, cur.row, cur.col, sel)\n : [];\n this._bracketMatch = this._config.bracketMatching\n ? findBracketMatch(doc, cur) : null;\n\n const totalVis = this._wm.visualRows.length;\n this._spacerEl.style.height = `${totalVis * LH}px`;\n\n // Fix: drive horizontal scroll width from logical char counts so it never\n // shifts when the rich renderer activates (e.g. on word selection).\n if (!this._config.wordWrap) {\n const maxChars = doc.reduce((m, l) => Math.max(m, l.length), 0);\n const gw = this._config.showGutter ? this._config.gutterWidth : 0;\n // Always at least as wide as the visible editor area (so the active-line\n // background fills edge-to-edge on short files). Add 64 px beyond the\n // right padding so slightly wider custom fonts never clip long lines.\n const totalW = Math.max(\n this._editorEl.clientWidth,\n gw + CODE_PADDING_LEFT\n + Math.ceil(maxChars * DEFAULT_CHAR_WIDTH)\n + CODE_PADDING_RIGHT + 64,\n );\n this._spacerEl.style.width = `${totalW}px`;\n this._vpEl.style.width = `${totalW}px`;\n } else {\n this._spacerEl.style.width = '';\n this._vpEl.style.width = '';\n }\n\n const st = this._editorEl.scrollTop;\n const visH = this._editorEl.clientHeight;\n const startV = Math.max(0, Math.floor(st / LH) - VIRTUAL_OVERSCAN);\n const endV = Math.min(totalVis - 1, Math.ceil((st + visH) / LH) + VIRTUAL_OVERSCAN);\n\n this._vpEl.style.transform = `translateY(${startV * LH}px)`;\n\n const curVisPos = docToVisualPos(this._wm, cur.row, cur.col);\n\n // Build a visRow→colInSeg[] map for upcoming snippet tab-stop ghost markers.\n // Only stops AFTER the current index are shown (not the active one).\n const snippetStopMap = new Map<number, number[]>();\n if (this._snippetSession) {\n for (let si = this._snippetSession.idx + 1; si < this._snippetSession.stops.length; si++) {\n const stop = this._snippetSession.stops[si]!;\n const vp = docToVisualPos(this._wm, stop.row, stop.col);\n const arr = snippetStopMap.get(vp.visRow) ?? [];\n arr.push(vp.colInSeg);\n snippetStopMap.set(vp.visRow, arr);\n }\n }\n\n let html = '';\n for (let v = startV; v <= endV; v++) {\n const vr = this._wm.visualRows[v];\n if (!vr) continue;\n html += renderVisualRow({\n vr, visIdx: v,\n curVisRow: curVisPos.visRow,\n curColInSeg: curVisPos.colInSeg,\n docSel: sel,\n findMatches: this._findMatches,\n findIdx: this._findIdx,\n wordHighlights: this._wordHighlights,\n bracketMatch: this._bracketMatch,\n extraCursors: this._extraCursors,\n snippetStopCols: snippetStopMap.get(v) ?? [],\n foldedLines: this._foldedLines,\n isFoldable: this._config.codeFolding && isFoldable(doc, vr.docLine),\n wm: this._wm,\n tokenCache: this._tokenCache,\n opts: {\n tokeniserOpts: {\n language: this._config.language,\n extraKeywords: new Set(this._config.extraKeywords),\n extraTypes: new Set(this._config.extraTypes),\n },\n showIndentGuides: this._config.showIndentGuides,\n highlightActiveLine: this._config.highlightActiveLine,\n charWidth: DEFAULT_CHAR_WIDTH,\n codePaddingLeft: CODE_PADDING_LEFT,\n tabSize: this._config.tabSize,\n lineHeight: LH,\n renderWhitespace: this._config.renderWhitespace,\n },\n });\n }\n this._vpEl.innerHTML = html;\n\n this._updateStatusBar();\n this._updateMinimap();\n\n // Placeholder — only when config has a string AND document is empty\n if (this._config.placeholder) {\n const isEmpty = this._tab.doc.length === 1 && this._tab.doc[0] === '';\n this._placeholderEl.style.display = isEmpty ? '' : 'none';\n } else {\n this._placeholderEl.style.display = 'none';\n }\n }\n\n private readonly _onFoldBtnClick = (e: MouseEvent): void => {\n const btn = (e.target as HTMLElement).closest<HTMLElement>('.sl-fold-btn');\n if (!btn) return;\n e.preventDefault();\n e.stopPropagation();\n const row = parseInt(btn.dataset['row'] ?? '0', 10);\n this._foldedLines = toggleFold(this._foldedLines, this._tab.doc, row);\n this._tokenCache.clear();\n this._rebuildWrapMap();\n this._render();\n };\n\n // ── Status bar ────────────────────────────────────────────\n\n private _updateStatusBar(): void {\n if (!this._config.showStatusBar) return;\n const { cur, doc, undoStack, redoStack } = this._tab;\n const lang = this._config.language;\n\n const langLabels: Record<string, string> = {\n typescript: 'TypeScript', javascript: 'JavaScript', css: 'CSS',\n json: 'JSON', markdown: 'Markdown', text: 'Text',\n };\n\n const qs = <T extends HTMLElement>(cls: string) => this._statusBar.querySelector<T>(cls);\n qs('.sl-sb-lang')!.textContent = `⬡ ${langLabels[lang] ?? lang}`;\n qs('.sl-sb-pos')!.textContent = `Ln ${cur.row + 1}, Col ${cur.col + 1}`;\n qs('.sl-sb-lines')!.textContent = `${doc.length.toLocaleString()} lines`;\n\n const sc = selectionCharCount(this._tab);\n const selEl = qs('.sl-sb-sel')!;\n const sepEl = qs('.sl-sb-sel-sep')!;\n selEl.textContent = sc ? `${sc.toLocaleString()} selected` : '';\n (sepEl as HTMLElement).style.display = sc ? '' : 'none';\n\n qs('.sl-sb-undo')!.textContent = `↩${undoStack.length} ↪${redoStack.length}`;\n\n const mcEl = qs<HTMLElement>('.sl-sb-mc')!;\n if (this._extraCursors.length) {\n mcEl.style.display = '';\n qs('.sl-sb-mc-count')!.textContent = String(this._extraCursors.length + 1);\n } else {\n mcEl.style.display = 'none';\n }\n }\n\n // ── Minimap ───────────────────────────────────────────────\n\n private _updateMinimap(): void {\n if (!this._config.showMinimap) return;\n const wW = this._minimapWrap.clientWidth;\n const wH = this._minimapWrap.clientHeight;\n if (!wW || !wH) return;\n\n const doc = this._tab.doc;\n const N = doc.length;\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n const LH = this._config.lineHeight;\n\n const { mmScroll, sliderTop, sliderHeight } = computeMinimapState(\n N, this._editorEl.scrollTop, this._editorEl.clientHeight, wH, LH,\n );\n\n const firstFrac = mmScroll / 2;\n const first = Math.floor(firstFrac);\n const visCount = Math.ceil(wH / 2) + 2;\n const last = Math.min(N, first + visCount);\n const canvasH = (last - first) * 2;\n const subPx = (firstFrac - first) * 2;\n\n const needW = Math.round(wW * dpr);\n const needH = Math.round(canvasH * dpr);\n if (this._mmCanvas.width !== needW || this._mmCanvas.height !== needH) {\n this._mmCanvas.width = needW;\n this._mmCanvas.height = needH;\n this._mmCanvas.style.width = `${wW}px`;\n this._mmCanvas.style.height = `${canvasH}px`;\n }\n this._mmCanvas.style.transform = `translateY(${-subPx}px)`;\n\n paintMinimap({\n canvas: this._mmCanvas,\n doc, firstLine: first, lastLine: last, subPx,\n wrapperWidth: wW, canvasHeight: canvasH,\n cursorRow: this._tab.cur.row,\n sel: this._tab.sel,\n findMatches: this._findMatches,\n findIdx: this._findIdx,\n sliderTop, sliderHeight,\n colors: this._mmColors,\n getCssVar: name => getCssVar(name, this._host),\n dpr,\n });\n\n this._mmSlider.style.top = `${Math.max(0, Math.min(wH - sliderHeight, sliderTop))}px`;\n this._mmSlider.style.height = `${sliderHeight}px`;\n\n void LH; // suppress unused warning\n }\n\n // ── WrapMap ───────────────────────────────────────────────\n\n private _rebuildWrapMap(): void {\n let width: number;\n if (this._config.wordWrap) {\n // Compute wrap column from the editor's actual pixel width so wrapping\n // always fills the visible area regardless of fontSize or container size.\n const gw = this._config.showGutter ? this._config.gutterWidth : 0;\n const editorW = this._editorEl.clientWidth;\n if (editorW > 0) {\n const codeAreaW = editorW - gw - CODE_PADDING_LEFT - CODE_PADDING_RIGHT;\n width = Math.max(20, Math.floor(codeAreaW / DEFAULT_CHAR_WIDTH));\n } else {\n // Editor not yet laid out — fall back to configured column until\n // the ResizeObserver fires with real dimensions.\n width = this._config.wrapColumn;\n }\n } else {\n width = 9999;\n }\n this._wm = buildWrapMap(\n this._tab.doc, width, this._config.wordWrap, this._foldedLines,\n );\n }\n\n // ── Scroll ────────────────────────────────────────────────\n\n private _scrollIntoView(): void {\n const cur = this._tab.cur;\n const vp = docToVisualPos(this._wm, cur.row, cur.col);\n const top = vp.visRow * this._config.lineHeight;\n const bottom = top + this._config.lineHeight;\n const st = this._editorEl.scrollTop;\n const sh = this._editorEl.clientHeight;\n const pad = this._config.lineHeight * 3;\n if (top < st + pad) this._editorEl.scrollTop = Math.max(0, top - pad);\n else if (bottom > st + sh - pad) this._editorEl.scrollTop = bottom - sh + pad;\n }\n\n // ── Input helpers ─────────────────────────────────────────\n\n private _focusInput(): void {\n this._inputEl.style.pointerEvents = 'auto';\n this._inputEl.focus();\n this._inputEl.style.pointerEvents = 'none';\n }\n\n private _insertStr(text: string, groupable: boolean): void {\n const now = Date.now();\n if (!groupable || now - this._lastInputTime > this._config.undoBatchMs) {\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n }\n this._lastInputTime = now;\n\n if (this._tab.sel) {\n this._tab.cur = deleteSelection(this._tab);\n }\n\n const { doc, cur } = this._tab;\n const parts = text.split('\\n');\n const line = doc[cur.row] ?? '';\n const before = line.slice(0, cur.col);\n const after = line.slice(cur.col);\n\n if (parts.length === 1) {\n doc[cur.row] = before + text + after;\n cur.col += text.length;\n } else {\n const rows = [before + parts[0]];\n for (let i = 1; i < parts.length - 1; i++) rows.push(parts[i]);\n rows.push(parts[parts.length - 1] + after);\n doc.splice(cur.row, 1, ...rows);\n cur.row += parts.length - 1;\n cur.col = parts[parts.length - 1].length;\n }\n\n this._tokenCache.invalidateLine(cur.row, (this._wm.segments[cur.row] ?? ['']).length);\n this._tab.dirty = true;\n this._config.onChange?.(joinLines(doc));\n }\n\n private _doBackspace(): void {\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n if (this._tab.sel) {\n this._tab.cur = deleteSelection(this._tab);\n this._tokenCache.clear();\n this._tab.dirty = true;\n return;\n }\n const { doc, cur } = this._tab;\n if (cur.col > 0) {\n const line = doc[cur.row] ?? '';\n const before = line.slice(0, cur.col);\n // Smart unindent: remove 2 spaces if trailing whitespace\n const removeCount = before.length >= 2 && before.endsWith(' ') && !before.trim() ? 2 : 1;\n doc[cur.row] = line.slice(0, cur.col - removeCount) + line.slice(cur.col);\n cur.col -= removeCount;\n this._tokenCache.invalidateLine(cur.row, this._wm.segments[cur.row]?.length ?? 1);\n } else if (cur.row > 0) {\n const prevLen = (doc[cur.row - 1] ?? '').length;\n doc[cur.row - 1] += doc[cur.row] ?? '';\n doc.splice(cur.row, 1);\n cur.row--;\n cur.col = prevLen;\n this._tokenCache.clear();\n }\n this._tab.dirty = true;\n }\n\n private _doEnter(): void {\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n if (this._tab.sel) this._tab.cur = deleteSelection(this._tab);\n const { doc, cur } = this._tab;\n const line = doc[cur.row] ?? '';\n const before = line.slice(0, cur.col);\n const after = line.slice(cur.col);\n const indent = getIndent(line);\n const extra = before.trimEnd().endsWith('{') ? spaces(this._config.tabSize) : '';\n\n doc[cur.row] = before;\n if (before.trimEnd().endsWith('{') && after.trimStart() === '}') {\n doc.splice(cur.row + 1, 0, indent + extra, indent + after);\n } else {\n doc.splice(cur.row + 1, 0, indent + extra + after);\n }\n cur.row++;\n cur.col = indent.length + extra.length;\n this._tokenCache.clear();\n this._tab.dirty = true;\n }\n\n private _doDelete(): void {\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n if (this._tab.sel) {\n this._tab.cur = deleteSelection(this._tab);\n this._tokenCache.clear();\n this._tab.dirty = true;\n return;\n }\n const { doc, cur } = this._tab;\n const line = doc[cur.row] ?? '';\n if (cur.col < line.length) {\n doc[cur.row] = line.slice(0, cur.col) + line.slice(cur.col + 1);\n this._tokenCache.invalidateLine(cur.row, this._wm.segments[cur.row]?.length ?? 1);\n } else if (cur.row < doc.length - 1) {\n doc[cur.row] = line + (doc[cur.row + 1] ?? '');\n doc.splice(cur.row + 1, 1);\n this._tokenCache.clear();\n }\n this._tab.dirty = true;\n }\n\n // ── Editing commands ──────────────────────────────────────\n\n private _selectAll(): void {\n const doc = this._tab.doc;\n const lr = doc.length - 1;\n this._tab.sel = { ar: 0, ac: 0, fr: lr, fc: (doc[lr] ?? '').length };\n this._tab.cur = { row: lr, col: (doc[lr] ?? '').length };\n this._render();\n }\n\n private _doCopy(): void {\n const text = getSelectedText(this._tab);\n if (text) navigator.clipboard?.writeText(text).catch(() => { /* noop */ });\n }\n\n private _doCut(): void {\n const text = getSelectedText(this._tab);\n if (!text) return;\n navigator.clipboard?.writeText(text).catch(() => { /* noop */ });\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n this._tab.cur = deleteSelection(this._tab);\n this._tokenCache.clear();\n this._tab.dirty = true;\n this._rebuildWrapMap();\n this._render();\n this._config.onChange?.(joinLines(this._tab.doc));\n }\n\n private _toggleComment(): void {\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n const rows = this._getSelRows();\n const token = this._config.lineCommentToken || LANGUAGE_COMMENT_TOKEN[this._config.language] || '';\n if (!token) return; // no comment token for this language\n const escaped = token.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const allCmt = rows.every(r => (this._tab.doc[r] ?? '').trimStart().startsWith(token));\n rows.forEach(r => {\n const line = this._tab.doc[r] ?? '';\n this._tab.doc[r] = allCmt\n ? line.replace(new RegExp(`^(\\\\s*)${escaped}\\\\s?`), '$1')\n : line.replace(/^(\\s*)/, `$1${token} `);\n this._tokenCache.invalidateLine(r, this._wm.segments[r]?.length ?? 1);\n });\n this._tab.dirty = true;\n this._rebuildWrapMap();\n this._render();\n this._config.onChange?.(joinLines(this._tab.doc));\n }\n\n private _duplicateLine(): void {\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n const r = this._tab.cur.row;\n this._tab.doc.splice(r + 1, 0, this._tab.doc[r] ?? '');\n this._tab.cur.row++;\n this._tokenCache.clear();\n this._tab.dirty = true;\n this._rebuildWrapMap();\n this._render();\n this._config.onChange?.(joinLines(this._tab.doc));\n }\n\n private _deleteLine(): void {\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n const { doc, cur } = this._tab;\n if (doc.length > 1) {\n doc.splice(cur.row, 1);\n } else {\n doc[0] = '';\n cur.col = 0;\n }\n this._tokenCache.clear();\n this._tab.dirty = true;\n clampCursor(this._tab);\n this._rebuildWrapMap();\n this._render();\n this._config.onChange?.(joinLines(this._tab.doc));\n }\n\n private _indentSel(): void {\n if (!this._tab.sel) { this._insertStr(spaces(this._config.tabSize), false); return; }\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n const tab = spaces(this._config.tabSize);\n this._getSelRows().forEach(r => {\n this._tab.doc[r] = tab + (this._tab.doc[r] ?? '');\n this._tokenCache.invalidateLine(r, this._wm.segments[r]?.length ?? 1);\n });\n this._tab.dirty = true;\n this._rebuildWrapMap();\n this._render();\n this._config.onChange?.(joinLines(this._tab.doc));\n }\n\n private _unindentSel(): void {\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n const n = this._config.tabSize;\n this._getSelRows().forEach(r => {\n const line = this._tab.doc[r] ?? '';\n if (line.startsWith(spaces(n))) this._tab.doc[r] = line.slice(n);\n else if (line.startsWith(' ')) this._tab.doc[r] = line.slice(1);\n this._tokenCache.invalidateLine(r, this._wm.segments[r]?.length ?? 1);\n });\n this._tab.dirty = true;\n this._rebuildWrapMap();\n this._render();\n this._config.onChange?.(joinLines(this._tab.doc));\n }\n\n private _toggleWrap(): void {\n this._config.wordWrap = !this._config.wordWrap;\n this._vpEl.classList.toggle('sl-wrap-mode', this._config.wordWrap);\n const btn = this._statusBar.querySelector('.sl-sb-wrap-btn');\n if (btn) {\n btn.textContent = `⇥ Wrap: ${this._config.wordWrap ? 'ON' : 'OFF'}`;\n btn.classList.toggle('sl-on', this._config.wordWrap);\n }\n this._tokenCache.clear();\n this._rebuildWrapMap();\n this._render();\n }\n\n private _getSelRows(): number[] {\n if (!this._tab.sel) return [this._tab.cur.row];\n const ns = normaliseSelection(this._tab.sel);\n const rows: number[] = [];\n for (let i = ns.ar; i <= ns.fr; i++) rows.push(i);\n return rows;\n }\n\n // ── Mouse position helper ─────────────────────────────────\n\n private _posFromMouse(e: MouseEvent): CursorPosition {\n const rect = this._editorEl.getBoundingClientRect();\n const y = e.clientY - rect.top + this._editorEl.scrollTop;\n const gw = this._config.showGutter ? this._config.gutterWidth : 0;\n const x = e.clientX - rect.left - gw - CODE_PADDING_LEFT;\n const LH = this._config.lineHeight;\n const visIdx = Math.max(0, Math.min(this._wm.visualRows.length - 1, Math.floor(y / LH)));\n const col = Math.max(0, Math.min(\n (this._wm.visualRows[visIdx]?.text ?? '').length,\n Math.round(x / DEFAULT_CHAR_WIDTH),\n ));\n return visualToDocPos(this._wm, visIdx, col);\n }\n\n // ── Find ──────────────────────────────────────────────────\n\n private _openFind(withReplace: boolean): void {\n this._findBar.classList.add('sl-open');\n this._replaceRow.style.display = (withReplace && this._config.findReplace) ? '' : 'none';\n this._findInput.focus();\n this._findInput.select();\n this._runFind(this._findInput.value);\n if (this._findMatches.length) { this._findIdx = -1; this._navFind(1); }\n else this._render();\n }\n\n private _closeFind(): void {\n this._findBar.classList.remove('sl-open');\n this._findMatches = [];\n this._findIdx = -1;\n this._findCount.textContent = '–';\n this._focusInput();\n this._render();\n }\n\n private _runFind(q: string): void {\n this._findMatches = findAll(this._tab.doc, q, {\n caseSensitive: this._findCaseSensitive,\n useRegex: this._findRegex,\n });\n }\n\n private _navFind(dir: 1 | -1): void {\n if (!this._findMatches.length) { this._findCount.textContent = '0/0'; return; }\n this._findIdx = nextMatchIndex(this._findMatches, this._findIdx, dir);\n const m = this._findMatches[this._findIdx]!;\n this._tab.cur = { row: m.row, col: m.col };\n this._tab.sel = { ar: m.row, ac: m.col, fr: m.row, fc: m.col + m.len };\n this._scrollIntoView();\n this._render();\n this._findCount.textContent = `${this._findIdx + 1}/${this._findMatches.length}`;\n }\n\n // ── Autocomplete ──────────────────────────────────────────\n\n private _acVisible(): boolean { return this._acPopup.style.display !== 'none'; }\n private _acHide(): void { this._acPopup.style.display = 'none'; this._acItems = []; }\n\n /**\n * Schedule an autocomplete refresh after a brief debounce pause.\n * Prevents the suggestion engine running on every single keystroke —\n * only fires when the user pauses for `AC_DEBOUNCE_MS` milliseconds.\n * Call `_acTriggerNow()` directly when an immediate refresh is required\n * (e.g., on explicit Ctrl+Space or arrow-key navigation).\n */\n private _acTrigger(): void {\n if (!this._config.autocomplete) { this._acHide(); return; }\n if (this._acDebounceTimer !== null) clearTimeout(this._acDebounceTimer);\n this._acDebounceTimer = setTimeout(() => {\n this._acDebounceTimer = null;\n this._acTriggerNow();\n }, AC_DEBOUNCE_MS);\n }\n\n /** Run an autocomplete refresh immediately (no debounce). */\n private _acTriggerNow(): void {\n if (!this._config.autocomplete) { this._acHide(); return; }\n const { cur, doc } = this._tab;\n const line = doc[cur.row] ?? '';\n const isCss = this._config.language === 'css';\n const { prefix, start } = getPrefixAt(line, cur.col, isCss);\n this._acPrefix = prefix;\n this._acStartCol = start;\n\n // Emmet items — injected first so they appear at the top of the unified popup\n const emmetItems: CompletionItem[] = [];\n if (this._config.emmet) {\n const emmetFound = findAbbrBefore(line, cur.col);\n if (emmetFound) {\n const expanded = expandEmmet(emmetFound.abbr);\n if (expanded) {\n this._emmetAcStartCol = emmetFound.start;\n const preview = expanded.replace(/\\n/g, '↵ ').slice(0, 60);\n emmetItems.push({ label: emmetFound.abbr, kind: 'emmet', detail: preview, body: expanded });\n }\n }\n }\n\n // Regular AC completions (keyword / snippet / in-file)\n const acItems: CompletionItem[] = prefix.length >= this._config.autocompletePrefixLength\n ? getSuggestions(doc, prefix, {\n language: this._config.language,\n extraKeywords: this._config.extraKeywords,\n extraTypes: this._config.extraTypes,\n completions: this._allCompletions(),\n replaceBuiltins: this._config.replaceBuiltins,\n maxResults: this._config.maxCompletions,\n provideCompletions: this._config.provideCompletions,\n }, cur.row, cur.col)\n : [];\n\n this._acItems = [...emmetItems, ...acItems];\n if (!this._acItems.length) { this._acHide(); return; }\n this._acSel = 0;\n this._renderAcPopup();\n }\n\n private _renderAcPopup(): void {\n const kindBadge = (k: string): string => {\n switch (k) {\n case 'kw': return 'K';\n case 'fn': return 'f';\n case 'typ': return 'T';\n case 'cls': return 'C';\n case 'snip': return 'S';\n case 'emmet': return 'E';\n default: return '·';\n }\n };\n\n const sel = this._acItems[this._acSel];\n\n // Description text for selected item: explicit description > body preview for snips > emmet preview\n let descText = '';\n if (sel?.description) {\n descText = sel.description;\n } else if (sel?.kind === 'snip' && sel.body) {\n descText = sel.body.replace(/\\$\\d/g, '▌');\n } else if (sel?.kind === 'emmet' && sel.body) {\n descText = sel.body;\n }\n\n const listHtml = this._acItems.map((item, i) => {\n const selected = i === this._acSel;\n return `<div class=\"sl-ac-item${selected ? ' sl-sel' : ''}\" data-i=\"${i}\" ` +\n `role=\"option\" aria-selected=\"${selected}\">` +\n `<span class=\"sl-ac-badge ${item.kind}\">${kindBadge(item.kind)}</span>` +\n `<span class=\"sl-ac-label\">${item.label}</span>` +\n `<span class=\"sl-ac-detail\">${item.detail ?? ''}</span>` +\n `</div>`;\n }).join('');\n\n const descPanel = descText\n ? `<div class=\"sl-ac-desc\"><pre class=\"sl-ac-desc-body\">${descText.replace(/</g, '&lt;')}</pre></div>`\n : '';\n\n this._acPopup.innerHTML =\n `<div class=\"sl-ac-list\">${listHtml}</div>` +\n descPanel;\n\n this._acPopup.style.display = 'flex';\n this._posAcPopup();\n\n // Scroll selected item into view within the list\n const listEl = this._acPopup.querySelector<HTMLElement>('.sl-ac-list');\n const selEl = this._acPopup.querySelector<HTMLElement>('.sl-ac-item.sl-sel');\n if (listEl && selEl) {\n const top = selEl.offsetTop;\n const bottom = top + selEl.offsetHeight;\n if (bottom > listEl.scrollTop + listEl.clientHeight) listEl.scrollTop = bottom - listEl.clientHeight;\n else if (top < listEl.scrollTop) listEl.scrollTop = top;\n }\n\n this._acPopup.querySelectorAll('.sl-ac-item').forEach(el => {\n el.addEventListener('mousedown', (e) => {\n e.preventDefault();\n this._acSel = parseInt((el as HTMLElement).dataset['i'] ?? '0', 10);\n this._acAccept();\n });\n });\n }\n\n private _posAcPopup(): void {\n const rect = this._editorEl.getBoundingClientRect();\n const vp = docToVisualPos(this._wm, this._tab.cur.row, this._tab.cur.col);\n const gw = this._config.showGutter ? this._config.gutterWidth : 0;\n const x = rect.left + gw + CODE_PADDING_LEFT + this._acStartCol * DEFAULT_CHAR_WIDTH;\n const y = rect.top + (vp.visRow * this._config.lineHeight - this._editorEl.scrollTop) + this._config.lineHeight + 2;\n const hasDesc = !!this._acPopup.querySelector('.sl-ac-desc');\n const popW = hasDesc ? 620 : 300;\n const popH = Math.min(this._acItems.length * 28 + 8, 320);\n const flipUp = y + popH > window.innerHeight - 16;\n this._acPopup.style.left = `${Math.min(x, window.innerWidth - popW - 16)}px`;\n this._acPopup.style.top = `${flipUp ? y - this._config.lineHeight - 2 - popH : y}px`;\n }\n\n private _acAccept(): void {\n const item = this._acItems[this._acSel];\n if (!item) return;\n this._acHide();\n if (item.kind === 'emmet' && item.body) {\n // Emmet abbreviation — the trigger may span characters outside the word prefix,\n // so we use the separately-tracked _emmetAcStartCol as the replacement start.\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n this._expandBodyAt(item.body, this._emmetAcStartCol);\n return;\n }\n if (item.body) {\n // Snippet item — delete the typed prefix then expand the body\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n this._expandBodyAt(item.body, this._acStartCol);\n return;\n }\n const suffix = item.label.slice(this._acPrefix.length);\n this._insertStr(suffix, false);\n this._rebuildWrapMap();\n clampCursor(this._tab);\n this._scrollIntoView();\n this._render();\n }\n\n // ── Emmet ─────────────────────────────────────────────────\n\n private _emmetCheck(): void {\n // Emmet suggestions are now surfaced in the unified _acPopup via _acTrigger().\n // This method only keeps _emmetExpanded in sync for any legacy Tab-fallback paths.\n this._emmetTip.style.display = 'none';\n if (!this._config.emmet) { this._emmetExpanded = null; return; }\n const { cur, doc } = this._tab;\n const line = doc[cur.row] ?? '';\n const found = findAbbrBefore(line, cur.col);\n if (!found) { this._emmetExpanded = null; return; }\n const result = expandEmmet(found.abbr);\n if (!result) { this._emmetExpanded = null; return; }\n this._emmetExpanded = { abbr: found.abbr, result, start: found.start };\n }\n\n private _emmetAccept(): boolean {\n if (!this._emmetExpanded || this._emmetTip.style.display === 'none') return false;\n const { abbr, result, start } = this._emmetExpanded;\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n this._emmetExpanded = null;\n this._emmetTip.style.display = 'none';\n this._expandBodyAt(result, start);\n void abbr;\n return true;\n }\n\n // ── Snippets / Completions ────────────────────────────────\n\n /** Returns built-in snippets for the current language merged with user completions.\n * When `replaceBuiltins` is true the language built-ins are suppressed so only\n * the caller-supplied completions (e.g. MDX_SNIPPETS) are active. */\n private _allCompletions(): CompletionItem[] {\n const builtins = this._config.replaceBuiltins\n ? []\n : getBuiltinSnippets(this._config.language);\n return [...builtins, ...this._config.completions];\n }\n\n private _snippetCheck(): void {\n // Snippet suggestions are now surfaced in the unified _acPopup via _acTrigger().\n // This method only keeps _snippetExpanded in sync for any legacy Tab-fallback paths.\n this._snippetTip.style.display = 'none';\n if (!this._config.snippetExpansion) { this._snippetExpanded = null; return; }\n const { cur, doc } = this._tab;\n const line = doc[cur.row] ?? '';\n const found = findSnippetTriggerBefore(line, cur.col, this._allCompletions());\n if (!found) { this._snippetExpanded = null; return; }\n this._snippetExpanded = { snippet: found.snippet, start: found.start };\n }\n\n private _snippetAccept(): boolean {\n if (!this._snippetExpanded || this._snippetTip.style.display === 'none') return false;\n const { snippet, start } = this._snippetExpanded;\n if (!snippet.body) return false;\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n this._snippetExpanded = null;\n this._snippetTip.style.display = 'none';\n this._expandBodyAt(snippet.body, start);\n return true;\n }\n\n /**\n * Expand a snippet/emmet body template at the current cursor position.\n * `triggerStart` is the column where the trigger word begins.\n * `cur.col` must be at the end of the trigger (emmet) or at `triggerStart`\n * when the prefix was already stripped (snippet accepted from popup).\n * Everything between `triggerStart` and `cur.col` is replaced by `body`.\n */\n private _expandBodyAt(body: string, triggerStart: number): void {\n const { doc, cur } = this._tab;\n const startRow = cur.row;\n const line = doc[cur.row] ?? '';\n const before = line.slice(0, triggerStart);\n const after = line.slice(cur.col);\n const indent = getIndent(line);\n\n // ── 1. Expand body into indented lines ────────────────\n const rawLines = body.split('\\n').map((l, i) => i === 0 ? l : indent + l);\n const fullRaw = rawLines.join('\\n');\n\n // ── 2. Locate ALL tab-stop markers ($0, $1, $2 …) BEFORE stripping ──\n // $0 is the VS Code convention for the final cursor position (goes last).\n // Everything else is ordered by its numeric value.\n const allStops: Array<{ n: number; row: number; col: number }> = [];\n const stopRe = /\\$(\\d+)/g;\n let sm: RegExpExecArray | null;\n while ((sm = stopRe.exec(fullRaw)) !== null) {\n const n = parseInt(sm[1]!, 10);\n const beforePos = fullRaw.slice(0, sm.index);\n const beforePosLines = beforePos.split('\\n');\n const rowOffset = beforePosLines.length - 1;\n const rawColInSeg = beforePosLines[rowOffset]!.length;\n // Subtract widths of any $n markers already stripped in this line segment\n const strippedWidth = (beforePosLines[rowOffset]!.match(/\\$\\d+/g) ?? []).join('').length;\n const docRow = startRow + rowOffset;\n const docCol = (rowOffset === 0 ? triggerStart : indent.length) + (rawColInSeg - strippedWidth);\n allStops.push({ n, row: docRow, col: docCol });\n }\n\n // Sort: $1, $2, … ascending, then $0 last (VS Code convention)\n allStops.sort((a, b) => {\n if (a.n === 0) return 1;\n if (b.n === 0) return -1;\n return a.n - b.n;\n });\n\n // ── 3. Strip ALL tab-stop markers from the body text ──\n const cleanLines = rawLines.map(l => l.replace(/\\$\\d+/g, ''));\n\n // ── 4. Splice cleaned lines into the document ─────────\n const newLines = cleanLines.length === 1\n ? [before + cleanLines[0] + after]\n : [before + cleanLines[0], ...cleanLines.slice(1, -1), cleanLines[cleanLines.length - 1]! + after];\n doc.splice(cur.row, 1, ...newLines);\n\n // ── 5. Start tab-stop session or fall back to $1-only ─\n if (allStops.length > 0) {\n this._snippetSession = { stops: allStops.map(s => ({ row: s.row, col: s.col })), idx: 0 };\n cur.row = allStops[0]!.row;\n cur.col = allStops[0]!.col;\n } else {\n // No tab stops — place cursor at end of last inserted line\n this._snippetSession = null;\n cur.row += newLines.length - 1;\n cur.col = (newLines[newLines.length - 1] ?? '').length - after.length;\n }\n\n this._tokenCache.clear();\n this._tab.dirty = true;\n this._rebuildWrapMap();\n clampCursor(this._tab);\n this._scrollIntoView();\n this._render();\n // Notify host that the document changed — snippet/emmet expansions are\n // content mutations and must fire onChange just like typed characters.\n this._config.onChange?.(joinLines(this._tab.doc));\n }\n\n // ── Theme picker ──────────────────────────────────────────\n\n private _openThemePicker(): void {\n const themes = this._themeManager.all;\n this._themePanel.innerHTML = `\n <div class=\"sl-theme-header\">\n <div class=\"sl-theme-title\">Color Theme</div>\n <div class=\"sl-theme-close\">✕</div>\n </div>\n <div class=\"sl-theme-list\">\n ${themes.map(t => `\n <div class=\"sl-theme-item${t.id === this._themeManager.activeId ? ' sl-active' : ''}\" data-id=\"${t.id}\">\n <div class=\"sl-theme-swatch\">\n ${t.tokens.bg0 ? `<span style=\"background:${t.tokens.bg0}\"></span>` : ''}\n <span style=\"background:${t.tokens.accent}\"></span>\n <span style=\"background:${t.tokens.tokStr}\"></span>\n <span style=\"background:${t.tokens.tokFn}\"></span>\n </div>\n <div>\n <div class=\"sl-theme-name\">${t.name}<span class=\"sl-theme-tag${t.light ? ' sl-light' : ''}\">${t.light ? 'Light' : 'Dark'}</span></div>\n <div class=\"sl-theme-desc\">${t.description}</div>\n </div>\n <div class=\"sl-theme-check\">✓</div>\n </div>\n `).join('')}\n </div>\n `;\n\n this._themeOverlay.style.display = 'block';\n\n this._themePanel.querySelector('.sl-theme-close')?.addEventListener('click', () => {\n this._themeOverlay.style.display = 'none';\n });\n this._themeOverlay.addEventListener('click', (e) => {\n if (e.target === this._themeOverlay) this._themeOverlay.style.display = 'none';\n }, { once: true });\n\n this._themePanel.querySelectorAll<HTMLElement>('.sl-theme-item').forEach(item => {\n item.addEventListener('click', () => {\n const id = item.dataset['id'] ?? '';\n this.setTheme(id);\n this._themePanel.querySelectorAll('.sl-theme-item').forEach(i => i.classList.remove('sl-active'));\n item.classList.add('sl-active');\n });\n });\n }\n\n // ── Event binding ─────────────────────────────────────────\n\n private _bindEditorEvents(): void {\n // Fold buttons — bound once here rather than re-adding on every _render().\n // _vpEl.innerHTML is replaced each render but _vpEl itself persists,\n // and event-delegation handles clicks on dynamically inserted .sl-fold-btn elements.\n this._vpEl.addEventListener('mousedown', this._onFoldBtnClick);\n\n // Mouse\n this._editorEl.addEventListener('mousedown', (e) => {\n if (e.button !== 0) return;\n e.preventDefault();\n this._focusInput();\n this._acHide();\n this._snippetSession = null;\n this._emmetTip.style.display = 'none';\n if (!e.altKey) {\n clearExtraCursors(this._mc);\n this._extraCursors = [];\n }\n const pos = this._posFromMouse(e);\n this._tab.cur = { ...pos };\n if (e.detail === 3) {\n // Triple-click: select line\n this._tab.sel = { ar: pos.row, ac: 0, fr: pos.row, fc: (this._tab.doc[pos.row] ?? '').length };\n this._tab.cur.col = this._tab.sel.fc;\n } else if (e.detail === 2 && this._config.wordSelection) {\n // Double-click: select word (only when wordSelection is enabled)\n const line = this._tab.doc[pos.row] ?? '';\n const s = wordStart(line, pos.col, this._isWordChar.bind(this));\n const eW = wordEnd(line, pos.col, this._isWordChar.bind(this));\n if (s !== eW) { this._tab.sel = { ar: pos.row, ac: s, fr: pos.row, fc: eW }; this._tab.cur.col = eW; }\n else this._tab.sel = null;\n } else {\n // Alt+click: add cursor\n if (e.altKey && this._config.multiCursor) {\n addCursor(this._mc, pos.row, pos.col, null);\n this._extraCursors = [...this._mc.cursors];\n this._render();\n return;\n }\n this._tab.sel = null;\n this._isDragging = true;\n this._dragAnchor = { ...pos };\n }\n clampCursor(this._tab);\n this._render();\n });\n\n this._editorEl.addEventListener('mousemove', (e) => {\n // Hover documentation — schedule on pointer rest\n if (this._config.hover && !this._hoverPinned && !this._isDragging) {\n this._scheduleHover(e);\n }\n\n // Drag selection\n if (!this._isDragging || !this._dragAnchor) return;\n const pos = this._posFromMouse(e);\n this._tab.cur = { ...pos };\n if (pos.row !== this._dragAnchor.row || pos.col !== this._dragAnchor.col) {\n this._tab.sel = { ar: this._dragAnchor.row, ac: this._dragAnchor.col, fr: pos.row, fc: pos.col };\n } else { this._tab.sel = null; }\n clampCursor(this._tab);\n this._render();\n });\n\n this._editorEl.addEventListener('mouseleave', () => {\n if (!this._hoverPinned) this._hideHover();\n });\n\n // Window-level events — stored as named refs so destroy() can remove them exactly.\n window.addEventListener('mouseup', this._onWinMouseUp);\n this._editorEl.addEventListener('scroll', this._onEditorScroll, { passive: true });\n window.addEventListener('resize', this._onWinResize);\n\n // Keyboard — keydown\n this._inputEl.addEventListener('keydown', (e) => this._onKeyDown(e));\n // Input (printable chars)\n this._inputEl.addEventListener('input', (e) => this._onInput(e as InputEvent));\n // Paste\n this._inputEl.addEventListener('paste', (e) => {\n e.preventDefault();\n if (this._config.readOnly) return;\n const text = (e.clipboardData ?? (window as unknown as { clipboardData: DataTransfer }).clipboardData)?.getData('text/plain');\n if (!text) return;\n this._insertStr(text, false);\n this._tokenCache.clear();\n this._rebuildWrapMap();\n clampCursor(this._tab);\n this._scrollIntoView();\n this._render();\n });\n\n // Focus/blur\n this._editorEl.addEventListener('mousedown', () => setTimeout(() => this._focusInput(), 0));\n this._inputEl.addEventListener('focus', () => this._config.onFocus?.());\n this._inputEl.addEventListener('blur', () => this._config.onBlur?.());\n }\n\n private _onKeyDown(e: KeyboardEvent): void {\n const ctrl = e.ctrlKey || e.metaKey;\n const shift = e.shiftKey;\n const alt = e.altKey;\n const ro = this._config.readOnly;\n\n // Dismiss hover on any keypress\n this._hideHover();\n\n // Autocomplete navigation\n if (this._acVisible()) {\n if (e.key === 'ArrowDown') { e.preventDefault(); this._acSel = Math.min(this._acItems.length - 1, this._acSel + 1); this._renderAcPopup(); return; }\n if (e.key === 'ArrowUp') { e.preventDefault(); this._acSel = Math.max(0, this._acSel - 1); this._renderAcPopup(); return; }\n if (e.key === 'Tab' || e.key === 'Enter') { e.preventDefault(); this._acAccept(); return; }\n if (e.key === 'Escape') { this._acHide(); return; }\n }\n\n // Word wrap toggle: Alt+Z (Option+Z = Ω on Mac)\n if (alt && (e.key === 'z' || e.key === 'Z' || e.key === '\\u03a9')) { e.preventDefault(); this._toggleWrap(); return; }\n\n // Standard shortcuts\n if (ctrl && e.key === 'z' && !shift) { e.preventDefault(); if (!ro) this.undo(); return; }\n if (ctrl && (e.key === 'y' || (shift && e.key === 'z'))) { e.preventDefault(); if (!ro) this.redo(); return; }\n if (ctrl && e.key === 'a') { e.preventDefault(); this._selectAll(); return; }\n if (ctrl && e.key === 'c') { e.preventDefault(); this._doCopy(); return; }\n if (ctrl && e.key === 'x') { e.preventDefault(); if (!ro) this._doCut(); return; }\n if (ctrl && e.key === 'f') { e.preventDefault(); if (this._config.find) this._openFind(false); return; }\n if (ctrl && e.key === 'h') { e.preventDefault(); if (this._config.find && this._config.findReplace) this._openFind(true); return; }\n if (ctrl && e.key === 'g') { e.preventDefault(); if (this._config.goToLine) this._openGoToLine(); return; }\n if (ctrl && e.key === 'd') { e.preventDefault(); if (!ro && this._config.multiCursor) this._ctrlD(); return; }\n if (ctrl && shift && e.key === 'd') { e.preventDefault(); if (!ro) this._duplicateLine(); return; }\n if (ctrl && e.key === '/') { e.preventDefault(); if (!ro) this._toggleComment(); return; }\n if (ctrl && e.key === 'k') { e.preventDefault(); if (!ro) this._deleteLine(); return; }\n\n if (e.key === 'Escape') {\n this._tab.sel = null;\n this._acHide();\n this._closeFind();\n this._closeGoToLine();\n this._emmetTip.style.display = 'none';\n this._snippetTip.style.display = 'none';\n this._snippetExpanded = null;\n this._snippetSession = null;\n clearExtraCursors(this._mc);\n this._extraCursors = [];\n this._mc.searchWord = '';\n this._render();\n return;\n }\n\n if (ro) { this._handleArrowKeys(e, ctrl, shift); return; }\n\n if (e.key === 'Tab') {\n e.preventDefault();\n // Snippet tab-stop session navigation (Tab / Shift+Tab)\n if (this._snippetSession) {\n if (shift) {\n if (this._snippetSession.idx > 0) {\n this._snippetSession.idx--;\n const stop = this._snippetSession.stops[this._snippetSession.idx]!;\n this._tab.cur.row = stop.row; this._tab.cur.col = stop.col;\n this._tab.sel = null;\n clampCursor(this._tab); this._scrollIntoView(); this._render();\n }\n } else {\n this._snippetSession.idx++;\n if (this._snippetSession.idx >= this._snippetSession.stops.length) {\n this._snippetSession = null;\n } else {\n const stop = this._snippetSession.stops[this._snippetSession.idx]!;\n this._tab.cur.row = stop.row; this._tab.cur.col = stop.col;\n this._tab.sel = null;\n clampCursor(this._tab); this._scrollIntoView(); this._render();\n }\n }\n return;\n }\n if (!shift && this._emmetAccept()) return;\n if (!shift && this._snippetAccept()) return;\n if (shift) this._unindentSel();\n else this._indentSel();\n clampCursor(this._tab);\n this._scrollIntoView();\n this._rebuildWrapMap();\n this._render();\n return;\n }\n\n if (e.key === 'Backspace') {\n e.preventDefault();\n if (this._extraCursors.length) {\n this._snippetSession = null;\n const res = multiBackspace(\n this._tab.doc, this._tab.cur.row, this._tab.cur.col, this._extraCursors,\n );\n this._tab.doc = res.doc;\n this._tab.cur.row = res.primaryRow;\n this._tab.cur.col = res.primaryCol;\n this._extraCursors = res.extraCursors;\n this._mc.cursors = res.extraCursors;\n } else {\n // Keep session alive if backspacing within current stop's line; adjust stop positions\n if (this._snippetSession) {\n const curStop = this._snippetSession.stops[this._snippetSession.idx]!;\n if (this._tab.cur.row === curStop.row && this._tab.cur.col > curStop.col) {\n // Will remove one char to the left; shift stops on this row right of cursor by -1\n for (let i = this._snippetSession.idx + 1; i < this._snippetSession.stops.length; i++) {\n const s = this._snippetSession.stops[i]!;\n if (s.row === curStop.row && s.col >= this._tab.cur.col) s.col--;\n }\n curStop.col--;\n } else {\n this._snippetSession = null;\n }\n }\n this._doBackspace();\n }\n this._tokenCache.clear();\n this._rebuildWrapMap();\n clampCursor(this._tab);\n this._scrollIntoView();\n this._render();\n this._acTrigger();\n this._emmetCheck();\n this._snippetCheck();\n this._config.onChange?.(joinLines(this._tab.doc));\n return;\n }\n\n if (e.key === 'Delete') { e.preventDefault(); this._snippetSession = null; this._doDelete(); this._tokenCache.clear(); this._rebuildWrapMap(); clampCursor(this._tab); this._scrollIntoView(); this._render(); this._config.onChange?.(joinLines(this._tab.doc)); return; }\n if (e.key === 'Enter') { e.preventDefault(); this._snippetSession = null; this._doEnter(); this._tokenCache.clear(); this._rebuildWrapMap(); clampCursor(this._tab); this._scrollIntoView(); this._render(); this._config.onChange?.(joinLines(this._tab.doc)); return; }\n\n // Auto-close pairs\n if (!ctrl && !alt && this._config.autoClosePairs[e.key]) {\n e.preventDefault();\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n if (this._tab.sel) this._tab.cur = deleteSelection(this._tab);\n const { doc, cur } = this._tab;\n const line = doc[cur.row] ?? '';\n doc[cur.row] = line.slice(0, cur.col) + e.key + this._config.autoClosePairs[e.key] + line.slice(cur.col);\n cur.col++;\n this._tokenCache.invalidateLine(cur.row, this._wm.segments[cur.row]?.length ?? 1);\n this._tab.dirty = true;\n this._rebuildWrapMap();\n clampCursor(this._tab);\n this._scrollIntoView();\n this._render();\n this._config.onChange?.(joinLines(this._tab.doc));\n return;\n }\n\n // Skip-over close chars\n if (!ctrl && !alt && Object.values(this._config.autoClosePairs as Record<string, string>).includes(e.key)) {\n const { doc, cur } = this._tab;\n const line = doc[cur.row] ?? '';\n if (line[cur.col] === e.key) { e.preventDefault(); cur.col++; clampCursor(this._tab); this._scrollIntoView(); this._render(); return; }\n }\n\n // Duplicate line up/down: Shift+Alt+Up / Shift+Alt+Down\n if (shift && alt && !ctrl && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n e.preventDefault();\n this._duplicateLines(e.key === 'ArrowDown');\n return;\n }\n\n // Move line up/down: Alt+Up / Alt+Down (only in non-readOnly, and this code path is non-readOnly)\n if (alt && !ctrl && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n e.preventDefault();\n this._moveLines(e.key === 'ArrowUp');\n return;\n }\n\n // Arrow keys + navigation\n this._handleArrowKeys(e, ctrl, shift);\n }\n\n private _handleArrowKeys(e: KeyboardEvent, _ctrl: boolean, shift: boolean): void {\n const { doc, cur } = this._tab;\n const LH = this._config.lineHeight;\n // Distinguish Cmd (Mac) from Ctrl (Windows/Linux) for navigation semantics\n const meta = e.metaKey; // Cmd on Mac: line/doc boundary navigation\n const ctrlOnly = e.ctrlKey; // Ctrl on Windows: word/doc boundary navigation\n const alt = e.altKey; // Option on Mac / Alt on Windows: word navigation\n\n const moveTo = (nr: number, nc: number) => {\n if (shift) {\n if (!this._tab.sel) this._tab.sel = { ar: cur.row, ac: cur.col, fr: cur.row, fc: cur.col };\n cur.row = nr; cur.col = nc;\n const s = this._tab.sel!;\n s.fr = nr; s.fc = nc;\n if (s.ar === s.fr && s.ac === s.fc) this._tab.sel = null;\n } else { this._tab.sel = null; cur.row = nr; cur.col = nc; }\n };\n\n const smartHome = (row: number) => {\n const line = doc[row] ?? '';\n const fnw = line.search(/\\S/);\n return fnw === -1 ? 0 : cur.col === fnw ? 0 : fnw;\n };\n\n const docEnd = () => ({ row: doc.length - 1, col: (doc[doc.length - 1] ?? '').length });\n\n switch (e.key) {\n case 'ArrowRight': e.preventDefault();\n if (this._tab.sel && !shift) { const ns = normaliseSelection(this._tab.sel); cur.row = ns.fr; cur.col = ns.fc; this._tab.sel = null; break; }\n if (meta) {\n // Cmd+Right (Mac): go to end of line\n moveTo(cur.row, (doc[cur.row] ?? '').length);\n } else if (ctrlOnly || alt) {\n // Ctrl+Right (Windows) or Option+Right (Mac): word skip right\n const line = doc[cur.row] ?? '';\n if (cur.col >= line.length) {\n // At end of line: jump to start of next line (matches VS Code behaviour)\n if (cur.row < doc.length - 1) moveTo(cur.row + 1, 0);\n } else {\n const c = this._wordSkipRight(line, cur.col); moveTo(cur.row, c);\n }\n } else if (cur.col < (doc[cur.row] ?? '').length) moveTo(cur.row, cur.col + 1);\n else if (cur.row < doc.length - 1) moveTo(cur.row + 1, 0);\n break;\n case 'ArrowLeft': e.preventDefault();\n if (this._tab.sel && !shift) { const ns = normaliseSelection(this._tab.sel); cur.row = ns.ar; cur.col = ns.ac; this._tab.sel = null; break; }\n if (meta) {\n // Cmd+Left (Mac): go to start of line (smart home)\n moveTo(cur.row, smartHome(cur.row));\n } else if (ctrlOnly || alt) {\n // Ctrl+Left (Windows) or Option+Left (Mac): word skip left\n if (cur.col === 0) {\n // At start of line: jump to end of previous line (matches VS Code behaviour)\n if (cur.row > 0) moveTo(cur.row - 1, (doc[cur.row - 1] ?? '').length);\n } else {\n const c = this._wordSkipLeft(doc[cur.row] ?? '', cur.col); moveTo(cur.row, c);\n }\n } else if (cur.col > 0) moveTo(cur.row, cur.col - 1);\n else if (cur.row > 0) moveTo(cur.row - 1, (doc[cur.row - 1] ?? '').length);\n break;\n case 'ArrowDown': e.preventDefault();\n if (meta) {\n // Cmd+Down (Mac): go to end of document\n const ed = docEnd(); moveTo(ed.row, ed.col);\n } else if (this._config.wordWrap) {\n const vp = docToVisualPos(this._wm, cur.row, cur.col);\n const nv = Math.min(this._wm.visualRows.length - 1, vp.visRow + 1);\n const nd = visualToDocPos(this._wm, nv, Math.min(vp.colInSeg, (this._wm.visualRows[nv]?.text ?? '').length));\n moveTo(nd.row, nd.col);\n } else { const nr = Math.min(doc.length - 1, cur.row + 1); moveTo(nr, Math.min(cur.col, (doc[nr] ?? '').length)); }\n break;\n case 'ArrowUp': e.preventDefault();\n if (meta) {\n // Cmd+Up (Mac): go to start of document\n moveTo(0, 0);\n } else if (this._config.wordWrap) {\n const vp = docToVisualPos(this._wm, cur.row, cur.col);\n const pv = Math.max(0, vp.visRow - 1);\n const pd = visualToDocPos(this._wm, pv, Math.min(vp.colInSeg, (this._wm.visualRows[pv]?.text ?? '').length));\n moveTo(pd.row, pd.col);\n } else { const nr = Math.max(0, cur.row - 1); moveTo(nr, Math.min(cur.col, (doc[nr] ?? '').length)); }\n break;\n case 'Home': e.preventDefault();\n if (ctrlOnly) {\n // Ctrl+Home (Windows): go to start of document\n moveTo(0, 0);\n } else {\n moveTo(cur.row, smartHome(cur.row));\n }\n break;\n case 'End': e.preventDefault();\n if (ctrlOnly) {\n // Ctrl+End (Windows): go to end of document\n const ed = docEnd(); moveTo(ed.row, ed.col);\n } else {\n moveTo(cur.row, (doc[cur.row] ?? '').length);\n }\n break;\n case 'PageDown': e.preventDefault(); { const rows = Math.max(1, Math.floor(this._editorEl.clientHeight / LH) - 1); const nr = Math.min(doc.length - 1, cur.row + rows); moveTo(nr, Math.min(cur.col, (doc[nr] ?? '').length)); this._editorEl.scrollTop += this._editorEl.clientHeight - LH; break; }\n case 'PageUp': e.preventDefault(); { const rows = Math.max(1, Math.floor(this._editorEl.clientHeight / LH) - 1); const nr = Math.max(0, cur.row - rows); moveTo(nr, Math.min(cur.col, (doc[nr] ?? '').length)); this._editorEl.scrollTop -= this._editorEl.clientHeight - LH; break; }\n default: return;\n }\n clampCursor(this._tab);\n this._scrollIntoView();\n this._acHide();\n this._config.onCursorChange?.({ ...this._tab.cur });\n this._config.onSelectionChange?.(this._tab.sel ? { ...this._tab.sel } : null);\n this._render();\n }\n\n private _isWordChar(ch: string): boolean {\n const sep = this._config.wordSeparators;\n if (!sep) return /[\\w$]/.test(ch);\n return ch.trim() !== '' && !sep.includes(ch);\n }\n\n private _wordSkipRight(line: string, col: number): number {\n let c = col;\n const len = line.length;\n // Skip leading whitespace\n while (c < len && /\\s/.test(line[c]!)) c++;\n if (c >= len) return c;\n // Group by character class: word chars (\\w) or punctuation (non-word non-space)\n if (/\\w/.test(line[c]!)) {\n while (c < len && /\\w/.test(line[c]!)) c++;\n } else {\n while (c < len && /[^\\w\\s]/.test(line[c]!)) c++;\n }\n return c;\n }\n\n private _wordSkipLeft(line: string, col: number): number {\n let c = col;\n // Skip trailing whitespace\n while (c > 0 && /\\s/.test(line[c - 1]!)) c--;\n if (c <= 0) return c;\n // Group by character class: word chars (\\w) or punctuation (non-word non-space)\n if (/\\w/.test(line[c - 1]!)) {\n while (c > 0 && /\\w/.test(line[c - 1]!)) c--;\n } else {\n while (c > 0 && /[^\\w\\s]/.test(line[c - 1]!)) c--;\n }\n return c;\n }\n\n // ── Move lines ────────────────────────────────────────────\n\n private _duplicateLines(down: boolean): void {\n const { doc, cur } = this._tab;\n const sel = this._tab.sel;\n\n let firstLine = cur.row;\n let lastLine = cur.row;\n if (sel) {\n const ns = normaliseSelection(sel);\n firstLine = ns.ar;\n lastLine = ns.fr;\n if (ns.fc === 0 && ns.fr > ns.ar) lastLine--;\n }\n\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n const block = doc.slice(firstLine, lastLine + 1);\n\n if (down) {\n // Insert copy below; move cursor to the duplicate (same relative row + col)\n doc.splice(lastLine + 1, 0, ...block);\n cur.row += block.length;\n if (sel) { sel.ar += block.length; sel.fr += block.length; }\n } else {\n // Insert copy above; original shifts down but cursor stays at same row\n // (the copy now occupies [firstLine..lastLine], exactly where cursor already is)\n doc.splice(firstLine, 0, ...block);\n }\n\n this._tab.dirty = true;\n this._tokenCache.clear();\n this._rebuildWrapMap();\n clampCursor(this._tab);\n this._scrollIntoView();\n this._render();\n this._config.onChange?.(joinLines(this._tab.doc));\n this._config.onCursorChange?.({ ...this._tab.cur });\n }\n\n private _moveLines(up: boolean): void {\n const { doc, cur } = this._tab;\n const sel = this._tab.sel;\n\n // Determine the contiguous block of lines to move\n let firstLine = cur.row;\n let lastLine = cur.row;\n if (sel) {\n const ns = normaliseSelection(sel);\n firstLine = ns.ar;\n lastLine = ns.fr;\n // If selection ends exactly at column 0, don't include that last line\n if (ns.fc === 0 && ns.fr > ns.ar) lastLine--;\n }\n\n if (up) {\n if (firstLine === 0) return; // already at the top\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n // Remove the block, insert it one position above\n const block = doc.splice(firstLine, lastLine - firstLine + 1);\n doc.splice(firstLine - 1, 0, ...block);\n cur.row--;\n if (sel) { sel.ar--; sel.fr--; }\n } else {\n if (lastLine >= doc.length - 1) return; // already at the bottom\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n // Remove the block, insert it one position below\n const block = doc.splice(firstLine, lastLine - firstLine + 1);\n doc.splice(firstLine + 1, 0, ...block);\n cur.row++;\n if (sel) { sel.ar++; sel.fr++; }\n }\n\n this._tab.dirty = true;\n this._tokenCache.clear();\n this._rebuildWrapMap();\n clampCursor(this._tab);\n this._scrollIntoView();\n this._render();\n this._config.onChange?.(joinLines(this._tab.doc));\n this._config.onCursorChange?.({ ...this._tab.cur });\n }\n\n // ── Hover documentation ────────────────────────────────────\n\n private _scheduleHover(e: MouseEvent): void {\n // Hide existing tooltip immediately when mouse moves\n if (this._hoverTip.style.display !== 'none') {\n this._hoverTip.style.display = 'none';\n }\n if (this._hoverTimer !== null) { clearTimeout(this._hoverTimer); this._hoverTimer = null; }\n const { clientX, clientY } = e;\n this._hoverTimer = setTimeout(() => {\n this._hoverTimer = null;\n this._doHover(clientX, clientY);\n }, 500);\n }\n\n private _doHover(clientX: number, clientY: number): void {\n if (!this._config.hover) return;\n\n // Map pixel coords to document position\n const rect = this._editorEl.getBoundingClientRect();\n const y = clientY - rect.top + this._editorEl.scrollTop;\n const gw = this._config.showGutter ? this._config.gutterWidth : 0;\n const x = clientX - rect.left - gw - CODE_PADDING_LEFT;\n const LH = this._config.lineHeight;\n const visIdx = Math.max(0, Math.min(this._wm.visualRows.length - 1, Math.floor(y / LH)));\n const col = Math.max(0, Math.min(\n (this._wm.visualRows[visIdx]?.text ?? '').length,\n Math.round(x / DEFAULT_CHAR_WIDTH),\n ));\n const pos = visualToDocPos(this._wm, visIdx, col);\n const line = this._tab.doc[pos.row] ?? '';\n\n // Extract the full identifier (e.g. \"console.log\" when hovering \"log\")\n const identifier = getHoverIdentifier(line, pos.col);\n if (!identifier) return;\n\n // 1. Built-in doc lookup\n let doc: HoverDoc | null = lookupHover(identifier, this._config.language);\n\n // 2. Search user-provided completions for a matching label with description/detail\n if (!doc) {\n const match = this._config.completions.find(c => c.label === identifier);\n if (match && (match.description || match.detail)) {\n doc = {\n title: match.label,\n type: match.detail,\n body: match.description ?? '',\n };\n }\n }\n\n // 3. Fall through to provideHover callback\n if (!doc) {\n const result = this._config.provideHover?.({\n word: identifier,\n row: pos.row,\n col: pos.col,\n line,\n language: this._config.language,\n doc: this._tab.doc,\n });\n if (result) doc = result;\n }\n\n if (!doc) return;\n this._showHoverTip(doc, clientX, clientY);\n }\n\n private _showHoverTip(doc: HoverDoc, clientX: number, clientY: number): void {\n const tip = this._hoverTip;\n\n let html = '<div class=\"sl-ht-sig\">';\n html += `<span class=\"sl-ht-title\">${escapeHtml(doc.title)}</span>`;\n if (doc.type) html += `<code class=\"sl-ht-type\">${escapeHtml(doc.type)}</code>`;\n html += '</div>';\n if (doc.title && doc.body) html += '<div class=\"sl-ht-divider\"></div>';\n if (doc.body) html += `<div class=\"sl-ht-body\">${escapeHtml(doc.body)}</div>`;\n\n tip.innerHTML = html;\n tip.style.display = 'block';\n\n // Position: below cursor, flip up if near viewport bottom\n const margin = 12;\n const offsetY = 18;\n const tipW = tip.offsetWidth || 300;\n const tipH = tip.offsetHeight || 80;\n\n let left = clientX;\n let top = clientY + offsetY;\n if (top + tipH > window.innerHeight - margin) top = clientY - tipH - 8;\n if (left + tipW > window.innerWidth - margin) left = window.innerWidth - tipW - margin;\n if (left < margin) left = margin;\n\n tip.style.left = `${left}px`;\n tip.style.top = `${Math.max(margin, top)}px`;\n }\n\n private _hideHover(): void {\n if (this._hoverTimer !== null) { clearTimeout(this._hoverTimer); this._hoverTimer = null; }\n this._hoverPinned = false;\n this._hoverTip.style.display = 'none';\n }\n\n private _onInput(e: InputEvent): void {\n if (this._config.readOnly) { (e.target as HTMLTextAreaElement).value = ''; return; }\n const target = e.target as HTMLTextAreaElement;\n const val = target.value;\n target.value = '';\n if (!val) return;\n // Block Mac Option-key special characters\n if (val === '\\u03a9') return;\n const printable = val.replace(/[\\x00-\\x08\\x0a-\\x1f\\x7f]/g, '');\n if (!printable) return;\n\n if (this._extraCursors.length) {\n // Multi-cursor edit always exits any active snippet session\n this._snippetSession = null;\n const res = multiInsert(\n this._tab.doc, this._tab.cur.row, this._tab.cur.col,\n this._extraCursors, printable,\n );\n this._tab.doc = res.doc;\n this._tab.cur.row = res.primaryRow;\n this._tab.cur.col = res.primaryCol;\n this._extraCursors = res.extraCursors;\n this._mc.cursors = res.extraCursors;\n this._tab.dirty = true;\n this._config.onChange?.(joinLines(this._tab.doc));\n } else {\n // Snapshot stop positions before insert to compute delta\n const preRow = this._tab.cur.row;\n const preCol = this._tab.cur.col;\n this._insertStr(printable, true);\n // Keep snippet session alive if typing remains on the same row as current stop.\n // printable never contains newlines (stripped above), so row won't change.\n if (this._snippetSession) {\n const session = this._snippetSession;\n const curStop = session.stops[session.idx]!;\n if (this._tab.cur.row === curStop.row) {\n const delta = this._tab.cur.col - preCol; // chars inserted\n // Shift all subsequent stops that sit to the right of the insertion point\n for (let i = session.idx + 1; i < session.stops.length; i++) {\n const s = session.stops[i]!;\n if (s.row === preRow && s.col >= preCol) s.col += delta;\n }\n // Track cursor into the current stop anchor\n curStop.col = this._tab.cur.col;\n } else {\n this._snippetSession = null;\n }\n }\n }\n\n this._tokenCache.clear();\n this._rebuildWrapMap();\n clampCursor(this._tab);\n this._scrollIntoView();\n this._render();\n this._acTrigger();\n this._emmetCheck();\n this._snippetCheck();\n this._config.onCursorChange?.({ ...this._tab.cur });\n }\n\n private _ctrlD(): void {\n if (!this._config.multiCursor) return;\n const result = selectNextOccurrence(\n this._mc, this._tab.doc, this._tab.cur.row, this._tab.cur.col, this._tab.sel,\n );\n if (!result) return;\n\n if (!this._mc.cursors.length || result.word !== this._mc.searchWord) {\n // First press: just select the word on primary cursor\n this._tab.sel = result.sel;\n this._tab.cur.col = result.col;\n } else {\n // Subsequent press: add a new cursor\n addCursor(this._mc, result.row, result.col, result.sel);\n this._extraCursors = [...this._mc.cursors];\n }\n this._mc.searchWord = result.word;\n this._mc.lastMatchRow = result.row;\n this._mc.lastMatchCol = result.col;\n this._scrollIntoView();\n this._render();\n }\n\n // ── Find event binding ────────────────────────────────────\n\n private _bindFindEvents(): void {\n this._findInput.addEventListener('input', () => {\n this._runFind(this._findInput.value);\n this._findIdx = -1;\n if (this._findMatches.length) this._navFind(1);\n else { this._findCount.textContent = '0/0'; this._render(); }\n });\n this._findInput.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') { e.shiftKey ? this._navFind(-1) : this._navFind(1); }\n else if (e.key === 'Escape') this._closeFind();\n e.stopPropagation();\n });\n this._replaceInput.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') this._doReplaceOne();\n else if (e.key === 'Escape') this._closeFind();\n e.stopPropagation();\n });\n\n this._findBar.querySelector('.sl-find-prev')?.addEventListener('click', () => this._navFind(-1));\n this._findBar.querySelector('.sl-find-next')?.addEventListener('click', () => this._navFind(1));\n this._findBar.querySelector('.sl-find-close')?.addEventListener('click', () => this._closeFind());\n this._findBar.querySelector('.sl-find-case')?.addEventListener('click', (e) => {\n this._findCaseSensitive = !this._findCaseSensitive;\n (e.target as HTMLElement).classList.toggle('sl-active', this._findCaseSensitive);\n this._runFind(this._findInput.value); this._findIdx = -1; if (this._findMatches.length) this._navFind(1); else { this._findCount.textContent = '0/0'; this._render(); }\n });\n this._findBar.querySelector('.sl-find-regex')?.addEventListener('click', (e) => {\n this._findRegex = !this._findRegex;\n (e.target as HTMLElement).classList.toggle('sl-active', this._findRegex);\n this._runFind(this._findInput.value); this._findIdx = -1; if (this._findMatches.length) this._navFind(1); else { this._findCount.textContent = '0/0'; this._render(); }\n });\n this._findBar.querySelector('.sl-replace-one')?.addEventListener('click', () => this._doReplaceOne());\n this._findBar.querySelector('.sl-replace-all')?.addEventListener('click', () => this._doReplaceAll());\n }\n\n private _doReplaceOne(): void {\n if (this._findIdx < 0 || !this._findMatches.length) return;\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n this._tab.doc = replaceOne(this._tab.doc, this._findMatches, this._findIdx, this._replaceInput.value);\n this._tokenCache.clear();\n this._tab.dirty = true;\n this._runFind(this._findInput.value);\n if (this._findMatches.length) { if (this._findIdx >= this._findMatches.length) this._findIdx = 0; this._navFind(0 as 1); }\n else { this._findCount.textContent = '0/0'; this._rebuildWrapMap(); this._render(); }\n this._config.onChange?.(joinLines(this._tab.doc));\n }\n\n private _doReplaceAll(): void {\n if (!this._findMatches.length) return;\n const count = this._findMatches.length;\n pushSnapshot(this._tab, this._config.maxUndoHistory);\n this._tab.doc = replaceAll(this._tab.doc, this._findMatches, this._replaceInput.value);\n this._tokenCache.clear();\n this._tab.dirty = true;\n this._findMatches = [];\n this._findIdx = -1;\n this._findCount.textContent = `0/0 (${count} replaced)`;\n this._rebuildWrapMap();\n this._render();\n this._config.onChange?.(joinLines(this._tab.doc));\n }\n\n // ── Minimap events ────────────────────────────────────────\n\n private _bindMinimapEvents(): void {\n const wrapEl = this._minimapWrap;\n\n wrapEl.addEventListener('mousemove', (e) => {\n if (this._mmDragMode !== 'none') return;\n const y = e.clientY - wrapEl.getBoundingClientRect().top;\n const { sliderTop, sliderHeight } = computeMinimapState(\n this._tab.doc.length, this._editorEl.scrollTop,\n this._editorEl.clientHeight, wrapEl.clientHeight, this._config.lineHeight,\n );\n wrapEl.style.cursor = y >= sliderTop && y <= sliderTop + sliderHeight ? 'grab' : 'pointer';\n });\n\n wrapEl.addEventListener('mousedown', (e) => {\n e.preventDefault();\n const wH = wrapEl.clientHeight;\n const y = e.clientY - wrapEl.getBoundingClientRect().top;\n const { sliderTop, sliderHeight } = computeMinimapState(\n this._tab.doc.length, this._editorEl.scrollTop,\n this._editorEl.clientHeight, wH, this._config.lineHeight,\n );\n\n if (y >= sliderTop && y <= sliderTop + sliderHeight) {\n this._mmDragMode = 'slider';\n this._mmSliderOffset = y - sliderTop;\n this._mmDragStartY = e.clientY;\n this._mmDragStartScroll = this._editorEl.scrollTop;\n wrapEl.style.cursor = 'grabbing';\n } else {\n this._mmDragMode = 'jump';\n const newScroll = minimapClickToEditorScroll(\n y, this._tab.doc.length, this._editorEl.scrollTop,\n this._editorEl.clientHeight, wH, this._config.lineHeight,\n );\n this._editorEl.scrollTop = newScroll;\n this._mmDragStartY = e.clientY;\n this._mmDragStartScroll = newScroll;\n this._render();\n }\n });\n\n // Window-level minimap events — use stored refs so destroy() can clean them up.\n window.addEventListener('mousemove', this._onWinMmMouseMove);\n window.addEventListener('mouseup', this._onWinMmMouseUp);\n }\n}\n","// ─────────────────────────────────────────────────────────────\n// syncline-editor · index.ts\n// Public API entry point.\n// ─────────────────────────────────────────────────────────────\n\nexport { SynclineEditor } from './SynclineEditor.js';\n\n// ── Types ───────────────────────────────────────────────────\n\nexport type {\n Language, CompletionItem, CompletionKind, CompletionContext,\n CursorPosition, Selection, HoverDoc, HoverContext,\n FindMatch, ExtraCursor, EditorTab, HistorySnapshot,\n VisualRow, TokenClass, TokenSegment,\n MinimapColors, ThemeTokens, TokenColors, ThemeDefinition,\n EditorConfig, EditorAPI,\n} from './types/index.js';\n\n// ── Cache metrics ───────────────────────────────────────────\n\nexport type { CacheMetrics } from './core/tokeniser.js';\n\n// ── Theme constants ─────────────────────────────────────────\n\nexport {\n THEME_VR_DARK, THEME_VSCODE_DARK, THEME_MONOKAI, THEME_DRACULA,\n THEME_GITHUB_LIGHT, THEME_SOLARIZED_LIGHT, THEME_MDX_DARK, THEME_MDX_LIGHT,\n BUILT_IN_THEMES,\n} from './themes/built-in-themes.js';\n\n// ── Factory ─────────────────────────────────────────────────\n\nimport { SynclineEditor } from './SynclineEditor.js';\nimport type { EditorConfig, EditorAPI } from './types/index.js';\n\n/**\n * Quick factory function for creating an editor instance.\n *\n * @param container The DOM element to mount the editor in.\n * @param config Optional editor configuration.\n * @returns The editor API.\n */\nexport function createEditor(container: HTMLElement, config?: EditorConfig): EditorAPI {\n return new SynclineEditor(container, config);\n}"],"names":["LANGUAGE_COMMENT_TOKEN","KEYWORDS_TS","KEYWORDS_JS","KEYWORDS_CSS","KEYWORDS_JSON","KEYWORDS_MD","TYPES_TS","TYPES_JS","TYPES_CSS","TYPES_JSON","TYPES_MD","LANGUAGE_KEYWORDS","LANGUAGE_TYPES","createTab","fileId","lines","pushSnapshot","tab","maxHistory","snap","applyUndo","current","prev","applyRedo","next","clampCursor","doc","cur","normaliseSelection","sel","ar","ac","fr","fc","selectionOnLine","docLine","lineLength","ns","selectionCharCount","n","r","line","from","to","getSelectedText","deleteSelection","before","after","wrapLine","text","wrapWidth","enabled","segs","i","end","breakAt","j","buildWrapMap","wrapEnabled","foldedLines","segments","visualRows","docToVisArr","skipUntil","d","segIdx","docToVisualPos","wm","row","col","rem","s","visualToDocPos","visIdx","colInSeg","_a","vr","tokeniseLine","opts","_b","len","push","cls","start","baseKws","baseTypes","kws","types","q","word","buildCharClasses","arr","seg","c","TokenCache","maxSize","__publicField","key","entry","segCount","THEME_VR_DARK","THEME_VSCODE_DARK","THEME_MONOKAI","THEME_DRACULA","THEME_GITHUB_LIGHT","THEME_SOLARIZED_LIGHT","THEME_MDX_DARK","THEME_MDX_LIGHT","BUILT_IN_THEMES","TOKEN_TO_VAR","ThemeManager","root","theme","idOrDef","tokens","style","cssVar","EDITOR_STYLES","el","tag","className","attrs","e","escapeHtml","getCssVar","name","hexToRgba","hex","alpha","clean","g","b","splitLines","joinLines","getIndent","spaces","isWordChar","ch","wordStart","isWord","wordEnd","throttle","fn","ms","last","timer","args","now","remaining","BOUNDS","clampNum","value","min","max","fallback","validateConfig","config","out","bounds","OPEN_MAP","CLOSE_MAP","findBracketMatch","cursor","charCol","close","depth","l","open","isFoldable","net","findFoldEnd","toggleFold","SELF_CLOSE","expandEmmet","abbr","trimmed","result","parseAbbr","idx","buildTag","a","repMatch","_","spec","inner","idMatch","clsMatch","attrMatch","findAbbrBefore","TS_JS_SNIPPETS","CSS_SNIPPETS","GENERAL_SNIPPETS","getBuiltinSnippets","language","items","findSnippetTriggerBefore","snippets","found","createMultiCursorState","addCursor","state","clearExtraCursors","multiInsert","primaryRow","primaryCol","extraCursors","all","newDoc","newPrimaryRow","newPrimaryCol","newExtra","other","multiBackspace","selectNextOccurrence","currentSel","startRow","startCol","ci","wb","wa","endAt","findAll","query","matches","re","m","hay","needle","replaceOne","matchIdx","replacement","replaceAll","nextMatchIndex","currentIdx","direction","computeWordHighlights","curRow","curCol","results","BUILTIN_FNS_TS_JS","BUILTIN_FNS_CSS","BUILTIN_FNS_BY_LANG","buildBaseCompletions","extraKeywords","extraTypes","kwSet","typeSet","builtins","w","extractDocWords","exclude","words","matchesLanguage","item","getSuggestions","prefix","lp","completions","replaceBuiltins","maxResults","userSnippets","userRegular","snippetItems","base","ctx","provided","err","baseSet","baseMatches","snippetSet","docItems","getPrefixAt","allowHyphen","getHoverIdentifier","isIdChar","objEnd","objStart","DOCS","lookupHover","identifier","renderVisualRow","_c","_d","curVisRow","foldable","isCurVisRow","isCurDocLine","isCont","segOffset","rawSel","segSel","lineLen","ds","segFind","me","isCur","segWord","segBm","pos","extraCurCols","extraSelRanges","ec","evp","displayText","applyRenderWhitespace","needRich","codeHtml","renderSegRich","cacheKey","cached","renderTokensOnly","guidesHtml","indent","level","x","foldHtml","folded","isFolded","lineNum","mode","leadingSpaces","trailingSpaces","charCls","html","runStart","runCls","flush","chunk","findHls","snippetStopCols","wordHls","bmHls","tokenOpts","h","runOverlay","runTok","sc","tok","fhl","f","inSel","inWord","inBm","overlay","computeMinimapState","totalLines","editorScrollTop","editorHeight","minimapHeight","lineHeight","eExtra","mExtra","mmScroll","sliderHeight","sliderTop","sliderTopToEditorScroll","coeff","sH","minimapClickToEditorScroll","wrapY","mScroll","buildMinimapColors","v","raw","t2","paintMinimap","canvas","firstLine","lastLine","subPx","wW","canvasHeight","cursorRow","findMatches","findIdx","colors","dpr","mmBg","mmDim","mmEdge","mmSlider","selBg","curLineBg","findBorder","findCurBg","lineY","r0","r1","active","maxC","y","rh","cov","sw","le","cSlTop","cSlBot","DEFAULT_CONFIG","SynclineEditor","container","btn","wH","dy","styleEl","initTheme","layout","edPane","initLines","patch","safePatch","incoming","_removed","rest","command","ro","bar","input","hint","valid","sb","fontFamily","fontSize","cursorBlinkRate","cursorStyle","gutterWidth","minimapWidth","showGutter","curH","curTop","cursorExtra","gw","tc","activeTheme","apply","override","themeVal","t","LH","totalVis","maxChars","totalW","st","visH","startV","endV","curVisPos","snippetStopMap","si","stop","vp","isEmpty","undoStack","redoStack","lang","langLabels","qs","selEl","sepEl","mcEl","N","firstFrac","first","visCount","canvasH","needW","needH","width","editorW","codeAreaW","top","bottom","sh","pad","groupable","parts","rows","removeCount","prevLen","extra","lr","token","escaped","allCmt","rect","withReplace","dir","isCss","emmetItems","emmetFound","expanded","preview","acItems","kindBadge","k","descText","listHtml","selected","descPanel","listEl","popW","popH","flipUp","suffix","snippet","body","triggerStart","rawLines","fullRaw","allStops","stopRe","sm","beforePosLines","rowOffset","rawColInSeg","strippedWidth","docRow","docCol","cleanLines","newLines","themes","id","eW","_e","_f","_g","_h","_i","ctrl","shift","alt","res","curStop","_ctrl","meta","ctrlOnly","moveTo","nr","nc","smartHome","fnw","docEnd","ed","nv","nd","pv","pd","sep","down","block","up","clientX","clientY","match","tip","margin","offsetY","tipW","tipH","left","target","val","printable","preRow","preCol","session","delta","count","wrapEl","newScroll","createEditor"],"mappings":"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"}