typewright 0.2.1

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.
Files changed (40) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +168 -0
  3. package/SPEC.md +327 -0
  4. package/dist/chunk-CZQO7TTL.js +1533 -0
  5. package/dist/chunk-CZQO7TTL.js.map +1 -0
  6. package/dist/chunk-KNEKNZXK.js +286 -0
  7. package/dist/chunk-KNEKNZXK.js.map +1 -0
  8. package/dist/chunk-M6IVEMXO.js +1398 -0
  9. package/dist/chunk-M6IVEMXO.js.map +1 -0
  10. package/dist/chunk-NJ7PJKHN.js +652 -0
  11. package/dist/chunk-NJ7PJKHN.js.map +1 -0
  12. package/dist/commands-Z3ndUSza.d.cts +221 -0
  13. package/dist/commands-Z3ndUSza.d.ts +221 -0
  14. package/dist/core/index.cjs +2952 -0
  15. package/dist/core/index.cjs.map +1 -0
  16. package/dist/core/index.d.cts +410 -0
  17. package/dist/core/index.d.ts +410 -0
  18. package/dist/core/index.js +4 -0
  19. package/dist/core/index.js.map +1 -0
  20. package/dist/mdx/index.cjs +662 -0
  21. package/dist/mdx/index.cjs.map +1 -0
  22. package/dist/mdx/index.d.cts +252 -0
  23. package/dist/mdx/index.d.ts +252 -0
  24. package/dist/mdx/index.js +3 -0
  25. package/dist/mdx/index.js.map +1 -0
  26. package/dist/react/index.cjs +7439 -0
  27. package/dist/react/index.cjs.map +1 -0
  28. package/dist/react/index.d.cts +140 -0
  29. package/dist/react/index.d.ts +140 -0
  30. package/dist/react/index.js +3644 -0
  31. package/dist/react/index.js.map +1 -0
  32. package/dist/streaming/index.cjs +1494 -0
  33. package/dist/streaming/index.cjs.map +1 -0
  34. package/dist/streaming/index.d.cts +64 -0
  35. package/dist/streaming/index.d.ts +64 -0
  36. package/dist/streaming/index.js +4 -0
  37. package/dist/streaming/index.js.map +1 -0
  38. package/dist/types-CX1GOx0Y.d.cts +319 -0
  39. package/dist/types-CX1GOx0Y.d.ts +319 -0
  40. package/package.json +128 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/ast.ts","../../src/core/parser.ts","../../src/core/render.ts","../../src/core/unified.ts","../../src/core/commands.ts","../../src/core/text.ts","../../src/core/highlight.ts","../../src/core/comments.ts","../../src/core/table.ts","../../src/react/CaretRevealBlock.tsx","../../src/react/CommentsSidebar.tsx","../../src/react/FoldMenu.tsx","../../src/sandbox/host.ts","../../src/mdx/transform.ts","../../src/react/SandboxIsland.tsx","../../src/react/SettingsSurface.tsx","../../src/react/TableGrid.tsx","../../src/react/TypewrightEditor.tsx","../../src/streaming/anticipate.ts","../../src/streaming/index.ts","../../src/react/StreamingPreview.tsx"],"names":["node","commit","lineStart","children","MAX_URL","t","escapeHtml","span","React","jsx","React2","jsxs","React3","opts","React4","React5","React6","React7","Fragment","TypewrightEditor","start","end","renderRow","committed","committedHtml","React8"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Typewright AST — the offset-exact node model the parser produces and the\n * renderer / unified-mode / fold services consume.\n *\n * Every node carries `from`/`to`: UTF-16 offsets into the source string. This\n * is the contract that makes non-destructive rendering, source-revealing, and\n * folding possible — a node always knows exactly which slice of the string it\n * owns. Marker offsets (e.g. a heading's `### `, an emphasis delimiter) are\n * exposed where a consumer needs to hide/reveal them.\n */\n\nexport interface Pos {\n /** Inclusive start offset into the source string. */\n from: number;\n /** Exclusive end offset into the source string. */\n to: number;\n}\n\n/* ------------------------------------------------------------------ *\n * Inline nodes\n * ------------------------------------------------------------------ */\n\nexport interface TextNode extends Pos {\n type: 'text';\n value: string;\n}\n\nexport interface Emphasis extends Pos {\n type: 'emphasis';\n /** The delimiter used (`*` or `_`). */\n marker: string;\n children: Inline[];\n}\n\nexport interface Strong extends Pos {\n type: 'strong';\n marker: string;\n children: Inline[];\n}\n\nexport interface Strikethrough extends Pos {\n type: 'strikethrough';\n children: Inline[];\n}\n\nexport interface InlineCode extends Pos {\n type: 'inlineCode';\n value: string;\n /** Number of backticks in the fence. */\n ticks: number;\n}\n\nexport interface Link extends Pos {\n type: 'link';\n url: string;\n title?: string;\n children: Inline[];\n}\n\nexport interface Image extends Pos {\n type: 'image';\n url: string;\n alt: string;\n title?: string;\n}\n\nexport interface Autolink extends Pos {\n type: 'autolink';\n url: string;\n}\n\nexport interface LineBreak extends Pos {\n type: 'break';\n /** A hard break (two trailing spaces or backslash) vs a soft newline. */\n hard: boolean;\n}\n\n/** Inline math (`$…$` inline, `$$…$$` inline-display). Opt-in via {@link ParseOptions.math}. */\nexport interface Math extends Pos {\n type: 'math';\n /** The TeX source between the delimiters (delimiters excluded). */\n value: string;\n /** `true` for a `$$…$$` display span, `false` for a `$…$` inline span. */\n display: boolean;\n}\n\n/** A footnote reference `[^id]`. Opt-in via {@link ParseOptions.footnotes}. */\nexport interface FootnoteRef extends Pos {\n type: 'footnoteRef';\n /** The referenced footnote label (between `[^` and `]`). */\n id: string;\n}\n\nexport type Inline =\n | TextNode\n | Emphasis\n | Strong\n | Strikethrough\n | InlineCode\n | Link\n | Image\n | Autolink\n | LineBreak\n | Math\n | FootnoteRef;\n\n/* ------------------------------------------------------------------ *\n * Block nodes\n * ------------------------------------------------------------------ */\n\nexport interface Heading extends Pos {\n type: 'heading';\n level: 1 | 2 | 3 | 4 | 5 | 6;\n /** Offset just past the `#`… marker + following space (start of content). */\n contentFrom: number;\n children: Inline[];\n}\n\nexport interface Paragraph extends Pos {\n type: 'paragraph';\n children: Inline[];\n}\n\nexport interface Blockquote extends Pos {\n type: 'blockquote';\n children: Block[];\n}\n\nexport type TaskState = 'checked' | 'unchecked' | null;\n\nexport interface ListItem extends Pos {\n type: 'listItem';\n /** Task-list state, or null for a plain item. */\n task: TaskState;\n /** Offset just past the list marker (`- `, `1. `, `- [x] `). */\n contentFrom: number;\n children: Block[];\n}\n\nexport interface List extends Pos {\n type: 'list';\n ordered: boolean;\n /** Start number for an ordered list. */\n start: number;\n /** Loose lists wrap items in paragraphs; tight lists don't. */\n tight: boolean;\n items: ListItem[];\n}\n\nexport interface CodeBlock extends Pos {\n type: 'codeBlock';\n /** Info string after the opening fence (may be empty). */\n lang: string;\n value: string;\n fenced: boolean;\n}\n\nexport interface ThematicBreak extends Pos {\n type: 'thematicBreak';\n}\n\nexport type CellAlign = 'left' | 'center' | 'right' | null;\n\nexport interface TableCell extends Pos {\n type: 'tableCell';\n children: Inline[];\n}\n\nexport interface Table extends Pos {\n type: 'table';\n align: CellAlign[];\n header: TableCell[];\n rows: TableCell[][];\n}\n\n/** Raw HTML or an MDX/JSX/ESM region — kept verbatim (markup only, not evaluated). */\nexport interface HtmlBlock extends Pos {\n type: 'htmlBlock';\n value: string;\n /** `html` for raw HTML, `mdxFlow` for a JSX element / ESM line at block level. */\n variant: 'html' | 'mdxFlow';\n}\n\n/** A `$$…$$` display-math block. Opt-in via {@link ParseOptions.math}. */\nexport interface MathBlock extends Pos {\n type: 'mathBlock';\n /** The TeX source between the `$$` fences (fences excluded). */\n value: string;\n}\n\n/** A footnote definition `[^id]: …`. Opt-in via {@link ParseOptions.footnotes}. */\nexport interface FootnoteDef extends Pos {\n type: 'footnoteDef';\n /** The footnote label (between `[^` and `]`). */\n id: string;\n children: Block[];\n}\n\n/** A single term + one-or-more definitions inside a {@link DefList}. */\nexport interface DefItem extends Pos {\n type: 'defItem';\n term: Inline[];\n /** Each `: …` definition, parsed as its own block sequence. */\n definitions: Block[][];\n}\n\n/** A definition list — terms with `: …` definitions. Opt-in via {@link ParseOptions.defLists}. */\nexport interface DefList extends Pos {\n type: 'defList';\n items: DefItem[];\n}\n\nexport type Block =\n | Heading\n | Paragraph\n | Blockquote\n | List\n | CodeBlock\n | ThematicBreak\n | Table\n | HtmlBlock\n | MathBlock\n | FootnoteDef\n | DefList;\n\nexport interface Document extends Pos {\n type: 'document';\n children: Block[];\n}\n\nexport type AstNode = Document | Block | ListItem | TableCell | DefItem | Inline;\n\n/**\n * Opt-in parser extensions. Every flag defaults to `false`, so `parse(src)`\n * behaves exactly as it always has; enabling a flag lights up the matching\n * construct (and nothing else). Kept semver-safe so a later wave can turn these\n * on from configuration without a breaking parser change.\n */\nexport interface ParseOptions {\n /** Parse `$…$` inline and `$$…$$` block math. */\n math?: boolean;\n /** Parse `[^id]` footnote references and `[^id]: …` definitions. */\n footnotes?: boolean;\n /** Parse `term` / `: definition` definition lists. */\n defLists?: boolean;\n}\n\n/* ------------------------------------------------------------------ *\n * Helpers\n * ------------------------------------------------------------------ */\n\nconst INLINE_TYPES = new Set([\n 'text',\n 'emphasis',\n 'strong',\n 'strikethrough',\n 'inlineCode',\n 'link',\n 'image',\n 'autolink',\n 'break',\n 'math',\n 'footnoteRef',\n]);\n\nexport function isInline(node: AstNode): node is Inline {\n return INLINE_TYPES.has(node.type);\n}\n\n/** Depth-first walk over the tree; return false from `visit` to skip children. */\nexport function walk(node: AstNode, visit: (node: AstNode) => boolean | void): void {\n const go = (n: AstNode): void => {\n if (visit(n) === false) return;\n const kids = childrenOf(n);\n for (const k of kids) go(k);\n };\n go(node);\n}\n\nexport function childrenOf(node: AstNode): AstNode[] {\n switch (node.type) {\n case 'document':\n case 'blockquote':\n return node.children;\n case 'heading':\n case 'paragraph':\n case 'emphasis':\n case 'strong':\n case 'strikethrough':\n case 'tableCell':\n return node.children;\n case 'link':\n return node.children;\n case 'list':\n return node.items;\n case 'listItem':\n return node.children;\n case 'table':\n return [...node.header, ...node.rows.flat()];\n case 'footnoteDef':\n return node.children;\n case 'defList':\n return node.items;\n case 'defItem':\n return [...node.term, ...node.definitions.flat()];\n default:\n return [];\n }\n}\n","/**\n * Typewright block + inline parser — a hand-written, zero-dependency GitHub\n * Flavored Markdown (+ light MDX-flow) parser that produces the offset-exact\n * AST in `./ast`. Every node carries `from`/`to` UTF-16 source offsets; markers\n * (heading `### `, list bullets, emphasis delimiters) are exposed so a consumer\n * can hide/reveal the raw syntax.\n *\n * Design notes:\n * - Block parsing works line-by-line. Container blocks (blockquote, list) build\n * a fresh line list whose `from` is advanced past the stripped prefix; because\n * only `from` moves, `src.slice(from, to)` still equals the line's content, so\n * offsets stay exact through arbitrary nesting.\n * - Inline parsing stitches a block's content lines into one buffer with a\n * per-character source-offset map, so emphasis/code spanning a soft line break\n * still reports correct absolute offsets.\n * - The parser never throws: unterminated emphasis / code / links / fences all\n * degrade to text (or run to end-of-input) rather than failing.\n */\n\nimport { walk } from './ast';\nimport type {\n AstNode,\n Autolink,\n Block,\n Blockquote,\n CellAlign,\n CodeBlock,\n DefItem,\n DefList,\n Document,\n Emphasis,\n FootnoteDef,\n FootnoteRef,\n Heading,\n HtmlBlock,\n Image,\n Inline,\n InlineCode,\n LineBreak,\n Link,\n List,\n ListItem,\n Math,\n MathBlock,\n Paragraph,\n ParseOptions,\n Strikethrough,\n Strong,\n Table,\n TableCell,\n TaskState,\n TextNode,\n ThematicBreak,\n} from './ast';\nimport type { Change } from './text';\n\n/* ------------------------------------------------------------------ *\n * Bounds — keep user/model-controlled strings sensibly capped.\n * ------------------------------------------------------------------ */\n\nconst MAX_URL = 4096;\nconst MAX_TITLE = 1024;\nconst MAX_ALT = 4096;\nconst MAX_LANG = 256;\nconst MAX_VALUE = 1_000_000;\n/** Footnote labels are short tokens; this caps the `[^…]` lookahead to O(1). */\nconst MAX_FOOTNOTE_ID = 256;\n\nconst cap = (s: string, n: number): string => (s.length > n ? s.slice(0, n) : s);\n\n/* ------------------------------------------------------------------ *\n * Opt-in extensions (math / footnotes / definition lists)\n *\n * All three default to `false`, so `parse(src)` is byte-for-byte what it always\n * was. The resolved flags live in module scope and are set once per `parse()`\n * call; parsing is synchronous and non-reentrant across calls, and every nested\n * `parseBlocks` within a single call shares the same flags — so this reads like\n * a closure variable without threading an argument through every builder.\n * ------------------------------------------------------------------ */\n\ninterface ResolvedOptions {\n math: boolean;\n footnotes: boolean;\n defLists: boolean;\n}\n\nlet opts: ResolvedOptions = { math: false, footnotes: false, defLists: false };\n\n/* ------------------------------------------------------------------ *\n * Line model\n * ------------------------------------------------------------------ */\n\ninterface Line {\n /** Offset of the first character of (stripped) content. */\n from: number;\n /** Offset just past the last content character (before the newline). */\n to: number;\n /** `src.slice(from, to)` — the line's content, minus any container prefix. */\n text: string;\n}\n\n/** Split source into content lines (newline + trailing `\\r` excluded). */\nfunction splitLines(src: string): Line[] {\n const lines: Line[] = [];\n let from = 0;\n for (let i = 0; i <= src.length; i++) {\n if (i === src.length || src[i] === '\\n') {\n let end = i;\n if (end > from && src[end - 1] === '\\r') end--;\n lines.push({ from, to: end, text: src.slice(from, end) });\n from = i + 1;\n }\n }\n return lines;\n}\n\nconst leadingSpaces = (t: string): number => {\n let n = 0;\n while (n < t.length && t[n] === ' ') n++;\n return n;\n};\n\nconst isBlank = (line: Line): boolean => line.text.trim() === '';\n\n/* ------------------------------------------------------------------ *\n * Block detectors\n * ------------------------------------------------------------------ */\n\nconst FENCE_RE = /^( {0,3})(`{3,}|~{3,})(.*)$/;\nconst ATX_RE = /^( {0,3})(#{1,6})(?=\\s|$)/;\nconst ITEM_RE = /^( {0,3})([-+*]|\\d{1,9}[.)])( +|$)/;\nconst HTML_TAG_RE = /^<\\/?([A-Za-z][A-Za-z0-9-]*)(?:[\\s/>]|$)/;\nconst ESM_RE = /^(?:import|export)\\b/;\n\nconst isFence = (t: string): boolean => {\n const m = FENCE_RE.exec(t);\n if (!m) return false;\n // A backtick info string may not itself contain a backtick.\n return m[2]![0] !== '`' || !m[3]!.includes('`');\n};\n\nconst isAtx = (t: string): boolean => ATX_RE.test(t);\n\nconst isThematic = (t: string): boolean => {\n const trimmed = t.trim();\n if (trimmed.length < 3) return false;\n const compact = trimmed.replace(/ /g, '');\n return /^(?:-{3,}|_{3,}|\\*{3,})$/.test(compact);\n};\n\nconst isQuote = (t: string): boolean => /^ {0,3}>/.test(t);\n\ninterface ItemInfo {\n indent: number;\n marker: string;\n markerLen: number;\n spacesAfter: number;\n ordered: boolean;\n}\n\nfunction detectItem(line: Line): ItemInfo | null {\n const m = ITEM_RE.exec(line.text);\n if (!m) return null;\n const marker = m[2]!;\n return {\n indent: m[1]!.length,\n marker,\n markerLen: marker.length,\n spacesAfter: m[3] === '' ? 0 : m[3]!.length,\n ordered: /\\d/.test(marker[0]!),\n };\n}\n\nfunction htmlVariant(t: string): 'html' | 'mdxFlow' | null {\n const s = t.replace(/^ {0,3}/, '');\n if (ESM_RE.test(s)) return 'mdxFlow';\n const m = HTML_TAG_RE.exec(s);\n if (!m) return null;\n return /[A-Z]/.test(m[1]![0]!) ? 'mdxFlow' : 'html';\n}\n\nfunction isDelimRow(t: string): boolean {\n let s = t.trim();\n if (!s.includes('-')) return false;\n s = s.replace(/^\\|/, '').replace(/\\|$/, '');\n const cells = s.split('|');\n return cells.length >= 1 && cells.every((c) => /^ *:?-+:? *$/.test(c));\n}\n\nfunction isTableStartAt(lines: Line[], j: number): boolean {\n const line = lines[j];\n const next = lines[j + 1];\n if (!line || !next) return false;\n if (isBlank(line)) return false;\n return line.text.includes('|') && isDelimRow(next.text);\n}\n\n/* --- opt-in detectors (inert unless the matching flag is on) --- */\n\n/** A `$$` display-math fence on its own line (opener or closer). */\nconst MATH_FENCE_RE = /^ {0,3}\\$\\$[ \\t]*$/;\nconst isMathOpen = (t: string): boolean => opts.math && MATH_FENCE_RE.test(t);\n\n/** A `[^id]:` footnote definition line. Never collides with `ITEM_RE`. */\nconst FOOTNOTE_DEF_RE = /^( {0,3})\\[\\^([^\\]\\s]+)\\]:/;\nconst isFootnoteDef = (line: Line): boolean => opts.footnotes && FOOTNOTE_DEF_RE.test(line.text);\n\n/** A `: …` definition-list definition line (up to 3 leading spaces). */\nconst DEF_RE = /^( {0,3}):[ \\t]+/;\n\n/**\n * Does line `j` open a definition list? Conservative: line `j` must be a plain\n * term (a line that would otherwise be a paragraph — not another block) and the\n * *immediately* following line must be a `: …` definition. The term guard reuses\n * `startsBlock` (which never recurses into this check), so a heading/quote/table\n * term is rejected.\n */\nfunction isDefListStartAt(lines: Line[], j: number): boolean {\n if (!opts.defLists) return false;\n const line = lines[j];\n const next = lines[j + 1];\n if (!line || !next) return false;\n if (isBlank(line)) return false;\n if (startsBlock(lines, j)) return false; // term must not be another block\n return DEF_RE.test(next.text);\n}\n\n/** Does line `j` begin a non-paragraph block (so a paragraph must stop)? */\nfunction startsBlock(lines: Line[], j: number): boolean {\n const line = lines[j]!;\n const t = line.text;\n return (\n isFence(t) ||\n isAtx(t) ||\n isThematic(t) ||\n isQuote(t) ||\n detectItem(line) !== null ||\n htmlVariant(t) !== null ||\n isTableStartAt(lines, j) ||\n isMathOpen(t) ||\n isFootnoteDef(line)\n );\n}\n\n/** Like `startsBlock` but excludes tables (used while consuming table rows). */\nfunction startsOtherBlock(line: Line): boolean {\n const t = line.text;\n return (\n isFence(t) ||\n isAtx(t) ||\n isThematic(t) ||\n isQuote(t) ||\n detectItem(line) !== null ||\n htmlVariant(t) !== null ||\n isMathOpen(t) ||\n isFootnoteDef(line)\n );\n}\n\n/* ------------------------------------------------------------------ *\n * Block builders\n * ------------------------------------------------------------------ */\n\ninterface Built {\n node: Block;\n next: number;\n}\n\nfunction buildHeading(line: Line): Heading {\n const t = line.text;\n const m = ATX_RE.exec(t)!;\n const indent = m[1]!.length;\n const hashes = m[2]!;\n const level = hashes.length as 1 | 2 | 3 | 4 | 5 | 6;\n let ce = indent + hashes.length;\n if (t[ce] === ' ') ce++;\n const contentFrom = line.from + ce;\n\n // Trim trailing whitespace + an optional closing `###` sequence for children.\n let end = t.length;\n while (end > ce && (t[end - 1] === ' ' || t[end - 1] === '\\t')) end--;\n let e2 = end;\n while (e2 > ce && t[e2 - 1] === '#') e2--;\n if (e2 < end && (e2 === ce || t[e2 - 1] === ' ' || t[e2 - 1] === '\\t')) {\n end = e2;\n while (end > ce && (t[end - 1] === ' ' || t[end - 1] === '\\t')) end--;\n }\n\n const children = parseInlineSegs([\n { from: contentFrom, to: line.from + end, text: t.slice(ce, end) },\n ]);\n return { type: 'heading', from: line.from, to: line.to, level, contentFrom, children };\n}\n\nfunction buildFence(lines: Line[], i: number): Built {\n const open = lines[i]!;\n const m = FENCE_RE.exec(open.text)!;\n const indent = m[1]!.length;\n const fenceChar = m[2]![0]!;\n const fenceLen = m[2]!.length;\n const lang = cap(m[3]!.trim(), MAX_LANG);\n\n const inner: Line[] = [];\n let j = i + 1;\n let closeTo: number | null = null;\n while (j < lines.length) {\n const cm = /^( {0,3})(`{3,}|~{3,}) *$/.exec(lines[j]!.text);\n if (cm && cm[2]![0] === fenceChar && cm[2]!.length >= fenceLen) {\n closeTo = lines[j]!.to;\n j++;\n break;\n }\n inner.push(lines[j]!);\n j++;\n }\n\n const value = cap(\n inner.map((l) => (leadingSpaces(l.text) >= indent ? l.text.slice(indent) : l.text.trimStart())).join('\\n'),\n MAX_VALUE,\n );\n const to = closeTo ?? (inner.length ? inner[inner.length - 1]!.to : open.to);\n return { node: { type: 'codeBlock', from: open.from, to, lang, value, fenced: true }, next: j };\n}\n\n/** A `$$` … `$$` display-math block. Unterminated → runs to end (like a fence). */\nfunction buildMathBlock(lines: Line[], i: number): Built {\n const open = lines[i]!;\n const inner: Line[] = [];\n let j = i + 1;\n let closeTo: number | null = null;\n while (j < lines.length) {\n if (MATH_FENCE_RE.test(lines[j]!.text)) {\n closeTo = lines[j]!.to;\n j++;\n break;\n }\n inner.push(lines[j]!);\n j++;\n }\n const value = cap(inner.map((l) => l.text).join('\\n'), MAX_VALUE);\n const to = closeTo ?? (inner.length ? inner[inner.length - 1]!.to : open.to);\n const node: MathBlock = { type: 'mathBlock', from: open.from, to, value };\n return { node, next: j };\n}\n\nfunction buildIndentedCode(lines: Line[], i: number): Built {\n const from = lines[i]!.from;\n const inner: Line[] = [lines[i]!];\n let j = i + 1;\n let pending: Line[] = [];\n while (j < lines.length) {\n const line = lines[j]!;\n if (isBlank(line)) {\n pending.push(line);\n j++;\n continue;\n }\n if (leadingSpaces(line.text) >= 4) {\n inner.push(...pending, line);\n pending = [];\n j++;\n continue;\n }\n break;\n }\n const last = inner[inner.length - 1]!;\n const value = cap(inner.map((l) => l.text.slice(4)).join('\\n'), MAX_VALUE);\n return {\n node: { type: 'codeBlock', from, to: last.to, lang: '', value, fenced: false },\n next: j,\n };\n}\n\nfunction buildThematic(line: Line): ThematicBreak {\n return { type: 'thematicBreak', from: line.from, to: line.to };\n}\n\nfunction stripQuote(line: Line): Line {\n const m = /^( {0,3})>( ?)/.exec(line.text)!;\n const cut = m[0].length;\n return { from: line.from + cut, to: line.to, text: line.text.slice(cut) };\n}\n\nfunction buildBlockquote(lines: Line[], i: number): Built {\n const from = lines[i]!.from;\n const inner: Line[] = [];\n let j = i;\n while (j < lines.length && isQuote(lines[j]!.text)) {\n inner.push(stripQuote(lines[j]!));\n j++;\n }\n const to = lines[j - 1]!.to;\n const children = parseBlocks(inner);\n return { node: { type: 'blockquote', from, to, children }, next: j };\n}\n\nconst TASK_RE = /^\\[([ xX])\\](\\s|$)/;\n\ninterface CollectedItem {\n item: ListItem;\n next: number;\n blankBefore: boolean;\n loose: boolean;\n}\n\nfunction collectItem(lines: Line[], idx: number): CollectedItem {\n const line0 = lines[idx]!;\n const det = detectItem(line0)!;\n const contentCol = det.indent + det.markerLen + 1;\n const localStart = det.indent + det.markerLen + (det.spacesAfter > 0 ? 1 : 0);\n\n let task: TaskState = null;\n let bodyStart = localStart;\n const afterMarker = line0.text.slice(localStart);\n const tm = TASK_RE.exec(afterMarker);\n if (tm) {\n task = tm[1] === ' ' ? 'unchecked' : 'checked';\n bodyStart = localStart + tm[0].length;\n }\n const contentFrom = line0.from + bodyStart;\n\n const body: Line[] = [\n { from: contentFrom, to: line0.to, text: line0.text.slice(bodyStart) },\n ];\n let lastTo = line0.to;\n let loose = false;\n let pendingBlank = false;\n let j = idx + 1;\n\n while (j < lines.length) {\n const lj = lines[j]!;\n if (isBlank(lj)) {\n pendingBlank = true;\n j++;\n continue;\n }\n const ind = leadingSpaces(lj.text);\n if (ind >= contentCol) {\n if (pendingBlank) {\n loose = true;\n body.push({ from: lj.from, to: lj.from, text: '' });\n }\n body.push({\n from: lj.from + contentCol,\n to: lj.to,\n text: lj.text.slice(contentCol),\n });\n lastTo = lj.to;\n pendingBlank = false;\n j++;\n continue;\n }\n if (detectItem(lj)) break; // sibling / new item\n if (pendingBlank) break; // blank then unindented, non-item → item ends\n if (startsOtherBlock(lj)) break; // a new block interrupts\n // lazy paragraph continuation\n body.push({ from: lj.from, to: lj.to, text: lj.text });\n lastTo = lj.to;\n j++;\n }\n\n const children = parseBlocks(body);\n const item: ListItem = {\n type: 'listItem',\n from: line0.from,\n to: lastTo,\n task,\n contentFrom,\n children,\n };\n return { item, next: j, blankBefore: pendingBlank, loose };\n}\n\nfunction buildList(lines: Line[], start: number): Built {\n const first = detectItem(lines[start]!)!;\n const ordered = first.ordered;\n const startNum = ordered ? parseInt(first.marker, 10) || 0 : 1;\n\n const items: ListItem[] = [];\n let loose = false;\n let i = start;\n while (i < lines.length) {\n const det = detectItem(lines[i]!);\n if (!det || det.ordered !== ordered) break;\n const r = collectItem(lines, i);\n if (r.blankBefore) loose = true;\n if (r.loose) loose = true;\n items.push(r.item);\n i = r.next;\n }\n\n const node: List = {\n type: 'list',\n from: items[0]!.from,\n to: items[items.length - 1]!.to,\n ordered,\n start: startNum,\n tight: !loose,\n items,\n };\n return { node, next: i };\n}\n\nfunction parseAligns(delim: string): CellAlign[] {\n return splitCellRanges(delim).map(([a, b]) => {\n const cell = delim.slice(a, b).trim();\n const left = cell.startsWith(':');\n const right = cell.endsWith(':');\n if (left && right) return 'center';\n if (left) return 'left';\n if (right) return 'right';\n return null;\n });\n}\n\n/** Local [start,end) ranges for each pipe-delimited cell, outer pipes dropped. */\nfunction splitCellRanges(t: string): Array<[number, number]> {\n const cells: Array<[number, number]> = [];\n let s = 0;\n for (let k = 0; k < t.length; k++) {\n if (t[k] === '|' && t[k - 1] !== '\\\\') {\n cells.push([s, k]);\n s = k + 1;\n }\n }\n cells.push([s, t.length]);\n if (cells.length > 1 && t.slice(cells[0]![0], cells[0]![1]).trim() === '') cells.shift();\n if (cells.length > 1 && t.slice(cells[cells.length - 1]![0], cells[cells.length - 1]![1]).trim() === '')\n cells.pop();\n return cells;\n}\n\nfunction splitRow(line: Line): TableCell[] {\n const t = line.text;\n return splitCellRanges(t).map(([a, b]) => {\n let ca = a;\n while (ca < b && t[ca] === ' ') ca++;\n let cb = b;\n while (cb > ca && t[cb - 1] === ' ') cb--;\n const from = line.from + ca;\n const to = line.from + cb;\n const children = parseInlineSegs([{ from, to, text: t.slice(ca, cb) }]);\n return { type: 'tableCell', from, to, children };\n });\n}\n\nfunction buildTable(lines: Line[], i: number): Built {\n const header = splitRow(lines[i]!);\n const align = parseAligns(lines[i + 1]!.text);\n const rows: TableCell[][] = [];\n let j = i + 2;\n let lastTo = lines[i + 1]!.to;\n while (j < lines.length) {\n const line = lines[j]!;\n if (isBlank(line) || startsOtherBlock(line)) break;\n rows.push(splitRow(line));\n lastTo = line.to;\n j++;\n }\n return {\n node: { type: 'table', from: lines[i]!.from, to: lastTo, align, header, rows },\n next: j,\n };\n}\n\nfunction buildHtml(lines: Line[], i: number): Built {\n const variant = htmlVariant(lines[i]!.text)!;\n const from = lines[i]!.from;\n const block: Line[] = [];\n let j = i;\n while (j < lines.length && !isBlank(lines[j]!)) {\n block.push(lines[j]!);\n j++;\n }\n const to = block[block.length - 1]!.to;\n const value = cap(block.map((l) => l.text).join('\\n'), MAX_VALUE);\n return { node: { type: 'htmlBlock', from, to, value, variant }, next: j };\n}\n\n/**\n * A `[^id]: …` footnote definition. Its body — the text after `]: ` plus any\n * indented / lazily-continued following lines — is parsed as nested blocks\n * (mirroring `collectItem`'s continuation model), so a def can hold paragraphs,\n * lists, code, etc.\n */\nfunction buildFootnoteDef(lines: Line[], i: number): Built {\n const line0 = lines[i]!;\n const m = FOOTNOTE_DEF_RE.exec(line0.text)!;\n const indent = m[1]!.length;\n const id = m[2]!;\n const markerLen = m[0].length - indent; // length of `[^id]:`\n const contentCol = indent + markerLen + 1; // continuation aligns past `[^id]: `\n let bodyStart = indent + markerLen;\n if (line0.text[bodyStart] === ' ') bodyStart++;\n const contentFrom = line0.from + bodyStart;\n\n const body: Line[] = [\n { from: contentFrom, to: line0.to, text: line0.text.slice(bodyStart) },\n ];\n let lastTo = line0.to;\n let pendingBlank = false;\n let j = i + 1;\n while (j < lines.length) {\n const lj = lines[j]!;\n if (isBlank(lj)) {\n pendingBlank = true;\n j++;\n continue;\n }\n const ind = leadingSpaces(lj.text);\n if (ind >= contentCol) {\n if (pendingBlank) body.push({ from: lj.from, to: lj.from, text: '' });\n body.push({ from: lj.from + contentCol, to: lj.to, text: lj.text.slice(contentCol) });\n lastTo = lj.to;\n pendingBlank = false;\n j++;\n continue;\n }\n if (pendingBlank) break; // blank then unindented → def ends\n if (isFootnoteDef(lj)) break; // sibling definition\n if (startsOtherBlock(lj)) break; // a new block interrupts\n if (isDefListStartAt(lines, j)) break;\n // lazy paragraph continuation\n body.push({ from: lj.from, to: lj.to, text: lj.text });\n lastTo = lj.to;\n j++;\n }\n\n const children = parseBlocks(body);\n const node: FootnoteDef = { type: 'footnoteDef', from: line0.from, to: lastTo, id, children };\n return { node, next: j };\n}\n\n/** One `: …` definition (+ its indented/lazy continuation) as a block sequence. */\nfunction collectDefinition(lines: Line[], idx: number): { blocks: Block[]; to: number; next: number } {\n const line0 = lines[idx]!;\n const m = DEF_RE.exec(line0.text)!;\n const contentCol = m[0].length; // content begins just past `: `\n const body: Line[] = [\n { from: line0.from + contentCol, to: line0.to, text: line0.text.slice(contentCol) },\n ];\n let lastTo = line0.to;\n let pendingBlank = false;\n let j = idx + 1;\n while (j < lines.length) {\n const lj = lines[j]!;\n if (isBlank(lj)) {\n pendingBlank = true;\n j++;\n continue;\n }\n if (DEF_RE.test(lj.text)) break; // next definition of the same term\n const ind = leadingSpaces(lj.text);\n if (ind >= contentCol) {\n if (pendingBlank) body.push({ from: lj.from, to: lj.from, text: '' });\n body.push({ from: lj.from + contentCol, to: lj.to, text: lj.text.slice(contentCol) });\n lastTo = lj.to;\n pendingBlank = false;\n j++;\n continue;\n }\n if (pendingBlank) break;\n if (startsOtherBlock(lj)) break;\n if (isFootnoteDef(lj)) break;\n if (isDefListStartAt(lines, j)) break; // next term/definition group\n // lazy paragraph continuation\n body.push({ from: lj.from, to: lj.to, text: lj.text });\n lastTo = lj.to;\n j++;\n }\n return { blocks: parseBlocks(body), to: lastTo, next: j };\n}\n\n/** A term line plus its one-or-more `: …` definitions. */\nfunction collectDefItem(lines: Line[], idx: number): { item: DefItem; next: number } {\n const termLine = lines[idx]!;\n const term = parseInlineSegs([\n { from: termLine.from, to: termLine.to, text: termLine.text },\n ]);\n const definitions: Block[][] = [];\n let lastTo = termLine.to;\n let j = idx + 1;\n while (j < lines.length && DEF_RE.test(lines[j]!.text)) {\n const d = collectDefinition(lines, j);\n definitions.push(d.blocks);\n lastTo = d.to;\n j = d.next;\n }\n const item: DefItem = { type: 'defItem', from: termLine.from, to: lastTo, term, definitions };\n return { item, next: j };\n}\n\n/** A definition list: consecutive `term` / `: definition` groups. */\nfunction buildDefList(lines: Line[], start: number): Built {\n const items: DefItem[] = [];\n let i = start;\n while (i < lines.length && isDefListStartAt(lines, i)) {\n const r = collectDefItem(lines, i);\n items.push(r.item);\n i = r.next;\n }\n const node: DefList = {\n type: 'defList',\n from: items[0]!.from,\n to: items[items.length - 1]!.to,\n items,\n };\n return { node, next: i };\n}\n\nfunction buildParagraph(lines: Line[], i: number): Built {\n const para: Line[] = [lines[i]!];\n let j = i + 1;\n while (j < lines.length) {\n if (isBlank(lines[j]!)) break;\n if (startsBlock(lines, j)) break;\n para.push(lines[j]!);\n j++;\n }\n const from = para[0]!.from;\n const to = para[para.length - 1]!.to;\n const children = parseInlineSegs(para.map((l) => ({ from: l.from, to: l.to, text: l.text })));\n return { node: { type: 'paragraph', from, to, children }, next: j };\n}\n\n/* ------------------------------------------------------------------ *\n * Block dispatch\n * ------------------------------------------------------------------ */\n\nfunction parseBlocks(lines: Line[]): Block[] {\n const out: Block[] = [];\n let i = 0;\n while (i < lines.length) {\n const line = lines[i]!;\n if (isBlank(line)) {\n i++;\n continue;\n }\n const t = line.text;\n\n if (isFence(t)) {\n const b = buildFence(lines, i);\n out.push(b.node);\n i = b.next;\n } else if (isMathOpen(t)) {\n const b = buildMathBlock(lines, i);\n out.push(b.node);\n i = b.next;\n } else if (leadingSpaces(t) >= 4) {\n const b = buildIndentedCode(lines, i);\n out.push(b.node);\n i = b.next;\n } else if (isAtx(t)) {\n out.push(buildHeading(line));\n i++;\n } else if (isThematic(t)) {\n out.push(buildThematic(line));\n i++;\n } else if (isQuote(t)) {\n const b = buildBlockquote(lines, i);\n out.push(b.node);\n i = b.next;\n } else if (detectItem(line)) {\n const b = buildList(lines, i);\n out.push(b.node);\n i = b.next;\n } else if (isDefListStartAt(lines, i)) {\n const b = buildDefList(lines, i);\n out.push(b.node);\n i = b.next;\n } else if (isTableStartAt(lines, i)) {\n const b = buildTable(lines, i);\n out.push(b.node);\n i = b.next;\n } else if (htmlVariant(t)) {\n const b = buildHtml(lines, i);\n out.push(b.node);\n i = b.next;\n } else if (isFootnoteDef(line)) {\n const b = buildFootnoteDef(lines, i);\n out.push(b.node);\n i = b.next;\n } else {\n const b = buildParagraph(lines, i);\n out.push(b.node);\n i = b.next;\n }\n }\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Inline parsing\n * ------------------------------------------------------------------ */\n\ninterface Seg {\n from: number;\n to: number;\n text: string;\n}\n\nconst isWs = (ch: string | undefined): boolean =>\n ch === undefined || ch === ' ' || ch === '\\n' || ch === '\\t' || ch === '\\r';\n\nconst isAlnum = (ch: string | undefined): boolean =>\n ch !== undefined && /[0-9A-Za-z]/.test(ch);\n\n/**\n * Parse the inline content of a block, given its content lines. The lines are\n * stitched into one buffer separated by soft breaks; a per-character map lets\n * every produced node report exact absolute source offsets.\n */\nfunction parseInlineSegs(segs: Seg[]): Inline[] {\n if (segs.length === 0) return [];\n let buf = '';\n const map: number[] = [];\n for (let s = 0; s < segs.length; s++) {\n const seg = segs[s]!;\n if (s > 0) {\n map.push(segs[s - 1]!.to);\n buf += '\\n';\n }\n for (let k = 0; k < seg.text.length; k++) {\n map.push(seg.from + k);\n buf += seg.text[k];\n }\n }\n map.push(segs[segs.length - 1]!.to);\n\n const abs = (k: number): number => (k < map.length ? map[k]! : segs[segs.length - 1]!.to);\n\n /* --- inline node builders --- */\n const text = (from: number, to: number, value: string): TextNode => ({\n type: 'text',\n from,\n to,\n value: cap(value, MAX_VALUE),\n });\n\n /* --- construct scanners (buffer-index based) --- */\n\n interface Hit {\n node: Inline;\n endIdx: number;\n }\n\n function tryCode(i: number, end: number): Hit | null {\n let n = 1;\n while (i + n < end && buf[i + n] === '`') n++;\n let k = i + n;\n while (k < end) {\n if (buf[k] === '`') {\n let m = 1;\n while (k + m < end && buf[k + m] === '`') m++;\n if (m === n) {\n let val = buf.slice(i + n, k);\n if (val.length > 2 && val[0] === ' ' && val[val.length - 1] === ' ' && val.trim() !== '')\n val = val.slice(1, -1);\n const node: InlineCode = {\n type: 'inlineCode',\n from: abs(i),\n to: abs(k + n),\n value: cap(val, MAX_VALUE),\n ticks: n,\n };\n return { node, endIdx: k + n };\n }\n k += m;\n continue;\n }\n k++;\n }\n return null;\n }\n\n /**\n * Inline math `$…$` (or inline-display `$$…$$`). Modeled on `tryCode`: an\n * unterminated run returns null and degrades to literal text. Flanking rules\n * (opener not followed by space, closer not preceded by space) keep bare `$`\n * signs in prose — `$5 and $10` — from being read as math. `\\$` is escaped.\n */\n function tryMath(i: number, end: number): Hit | null {\n let n = 1;\n while (i + n < end && buf[i + n] === '$' && n < 2) n++;\n const after = buf[i + n];\n if (after === undefined || after === ' ' || after === '\\t' || after === '\\n') return null;\n let k = i + n;\n while (k < end) {\n const ch = buf[k];\n if (ch === '\\\\') {\n k += 2; // escaped char (e.g. `\\$`) can't close the span\n continue;\n }\n if (ch === '\\n') return null; // inline math stays on one line\n if (ch === '$') {\n let m = 1;\n while (k + m < end && buf[k + m] === '$' && m < 2) m++;\n if (m === n && k > i + n) {\n const prev = buf[k - 1];\n if (prev !== ' ' && prev !== '\\t' && prev !== '\\n') {\n const node: Math = {\n type: 'math',\n from: abs(i),\n to: abs(k + n),\n value: cap(buf.slice(i + n, k), MAX_VALUE),\n display: n === 2,\n };\n return { node, endIdx: k + n };\n }\n }\n k += m;\n continue;\n }\n k++;\n }\n return null;\n }\n\n /**\n * A footnote reference `[^id]`. The id scan is BOUNDED (`MAX_FOOTNOTE_ID`) and\n * stops at the first `]`, whitespace, or nested bracket — so it is O(1) per\n * `[` and never reintroduces the quadratic blow-up a scan-to-end would. A miss\n * returns null and the caller falls through to `tryLink`.\n */\n function tryFootnoteRef(i: number, end: number): Hit | null {\n const idStart = i + 2; // past `[^`\n const stop = Math.min(end, idStart + MAX_FOOTNOTE_ID);\n let k = idStart;\n while (k < stop) {\n const ch = buf[k];\n if (ch === ']') break;\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '[' || ch === '^') return null;\n k++;\n }\n if (k >= stop || buf[k] !== ']' || k === idStart) return null;\n const node: FootnoteRef = {\n type: 'footnoteRef',\n from: abs(i),\n to: abs(k + 1),\n id: buf.slice(idStart, k),\n };\n return { node, endIdx: k + 1 };\n }\n\n function tryAutolink(i: number, end: number): Hit | null {\n let k = i + 1;\n while (k < end && buf[k] !== '>' && buf[k] !== '<' && buf[k] !== ' ' && buf[k] !== '\\n') k++;\n if (k >= end || buf[k] !== '>') return null;\n const content = buf.slice(i + 1, k);\n const isUri = /^[a-zA-Z][a-zA-Z0-9+.-]*:[^\\s]*$/.test(content);\n const isEmail = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(content);\n if (!isUri && !isEmail) return null;\n const node: Autolink = {\n type: 'autolink',\n from: abs(i),\n to: abs(k + 1),\n url: cap(content, MAX_URL),\n };\n return { node, endIdx: k + 1 };\n }\n\n /** Index of the `]` matching the `[` at `open`, or -1. */\n function matchLabel(open: number, end: number): number {\n // Bound the forward scan: link labels/text are short in practice, and an\n // unbounded scan from every `[` makes a run of unmatched brackets O(n^2)\n // (parse runs on every keystroke / streamed token).\n const stop = Math.min(end, open + 4096);\n let depth = 0;\n for (let k = open; k < stop; k++) {\n const ch = buf[k];\n if (ch === '\\\\') {\n k++;\n continue;\n }\n if (ch === '[') depth++;\n else if (ch === ']') {\n depth--;\n if (depth === 0) return k;\n }\n }\n return -1;\n }\n\n function tryLink(i: number, end: number, isImage: boolean): Hit | null {\n const br = i + (isImage ? 1 : 0);\n if (buf[br] !== '[') return null;\n const close = matchLabel(br, end);\n if (close < 0) return null;\n let k = close + 1;\n if (buf[k] !== '(') return null;\n k++;\n while (k < end && (buf[k] === ' ' || buf[k] === '\\n')) k++;\n\n let url = '';\n if (buf[k] === '<') {\n k++;\n const s = k;\n while (k < end && buf[k] !== '>' && buf[k] !== '\\n') k++;\n if (buf[k] !== '>') return null;\n url = buf.slice(s, k);\n k++;\n } else {\n const s = k;\n let depth = 0;\n while (k < end) {\n const ch = buf[k];\n if (ch === ' ' || ch === '\\n') break;\n if (ch === '(') depth++;\n else if (ch === ')') {\n if (depth === 0) break;\n depth--;\n }\n k++;\n }\n url = buf.slice(s, k);\n }\n\n let title: string | undefined;\n while (k < end && (buf[k] === ' ' || buf[k] === '\\n')) k++;\n const q = buf[k];\n if (q === '\"' || q === \"'\" || q === '(') {\n const closeCh = q === '(' ? ')' : q;\n k++;\n const s = k;\n while (k < end && buf[k] !== closeCh) k++;\n if (buf[k] !== closeCh) return null;\n title = buf.slice(s, k);\n k++;\n while (k < end && (buf[k] === ' ' || buf[k] === '\\n')) k++;\n }\n if (buf[k] !== ')') return null;\n const endIdx = k + 1;\n const from = abs(i);\n const to = abs(endIdx);\n\n if (isImage) {\n const node: Image = {\n type: 'image',\n from,\n to,\n url: cap(url, MAX_URL),\n alt: cap(buf.slice(br + 1, close), MAX_ALT),\n };\n if (title !== undefined) node.title = cap(title, MAX_TITLE);\n return { node, endIdx };\n }\n const node: Link = {\n type: 'link',\n from,\n to,\n url: cap(url, MAX_URL),\n children: parseInlineRange(br + 1, close),\n };\n if (title !== undefined) node.title = cap(title, MAX_TITLE);\n return { node, endIdx };\n }\n\n function tryEmph(i: number, end: number): Hit | null {\n const c = buf[i]!;\n let n = 1;\n while (i + n < end && buf[i + n] === c) n++;\n const isStrike = c === '~';\n if (isStrike && n < 2) return null;\n const strength = isStrike ? 2 : n >= 2 ? 2 : 1;\n if (i + strength > end) return null;\n\n const after = buf[i + strength];\n const before = buf[i - 1];\n if (isWs(after)) return null; // opener must be left-flanking\n if (c === '_' && isAlnum(before)) return null; // no intraword `_`\n\n let k = i + strength;\n while (k < end) {\n if (buf[k] === c) {\n let m = 1;\n while (k + m < end && buf[k + m] === c) m++;\n if (m >= strength) {\n const prev = buf[k - 1];\n const aft = buf[k + strength];\n if (!isWs(prev) && (c !== '_' || !isAlnum(aft))) {\n const children = parseInlineRange(i + strength, k);\n const from = abs(i);\n const to = abs(k + strength);\n let node: Inline;\n if (isStrike) {\n node = { type: 'strikethrough', from, to, children } satisfies Strikethrough;\n } else if (strength === 2) {\n node = { type: 'strong', from, to, marker: c.repeat(2), children } satisfies Strong;\n } else {\n node = { type: 'emphasis', from, to, marker: c, children } satisfies Emphasis;\n }\n return { node, endIdx: k + strength };\n }\n }\n k += m;\n continue;\n }\n k++;\n }\n return null;\n }\n\n function parseInlineRange(start: number, end: number): Inline[] {\n const out: Inline[] = [];\n let i = start;\n let textStart = start;\n const flush = (upto: number): void => {\n if (upto > textStart) out.push(text(abs(textStart), abs(upto), buf.slice(textStart, upto)));\n };\n const commit = (hit: Hit): void => {\n flush(i);\n out.push(hit.node);\n i = hit.endIdx;\n textStart = i;\n };\n\n while (i < end) {\n const c = buf[i];\n if (c === '\\\\') {\n if (buf[i + 1] === '\\n') {\n flush(i);\n out.push({ type: 'break', from: abs(i), to: abs(i + 2), hard: true } satisfies LineBreak);\n i += 2;\n textStart = i;\n continue;\n }\n i += 2; // escaped char stays part of the text run\n continue;\n }\n if (c === '\\n') {\n let sp = 0;\n let p = i - 1;\n while (p >= textStart && buf[p] === ' ') {\n sp++;\n p--;\n }\n const hard = sp >= 2;\n flush(hard ? i - sp : i);\n out.push({\n type: 'break',\n from: abs(hard ? i - sp : i),\n to: abs(i + 1),\n hard,\n } satisfies LineBreak);\n i++;\n textStart = i;\n continue;\n }\n if (c === '`') {\n const r = tryCode(i, end);\n if (r) {\n commit(r);\n continue;\n }\n i++;\n continue;\n }\n if (c === '$' && opts.math) {\n const r = tryMath(i, end);\n if (r) {\n commit(r);\n continue;\n }\n i++;\n continue;\n }\n if (c === '<') {\n const r = tryAutolink(i, end);\n if (r) {\n commit(r);\n continue;\n }\n i++;\n continue;\n }\n if (c === '!' && buf[i + 1] === '[') {\n const r = tryLink(i, end, true);\n if (r) {\n commit(r);\n continue;\n }\n i++;\n continue;\n }\n if (c === '[') {\n if (opts.footnotes && buf[i + 1] === '^') {\n const rf = tryFootnoteRef(i, end);\n if (rf) {\n commit(rf);\n continue;\n }\n }\n const r = tryLink(i, end, false);\n if (r) {\n commit(r);\n continue;\n }\n i++;\n continue;\n }\n if (c === '*' || c === '_' || c === '~') {\n const r = tryEmph(i, end);\n if (r) {\n commit(r);\n continue;\n }\n i++;\n continue;\n }\n i++;\n }\n flush(end);\n return out;\n }\n\n return parseInlineRange(0, buf.length);\n}\n\n/* ------------------------------------------------------------------ *\n * Entry point\n * ------------------------------------------------------------------ */\n\n/**\n * Parse Markdown/MDX source into an offset-exact {@link Document}.\n *\n * `options` gates the opt-in extensions (math, footnotes, definition lists);\n * every flag defaults to `false`, so `parse(src)` is unchanged from before.\n */\nexport function parse(src: string, options?: ParseOptions): Document {\n opts = {\n math: options?.math === true,\n footnotes: options?.footnotes === true,\n defLists: options?.defLists === true,\n };\n const lines = splitLines(src);\n const children = parseBlocks(lines);\n return { type: 'document', from: 0, to: src.length, children };\n}\n\n/* ------------------------------------------------------------------ *\n * Incremental reparse\n *\n * `parseIncremental` returns a document DEEP-EQUAL to `parse(nextSrc, options)`\n * but computed by reusing the leading top-level blocks of a previous parse that\n * the edit provably cannot have touched, then reparsing from the first safe block\n * boundary at/before the edit through to the end of `nextSrc`.\n *\n * Correctness rests on one invariant: every reused block's parse depends only on\n * the source PREFIX before the reparse cut, and that prefix is byte-identical in\n * `prevSrc` and `nextSrc` (the edit is entirely at/after the cut). Whenever a safe\n * cut cannot be cheaply proven, we fall back to a full `parse` — a correct result\n * is never sacrificed for a fast one.\n *\n * When possible the reparse is ALSO bounded on the RIGHT: rather than reparsing\n * from the cut to end-of-document, we reparse only the dirty block(s) plus a safe\n * look-around, then reuse the unchanged SUFFIX blocks from `prev`, re-offset by the\n * edit's length delta. That suffix reuse is only taken when a clean, self-terminated\n * dirty-region boundary can be PROVEN by a small bounded reparse that includes the\n * join line (an open fence / list / etc. that would bleed past the join makes the\n * proof fail, and we fall back to the reparse-to-EOF path — still correct, just less\n * tight). A small edit near the TOP of a large document therefore reparses a bounded\n * region instead of the whole tail. The one-way property test in\n * `parser.incremental.test.ts` is the oracle that enforces the deep-equality.\n * ------------------------------------------------------------------ */\n\n/** Instrumentation about what an incremental reparse reused vs rebuilt. */\nexport interface IncrementalStats {\n /** True when the fast path bailed and a full {@link parse} produced the result. */\n fellBack: boolean;\n /** Count of leading top-level blocks reused verbatim from the previous document. */\n reusedBlocks: number;\n /** Line index in `nextSrc` from which blocks were reparsed (0 ⇒ whole document). */\n reparsedFromLine: number;\n /**\n * Line index in `nextSrc` at which the reparsed region ENDS (exclusive). Equals\n * {@link totalLines} when the reparse ran to end-of-document (no suffix reuse); a\n * value `< totalLines` means the tail was bounded and trailing blocks were reused.\n */\n reparsedToLine: number;\n /** Count of trailing top-level blocks reused from `prev` (re-offset by the edit delta). */\n reusedSuffixBlocks: number;\n /** Total number of content lines in `nextSrc`. */\n totalLines: number;\n}\n\n/** The document plus {@link IncrementalStats} from {@link parseIncrementalWithStats}. */\nexport interface IncrementalResult {\n doc: Document;\n stats: IncrementalStats;\n}\n\ntype HeadSafety = 'always' | 'needs-blank' | 'never';\n\n/**\n * How safe it is to keep `block` as the LAST block of the reused prefix — i.e.\n * whether, once the source AFTER it changes, `block`'s parse could grow past the\n * cut and swallow the new content.\n *\n * - `always` self-delimiting or single-line: its extent never depends on\n * what follows (heading, thematic break, or a *closed* fenced /\n * `$$` block — an unclosed one runs to EOF and so is never an\n * interior block).\n * - `needs-blank` terminates only at a blank line: safe **iff** a blank line\n * sits between it and the cut. That blank, being before the edit,\n * is preserved in `nextSrc`, so no edit can un-terminate it.\n * - `never` lazily continues across blank lines by indentation, so a later\n * edit could indent a following line into it — indented code,\n * lists, footnote definitions and definition lists.\n */\nfunction headSafety(block: Block): HeadSafety {\n switch (block.type) {\n case 'heading':\n case 'thematicBreak':\n case 'mathBlock':\n return 'always';\n case 'codeBlock':\n return block.fenced ? 'always' : 'never';\n case 'paragraph':\n case 'table':\n case 'htmlBlock':\n case 'blockquote':\n return 'needs-blank';\n default:\n // list, footnoteDef, defList — loose/lazy continuation across blanks.\n return 'never';\n }\n}\n\n/** Is the source line ending just before `lineStart` (itself a line start) blank? */\nfunction prevLineIsBlank(src: string, lineStart: number): boolean {\n if (lineStart <= 0) return false;\n // `lineStart` is a line start ⇒ `src[lineStart - 1]` is the '\\n' ending the\n // previous line. Walk back to that line's own start and test it for blankness.\n const end = lineStart - 1;\n let start = end - 1;\n while (start >= 0 && src[start] !== '\\n') start--;\n start += 1;\n return src.slice(start, end).trim() === '';\n}\n\n/**\n * Like {@link prevLineIsBlank}, but ALSO requires the blank line to lie entirely at\n * or after `minStart` — i.e. wholly inside the source region the edit did not touch.\n * Used to prove a suffix-join boundary sits behind an unchanged blank separator, so\n * no construct can lazily bridge the reparsed dirty region into the reused suffix.\n */\nfunction blankLineFullyAfter(src: string, lineStart: number, minStart: number): boolean {\n if (lineStart <= 0) return false;\n const end = lineStart - 1; // the '\\n' that terminated the previous line\n let start = end - 1;\n while (start >= 0 && src[start] !== '\\n') start--;\n start += 1;\n if (start < minStart) return false; // blank line straddles / precedes the edit\n return src.slice(start, end).trim() === '';\n}\n\n/**\n * Deep-clone a block, shifting every `from`/`to` (and `contentFrom`, where present)\n * by `delta`. Used to re-offset an unchanged SUFFIX block reused from `prev` into\n * `nextSrc` coordinates without reparsing it. Walks the WHOLE subtree (nested\n * blocks, inline children, table cells, list/def items) via the shared {@link walk},\n * so no offset-bearing node is missed. `prev` is never mutated.\n */\nfunction shiftBlock(block: Block, delta: number): Block {\n const clone = structuredClone(block) as Block;\n walk(clone as AstNode, (n) => {\n const p = n as { from: number; to: number; contentFrom?: number };\n p.from += delta;\n p.to += delta;\n if (typeof p.contentFrom === 'number') p.contentFrom += delta;\n });\n return clone;\n}\n\n/** Index of the line in `lines` that begins exactly at offset `off`, or -1. */\nfunction lineStartingAt(lines: Line[], off: number): number {\n let lo = 0;\n let hi = lines.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const f = lines[mid]!.from;\n if (f === off) return mid;\n if (f < off) lo = mid + 1;\n else hi = mid - 1;\n }\n return -1;\n}\n\n/** Largest index `k` with `blocks[k].from <= off` (blocks are offset-ordered), or -1. */\nfunction lastBlockAtOrBefore(blocks: Block[], off: number): number {\n let lo = 0;\n let hi = blocks.length - 1;\n let ans = -1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (blocks[mid]!.from <= off) {\n ans = mid;\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return ans;\n}\n\n/** A proven bounded reparse: the freshly parsed dirty blocks + the reused, re-offset suffix. */\ninterface SuffixReuse {\n /** Freshly parsed dirty blocks, already carrying absolute `nextSrc` offsets. */\n dirty: Block[];\n /** Trailing blocks reused from `prev`, re-offset by the edit delta. */\n shifted: Block[];\n /** Line index in `nextSrc` at which the reparsed dirty region ends (exclusive). */\n endLine: number;\n /** Count of reused suffix blocks. */\n count: number;\n}\n\n/** Cap on how many join candidates we probe before giving up (bounds worst-case cost). */\nconst MAX_JOIN_ATTEMPTS = 4;\n\n/**\n * Try to bound the reparse on the RIGHT so a small edit near the top of a large doc\n * does not reparse the whole tail. Given the prefix cut (`cLine`/`k` already chosen),\n * find a prev block boundary AFTER the change whose reuse can be PROVEN sound, reparse\n * only `[cLine, joinLine)`, and reuse the trailing prev blocks re-offset by `delta`.\n *\n * Correctness rests on three facts:\n * 1. Suffix content is byte-identical (shifted by `delta`) — guaranteed by only\n * considering join offsets `>= to` (everything at/after the edit is unchanged).\n * 2. `parseBlocks` is strictly left-to-right, so the reused suffix `blocks[j..]`\n * equals `parseBlocks(nextLines.slice(joinLine))` shifted — *provided* a real\n * block boundary exists at the join in the full parse of `nextSrc`.\n * 3. That boundary is PROVEN by a bounded reparse that includes the join line: if\n * a block starts exactly at the join offset, no open construct (fence, list,\n * indented code, …) from the dirty region bled across it. If the proof fails we\n * return `null` and the caller falls back to reparse-to-EOF (still correct).\n * `opts` must already be set for `parseBlocks`.\n */\nfunction tryReuseSuffix(\n blocks: Block[],\n prevSrc: string,\n to: number,\n delta: number,\n nextLines: Line[],\n cLine: number,\n): SuffixReuse | null {\n // Last prev block starting at/before the change end — the dirty region covers it;\n // the first reuse candidate is the block after it.\n const dEnd = lastBlockAtOrBefore(blocks, to);\n let attempts = 0;\n for (let j = dEnd + 1; j < blocks.length; j++) {\n const joinOff = blocks[j]!.from;\n if (joinOff < to) continue; // suffix must be entirely in the unchanged region\n // A blank line wholly inside the unchanged region must precede the join, so no\n // lazily-continuing construct can bridge the dirty region into the suffix.\n if (!blankLineFullyAfter(prevSrc, joinOff, to)) continue;\n const nextJoinOff = joinOff + delta;\n const joinLine = lineStartingAt(nextLines, nextJoinOff);\n if (joinLine <= cLine) continue; // must reparse a non-empty region below the cut\n\n if (++attempts > MAX_JOIN_ATTEMPTS) break; // bound the probing cost, then fall back\n\n // Bounded, boundary-proving reparse: include the join line. A block starting\n // exactly at `nextJoinOff` proves the dirty region self-terminates there.\n const guard = parseBlocks(nextLines.slice(cLine, joinLine + 1));\n const dirty: Block[] = [];\n let proven = false;\n for (const b of guard) {\n if (b.from === nextJoinOff) {\n proven = true;\n break;\n }\n if (b.from > nextJoinOff) break; // overshot ⇒ no clean boundary here\n dirty.push(b);\n }\n if (!proven) continue; // an open construct crossed the join — try the next candidate\n\n const rest = blocks.slice(j);\n // Always clone the reused suffix — even at `delta === 0`. Returning `prev`'s\n // own block objects would alias subtrees between the old and new documents;\n // `shiftBlock(b, 0)` is a pure structuredClone (no-op offset shift), so the\n // returned tree never shares node identity with `prev`. (Insertions already\n // pay this clone; a same-length edit is no different.)\n const shifted = rest.map((b) => shiftBlock(b, delta));\n return { dirty, shifted, endLine: joinLine, count: rest.length };\n }\n return null;\n}\n\nfunction runIncremental(\n prev: Document,\n prevSrc: string,\n change: Change,\n nextSrc: string,\n options: ParseOptions | undefined,\n): IncrementalResult {\n const nextLines = splitLines(nextSrc);\n const total = nextLines.length;\n const full = (): IncrementalResult => ({\n doc: parse(nextSrc, options),\n stats: {\n fellBack: true,\n reusedBlocks: 0,\n reparsedFromLine: 0,\n reparsedToLine: total,\n reusedSuffixBlocks: 0,\n totalLines: total,\n },\n });\n\n // Normalize + validate the change against prevSrc. A malformed or inconsistent\n // change is never trusted — a correct full parse is always the safe answer.\n const from = Math.max(0, Math.min(change.from, change.to));\n const to = Math.min(prevSrc.length, Math.max(change.from, change.to));\n if (to < from) return full();\n if (nextSrc.length !== prevSrc.length + change.insert.length - (to - from)) return full();\n // Every candidate cut satisfies `cut <= from`, so a single check that the\n // prefix `[0, from)` is byte-identical proves every reused prefix identical.\n if (prevSrc.slice(0, from) !== nextSrc.slice(0, from)) return full();\n\n // Offset shift applied to any source position at/after the edit end `to`.\n const delta = change.insert.length - (to - from);\n\n const blocks = prev.children;\n const hi = Math.min(blocks.length - 1, lastBlockAtOrBefore(blocks, from));\n for (let k = hi; k >= 1; k--) {\n const cut = blocks[k]!.from; // reuse blocks[0..k-1]; reparse from `cut`\n if (cut > from) continue; // head must lie entirely before the edit\n const safety = headSafety(blocks[k - 1]!);\n if (safety === 'never') continue;\n if (safety === 'needs-blank' && !prevLineIsBlank(prevSrc, cut)) continue;\n const c = lineStartingAt(nextLines, cut);\n if (c < 0) continue; // `cut` is not a line start in nextSrc (should not happen)\n\n // The reparse runs `parseBlocks`, which reads the module-scoped `opts`; set\n // them from `options` so the reparsed region matches a full parse exactly.\n opts = {\n math: options?.math === true,\n footnotes: options?.footnotes === true,\n defLists: options?.defLists === true,\n };\n\n // Try to bound the reparse on the right and reuse the unchanged suffix; this\n // is what makes a top-of-doc edit cheap. If no clean boundary can be proven,\n // fall back to reparsing the whole tail (still correct, just not as tight).\n const suffix = tryReuseSuffix(blocks, prevSrc, to, delta, nextLines, c);\n if (suffix) {\n const children = blocks.slice(0, k).concat(suffix.dirty, suffix.shifted);\n return {\n doc: { type: 'document', from: 0, to: nextSrc.length, children },\n stats: {\n fellBack: false,\n reusedBlocks: k,\n reparsedFromLine: c,\n reparsedToLine: suffix.endLine,\n reusedSuffixBlocks: suffix.count,\n totalLines: total,\n },\n };\n }\n\n const tail = parseBlocks(nextLines.slice(c));\n const children = blocks.slice(0, k).concat(tail);\n return {\n doc: { type: 'document', from: 0, to: nextSrc.length, children },\n stats: {\n fellBack: false,\n reusedBlocks: k,\n reparsedFromLine: c,\n reparsedToLine: total,\n reusedSuffixBlocks: 0,\n totalLines: total,\n },\n };\n }\n return full();\n}\n\n/**\n * Incrementally reparse `prev` (the parse of `prevSrc`) after a single\n * {@link Change} produced `nextSrc`. The result is deep-equal to\n * `parse(nextSrc, options)`; pass the SAME `options` that produced `prev`.\n */\nexport function parseIncremental(\n prev: Document,\n prevSrc: string,\n change: Change,\n nextSrc: string,\n options?: ParseOptions,\n): Document {\n return runIncremental(prev, prevSrc, change, nextSrc, options).doc;\n}\n\n/** {@link parseIncremental} plus {@link IncrementalStats} about what was reused. */\nexport function parseIncrementalWithStats(\n prev: Document,\n prevSrc: string,\n change: Change,\n nextSrc: string,\n options?: ParseOptions,\n): IncrementalResult {\n return runIncremental(prev, prevSrc, change, nextSrc, options);\n}\n","/**\n * AST → sanitized HTML renderer.\n *\n * This is the `read`/`preview` output path (SPEC.md §4): it walks the offset-exact\n * AST produced by the parser and emits HTML that is safe to inject into a host\n * page. Safety is structural, not incidental:\n *\n * - every text / attribute value is HTML-escaped (`&`, `<`, `>`, `\"`);\n * - every URL passes {@link safeUrl}, so `javascript:` / `data:` / other active\n * schemes collapse to `#`;\n * - raw HTML / MDX blocks are emitted ESCAPED inside `<pre>` — this renderer\n * never re-emits untrusted markup, so it can be used on model output;\n * - footnote / definition ids are slugged to a URL-safe charset *and* escaped\n * before they reach an `id`/`href` attribute.\n *\n * The renderer never throws: malformed / partial nodes degrade to escaped text.\n *\n * {@link RenderOptions} lets a host plug in escaped-HTML producers for the two\n * constructs the core cannot render on its own — syntax highlighting and a math\n * engine. Both are trusted to return already-escaped HTML; without them the\n * renderer falls back to the safe escaped-source form. Passing no options\n * reproduces the exact default behaviour.\n */\n\nimport { walk } from './ast';\nimport type {\n Block,\n Document,\n FootnoteDef,\n Inline,\n ListItem,\n Table,\n TableCell,\n} from './ast';\n\n/** Hard cap on a URL length we are willing to place in an attribute. */\nconst MAX_URL = 8192;\n/** Schemes we consider inert enough to keep. */\nconst SAFE_SCHEMES = /^(https?:|mailto:)/;\n\n/* ------------------------------------------------------------------ *\n * Host-supplied render hooks\n * ------------------------------------------------------------------ */\n\n/**\n * Optional, host-supplied output producers for constructs the core cannot\n * render itself. Both hooks MUST return already-escaped, safe HTML — the\n * renderer trusts their output and does not re-escape it. Omitting a hook (or\n * the whole object) falls back to the safe escaped-source form.\n */\nexport interface RenderOptions {\n /**\n * Syntax highlighter for fenced code. Receives the fence info string and the\n * raw code; returns escaped HTML (e.g. `<span class=\"tw-tok-…\">` runs). The\n * host is responsible for escaping — see {@link highlightToHtml}.\n */\n highlight?: (lang: string, code: string) => string;\n /**\n * Math engine. Receives the TeX source and whether it is display math;\n * returns escaped/safe HTML. Without it, math renders as escaped source.\n */\n math?: (src: string, display: boolean) => string;\n}\n\n/**\n * Per-render footnote numbering context. Footnote references are numbered in\n * first-seen order across a single render pass (keyed by the slugged id, so\n * repeated references to the same note share a number). Held in a small object\n * threaded through the walk rather than in module state, so rendering stays\n * re-entrant.\n */\ninterface FnCtx {\n /** Slugged footnote id → its 1-based display number, in first-seen order. */\n nums: Map<string, number>;\n}\n\nfunction newFnCtx(): FnCtx {\n return { nums: new Map() };\n}\n\n/** The display number for a footnote id, allocating one on first sight. */\nfunction fnNumber(ctx: FnCtx, slug: string): number {\n const existing = ctx.nums.get(slug);\n if (existing !== undefined) return existing;\n const n = ctx.nums.size + 1;\n ctx.nums.set(slug, n);\n return n;\n}\n\n/* ------------------------------------------------------------------ *\n * Escaping + URL safety\n * ------------------------------------------------------------------ */\n\n/** Escape the five characters that matter in HTML text / double-quoted attrs. */\nfunction escapeHtml(value: string): string {\n let out = '';\n for (let i = 0; i < value.length; i++) {\n const ch = value.charCodeAt(i);\n switch (ch) {\n case 38 /* & */:\n out += '&amp;';\n break;\n case 60 /* < */:\n out += '&lt;';\n break;\n case 62 /* > */:\n out += '&gt;';\n break;\n case 34 /* \" */:\n out += '&quot;';\n break;\n default:\n out += value[i];\n }\n }\n return out;\n}\n\n/**\n * Reduce a footnote label to a slug that is safe both as an `id` attribute and\n * as a `#fragment` in an `href`: keep ASCII letters/digits/`_`/`-`, collapse any\n * other run to a single `-`. An empty result falls back to `_` so the id is\n * never blank. The same slug is applied to refs and defs, so their ids match.\n */\nfunction slugFootnoteId(id: string): string {\n const slug = id.replace(/[^A-Za-z0-9_-]+/g, '-');\n return slug === '' ? '_' : slug;\n}\n\n/**\n * Return `url` when it is safe to place in an `href`/`src`, otherwise `'#'`.\n *\n * Safe = an http/https/mailto absolute URL, OR anything without an explicit\n * scheme (relative paths, `?query`, `#anchor`, protocol-relative `//host`).\n * Any other scheme (`javascript:`, `data:`, `vbscript:`, `file:`, …) is denied.\n *\n * Scheme detection is done against a copy with whitespace + control characters\n * stripped, so obfuscations like `java\\tscript:` or a leading newline can't\n * smuggle an active scheme past the check.\n */\nexport function safeUrl(url: string): string {\n if (typeof url !== 'string' || url.length === 0) return '#';\n const trimmed = url.trim().slice(0, MAX_URL);\n if (trimmed === '') return '#';\n\n // Fold away whitespace + C0/DEL controls for the scheme test ONLY.\n const probe = trimmed.replace(/[\\u0000-\\u0020\\u007f]/g, '').toLowerCase();\n if (probe === '') return '#';\n\n // An allowed absolute scheme is fine.\n if (SAFE_SCHEMES.test(probe)) return trimmed;\n\n // Any OTHER explicit scheme (letter run followed by a colon) is denied.\n // Relative / anchor / protocol-relative URLs never match (they start with\n // `#`, `/`, `.`, `?`, or a bare path segment with no leading scheme colon).\n if (/^[a-z][a-z0-9+.-]*:/.test(probe)) return '#';\n\n return trimmed;\n}\n\n/** Convenience: an escaped, safety-checked URL ready for an attribute. */\nfunction attrUrl(url: string): string {\n return escapeHtml(safeUrl(url));\n}\n\n/* ------------------------------------------------------------------ *\n * Inline\n * ------------------------------------------------------------------ */\n\n/** Render a run of inline nodes to sanitized HTML. */\nexport function renderInline(nodes: Inline[], options?: RenderOptions): string {\n return inlineRun(nodes, options, newFnCtx());\n}\n\nfunction inlineRun(\n nodes: Inline[],\n options: RenderOptions | undefined,\n ctx: FnCtx,\n): string {\n let out = '';\n for (const node of nodes) out += renderInlineNode(node, options, ctx);\n return out;\n}\n\nfunction renderInlineNode(\n node: Inline,\n options: RenderOptions | undefined,\n ctx: FnCtx,\n): string {\n switch (node.type) {\n case 'text':\n return escapeHtml(node.value);\n case 'strong':\n return `<strong>${inlineRun(node.children, options, ctx)}</strong>`;\n case 'emphasis':\n return `<em>${inlineRun(node.children, options, ctx)}</em>`;\n case 'strikethrough':\n return `<del>${inlineRun(node.children, options, ctx)}</del>`;\n case 'inlineCode':\n return `<code>${escapeHtml(node.value)}</code>`;\n case 'link': {\n const title = node.title ? ` title=\"${escapeHtml(node.title)}\"` : '';\n return `<a href=\"${attrUrl(node.url)}\"${title}>${inlineRun(node.children, options, ctx)}</a>`;\n }\n case 'image': {\n const title = node.title ? ` title=\"${escapeHtml(node.title)}\"` : '';\n return `<img src=\"${attrUrl(node.url)}\" alt=\"${escapeHtml(node.alt)}\"${title}>`;\n }\n case 'autolink':\n return `<a href=\"${attrUrl(node.url)}\">${escapeHtml(node.url)}</a>`;\n case 'break':\n return node.hard ? '<br>\\n' : '\\n';\n case 'math':\n // Host math engine (trusted, returns escaped HTML) or safe escaped source.\n return options?.math\n ? options.math(node.value, node.display)\n : `<span class=\"tw-math-src\">${escapeHtml(node.value)}</span>`;\n case 'footnoteRef': {\n // GitHub-style superscript back-reference. The def with the matching id\n // is collected + rendered once at the end of the document (see\n // renderToHtml). Number is first-seen order; id links the two ends.\n const slug = slugFootnoteId(node.id);\n const n = fnNumber(ctx, slug);\n const safe = escapeHtml(slug);\n return `<sup class=\"tw-fnref\" id=\"fnref-${safe}\"><a href=\"#fn-${safe}\">[${n}]</a></sup>`;\n }\n default: {\n // Exhaustiveness guard — a new inline type must be handled above.\n const _never: never = node;\n return _never as never;\n }\n }\n}\n\n/* ------------------------------------------------------------------ *\n * Blocks\n * ------------------------------------------------------------------ */\n\n/** Render a single block node to sanitized HTML. */\nexport function renderNode(node: Block, options?: RenderOptions): string {\n return renderBlockNode(node, options, newFnCtx());\n}\n\nfunction renderBlockNode(\n node: Block,\n options: RenderOptions | undefined,\n ctx: FnCtx,\n): string {\n switch (node.type) {\n case 'heading': {\n const l = node.level;\n return `<h${l}>${inlineRun(node.children, options, ctx)}</h${l}>`;\n }\n case 'paragraph':\n return `<p>${inlineRun(node.children, options, ctx)}</p>`;\n case 'blockquote':\n return `<blockquote>${renderBlocks(node.children, options, ctx)}</blockquote>`;\n case 'list':\n return renderList(node.ordered, node.start, node.tight, node.items, options, ctx);\n case 'codeBlock': {\n const cls = node.lang\n ? ` class=\"language-${escapeHtml(node.lang)}\"`\n : '';\n // The highlighter is trusted to return escaped HTML; the default path\n // escapes here so raw code is never emitted live either way.\n const body = options?.highlight\n ? options.highlight(node.lang, node.value)\n : escapeHtml(node.value);\n return `<pre><code${cls}>${body}</code></pre>`;\n }\n case 'thematicBreak':\n return '<hr>';\n case 'table':\n return renderTable(node, options, ctx);\n case 'htmlBlock':\n // The safety boundary: raw HTML / MDX is emitted ESCAPED, never live.\n return `<pre>${escapeHtml(node.value)}</pre>`;\n case 'mathBlock':\n // A math block is always display math; host engine or escaped source.\n return options?.math\n ? options.math(node.value, true)\n : `<div class=\"tw-math-src\">${escapeHtml(node.value)}</div>`;\n case 'footnoteDef':\n // Canonical placement is the collected <section> that renderToHtml\n // appends. A standalone renderNode(footnoteDef) still renders its body\n // for completeness (renderBlocks skips defs only in document flow).\n return `<div class=\"tw-footnote-def\">${renderBlocks(node.children, options, ctx)}</div>`;\n case 'defList': {\n let out = '';\n for (const item of node.items) {\n out += `<dt>${inlineRun(item.term, options, ctx)}</dt>`;\n for (const def of item.definitions) {\n out += `<dd>${renderBlocks(def, options, ctx)}</dd>`;\n }\n }\n return `<dl>${out}</dl>`;\n }\n default: {\n const _never: never = node;\n return _never as never;\n }\n }\n}\n\n/**\n * Render a sequence of blocks in document flow. Footnote definitions are\n * skipped here: they are collected by {@link renderToHtml} and emitted once as\n * a trailing `<section>`, never inline where they were authored.\n */\nfunction renderBlocks(\n blocks: Block[],\n options: RenderOptions | undefined,\n ctx: FnCtx,\n): string {\n let out = '';\n for (const b of blocks) {\n if (b.type === 'footnoteDef') continue;\n out += renderBlockNode(b, options, ctx);\n }\n return out;\n}\n\nfunction renderList(\n ordered: boolean,\n start: number,\n tight: boolean,\n items: ListItem[],\n options: RenderOptions | undefined,\n ctx: FnCtx,\n): string {\n const tag = ordered ? 'ol' : 'ul';\n const startAttr =\n ordered && Number.isFinite(start) && start !== 1\n ? ` start=\"${escapeHtml(String(Math.trunc(start)))}\"`\n : '';\n let body = '';\n for (const item of items) body += renderListItem(item, tight, options, ctx);\n return `<${tag}${startAttr}>${body}</${tag}>`;\n}\n\nfunction renderListItem(\n item: ListItem,\n tight: boolean,\n options: RenderOptions | undefined,\n ctx: FnCtx,\n): string {\n let checkbox = '';\n if (item.task !== null) {\n const checked = item.task === 'checked' ? ' checked' : '';\n checkbox = `<input type=\"checkbox\" disabled${checked}> `;\n }\n return `<li>${checkbox}${renderItemChildren(item.children, tight, options, ctx)}</li>`;\n}\n\n/**\n * In a tight list a lone paragraph child renders WITHOUT its `<p>` wrapper\n * (GFM tight-list behaviour), so a task item reads `<li><input…> text</li>`.\n * Loose lists keep full block structure.\n */\nfunction renderItemChildren(\n children: Block[],\n tight: boolean,\n options: RenderOptions | undefined,\n ctx: FnCtx,\n): string {\n if (tight) {\n let out = '';\n for (const child of children) {\n out +=\n child.type === 'paragraph'\n ? inlineRun(child.children, options, ctx)\n : renderBlockNode(child, options, ctx);\n }\n return out;\n }\n return renderBlocks(children, options, ctx);\n}\n\nfunction renderTable(\n node: Table,\n options: RenderOptions | undefined,\n ctx: FnCtx,\n): string {\n const align = node.align;\n const cellStyle = (col: number): string => {\n const a = align[col];\n return a ? ` style=\"text-align:${a}\"` : '';\n };\n\n const headCells = renderRow(node.header, 'th', cellStyle, options, ctx);\n const head = `<thead><tr>${headCells}</tr></thead>`;\n\n let bodyRows = '';\n for (const row of node.rows) {\n bodyRows += `<tr>${renderRow(row, 'td', cellStyle, options, ctx)}</tr>`;\n }\n const body = `<tbody>${bodyRows}</tbody>`;\n\n return `<table>${head}${body}</table>`;\n}\n\nfunction renderRow(\n cells: TableCell[],\n tag: 'th' | 'td',\n cellStyle: (col: number) => string,\n options: RenderOptions | undefined,\n ctx: FnCtx,\n): string {\n let out = '';\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i]!;\n out += `<${tag}${cellStyle(i)}>${inlineRun(cell.children, options, ctx)}</${tag}>`;\n }\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Document\n * ------------------------------------------------------------------ */\n\n/** Every footnote definition in the document, in document order. */\nfunction collectFootnoteDefs(doc: Document): FootnoteDef[] {\n const defs: FootnoteDef[] = [];\n walk(doc, (n) => {\n if (n.type === 'footnoteDef') {\n defs.push(n);\n return false; // don't descend into a def's body while collecting\n }\n return true;\n });\n return defs;\n}\n\n/** Render a whole document to sanitized HTML. */\nexport function renderToHtml(doc: Document, options?: RenderOptions): string {\n const ctx = newFnCtx();\n let out = renderBlocks(doc.children, options, ctx);\n\n // Collect every footnote definition (from anywhere in the tree) and emit it\n // once, GitHub-style, as a trailing ordered list with a back-link per note.\n const defs = collectFootnoteDefs(doc);\n if (defs.length > 0) {\n let items = '';\n for (const def of defs) {\n const safe = escapeHtml(slugFootnoteId(def.id));\n items +=\n `<li id=\"fn-${safe}\">` +\n renderBlocks(def.children, options, ctx) +\n ` <a href=\"#fnref-${safe}\" class=\"tw-fn-back\">↩</a>` +\n `</li>`;\n }\n out += `<section class=\"tw-footnotes\"><ol>${items}</ol></section>`;\n }\n\n return out;\n}\n","/**\n * Unified (Obsidian-style live-preview) source-revealing logic.\n *\n * In `unified` mode the formatting renders inline, but the raw syntax markers\n * (a heading's `### `, an emphasis `*`, a link's `](url)`, …) are hidden UNLESS\n * the caret/selection is on top of them — then they reveal so you can edit the\n * source. This module is pure and offset-exact: it maps the AST to the set of\n * hideable marker ranges (`collectMarkers`) and decides which stay hidden for a\n * given selection (`hiddenMarkers`). It never mutates the tree or the string.\n */\n\nimport { walk } from './ast';\nimport type { Document, Pos } from './ast';\n\n/**\n * A hideable syntax-marker range: `[from, to)` with a `kind` tag.\n *\n * `kind` is an open string (not a closed union) so new marker families can be\n * added without a breaking type change. The kinds currently emitted are\n * `heading`, `emphasis`, `strong`, `strike`, `code`, `link`, `image`,\n * `listMarker`, `math`, `footnoteRef`, `fence` and `blockquote`.\n */\nexport interface Marker extends Pos {\n kind: string;\n}\n\n/**\n * Every hideable syntax-marker range in the document, in document order.\n *\n * Covers: heading `#… ` prefixes, the two emphasis/strong/strike delimiter runs\n * on each side, inline-code backtick fences, link `[`/`](`/url/`)` pieces, the\n * image `!` (plus its bracket/paren pieces), list-item markers, inline-math `$`\n * (or `$$`) delimiters, and footnote-reference `[^`/`]` brackets.\n *\n * When the original `source` string is supplied it additionally emits the\n * `fence` (opening + closing fenced-code lines) and `blockquote` (the leading\n * `>` run on each quoted line) markers — these need the raw text to be\n * offset-exact, so they are omitted when `source` is not passed (keeping the\n * source-free call identical to before). Always pure; never mutates.\n */\nexport function collectMarkers(doc: Document, source?: string): Marker[] {\n const markers: Marker[] = [];\n const push = (from: number, to: number, kind: string): void => {\n if (to > from) markers.push({ from, to, kind });\n };\n\n walk(doc, (node) => {\n switch (node.type) {\n case 'heading': {\n // '#… ' prefix up to the start of content.\n push(node.from, node.contentFrom, 'heading');\n break;\n }\n case 'emphasis':\n case 'strong':\n case 'strikethrough': {\n const kind = node.type === 'strikethrough' ? 'strike' : node.type;\n const kids = node.children;\n const first = kids[0];\n const last = kids[kids.length - 1];\n const innerFrom = first ? first.from : node.to;\n const innerTo = last ? last.to : node.from;\n push(node.from, innerFrom, kind); // opening delimiter run\n push(innerTo, node.to, kind); // closing delimiter run\n break;\n }\n case 'inlineCode': {\n const ticks = Math.max(1, node.ticks);\n const openTo = Math.min(node.from + ticks, node.to);\n const closeFrom = Math.max(node.to - ticks, openTo);\n push(node.from, openTo, 'code'); // opening backtick fence\n push(closeFrom, node.to, 'code'); // closing backtick fence\n break;\n }\n case 'link': {\n const kids = node.children;\n const last = kids[kids.length - 1];\n const textEnd = last ? last.to : node.from + 1;\n const midTo = Math.min(textEnd + 2, node.to);\n push(node.from, Math.min(node.from + 1, node.to), 'link'); // '['\n push(textEnd, midTo, 'link'); // ']('\n push(midTo, node.to - 1, 'link'); // url (+ optional title)\n push(Math.max(node.to - 1, node.from), node.to, 'link'); // ')'\n break;\n }\n case 'image': {\n const bracketOpen = node.from + 1;\n const altStart = bracketOpen + 1;\n const altEnd = Math.min(altStart + node.alt.length, node.to);\n const midTo = Math.min(altEnd + 2, node.to);\n push(node.from, Math.min(node.from + 1, node.to), 'image'); // '!'\n push(bracketOpen, Math.min(bracketOpen + 1, node.to), 'image'); // '['\n push(altEnd, midTo, 'image'); // ']('\n push(midTo, node.to - 1, 'image'); // url (+ optional title)\n push(Math.max(node.to - 1, node.from), node.to, 'image'); // ')'\n break;\n }\n case 'listItem': {\n // The list marker up to the start of item content (`- `, `1. `, `- [x] `).\n push(node.from, node.contentFrom, 'listMarker');\n break;\n }\n case 'math': {\n // The `$` (inline) / `$$` (display) fences on each side of the source.\n const delim = node.display ? 2 : 1;\n const openTo = Math.min(node.from + delim, node.to);\n const closeFrom = Math.max(node.to - delim, openTo);\n push(node.from, openTo, 'math'); // opening `$`/`$$`\n push(closeFrom, node.to, 'math'); // closing `$`/`$$`\n break;\n }\n case 'footnoteRef': {\n // `[^` opener and `]` closer; the id between them stays as content.\n const openTo = Math.min(node.from + 2, node.to);\n const closeFrom = Math.max(node.to - 1, openTo);\n push(node.from, openTo, 'footnoteRef'); // `[^`\n push(closeFrom, node.to, 'footnoteRef'); // `]`\n break;\n }\n case 'codeBlock': {\n // Only *fenced* blocks have marker lines (indented code has none), and\n // we need the raw text to locate the fence lines offset-exactly.\n if (!source || !node.fenced) break;\n // Opening fence line: the ``` `` ``/`~~~` run + info string, up to the\n // end of that first source line (the trailing newline is excluded).\n let openTo = source.indexOf('\\n', node.from);\n if (openTo === -1 || openTo > node.to) openTo = node.to;\n if (openTo > node.from && source[openTo - 1] === '\\r') openTo--;\n push(node.from, openTo, 'fence'); // opening fence line\n // Closing fence line: the block's last source line, emitted only when it\n // is a real closing fence. An unterminated fence's last line is content\n // (the parser would have closed on a genuine fence line), so the regex\n // check never false-fires; a container-nested close that does not sit at\n // the physical line start simply isn't emitted (never a wrong offset).\n const closeStart = source.lastIndexOf('\\n', node.to - 1) + 1;\n if (closeStart > node.from) {\n const closeText = source.slice(closeStart, node.to);\n const cm = /^( {0,3})(`{3,}|~{3,}) *$/.exec(closeText);\n const om = /^ {0,3}([`~])/.exec(source.slice(node.from, openTo));\n if (cm && om && cm[2]![0] === om[1]) push(closeStart, node.to, 'fence'); // closing fence line\n }\n break;\n }\n case 'blockquote': {\n if (!source) break;\n // Emit the leading `>` run per line only for a *root* blockquote whose\n // first line starts at a physical line boundary. For such a blockquote\n // every line in [from,to) begins with its quote run, which we can read\n // directly and offset-exactly. A blockquote nested inside another (its\n // `from` sits after an outer `>` prefix) is skipped — its prefixes are\n // already covered by the outer root's full per-line run.\n const lineStart = source.lastIndexOf('\\n', node.from - 1) + 1;\n if (lineStart !== node.from) break;\n let p = node.from;\n while (p < node.to) {\n let end = source.indexOf('\\n', p);\n if (end === -1 || end > node.to) end = node.to;\n // The stacked quote prefix on this line: `( {0,3}> ?)+`.\n const qm = /^(?: {0,3}> ?)+/.exec(source.slice(p, end));\n if (qm) push(p, p + qm[0].length, 'blockquote');\n p = end + 1; // step over the newline; exits when end === node.to\n }\n break;\n }\n }\n return true;\n });\n\n return markers;\n}\n\n/**\n * The markers that stay HIDDEN for a given selection: those whose `[from, to)`\n * does NOT intersect the selection widened by 1 on each side. Markers that DO\n * intersect are revealed (returned excluded), so the caret can edit the raw\n * syntax it sits on — the live-preview reveal rule.\n *\n * `source` is forwarded to {@link collectMarkers} so the fence/blockquote\n * markers participate in the reveal too; omit it to keep the source-free set.\n * The selection filter itself is unchanged.\n */\nexport function hiddenMarkers(\n doc: Document,\n sel: { from: number; to: number },\n source?: string,\n): Marker[] {\n const lo = Math.min(sel.from, sel.to) - 1;\n const hi = Math.max(sel.from, sel.to) + 1;\n // Half-open overlap of marker [from,to) with widened selection [lo,hi).\n const intersects = (m: Marker): boolean => m.from < hi && lo < m.to;\n return collectMarkers(doc, source).filter((m) => !intersects(m));\n}\n\n/**\n * Index into `doc.children` of the top-level block whose inclusive `[from, to]`\n * range contains `offset`, or -1 when the offset falls in a gap between blocks.\n */\nexport function activeBlockIndex(doc: Document, offset: number): number {\n const blocks = doc.children;\n for (let i = 0; i < blocks.length; i++) {\n const b = blocks[i];\n if (b && offset >= b.from && offset <= b.to) return i;\n }\n return -1;\n}\n","/**\n * Editing commands — pure transforms over `(text, selection)` used by the\n * formatting toolbar and keyboard shortcuts. Each returns the new text and the\n * new selection, so the caller (edit textarea / unified active block) can apply\n * it and restore the caret. Pure and framework-free — fully unit-testable.\n */\n\nexport type Command =\n | 'bold'\n | 'italic'\n | 'strikethrough'\n | 'inlineCode'\n | 'link'\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'heading4'\n | 'heading5'\n | 'heading6'\n | 'bulletList'\n | 'orderedList'\n | 'taskList'\n | 'quote'\n | 'horizontalRule'\n | 'codeBlock'\n | 'table';\n\n/** Metadata describing a command for enumerable surfaces (toolbar, palette, keymap). */\nexport interface CommandMeta {\n id: Command;\n label: string;\n /** Display shortcut (e.g. `⌘B`) when one is bound; omitted otherwise. */\n kbd?: string;\n group: 'inline' | 'block' | 'insert';\n}\n\n/**\n * The single source of truth enumerating every command — consumed by the\n * formatting toolbar, the command palette, and the keymap. Plain data, no side\n * effects; one entry per `Command` id (kept exhaustive by the `applyCommand`\n * `never` guard, which forces new ids to exist before they can be listed here).\n */\nexport const COMMANDS: readonly CommandMeta[] = [\n { id: 'bold', label: 'Bold', kbd: '⌘B', group: 'inline' },\n { id: 'italic', label: 'Italic', kbd: '⌘I', group: 'inline' },\n { id: 'strikethrough', label: 'Strikethrough', group: 'inline' },\n { id: 'inlineCode', label: 'Inline Code', kbd: '⌘E', group: 'inline' },\n { id: 'link', label: 'Link', kbd: '⌘K', group: 'inline' },\n { id: 'heading1', label: 'Heading 1', group: 'block' },\n { id: 'heading2', label: 'Heading 2', group: 'block' },\n { id: 'heading3', label: 'Heading 3', group: 'block' },\n { id: 'heading4', label: 'Heading 4', group: 'block' },\n { id: 'heading5', label: 'Heading 5', group: 'block' },\n { id: 'heading6', label: 'Heading 6', group: 'block' },\n { id: 'bulletList', label: 'Bullet List', group: 'block' },\n { id: 'orderedList', label: 'Ordered List', group: 'block' },\n { id: 'taskList', label: 'Task List', group: 'block' },\n { id: 'quote', label: 'Quote', group: 'block' },\n { id: 'horizontalRule', label: 'Horizontal Rule', group: 'insert' },\n { id: 'codeBlock', label: 'Code Block', group: 'insert' },\n { id: 'table', label: 'Table', group: 'insert' },\n];\n\nexport interface Sel {\n from: number;\n to: number;\n}\n\nexport interface CommandResult {\n text: string;\n selection: Sel;\n}\n\nfunction norm(sel: Sel): Sel {\n return { from: Math.min(sel.from, sel.to), to: Math.max(sel.from, sel.to) };\n}\n\n/** Toggle-wrap the selection in a symmetric inline marker (e.g. `**`). */\nfunction toggleWrap(text: string, sel: Sel, marker: string): CommandResult {\n const len = marker.length;\n const { from, to } = norm(sel);\n\n // already wrapped just OUTSIDE the selection → unwrap\n if (from >= len && text.slice(from - len, from) === marker && text.slice(to, to + len) === marker) {\n const t = text.slice(0, from - len) + text.slice(from, to) + text.slice(to + len);\n return { text: t, selection: { from: from - len, to: to - len } };\n }\n\n const selected = text.slice(from, to);\n\n // already wrapped INSIDE the selection → unwrap\n if (selected.length >= 2 * len && selected.startsWith(marker) && selected.endsWith(marker)) {\n const inner = selected.slice(len, selected.length - len);\n const t = text.slice(0, from) + inner + text.slice(to);\n return { text: t, selection: { from, to: from + inner.length } };\n }\n\n // wrap\n const t = text.slice(0, from) + marker + selected + marker + text.slice(to);\n if (from === to) return { text: t, selection: { from: from + len, to: from + len } };\n return { text: t, selection: { from: from + len, to: to + len } };\n}\n\nfunction insertLink(text: string, sel: Sel): CommandResult {\n const { from, to } = norm(sel);\n const label = text.slice(from, to) || 'text';\n const url = 'https://';\n const inserted = `[${label}](${url})`;\n const t = text.slice(0, from) + inserted + text.slice(to);\n const urlStart = from + label.length + 3; // '[' + label + '](' = len + 3\n return { text: t, selection: { from: urlStart, to: urlStart + url.length } };\n}\n\nconst HEADING_RE = /^ {0,3}#{1,6}\\s+/;\nconst LIST_RE = /^ {0,3}(?:[-*+]\\s(?:\\[[ xX]\\]\\s)?|\\d+[.)]\\s)/;\nconst QUOTE_RE = /^ {0,3}>\\s?/;\n\ninterface LinePrefix {\n has: (line: string) => boolean;\n strip: (line: string) => string;\n add: (line: string, index: number) => string;\n}\n\nfunction applyLinePrefix(text: string, sel: Sel, p: LinePrefix): CommandResult {\n const { from, to } = norm(sel);\n const start = text.lastIndexOf('\\n', from - 1) + 1;\n const searchFrom = to > from ? to - 1 : to;\n let end = text.indexOf('\\n', searchFrom);\n if (end === -1) end = text.length;\n\n const lines = text.slice(start, end).split('\\n');\n const allHave = lines.every((l) => l.trim() === '' || p.has(l));\n const out = lines\n .map((l, i) => (l.trim() === '' ? l : allHave ? p.strip(l) : p.add(p.strip(l), i)))\n .join('\\n');\n\n const t = text.slice(0, start) + out + text.slice(end);\n return { text: t, selection: { from: start, to: start + out.length } };\n}\n\nfunction stripAllPrefixes(line: string): string {\n return line.replace(HEADING_RE, '').replace(LIST_RE, '').replace(QUOTE_RE, '');\n}\n\nfunction insertBlock(text: string, sel: Sel, block: string, selectInner?: [number, number]): CommandResult {\n const { from, to } = norm(sel);\n const before = text.slice(0, from);\n const after = text.slice(to);\n const lead = before === '' || before.endsWith('\\n\\n') ? '' : before.endsWith('\\n') ? '\\n' : '\\n\\n';\n const trail = after === '' || after.startsWith('\\n\\n') ? '' : after.startsWith('\\n') ? '\\n' : '\\n\\n';\n const insertedAt = from + lead.length;\n const t = before + lead + block + trail + after;\n const selection: Sel = selectInner\n ? { from: insertedAt + selectInner[0], to: insertedAt + selectInner[1] }\n : { from: insertedAt, to: insertedAt + block.length };\n return { text: t, selection };\n}\n\nexport function applyCommand(text: string, sel: Sel, cmd: Command): CommandResult {\n switch (cmd) {\n case 'bold':\n return toggleWrap(text, sel, '**');\n case 'italic':\n return toggleWrap(text, sel, '*');\n case 'strikethrough':\n return toggleWrap(text, sel, '~~');\n case 'inlineCode':\n return toggleWrap(text, sel, '`');\n case 'link':\n return insertLink(text, sel);\n case 'heading1':\n case 'heading2':\n case 'heading3':\n case 'heading4':\n case 'heading5':\n case 'heading6': {\n const level =\n cmd === 'heading1'\n ? 1\n : cmd === 'heading2'\n ? 2\n : cmd === 'heading3'\n ? 3\n : cmd === 'heading4'\n ? 4\n : cmd === 'heading5'\n ? 5\n : 6;\n const marker = '#'.repeat(level) + ' ';\n return applyLinePrefix(text, sel, {\n has: (l) => new RegExp(`^ {0,3}#{${level}}\\\\s`).test(l),\n strip: (l) => l.replace(HEADING_RE, ''),\n add: (l) => marker + l,\n });\n }\n case 'bulletList':\n return applyLinePrefix(text, sel, {\n has: (l) => /^ {0,3}[-*+]\\s/.test(l),\n strip: stripAllPrefixes,\n add: (l) => '- ' + l,\n });\n case 'orderedList':\n return applyLinePrefix(text, sel, {\n has: (l) => /^ {0,3}\\d+[.)]\\s/.test(l),\n strip: stripAllPrefixes,\n add: (l, i) => `${i + 1}. ` + l,\n });\n case 'taskList':\n return applyLinePrefix(text, sel, {\n has: (l) => /^ {0,3}[-*+]\\s\\[[ xX]\\]\\s/.test(l),\n strip: stripAllPrefixes,\n add: (l) => '- [ ] ' + l,\n });\n case 'quote':\n return applyLinePrefix(text, sel, {\n has: (l) => QUOTE_RE.test(l),\n strip: (l) => l.replace(QUOTE_RE, ''),\n add: (l) => '> ' + l,\n });\n case 'horizontalRule':\n return insertBlock(text, sel, '---');\n case 'codeBlock': {\n const selected = text.slice(norm(sel).from, norm(sel).to);\n const block = '```\\n' + selected + '\\n```';\n // place caret after the opening fence when empty\n return insertBlock(text, sel, block, selected ? undefined : [4, 4]);\n }\n case 'table': {\n const block = '| Column | Column |\\n| --- | --- |\\n| Cell | Cell |';\n return insertBlock(text, sel, block, [2, 8]); // select first header word\n }\n default: {\n const _exhaustive: never = cmd;\n return { text, selection: norm(sel) };\n }\n }\n}\n","/**\n * Document model — an immutable text container with transaction-based edits and\n * position mapping. The string is the source of truth (SPEC.md §4.1): every edit\n * is a `{from, to, insert}` change, applying one returns a NEW `TextDoc`, and\n * offsets can be mapped across a change so decorations / anchors survive edits.\n */\n\nexport interface Change {\n /** Inclusive start offset of the replaced range. */\n from: number;\n /** Exclusive end offset of the replaced range. */\n to: number;\n /** Text inserted in place of `[from, to)`. */\n insert: string;\n}\n\nexport interface LineInfo {\n /** 1-based line number. */\n number: number;\n /** Offset of the first character of the line. */\n from: number;\n /** Offset just past the last character (before the newline). */\n to: number;\n /** The line's text (without the trailing newline). */\n text: string;\n}\n\nexport interface Position {\n /** 1-based line. */\n line: number;\n /** 1-based column (UTF-16 units within the line). */\n column: number;\n}\n\nexport class TextDoc {\n readonly text: string;\n private _lineStarts: number[] | null = null;\n\n constructor(text = '') {\n this.text = text;\n }\n\n get length(): number {\n return this.text.length;\n }\n\n /** Apply one change, returning a new document. */\n apply(change: Change): TextDoc {\n const { from, to, insert } = normalize(change, this.text.length);\n return new TextDoc(this.text.slice(0, from) + insert + this.text.slice(to));\n }\n\n /**\n * Apply several changes, returning a new document. Changes are given in\n * document coordinates of THIS doc; they are applied right-to-left so earlier\n * offsets stay valid.\n */\n applyAll(changes: Change[]): TextDoc {\n const sorted = [...changes].sort((a, b) => b.from - a.from);\n let text = this.text;\n for (const c of sorted) {\n const { from, to, insert } = normalize(c, text.length);\n text = text.slice(0, from) + insert + text.slice(to);\n }\n return new TextDoc(text);\n }\n\n private lineStarts(): number[] {\n if (this._lineStarts) return this._lineStarts;\n const starts = [0];\n for (let i = 0; i < this.text.length; i++) {\n if (this.text.charCodeAt(i) === 10 /* \\n */) starts.push(i + 1);\n }\n this._lineStarts = starts;\n return starts;\n }\n\n /** Total number of lines (a trailing newline yields an extra empty line). */\n get lines(): number {\n return this.lineStarts().length;\n }\n\n /** The line (1-based) containing `offset`. */\n lineAt(offset: number): LineInfo {\n const off = clamp(offset, 0, this.text.length);\n const starts = this.lineStarts();\n // binary search for the last start <= off\n let lo = 0;\n let hi = starts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (starts[mid]! <= off) lo = mid;\n else hi = mid - 1;\n }\n const from = starts[lo]!;\n const nextStart = starts[lo + 1];\n const to = nextStart === undefined ? this.text.length : nextStart - 1;\n return { number: lo + 1, from, to, text: this.text.slice(from, to) };\n }\n\n /** Line/column (both 1-based) for an offset. */\n positionAt(offset: number): Position {\n const line = this.lineAt(offset);\n return { line: line.number, column: clamp(offset, 0, this.text.length) - line.from + 1 };\n }\n\n /** Offset for a 1-based line/column. */\n offsetAt(line: number, column: number): number {\n const starts = this.lineStarts();\n const idx = clamp(line, 1, starts.length) - 1;\n const from = starts[idx]!;\n const nextStart = starts[idx + 1];\n const to = nextStart === undefined ? this.text.length : nextStart - 1;\n return clamp(from + (column - 1), from, to);\n }\n\n /**\n * Map an offset from this document's coordinates to the coordinates AFTER the\n * given change(s). `assoc` controls which side of an insertion at the offset\n * the mapped position sticks to: -1 = before (default), 1 = after.\n */\n mapOffset(offset: number, changes: Change | Change[], assoc: -1 | 1 = -1): number {\n const list = Array.isArray(changes) ? changes : [changes];\n // apply in document order; each change shifts offsets after it\n const ordered = [...list].sort((a, b) => a.from - b.from);\n let result = offset;\n for (const c of ordered) {\n const { from, to, insert } = normalize(c, Number.MAX_SAFE_INTEGER);\n const delta = insert.length - (to - from);\n if (result < from) continue;\n if (result > to) {\n result += delta;\n } else if (result === from && assoc < 0) {\n // stays at from\n } else if (result === to && assoc > 0) {\n result += delta;\n } else {\n // inside the replaced range: collapse toward the edit boundary\n result = assoc < 0 ? from : from + insert.length;\n }\n }\n return result;\n }\n\n toString(): string {\n return this.text;\n }\n}\n\nfunction normalize(change: Change, len: number): Change {\n let from = clamp(Math.min(change.from, change.to), 0, len);\n let to = clamp(Math.max(change.from, change.to), 0, len);\n return { from, to, insert: change.insert };\n}\n\nfunction clamp(n: number, lo: number, hi: number): number {\n return n < lo ? lo : n > hi ? hi : n;\n}\n","/**\n * Native, zero-dependency syntax highlighter.\n *\n * {@link highlightToHtml} turns a fenced code block's source into an HTML\n * string with tokens wrapped in `<span class=\"tw-tok-KIND\">…</span>`. The\n * tokenizers are small, hand-written, single-pass line/char scanners — NOT\n * full grammars. They recognise the shapes that carry the most colour signal:\n * keywords, strings (including template literals), line + block comments,\n * numbers, punctuation, and a light dusting of function / type / property\n * classification.\n *\n * Safety is the load-bearing invariant: **every** character that reaches the\n * output — token content and the gaps between tokens alike — is HTML-escaped\n * through the local {@link escapeHtml}. A `<script>` (or `<img onerror=…>`)\n * embedded in the code therefore always appears inert/escaped, never as live\n * markup. This mirrors the sanitizing contract of `render.ts` so the\n * highlighter can be handed straight to the renderer without widening the\n * attack surface.\n *\n * Complexity is O(n) in the source length. There are no unbounded-backtracking\n * regexes; scanning advances the cursor monotonically, so pathological input\n * (huge whitespace runs, unterminated strings/comments) is safe.\n */\n\n/** The token classes we emit. `KIND` in `tw-tok-KIND`. */\ntype TokenKind =\n | 'keyword'\n | 'string'\n | 'comment'\n | 'number'\n | 'punct'\n | 'fn'\n | 'type'\n | 'prop';\n\n/* ------------------------------------------------------------------ *\n * Escaping + span emission\n * ------------------------------------------------------------------ */\n\n/**\n * Escape the four characters that matter in HTML text / double-quoted attrs\n * (`&`, `<`, `>`, `\"`). This is the security boundary: nothing leaves this\n * module without passing through here.\n */\nfunction escapeHtml(value: string): string {\n let out = '';\n for (let i = 0; i < value.length; i++) {\n const ch = value.charCodeAt(i);\n switch (ch) {\n case 38 /* & */:\n out += '&amp;';\n break;\n case 60 /* < */:\n out += '&lt;';\n break;\n case 62 /* > */:\n out += '&gt;';\n break;\n case 34 /* \" */:\n out += '&quot;';\n break;\n default:\n out += value.charAt(i);\n }\n }\n return out;\n}\n\n/** Wrap escaped `text` in a token span. */\nfunction span(kind: TokenKind, text: string): string {\n return `<span class=\"tw-tok-${kind}\">${escapeHtml(text)}</span>`;\n}\n\n/* ------------------------------------------------------------------ *\n * Character predicates (charCode based, O(1))\n * ------------------------------------------------------------------ */\n\nfunction isDigit(ch: number): boolean {\n return ch >= 48 && ch <= 57;\n}\n\nfunction isIdentStart(ch: number): boolean {\n return (\n (ch >= 65 && ch <= 90) || // A-Z\n (ch >= 97 && ch <= 122) || // a-z\n ch === 95 || // _\n ch === 36 // $\n );\n}\n\nfunction isIdentPart(ch: number): boolean {\n return isIdentStart(ch) || isDigit(ch);\n}\n\n/** Chars that may appear inside a numeric literal (hex/oct/bin/float/sep). */\nfunction isNumberPart(ch: number): boolean {\n return (\n isDigit(ch) ||\n ch === 46 || // .\n ch === 95 || // _ separator\n ch === 120 || // x\n ch === 88 || // X\n ch === 111 || // o\n ch === 79 || // O\n ch === 98 || // b\n ch === 66 || // B\n (ch >= 97 && ch <= 102) || // a-f (hex + exponent 'e')\n (ch >= 65 && ch <= 70) // A-F (hex + exponent 'E')\n );\n}\n\n/** Punctuation we colour in C-like languages. */\nfunction isPunct(ch: number): boolean {\n switch (ch) {\n case 123: // {\n case 125: // }\n case 40: // (\n case 41: // )\n case 91: // [\n case 93: // ]\n case 60: // <\n case 62: // >\n case 61: // =\n case 43: // +\n case 45: // -\n case 42: // *\n case 47: // /\n case 37: // %\n case 33: // !\n case 63: // ?\n case 58: // :\n case 59: // ;\n case 44: // ,\n case 46: // .\n case 38: // &\n case 124: // |\n case 94: // ^\n case 126: // ~\n case 64: // @\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Scan back from `i-1` to the first non-whitespace char code (0 if none).\n * Amortised O(n) across a scan because each gap is walked at most once.\n */\nfunction prevNonSpace(code: string, i: number): number {\n let k = i - 1;\n while (k >= 0) {\n const c = code.charCodeAt(k);\n if (c === 32 || c === 9 || c === 10 || c === 13) {\n k--;\n continue;\n }\n return c;\n }\n return 0;\n}\n\n/**\n * Consume a quoted string starting at `start` (the opening quote). Backslash\n * escapes are skipped. Non-template strings terminate at an unescaped newline\n * (so an unterminated `\"` can't swallow the rest of the file). Returns the\n * exclusive end index.\n */\nfunction consumeString(code: string, start: number, quote: number): number {\n const n = code.length;\n let j = start + 1;\n while (j < n) {\n const c = code.charCodeAt(j);\n if (c === 92 /* \\ */) {\n j += 2;\n continue;\n }\n if (c === quote) {\n return j + 1;\n }\n if (quote !== 96 /* ` */ && c === 10 /* \\n */) {\n return j; // unterminated: stop before the newline\n }\n j++;\n }\n return n;\n}\n\n/* ------------------------------------------------------------------ *\n * Keyword / type tables\n * ------------------------------------------------------------------ */\n\n// prettier-ignore\nconst JS_KEYWORDS = new Set([\n 'abstract', 'any', 'as', 'asserts', 'async', 'await', 'break', 'case',\n 'catch', 'class', 'const', 'continue', 'debugger', 'declare', 'default',\n 'delete', 'do', 'else', 'enum', 'export', 'extends', 'false', 'finally',\n 'for', 'from', 'function', 'get', 'if', 'implements', 'import', 'in',\n 'infer', 'instanceof', 'interface', 'is', 'keyof', 'let', 'namespace',\n 'new', 'null', 'of', 'override', 'package', 'private', 'protected',\n 'public', 'readonly', 'return', 'satisfies', 'set', 'static', 'super',\n 'switch', 'this', 'throw', 'true', 'try', 'type', 'typeof', 'undefined',\n 'var', 'void', 'while', 'with', 'yield',\n]);\n\n// prettier-ignore\nconst TS_TYPES = new Set([\n 'string', 'number', 'boolean', 'object', 'symbol', 'bigint', 'unknown',\n 'never', 'Array', 'Record', 'Promise', 'Partial', 'Required', 'Readonly',\n 'Pick', 'Omit', 'Map', 'Set', 'WeakMap', 'WeakSet', 'Date', 'RegExp',\n 'Error',\n]);\n\n// prettier-ignore\nconst PY_KEYWORDS = new Set([\n 'and', 'as', 'assert', 'async', 'await', 'break', 'case', 'class',\n 'continue', 'def', 'del', 'elif', 'else', 'except', 'False', 'finally',\n 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'match',\n 'None', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'True', 'try',\n 'while', 'with', 'yield',\n]);\n\n// prettier-ignore\nconst BASH_KEYWORDS = new Set([\n 'if', 'then', 'else', 'elif', 'fi', 'for', 'while', 'until', 'do', 'done',\n 'case', 'esac', 'in', 'function', 'select', 'time', 'return', 'break',\n 'continue', 'echo', 'cd', 'export', 'local', 'read', 'printf', 'source',\n 'exit', 'set', 'unset', 'test', 'eval', 'exec', 'trap', 'shift',\n]);\n\n// prettier-ignore\nconst SQL_KEYWORDS = new Set([\n 'add', 'all', 'alter', 'and', 'as', 'asc', 'auto_increment', 'begin',\n 'between', 'by', 'case', 'column', 'commit', 'constraint', 'create',\n 'cross', 'default', 'delete', 'desc', 'distinct', 'drop', 'else', 'end',\n 'exists', 'foreign', 'from', 'full', 'group', 'having', 'if', 'in',\n 'index', 'inner', 'insert', 'into', 'is', 'join', 'key', 'left', 'like',\n 'limit', 'not', 'null', 'offset', 'on', 'or', 'order', 'outer', 'primary',\n 'references', 'right', 'rollback', 'select', 'set', 'table', 'then',\n 'union', 'unique', 'update', 'values', 'view', 'when', 'where', 'with',\n // common types / functions\n 'int', 'integer', 'bigint', 'smallint', 'decimal', 'numeric', 'float',\n 'real', 'double', 'char', 'varchar', 'text', 'boolean', 'bool', 'date',\n 'datetime', 'timestamp', 'count', 'sum', 'avg', 'min', 'max', 'coalesce',\n]);\n\n/* ------------------------------------------------------------------ *\n * C-like (javascript / typescript / jsx / tsx)\n * ------------------------------------------------------------------ */\n\nfunction highlightCLike(code: string): string {\n const n = code.length;\n let out = '';\n let i = 0;\n let prevWord = '';\n\n while (i < n) {\n const ch = code.charCodeAt(i);\n\n // line comment //\n if (ch === 47 /* / */ && code.charCodeAt(i + 1) === 47) {\n let j = i + 2;\n while (j < n && code.charCodeAt(j) !== 10) j++;\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n\n // block comment /* */\n if (ch === 47 && code.charCodeAt(i + 1) === 42 /* * */) {\n let j = i + 2;\n while (\n j < n &&\n !(code.charCodeAt(j) === 42 && code.charCodeAt(j + 1) === 47)\n ) {\n j++;\n }\n j = Math.min(n, j + 2);\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n\n // strings: \" ' `\n if (ch === 34 || ch === 39 || ch === 96) {\n const end = consumeString(code, i, ch);\n out += span('string', code.slice(i, end));\n i = end;\n continue;\n }\n\n // number\n if (isDigit(ch) || (ch === 46 && isDigit(code.charCodeAt(i + 1)))) {\n let j = i + 1;\n while (j < n && isNumberPart(code.charCodeAt(j))) j++;\n out += span('number', code.slice(i, j));\n i = j;\n prevWord = '';\n continue;\n }\n\n // identifier / keyword / type / fn / prop\n if (isIdentStart(ch)) {\n let j = i + 1;\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n const word = code.slice(i, j);\n if (JS_KEYWORDS.has(word)) {\n out += span('keyword', word);\n } else if (TS_TYPES.has(word)) {\n out += span('type', word);\n } else {\n // look ahead past spaces for a call paren\n let k = j;\n while (k < n) {\n const c = code.charCodeAt(k);\n if (c === 32 || c === 9) {\n k++;\n continue;\n }\n break;\n }\n const isCall = code.charCodeAt(k) === 40; // (\n if (prevNonSpace(code, i) === 46 /* . */) {\n out += span('prop', word);\n } else if (prevWord === 'class' || prevWord === 'interface') {\n out += span('type', word);\n } else if (isCall || prevWord === 'function') {\n out += span('fn', word);\n } else {\n out += escapeHtml(word);\n }\n }\n prevWord = word;\n i = j;\n continue;\n }\n\n // punctuation\n if (isPunct(ch)) {\n out += span('punct', code.charAt(i));\n i++;\n continue;\n }\n\n // whitespace / anything else\n out += escapeHtml(code.charAt(i));\n i++;\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * JSON\n * ------------------------------------------------------------------ */\n\nfunction highlightJson(code: string): string {\n const n = code.length;\n let out = '';\n let i = 0;\n\n while (i < n) {\n const ch = code.charCodeAt(i);\n\n // string — key (followed by ':') vs value\n if (ch === 34 /* \" */) {\n const end = consumeString(code, i, 34);\n const text = code.slice(i, end);\n // peek past whitespace for a colon\n let k = end;\n while (k < n) {\n const c = code.charCodeAt(k);\n if (c === 32 || c === 9 || c === 10 || c === 13) {\n k++;\n continue;\n }\n break;\n }\n out += span(code.charCodeAt(k) === 58 /* : */ ? 'prop' : 'string', text);\n i = end;\n continue;\n }\n\n // number (with optional leading -)\n if (isDigit(ch) || (ch === 45 && isDigit(code.charCodeAt(i + 1)))) {\n let j = i + 1;\n while (j < n && isNumberPart(code.charCodeAt(j))) j++;\n out += span('number', code.slice(i, j));\n i = j;\n continue;\n }\n\n // literals true / false / null\n if (isIdentStart(ch)) {\n let j = i + 1;\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n const word = code.slice(i, j);\n if (word === 'true' || word === 'false' || word === 'null') {\n out += span('keyword', word);\n } else {\n out += escapeHtml(word);\n }\n i = j;\n continue;\n }\n\n if (isPunct(ch)) {\n out += span('punct', code.charAt(i));\n i++;\n continue;\n }\n\n out += escapeHtml(code.charAt(i));\n i++;\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * CSS\n * ------------------------------------------------------------------ */\n\nfunction highlightCss(code: string): string {\n const n = code.length;\n let out = '';\n let i = 0;\n let depth = 0;\n let beforeColon = true; // property-name position inside a block\n\n while (i < n) {\n const ch = code.charCodeAt(i);\n\n // block comment /* */\n if (ch === 47 && code.charCodeAt(i + 1) === 42) {\n let j = i + 2;\n while (\n j < n &&\n !(code.charCodeAt(j) === 42 && code.charCodeAt(j + 1) === 47)\n ) {\n j++;\n }\n j = Math.min(n, j + 2);\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n\n // strings\n if (ch === 34 || ch === 39) {\n const end = consumeString(code, i, ch);\n out += span('string', code.slice(i, end));\n i = end;\n continue;\n }\n\n // at-rule\n if (ch === 64 /* @ */) {\n let j = i + 1;\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n out += span('keyword', code.slice(i, j));\n i = j;\n continue;\n }\n\n // structural punctuation controlling the prop/value state machine\n if (ch === 123 /* { */) {\n out += span('punct', '{');\n depth++;\n beforeColon = true;\n i++;\n continue;\n }\n if (ch === 125 /* } */) {\n out += span('punct', '}');\n if (depth > 0) depth--;\n beforeColon = true;\n i++;\n continue;\n }\n if (ch === 59 /* ; */) {\n out += span('punct', ';');\n beforeColon = true;\n i++;\n continue;\n }\n if (ch === 58 /* : */) {\n out += span('punct', ':');\n beforeColon = false;\n i++;\n continue;\n }\n\n // number (+ trailing unit stays plain)\n if (isDigit(ch) || (ch === 46 && isDigit(code.charCodeAt(i + 1)))) {\n let j = i + 1;\n while (j < n && isNumberPart(code.charCodeAt(j))) j++;\n out += span('number', code.slice(i, j));\n i = j;\n continue;\n }\n\n // identifier-ish run (property, value keyword, selector fragment)\n if (isIdentStart(ch) || ch === 45 /* - */) {\n let j = i + 1;\n while (\n j < n &&\n (isIdentPart(code.charCodeAt(j)) || code.charCodeAt(j) === 45)\n ) {\n j++;\n }\n const word = code.slice(i, j);\n if (depth > 0 && beforeColon) {\n out += span('prop', word);\n } else {\n out += escapeHtml(word);\n }\n i = j;\n continue;\n }\n\n if (isPunct(ch)) {\n out += span('punct', code.charAt(i));\n i++;\n continue;\n }\n\n out += escapeHtml(code.charAt(i));\n i++;\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * HTML\n * ------------------------------------------------------------------ */\n\nfunction isTagChar(ch: number): boolean {\n return isIdentPart(ch) || ch === 45 /* - */ || ch === 58 /* : */;\n}\n\nfunction highlightHtml(code: string): string {\n const n = code.length;\n let out = '';\n let i = 0;\n\n while (i < n) {\n const ch = code.charCodeAt(i);\n\n // comment <!-- -->\n if (ch === 60 && code.startsWith('<!--', i)) {\n const idx = code.indexOf('-->', i + 4);\n const j = idx === -1 ? n : idx + 3;\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n\n // tag\n if (ch === 60 /* < */) {\n let j = i + 1;\n if (code.charCodeAt(j) === 47 /* / */) j++;\n out += span('punct', code.slice(i, j));\n // tag name\n const nameStart = j;\n while (j < n && isTagChar(code.charCodeAt(j))) j++;\n if (j > nameStart) out += span('keyword', code.slice(nameStart, j));\n // attributes up to '>'\n while (j < n && code.charCodeAt(j) !== 62 /* > */) {\n const c = code.charCodeAt(j);\n if (c === 34 || c === 39) {\n const end = consumeString(code, j, c);\n out += span('string', code.slice(j, end));\n j = end;\n continue;\n }\n if (c === 61 /* = */) {\n out += span('punct', '=');\n j++;\n continue;\n }\n if (isTagChar(c)) {\n const a = j;\n while (j < n && isTagChar(code.charCodeAt(j))) j++;\n out += span('prop', code.slice(a, j));\n continue;\n }\n out += escapeHtml(code.charAt(j));\n j++;\n }\n if (j < n && code.charCodeAt(j) === 62) {\n out += span('punct', '>');\n j++;\n }\n i = j;\n continue;\n }\n\n // entity &name; / &#123;\n if (ch === 38 /* & */) {\n let j = i + 1;\n while (\n j < n &&\n j - i < 12 &&\n code.charCodeAt(j) !== 59 &&\n (isIdentPart(code.charCodeAt(j)) || code.charCodeAt(j) === 35)\n ) {\n j++;\n }\n if (j < n && code.charCodeAt(j) === 59) {\n out += span('type', code.slice(i, j + 1));\n i = j + 1;\n continue;\n }\n }\n\n out += escapeHtml(code.charAt(i));\n i++;\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Markdown\n * ------------------------------------------------------------------ */\n\nfunction highlightMarkdownLine(line: string): string {\n const n = line.length;\n let out = '';\n let i = 0;\n\n // leading whitespace\n while (i < n && (line.charCodeAt(i) === 32 || line.charCodeAt(i) === 9)) {\n out += line.charAt(i);\n i++;\n }\n\n // heading marker: #{1,6} followed by space\n if (line.charCodeAt(i) === 35 /* # */) {\n let h = i;\n while (h < n && line.charCodeAt(h) === 35) h++;\n if (h - i <= 6 && (h >= n || line.charCodeAt(h) === 32)) {\n out += span('keyword', line.slice(i, h));\n i = h;\n }\n } else if (line.charCodeAt(i) === 62 /* > */) {\n // blockquote marker\n out += span('keyword', '>');\n i++;\n } else {\n // list marker: - + * or `N.`\n const c = line.charCodeAt(i);\n if ((c === 45 || c === 43 || c === 42) && line.charCodeAt(i + 1) === 32) {\n out += span('punct', line.charAt(i));\n i++;\n }\n }\n\n // inline scan of the remainder\n while (i < n) {\n const ch = line.charCodeAt(i);\n\n // inline code `…`\n if (ch === 96 /* ` */) {\n let j = i + 1;\n while (j < n && line.charCodeAt(j) !== 96) j++;\n j = Math.min(n, j + 1);\n out += span('string', line.slice(i, j));\n i = j;\n continue;\n }\n\n // emphasis markers ** * _ ~~\n if (ch === 42 /* * */ || ch === 95 /* _ */ || ch === 126 /* ~ */) {\n let j = i;\n while (j < n && line.charCodeAt(j) === ch) j++;\n out += span('punct', line.slice(i, j));\n i = j;\n continue;\n }\n\n // link / image punctuation\n if (ch === 91 || ch === 93 || ch === 40 || ch === 41) {\n out += span('punct', line.charAt(i));\n i++;\n continue;\n }\n\n out += escapeHtml(line.charAt(i));\n i++;\n }\n\n return out;\n}\n\nfunction highlightMarkdown(code: string): string {\n const lines = code.split('\\n');\n let out = '';\n for (let i = 0; i < lines.length; i++) {\n if (i > 0) out += '\\n';\n out += highlightMarkdownLine(lines[i] ?? '');\n }\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Python\n * ------------------------------------------------------------------ */\n\nfunction highlightPython(code: string): string {\n const n = code.length;\n let out = '';\n let i = 0;\n let prevWord = '';\n\n while (i < n) {\n const ch = code.charCodeAt(i);\n\n // comment # …\n if (ch === 35 /* # */) {\n let j = i + 1;\n while (j < n && code.charCodeAt(j) !== 10) j++;\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n\n // triple-quoted string\n if (\n (ch === 34 || ch === 39) &&\n code.charCodeAt(i + 1) === ch &&\n code.charCodeAt(i + 2) === ch\n ) {\n const marker = code.slice(i, i + 3);\n const idx = code.indexOf(marker, i + 3);\n const j = idx === -1 ? n : idx + 3;\n out += span('string', code.slice(i, j));\n i = j;\n prevWord = '';\n continue;\n }\n\n // single/double string\n if (ch === 34 || ch === 39) {\n const end = consumeString(code, i, ch);\n out += span('string', code.slice(i, end));\n i = end;\n prevWord = '';\n continue;\n }\n\n // decorator @name\n if (ch === 64 /* @ */ && isIdentStart(code.charCodeAt(i + 1))) {\n let j = i + 1;\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n out += span('keyword', code.slice(i, j));\n i = j;\n continue;\n }\n\n // number\n if (isDigit(ch) || (ch === 46 && isDigit(code.charCodeAt(i + 1)))) {\n let j = i + 1;\n while (j < n && isNumberPart(code.charCodeAt(j))) j++;\n out += span('number', code.slice(i, j));\n i = j;\n prevWord = '';\n continue;\n }\n\n // identifier / keyword / fn\n if (isIdentStart(ch)) {\n let j = i + 1;\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n const word = code.slice(i, j);\n if (PY_KEYWORDS.has(word)) {\n out += span('keyword', word);\n } else if (prevWord === 'def') {\n out += span('fn', word);\n } else if (prevWord === 'class') {\n out += span('type', word);\n } else {\n // call?\n let k = j;\n while (k < n && (code.charCodeAt(k) === 32 || code.charCodeAt(k) === 9))\n k++;\n out +=\n code.charCodeAt(k) === 40 ? span('fn', word) : escapeHtml(word);\n }\n prevWord = word;\n i = j;\n continue;\n }\n\n if (isPunct(ch)) {\n out += span('punct', code.charAt(i));\n i++;\n continue;\n }\n\n out += escapeHtml(code.charAt(i));\n i++;\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Bash\n * ------------------------------------------------------------------ */\n\nfunction highlightBash(code: string): string {\n const n = code.length;\n let out = '';\n let i = 0;\n\n while (i < n) {\n const ch = code.charCodeAt(i);\n\n // comment # … (only when the '#' begins a word)\n if (ch === 35 /* # */) {\n const prev = i > 0 ? code.charCodeAt(i - 1) : 10;\n if (\n i === 0 ||\n prev === 32 ||\n prev === 9 ||\n prev === 10 ||\n prev === 13 ||\n prev === 59 /* ; */\n ) {\n let j = i + 1;\n while (j < n && code.charCodeAt(j) !== 10) j++;\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n }\n\n // strings\n if (ch === 34 || ch === 39) {\n const end = consumeString(code, i, ch);\n out += span('string', code.slice(i, end));\n i = end;\n continue;\n }\n\n // variable $name / ${name} / $1\n if (ch === 36 /* $ */) {\n let j = i + 1;\n if (code.charCodeAt(j) === 123 /* { */) {\n while (j < n && code.charCodeAt(j) !== 125 /* } */) j++;\n j = Math.min(n, j + 1);\n } else {\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n }\n out += span('prop', code.slice(i, j));\n i = j;\n continue;\n }\n\n // number\n if (isDigit(ch)) {\n let j = i + 1;\n while (j < n && isNumberPart(code.charCodeAt(j))) j++;\n out += span('number', code.slice(i, j));\n i = j;\n continue;\n }\n\n // word / keyword\n if (isIdentStart(ch)) {\n let j = i + 1;\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n const word = code.slice(i, j);\n out += BASH_KEYWORDS.has(word)\n ? span('keyword', word)\n : escapeHtml(word);\n i = j;\n continue;\n }\n\n if (isPunct(ch)) {\n out += span('punct', code.charAt(i));\n i++;\n continue;\n }\n\n out += escapeHtml(code.charAt(i));\n i++;\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * SQL\n * ------------------------------------------------------------------ */\n\nfunction highlightSql(code: string): string {\n const n = code.length;\n let out = '';\n let i = 0;\n\n while (i < n) {\n const ch = code.charCodeAt(i);\n\n // line comment -- …\n if (ch === 45 /* - */ && code.charCodeAt(i + 1) === 45) {\n let j = i + 2;\n while (j < n && code.charCodeAt(j) !== 10) j++;\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n\n // block comment /* */\n if (ch === 47 && code.charCodeAt(i + 1) === 42) {\n let j = i + 2;\n while (\n j < n &&\n !(code.charCodeAt(j) === 42 && code.charCodeAt(j + 1) === 47)\n ) {\n j++;\n }\n j = Math.min(n, j + 2);\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n\n // strings (single-quoted values, double-quoted identifiers)\n if (ch === 39 || ch === 34) {\n const end = consumeString(code, i, ch);\n out += span('string', code.slice(i, end));\n i = end;\n continue;\n }\n\n // number\n if (isDigit(ch) || (ch === 46 && isDigit(code.charCodeAt(i + 1)))) {\n let j = i + 1;\n while (j < n && isNumberPart(code.charCodeAt(j))) j++;\n out += span('number', code.slice(i, j));\n i = j;\n continue;\n }\n\n // keyword (case-insensitive) / identifier\n if (isIdentStart(ch)) {\n let j = i + 1;\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n const word = code.slice(i, j);\n out += SQL_KEYWORDS.has(word.toLowerCase())\n ? span('keyword', word)\n : escapeHtml(word);\n i = j;\n continue;\n }\n\n if (isPunct(ch)) {\n out += span('punct', code.charAt(i));\n i++;\n continue;\n }\n\n out += escapeHtml(code.charAt(i));\n i++;\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Language resolution + dispatch\n * ------------------------------------------------------------------ */\n\n/**\n * Alias map → canonical tokenizer key. Anything absent here (and from\n * {@link TOKENIZERS}) is treated as plain text, e.g. `yaml`/`yml`.\n */\nconst ALIASES: Record<string, string> = {\n js: 'javascript',\n jsx: 'javascript',\n javascript: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n ts: 'typescript',\n tsx: 'typescript',\n typescript: 'typescript',\n json: 'json',\n jsonc: 'json',\n json5: 'json',\n css: 'css',\n html: 'html',\n htm: 'html',\n xml: 'html',\n md: 'markdown',\n markdown: 'markdown',\n py: 'python',\n python: 'python',\n sh: 'bash',\n bash: 'bash',\n shell: 'bash',\n zsh: 'bash',\n sql: 'sql',\n};\n\nconst TOKENIZERS: Record<string, (code: string) => string> = {\n javascript: highlightCLike,\n typescript: highlightCLike,\n json: highlightJson,\n css: highlightCss,\n html: highlightHtml,\n markdown: highlightMarkdown,\n python: highlightPython,\n bash: highlightBash,\n sql: highlightSql,\n};\n\n/**\n * Highlight `code` for the given fence `info` string.\n *\n * `info` is the WHOLE fence info (e.g. `\"js {1,3}\"` or `\"ts title=foo\"`); the\n * language is the first whitespace-delimited token, lowercased, run through\n * {@link ALIASES}. Unknown / empty / unsupported languages return the escaped\n * source with no spans, so the output is always safe to inject.\n *\n * @param lang the fence info string (language + any attributes)\n * @param code the raw code block source\n * @returns HTML with `<span class=\"tw-tok-KIND\">` tokens; fully HTML-escaped.\n */\nexport function highlightToHtml(lang: string, code: string): string {\n const info = typeof lang === 'string' ? lang : '';\n const first = info.trim().split(/\\s+/)[0] ?? '';\n const key = first.toLowerCase();\n const resolved = ALIASES[key] ?? key;\n const tokenizer = TOKENIZERS[resolved];\n if (!tokenizer) return escapeHtml(code);\n return tokenizer(code);\n}\n","/**\n * Comment-anchor maintenance (plan-TW-0002 Phase A2).\n *\n * A comment thread is anchored to a text range `{from, to}`. Every time the\n * document is edited we must move that range so the highlight keeps covering\n * the same words — or drop the anchor (return `null`) when the words it pointed\n * at have been deleted. This is the first real consumer of `TextDoc.mapOffset`\n * (previously dead code) — it is built directly on top of that primitive rather\n * than re-deriving the position math here.\n */\nimport { TextDoc, type Change } from './text';\n\n/**\n * `mapOffset` is a pure function of `(offset, change, assoc)` — it never reads\n * the document text (it normalizes changes against `Number.MAX_SAFE_INTEGER`,\n * see text.ts:122-143), so a single shared empty doc is a valid host for the\n * call and we avoid allocating a `TextDoc` per invocation.\n */\nconst MAPPER = new TextDoc();\n\n/**\n * Association for the two anchor ends, in `mapOffset`'s convention\n * (text.ts:117-121): `assoc = -1` keeps the mapped offset *before* text\n * inserted exactly at it (the offset value is unchanged); `assoc = +1` pushes\n * it to *after* the inserted text (offset value += inserted length).\n *\n * We want a comment highlight to behave like a mark with a NON-inclusive start\n * and an INCLUSIVE end. Working that through the semantics above (verified\n * against the mapOffset branches):\n *\n * • `from` → +1: text typed exactly at the anchor start maps the start\n * *past* that insert, so the inserted text lands OUTSIDE the highlight —\n * \"insert exactly at 'from' stays outside\".\n * • `to` → +1: text typed exactly at the anchor end maps the end *past*\n * that insert, so the inserted text lands INSIDE the highlight —\n * \"insert exactly at 'to' extends the anchor\".\n *\n * Note the convention subtlety: under text.ts's semantics it is the +1\n * (\"after\") association — not -1 — that makes a boundary insert at `from` stay\n * *outside* the range (with -1 the start would sit before the insert and\n * swallow it). Both ends therefore map with +1: the start slides off a\n * boundary insert while the end absorbs it.\n */\nconst ASSOC_FROM: -1 | 1 = 1;\nconst ASSOC_TO: -1 | 1 = 1;\n\n/**\n * Re-anchor a comment range across a single document `change`.\n *\n * @returns the mapped `{from, to}` (always `from <= to`), or `null` when the\n * change deleted the entire anchored range.\n */\nexport function mapAnchor(\n anchor: { from: number; to: number },\n change: Change,\n): { from: number; to: number } | null {\n const from = MAPPER.mapOffset(anchor.from, change, ASSOC_FROM);\n const to = MAPPER.mapOffset(anchor.to, change, ASSOC_TO);\n\n // The anchored text is gone when the ends collapsed onto a single point AND\n // the change's deleted span `[change.from, change.to)` covered the whole\n // original anchor. The coverage guard keeps a plain boundary insert (which\n // can also make the ends equal for a zero-length anchor) from nulling out.\n const collapsed = from === to;\n const deletedWholeRange =\n change.to > change.from && change.from <= anchor.from && change.to >= anchor.to;\n if (collapsed && deletedWholeRange) return null;\n\n // mapOffset is monotonic for a fixed change/assoc, so from <= to already;\n // min/max is a cheap defensive guard.\n return { from: Math.min(from, to), to: Math.max(from, to) };\n}\n","/**\n * Pure table-editing helpers (Phase F1 of plan-TW-0002).\n *\n * These are the headless layer under the in-place table grid: no DOM, no React,\n * just string → string transforms over the offset-exact {@link Table} AST that\n * `./parser` produces. Every mutation keeps the Markdown *canonical* — a GFM\n * pipe table with a delimiter row — so `parse → mutate → parse` round-trips to\n * the same structure.\n *\n * Two edit shapes, matching the plan:\n * - **Single-cell** edits are scoped: {@link cellSourceRange} hands back a\n * cell's *exact* source range so the caller can splice only that slice.\n * - **Structural** ops (add/remove row/column, set alignment) re-serialize the\n * whole table block and return a full-block splice over `[table.from, table.to]`.\n *\n * Addressing convention (documented once, used everywhere):\n * - Rows use a **grid index**: row `0` is the header, rows `1..N` are body rows\n * (this mirrors the rendered grid, where the header is the top row).\n * - Columns are 0-based.\n *\n * The AST contract these helpers lean on (see `src/core/ast.ts:144-156`):\n * - `TableCell extends Pos` — every cell carries exact `{from,to}` UTF-16\n * offsets of its *trimmed* content (`splitRow`, `parser.ts:447-459`).\n * - `Table { from; to; align: CellAlign[]; header: TableCell[]; rows: TableCell[][] }`.\n * The delimiter row has no node of its own, so alignment edits (like every\n * structural op) re-serialize the block rather than splicing that row in place.\n */\n\nimport type { CellAlign, Pos, Table, TableCell } from './ast';\n\n/** Result of a structural (whole-block) table edit. */\nexport interface TableEdit {\n /** The full new document text after the splice. */\n text: string;\n /** A sensible caret offset into {@link text} after the edit. */\n selection: number;\n}\n\nconst clampInt = (n: number, lo: number, hi: number): number =>\n n < lo ? lo : n > hi ? hi : n;\n\n/** Canonical delimiter cell for an alignment (`---`, `:---`, `:---:`, `---:`). */\nfunction delimCell(align: CellAlign): string {\n switch (align) {\n case 'left':\n return ':---';\n case 'center':\n return ':---:';\n case 'right':\n return '---:';\n default:\n return '---';\n }\n}\n\n/**\n * A normalized, string-only view of a table: header, per-column alignment, and\n * body rows, every row widened/truncated to the header's column count. Editing\n * happens on this, then it is serialized back to canonical GFM.\n */\ninterface Grid {\n header: string[];\n align: CellAlign[];\n rows: string[][];\n}\n\nconst cellText = (text: string, cell: TableCell): string =>\n text.slice(cell.from, cell.to);\n\nconst emptyRow = (ncols: number): string[] =>\n Array.from({ length: ncols }, () => '');\n\n/** Build a rectangular {@link Grid} from a parsed table, reading raw cell source. */\nfunction tableToGrid(text: string, table: Table): Grid {\n const ncols = Math.max(1, table.header.length);\n const header = table.header.map((c) => cellText(text, c));\n while (header.length < ncols) header.push('');\n\n const align: CellAlign[] = [];\n for (let i = 0; i < ncols; i++) align.push(table.align[i] ?? null);\n\n const rows = table.rows.map((row) => {\n const cells = row.map((c) => cellText(text, c));\n while (cells.length < ncols) cells.push('');\n cells.length = ncols;\n return cells;\n });\n\n return { header, align, rows };\n}\n\n/** The cell strings that make up a given serialized line (0 header, 1 delim, ≥2 body). */\nfunction cellsForLine(grid: Grid, lineIdx: number): string[] {\n const ncols = grid.header.length;\n if (lineIdx === 0) return grid.header;\n if (lineIdx === 1) {\n const a: string[] = [];\n for (let i = 0; i < ncols; i++) a.push(delimCell(grid.align[i] ?? null));\n return a;\n }\n return grid.rows[lineIdx - 2] ?? grid.header;\n}\n\n/** Serialize the grid to canonical GFM lines: header, delimiter, then body rows. */\nfunction gridLines(grid: Grid): string[] {\n const ncols = grid.header.length;\n const rowLine = (cells: string[]): string => {\n const out = cells.slice(0, ncols);\n while (out.length < ncols) out.push('');\n return `| ${out.join(' | ')} |`;\n };\n const delim: string[] = [];\n for (let i = 0; i < ncols; i++) delim.push(delimCell(grid.align[i] ?? null));\n\n const lines = [rowLine(grid.header), `| ${delim.join(' | ')} |`];\n for (const r of grid.rows) lines.push(rowLine(r));\n return lines;\n}\n\n/** Offset of the first char of `lineIdx` within the joined serialization. */\nfunction lineStart(lines: string[], lineIdx: number): number {\n let off = 0;\n for (const l of lines.slice(0, lineIdx)) off += l.length + 1; // +1 for '\\n'\n return off;\n}\n\n/** Content-start offset of column `col` within a canonical `| c0 | c1 | … |` row. */\nfunction colOffsetInLine(cells: string[], col: number): number {\n let off = 2; // leading \"| \"\n for (const c of cells.slice(0, col)) off += c.length + 3; // \"cell\" + \" | \"\n return off;\n}\n\n/**\n * Serialize `grid`, splice it over `[table.from, table.to]`, and place the caret\n * at the start of `(lineIdx, col)` in the new block.\n */\nfunction commit(\n text: string,\n table: Table,\n grid: Grid,\n lineIdx: number,\n col: number,\n): TableEdit {\n const lines = gridLines(grid);\n const block = lines.join('\\n');\n const inBlock =\n lineStart(lines, lineIdx) + colOffsetInLine(cellsForLine(grid, lineIdx), col);\n const newText = text.slice(0, table.from) + block + text.slice(table.to);\n return { text: newText, selection: table.from + inBlock };\n}\n\n/* ------------------------------------------------------------------ *\n * Public helpers\n * ------------------------------------------------------------------ */\n\n/**\n * Exact source range of a single cell's (trimmed) text, for scoped single-cell\n * splices. Row `0` is the header; rows `1..N` are body rows. Returns `null` when\n * the coordinate is out of bounds.\n */\nexport function cellSourceRange(\n table: Table,\n row: number,\n col: number,\n): Pos | null {\n const cell: TableCell | undefined =\n row === 0 ? table.header[col] : table.rows[row - 1]?.[col];\n if (!cell) return null;\n return { from: cell.from, to: cell.to };\n}\n\n/**\n * Insert a new empty body row so it lands at grid position `atRow`\n * (clamped into the body range). Re-serializes the whole block.\n */\nexport function addRow(text: string, table: Table, atRow: number): TableEdit {\n const grid = tableToGrid(text, table);\n const bodyIdx = clampInt(atRow - 1, 0, grid.rows.length);\n grid.rows.splice(bodyIdx, 0, emptyRow(grid.header.length));\n return commit(text, table, grid, 2 + bodyIdx, 0);\n}\n\n/**\n * Insert a new empty column at index `atCol` (clamped), widening the header,\n * the alignment row, and every body row. Re-serializes the whole block.\n */\nexport function addColumn(text: string, table: Table, atCol: number): TableEdit {\n const grid = tableToGrid(text, table);\n const idx = clampInt(atCol, 0, grid.header.length);\n grid.header.splice(idx, 0, '');\n grid.align.splice(idx, 0, null);\n for (const r of grid.rows) r.splice(idx, 0, '');\n return commit(text, table, grid, 0, idx);\n}\n\n/**\n * Remove the body row at grid position `atRow` (row `0`, the header, and\n * out-of-range indices are no-ops). Re-serializes the whole block.\n */\nexport function removeRow(text: string, table: Table, atRow: number): TableEdit {\n const grid = tableToGrid(text, table);\n const bodyIdx = atRow - 1;\n if (bodyIdx >= 0 && bodyIdx < grid.rows.length) grid.rows.splice(bodyIdx, 1);\n\n const lineIdx =\n grid.rows.length === 0 ? 0 : 2 + clampInt(bodyIdx, 0, grid.rows.length - 1);\n return commit(text, table, grid, lineIdx, 0);\n}\n\n/**\n * Remove the column at index `atCol` from the header, alignment row, and every\n * body row. The last remaining column is never removed (a GFM table needs ≥1\n * column), and out-of-range indices are no-ops. Re-serializes the whole block.\n */\nexport function removeColumn(\n text: string,\n table: Table,\n atCol: number,\n): TableEdit {\n const grid = tableToGrid(text, table);\n if (grid.header.length > 1 && atCol >= 0 && atCol < grid.header.length) {\n grid.header.splice(atCol, 1);\n grid.align.splice(atCol, 1);\n for (const r of grid.rows) r.splice(atCol, 1);\n }\n const caretCol = clampInt(atCol, 0, grid.header.length - 1);\n return commit(text, table, grid, 0, caretCol);\n}\n\n/**\n * Set column `col`'s alignment and rewrite the delimiter row (via a canonical\n * re-serialization of the whole block). Out-of-range `col` is a no-op.\n */\nexport function setAlignment(\n text: string,\n table: Table,\n col: number,\n align: CellAlign,\n): TableEdit {\n const grid = tableToGrid(text, table);\n if (col >= 0 && col < grid.align.length) grid.align[col] = align;\n const caretCol = clampInt(col, 0, grid.align.length - 1);\n return commit(text, table, grid, 1, caretCol);\n}\n","import * as React from 'react';\nimport { collectMarkers, hiddenMarkers, safeUrl, walk } from '../core';\nimport type { AstNode, Block, Document, Inline } from '../core';\n\n/**\n * CaretRevealBlock — one top-level block rendered as a managed `contentEditable`\n * div that implements SPEC.md §5.2 **caret-level source reveal**: the formatting\n * renders inline (bold shows bold, a link shows as a link), but every raw syntax\n * marker (`**`, `` ` ``, `#`, `](url)`, a `>` quote prefix, …) is emitted as a\n * `.tw-syntax` span that COLLAPSES when the caret is away and REVEALS (monospace,\n * muted) when the caret sits on/adjacent to it — the reveal decision comes from\n * the already-tested {@link hiddenMarkers}.\n *\n * Correctness contract — every source character of the block appears EXACTLY once\n * in the DOM as a text-node character (inside either a marker span or a content\n * run), so DOM ⇄ source offset mapping is 1:1 and lossless. Content is emitted\n * from the raw SOURCE slice (never `node.value`), so escapes/entities map 1:1\n * (`&` is one source char and one DOM char — we never emit HTML entities).\n *\n * Editing strategy — the surface is UNCONTROLLED while focused/composing: React\n * never re-sets the DOM mid-edit (the div carries no React children; the DOM is\n * built imperatively), so the caret never jumps. On `input` the new plain text is\n * reconstructed from the DOM, diffed against the block's stored source to a scoped\n * `{from,to,insert}` splice, and reported via `onChange`. The marker spans are\n * only re-tokenised on a settle debounce / blur, and the reveal set is applied as\n * a caret-safe class toggle (no text-node mutation) on selection change.\n *\n * Security — this component NEVER uses `dangerouslySetInnerHTML`. The DOM is built\n * from the parsed inline node tree + {@link collectMarkers} ranges using text\n * nodes and element spans we create, mirroring what render.ts escapes. Link/image\n * URLs pass {@link safeUrl}; the only thing toggled is marker-span visibility.\n *\n * IME — composition is the platform's (SPEC §4.4): during composition model sync\n * and re-tokenisation are suppressed; on `compositionend` the composed text is\n * committed once and the block re-tokenises.\n */\n\n/* ------------------------------------------------------------------ *\n * Pure model — segments, markers, offset mapping, splice\n * (no component state; exported so they are unit-testable in isolation)\n * ------------------------------------------------------------------ */\n\n/** A formatting element that wraps a source range (`em`/`strong`/`a`/`code`/…). */\nexport interface FmtTag {\n /** The AST node — its identity groups adjacent segments into one element. */\n node: AstNode;\n tag: string;\n from: number;\n to: number;\n href?: string;\n className?: string;\n}\n\n/** A leaf of the flat block layout: a content run or a hideable marker. */\nexport interface Segment {\n from: number;\n to: number;\n /** The raw source slice (never a decoded value) — preserves 1:1 mapping. */\n text: string;\n kind: 'content' | 'marker';\n /** {@link import('../core').Marker.kind} for a marker segment. */\n markerKind?: string;\n /** Formatting elements wrapping this segment, outermost-first. */\n tags: FmtTag[];\n}\n\n/** Wrap a single block as a one-child document so the core walkers accept it. */\nexport function wrapBlock(block: Block): Document {\n return { type: 'document', from: block.from, to: block.to, children: [block] };\n}\n\n/** First / last descendant text node of a DOM node (or itself when it is text). */\nfunction firstTextIn(node: Node): Text | null {\n if (node.nodeType === 3) return node as Text;\n const w = node.ownerDocument!.createTreeWalker(node, NodeFilter.SHOW_TEXT);\n return (w.nextNode() as Text) ?? null;\n}\nfunction lastTextIn(node: Node): Text | null {\n if (node.nodeType === 3) return node as Text;\n const w = node.ownerDocument!.createTreeWalker(node, NodeFilter.SHOW_TEXT);\n let last: Text | null = null;\n let n = w.nextNode();\n while (n) {\n last = n as Text;\n n = w.nextNode();\n }\n return last;\n}\n\n/**\n * Every inline formatting node under `doc`, as a wrapping range + element. The\n * delimiter runs are NOT part of a node's inner range (they stay outside the\n * element, so `**` renders un-bolded), except links/autolinks/images/math/\n * footnote refs which wrap their whole span so the element (and its `href`)\n * still applies with the markers hidden.\n */\nexport function collectFmtTags(doc: Document): FmtTag[] {\n const out: FmtTag[] = [];\n walk(doc, (n) => {\n switch (n.type) {\n case 'emphasis':\n case 'strong':\n case 'strikethrough': {\n const kids = n.children;\n const first = kids[0];\n const last = kids[kids.length - 1];\n if (first && last) {\n const tag = n.type === 'emphasis' ? 'em' : n.type === 'strong' ? 'strong' : 'del';\n out.push({ node: n, tag, from: first.from, to: last.to });\n }\n break;\n }\n case 'inlineCode': {\n const ticks = Math.max(1, n.ticks);\n const from = Math.min(n.from + ticks, n.to);\n const to = Math.max(n.to - ticks, from);\n out.push({ node: n, tag: 'code', from, to });\n break;\n }\n case 'link':\n case 'autolink':\n out.push({ node: n, tag: 'a', from: n.from, to: n.to, href: safeUrl(n.url) });\n break;\n case 'image':\n out.push({ node: n, tag: 'span', className: 'tw-cr-img', from: n.from, to: n.to });\n break;\n case 'math':\n out.push({ node: n, tag: 'span', className: 'tw-math-src', from: n.from, to: n.to });\n break;\n case 'footnoteRef':\n out.push({ node: n, tag: 'sup', className: 'tw-fnref', from: n.from, to: n.to });\n break;\n }\n return true;\n });\n return out;\n}\n\n/** Formatting tags fully containing `[from,to)`, outermost-first. */\nfunction tagsAt(fmts: FmtTag[], from: number, to: number): FmtTag[] {\n return fmts\n .filter((f) => f.from <= from && to <= f.to && f.to > f.from)\n .sort((a, b) => a.from - b.from || b.to - a.to);\n}\n\n/**\n * Partition the block's source range into an ordered list of content + marker\n * segments. Marker ranges come from {@link collectMarkers} (the single source of\n * truth, so the reveal decision always lines up); the gaps between them are\n * content. The concatenation of every segment's `text` equals the block source.\n */\nexport function buildSegments(block: Block, source: string): Segment[] {\n const doc = wrapBlock(block);\n const markers = collectMarkers(doc, source)\n .filter((m) => m.from >= block.from && m.to <= block.to && m.to > m.from)\n .sort((a, b) => a.from - b.from || a.to - b.to);\n const fmts = collectFmtTags(doc);\n\n const segs: Segment[] = [];\n let cur = block.from;\n const pushContent = (from: number, to: number): void => {\n if (to > from) segs.push({ from, to, text: source.slice(from, to), kind: 'content', tags: tagsAt(fmts, from, to) });\n };\n for (const m of markers) {\n if (m.to <= cur) continue; // wholly covered by a previous marker (defensive)\n const from = Math.max(m.from, cur);\n if (from > cur) pushContent(cur, from);\n segs.push({ from, to: m.to, text: source.slice(from, m.to), kind: 'marker', markerKind: m.kind, tags: tagsAt(fmts, from, m.to) });\n cur = m.to;\n }\n pushContent(cur, block.to);\n return segs;\n}\n\n/** A stable `data-from:data-to` key for a marker, in BLOCK-LOCAL offsets. */\nfunction markerKeyLocal(from: number, to: number, blockFrom: number): string {\n return `${from - blockFrom}:${to - blockFrom}`;\n}\n\n/**\n * The block's HIDDEN marker keys (block-local) for a selection — the markers the\n * caret is NOT on. `sel` in document offsets, or `null`/`'all'` to hide every\n * marker (the resting, fully-rendered look when the block is unfocused).\n */\nexport function hiddenKeySet(block: Block, source: string, sel: { from: number; to: number } | null): Set<string> {\n const doc = wrapBlock(block);\n const set = new Set<string>();\n if (!sel) {\n for (const m of collectMarkers(doc, source)) {\n if (m.from >= block.from && m.to <= block.to && m.to > m.from) set.add(markerKeyLocal(m.from, m.to, block.from));\n }\n return set;\n }\n for (const m of hiddenMarkers(doc, sel, source)) {\n if (m.from >= block.from && m.to <= block.to && m.to > m.from) set.add(markerKeyLocal(m.from, m.to, block.from));\n }\n return set;\n}\n\n/** Every text node under `root`, in document order (INCLUDING hidden markers). */\nfunction flattenText(root: Node): Text[] {\n const out: Text[] = [];\n const w = root.ownerDocument!.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n let n = w.nextNode();\n while (n) {\n out.push(n as Text);\n n = w.nextNode();\n }\n return out;\n}\n\n/**\n * Reconstruct the block source from `root`'s text nodes (the DOM is the truth).\n * Text-node-only, so it stays in the SAME length space as `offsetOfPoint` /\n * `pointAtOffset` (which also walk text nodes) — a browser-injected placeholder\n * `<br>` in an emptied block represents zero source characters and is ignored,\n * matching those mappers. Our own newline edits insert literal `\\n` text nodes\n * (see `insertPlainText`), so no legitimate `<br>` newline is ever produced.\n */\nexport function reconstructSource(root: Node): string {\n let s = '';\n for (const t of flattenText(root)) s += t.data;\n return s;\n}\n\n/**\n * Map a DOM point `(node, offset)` to a BLOCK-LOCAL source offset. Hidden marker\n * spans still contribute their source length (they are real text nodes), so a\n * caret at the start of visible `bold` correctly sits past the hidden `**`.\n */\nexport function offsetOfPoint(root: Node, node: Node, offset: number): number {\n const texts = flattenText(root);\n let target: Text | null = null;\n let local = 0;\n if (node.nodeType === 3) {\n target = node as Text;\n local = offset;\n } else {\n const child = node.childNodes[offset] ?? null;\n if (child) {\n target = firstTextIn(child);\n local = 0;\n if (!target) {\n const prev = node.childNodes[offset - 1];\n target = prev ? lastTextIn(prev) : null;\n local = target ? target.data.length : 0;\n }\n } else {\n const prev = node.childNodes[node.childNodes.length - 1];\n target = prev ? lastTextIn(prev) : null;\n local = target ? target.data.length : 0;\n }\n }\n if (!target) return 0;\n let acc = 0;\n for (const t of texts) {\n if (t === target) return acc + Math.min(local, t.data.length);\n acc += t.data.length;\n }\n return acc;\n}\n\n/** Map a BLOCK-LOCAL source offset to a DOM point `(node, offset)`. */\nexport function pointAtOffset(root: Node, offset: number): { node: Node; offset: number } {\n const texts = flattenText(root);\n let acc = 0;\n for (const t of texts) {\n const len = t.data.length;\n if (offset <= acc + len) return { node: t, offset: Math.max(0, offset - acc) };\n acc += len;\n }\n const last = texts[texts.length - 1];\n return last ? { node: last, offset: last.data.length } : { node: root, offset: 0 };\n}\n\n/**\n * Minimal `{from,to,insert}` splice turning `oldStr` into `newStr` (trim the\n * shared prefix + suffix), in the string's own offsets. Mirrors the editor's\n * `minimizeChange` so a single keystroke yields a single-character splice.\n */\nexport function computeSplice(oldStr: string, newStr: string): { from: number; to: number; insert: string } {\n let p = 0;\n const maxP = Math.min(oldStr.length, newStr.length);\n while (p < maxP && oldStr.charCodeAt(p) === newStr.charCodeAt(p)) p++;\n let s = 0;\n const maxS = Math.min(oldStr.length - p, newStr.length - p);\n while (s < maxS && oldStr.charCodeAt(oldStr.length - 1 - s) === newStr.charCodeAt(newStr.length - 1 - s)) s++;\n return { from: p, to: oldStr.length - s, insert: newStr.slice(p, newStr.length - s) };\n}\n\n/* ------------------------------------------------------------------ *\n * DOM painting (imperative — the surface is uncontrolled while editing)\n * ------------------------------------------------------------------ */\n\n/** Hidden-marker set, or `'all'` to hide every marker. */\ntype Hidden = Set<string> | 'all';\n\nfunction isHidden(hidden: Hidden, key: string): boolean {\n return hidden === 'all' || hidden.has(key);\n}\n\n/**\n * (Re)build `root`'s children from `segs`. Adjacent segments sharing a formatting\n * node reuse one element (diffed by node identity), so nesting is exact. Only\n * text nodes + spans/elements we create are used — never innerHTML.\n */\nexport function paintSegments(root: HTMLElement, segs: Segment[], hidden: Hidden, blockFrom: number): void {\n const doc = root.ownerDocument!;\n while (root.firstChild) root.removeChild(root.firstChild);\n const stack: { node: AstNode; el: HTMLElement }[] = [];\n for (const seg of segs) {\n let common = 0;\n while (common < stack.length && common < seg.tags.length && stack[common]!.node === seg.tags[common]!.node) common++;\n stack.length = common;\n let parent: HTMLElement = common > 0 ? stack[common - 1]!.el : root;\n for (let k = common; k < seg.tags.length; k++) {\n const t = seg.tags[k]!;\n const el = doc.createElement(t.tag);\n if (t.href !== undefined) el.setAttribute('href', t.href);\n if (t.className) el.className = t.className;\n parent.appendChild(el);\n stack.push({ node: t.node, el });\n parent = el;\n }\n if (seg.kind === 'marker') {\n const span = doc.createElement('span');\n span.className = 'tw-syntax';\n span.setAttribute('data-mark', seg.markerKind ?? '');\n const key = markerKeyLocal(seg.from, seg.to, blockFrom);\n span.setAttribute('data-from', String(seg.from - blockFrom));\n span.setAttribute('data-to', String(seg.to - blockFrom));\n span.appendChild(doc.createTextNode(seg.text));\n if (isHidden(hidden, key)) span.classList.add('tw-syntax--hidden');\n parent.appendChild(span);\n } else {\n parent.appendChild(doc.createTextNode(seg.text));\n }\n }\n}\n\n/**\n * Toggle marker-span visibility for a new reveal set WITHOUT touching any text\n * node — so the caret is never disturbed (SPEC §5.2 keeps the caret stable while\n * markers reveal). Cheap: one class flip per marker span.\n */\nexport function applyReveal(root: HTMLElement, hidden: Hidden): void {\n const spans = root.querySelectorAll<HTMLElement>('span.tw-syntax[data-from]');\n spans.forEach((span) => {\n const key = `${span.getAttribute('data-from')}:${span.getAttribute('data-to')}`;\n span.classList.toggle('tw-syntax--hidden', isHidden(hidden, key));\n });\n}\n\n/* ------------------------------------------------------------------ *\n * Component\n * ------------------------------------------------------------------ */\n\nexport interface CaretRevealBlockProps {\n /** The parsed block whose offsets index into {@link source}. */\n block: Block;\n /** Full document source (the single source of truth). */\n source: string;\n /** Emit a scoped splice: `source[from..to]` becomes `insert`. */\n onChange: (change: { from: number; to: number; insert: string }) => void;\n readOnly?: boolean;\n}\n\n/** Milliseconds to defer the reveal update after a click so the caret settles. */\nconst CLICK_SETTLE_MS = 40;\n/** A selection change within this window of a pointerdown is treated as a click. */\nconst CLICK_WINDOW_MS = 250;\n/** Idle after typing before the block re-tokenises (applies new markers). */\nconst SETTLE_MS = 140;\n\n/** Class + level suffix for the block's editable region. */\nfunction blockClass(block: Block): string {\n let c = 'tw-caret-block';\n switch (block.type) {\n case 'heading':\n c += ` tw-cr-heading tw-cr-h${block.level}`;\n break;\n case 'blockquote':\n c += ' tw-cr-blockquote';\n break;\n case 'list':\n c += ' tw-cr-list';\n break;\n default:\n c += ' tw-cr-paragraph';\n }\n return c;\n}\n\nexport function CaretRevealBlock(props: CaretRevealBlockProps): React.ReactElement {\n const { block, source, onChange, readOnly = false } = props;\n\n const rootRef = React.useRef<HTMLDivElement | null>(null);\n // Latest props read by imperative handlers/timers (they outlive a render).\n const propsRef = React.useRef(props);\n propsRef.current = props;\n\n const editingRef = React.useRef(false);\n const composingRef = React.useRef(false);\n const blockSrcRef = React.useRef(source.slice(block.from, block.to));\n const blockFromRef = React.useRef(block.from);\n // Key of the currently-painted content, so a pure offset shift in another block\n // (same text) doesn't force a needless rebuild while this one is unfocused.\n const builtKeyRef = React.useRef<string | null>(null);\n const lastPointerRef = React.useRef(0);\n const settleTimer = React.useRef<number | null>(null);\n const revealTimer = React.useRef<number | null>(null);\n const onChangeRef = React.useRef(onChange);\n onChangeRef.current = onChange;\n\n /** Current in-block selection as document offsets, or null (caret elsewhere). */\n const readSelection = React.useCallback((): { from: number; to: number } | null => {\n const root = rootRef.current;\n if (!root) return null;\n const win = root.ownerDocument?.defaultView;\n const sel = win?.getSelection();\n if (!sel || sel.rangeCount === 0 || !sel.anchorNode || !root.contains(sel.anchorNode)) return null;\n const base = blockFromRef.current;\n const a = offsetOfPoint(root, sel.anchorNode, sel.anchorOffset) + base;\n const f = sel.focusNode && root.contains(sel.focusNode) ? offsetOfPoint(root, sel.focusNode, sel.focusOffset) + base : a;\n return { from: Math.min(a, f), to: Math.max(a, f) };\n }, []);\n\n /** Place the collapsed caret at a document offset, skipping hidden markers. */\n const restoreCaret = React.useCallback((docOffset: number): void => {\n const root = rootRef.current;\n if (!root) return;\n const win = root.ownerDocument?.defaultView;\n if (!win) return;\n let { node, offset } = pointAtOffset(root, docOffset - blockFromRef.current);\n // A caret cannot rest inside a display:none marker — nudge to the nearest\n // visible text node so the placement actually takes.\n const inHidden = (n: Node): boolean =>\n (n.nodeType === 3 ? (n as Text).parentElement : (n as Element))?.closest('.tw-syntax--hidden') != null;\n if (inHidden(node)) {\n const texts = flattenText(root);\n const idx = texts.indexOf(node as Text);\n let j = idx + 1;\n while (j < texts.length && inHidden(texts[j]!)) j++;\n if (j < texts.length) {\n node = texts[j]!;\n offset = 0;\n } else {\n let k = idx - 1;\n while (k >= 0 && inHidden(texts[k]!)) k--;\n if (k >= 0) {\n node = texts[k]!;\n offset = texts[k]!.data.length;\n }\n }\n }\n try {\n const range = root.ownerDocument!.createRange();\n range.setStart(node, Math.min(offset, node.nodeType === 3 ? (node as Text).data.length : node.childNodes.length));\n range.collapse(true);\n const sel = win.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n } catch {\n /* selection can throw across a re-render race — safe to ignore */\n }\n }, []);\n\n /** Full (re)paint from the given props + reveal selection. */\n const paint = React.useCallback((b: Block, src: string, sel: { from: number; to: number } | null): void => {\n const root = rootRef.current;\n if (!root) return;\n const segs = buildSegments(b, src);\n const hidden: Hidden = sel ? hiddenKeySet(b, src, sel) : 'all';\n paintSegments(root, segs, hidden, b.from);\n blockSrcRef.current = src.slice(b.from, b.to);\n blockFromRef.current = b.from;\n builtKeyRef.current = `${b.from}:${blockSrcRef.current}`;\n }, []);\n\n /** Reveal-only pass for the live selection (caret-safe class toggle). */\n const updateReveal = React.useCallback((): void => {\n const root = rootRef.current;\n if (!root) return;\n const { block: b, source: src } = propsRef.current;\n const sel = readSelection();\n applyReveal(root, sel ? hiddenKeySet(b, src, sel) : 'all');\n }, [readSelection]);\n\n /** Read the DOM, diff to a scoped splice, report it (skipped while composing). */\n const syncModel = React.useCallback((): void => {\n const root = rootRef.current;\n if (!root) return;\n const next = reconstructSource(root);\n const prev = blockSrcRef.current;\n if (next === prev) return;\n const sp = computeSplice(prev, next);\n blockSrcRef.current = next; // optimistic; the parent's re-parse confirms it\n const base = blockFromRef.current;\n onChangeRef.current({ from: base + sp.from, to: base + sp.to, insert: sp.insert });\n }, []);\n\n /** After typing settles, re-tokenise from the (now committed) props + restore caret. */\n const settleRetokenize = React.useCallback((): void => {\n const root = rootRef.current;\n if (!root || composingRef.current || !editingRef.current) return;\n const { block: b, source: src } = propsRef.current;\n const committed = src.slice(b.from, b.to);\n const domSrc = reconstructSource(root);\n if (committed === domSrc) {\n // Normal settle: props reflect the DOM → re-tokenise + restore caret.\n const sel = readSelection();\n paint(b, src, sel);\n if (sel) restoreCaret(sel.to);\n return;\n }\n // Split case: the edit inserted a block boundary (e.g. a blank line), so this\n // block's committed extent shrank while the DOM still holds the whole typed\n // text; the tail now belongs to freshly-parsed sibling blocks. Detect it by:\n // the block's committed text is a prefix of the DOM source, the DOM is longer,\n // and that longer DOM matches the source from this block onward. Repaint to the\n // block's own extent so the trailing content isn't duplicated (it renders in the\n // sibling). Any other mismatch is a not-yet-committed keystroke → wait.\n if (domSrc.length > committed.length && domSrc.startsWith(committed) && src.startsWith(domSrc, b.from)) {\n const sel = readSelection();\n paint(b, src, null);\n // The caret may have been in the tail (now a sibling); clamp to this block's\n // end. sel.to and b.to are both DOCUMENT offsets (restoreCaret expects one).\n if (sel) restoreCaret(Math.min(sel.to, b.to));\n }\n }, [paint, readSelection, restoreCaret]);\n\n const scheduleSettle = React.useCallback((): void => {\n const win = rootRef.current?.ownerDocument?.defaultView;\n if (!win) return;\n if (settleTimer.current != null) win.clearTimeout(settleTimer.current);\n settleTimer.current = win.setTimeout(() => {\n settleTimer.current = null;\n settleRetokenize();\n }, SETTLE_MS);\n }, [settleRetokenize]);\n\n /* --- prop-driven build: runs when unfocused (never mid-edit) --- */\n React.useLayoutEffect(() => {\n if (editingRef.current) return; // uncontrolled while editing — never clobber\n const key = `${block.from}:${source.slice(block.from, block.to)}`;\n if (builtKeyRef.current === key) {\n // Same content + position already painted — nothing to do.\n blockSrcRef.current = source.slice(block.from, block.to);\n blockFromRef.current = block.from;\n return;\n }\n paint(block, source, null);\n }, [block, source, readOnly, paint]);\n\n /* --- selection change: caret-safe reveal (debounced after a click) --- */\n React.useEffect(() => {\n const root = rootRef.current;\n const doc = root?.ownerDocument;\n if (!doc) return undefined;\n const win = doc.defaultView;\n const onSelectionChange = (): void => {\n if (!editingRef.current || composingRef.current) return;\n const sel = win?.getSelection();\n if (!sel || !sel.anchorNode || !root!.contains(sel.anchorNode)) return;\n const clickInitiated = Date.now() - lastPointerRef.current < CLICK_WINDOW_MS;\n if (revealTimer.current != null) win?.clearTimeout(revealTimer.current);\n if (clickInitiated && win) {\n revealTimer.current = win.setTimeout(() => {\n revealTimer.current = null;\n updateReveal();\n }, CLICK_SETTLE_MS);\n } else {\n updateReveal();\n }\n };\n doc.addEventListener('selectionchange', onSelectionChange);\n return () => {\n doc.removeEventListener('selectionchange', onSelectionChange);\n if (win) {\n if (revealTimer.current != null) win.clearTimeout(revealTimer.current);\n if (settleTimer.current != null) win.clearTimeout(settleTimer.current);\n }\n };\n }, [updateReveal]);\n\n /* --- editable-surface event handlers --- */\n const onFocus = React.useCallback((): void => {\n editingRef.current = true;\n updateReveal();\n }, [updateReveal]);\n\n const onBlur = React.useCallback((): void => {\n editingRef.current = false;\n const win = rootRef.current?.ownerDocument?.defaultView;\n if (win) {\n if (settleTimer.current != null) win.clearTimeout(settleTimer.current);\n if (revealTimer.current != null) win.clearTimeout(revealTimer.current);\n }\n // Flush any DOM edit not yet in the model before we repaint. During IME the\n // composed text lives only in the DOM (onInput is suppressed); if a blur\n // interrupts the composition, syncModel here commits it so it isn't lost. On\n // engines where compositionend fires after blur, its later syncModel is a\n // no-op (DOM already matches). Clearing composingRef defensively prevents a\n // stuck composition from silently suppressing later input on a reused instance.\n syncModel();\n composingRef.current = false;\n // Repaint the resting, fully-rendered look from the committed props.\n const { block: b, source: src } = propsRef.current;\n builtKeyRef.current = null;\n paint(b, src, null);\n }, [paint, syncModel]);\n\n const onInput = React.useCallback((): void => {\n if (composingRef.current) return;\n syncModel();\n scheduleSettle();\n }, [syncModel, scheduleSettle]);\n\n const onCompositionStart = React.useCallback((): void => {\n composingRef.current = true;\n }, []);\n\n const onCompositionEnd = React.useCallback((): void => {\n composingRef.current = false;\n syncModel();\n scheduleSettle();\n }, [syncModel, scheduleSettle]);\n\n const onPointerDown = React.useCallback((): void => {\n lastPointerRef.current = Date.now();\n }, []);\n\n // Keep Enter/paste as plain text so the DOM stays a faithful mirror of source\n // (a contentEditable would otherwise inject <div>/<br>/rich HTML we can't map).\n const onKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLDivElement>): void => {\n if (readOnly) return;\n if (e.key === 'Enter') {\n e.preventDefault();\n insertPlainText(e.currentTarget, '\\n');\n return;\n }\n // Backspace at the very start of a block deletes the block separator before\n // it, merging this block into the previous one — the separator belongs to no\n // block, so the browser's default Backspace is a no-op here. Emit a\n // document-scoped splice removing the preceding whitespace/blank-line run.\n if (e.key === 'Backspace') {\n const sel = readSelection();\n const { block: b, source: src } = propsRef.current;\n if (sel && sel.from === sel.to && sel.from === b.from && b.from > 0 && !composingRef.current) {\n let sepStart = b.from;\n while (sepStart > 0 && (src[sepStart - 1] === '\\n' || src[sepStart - 1] === ' ' || src[sepStart - 1] === '\\t')) sepStart--;\n if (sepStart < b.from) {\n e.preventDefault();\n onChangeRef.current({ from: sepStart, to: b.from, insert: '' });\n }\n }\n }\n }, [readOnly, readSelection]);\n\n const onPaste = React.useCallback((e: React.ClipboardEvent<HTMLDivElement>): void => {\n if (readOnly) return;\n e.preventDefault();\n const text = e.clipboardData.getData('text/plain');\n if (text) insertPlainText(e.currentTarget, text);\n }, [readOnly]);\n\n const label =\n block.type === 'heading' ? `Heading ${block.level}` : block.type === 'blockquote' ? 'Blockquote' : block.type === 'list' ? 'List' : 'Paragraph';\n\n return (\n <div\n ref={rootRef}\n className={blockClass(block)}\n data-typewright=\"caret-block\"\n data-block-type={block.type}\n data-tw-from={block.from}\n data-tw-to={block.to}\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-label={`${label} (Markdown, source reveals at the caret)`}\n contentEditable={!readOnly}\n suppressContentEditableWarning\n spellCheck={false}\n tabIndex={readOnly ? undefined : 0}\n onFocus={readOnly ? undefined : onFocus}\n onBlur={readOnly ? undefined : onBlur}\n onInput={readOnly ? undefined : onInput}\n onCompositionStart={readOnly ? undefined : onCompositionStart}\n onCompositionEnd={readOnly ? undefined : onCompositionEnd}\n onPointerDown={readOnly ? undefined : onPointerDown}\n onKeyDown={readOnly ? undefined : onKeyDown}\n onPaste={readOnly ? undefined : onPaste}\n />\n );\n}\n\n/** Insert plain text at the caret, firing a normal `input` event for sync. */\nfunction insertPlainText(root: HTMLElement, text: string): void {\n const doc = root.ownerDocument;\n const win = doc?.defaultView;\n // `execCommand` keeps undo history + fires `input`; guard for environments\n // (jsdom) where it is absent — the caret-sync path still runs on `input`.\n const exec = (doc as unknown as { execCommand?: (c: string, s: boolean, v: string) => boolean } | undefined)?.execCommand;\n // For newlines, always use manual text-node insertion: execCommand may\n // materialize a <br>/<div> the source reconstruction can't map, dropping the\n // newline. A literal `\\n` text node (the surface is white-space:pre-wrap) is\n // seen identically by reconstructSource and offsetOfPoint.\n if (!text.includes('\\n') && doc && typeof exec === 'function') {\n try {\n if (exec.call(doc, 'insertText', false, text)) return;\n } catch {\n /* fall through to manual insertion */\n }\n }\n const sel = win?.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n range.deleteContents();\n const node = doc!.createTextNode(text);\n range.insertNode(node);\n range.setStartAfter(node);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n root.dispatchEvent(new Event('input', { bubbles: true }));\n}\n\n/* ------------------------------------------------------------------ *\n * Styles (injected into the editor's single stylesheet)\n * ------------------------------------------------------------------ */\n\nexport const CARET_REVEAL_CSS = `\n.tw-caret-block{white-space:pre-wrap;overflow-wrap:break-word;outline:none;cursor:text;border-radius:6px;padding:1px 4px;margin-left:-4px;transition:background .15s}\n.tw-mode-unified .tw-caret-block:hover{background:var(--tw-accent-soft)}\n.tw-caret-block:focus-visible{outline:2px solid var(--tw-accent);outline-offset:2px}\n.tw-caret-block.tw-cr-heading{font-weight:680;letter-spacing:-.02em;line-height:1.25}\n.tw-caret-block.tw-cr-h1{font-size:1.8em} .tw-caret-block.tw-cr-h2{font-size:1.45em} .tw-caret-block.tw-cr-h3{font-size:1.2em} .tw-caret-block.tw-cr-h4{font-size:1.05em} .tw-caret-block.tw-cr-h5{font-size:1em} .tw-caret-block.tw-cr-h6{font-size:.92em;color:var(--tw-muted)}\n.tw-caret-block.tw-cr-blockquote{border-left:3px solid var(--tw-line);padding-left:14px;color:var(--tw-muted)}\n.tw-caret-block.tw-cr-list{padding-left:6px}\n.tw-caret-block a{color:var(--tw-accent);text-decoration:none;border-bottom:1px solid var(--tw-accent-soft)}\n.tw-caret-block code{font-family:\"SF Mono\",ui-monospace,Menlo,monospace;font-size:.88em;background:var(--tw-chip);border:1px solid var(--tw-line);border-radius:5px;padding:1px 5px}\n.tw-caret-block .tw-cr-img{color:var(--tw-muted);font-style:italic}\n.tw-caret-block .tw-fnref{font-size:.82em;color:var(--tw-accent)}\n/* Revealed marker: subtle, monospace, \"you are editing raw syntax\". */\n.tw-syntax{font-family:\"SF Mono\",ui-monospace,Menlo,monospace;color:var(--tw-faint);opacity:.85;font-weight:400;font-style:normal}\n/* Hidden marker: collapsed out of layout, but its source chars stay in the DOM\n (and in this component's offset mapping) — never removed from the string. */\n.tw-syntax--hidden{display:none}\n@media (prefers-reduced-motion: reduce){ .tw-caret-block{transition:none} }\n`;\n","import * as React from 'react';\nimport type { CommentThread } from '../types';\n\n/**\n * Comments & presence — right-docked review sidebar (SPEC.md §14; plan A4).\n *\n * A controlled, data-in/events-out surface: the host owns the `threads` and the\n * component only emits edit intents (reply/react/resolve/delete). It stores\n * nothing. Anchoring/highlighting lives in the editor; this panel is the thread\n * list + composer + reactions UI.\n *\n * Styles ship as {@link COMMENTS_CSS} so the editor can concatenate them into\n * its single injected stylesheet (`tw-*` classes, `--tw-*` tokens).\n */\n\n/** The fixed reaction set (K-7; mirrors the design demo). */\nexport const REACT_EMOJI = ['👍', '🎯', '👀', '🎉'] as const;\n\nexport interface CommentsSidebarProps {\n /** All threads to render; the host is the source of truth. */\n threads: CommentThread[];\n /** The current user; used to author replies and highlight own reactions. */\n me?: { id: string; name: string };\n /** Whether the panel is open. Renders `null` when closed. */\n open: boolean;\n /** Close the panel. */\n onClose: () => void;\n onReply: (threadId: string, body: string) => void;\n onReact: (threadId: string, emoji: string) => void;\n onResolve: (threadId: string, resolved: boolean) => void;\n onDelete?: (threadId: string) => void;\n /** Thread to highlight + scroll into view (e.g. the clicked anchor). */\n activeThreadId?: string;\n /** Fired when a thread card is selected (scrolls the editor to its anchor). */\n onSelectThread?: (threadId: string) => void;\n}\n\nexport function CommentsSidebar(props: CommentsSidebarProps): React.JSX.Element | null {\n const {\n threads,\n me,\n open,\n onClose,\n onReply,\n onReact,\n onResolve,\n onDelete,\n activeThreadId,\n onSelectThread,\n } = props;\n\n const activeElRef = React.useRef<HTMLElement | null>(null);\n const [flashId, setFlashId] = React.useState<string | undefined>(undefined);\n\n // Scroll the active thread into view and flash its card when it changes.\n React.useEffect(() => {\n if (!open || !activeThreadId) return;\n activeElRef.current?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n setFlashId(activeThreadId);\n const t = setTimeout(() => setFlashId(undefined), 1400);\n return () => clearTimeout(t);\n }, [open, activeThreadId]);\n\n if (!open) return null;\n\n const count = threads.length;\n\n return (\n <aside\n className=\"tw-comments-sidebar\"\n role=\"complementary\"\n aria-label=\"Comments\"\n data-typewright=\"comments\"\n >\n <header className=\"tw-comments-head\">\n <span className=\"tw-comments-title\">Comments</span>\n <span className=\"tw-comments-count\" aria-label={`${count} comment${count === 1 ? '' : 's'}`}>\n {count}\n </span>\n <button\n type=\"button\"\n className=\"tw-comments-close\"\n aria-label=\"Close comments panel\"\n onClick={onClose}\n >\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.9\" strokeLinecap=\"round\">\n <path d=\"M6 6l12 12M18 6L6 18\" />\n </svg>\n </button>\n </header>\n\n <div className=\"tw-comments-body\">\n {count === 0 ? (\n <div className=\"tw-comments-empty\">\n No comments yet.\n <br />\n Select text in the editor to start a thread.\n </div>\n ) : (\n threads.map((thread) => (\n <ThreadCard\n key={thread.id}\n thread={thread}\n me={me}\n active={thread.id === activeThreadId}\n flash={thread.id === flashId}\n innerRef={thread.id === activeThreadId ? (el) => { activeElRef.current = el; } : undefined}\n onReply={onReply}\n onReact={onReact}\n onResolve={onResolve}\n onDelete={onDelete}\n onSelect={onSelectThread}\n />\n ))\n )}\n </div>\n </aside>\n );\n}\n\ninterface ThreadCardProps {\n thread: CommentThread;\n me?: { id: string; name: string };\n active: boolean;\n flash: boolean;\n innerRef?: (el: HTMLElement | null) => void;\n onReply: (threadId: string, body: string) => void;\n onReact: (threadId: string, emoji: string) => void;\n onResolve: (threadId: string, resolved: boolean) => void;\n onDelete?: (threadId: string) => void;\n onSelect?: (threadId: string) => void;\n}\n\nfunction ThreadCard(props: ThreadCardProps): React.JSX.Element {\n const { thread, me, active, flash, innerRef, onReply, onReact, onResolve, onDelete, onSelect } = props;\n const [draft, setDraft] = React.useState('');\n\n const submitReply = React.useCallback(() => {\n const body = draft.trim();\n if (!body) return;\n onReply(thread.id, body);\n setDraft('');\n }, [draft, onReply, thread.id]);\n\n const cls = [\n 'tw-comment-thread',\n thread.resolved ? 'resolved' : '',\n active ? 'tw-comment-thread--active' : '',\n flash ? 'tw-comment-thread--flash' : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n const selectFromCard = (e: React.MouseEvent<HTMLElement>) => {\n if (!onSelect) return;\n // Don't hijack clicks on interactive children (buttons/inputs).\n if ((e.target as HTMLElement).closest('button, textarea, input, a')) return;\n onSelect(thread.id);\n };\n\n return (\n <article ref={innerRef} className={cls} onClick={selectFromCard}>\n {thread.quote ? <div className=\"tw-comment-quote\">“{thread.quote}”</div> : null}\n\n <CommentRow author={thread.author} body={thread.body} createdAt={thread.createdAt} />\n\n <div className=\"tw-comment-reacts\">\n {REACT_EMOJI.map((emoji) => {\n const users = thread.reactions?.[emoji];\n const n = users?.length ?? 0;\n const mine = !!(me && users?.includes(me.id));\n return (\n <button\n type=\"button\"\n key={emoji}\n className=\"tw-comment-react\"\n aria-pressed={mine}\n aria-label={`React ${emoji}${n ? `, ${n}` : ''}`}\n onClick={() => onReact(thread.id, emoji)}\n >\n <span aria-hidden=\"true\">{emoji}</span>\n {n > 0 ? <span className=\"tw-comment-react-n\">{n}</span> : null}\n </button>\n );\n })}\n </div>\n\n {thread.replies.length > 0 ? (\n <div className=\"tw-comment-replies\">\n {thread.replies.map((r) => (\n <CommentRow key={r.id} author={r.author} body={r.body} createdAt={r.createdAt} />\n ))}\n </div>\n ) : null}\n\n <div className=\"tw-comment-reply\">\n <textarea\n value={draft}\n onChange={(e) => setDraft(e.currentTarget.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n submitReply();\n }\n }}\n placeholder=\"Reply…\"\n aria-label=\"Reply to thread\"\n rows={1}\n />\n <button\n type=\"button\"\n className=\"tw-comment-btn\"\n aria-label=\"Send reply\"\n disabled={!draft.trim()}\n onClick={submitReply}\n >\n Send\n </button>\n </div>\n\n <div className=\"tw-comment-actions\">\n {onDelete ? (\n <button\n type=\"button\"\n className=\"tw-comment-btn tw-comment-del\"\n aria-label=\"Delete thread\"\n onClick={() => onDelete(thread.id)}\n >\n Delete\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"tw-comment-btn\"\n aria-label={thread.resolved ? 'Reopen thread' : 'Resolve thread'}\n aria-pressed={!!thread.resolved}\n onClick={() => onResolve(thread.id, !thread.resolved)}\n >\n {thread.resolved ? 'Reopen' : 'Resolve'}\n </button>\n </div>\n </article>\n );\n}\n\nfunction CommentRow(props: { author: string; body: string; createdAt?: string }): React.JSX.Element {\n const { author, body, createdAt } = props;\n const when = formatWhen(createdAt);\n return (\n <div className=\"tw-comment-row\">\n <span className=\"tw-comment-av\" style={{ background: avatarColor(author) }} aria-hidden=\"true\">\n {initials(author)}\n </span>\n <div>\n <div className=\"tw-comment-who\">\n {author}\n {when ? <span className=\"tw-comment-when\">{when}</span> : null}\n </div>\n <div className=\"tw-comment-text\">{body}</div>\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ *\n * Presentation helpers (zero-dep)\n * ------------------------------------------------------------------ */\n\nfunction initials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n const first = parts[0]?.[0] ?? '';\n const last = parts.length > 1 ? parts[parts.length - 1]?.[0] ?? '' : '';\n return (first + last).toUpperCase() || '?';\n}\n\nfunction avatarColor(name: string): string {\n let h = 0;\n for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) >>> 0;\n return `hsl(${h % 360} 58% 60%)`;\n}\n\n/** Short relative time for a host-supplied ISO-8601 timestamp. */\nfunction formatWhen(iso?: string): string {\n if (!iso) return '';\n const t = Date.parse(iso);\n if (Number.isNaN(t)) return '';\n const s = Math.max(0, (Date.now() - t) / 1000);\n if (s < 45) return 'now';\n const m = s / 60;\n if (m < 45) return `${Math.round(m)}m`;\n const hrs = m / 60;\n if (hrs < 24) return `${Math.round(hrs)}h`;\n const d = hrs / 24;\n if (d < 7) return `${Math.round(d)}d`;\n const w = d / 7;\n if (w < 5) return `${Math.round(w)}w`;\n return new Date(t).toLocaleDateString();\n}\n\n/* ------------------------------------------------------------------ *\n * Styles — concatenated into the editor's single injected stylesheet.\n * ------------------------------------------------------------------ */\n\nexport const COMMENTS_CSS = `\n.tw-comments-sidebar { --tw-fg:#1a1d20; --tw-muted:#5a6169; --tw-faint:#8b929a; --tw-bg:#ffffff; --tw-chip:#f0f1f3; --tw-line:rgba(18,22,27,.1); --tw-accent:#2f6fed; --tw-accent-soft:rgba(47,111,237,.1); position:absolute; top:0; right:0; bottom:0; width:min(340px,82vw); display:flex; flex-direction:column; box-sizing:border-box; background:var(--tw-bg); color:var(--tw-fg); border-left:1px solid var(--tw-line); font-family:-apple-system,\"SF Pro Text\",system-ui,sans-serif; font-size:15px; line-height:1.5; z-index:20; box-shadow:-8px 0 24px -18px rgba(0,0,0,.4); animation:tw-comments-in .26s cubic-bezier(.32,.72,0,1) both; }\n@media (prefers-color-scheme: dark) { .tw-comments-sidebar:not(.tw-theme-light) { --tw-fg:#e8eaed; --tw-muted:#a3abb2; --tw-faint:#6a727a; --tw-bg:#0f1215; --tw-chip:#1e242b; --tw-line:rgba(255,255,255,.1); --tw-accent:#6ea3ff; --tw-accent-soft:rgba(110,163,255,.14); } }\n.tw-comments-sidebar.tw-theme-dark, :root[data-theme=\"dark\"] .tw-comments-sidebar { --tw-fg:#e8eaed; --tw-muted:#a3abb2; --tw-faint:#6a727a; --tw-bg:#0f1215; --tw-chip:#1e242b; --tw-line:rgba(255,255,255,.1); --tw-accent:#6ea3ff; --tw-accent-soft:rgba(110,163,255,.14); }\n:root[data-theme=\"light\"] .tw-comments-sidebar { --tw-fg:#1a1d20; --tw-muted:#5a6169; --tw-faint:#8b929a; --tw-bg:#ffffff; --tw-chip:#f0f1f3; --tw-line:rgba(18,22,27,.1); --tw-accent:#2f6fed; --tw-accent-soft:rgba(47,111,237,.1); }\n@keyframes tw-comments-in { from { transform:translateX(16px); opacity:0 } to { transform:none; opacity:1 } }\n.tw-comments-head { display:flex; align-items:center; gap:8px; padding:11px 14px; border-bottom:1px solid var(--tw-line); background:color-mix(in srgb, var(--tw-bg) 80%, transparent); backdrop-filter:blur(18px) saturate(1.6); -webkit-backdrop-filter:blur(18px) saturate(1.6); position:sticky; top:0; z-index:2; }\n.tw-comments-title { font-size:14px; font-weight:660; letter-spacing:-.01em; }\n.tw-comments-count { font-size:11.5px; font-weight:640; color:var(--tw-muted); background:var(--tw-chip); border:1px solid var(--tw-line); border-radius:999px; padding:1px 8px; line-height:1.5; }\n.tw-comments-close { margin-left:auto; width:28px; height:28px; padding:0; border:1px solid transparent; background:transparent; color:var(--tw-muted); border-radius:7px; cursor:pointer; display:grid; place-items:center; transition:color .15s, background .15s; }\n.tw-comments-close:hover { color:var(--tw-fg); background:var(--tw-accent-soft); }\n.tw-comments-close:focus-visible { outline:2px solid var(--tw-accent); outline-offset:2px; }\n.tw-comments-body { flex:1; overflow-y:auto; padding:12px; }\n.tw-comments-empty { color:var(--tw-faint); font-size:13px; text-align:center; padding:34px 14px; line-height:1.55; }\n.tw-comment-thread { border:1px solid var(--tw-line); border-radius:12px; padding:12px; margin-bottom:12px; background:var(--tw-bg); transition:box-shadow .2s, border-color .2s, opacity .2s; }\n.tw-comment-thread:last-child { margin-bottom:0; }\n.tw-comment-thread.resolved { opacity:.58; }\n.tw-comment-thread--active { border-color:var(--tw-accent); }\n.tw-comment-thread--flash { animation:tw-comment-flash 1.4s ease; }\n@keyframes tw-comment-flash { 0%,100% { box-shadow:0 0 0 0 transparent } 12%,70% { box-shadow:0 0 0 3px var(--tw-accent-soft) } }\n.tw-comment-quote { font-size:12px; color:var(--tw-muted); border-left:2px solid var(--tw-accent-soft); padding:1px 0 1px 8px; margin-bottom:8px; font-style:italic; }\n.tw-comment-row { display:flex; gap:8px; margin-bottom:8px; }\n.tw-comment-av { width:24px; height:24px; border-radius:50%; display:grid; place-items:center; font-size:10px; font-weight:640; color:#0b0d0f; flex:none; }\n.tw-comment-who { font-size:12.5px; font-weight:600; }\n.tw-comment-when { font-size:11px; color:var(--tw-faint); margin-left:6px; font-weight:400; }\n.tw-comment-text { font-size:13px; color:var(--tw-fg); margin-top:1px; white-space:pre-wrap; overflow-wrap:anywhere; }\n.tw-comment-reacts { display:flex; gap:5px; flex-wrap:wrap; margin:6px 0 4px 32px; }\n.tw-comment-react { font-size:12px; border:1px solid var(--tw-line); background:var(--tw-chip); color:var(--tw-muted); border-radius:999px; padding:2px 8px; display:inline-flex; gap:4px; align-items:center; cursor:pointer; transition:border-color .15s, background .15s, color .15s; }\n.tw-comment-react:hover { border-color:var(--tw-accent); }\n.tw-comment-react[aria-pressed=\"true\"] { border-color:var(--tw-accent); background:var(--tw-accent-soft); color:var(--tw-accent); }\n.tw-comment-react:focus-visible { outline:2px solid var(--tw-accent); outline-offset:2px; }\n.tw-comment-react-n { font-variant-numeric:tabular-nums; font-size:11px; }\n.tw-comment-replies { margin-left:32px; border-left:1px solid var(--tw-line); padding-left:10px; margin-top:6px; }\n.tw-comment-replies .tw-comment-row:last-child { margin-bottom:0; }\n.tw-comment-reply { display:flex; gap:6px; align-items:flex-end; margin:8px 0 2px 32px; }\n.tw-comment-reply textarea { flex:1; min-width:0; min-height:33px; max-height:120px; box-sizing:border-box; resize:none; background:var(--tw-bg); border:1px solid var(--tw-line); border-radius:8px; padding:7px 9px; font:inherit; font-size:12.5px; line-height:1.4; color:var(--tw-fg); outline:none; transition:border-color .15s; }\n.tw-comment-reply textarea:focus { border-color:var(--tw-accent); }\n.tw-comment-reply textarea::placeholder { color:var(--tw-faint); }\n.tw-comment-btn { border:1px solid var(--tw-line); background:var(--tw-chip); color:var(--tw-muted); border-radius:8px; padding:5px 10px; font:inherit; font-size:12px; cursor:pointer; white-space:nowrap; transition:color .15s, border-color .15s, background .15s; }\n.tw-comment-btn:hover { color:var(--tw-fg); border-color:var(--tw-accent); }\n.tw-comment-btn:focus-visible { outline:2px solid var(--tw-accent); outline-offset:2px; }\n.tw-comment-btn:disabled { opacity:.5; cursor:default; }\n.tw-comment-btn:disabled:hover { color:var(--tw-muted); border-color:var(--tw-line); }\n.tw-comment-actions { display:flex; justify-content:flex-end; align-items:center; gap:6px; margin-top:8px; }\n.tw-comment-del { margin-right:auto; }\n.tw-comment-del:hover { color:#e5484d; border-color:#e5484d; }\n@media (prefers-reduced-transparency: reduce) { .tw-comments-head { backdrop-filter:none; -webkit-backdrop-filter:none; background:var(--tw-bg); } }\n@media (prefers-reduced-motion: reduce) { .tw-comments-sidebar, .tw-comment-thread--flash { animation:none !important; } }\n`;\n","import * as React from 'react';\n\n/**\n * FoldMenu — per-heading options popover (Phase G2).\n *\n * A glass popover anchored to a heading's fold affordance. Mirrors the design\n * prototype's `openFoldMenu` (demo/design-prototype.html ~775): a stack of\n * Heading 1–6 radio items (the current level checked, with ⌘1–⌘6 hints), then\n * Toggle Folding, Fold All / Unfold All Headers, and Copy Link to here.\n *\n * The string is never mutated here — every item just fires its callback and\n * closes. Positioning is derived from `anchorRect` (fixed, viewport-clamped);\n * closes on Escape and outside-click; fully keyboard-navigable (arrow keys /\n * Home / End) with menu/menuitem(radio) roles.\n *\n * Styles live in {@link FOLDMENU_CSS} as `.tw-fold-menu*` classes over the\n * editor's `--tw-*` tokens, so the editor can inject them into its single\n * stylesheet; the menu inherits theme tokens from its `.tw-editor` ancestor.\n */\nexport interface FoldMenuProps {\n /** Whether the menu is shown. Returns `null` when false. */\n open: boolean;\n /** Current heading level, 1–6. */\n level: number;\n /** Whether this heading's section is currently folded. */\n folded: boolean;\n /** Rect of the affordance the menu anchors to; a sensible default is used when absent. */\n anchorRect?: DOMRect | null;\n /** Set this heading to level 1–6. */\n onSetLevel: (level: number) => void;\n /** Fold/unfold this heading's section. */\n onToggleFold: () => void;\n /** Fold every heading in the document. */\n onFoldAll: () => void;\n /** Unfold every heading in the document. */\n onUnfoldAll: () => void;\n /** Copy a link (heading slug) to this heading. */\n onCopyLink: () => void;\n /** Dismiss the menu. */\n onClose: () => void;\n}\n\nconst LEVELS = [1, 2, 3, 4, 5, 6] as const;\nconst ITEM_COUNT = LEVELS.length + 4; // 6 heading levels + toggle + foldAll + unfoldAll + copy\nconst MENU_WIDTH = 250;\n\nconst CheckIcon = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={3} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n);\n\nexport function FoldMenu(props: FoldMenuProps): React.JSX.Element | null {\n const {\n open,\n level,\n folded,\n anchorRect,\n onSetLevel,\n onToggleFold,\n onFoldAll,\n onUnfoldAll,\n onCopyLink,\n onClose,\n } = props;\n\n const menuRef = React.useRef<HTMLDivElement | null>(null);\n const itemRefs = React.useRef<Array<HTMLButtonElement | null>>([]);\n\n const focusItem = React.useCallback((index: number) => {\n const i = ((index % ITEM_COUNT) + ITEM_COUNT) % ITEM_COUNT;\n itemRefs.current[i]?.focus();\n }, []);\n\n // Escape + outside-click dismissal (document listeners, cleaned up).\n React.useEffect(() => {\n if (!open) return undefined;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n onClose();\n }\n };\n const onPointerDown = (e: PointerEvent) => {\n const node = menuRef.current;\n if (node && e.target instanceof Node && !node.contains(e.target)) onClose();\n };\n document.addEventListener('keydown', onKeyDown);\n document.addEventListener('pointerdown', onPointerDown, true);\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('pointerdown', onPointerDown, true);\n };\n }, [open, onClose]);\n\n // Move focus onto the current-level item when the menu opens.\n React.useEffect(() => {\n if (!open) return;\n const start = level >= 1 && level <= LEVELS.length ? level - 1 : 0;\n itemRefs.current[start]?.focus();\n }, [open, level]);\n\n if (!open) return null;\n\n const onMenuKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const current = itemRefs.current.indexOf(document.activeElement as HTMLButtonElement | null);\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n focusItem(current < 0 ? 0 : current + 1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n focusItem(current < 0 ? ITEM_COUNT - 1 : current - 1);\n break;\n case 'Home':\n e.preventDefault();\n focusItem(0);\n break;\n case 'End':\n e.preventDefault();\n focusItem(ITEM_COUNT - 1);\n break;\n case 'Tab':\n // Menus don't tab between items — dismiss so focus returns to the page.\n e.preventDefault();\n onClose();\n break;\n default:\n break;\n }\n };\n\n const run = (fn: () => void) => () => {\n fn();\n onClose();\n };\n\n const viewportW = typeof window === 'undefined' ? MENU_WIDTH * 4 : window.innerWidth;\n const left = anchorRect ? Math.max(8, Math.min(anchorRect.left, viewportW - MENU_WIDTH)) : 16;\n const top = anchorRect ? anchorRect.bottom + 6 : 16;\n\n const setRef = (index: number) => (el: HTMLButtonElement | null) => {\n itemRefs.current[index] = el;\n };\n\n return (\n <div\n ref={menuRef}\n className=\"tw-fold-menu\"\n role=\"menu\"\n aria-label=\"Heading options\"\n aria-orientation=\"vertical\"\n style={{ left, top }}\n onKeyDown={onMenuKeyDown}\n >\n {LEVELS.map((l, i) => {\n const on = level === l;\n return (\n <button\n key={l}\n ref={setRef(i)}\n type=\"button\"\n className={`tw-fold-menu-item${on ? ' tw-on' : ''}`}\n role=\"menuitemradio\"\n aria-checked={on}\n tabIndex={-1}\n onClick={run(() => onSetLevel(l))}\n >\n <span className=\"tw-fm-chk\" aria-hidden=\"true\">{CheckIcon}</span>\n <span className=\"tw-fm-num\" aria-hidden=\"true\">{l}</span>\n <span className=\"tw-fm-lab\">Heading {l}</span>\n <span className=\"tw-fm-kbd\" aria-hidden=\"true\">⌘{l}</span>\n </button>\n );\n })}\n\n <div className=\"tw-fold-menu-sep\" role=\"separator\" />\n\n <button\n ref={setRef(LEVELS.length)}\n type=\"button\"\n className=\"tw-fold-menu-item\"\n role=\"menuitem\"\n tabIndex={-1}\n onClick={run(onToggleFold)}\n >\n <span className=\"tw-fm-chk\" aria-hidden=\"true\" />\n <span className=\"tw-fm-lab\">Toggle Folding</span>\n </button>\n <button\n ref={setRef(LEVELS.length + 1)}\n type=\"button\"\n className=\"tw-fold-menu-item\"\n role=\"menuitem\"\n tabIndex={-1}\n onClick={run(onFoldAll)}\n >\n <span className=\"tw-fm-chk\" aria-hidden=\"true\" />\n <span className=\"tw-fm-lab\">Fold All Headers</span>\n </button>\n <button\n ref={setRef(LEVELS.length + 2)}\n type=\"button\"\n className=\"tw-fold-menu-item\"\n role=\"menuitem\"\n tabIndex={-1}\n onClick={run(onUnfoldAll)}\n >\n <span className=\"tw-fm-chk\" aria-hidden=\"true\" />\n <span className=\"tw-fm-lab\">Unfold All Headers</span>\n </button>\n\n <div className=\"tw-fold-menu-sep\" role=\"separator\" />\n\n <button\n ref={setRef(LEVELS.length + 3)}\n type=\"button\"\n className=\"tw-fold-menu-item\"\n role=\"menuitem\"\n tabIndex={-1}\n onClick={run(onCopyLink)}\n >\n <span className=\"tw-fm-chk\" aria-hidden=\"true\" />\n <span className=\"tw-fm-lab\">Copy Link to here</span>\n </button>\n </div>\n );\n}\n\n/**\n * Styles for {@link FoldMenu}. Uses the editor's `--tw-*` tokens (inherited from\n * the nearest `.tw-editor` ancestor), respects `prefers-reduced-motion` and\n * `prefers-reduced-transparency`, and themes light/dark via those tokens.\n */\nexport const FOLDMENU_CSS = `\n.tw-fold-menu{position:fixed; z-index:100; min-width:234px; padding:6px; background:color-mix(in srgb, var(--tw-bg) 90%, transparent); backdrop-filter:blur(24px) saturate(1.7); -webkit-backdrop-filter:blur(24px) saturate(1.7); border:1px solid var(--tw-line); border-radius:14px; box-shadow:0 24px 60px -12px rgba(0,0,0,.5), 0 8px 24px -8px rgba(0,0,0,.4), inset 0 1px 0 rgba(255,255,255,.06); color:var(--tw-fg); font-family:-apple-system,\"SF Pro Text\",system-ui,sans-serif; animation:tw-fold-menu-in .16s cubic-bezier(.32,.72,0,1) both}\n@keyframes tw-fold-menu-in{from{opacity:0; transform:translateY(-6px) scale(.98)}to{opacity:1; transform:none}}\n.tw-fold-menu-item{display:flex; align-items:center; gap:10px; width:100%; padding:7px 9px; border:0; border-radius:9px; background:transparent; color:var(--tw-fg); font:inherit; font-size:13.5px; line-height:1.2; text-align:left; cursor:pointer; transition:background .13s}\n.tw-fold-menu-item:hover{background:var(--tw-accent-soft)}\n.tw-fold-menu-item:focus{outline:none; background:var(--tw-accent-soft)}\n.tw-fold-menu-item:focus-visible{outline:2px solid var(--tw-accent); outline-offset:-2px}\n.tw-fold-menu-item .tw-fm-chk{width:14px; height:14px; flex:none; opacity:0; color:var(--tw-accent)}\n.tw-fold-menu-item .tw-fm-chk svg{width:14px; height:14px; display:block}\n.tw-fold-menu-item.tw-on .tw-fm-chk{opacity:1}\n.tw-fold-menu-item .tw-fm-num{width:18px; height:18px; flex:none; border:1px solid var(--tw-line); border-radius:5px; display:grid; place-items:center; font-family:\"SF Mono\",ui-monospace,Menlo,monospace; font-size:10.5px; color:var(--tw-muted)}\n.tw-fold-menu-item .tw-fm-lab{flex:1; min-width:0}\n.tw-fold-menu-item .tw-fm-kbd{flex:none; font-family:\"SF Mono\",ui-monospace,Menlo,monospace; font-size:11px; color:var(--tw-faint)}\n.tw-fold-menu-sep{height:1px; margin:5px 4px; background:var(--tw-line)}\n@media (prefers-reduced-transparency: reduce){ .tw-fold-menu{background:var(--tw-bg); backdrop-filter:none; -webkit-backdrop-filter:none} }\n@media (prefers-reduced-motion: reduce){ .tw-fold-menu{animation:none !important} .tw-fold-menu-item{transition:none !important} }\n`;\n","/**\n * `src/sandbox/host.ts` — the opaque-origin execution sandbox (SPEC.md §7, §11).\n *\n * Anything executable (compiled MDX, Mermaid diagrams) runs here, never in the\n * host document. The sandbox is a hidden `<iframe srcdoc sandbox=\"allow-scripts\">`\n * with an **opaque origin** — `allow-same-origin` is NEVER granted, so a payload\n * cannot reach `parent.document`, storage, cookies, or the network beyond what\n * the CSP permits. This closes the XSS→RCE escalation and is Electron-safe.\n *\n * Security model (why this is safe without origin checks)\n * ------------------------------------------------------\n * - The iframe is opaque-origin, so every message it posts arrives at the host\n * with `event.origin === \"null\"`. Origin therefore cannot authenticate the\n * channel. Instead we validate:\n * 1. `event.source === iframe.contentWindow` — the message really came from\n * *our* frame (not a sibling frame or another window), and\n * 2. `message.token === <per-instance random token>` — the message carries\n * the secret channel token baked into this frame's `srcdoc`.\n * Both must hold; mismatches are silently ignored. The same token+source gate\n * is applied *inside* the frame (it only accepts messages whose source is its\n * `parent` and whose token matches).\n * - The CSP baked into the srcdoc is `default-src 'none'` with only\n * `'unsafe-inline'` scripts/styles (extendable via {@link SandboxOptions.csp}).\n * Compiled modules run as DOM-inserted **inline** `<script>` elements — which\n * `'unsafe-inline'` permits — so we never need `'unsafe-eval'`/`new Function`.\n * - Compiled output renders **inside** the iframe (the iframe *is* the widget).\n * The host never `innerHTML`s compiled output into its own tree. `evaluate`\n * resolves with the produced `html` for informational/read-mode use only; the\n * host must treat it as untrusted.\n * - A component's legitimate host/network needs are brokered: code inside the\n * frame calls `host(payload)` → `postMessage({type:'host', payload})` → the\n * host's {@link SandboxOptions.onHostMessage}, which proxies the request.\n *\n * The message-validation and dispatch logic is factored into pure functions\n * ({@link shouldAcceptMessage}, {@link dispatchInbound}, {@link buildSandboxCsp},\n * {@link buildSandboxSrcdoc}) so the protocol is unit-testable without a real\n * cross-origin frame (end-to-end iframe evaluation is covered by the e2e suite).\n */\n\nimport type { SandboxOptions } from '../types';\n\n/* ------------------------------------------------------------------ *\n * Public surface\n * ------------------------------------------------------------------ */\n\n/** Result of evaluating a compiled module inside the sandbox. */\nexport interface EvaluateResult {\n /**\n * Serialized HTML the module produced (already rendered inside the iframe).\n * Informational only — the host MUST NOT inject this into its own DOM.\n */\n html?: string;\n /** Measured content height of the iframe, for sizing the widget. */\n height?: number;\n /** Present when evaluation threw; the module never crashes the host. */\n error?: string;\n}\n\n/** Result of rendering a Mermaid diagram inside the sandbox. */\nexport interface MermaidResult {\n /** The diagram SVG (already rendered inside the iframe). */\n svg?: string;\n height?: number;\n error?: string;\n}\n\n/** Controller returned by {@link createSandbox}. */\nexport interface SandboxController {\n /**\n * Evaluate a compiled module body inside the sandbox. `code` is a statement\n * list that closes over the injected `h`, `components`, `props`, `host`, and\n * `root`, and returns the rendered result (an HTML string, a DOM node, or\n * nothing if it mounts into `root` itself). See the transform adapters in\n * `src/mdx/transform.ts` for the code shape.\n */\n evaluate(code: string, props?: Record<string, unknown>): Promise<EvaluateResult>;\n /** Render a Mermaid diagram source using the injected engine (if any). */\n renderMermaid(src: string): Promise<MermaidResult>;\n /** Tear down: remove the iframe, drop listeners, settle pending calls. */\n destroy(): void;\n}\n\n/**\n * Options for {@link createSandbox}. A superset of the public\n * {@link SandboxOptions} with host-only injection points (an existing\n * `SandboxOptions` is accepted as-is).\n */\nexport interface CreateSandboxOptions extends SandboxOptions {\n /** Element to append the hidden iframe to (defaults to `document.body`). */\n container?: HTMLElement;\n /**\n * Milliseconds before an `evaluate` / `renderMermaid` call resolves with a\n * timeout error (never rejects). `0` disables the timeout. Defaults to 8000.\n */\n timeoutMs?: number;\n /**\n * JavaScript *source* of a Mermaid-compatible engine, inlined into the sandbox\n * document (see {@link import('../types').MermaidOptions.getEngine}). Expected\n * to define `self.__twMermaidRender(src)` or `self.mermaid`.\n */\n mermaidEngine?: string;\n}\n\n/* ------------------------------------------------------------------ *\n * Pure protocol helpers (unit-tested)\n * ------------------------------------------------------------------ */\n\n/** Normalized shape of an inbound result message from the frame. */\nexport interface InboundResult {\n html?: string;\n svg?: string;\n height?: number;\n error?: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\n/**\n * Decide whether an inbound `message` event should be trusted. Replaces the\n * origin check (useless for an opaque-origin frame, where `event.origin` is\n * always `\"null\"`) with a source-identity + secret-token check.\n */\nexport function shouldAcceptMessage(\n event: { source?: unknown; data?: unknown },\n ctx: { source: unknown; token: string },\n): boolean {\n // The frame's own window must be the sender — not a sibling frame or a\n // rogue opener that happens to know the token.\n if (event.source !== ctx.source) return false;\n const data = event.data;\n if (!isRecord(data)) return false;\n return data.token === ctx.token;\n}\n\n/**\n * Route a *trusted* inbound message to the right handler. `ready` unlocks the\n * outbound queue, `host` is brokered to {@link SandboxOptions.onHostMessage},\n * anything carrying a numeric `id` settles the matching pending call.\n */\nexport function dispatchInbound(\n data: Record<string, unknown>,\n handlers: {\n onReady?: () => void;\n onHost?: (payload: unknown) => void;\n onResult?: (id: number, result: InboundResult) => void;\n },\n): void {\n const type = data.type;\n if (type === 'ready') {\n handlers.onReady?.();\n return;\n }\n if (type === 'host') {\n handlers.onHost?.(data.payload);\n return;\n }\n if (typeof data.id === 'number') {\n handlers.onResult?.(data.id, {\n html: typeof data.html === 'string' ? data.html : undefined,\n svg: typeof data.svg === 'string' ? data.svg : undefined,\n height: typeof data.height === 'number' ? data.height : undefined,\n error: typeof data.error === 'string' ? data.error : undefined,\n });\n }\n}\n\n/**\n * Build the frame-bound payload for an `evaluate` request. The host component\n * map travels under `props.components` — the single standardized field that the\n * in-frame `runModule` reads to bind the module's `components` (see\n * {@link MODULE_BINDINGS} and the dispatch in {@link SANDBOX_BOOTSTRAP}).\n * Centralizing the shape here keeps the sender and the frame in agreement and\n * makes the wiring unit-testable without a live iframe.\n */\nexport function buildEvaluateMessage(\n code: string,\n props?: Record<string, unknown>,\n): { code: string; props: Record<string, unknown> } {\n return { code, props: props ?? {} };\n}\n\n/**\n * The lexical bindings every compiled module closes over, injected verbatim as\n * the head of the in-frame module wrapper (see {@link SANDBOX_BOOTSTRAP}).\n * Notably it binds `components` ← `self.__tw.components` (the host's component\n * map), which the constrained transform relies on (`const Callout =\n * components[\"Callout\"]`). Exported so the binding contract is unit-testable\n * against the exact source the frame runs — no drift.\n */\nexport const MODULE_BINDINGS =\n 'var h=self.__tw.h,host=self.__tw.host,components=self.__tw.components,' +\n 'props=self.__tw.props,root=document.getElementById(\"tw-root\");';\n\n/** The strict base CSP for the sandbox document; `extra` is appended. */\nexport function buildSandboxCsp(extra?: string): string {\n const base =\n \"default-src 'none'; \" +\n \"script-src 'unsafe-inline'; \" +\n \"style-src 'unsafe-inline'; \" +\n 'img-src data: https:; ' +\n 'font-src data:';\n const trimmed = extra?.trim();\n return trimmed ? `${base}; ${trimmed}` : base;\n}\n\n/** A per-instance random channel token. Prefers crypto; falls back gracefully. */\nexport function createChannelToken(): string {\n const cryptoObj = (globalThis as { crypto?: Crypto }).crypto;\n if (cryptoObj && typeof cryptoObj.getRandomValues === 'function') {\n const bytes = new Uint8Array(16);\n cryptoObj.getRandomValues(bytes);\n let out = '';\n for (const b of bytes) out += b.toString(16).padStart(2, '0');\n return out;\n }\n return `${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`;\n}\n\n/** Neutralize a premature `</script>` in inlined engine source. */\nfunction neutralizeScriptClose(source: string): string {\n return source.replace(/<\\/(script)/gi, '<\\\\/$1');\n}\n\n/**\n * Build the sandbox document. Only trusted, fixed content is inlined here (the\n * bootstrap and the optional engine source); per-evaluate module code is NEVER\n * inlined into this string — it is injected at runtime via a script element's\n * `textContent` (see the bootstrap), which is immune to `</script>` breakout.\n */\nexport function buildSandboxSrcdoc(params: {\n token: string;\n csp: string;\n engineSource?: string;\n}): string {\n const { token, csp, engineSource } = params;\n const bootstrap = SANDBOX_BOOTSTRAP.replace('__TW_TOKEN__', JSON.stringify(token));\n return (\n '<!DOCTYPE html><html><head><meta charset=\"utf-8\">' +\n `<meta http-equiv=\"Content-Security-Policy\" content=\"${csp}\">` +\n '<style>html,body{margin:0;padding:0;background:transparent;color:inherit;' +\n 'font:14px/1.5 system-ui,-apple-system,sans-serif}#tw-root{display:block}</style>' +\n '</head><body><div id=\"tw-root\"></div>' +\n (engineSource ? `<script>\\n${neutralizeScriptClose(engineSource)}\\n</script>` : '') +\n `<script>\\n${bootstrap}\\n</script>` +\n '</body></html>'\n );\n}\n\n/* ------------------------------------------------------------------ *\n * Sandbox factory\n * ------------------------------------------------------------------ */\n\n/**\n * Create a hidden opaque-origin sandbox and return a controller for evaluating\n * compiled modules and rendering Mermaid inside it. Requires a DOM (browser or\n * jsdom). Debouncing is the caller's responsibility.\n */\nexport function createSandbox(opts: CreateSandboxOptions = {}): SandboxController {\n if (typeof document === 'undefined') {\n throw new Error(\n 'typewright/mdx: createSandbox requires a DOM (browser or jsdom); none was found.',\n );\n }\n\n const token = createChannelToken();\n const csp = buildSandboxCsp(opts.csp);\n const srcdoc = buildSandboxSrcdoc({ token, csp, engineSource: opts.mermaidEngine });\n const timeoutMs = opts.timeoutMs ?? 8000;\n\n const iframe = document.createElement('iframe');\n // Opaque origin: scripts only, NEVER allow-same-origin (SPEC.md §7/§11).\n iframe.setAttribute('sandbox', 'allow-scripts');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.setAttribute('tabindex', '-1');\n iframe.setAttribute('title', 'typewright sandbox');\n iframe.style.cssText =\n 'position:absolute;width:0;height:0;border:0;visibility:hidden;pointer-events:none;';\n iframe.srcdoc = srcdoc;\n\n const container = opts.container ?? document.body ?? document.documentElement;\n container.appendChild(iframe);\n\n let destroyed = false;\n let ready = false;\n let nextId = 1;\n const outbox: Array<Record<string, unknown>> = [];\n const pending = new Map<\n number,\n { resolve: (r: InboundResult) => void; timer?: ReturnType<typeof setTimeout> }\n >();\n\n function flush(): void {\n if (!ready || destroyed) return;\n const win = iframe.contentWindow;\n if (!win) return;\n while (outbox.length > 0) {\n const msg = outbox.shift();\n if (!msg) continue;\n try {\n win.postMessage(msg, '*');\n } catch {\n // A non-structured-cloneable payload (e.g. a function passed in\n // MdxOptions.components — functions can't cross the postMessage\n // boundary into the opaque-origin frame) throws DataCloneError here.\n // Fail the matching request fast with a clear message instead of\n // letting it hang until the timeout.\n const id = msg.id;\n if (typeof id === 'number') {\n settle(id, {\n error:\n 'sandbox payload is not serializable — MDX components/props must be ' +\n 'structured-cloneable (functions are not supported across the sandbox)',\n });\n }\n }\n }\n }\n\n function send(msg: Record<string, unknown>): void {\n // targetOrigin '*' is required: the frame is opaque-origin (\"null\") and\n // cannot be named. The token in the payload authenticates the channel.\n outbox.push({ ...msg, token });\n flush();\n }\n\n function settle(id: number, result: InboundResult): void {\n const entry = pending.get(id);\n if (!entry) return;\n pending.delete(id);\n if (entry.timer) clearTimeout(entry.timer);\n entry.resolve(result);\n }\n\n function request(\n kind: 'evaluate' | 'mermaid',\n extra: Record<string, unknown>,\n ): Promise<InboundResult> {\n if (destroyed) return Promise.resolve({ error: 'sandbox destroyed' });\n const id = nextId++;\n return new Promise<InboundResult>((resolve) => {\n const timer =\n timeoutMs > 0\n ? setTimeout(\n () => settle(id, { error: `sandbox ${kind} timed out after ${timeoutMs}ms` }),\n timeoutMs,\n )\n : undefined;\n pending.set(id, { resolve, timer });\n send({ type: kind, id, ...extra });\n });\n }\n\n function onMessage(event: MessageEvent): void {\n if (destroyed) return;\n // Opaque-origin frame → validate by source identity + token, not origin.\n if (!shouldAcceptMessage(event, { source: iframe.contentWindow, token })) return;\n dispatchInbound(event.data as Record<string, unknown>, {\n onReady: () => {\n ready = true;\n flush();\n },\n onHost: (payload) => {\n opts.onHostMessage?.(payload);\n },\n onResult: (id, result) => settle(id, result),\n });\n }\n\n window.addEventListener('message', onMessage);\n\n return {\n async evaluate(code, props) {\n const r = await request('evaluate', buildEvaluateMessage(code, props));\n return { html: r.html, height: r.height, error: r.error };\n },\n async renderMermaid(src) {\n const r = await request('mermaid', { src });\n return { svg: r.svg, height: r.height, error: r.error };\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n window.removeEventListener('message', onMessage);\n for (const [, entry] of pending) {\n if (entry.timer) clearTimeout(entry.timer);\n entry.resolve({ error: 'sandbox destroyed' });\n }\n pending.clear();\n iframe.remove();\n },\n };\n}\n\n/* ------------------------------------------------------------------ *\n * The in-frame bootstrap (runs inside the opaque-origin iframe)\n * ------------------------------------------------------------------ */\n\n/**\n * Injected into the sandbox `srcdoc`. `__TW_TOKEN__` is replaced with the\n * JSON-encoded channel token. Written in ES5-ish JS (no build step runs on it)\n * and self-contained. It:\n * - only accepts messages whose `source === parent` and whose `token` matches;\n * - on `evaluate`, runs the module as a DOM-inserted inline script (CSP\n * `'unsafe-inline'` — no `eval`), mounting output into `#tw-root` and posting\n * `{ html, height }` (or `{ error }`);\n * - on `mermaid`, calls the injected engine and posts `{ svg, height }`;\n * - exposes `host(payload)` to brokered code, and `h()` to build DOM.\n */\nconst SANDBOX_BOOTSTRAP = `\n(function () {\n var TOKEN = __TW_TOKEN__;\n var root = document.getElementById('tw-root') || document.body;\n\n function post(msg) { msg.token = TOKEN; parent.postMessage(msg, '*'); }\n function measure() {\n var de = document.documentElement, b = document.body;\n return Math.max(\n de ? de.scrollHeight : 0,\n b ? b.scrollHeight : 0,\n root ? root.scrollHeight : 0\n );\n }\n function host(payload) { post({ type: 'host', payload: payload }); }\n\n function appendChildren(el, children) {\n for (var i = 0; i < children.length; i++) {\n var c = children[i];\n if (c == null || c === false || c === true) continue;\n if (Object.prototype.toString.call(c) === '[object Array]') { appendChildren(el, c); continue; }\n if (typeof Node !== 'undefined' && c instanceof Node) { el.appendChild(c); continue; }\n el.appendChild(document.createTextNode(String(c)));\n }\n }\n // Hyperscript used by compiled MDX: builds real DOM (no innerHTML string\n // concatenation), returns an element. A function tag is a component.\n function h(tag, props) {\n var children = Array.prototype.slice.call(arguments, 2);\n if (typeof tag === 'function') {\n var p = {}; for (var pk in (props || {})) p[pk] = props[pk]; p.children = children;\n return tag(p);\n }\n var el = document.createElement(String(tag));\n if (props) {\n for (var key in props) {\n var v = props[key];\n if (v == null || v === false) continue;\n if (key === 'className' || key === 'class') { el.setAttribute('class', String(v)); continue; }\n if (key === 'style' && v && typeof v === 'object') {\n for (var s in v) { try { el.style[s] = v[s]; } catch (e) {} }\n continue;\n }\n if (key.slice(0, 2) === 'on') continue; // never wire inline handlers\n if (v === true) { el.setAttribute(key, ''); continue; }\n el.setAttribute(key, String(v));\n }\n }\n appendChildren(el, children);\n return el;\n }\n\n var RT = { h: h, host: host, props: {}, components: {}, done: null, error: null };\n self.__tw = RT;\n\n RT.done = function (id, out) {\n Promise.resolve(out).then(function (value) {\n try {\n if (typeof Node !== 'undefined' && value instanceof Node) root.appendChild(value);\n else if (typeof value === 'string') root.innerHTML = value;\n // else: the module mounted itself into root\n } catch (e) {}\n post({ type: 'result', id: id, html: root.innerHTML, height: measure() });\n }, function (err) {\n post({ type: 'result', id: id, error: String((err && err.message) || err) });\n });\n };\n RT.error = function (id, err) {\n post({ type: 'result', id: id, error: String((err && err.message) || err) });\n };\n\n function runModule(id, code, props, components) {\n RT.props = props || {};\n RT.components = components || {};\n // Inline-script injection (allowed by CSP 'unsafe-inline'; no eval). Setting\n // textContent — not innerHTML — makes any '</script>' in code inert.\n var wrapped =\n '\"use strict\";(function(){' +\n '${MODULE_BINDINGS}' +\n 'try{var __out=(function(){' + code + '\\\\n})();self.__tw.done(' + id + ',__out);}' +\n 'catch(__e){self.__tw.error(' + id + ',__e);}})();';\n var s = document.createElement('script');\n s.textContent = wrapped;\n (document.body || document.documentElement).appendChild(s);\n if (s.parentNode) s.parentNode.removeChild(s);\n }\n\n function renderMermaid(id, src) {\n try {\n var engine = null;\n if (typeof self.__twMermaidRender === 'function') {\n engine = self.__twMermaidRender;\n } else if (self.mermaid && typeof self.mermaid.render === 'function') {\n engine = function (s) {\n return Promise.resolve(self.mermaid.render('tw-mmd-' + id, s)).then(function (r) {\n return typeof r === 'string' ? r : (r && r.svg) || '';\n });\n };\n }\n if (!engine) { post({ type: 'result', id: id, error: 'no mermaid engine injected in sandbox' }); return; }\n Promise.resolve(engine(src)).then(function (svg) {\n try { root.innerHTML = svg || ''; } catch (e) {}\n post({ type: 'result', id: id, svg: svg || '', height: measure() });\n }, function (err) {\n post({ type: 'result', id: id, error: String((err && err.message) || err) });\n });\n } catch (err) {\n post({ type: 'result', id: id, error: String((err && err.message) || err) });\n }\n }\n\n window.addEventListener('message', function (event) {\n if (event.source !== parent) return; // only the host frame\n var data = event.data;\n if (!data || typeof data !== 'object' || data.token !== TOKEN) return; // token gate\n // The host component map travels under props.components (see\n // buildEvaluateMessage); bind it as the module components map.\n if (data.type === 'evaluate') runModule(data.id, data.code, data.props, data.props && data.props.components);\n else if (data.type === 'mermaid') renderMermaid(data.id, data.src);\n });\n\n post({ type: 'ready' });\n})();\n`;\n","/**\n * `src/mdx/transform.ts` — MDX transform adapters (SPEC.md §7, step 2).\n *\n * Turning JSX/TS into runnable plain JS is the one conceded boundary. This\n * module resolves an {@link MdxTransform} into a uniform async compile function\n * `(code, meta?) => Promise<string>`:\n *\n * - `'wasm-esbuild'` → dynamically imports the OPTIONAL peer `esbuild-wasm`.\n * - `'wasm-swc'` → dynamically imports the OPTIONAL peer `@swc/wasm-web`.\n * Both peers are never bundled and never hard-imported; if absent, a clear\n * Error naming the missing peer is thrown. The host is responsible for\n * initializing the wasm engine (its `wasmURL` is environment-specific).\n * - `'constrained'` → a built-in, ZERO-DEPENDENCY transform for a restricted\n * MDX-JS subset (see grammar below). No external parser.\n * - a function → returned as-is (host-supplied), wrapped to a Promise.\n * - `undefined` → a transform that throws \"no MDX transform configured\"\n * (the editor treats this as \"render escaped source\").\n *\n * ── Constrained subset (exact, compiled to `h(tag, props, ...children)`) ──────\n * The constrained transform is a small hand-written recursive-descent parser for\n * a bounded surface — deliberately NOT a general JS parser. It accepts:\n *\n * Module := (Line)* lines beginning with `import`/`export`\n * (at column 0) are stripped/hoisted out\n * Body := (Text | Element | Interp)* the remaining top-level content\n * Element := '<' Name Attr* '/>'\n * | '<' Name Attr* '>' Children '</' Name '>'\n * Name := [A-Za-z][A-Za-z0-9._-]* Capitalized → component; the root\n * identifier is bound from the map\n * (`const Chart = components[\"Chart\"]`) and the\n * tag is emitted bare (`h(Chart, …)`, `h(Foo.Bar, …)`);\n * lowercase → HTML string tag. A capitalized name\n * whose segments aren't identifiers is rejected.\n * Attr := Name boolean shorthand → `true`\n * | Name '=' '\"' … '\"' string literal\n * | Name '=' \"'\" … \"'\" string literal\n * | Name '=' '{' Expr '}' restricted expression\n * Children := (Text | Element | Interp)*\n * Interp := '{' Expr '}' interpolation child\n * Expr := number | 'true' | 'false' | 'null'\n * | Identifier e.g. `name`\n * | Identifier ('.' Identifier)+ simple member, e.g. `user.name`\n * Text := run of chars that are not '<' or '{' (JSX entities untouched)\n *\n * Anything outside this subset (arrow functions, calls, operators, object/array\n * literals, template strings, JSX fragments `<>…</>`, spread `{...x}`, mismatched\n * tags, unterminated constructs) throws a clear Error — it never silently\n * miscompiles. Hosts needing the full surface use `wasm-esbuild`/`wasm-swc`.\n *\n * Output shape: the compiled module is a statement list ending in a `return`,\n * closing over the sandbox-injected `h`, `components`, and `props`. Example:\n * `<Callout type=\"info\">Hi {name}</Callout>` →\n * const Callout = components[\"Callout\"];\n * return h(Callout, {\"type\": \"info\"}, \"Hi \", name);\n */\n\nimport type { MdxTransform } from '../types';\n\nexport interface TransformMeta {\n filename?: string;\n}\n\nexport type CompileFn = (code: string, meta?: TransformMeta) => Promise<string>;\n\n/* ------------------------------------------------------------------ *\n * Resolution\n * ------------------------------------------------------------------ */\n\n/** Resolve an {@link MdxTransform} into a uniform async compile function. */\nexport function resolveTransform(t: MdxTransform | undefined): CompileFn {\n if (t === undefined) {\n return async () => {\n throw new Error('no MDX transform configured');\n };\n }\n if (typeof t === 'function') {\n return async (code, meta) => t(code, meta ?? {});\n }\n switch (t) {\n case 'constrained':\n return async (code) => compileConstrained(code);\n case 'wasm-esbuild':\n return (code, meta) => transformWithEsbuild(code, meta);\n case 'wasm-swc':\n return (code, meta) => transformWithSwc(code, meta);\n default: {\n // Exhaustiveness: a new MdxTransform string must be handled here.\n const never: never = t;\n throw new Error(`typewright/mdx: unknown MDX transform \"${String(never)}\"`);\n }\n }\n}\n\n/* ------------------------------------------------------------------ *\n * Optional-peer wasm adapters\n * ------------------------------------------------------------------ */\n\n/**\n * Dynamically import an optional peer by a NON-literal specifier so no bundler\n * tries to resolve/inline it. Throws a clear, actionable Error if it is absent.\n */\nasync function importOptionalPeer(name: string): Promise<Record<string, unknown>> {\n const specifier = name; // variable → non-analyzable → never bundled\n try {\n return (await import(/* @vite-ignore */ specifier)) as Record<string, unknown>;\n } catch (cause) {\n throw new Error(\n `typewright/mdx: this MDX transform needs the optional peer dependency \"${name}\", ` +\n `which is not installed. Install it (e.g. \\`npm i ${name}\\`) or choose a different ` +\n `MdxTransform (\"constrained\" has zero dependencies).`,\n { cause },\n );\n }\n}\n\nfunction loaderFor(meta?: TransformMeta): 'tsx' | 'jsx' {\n return /\\.tsx?$/.test(meta?.filename ?? '') ? 'tsx' : 'jsx';\n}\n\nasync function transformWithEsbuild(code: string, meta?: TransformMeta): Promise<string> {\n const esbuild = await importOptionalPeer('esbuild-wasm');\n const transform = esbuild.transform as\n | ((input: string, options: unknown) => Promise<{ code: string }>)\n | undefined;\n if (typeof transform !== 'function') {\n throw new Error('typewright/mdx: \"esbuild-wasm\" is installed but exposes no transform().');\n }\n const result = await transform(code, {\n loader: loaderFor(meta),\n jsx: 'automatic',\n format: 'esm',\n sourcefile: meta?.filename,\n });\n return result.code;\n}\n\nasync function transformWithSwc(code: string, meta?: TransformMeta): Promise<string> {\n const swc = await importOptionalPeer('@swc/wasm-web');\n const transform = swc.transform as\n | ((input: string, options: unknown) => Promise<{ code: string }>)\n | undefined;\n if (typeof transform !== 'function') {\n throw new Error('typewright/mdx: \"@swc/wasm-web\" is installed but exposes no transform().');\n }\n const tsx = loaderFor(meta) === 'tsx';\n const result = await transform(code, {\n filename: meta?.filename,\n jsc: {\n parser: tsx\n ? { syntax: 'typescript', tsx: true }\n : { syntax: 'ecmascript', jsx: true },\n transform: { react: { runtime: 'automatic' } },\n },\n });\n return result.code;\n}\n\n/* ------------------------------------------------------------------ *\n * Constrained transform — zero-dependency restricted JSX compiler\n * ------------------------------------------------------------------ */\n\ntype ConstrainedNode =\n | { kind: 'text'; value: string }\n | { kind: 'expr'; source: string }\n | { kind: 'element'; name: string; attrs: Attr[]; children: ConstrainedNode[] };\n\ninterface Attr {\n name: string;\n /** `undefined` → boolean shorthand (`true`). */\n value?: { kind: 'string'; value: string } | { kind: 'expr'; source: string };\n}\n\nclass TransformError extends Error {\n constructor(message: string, index: number) {\n super(`constrained MDX transform: ${message} (at offset ${index})`);\n this.name = 'TransformError';\n }\n}\n\nconst IDENT_START = /[A-Za-z_$]/;\nconst IDENT_PART = /[A-Za-z0-9_$]/;\nconst NAME_PART = /[A-Za-z0-9._-]/;\n\n/** Compile the restricted MDX subset to a sandbox module string. */\nexport function compileConstrained(source: string): string {\n const { body, components } = new ConstrainedParser(source).parse();\n const parts: string[] = [];\n for (const name of components) {\n parts.push(`const ${name} = components[${JSON.stringify(name)}];`);\n }\n parts.push(`return ${childrenExpr(body)};`);\n return parts.join('\\n');\n}\n\n/** Strip top-level `import`/`export` lines; return the remaining body. */\nfunction stripModuleLines(source: string): string {\n const kept: string[] = [];\n for (const line of source.split('\\n')) {\n if (/^\\s*(import|export)\\b/.test(line)) {\n // Line-based hoist: imports/exports are dropped (components come from the\n // injected `components` map, not resolved modules — documented limitation).\n kept.push('');\n } else {\n kept.push(line);\n }\n }\n return kept.join('\\n');\n}\n\nclass ConstrainedParser {\n private readonly src: string;\n private pos = 0;\n private readonly components = new Set<string>();\n\n constructor(rawSource: string) {\n this.src = stripModuleLines(rawSource);\n }\n\n parse(): { body: ConstrainedNode[]; components: string[] } {\n const body = this.parseChildren(null);\n this.skipInsignificantWhitespace();\n if (this.pos < this.src.length) {\n throw new TransformError(`unexpected \"${this.src[this.pos]}\"`, this.pos);\n }\n return { body, components: [...this.components] };\n }\n\n private parseChildren(closeTag: string | null): ConstrainedNode[] {\n const children: ConstrainedNode[] = [];\n for (;;) {\n if (this.pos >= this.src.length) {\n if (closeTag !== null) {\n throw new TransformError(`unclosed <${closeTag}>`, this.pos);\n }\n return children;\n }\n const ch = this.src[this.pos];\n if (ch === '<') {\n if (this.src[this.pos + 1] === '/') {\n // Closing tag — belongs to the caller.\n if (closeTag === null) {\n throw new TransformError('unexpected closing tag', this.pos);\n }\n return children;\n }\n children.push(this.parseElement());\n } else if (ch === '{') {\n children.push({ kind: 'expr', source: this.parseBracedExpr() });\n } else {\n const text = this.parseText();\n if (text.value.length > 0) children.push(text);\n }\n }\n }\n\n private parseText(): { kind: 'text'; value: string } {\n let out = '';\n while (this.pos < this.src.length) {\n const ch = this.src[this.pos];\n if (ch === '<' || ch === '{') break;\n out += ch;\n this.pos++;\n }\n return { kind: 'text', value: out };\n }\n\n private parseElement(): ConstrainedNode {\n const start = this.pos;\n this.expect('<');\n const name = this.parseName();\n if (isComponentName(name)) this.components.add(componentRoot(name, start));\n const attrs: Attr[] = [];\n for (;;) {\n this.skipWhitespace();\n const ch = this.src[this.pos];\n if (ch === undefined) throw new TransformError('unterminated tag', start);\n if (ch === '/') {\n this.expect('/');\n this.expect('>');\n return { kind: 'element', name, attrs, children: [] };\n }\n if (ch === '>') {\n this.pos++;\n const children = this.parseChildren(name);\n this.expect('<');\n this.expect('/');\n this.skipWhitespace();\n const closeName = this.parseName();\n if (closeName !== name) {\n throw new TransformError(`mismatched closing tag </${closeName}> for <${name}>`, this.pos);\n }\n this.skipWhitespace();\n this.expect('>');\n return { kind: 'element', name, attrs, children };\n }\n attrs.push(this.parseAttr());\n }\n }\n\n private parseAttr(): Attr {\n const name = this.parseName();\n this.skipWhitespace();\n if (this.src[this.pos] !== '=') {\n return { name }; // boolean shorthand\n }\n this.pos++; // '='\n this.skipWhitespace();\n const ch = this.src[this.pos];\n if (ch === '\"' || ch === \"'\") {\n return { name, value: { kind: 'string', value: this.parseStringLiteral(ch) } };\n }\n if (ch === '{') {\n return { name, value: { kind: 'expr', source: this.parseBracedExpr() } };\n }\n throw new TransformError(`attribute \"${name}\" must be a string literal or a {expression}`, this.pos);\n }\n\n private parseName(): string {\n const start = this.pos;\n const first = this.src[this.pos];\n if (first === undefined || !/[A-Za-z]/.test(first)) {\n throw new TransformError('expected a tag/attribute name', this.pos);\n }\n let out = first;\n this.pos++;\n while (this.pos < this.src.length && NAME_PART.test(this.src[this.pos] as string)) {\n out += this.src[this.pos];\n this.pos++;\n }\n if (out.endsWith('.') || out.endsWith('-')) {\n throw new TransformError(`invalid name \"${out}\"`, start);\n }\n return out;\n }\n\n private parseStringLiteral(quote: string): string {\n this.expect(quote);\n let out = '';\n while (this.pos < this.src.length) {\n const ch = this.src[this.pos];\n if (ch === quote) {\n this.pos++;\n return out;\n }\n if (ch === '\\\\') {\n // Keep escapes literal-safe: capture the next char verbatim.\n out += ch;\n this.pos++;\n if (this.pos < this.src.length) {\n out += this.src[this.pos];\n this.pos++;\n }\n continue;\n }\n out += ch;\n this.pos++;\n }\n throw new TransformError('unterminated string literal', this.pos);\n }\n\n /** Consume `{ … }` and return the validated restricted expression source. */\n private parseBracedExpr(): string {\n const start = this.pos;\n this.expect('{');\n let depth = 1;\n let raw = '';\n while (this.pos < this.src.length && depth > 0) {\n const ch = this.src[this.pos];\n if (ch === '{') depth++;\n else if (ch === '}') {\n depth--;\n if (depth === 0) {\n this.pos++;\n break;\n }\n }\n raw += ch;\n this.pos++;\n }\n if (depth !== 0) throw new TransformError('unterminated {expression}', start);\n return validateRestrictedExpr(raw.trim(), start);\n }\n\n private expect(ch: string): void {\n if (this.src[this.pos] !== ch) {\n throw new TransformError(`expected \"${ch}\"`, this.pos);\n }\n this.pos++;\n }\n\n private skipWhitespace(): void {\n while (this.pos < this.src.length && /\\s/.test(this.src[this.pos] as string)) this.pos++;\n }\n\n /** Skip trailing whitespace-only content when checking for EOF. */\n private skipInsignificantWhitespace(): void {\n while (this.pos < this.src.length && /\\s/.test(this.src[this.pos] as string)) this.pos++;\n }\n}\n\nfunction isComponentName(name: string): boolean {\n return /^[A-Z]/.test(name);\n}\n\nconst SIMPLE_IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\n\n/**\n * For a capitalized component tag (optionally a member expression like\n * `Foo.Bar`), validate that every segment is a plain identifier and return the\n * ROOT identifier to bind from the `components` map (`const Foo = components[\"Foo\"]`;\n * the tag itself is emitted as the bare dotted path). Throws on names that would\n * not form valid JS (e.g. a hyphenated capitalized name).\n */\nfunction componentRoot(name: string, index: number): string {\n const segments = name.split('.');\n for (const seg of segments) {\n if (!SIMPLE_IDENT.test(seg)) {\n throw new TransformError(\n `unsupported component name \"${name}\" — component tags must be dot-separated identifiers`,\n index,\n );\n }\n }\n return segments[0] as string;\n}\n\n/**\n * Validate that `expr` is a restricted expression (number/boolean/null,\n * identifier, or a simple dotted member). Returns it unchanged; throws\n * otherwise. This is the guard that keeps the subset safe and predictable — no\n * calls, operators, or function bodies slip through.\n */\nfunction validateRestrictedExpr(expr: string, index: number): string {\n if (expr.length === 0) {\n throw new TransformError('empty {expression}', index);\n }\n if (expr === 'true' || expr === 'false' || expr === 'null') return expr;\n if (/^-?\\d+(\\.\\d+)?$/.test(expr)) return expr;\n if (isSimpleMemberPath(expr)) return expr;\n throw new TransformError(\n `unsupported expression \\`${expr}\\` — only numbers, true/false/null, ` +\n `an identifier, or a simple dotted member (a.b.c) are allowed`,\n index,\n );\n}\n\n/** `foo` or `foo.bar.baz` — each segment a valid JS identifier. */\nfunction isSimpleMemberPath(expr: string): boolean {\n const segments = expr.split('.');\n for (const seg of segments) {\n if (seg.length === 0) return false;\n if (!IDENT_START.test(seg[0] as string)) return false;\n for (let i = 1; i < seg.length; i++) {\n if (!IDENT_PART.test(seg[i] as string)) return false;\n }\n }\n return true;\n}\n\n/* ------------------------------------------------------------------ *\n * Codegen\n * ------------------------------------------------------------------ */\n\nfunction childrenExpr(children: ConstrainedNode[]): string {\n const rendered = children.map(nodeExpr).filter((s) => s !== null) as string[];\n if (rendered.length === 0) return 'null';\n if (rendered.length === 1) return rendered[0] as string;\n return `[${rendered.join(', ')}]`;\n}\n\nfunction nodeExpr(node: ConstrainedNode): string | null {\n if (node.kind === 'text') {\n if (node.value.trim().length === 0 && node.value.indexOf('\\n') !== -1) {\n // Whitespace-only text spanning a line break is layout noise — drop it,\n // matching JSX's whitespace handling for readability.\n return null;\n }\n return JSON.stringify(node.value);\n }\n if (node.kind === 'expr') {\n return node.source;\n }\n const tag = isComponentName(node.name) ? node.name : JSON.stringify(node.name);\n const props = attrsExpr(node.attrs);\n const kids = node.children.map(nodeExpr).filter((s) => s !== null) as string[];\n const args = [tag, props, ...kids];\n return `h(${args.join(', ')})`;\n}\n\nfunction attrsExpr(attrs: Attr[]): string {\n if (attrs.length === 0) return 'null';\n const entries = attrs.map((attr) => {\n const key = JSON.stringify(attr.name);\n if (attr.value === undefined) return `${key}: true`;\n if (attr.value.kind === 'string') return `${key}: ${JSON.stringify(attr.value.value)}`;\n return `${key}: ${attr.value.source}`;\n });\n return `{${entries.join(', ')}}`;\n}\n","import * as React from 'react';\nimport { createSandbox, resolveTransform } from '../mdx';\nimport type { SandboxController } from '../mdx';\nimport type { ComponentMap, MdxTransform, SandboxOptions } from '../types';\n\n/**\n * SandboxIsland — one executable widget island rendered *as the sandbox iframe*\n * (Phase D4 / E1, SPEC.md §7/§11). The compiled MDX / Mermaid output stays\n * **inside** the opaque-origin `<iframe sandbox=\"allow-scripts\">` created by\n * {@link createSandbox}; the host tree never `innerHTML`s the untrusted output\n * (invariant K-3). The iframe itself is the widget — this component only mounts\n * the sandbox into a container `<div>` it owns, un-hides + sizes the iframe once\n * the sandbox reports a height, and shows an inline error card on failure.\n *\n * Lifecycle:\n * - **create/reuse** — a single sandbox is created on mount (in a container ref\n * passed as {@link createSandbox}'s `container`) and reused across `code`\n * edits; it is recreated only when the engine identity changes (a Mermaid\n * engine or CSP is baked into the sandbox document at creation).\n * - **evaluate** — DEBOUNCED ~250 ms after `code` (or the MDX transform/\n * components) change: `mdx` → `resolveTransform(transform)(code)` then\n * `sandbox.evaluate(js, {components})`; `mermaid` → `sandbox.renderMermaid(code)`.\n * - **destroy** — the sandbox is torn down on unmount.\n *\n * Failure handling (invariant K-6 — editing must never break): a transform\n * throw, an `evaluate`/`renderMermaid` error result, or any unexpected throw is\n * caught and surfaced as an inline `.tw-island-error` card (the message is\n * rendered as escaped text by React, never as HTML). The component itself never\n * throws during render.\n *\n * With no MDX transform configured the island falls back to the escaped source\n * in a `<pre>` (the \"no transform\" case) — the same safe form the renderer uses.\n */\nexport interface SandboxIslandProps {\n /** `mdx` runs a compiled MDX module; `mermaid` renders a diagram. */\n kind: 'mdx' | 'mermaid';\n /** Raw `mdxFlow` source (mdx), or the Mermaid diagram source (mermaid). */\n code: string;\n /** How to compile the MDX source to runnable JS (mdx only). */\n transform?: MdxTransform;\n /** Components made available to the compiled module (mdx only). */\n components?: ComponentMap;\n /** Sandbox options (opaque-origin iframe; `allowSameOrigin` is type-forbidden). */\n sandbox?: SandboxOptions;\n /** Resolved Mermaid engine JavaScript *source*, inlined into the sandbox (mermaid only). */\n mermaidEngine?: string;\n /** Colour scheme hint applied to the iframe + error card. */\n theme?: 'light' | 'dark';\n}\n\n/** How long an edit settles before the island re-compiles/renders. */\nconst DEBOUNCE_MS = 250;\n\n/** The one iframe {@link createSandbox} appended into `host`, if any. */\nfunction frameOf(host: HTMLElement | null): HTMLIFrameElement | null {\n return host?.querySelector<HTMLIFrameElement>('iframe') ?? null;\n}\n\n/** Reveal + size the (default-hidden) sandbox iframe so it becomes the widget. */\nfunction showFrame(iframe: HTMLIFrameElement, height: number | undefined, theme: 'light' | 'dark'): void {\n iframe.style.position = 'static';\n iframe.style.visibility = 'visible';\n iframe.style.pointerEvents = 'auto';\n iframe.style.width = '100%';\n iframe.style.height = `${Math.max(1, Math.ceil(height ?? 0))}px`;\n iframe.style.colorScheme = theme;\n}\n\n/** Collapse the iframe (kept mounted for reuse; the error card takes its place). */\nfunction hideFrame(iframe: HTMLIFrameElement): void {\n iframe.style.visibility = 'hidden';\n iframe.style.height = '0';\n iframe.style.pointerEvents = 'none';\n}\n\n/** Best-effort message text for an error card (never throws). */\nfunction errorText(err: unknown): string {\n if (typeof err === 'string') return err;\n if (err && typeof err === 'object' && 'message' in err) {\n return String((err as { message: unknown }).message);\n }\n return String(err);\n}\n\nfunction SandboxIslandBase(props: SandboxIslandProps): React.ReactElement {\n const { kind, code, transform, components, sandbox, mermaidEngine, theme = 'light' } = props;\n\n const hostRef = React.useRef<HTMLDivElement>(null);\n const [controller, setController] = React.useState<SandboxController | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n\n // Freshest theme for the DEBOUNCED reveal, without making the run re-fire on a\n // pure theme change (the theme effect below restyles an already-shown frame).\n const themeRef = React.useRef(theme);\n themeRef.current = theme;\n\n // The \"no MDX transform\" case renders the escaped source (below) and needs no\n // sandbox at all; every other case runs inside the opaque-origin iframe.\n const needsSandbox = !(kind === 'mdx' && transform === undefined);\n const sandboxCsp = sandbox?.csp;\n\n // --- create / destroy the sandbox (reused across `code` edits) ------------\n React.useEffect(() => {\n if (!needsSandbox) return undefined;\n if (typeof document === 'undefined') return undefined;\n const container = hostRef.current;\n if (!container) return undefined;\n let ctrl: SandboxController | null = null;\n try {\n ctrl = createSandbox({\n ...sandbox,\n container,\n mermaidEngine: kind === 'mermaid' ? mermaidEngine : undefined,\n });\n } catch (err) {\n setError(errorText(err));\n return undefined;\n }\n setController(ctrl);\n return () => {\n ctrl?.destroy();\n setController(null);\n };\n // The engine source + CSP are baked into the sandbox document at creation,\n // so a change there requires a fresh sandbox; `transform`/`components`/`code`\n // do not (they flow through `evaluate`, handled by the run effect below).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [kind, needsSandbox, mermaidEngine, sandboxCsp]);\n\n // --- debounced compile + evaluate -----------------------------------------\n React.useEffect(() => {\n if (!controller) return undefined;\n const iframe = frameOf(hostRef.current);\n if (!code.trim()) {\n // Nothing to run — clear any prior error and collapse the frame.\n setError(null);\n if (iframe) hideFrame(iframe);\n return undefined;\n }\n let canceled = false;\n const succeed = (height: number | undefined): void => {\n if (canceled) return;\n setError(null);\n const f = frameOf(hostRef.current);\n if (f) showFrame(f, height, themeRef.current);\n };\n const fail = (err: unknown): void => {\n if (canceled) return;\n setError(errorText(err));\n const f = frameOf(hostRef.current);\n if (f) hideFrame(f);\n };\n const timer = setTimeout(() => {\n void (async () => {\n try {\n if (kind === 'mdx') {\n let js: string;\n try {\n js = await resolveTransform(transform)(code);\n } catch (err) {\n fail(err);\n return;\n }\n const result = await controller.evaluate(js, { components });\n if (result.error) fail(result.error);\n else succeed(result.height);\n } else {\n const result = await controller.renderMermaid(code);\n if (result.error) fail(result.error);\n else succeed(result.height);\n }\n } catch (err) {\n // Defence in depth: no failure path may bubble out of the island.\n fail(err);\n }\n })();\n }, DEBOUNCE_MS);\n return () => {\n canceled = true;\n clearTimeout(timer);\n };\n }, [controller, kind, code, transform, components]);\n\n // --- live theme restyle of an already-visible frame -----------------------\n React.useEffect(() => {\n const iframe = frameOf(hostRef.current);\n if (iframe && iframe.style.visibility === 'visible') iframe.style.colorScheme = theme;\n }, [theme]);\n\n // \"No transform configured\" → the safe escaped-source fallback (React escapes\n // the text child), matching the renderer's default `mdxFlow` output.\n if (kind === 'mdx' && transform === undefined) {\n return <pre className=\"tw-island-src\">{code}</pre>;\n }\n\n const title = kind === 'mdx' ? 'Component failed' : 'Diagram failed';\n return (\n <div className={`tw-island tw-island-${kind}${error !== null ? ' tw-island-failed' : ''}`} data-tw-island={kind}>\n <div className=\"tw-island-frame\" ref={hostRef} aria-hidden={error !== null} />\n {error !== null && (\n <div className=\"tw-island-error\" role=\"alert\">\n <div className=\"tw-island-error-title\">\n <span aria-hidden=\"true\">⚠</span> {title}\n </div>\n <pre className=\"tw-island-error-msg\">{error}</pre>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Memoized so an island only re-compiles/re-renders when its own `code`/config\n * changes — a keystroke in a *different* block leaves every island untouched.\n */\nexport const SandboxIsland = React.memo(SandboxIslandBase);\n\n/* ------------------------------------------------------------------ *\n * Styles (injected into the editor's single stylesheet)\n * ------------------------------------------------------------------ */\n\nexport const SANDBOX_ISLAND_CSS = `\n.tw-island{position:relative;margin:.6em 0;width:100%}\n.tw-island-frame{display:block;width:100%}\n.tw-island-frame iframe{display:block;border:0;width:100%;background:transparent;color-scheme:inherit}\n.tw-island-src{white-space:pre-wrap}\n.tw-island-error{border:1px solid color-mix(in srgb, #e5484d 42%, var(--tw-line));border-left:3px solid #e5484d;border-radius:9px;background:color-mix(in srgb, #e5484d 8%, var(--tw-bg));padding:9px 12px;margin:.2em 0}\n.tw-island-error-title{display:flex;align-items:center;gap:6px;font-size:12.5px;font-weight:640;color:#e5484d}\n.tw-island-error-msg{margin:5px 0 0;padding:0;border:0;background:none;font-family:\"SF Mono\",ui-monospace,Menlo,monospace;font-size:11.5px;line-height:1.5;color:var(--tw-muted);white-space:pre-wrap;overflow-wrap:anywhere}\n`;\n","import * as React from 'react';\nimport type { EditorMode } from '../types';\n\n/**\n * Settings surface — the live-toggle settings panel + a ⌘K command palette\n * (Phase B3, plan-TW-0002). Both are controlled, self-contained overlays: the\n * host owns visibility (`open`) and wires ⌘K; this module only renders. Styling\n * comes from {@link SETTINGS_CSS}, injected into the editor's single stylesheet,\n * using the shared `--tw-*` design tokens so light/dark + reduced-motion match\n * the rest of the editor.\n *\n * Nothing here mutates global state: `SettingsPanel` emits `onChange(patch)` and\n * the caller applies it (extensions are merged shallowly by the caller);\n * `CommandPalette` runs the selected command and closes.\n */\n\n/* ------------------------------------------------------------------ *\n * Settings panel\n * ------------------------------------------------------------------ */\n\n/** Live, session-only editor settings surfaced in {@link SettingsPanel}. */\nexport interface SettingsState {\n mode: EditorMode;\n toolbar: boolean | 'docked' | 'floating';\n folding: boolean;\n theme: 'light' | 'dark' | 'auto';\n extensions: { gfm?: boolean; mdx?: boolean; mermaid?: boolean; math?: boolean; syntaxHighlight?: boolean };\n}\n\nconst MODE_OPTIONS: { value: EditorMode; label: string }[] = [\n { value: 'edit', label: 'Edit' },\n { value: 'unified', label: 'Unified' },\n { value: 'preview', label: 'Preview' },\n { value: 'read', label: 'Read' },\n];\n\nconst TOOLBAR_OPTIONS: { value: 'off' | 'docked' | 'floating'; label: string }[] = [\n { value: 'off', label: 'Off' },\n { value: 'docked', label: 'Docked' },\n { value: 'floating', label: 'Floating' },\n];\n\nconst THEME_OPTIONS: { value: 'light' | 'dark' | 'auto'; label: string }[] = [\n { value: 'light', label: 'Light' },\n { value: 'dark', label: 'Dark' },\n { value: 'auto', label: 'Auto' },\n];\n\nconst EXTENSION_OPTIONS: { key: keyof SettingsState['extensions']; label: string; kbd: string }[] = [\n { key: 'gfm', label: 'GitHub Flavored MD', kbd: 'gfm' },\n { key: 'mdx', label: 'MDX v3', kbd: 'mdx' },\n { key: 'mermaid', label: 'Mermaid', kbd: 'mermaid' },\n { key: 'math', label: 'Math (KaTeX)', kbd: 'math' },\n { key: 'syntaxHighlight', label: 'Syntax highlight', kbd: 'syntaxHl' },\n];\n\nfunction Segmented<T extends string>(props: {\n label: string;\n value: T;\n options: { value: T; label: string }[];\n onSelect: (value: T) => void;\n}): React.JSX.Element {\n const { label, value, options, onSelect } = props;\n return (\n <div className=\"tw-seg\" role=\"group\" aria-label={label}>\n {options.map((o) => (\n <button\n key={o.value}\n type=\"button\"\n className=\"tw-seg-btn\"\n aria-pressed={o.value === value}\n onClick={() => onSelect(o.value)}\n >\n {o.label}\n </button>\n ))}\n </div>\n );\n}\n\nfunction ToggleRow(props: { label: string; kbd?: string; checked: boolean; onToggle: () => void }): React.JSX.Element {\n const { label, kbd, checked, onToggle } = props;\n const id = React.useId();\n return (\n <div className=\"tw-set-toggle\">\n <span className=\"tw-set-toggle-label\" id={id}>\n {label}\n {kbd ? <span className=\"tw-set-toggle-kbd\">{kbd}</span> : null}\n </span>\n <button\n type=\"button\"\n className=\"tw-sw\"\n role=\"switch\"\n aria-checked={checked}\n aria-labelledby={id}\n onClick={onToggle}\n />\n </div>\n );\n}\n\n/** Move focus back inside `container` when Tab would leave it. */\nfunction trapTab(e: React.KeyboardEvent, container: HTMLElement | null): void {\n if (e.key !== 'Tab' || !container) return;\n const nodes = Array.from(\n container.querySelectorAll<HTMLElement>(\n 'button, [href], input, textarea, select, [tabindex]:not([tabindex=\"-1\"])',\n ),\n ).filter((n) => !(n as HTMLButtonElement).disabled && n.offsetParent !== null);\n if (nodes.length === 0) {\n e.preventDefault();\n return;\n }\n const first = nodes[0]!;\n const last = nodes[nodes.length - 1]!;\n const active = document.activeElement;\n if (e.shiftKey && active === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n}\n\nexport function SettingsPanel(props: {\n open: boolean;\n onClose: () => void;\n state: SettingsState;\n /** extensions merged shallowly by caller */\n onChange: (patch: Partial<SettingsState>) => void;\n}): React.JSX.Element | null {\n const { open, onClose, state, onChange } = props;\n const panelRef = React.useRef<HTMLDivElement>(null);\n\n // Focus the first control when the panel opens.\n React.useEffect(() => {\n if (!open) return;\n const el = panelRef.current;\n if (!el) return;\n const first = el.querySelector<HTMLElement>('button, input, [tabindex]');\n const raf = requestAnimationFrame(() => (first ?? el).focus());\n return () => cancelAnimationFrame(raf);\n }, [open]);\n\n if (!open) return null;\n\n const toolbarValue: 'off' | 'docked' | 'floating' =\n state.toolbar === false ? 'off' : state.toolbar === 'floating' ? 'floating' : 'docked';\n\n // Preview the chosen theme live on the panel itself.\n const themeClass = state.theme === 'dark' ? 'tw-theme-dark' : state.theme === 'light' ? 'tw-theme-light' : '';\n\n return (\n <div\n className={`tw-settings-overlay${themeClass ? ' ' + themeClass : ''}`}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <div\n className=\"tw-settings-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Editor settings\"\n tabIndex={-1}\n ref={panelRef}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n return;\n }\n trapTab(e, panelRef.current);\n }}\n >\n <div className=\"tw-settings-head\">\n <span className=\"tw-settings-title\">Settings</span>\n <button type=\"button\" className=\"tw-settings-close\" aria-label=\"Close settings\" onClick={onClose}>\n ×\n </button>\n </div>\n <div className=\"tw-settings-body\">\n <section className=\"tw-set-section\">\n <h4 className=\"tw-set-h4\">Mode</h4>\n <Segmented\n label=\"Editor mode\"\n value={state.mode}\n options={MODE_OPTIONS}\n onSelect={(mode) => onChange({ mode })}\n />\n </section>\n\n <section className=\"tw-set-section\">\n <h4 className=\"tw-set-h4\">Toolbar</h4>\n <Segmented\n label=\"Toolbar mode\"\n value={toolbarValue}\n options={TOOLBAR_OPTIONS}\n onSelect={(v) => onChange({ toolbar: v === 'off' ? false : v })}\n />\n </section>\n\n <section className=\"tw-set-section\">\n <h4 className=\"tw-set-h4\">Theme</h4>\n <Segmented\n label=\"Theme appearance\"\n value={state.theme}\n options={THEME_OPTIONS}\n onSelect={(theme) => onChange({ theme })}\n />\n </section>\n\n <section className=\"tw-set-section\">\n <h4 className=\"tw-set-h4\">Section folding</h4>\n <div className=\"tw-toggle-list\">\n <ToggleRow\n label=\"Fold headings\"\n checked={state.folding}\n onToggle={() => onChange({ folding: !state.folding })}\n />\n </div>\n </section>\n\n <section className=\"tw-set-section\">\n <h4 className=\"tw-set-h4\">Extensions</h4>\n <div className=\"tw-toggle-list\">\n {EXTENSION_OPTIONS.map((ext) => (\n <ToggleRow\n key={ext.key}\n label={ext.label}\n kbd={ext.kbd}\n checked={!!state.extensions[ext.key]}\n onToggle={() =>\n onChange({\n extensions: { [ext.key]: !state.extensions[ext.key] } as SettingsState['extensions'],\n })\n }\n />\n ))}\n </div>\n </section>\n </div>\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ *\n * Command palette (⌘K)\n * ------------------------------------------------------------------ */\n\n/** A single command surfaced in {@link CommandPalette}. */\nexport interface PaletteCommand {\n id: string;\n label: string;\n kbd?: string;\n group?: string;\n run: () => void;\n}\n\n/**\n * Subsequence fuzzy score: `null` when `query` is not a subsequence of `text`,\n * otherwise higher is a better match (rewards consecutive + word-boundary hits,\n * mildly penalizes longer targets). Both args are compared case-insensitively.\n */\nfunction fuzzyScore(query: string, text: string): number | null {\n const q = query.toLowerCase();\n const t = text.toLowerCase();\n let qi = 0;\n let run = 0;\n let score = 0;\n for (let ti = 0; ti < t.length && qi < q.length; ti++) {\n if (t[ti] === q[qi]) {\n run++;\n score += run * 2;\n const prev = t[ti - 1];\n if (ti === 0 || prev === ' ' || prev === '-' || prev === '/') score += 6;\n qi++;\n } else {\n run = 0;\n }\n }\n if (qi < q.length) return null;\n return score - t.length * 0.1;\n}\n\nexport function CommandPalette(props: {\n open: boolean;\n onClose: () => void;\n commands: PaletteCommand[];\n}): React.JSX.Element | null {\n const { open, onClose, commands } = props;\n const [query, setQuery] = React.useState('');\n const [highlight, setHighlight] = React.useState(0);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const dialogRef = React.useRef<HTMLDivElement>(null);\n const activeItemRef = React.useRef<HTMLLIElement>(null);\n\n const { groups, flat } = React.useMemo(() => {\n const q = query.trim();\n const order: string[] = [];\n const byGroup = new Map<string, { cmd: PaletteCommand; score: number }[]>();\n for (const cmd of commands) {\n const score = q ? fuzzyScore(q, cmd.label) : 0;\n if (score === null) continue;\n const g = cmd.group ?? '';\n let bucket = byGroup.get(g);\n if (!bucket) {\n bucket = [];\n byGroup.set(g, bucket);\n order.push(g);\n }\n bucket.push({ cmd, score });\n }\n let idx = 0;\n const grouped = order.map((name) => {\n const bucket = byGroup.get(name)!;\n if (q) bucket.sort((a, b) => b.score - a.score);\n return { name, items: bucket.map(({ cmd }) => ({ cmd, flatIndex: idx++ })) };\n });\n const flatList: PaletteCommand[] = [];\n for (const gr of grouped) for (const it of gr.items) flatList.push(it.cmd);\n return { groups: grouped, flat: flatList };\n }, [commands, query]);\n\n // Reset + focus the input each time the palette opens.\n React.useEffect(() => {\n if (!open) return;\n setQuery('');\n setHighlight(0);\n const raf = requestAnimationFrame(() => inputRef.current?.focus());\n return () => cancelAnimationFrame(raf);\n }, [open]);\n\n // Keep the highlight in range as the filtered list changes.\n React.useEffect(() => {\n setHighlight((h) => (flat.length === 0 ? 0 : Math.min(h, flat.length - 1)));\n }, [flat.length]);\n\n // Scroll the highlighted option into view.\n React.useEffect(() => {\n activeItemRef.current?.scrollIntoView({ block: 'nearest' });\n }, [highlight]);\n\n if (!open) return null;\n\n const runAt = (i: number): void => {\n const cmd = flat[i];\n if (!cmd) return;\n cmd.run();\n onClose();\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>): void => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setHighlight((h) => (flat.length === 0 ? 0 : (h + 1) % flat.length));\n break;\n case 'ArrowUp':\n e.preventDefault();\n setHighlight((h) => (flat.length === 0 ? 0 : (h - 1 + flat.length) % flat.length));\n break;\n case 'Home':\n e.preventDefault();\n setHighlight(0);\n break;\n case 'End':\n e.preventDefault();\n setHighlight(flat.length === 0 ? 0 : flat.length - 1);\n break;\n case 'Enter':\n e.preventDefault();\n runAt(highlight);\n break;\n case 'Escape':\n e.preventDefault();\n onClose();\n break;\n case 'Tab':\n // Only the input is tabbable; keep focus trapped on it.\n trapTab(e, dialogRef.current);\n break;\n default:\n break;\n }\n };\n\n const activeId = flat[highlight] ? `tw-pcmd-${highlight}` : undefined;\n\n return (\n <div\n className=\"tw-palette-overlay\"\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <div\n className=\"tw-palette\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Command palette\"\n ref={dialogRef}\n onKeyDown={onKeyDown}\n >\n <div className=\"tw-palette-input-wrap\">\n <svg\n className=\"tw-palette-search\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.9\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"m20 20-3.5-3.5\" />\n </svg>\n <input\n ref={inputRef}\n className=\"tw-palette-input\"\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls=\"tw-palette-list\"\n aria-activedescendant={activeId}\n aria-autocomplete=\"list\"\n placeholder=\"Type a command…\"\n spellCheck={false}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n <kbd className=\"tw-palette-esc\">esc</kbd>\n </div>\n <ul className=\"tw-palette-list\" id=\"tw-palette-list\" role=\"listbox\" aria-label=\"Commands\">\n {groups.map((group) => (\n <React.Fragment key={group.name || '_'}>\n {group.name ? (\n <li className=\"tw-palette-group\" role=\"presentation\">\n {group.name}\n </li>\n ) : null}\n {group.items.map((it) => (\n <li\n key={it.cmd.id}\n id={`tw-pcmd-${it.flatIndex}`}\n role=\"option\"\n aria-selected={it.flatIndex === highlight}\n className={`tw-palette-item${it.flatIndex === highlight ? ' tw-active' : ''}`}\n ref={it.flatIndex === highlight ? activeItemRef : undefined}\n onMouseMove={() => setHighlight(it.flatIndex)}\n onMouseDown={(e) => {\n e.preventDefault();\n runAt(it.flatIndex);\n }}\n >\n <span className=\"tw-palette-label\">{it.cmd.label}</span>\n {it.cmd.kbd ? <kbd className=\"tw-palette-kbd\">{it.cmd.kbd}</kbd> : null}\n </li>\n ))}\n </React.Fragment>\n ))}\n {flat.length === 0 ? (\n <li className=\"tw-palette-empty\" role=\"presentation\">\n No matching commands\n </li>\n ) : null}\n </ul>\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ *\n * Styles (injected into the editor's single stylesheet)\n * ------------------------------------------------------------------ */\n\nconst LIGHT_TOKENS =\n '--tw-fg:#1a1d20;--tw-muted:#5a6169;--tw-faint:#8b929a;--tw-bg:#ffffff;--tw-chip:#f0f1f3;--tw-line:rgba(18,22,27,.1);--tw-accent:#2f6fed;--tw-accent-soft:rgba(47,111,237,.1);--tw-code-bg:#f6f7f9;';\nconst DARK_TOKENS =\n '--tw-fg:#e8eaed;--tw-muted:#a3abb2;--tw-faint:#6a727a;--tw-bg:#0f1215;--tw-chip:#1e242b;--tw-line:rgba(255,255,255,.1);--tw-accent:#6ea3ff;--tw-accent-soft:rgba(110,163,255,.14);--tw-code-bg:#13171b;';\n\nexport const SETTINGS_CSS = `\n.tw-settings-overlay,.tw-palette-overlay{${LIGHT_TOKENS}position:fixed;inset:0;z-index:1000;display:flex;font-family:-apple-system,\"SF Pro Text\",system-ui,sans-serif;color:var(--tw-fg);line-height:1.5;font-size:15px}\n@media (prefers-color-scheme: dark){.tw-settings-overlay:not(.tw-theme-light),.tw-palette-overlay:not(.tw-theme-light){${DARK_TOKENS}}}\n.tw-settings-overlay.tw-theme-dark,.tw-palette-overlay.tw-theme-dark{${DARK_TOKENS}}\n:root[data-theme=\"dark\"] .tw-settings-overlay:not(.tw-theme-light),:root[data-theme=\"dark\"] .tw-palette-overlay:not(.tw-theme-light){${DARK_TOKENS}}\n.tw-settings-overlay.tw-theme-light,.tw-palette-overlay.tw-theme-light,:root[data-theme=\"light\"] .tw-settings-overlay,:root[data-theme=\"light\"] .tw-palette-overlay{${LIGHT_TOKENS}}\n\n.tw-settings-overlay{justify-content:flex-end;background:color-mix(in srgb,#0b0d0f 30%,transparent);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);animation:tw-set-fade .18s ease}\n.tw-palette-overlay{align-items:flex-start;justify-content:center;padding:14vh 16px 16px;background:color-mix(in srgb,#0b0d0f 34%,transparent);backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);animation:tw-set-fade .16s ease}\n\n.tw-settings-panel{width:340px;max-width:92vw;height:100%;box-sizing:border-box;background:var(--tw-bg);border-left:1px solid var(--tw-line);box-shadow:-18px 0 48px -20px rgba(0,0,0,.5);display:flex;flex-direction:column;outline:none;animation:tw-set-slide .26s cubic-bezier(.32,.72,0,1)}\n.tw-settings-head{display:flex;align-items:center;gap:10px;padding:15px 16px;border-bottom:1px solid var(--tw-line)}\n.tw-settings-title{flex:1;font-size:15px;font-weight:640;letter-spacing:-.01em}\n.tw-settings-close{width:28px;height:28px;flex:none;border:1px solid var(--tw-line);background:var(--tw-chip);border-radius:8px;color:var(--tw-muted);font-size:18px;line-height:1;cursor:pointer;display:grid;place-items:center;transition:color .15s,border-color .15s}\n.tw-settings-close:hover{color:var(--tw-fg);border-color:var(--tw-accent)}\n.tw-settings-close:focus-visible{outline:2px solid var(--tw-accent);outline-offset:2px}\n.tw-settings-body{flex:1;overflow:auto;padding:16px;display:flex;flex-direction:column;gap:18px}\n.tw-set-section{display:flex;flex-direction:column;gap:8px}\n.tw-set-h4{margin:0;font-size:11px;letter-spacing:.07em;text-transform:uppercase;color:var(--tw-faint);font-weight:600}\n.tw-toggle-list{display:flex;flex-direction:column;gap:1px}\n\n.tw-seg{display:flex;width:100%;background:color-mix(in srgb,var(--tw-chip) 60%,transparent);border:1px solid var(--tw-line);border-radius:10px;padding:3px;gap:2px}\n.tw-seg-btn{flex:1;border:0;background:transparent;color:var(--tw-muted);font-size:12.5px;font-weight:540;padding:6px 12px;border-radius:7px;cursor:pointer;white-space:nowrap;transition:color .18s,background .18s}\n.tw-seg-btn[aria-pressed=\"true\"]{color:var(--tw-fg);background:var(--tw-bg);box-shadow:0 1px 2px rgba(0,0,0,.18)}\n.tw-seg-btn:hover:not([aria-pressed=\"true\"]){color:var(--tw-fg)}\n.tw-seg-btn:focus-visible{outline:2px solid var(--tw-accent);outline-offset:1px}\n\n.tw-set-toggle{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:7px 8px;border-radius:8px;transition:background .15s}\n.tw-set-toggle:hover{background:var(--tw-chip)}\n.tw-set-toggle-label{display:flex;align-items:center;gap:9px;font-size:13.5px}\n.tw-set-toggle-kbd{font-family:\"SF Mono\",ui-monospace,Menlo,monospace;font-size:11px;color:var(--tw-faint)}\n.tw-sw{width:38px;height:22px;flex:none;padding:0;border-radius:999px;background:var(--tw-chip);border:1px solid var(--tw-line);position:relative;cursor:pointer;transition:background .2s}\n.tw-sw::after{content:\"\";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4);transition:transform .2s cubic-bezier(.32,.72,0,1)}\n.tw-sw[aria-checked=\"true\"]{background:var(--tw-accent)}\n.tw-sw[aria-checked=\"true\"]::after{transform:translateX(16px)}\n.tw-sw:focus-visible{outline:2px solid var(--tw-accent);outline-offset:2px}\n\n.tw-palette{width:560px;max-width:100%;max-height:60vh;box-sizing:border-box;background:var(--tw-bg);border:1px solid var(--tw-line);border-radius:14px;box-shadow:0 24px 64px -18px rgba(0,0,0,.55);display:flex;flex-direction:column;overflow:hidden;animation:tw-pal-in .2s cubic-bezier(.32,.72,0,1)}\n.tw-palette-input-wrap{display:flex;align-items:center;gap:10px;padding:13px 15px;border-bottom:1px solid var(--tw-line)}\n.tw-palette-search{width:17px;height:17px;flex:none;color:var(--tw-faint)}\n.tw-palette-input{flex:1;min-width:0;border:0;background:transparent;outline:none;color:var(--tw-fg);font-size:15px;font-family:inherit}\n.tw-palette-input::placeholder{color:var(--tw-faint)}\n.tw-palette-esc{flex:none;font-family:\"SF Mono\",ui-monospace,Menlo,monospace;font-size:11px;color:var(--tw-faint);border:1px solid var(--tw-line);border-radius:5px;padding:2px 6px}\n.tw-palette-list{list-style:none;margin:0;padding:6px;overflow:auto;flex:1}\n.tw-palette-group{padding:8px 10px 4px;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--tw-faint);font-weight:600}\n.tw-palette-item{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:8px;cursor:pointer;color:var(--tw-fg)}\n.tw-palette-item.tw-active{background:var(--tw-accent-soft)}\n.tw-palette-label{flex:1;min-width:0;font-size:13.5px}\n.tw-palette-kbd{flex:none;font-family:\"SF Mono\",ui-monospace,Menlo,monospace;font-size:11px;color:var(--tw-muted);background:var(--tw-chip);border:1px solid var(--tw-line);border-radius:5px;padding:2px 6px}\n.tw-palette-item.tw-active .tw-palette-kbd{color:var(--tw-accent)}\n.tw-palette-empty{padding:22px;text-align:center;color:var(--tw-faint);font-size:13px}\n\n@keyframes tw-set-fade{from{opacity:0}to{opacity:1}}\n@keyframes tw-set-slide{from{transform:translateX(18px);opacity:.4}to{transform:none;opacity:1}}\n@keyframes tw-pal-in{from{transform:translateY(-8px) scale(.98);opacity:0}to{transform:none;opacity:1}}\n@media (prefers-reduced-motion: reduce){.tw-settings-overlay,.tw-palette-overlay,.tw-settings-panel,.tw-palette,.tw-sw::after{animation:none !important;transition:none !important}}\n@media (prefers-reduced-transparency: reduce){.tw-settings-overlay{backdrop-filter:none;-webkit-backdrop-filter:none;background:color-mix(in srgb,#0b0d0f 60%,transparent)}.tw-palette-overlay{backdrop-filter:none;-webkit-backdrop-filter:none;background:color-mix(in srgb,#0b0d0f 64%,transparent)}}\n`;\n","import * as React from 'react';\nimport { renderInline } from '../core/render';\nimport {\n addColumn,\n addRow,\n cellSourceRange,\n removeColumn,\n removeRow,\n setAlignment,\n} from '../core/table';\nimport type { TableEdit } from '../core/table';\nimport type { CellAlign, Table, TableCell } from '../core/ast';\n\n/**\n * TableGrid — in-place editable grid for a single GFM table (Phase F2).\n *\n * The Markdown SOURCE stays canonical: this component never holds its own copy\n * of the table's text. Two edit shapes, mirroring `core/table.ts`:\n *\n * - **Single-cell** edits are SCOPED. A cell is `contentEditable`; while idle it\n * shows its rendered inline HTML (via {@link renderInline}), and on focus it\n * swaps to the cell's *raw* Markdown source so an edit round-trips losslessly.\n * Committing (blur / Enter / navigation) reads {@link cellSourceRange} and\n * emits an `onChange` that replaces ONLY that cell's source slice — the C-8\n * invariant: exactly one cell's source changes.\n * - **Structural** ops (add/remove row/column, set alignment) run the matching\n * `core/table.ts` helper, which returns the FULL new document text, and emit a\n * single splice over `[table.from, table.to]` carrying just the re-serialized\n * block (so the document outside the table is byte-for-byte untouched).\n *\n * Structural ops are DEFERRED one render: the toolbar button does not steal focus\n * with `preventDefault`, so clicking it first blurs+commits any in-flight cell\n * edit; the op then runs against the freshly-reparsed `table` prop. This keeps a\n * pending keystroke from being clobbered by a whole-block re-serialization.\n */\nexport interface TableGridProps {\n /** The parsed table whose offsets index into {@link source}. */\n table: Table;\n /** Full document source (the single source of truth). */\n source: string;\n /** Emit a scoped splice: `source[from..to]` becomes `insert`. */\n onChange: (change: { from: number; to: number; insert: string }) => void;\n /** The caret left the grid past an edge (Tab/arrow beyond the outermost cell). */\n onExit?: (dir?: 'up' | 'down') => void;\n readOnly?: boolean;\n}\n\n/** Grid coordinate: row `0` is the header, rows `1..N` are body rows; `col` is 0-based. */\ninterface Coord {\n row: number;\n col: number;\n}\n\n/** A structural edit queued for the next render (after any cell commit lands). */\ntype PendingOp =\n | { kind: 'add-row' | 'add-col' | 'del-row' | 'del-col'; row: number; col: number }\n | { kind: 'align'; row: number; col: number; align: CellAlign };\n\nconst cellKey = (row: number, col: number): string => `${row}:${col}`;\n\n/* ------------------------------------------------------------------ *\n * Caret / selection helpers (raw DOM, client-only)\n * ------------------------------------------------------------------ */\n\n/** Place the caret at the end of a `contentEditable` element's content. */\nfunction caretToEnd(el: HTMLElement): void {\n const sel = typeof window !== 'undefined' ? window.getSelection() : null;\n if (!sel) return;\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n sel.removeAllRanges();\n sel.addRange(range);\n}\n\n/** Whether the collapsed caret sits at the very start / very end of `el`'s text. */\nfunction caretAtEdge(el: HTMLElement): { start: boolean; end: boolean } {\n const sel = typeof window !== 'undefined' ? window.getSelection() : null;\n if (!sel || sel.rangeCount === 0) return { start: true, end: true };\n const range = sel.getRangeAt(0);\n if (!el.contains(range.startContainer)) return { start: false, end: false };\n const pre = document.createRange();\n pre.selectNodeContents(el);\n pre.setEnd(range.startContainer, range.startOffset);\n const before = pre.toString().length;\n const total = el.textContent?.length ?? 0;\n return { start: range.collapsed && before === 0, end: range.collapsed && before === total };\n}\n\n/* ------------------------------------------------------------------ *\n * Icons (inherit currentColor, match the demo's stroke conventions)\n * ------------------------------------------------------------------ */\n\nfunction Svg({ children }: { children: React.ReactNode }): React.ReactElement {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n {children}\n </svg>\n );\n}\n\nconst ICON = {\n addRow: (\n <Svg>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"7\" rx=\"1.5\" />\n <path d=\"M12 15v6M9 18h6\" />\n </Svg>\n ),\n addCol: (\n <Svg>\n <rect x=\"4\" y=\"3\" width=\"7\" height=\"18\" rx=\"1.5\" />\n <path d=\"M15 12h6M18 9v6\" />\n </Svg>\n ),\n delRow: (\n <Svg>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"7\" rx=\"1.5\" />\n <path d=\"M9 18h6\" />\n </Svg>\n ),\n delCol: (\n <Svg>\n <rect x=\"4\" y=\"3\" width=\"7\" height=\"18\" rx=\"1.5\" />\n <path d=\"M15 12h6\" />\n </Svg>\n ),\n alignL: (\n <Svg>\n <path d=\"M4 6h16M4 12h10M4 18h13\" />\n </Svg>\n ),\n alignC: (\n <Svg>\n <path d=\"M4 6h16M7 12h10M6 18h12\" />\n </Svg>\n ),\n alignR: (\n <Svg>\n <path d=\"M4 6h16M10 12h10M7 18h13\" />\n </Svg>\n ),\n};\n\n/* ------------------------------------------------------------------ *\n * Component\n * ------------------------------------------------------------------ */\n\nexport function TableGrid(props: TableGridProps): React.ReactElement {\n const { table, source, onChange, onExit, readOnly = false } = props;\n\n const ncols = Math.max(1, table.header.length);\n const lastRow = table.rows.length; // grid index of the last body row (0 == header-only)\n\n const wrapRef = React.useRef<HTMLDivElement>(null);\n const cellRefs = React.useRef<Map<string, HTMLTableCellElement>>(new Map());\n const [selected, setSelected] = React.useState<Coord | null>(null);\n const [pendingFocus, setPendingFocus] = React.useState<Coord | null>(null);\n const [pendingOp, setPendingOp] = React.useState<PendingOp | null>(null);\n\n const getCell = React.useCallback(\n (row: number, col: number): TableCell | undefined =>\n row === 0 ? table.header[col] : table.rows[row - 1]?.[col],\n [table],\n );\n\n /* --- keep every idle cell showing its rendered inline HTML --- */\n React.useLayoutEffect(() => {\n const paint = (row: number, col: number, cell: TableCell | undefined): void => {\n const el = cellRefs.current.get(cellKey(row, col));\n if (!el || el === document.activeElement) return; // never clobber the cell being edited\n el.innerHTML = cell ? renderInline(cell.children) : '';\n };\n for (let c = 0; c < ncols; c++) paint(0, c, table.header[c]);\n table.rows.forEach((row, ri) => {\n for (let c = 0; c < ncols; c++) paint(ri + 1, c, row[c]);\n });\n }, [table, source, ncols, readOnly]);\n\n /* --- deferred structural op: runs against the freshest table/source --- */\n React.useEffect(() => {\n if (!pendingOp || readOnly) {\n if (pendingOp) setPendingOp(null);\n return;\n }\n const op = pendingOp;\n setPendingOp(null);\n let result: TableEdit;\n switch (op.kind) {\n case 'add-row':\n result = addRow(source, table, op.row + 1);\n break;\n case 'add-col':\n result = addColumn(source, table, op.col + 1);\n break;\n case 'del-row':\n result = removeRow(source, table, op.row);\n break;\n case 'del-col':\n result = removeColumn(source, table, op.col);\n break;\n case 'align':\n result = setAlignment(source, table, op.col, op.align);\n break;\n default:\n return;\n }\n // The helper returns the FULL new document; the prefix before `table.from`\n // and the suffix after `table.to` are unchanged, so the new block is the\n // slice between them. Emit a splice scoped to the table block only.\n const insert = result.text.slice(table.from, result.text.length - source.length + table.to);\n const oldBlock = source.slice(table.from, table.to);\n if (insert !== oldBlock) {\n onChange({ from: table.from, to: table.to, insert });\n }\n }, [pendingOp, table, source, onChange, readOnly]);\n\n /* --- move focus to a cell by coordinate after a render (nav / structural) --- */\n React.useEffect(() => {\n if (!pendingFocus) return;\n const el = cellRefs.current.get(cellKey(pendingFocus.row, pendingFocus.col));\n setPendingFocus(null);\n if (el) el.focus();\n }, [pendingFocus, table]);\n\n /* --- single-cell commit (C-8: exactly one cell's source slice changes) --- */\n const commitCell = React.useCallback(\n (row: number, col: number): void => {\n const el = cellRefs.current.get(cellKey(row, col));\n const cell = getCell(row, col);\n const range = cellSourceRange(table, row, col);\n if (!el || !cell || !range) return;\n const oldText = source.slice(range.from, range.to);\n const next = (el.textContent ?? '').replace(/\\r?\\n/g, ' ');\n if (next !== oldText) {\n onChange({ from: range.from, to: range.to, insert: next });\n } else {\n // No source change ⇒ the layout effect won't repaint; revert this cell\n // from its raw-source editing view back to rendered inline HTML.\n el.innerHTML = renderInline(cell.children);\n }\n },\n [table, source, onChange, getCell],\n );\n\n const onCellFocus = React.useCallback(\n (row: number, col: number): void => {\n if (readOnly) return;\n const cell = getCell(row, col);\n const el = cellRefs.current.get(cellKey(row, col));\n setSelected({ row, col });\n if (el && cell) {\n const raw = source.slice(cell.from, cell.to);\n if (el.textContent !== raw) el.textContent = raw; // swap rendered → raw source\n caretToEnd(el);\n }\n },\n [readOnly, getCell, source],\n );\n\n /* --- navigation targets --- */\n const nextCell = React.useCallback(\n (row: number, col: number): Coord | null => {\n if (col < ncols - 1) return { row, col: col + 1 };\n if (row < lastRow) return { row: row + 1, col: 0 };\n return null;\n },\n [ncols, lastRow],\n );\n const prevCell = React.useCallback(\n (row: number, col: number): Coord | null => {\n if (col > 0) return { row, col: col - 1 };\n if (row > 0) return { row: row - 1, col: ncols - 1 };\n return null;\n },\n [ncols],\n );\n\n const exitPastEdge = React.useCallback(\n (row: number, col: number, dir: 'up' | 'down'): void => {\n cellRefs.current.get(cellKey(row, col))?.blur(); // blur commits the cell\n onExit?.(dir);\n },\n [onExit],\n );\n\n const onCellKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLTableCellElement>, row: number, col: number): void => {\n if (readOnly) return;\n const el = e.currentTarget;\n switch (e.key) {\n case 'Enter': {\n if (e.shiftKey) return;\n e.preventDefault();\n if (row < lastRow) setPendingFocus({ row: row + 1, col });\n else exitPastEdge(row, col, 'down');\n return;\n }\n case 'Tab': {\n e.preventDefault();\n const target = e.shiftKey ? prevCell(row, col) : nextCell(row, col);\n if (target) setPendingFocus(target);\n else exitPastEdge(row, col, e.shiftKey ? 'up' : 'down');\n return;\n }\n case 'ArrowUp': {\n e.preventDefault();\n if (row > 0) setPendingFocus({ row: row - 1, col });\n else exitPastEdge(row, col, 'up');\n return;\n }\n case 'ArrowDown': {\n e.preventDefault();\n if (row < lastRow) setPendingFocus({ row: row + 1, col });\n else exitPastEdge(row, col, 'down');\n return;\n }\n case 'ArrowLeft': {\n if (!caretAtEdge(el).start) return; // let the caret move within the cell\n e.preventDefault();\n const target = prevCell(row, col);\n if (target) setPendingFocus(target);\n else exitPastEdge(row, col, 'up');\n return;\n }\n case 'ArrowRight': {\n if (!caretAtEdge(el).end) return;\n e.preventDefault();\n const target = nextCell(row, col);\n if (target) setPendingFocus(target);\n else exitPastEdge(row, col, 'down');\n return;\n }\n default:\n return;\n }\n },\n [readOnly, lastRow, nextCell, prevCell, exitPastEdge],\n );\n\n /* --- selection lifecycle --- */\n const onWrapBlur = React.useCallback(\n (e: React.FocusEvent<HTMLDivElement>): void => {\n const next = e.relatedTarget as Node | null;\n if (next && wrapRef.current?.contains(next)) return; // focus stayed inside the grid\n setSelected(null);\n },\n [],\n );\n\n // Clamp the selection to the live grid so a deleted row/column can't dangle.\n const sel: Coord | null = selected\n ? { row: Math.min(selected.row, lastRow), col: Math.min(selected.col, ncols - 1) }\n : null;\n\n const colAlign = (col: number): CellAlign => table.align[col] ?? null;\n\n // Shared attribute set for a header/body cell (a `<th>`/`<td>` share the same\n // props — only their element type differs).\n const cellProps = (\n row: number,\n col: number,\n ): React.HTMLAttributes<HTMLTableCellElement> & React.RefAttributes<HTMLTableCellElement> => {\n const align = colAlign(col);\n const isSel = sel !== null && sel.row === row && sel.col === col;\n const p: React.HTMLAttributes<HTMLTableCellElement> & React.RefAttributes<HTMLTableCellElement> = {\n ref: (el: HTMLTableCellElement | null) => {\n if (el) cellRefs.current.set(cellKey(row, col), el);\n else cellRefs.current.delete(cellKey(row, col));\n },\n className: `tw-tg-cell${isSel ? ' tw-tg-sel' : ''}`,\n role: readOnly ? undefined : 'gridcell',\n style: align ? { textAlign: align } : undefined,\n contentEditable: readOnly ? undefined : true,\n suppressContentEditableWarning: true,\n spellCheck: false,\n };\n if (!readOnly) {\n p.onFocus = () => onCellFocus(row, col);\n p.onBlur = () => commitCell(row, col);\n p.onKeyDown = (e: React.KeyboardEvent<HTMLTableCellElement>) => onCellKeyDown(e, row, col);\n }\n return p;\n };\n\n const runOp = (op: PendingOp): void => {\n if (readOnly) return;\n setPendingOp(op);\n };\n\n const showToolbar = !readOnly && sel !== null;\n const toolbar = showToolbar ? (\n <div className=\"tw-tg-toolbar\" role=\"toolbar\" aria-label=\"Table\">\n <button\n type=\"button\"\n className=\"tw-tg-btn\"\n title=\"Add row\"\n aria-label=\"Add row\"\n onClick={() => runOp({ kind: 'add-row', row: sel.row, col: sel.col })}\n >\n {ICON.addRow}\n </button>\n <button\n type=\"button\"\n className=\"tw-tg-btn\"\n title=\"Add column\"\n aria-label=\"Add column\"\n onClick={() => runOp({ kind: 'add-col', row: sel.row, col: sel.col })}\n >\n {ICON.addCol}\n </button>\n <button\n type=\"button\"\n className=\"tw-tg-btn\"\n title=\"Delete row\"\n aria-label=\"Delete row\"\n disabled={sel.row === 0 || lastRow === 0}\n onClick={() => runOp({ kind: 'del-row', row: sel.row, col: sel.col })}\n >\n {ICON.delRow}\n </button>\n <button\n type=\"button\"\n className=\"tw-tg-btn\"\n title=\"Delete column\"\n aria-label=\"Delete column\"\n disabled={ncols <= 1}\n onClick={() => runOp({ kind: 'del-col', row: sel.row, col: sel.col })}\n >\n {ICON.delCol}\n </button>\n <span className=\"tw-tg-sep\" aria-hidden=\"true\" />\n <button\n type=\"button\"\n className=\"tw-tg-btn\"\n title=\"Align left\"\n aria-label=\"Align left\"\n aria-pressed={colAlign(sel.col) === 'left'}\n onClick={() => runOp({ kind: 'align', row: sel.row, col: sel.col, align: 'left' })}\n >\n {ICON.alignL}\n </button>\n <button\n type=\"button\"\n className=\"tw-tg-btn\"\n title=\"Align center\"\n aria-label=\"Align center\"\n aria-pressed={colAlign(sel.col) === 'center'}\n onClick={() => runOp({ kind: 'align', row: sel.row, col: sel.col, align: 'center' })}\n >\n {ICON.alignC}\n </button>\n <button\n type=\"button\"\n className=\"tw-tg-btn\"\n title=\"Align right\"\n aria-label=\"Align right\"\n aria-pressed={colAlign(sel.col) === 'right'}\n onClick={() => runOp({ kind: 'align', row: sel.row, col: sel.col, align: 'right' })}\n >\n {ICON.alignR}\n </button>\n </div>\n ) : null;\n\n const headerCols = Array.from({ length: ncols }, (_, c) => c);\n\n return (\n <div className=\"tw-table-grid\" ref={wrapRef} onBlur={readOnly ? undefined : onWrapBlur}>\n {toolbar}\n <div className=\"tw-table-grid-scroll\">\n <table className=\"tw-tg-table\">\n <thead>\n <tr>\n {headerCols.map((c) => (\n <th key={c} {...cellProps(0, c)} />\n ))}\n </tr>\n </thead>\n <tbody>\n {table.rows.map((_row, ri) => (\n <tr key={ri}>\n {headerCols.map((c) => (\n <td key={c} {...cellProps(ri + 1, c)} />\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ *\n * Styles (injected into the editor's single stylesheet)\n * ------------------------------------------------------------------ */\n\nexport const TABLEGRID_CSS = `\n.tw-table-grid{position:relative;margin:.6em 0;width:fit-content;max-width:100%}\n.tw-table-grid-scroll{overflow-x:auto;border:1px solid var(--tw-line);border-radius:10px}\n.tw-tg-table{border-collapse:collapse;font-size:14px}\n.tw-tg-table th,.tw-tg-table td{border:1px solid var(--tw-line);padding:8px 13px;text-align:left;vertical-align:top;min-width:52px}\n.tw-tg-table th{background:var(--tw-chip);font-weight:600;color:var(--tw-muted);font-size:12px;letter-spacing:.02em;text-transform:uppercase}\n.tw-tg-table td{color:var(--tw-fg)}\n.tw-tg-cell{outline:none}\n.tw-tg-cell:empty::after{content:\"\";display:inline-block;min-height:1.15em}\n.tw-tg-table th.tw-tg-sel,.tw-tg-table td.tw-tg-sel{box-shadow:inset 0 0 0 2px var(--tw-accent);background:var(--tw-accent-soft)}\n.tw-tg-toolbar{position:absolute;top:0;right:0;z-index:6;transform:translateY(calc(-100% - 7px));display:flex;align-items:center;gap:3px;padding:4px 5px;border:1px solid var(--tw-line);border-radius:11px;background:color-mix(in srgb, var(--tw-bg) 82%, transparent);backdrop-filter:blur(18px) saturate(1.6);-webkit-backdrop-filter:blur(18px) saturate(1.6);box-shadow:0 6px 20px -10px rgba(0,0,0,.4), inset 0 1px 0 rgba(255,255,255,.06);animation:tw-tg-pop .18s cubic-bezier(.32,.72,0,1)}\n@keyframes tw-tg-pop{from{opacity:0;transform:translateY(calc(-100% + 2px))}to{opacity:1;transform:translateY(calc(-100% - 7px))}}\n.tw-tg-sep{width:1px;height:18px;background:var(--tw-line);margin:0 3px}\n.tw-tg-btn{min-width:28px;height:28px;padding:0 6px;border:1px solid transparent;background:transparent;border-radius:7px;color:var(--tw-muted);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:color .15s,background .15s,border-color .15s}\n.tw-tg-btn:hover{color:var(--tw-fg);background:var(--tw-accent-soft)}\n.tw-tg-btn:disabled{opacity:.4;cursor:default}\n.tw-tg-btn:disabled:hover{color:var(--tw-muted);background:transparent}\n.tw-tg-btn[aria-pressed=\"true\"]{color:var(--tw-accent);background:var(--tw-accent-soft);border-color:var(--tw-line)}\n.tw-tg-btn svg{width:15px;height:15px}\n@media (prefers-reduced-transparency: reduce){.tw-tg-toolbar{background:var(--tw-bg);backdrop-filter:none;-webkit-backdrop-filter:none}}\n@media (prefers-reduced-motion: reduce){.tw-tg-toolbar{animation:none} .tw-tg-btn{transition:none}}\n`;\n","import * as React from 'react';\nimport { applyCommand, COMMANDS, highlightToHtml, mapAnchor, parse, parseIncremental, renderNode, renderToHtml } from '../core';\nimport type { Block, Command, Document, ParseOptions, RenderOptions } from '../core';\nimport type {\n CommentsOptions,\n CommentThread,\n ComponentMap,\n DocChange,\n EditorConfig,\n EditorEvents,\n EditorMode,\n Extensions,\n FoldingOptions,\n KeymapOptions,\n MathOptions,\n MdxOptions,\n MdxTransform,\n MermaidOptions,\n PresencePeer,\n SandboxOptions,\n SettingsOptions,\n} from '../types';\nimport { CaretRevealBlock, CARET_REVEAL_CSS } from './CaretRevealBlock';\nimport { CommentsSidebar, COMMENTS_CSS } from './CommentsSidebar';\nimport { FoldMenu, FOLDMENU_CSS } from './FoldMenu';\nimport { SandboxIsland, SANDBOX_ISLAND_CSS } from './SandboxIsland';\nimport { CommandPalette, SettingsPanel, SETTINGS_CSS } from './SettingsSurface';\nimport type { PaletteCommand, SettingsState } from './SettingsSurface';\nimport { TableGrid, TABLEGRID_CSS } from './TableGrid';\n\n/** Imperative handle exposed via a ref on `<TypewrightEditor>`. */\nexport interface TypewrightEditorHandle {\n /** Apply a formatting command to the currently-focused editing surface. */\n applyCommand: (command: Command) => void;\n /** Switch the editor mode; also fires `onModeChange`. */\n setMode: (mode: EditorMode) => void;\n}\n\n/** Registration of the currently-focused source textarea (for toolbar commands). */\ninterface ActiveSource {\n apply: (command: Command) => void;\n}\n\n/**\n * Typewright — drop-in Markdown + MDX editor React component.\n *\n * v1 engine (real, tested): the string is the source of truth; rendering goes\n * through the sanitizing renderer (render.ts escapes text, guards URLs, and\n * never emits raw HTML/MDX), so the `dangerouslySetInnerHTML` below is safe.\n *\n * Modes:\n * - `edit` raw Markdown source (textarea) with standard shortcuts\n * - `unified` live preview; click a block to reveal + edit its Markdown source\n * - `preview` fully rendered\n * - `read` fully rendered, no editing affordances\n *\n * Deferred to later phases (SPEC.md): character-level inline marker reveal,\n * custom virtualization/IME, MDX JSX sandbox execution, Mermaid, in-place table\n * grid, comments/collaboration. These are represented in the design demo.\n */\nexport interface TypewrightEditorProps extends EditorConfig, EditorEvents {\n /** Controlled Markdown value. */\n value?: string;\n /** Uncontrolled initial value. */\n defaultValue?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst STYLE_ID = 'typewright-styles';\n\nexport function useInjectStyles(): void {\n React.useEffect(() => {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID)) return;\n const el = document.createElement('style');\n el.id = STYLE_ID;\n // One injected sheet keyed by STYLE_ID carries the editor chrome plus the\n // widget-island styles (table grid + fold menu + comments sidebar +\n // settings panel / command palette + sandbox islands + caret-reveal), so\n // consumers need no extra CSS.\n el.textContent =\n TYPEWRIGHT_CSS + TABLEGRID_CSS + FOLDMENU_CSS + COMMENTS_CSS + SETTINGS_CSS + SANDBOX_ISLAND_CSS + CARET_REVEAL_CSS;\n document.head.appendChild(el);\n }, []);\n}\n\n/** Whether an extension flag is on: `true`, or an options object not explicitly disabled. */\nfunction extEnabled(x: boolean | { enabled?: boolean } | undefined, dflt = false): boolean {\n if (x === undefined) return dflt;\n if (typeof x === 'boolean') return x;\n return x.enabled !== false;\n}\n\n/** Normalize an extension option (`boolean | Options`) to its options object, or null when off. */\nfunction extOptions<T extends { enabled?: boolean }>(x: boolean | T | undefined): T | null {\n if (!extEnabled(x)) return null;\n return typeof x === 'object' ? x : ({ enabled: true } as T);\n}\n\n/* ------------------------------------------------------------------ *\n * Executable widget islands — sandboxed MDX + Mermaid (Phase D4 / E1)\n * ------------------------------------------------------------------ *\n * MDX (`mdxFlow`) blocks and `mermaid` fences render as an opaque-origin\n * sandbox iframe (see {@link SandboxIsland}) — but ONLY when the host wires the\n * config up: MDX needs a `transform`, Mermaid needs a resolved engine source.\n * Without those, blocks fall back to the escaped-source / plain-fence rendering\n * exactly as before, so default behaviour is unchanged.\n */\n\n/** Everything the block renderers need to decide + build an island. */\ninterface IslandCtx {\n /** MDX execution is live (extension on AND a transform is configured). */\n mdxActive: boolean;\n mdxTransform?: MdxTransform;\n mdxComponents?: ComponentMap;\n mdxSandbox?: SandboxOptions;\n /** Mermaid rendering is live (extension on AND the engine source resolved). */\n mermaidActive: boolean;\n mermaidEngine?: string;\n theme: 'light' | 'dark';\n}\n\n/** The first whitespace-delimited token of a fence info string, lowercased. */\nfunction fenceLang(info: string): string {\n return (info.trim().split(/\\s+/)[0] ?? '').toLowerCase();\n}\n\n/** A `mdxFlow` HTML block that should render as a live MDX island. */\nfunction isMdxIslandBlock(b: Block, ic: IslandCtx): boolean {\n return ic.mdxActive && b.type === 'htmlBlock' && b.variant === 'mdxFlow';\n}\n\n/** A ```` ```mermaid ```` fence that should render as a live diagram island. */\nfunction isMermaidIslandBlock(b: Block, ic: IslandCtx): boolean {\n return ic.mermaidActive && b.type === 'codeBlock' && fenceLang(b.lang) === 'mermaid';\n}\n\n/**\n * Which block types render as caret-level source reveal (SPEC §5.2). Only the\n * plain text / formatting blocks are a good fit; a table stays a {@link TableGrid},\n * an MDX/Mermaid block stays its island, and code/thematic-break/math/footnote/\n * def-list blocks keep their existing renderer.\n */\nfunction isCaretEligible(b: Block): boolean {\n return b.type === 'heading' || b.type === 'paragraph' || b.type === 'list' || b.type === 'blockquote';\n}\n\n/**\n * Presentation-layer a11y hardening of already-sanitized block HTML before it is\n * injected. The core renderer is intentionally attribute-minimal, so the disabled\n * GFM task-list checkboxes ship without an accessible name — screen readers then\n * announce an unlabeled checkbox (\"Form elements must have labels\", axe critical).\n * Give them a name here, in the React surface. Idempotent; a no-op when the block\n * has no task checkbox.\n */\nfunction withA11yHints(html: string): string {\n return html.replace(/<input type=\"checkbox\" disabled/g, '<input type=\"checkbox\" aria-label=\"Task item\" disabled');\n}\n\n/**\n * The rendered block HTML carries a focusable/interactive descendant (a link or a\n * task checkbox). Wrapping such a block in a `role=\"button\"` click-to-edit\n * affordance would nest interactive controls (axe `nested-interactive`, serious),\n * so those blocks drop the button role (staying keyboard-operable via tabindex +\n * key handler) while marker-free blocks keep the richer button semantics.\n */\nconst HAS_INTERACTIVE_HTML = /<a[\\s>]|<input\\b/i;\n\n/** Build the island element for an island-eligible block (`code` is the block source). */\nfunction renderIsland(b: Block, ic: IslandCtx): React.ReactElement | null {\n if (isMdxIslandBlock(b, ic)) {\n const code = (b as Extract<Block, { type: 'htmlBlock' }>).value;\n return (\n <SandboxIsland\n kind=\"mdx\"\n code={code}\n transform={ic.mdxTransform}\n components={ic.mdxComponents}\n sandbox={ic.mdxSandbox}\n theme={ic.theme}\n />\n );\n }\n if (isMermaidIslandBlock(b, ic)) {\n const code = (b as Extract<Block, { type: 'codeBlock' }>).value;\n return <SandboxIsland kind=\"mermaid\" code={code} mermaidEngine={ic.mermaidEngine} theme={ic.theme} />;\n }\n return null;\n}\n\n/* ------------------------------------------------------------------ *\n * Keymap — shortcuts dispatch real COMMANDS through `applyCommand`\n * (toggle-aware, so ⌘B twice returns the original text), never the\n * insert-only wrap that would double-wrap.\n * ------------------------------------------------------------------ */\n\n/** Command ids that exist, for validating host-supplied bindings. */\nconst COMMAND_IDS = new Set<string>(COMMANDS.map((c) => c.id));\n\n/** Canonical binding string: modifiers (mod, alt, shift) then key, e.g. `mod+b`. */\nfunction canonKey(raw: string): string {\n const toks = raw\n .toLowerCase()\n .replace(/-/g, '+')\n .split('+')\n .map((t) => t.trim())\n .filter(Boolean);\n let mod = false;\n let alt = false;\n let shift = false;\n let key = '';\n for (const t of toks) {\n if (t === 'mod' || t === 'cmd' || t === 'meta' || t === 'ctrl' || t === 'control') mod = true;\n else if (t === 'alt' || t === 'option' || t === 'opt') alt = true;\n else if (t === 'shift') shift = true;\n else key = t;\n }\n const parts: string[] = [];\n if (mod) parts.push('mod');\n if (alt) parts.push('alt');\n if (shift) parts.push('shift');\n parts.push(key);\n return parts.join('+');\n}\n\n/** A displayed shortcut (`⌘B`, `⇧⌥K`) → a canonical binding string. */\nfunction kbdToBinding(kbd: string): string | null {\n let key = '';\n const mods: string[] = [];\n for (const ch of kbd) {\n if (ch === '⌘' || ch === '⌃') mods.push('mod');\n else if (ch === '⇧') mods.push('shift');\n else if (ch === '⌥') mods.push('alt');\n else if (ch.trim()) key += ch;\n }\n key = key.toLowerCase();\n if (!key) return null;\n return canonKey([...mods, key].join('+'));\n}\n\n/** The canonical binding string for a live keyboard event. */\nfunction eventCanon(e: React.KeyboardEvent<HTMLTextAreaElement>): string {\n const parts: string[] = [];\n if (e.metaKey || e.ctrlKey) parts.push('mod');\n if (e.altKey) parts.push('alt');\n if (e.shiftKey) parts.push('shift');\n parts.push(e.key.toLowerCase());\n return parts.join('+');\n}\n\n/**\n * Build the active binding map from {@link KeymapOptions}. The `default` preset\n * seeds bindings from every command's displayed `kbd`; `none` starts empty.\n * `keymap.bindings` (keys like `\"Mod-b\"`) then override, keeping only valid ids.\n */\nfunction buildKeymap(keymap?: KeymapOptions): Map<string, Command> {\n const map = new Map<string, Command>();\n if ((keymap?.preset ?? 'default') !== 'none') {\n for (const c of COMMANDS) {\n if (!c.kbd) continue;\n const b = kbdToBinding(c.kbd);\n if (b) map.set(b, c.id);\n }\n }\n if (keymap?.bindings) {\n for (const [raw, cmd] of Object.entries(keymap.bindings)) {\n if (COMMAND_IDS.has(cmd)) map.set(canonKey(raw), cmd as Command);\n }\n }\n return map;\n}\n\n/* ------------------------------------------------------------------ *\n * Collaboration — anchored comments + live presence (plan A3/A4)\n * ------------------------------------------------------------------ *\n * A controlled, data-in/events-out surface. The host owns the threads; the\n * editor keeps a LOCAL map of live anchor positions that survive edits (via\n * `mapAnchor` on every commit) and draws highlights + remote cursors over the\n * rendered content by wrapping existing text nodes — never by string-injecting\n * HTML, so the render.ts sanitizer boundary is untouched.\n */\n\n/** Normalize `comments` (`boolean | CommentsOptions`) to options-or-null. */\nfunction normalizeComments(comments: boolean | CommentsOptions | undefined): CommentsOptions | null {\n if (!comments) return null;\n if (comments === true) return { enabled: true, threads: [] };\n return comments;\n}\n\n/** Normalize `settings` (`boolean | SettingsOptions`) to options-or-null. */\nfunction normalizeSettings(settings: boolean | SettingsOptions | undefined): SettingsOptions | null {\n if (!settings) return null;\n if (settings === true) return { enabled: true };\n return settings;\n}\n\n/** A single live decoration: where a thread's highlight is drawn *now*. */\ninterface LiveDecoration {\n id: string;\n from: number;\n to: number;\n quote: string;\n}\n\n/** A pending selection the \"💬 Comment\" popup is offered for. */\ninterface PendingSelection {\n anchor: { from: number; to: number };\n quote: string;\n /** Viewport coordinates the popup/composer anchor to (position: fixed). */\n x: number;\n y: number;\n}\n\n/**\n * Reduce a Markdown source slice to its approximate rendered text so a comment\n * highlight can be located by string match against the rendered DOM (where the\n * markers have been stripped). Conservative: strips the common block + inline\n * markers and collapses whitespace; anything it misses just means the match\n * falls back to a coarser range, never a wrong or unsafe one.\n */\nfunction plainify(src: string): string {\n let s = src;\n // Leading block markers (heading / blockquote / list / task).\n s = s.replace(/^\\s*#{1,6}\\s+/, '');\n s = s.replace(/^\\s*>\\s?/gm, '');\n s = s.replace(/^\\s*(?:[-*+]|\\d+[.)])\\s+(?:\\[[ xX]\\]\\s+)?/gm, '');\n // Inline links / images → their visible text.\n s = s.replace(/!?\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1');\n // Inline emphasis / code / strike markers.\n s = s.replace(/(\\*\\*|__|~~|\\*|_|`)/g, '');\n return s.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Rendered-text caret index for a raw source cursor offset within a block scope.\n * `scopeFrom`/`cursorFrom` are DOCUMENT/source offsets, but the block's rendered\n * text has had its Markdown markers stripped — so we map through {@link plainify}\n * (the SAME reduction the comment-highlight path uses) instead of subtracting raw\n * offsets, which would otherwise push the caret past its glyph on any block that\n * carries markers (headings, lists, `**`/`` ` ``/`[]()`). Clamped to `renderedLen`.\n */\nexport function renderedCaretIndex(\n source: string,\n scopeFrom: number,\n cursorFrom: number,\n renderedLen: number,\n): number {\n return Math.min(plainify(source.slice(scopeFrom, cursorFrom)).length, renderedLen);\n}\n\n/** Initials for a presence chip (up to two letters). */\nfunction peerInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n const first = parts[0]?.[0] ?? '';\n const last = parts.length > 1 ? parts[parts.length - 1]?.[0] ?? '' : '';\n return (first + last).toUpperCase() || '?';\n}\n\n/**\n * Merge host threads with locally-created (optimistic) ones, dropping any local\n * thread the host has since echoed back (matched by quote + body) so a created\n * comment shows instantly and de-duplicates once the host re-supplies `threads`.\n */\nfunction mergeThreads(host: CommentThread[], local: CommentThread[]): CommentThread[] {\n if (local.length === 0) return host;\n const echoed = (l: CommentThread): boolean =>\n host.some((h) => h.quote === l.quote && h.body === l.body);\n return [...host, ...local.filter((l) => !echoed(l))];\n}\n\n/**\n * Tighten a change to its minimal edit by trimming the common prefix/suffix of\n * the replaced text and the inserted text. Whole-region replaces — the block\n * commit `{from,to,insert:draft}` and command applies `{from:0,to:len,insert}` —\n * would otherwise span text that did not actually change, so `mapAnchor` would\n * collapse any anchor inside that span. Minimizing first keeps anchors alive\n * across in-block edits and command applies (SPEC edge case).\n */\nfunction minimizeChange(change: DocChange, prevDoc: string): DocChange {\n const { from, to } = change;\n const removed = prevDoc.slice(from, to);\n const inserted = change.insert;\n let p = 0;\n const maxP = Math.min(removed.length, inserted.length);\n while (p < maxP && removed.charCodeAt(p) === inserted.charCodeAt(p)) p++;\n let s = 0;\n const maxS = Math.min(removed.length - p, inserted.length - p);\n while (s < maxS && removed.charCodeAt(removed.length - 1 - s) === inserted.charCodeAt(inserted.length - 1 - s)) s++;\n return { from: from + p, to: to - s, insert: inserted.slice(p, inserted.length - s) };\n}\n\n/* ---- DOM text-node decoration (sanitizer-safe: wraps existing nodes) ---- */\n\n/** Remove every collab decoration this module previously inserted into `scope`. */\nfunction clearDecorations(scope: HTMLElement): void {\n scope.querySelectorAll('mark.tw-comment').forEach((mark) => {\n const parent = mark.parentNode;\n if (!parent) return;\n while (mark.firstChild) parent.insertBefore(mark.firstChild, mark);\n parent.removeChild(mark);\n });\n scope.querySelectorAll('.tw-remote-cursor').forEach((c) => c.remove());\n scope.normalize();\n}\n\n/** The concatenated text-node content of `scope`, plus a locator by char index. */\nfunction textNodesOf(scope: HTMLElement): { nodes: Text[]; text: string } {\n const walker = document.createTreeWalker(scope, NodeFilter.SHOW_TEXT);\n const nodes: Text[] = [];\n let text = '';\n let n = walker.nextNode();\n while (n) {\n const t = n as Text;\n nodes.push(t);\n text += t.nodeValue ?? '';\n n = walker.nextNode();\n }\n return { nodes, text };\n}\n\n/** Resolve a char index within `scope`'s text to a `{node, offset}` position. */\nfunction locateCharIndex(nodes: Text[], index: number): { node: Text; offset: number } | null {\n let pos = 0;\n for (const node of nodes) {\n const len = node.nodeValue?.length ?? 0;\n if (index <= pos + len) return { node, offset: Math.max(0, index - pos) };\n pos += len;\n }\n const last = nodes[nodes.length - 1];\n return last ? { node: last, offset: last.nodeValue?.length ?? 0 } : null;\n}\n\n/**\n * Wrap the `[start, end)` character span of `scope`'s concatenated text in a\n * `<mark class=\"tw-comment\" data-thread=id>`. Splits at text-node boundaries so\n * each wrapped fragment stays inside one text node (safe for `surroundContents`).\n */\nfunction wrapCharRange(scope: HTMLElement, start: number, end: number, id: string, flash: boolean): HTMLElement | null {\n if (end <= start) return null;\n const { nodes } = textNodesOf(scope);\n const segments: { node: Text; s: number; e: number }[] = [];\n let pos = 0;\n for (const node of nodes) {\n const len = node.nodeValue?.length ?? 0;\n const nodeStart = pos;\n const nodeEnd = pos + len;\n const s = Math.max(start, nodeStart);\n const e = Math.min(end, nodeEnd);\n if (s < e) segments.push({ node, s: s - nodeStart, e: e - nodeStart });\n pos = nodeEnd;\n if (pos >= end) break;\n }\n let first: HTMLElement | null = null;\n for (const seg of segments) {\n const range = document.createRange();\n range.setStart(seg.node, seg.s);\n range.setEnd(seg.node, seg.e);\n const mark = document.createElement('mark');\n mark.className = flash ? 'tw-comment tw-comment-flash' : 'tw-comment';\n mark.setAttribute('data-thread', id);\n try {\n range.surroundContents(mark);\n } catch {\n continue; // a boundary we can't cleanly wrap — skip this fragment\n }\n if (!first) first = mark;\n }\n return first;\n}\n\n/** Insert a thin remote-cursor caret at a char index within `scope`. */\nfunction insertRemoteCursor(scope: HTMLElement, index: number, peer: PresencePeer): void {\n const { nodes } = textNodesOf(scope);\n const loc = locateCharIndex(nodes, index);\n if (!loc) return;\n const range = document.createRange();\n range.setStart(loc.node, loc.offset);\n range.collapse(true);\n const caret = document.createElement('span');\n caret.className = 'tw-remote-cursor';\n caret.setAttribute('data-peer', peer.name);\n if (peer.color) caret.style.setProperty('--tw-remote', peer.color);\n const label = document.createElement('span');\n label.className = 'tw-remote-flag';\n label.textContent = peer.name;\n caret.appendChild(label);\n range.insertNode(caret);\n}\n\n/**\n * Apply comment highlights + presence carets to the rendered content in\n * `container`. Scoped per rendered block (`.tw-block[data-tw-from]`) when those\n * exist (unified/preview), else treated as one whole-document scope (read mode).\n */\nfunction applyDecorations(\n container: HTMLElement,\n source: string,\n decorations: LiveDecoration[],\n peers: PresencePeer[],\n activeThreadId: string | undefined,\n): void {\n clearDecorations(container);\n\n const blockEls = Array.from(\n container.querySelectorAll<HTMLElement>('.tw-block[data-tw-from], .tw-caret-block[data-tw-from]'),\n );\n const scopes: { el: HTMLElement; from: number; to: number }[] =\n blockEls.length > 0\n ? blockEls.map((el) => ({\n el,\n from: Number(el.getAttribute('data-tw-from')) || 0,\n to: Number(el.getAttribute('data-tw-to')) || 0,\n }))\n : [{ el: container, from: 0, to: source.length }];\n\n let flashTarget: HTMLElement | null = null;\n\n for (const scope of scopes) {\n // Never inject <mark>/cursor spans into a live contentEditable caret-reveal\n // block: it would corrupt the block's DOM↔source offset mapping and be\n // clobbered by its next repaint. Anchors still resolve (data-tw-from), so a\n // new comment anchors to the right range; the inline highlight/cursor simply\n // isn't drawn inside a caret surface.\n if (scope.el.getAttribute('contenteditable') === 'true' || scope.el.isContentEditable) continue;\n const scopeText = scope.el.textContent ?? '';\n for (const dec of decorations) {\n // Only decorate blocks the anchor overlaps.\n if (dec.to <= scope.from || dec.from >= scope.to) continue;\n const rawFrom = Math.max(dec.from, scope.from) - scope.from;\n const rawTo = Math.min(dec.to, scope.to) - scope.from;\n const rawSlice = source.slice(scope.from + rawFrom, scope.from + rawTo);\n const target = plainify(rawSlice) || plainify(dec.quote);\n if (!target) continue;\n let at = scopeText.indexOf(target);\n if (at < 0) at = scopeText.indexOf(dec.quote.trim());\n if (at < 0) continue;\n const mark = wrapCharRange(scope.el, at, at + target.length, dec.id, dec.id === activeThreadId);\n if (mark && dec.id === activeThreadId) flashTarget = mark;\n }\n for (const peer of peers) {\n const cur = peer.cursor;\n if (!cur) continue;\n if (cur.from < scope.from || cur.from > scope.to) continue;\n const rendered = scope.el.textContent?.length ?? 0;\n // `cur.from` is a raw source offset; map it to a rendered-text index the\n // same way the comment path does, so the caret lands on the right glyph on\n // blocks that carry Markdown markers (headings, lists, `**`/`` ` ``/`[]()`).\n const idx = renderedCaretIndex(source, scope.from, cur.from, rendered);\n insertRemoteCursor(scope.el, idx, peer);\n }\n }\n\n if (flashTarget) flashTarget.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n}\n\n/**\n * The collaboration controller. Owns live anchors, optimistic threads, the\n * selection popup/composer, and the sidebar/presence state; returns the pieces\n * the editor stitches into each mode. Inert (all state idle) when neither\n * comments nor presence is configured.\n */\ninterface CollabController {\n commentsActive: boolean;\n active: boolean;\n /** Whether the editor shell + top-right strip render (comments/presence OR settings). */\n shellActive: boolean;\n /** Whether the comments sidebar is open (content is offset to make room). */\n sidebarOpen: boolean;\n peers: PresencePeer[];\n threads: CommentThread[];\n contentRef: React.RefObject<HTMLDivElement | null>;\n /** Wrap a commit so anchors re-map through its change; call from commitValue. */\n onCommit: (change: DocChange) => void;\n /** Report a raw-source (textarea) selection for the Comment popup. */\n onSourceSelect: (docFrom: number, docTo: number, quote: string) => void;\n /** Track the pointer so the popup can anchor near a textarea selection. */\n onPointer: (x: number, y: number) => void;\n /** Chrome rendered inside the editor shell (popup, composer, bar, sidebar). */\n overlay: React.ReactNode;\n}\n\nfunction useCollab(\n comments: boolean | CommentsOptions | undefined,\n presence: PresencePeer[] | undefined,\n md: string,\n mode: EditorMode,\n settingsControl?: React.ReactNode,\n /** Bumps when the virtualized visible-block set changes, to re-run decorations. */\n visibleRev = 0,\n): CollabController {\n const opts = normalizeComments(comments);\n const commentsActive = !!opts && opts.enabled !== false;\n const peers = React.useMemo(() => presence ?? [], [presence]);\n const active = commentsActive || peers.length > 0;\n // The settings gear shares the top-right control strip, so the shell + strip\n // also render when only settings is active (with no comments/presence).\n const settingsPresent = !!settingsControl;\n const shellActive = active || settingsPresent;\n\n const hostThreads = opts?.threads ?? EMPTY_THREADS;\n const me = opts?.me;\n\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const pointerRef = React.useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const srcRef = React.useRef(md);\n srcRef.current = md;\n\n const [localThreads, setLocalThreads] = React.useState<CommentThread[]>([]);\n const [liveAnchors, setLiveAnchors] = React.useState<Map<string, { from: number; to: number }>>(\n () => new Map(),\n );\n const [open, setOpen] = React.useState(false);\n const [activeThreadId, setActiveThreadId] = React.useState<string | undefined>(undefined);\n const [pending, setPending] = React.useState<PendingSelection | null>(null);\n const [composing, setComposing] = React.useState<PendingSelection | null>(null);\n\n const threads = React.useMemo(() => mergeThreads(hostThreads, localThreads), [hostThreads, localThreads]);\n\n // Seed / reconcile live anchors when the visible thread set changes: add new\n // threads' anchors, drop removed ones, keep existing live positions.\n React.useEffect(() => {\n if (!commentsActive) return;\n setLiveAnchors((prev) => {\n const next = new Map(prev);\n const valid = new Set(threads.map((t) => t.id));\n for (const t of threads) if (!next.has(t.id)) next.set(t.id, t.anchor);\n for (const id of [...next.keys()]) if (!valid.has(id)) next.delete(id);\n return next;\n });\n }, [threads, commentsActive]);\n\n // Every commit re-maps every live anchor through the change; fully-deleted\n // anchors (mapAnchor → null) are dropped.\n const commentsActiveRef = React.useRef(commentsActive);\n commentsActiveRef.current = commentsActive;\n const onCommit = React.useCallback((change: DocChange) => {\n if (!commentsActiveRef.current) return;\n // Minimize against the pre-commit document so anchors inside an untouched\n // part of a whole-region replace (block commit / command apply) survive.\n const minimal = minimizeChange(change, srcRef.current);\n setLiveAnchors((prev) => {\n const next = new Map<string, { from: number; to: number }>();\n prev.forEach((a, id) => {\n const mapped = mapAnchor(a, minimal);\n if (mapped) next.set(id, mapped);\n });\n return next;\n });\n }, []);\n\n const onPointer = React.useCallback((x: number, y: number) => {\n pointerRef.current = { x, y };\n }, []);\n\n const onSourceSelect = React.useCallback(\n (docFrom: number, docTo: number, quote: string) => {\n if (!commentsActive || docFrom >= docTo || !quote.trim()) {\n setPending(null);\n return;\n }\n const { x, y } = pointerRef.current;\n setPending({ anchor: { from: docFrom, to: docTo }, quote, x, y });\n },\n [commentsActive],\n );\n\n // Rendered-content selection (preview/read + unified rendered blocks): derive\n // a document anchor from the nearest block's source range and the quote.\n React.useEffect(() => {\n if (!commentsActive) return undefined;\n const onMouseUp = (e: MouseEvent) => {\n pointerRef.current = { x: e.clientX, y: e.clientY };\n const container = contentRef.current;\n if (!container) return;\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0 || sel.isCollapsed) return;\n const quote = sel.toString();\n if (!quote.trim()) return;\n const range = sel.getRangeAt(0);\n const anchorNode = range.commonAncestorContainer;\n if (!(anchorNode instanceof Node) || !container.contains(anchorNode)) return;\n // Ignore selections inside our own chrome (composer/sidebar/popup).\n const host = anchorNode instanceof Element ? anchorNode : anchorNode.parentElement;\n if (host?.closest('.tw-selpop, .tw-composer, .tw-comments-sidebar')) return;\n\n const blockEl = host?.closest<HTMLElement>('.tw-block[data-tw-from], .tw-caret-block[data-tw-from]');\n const from = blockEl ? Number(blockEl.getAttribute('data-tw-from')) || 0 : 0;\n const to = blockEl ? Number(blockEl.getAttribute('data-tw-to')) || 0 : srcRef.current.length;\n const blockSrc = srcRef.current.slice(from, to);\n const idx = blockSrc.indexOf(quote.trim());\n const anchor =\n idx >= 0\n ? { from: from + idx, to: from + idx + quote.trim().length }\n : { from, to };\n const rect = range.getBoundingClientRect();\n setPending({\n anchor,\n quote: quote.trim(),\n x: rect.left + rect.width / 2,\n y: rect.top,\n });\n };\n document.addEventListener('mouseup', onMouseUp);\n return () => document.removeEventListener('mouseup', onMouseUp);\n }, [commentsActive]);\n\n // Draw highlights + presence carets after every relevant change.\n const decorations = React.useMemo<LiveDecoration[]>(() => {\n if (!commentsActive) return [];\n const out: LiveDecoration[] = [];\n for (const t of threads) {\n if (t.resolved) continue;\n const pos = liveAnchors.get(t.id) ?? t.anchor;\n out.push({ id: t.id, from: pos.from, to: pos.to, quote: t.quote ?? '' });\n }\n return out;\n }, [threads, liveAnchors, commentsActive]);\n\n React.useLayoutEffect(() => {\n const container = contentRef.current;\n if (!container || !active) return;\n // `visibleRev` re-runs this after virtualization mounts/unmounts blocks, so\n // highlights appear on newly-scrolled-in blocks. applyDecorations only walks\n // the `.tw-block` elements currently in the DOM, so it never throws on the\n // off-screen ones (their highlights draw when scrolled into view).\n // `open` is a dep because toggling the sidebar re-renders the content (which\n // resets each block's innerHTML, dropping the imperatively-added highlight\n // marks); re-running here re-draws them so highlights persist while the\n // review sidebar is open.\n applyDecorations(container, md, decorations, peers, activeThreadId);\n }, [md, decorations, peers, activeThreadId, active, mode, visibleRev, open]);\n\n // Clicking a highlight opens its thread in the sidebar.\n React.useEffect(() => {\n const container = contentRef.current;\n if (!container || !commentsActive) return undefined;\n const onClick = (e: MouseEvent) => {\n const mark = (e.target as HTMLElement | null)?.closest?.('mark.tw-comment');\n const id = mark?.getAttribute('data-thread');\n if (!id) return;\n e.preventDefault();\n e.stopPropagation();\n setActiveThreadId(id);\n setOpen(true);\n };\n container.addEventListener('click', onClick, true);\n return () => container.removeEventListener('click', onClick, true);\n }, [commentsActive]);\n\n const createThread = React.useCallback(\n (sel: PendingSelection, body: string) => {\n const id = `tw-comment-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;\n opts?.onCreate?.({ anchor: sel.anchor, quote: sel.quote, body });\n const thread: CommentThread = {\n id,\n anchor: sel.anchor,\n quote: sel.quote,\n author: me?.name ?? 'You',\n body,\n createdAt: new Date().toISOString(),\n replies: [],\n };\n setLocalThreads((prev) => [...prev, thread]);\n setLiveAnchors((prev) => new Map(prev).set(id, sel.anchor));\n setActiveThreadId(id);\n setOpen(true);\n setComposing(null);\n setPending(null);\n window.getSelection()?.removeAllRanges();\n },\n [opts, me],\n );\n\n const overlay = shellActive ? (\n <>\n {(peers.length > 0 || commentsActive || settingsPresent) && (\n <div className=\"tw-collab-bar\">\n {peers.length > 0 && (\n <div className=\"tw-presence\" aria-label=\"Collaborators\">\n {peers.map((p) => (\n <span\n key={p.id}\n className=\"tw-presence-av\"\n style={{ background: p.color ?? '#888' }}\n title={p.name}\n aria-label={p.name}\n >\n {peerInitials(p.name)}\n </span>\n ))}\n </div>\n )}\n {commentsActive && (\n <button\n type=\"button\"\n className={`tw-comments-toggle${open ? ' tw-on' : ''}`}\n aria-label={open ? 'Hide comments' : 'Show comments'}\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n >\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.9\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\" />\n </svg>\n <span className=\"tw-comments-toggle-n\">{threads.length}</span>\n </button>\n )}\n {settingsControl}\n </div>\n )}\n\n {commentsActive && pending && !composing && (\n <div className=\"tw-selpop show\" style={{ left: clampX(pending.x), top: Math.max(8, pending.y - 44) }} role=\"menu\">\n <button\n type=\"button\"\n className=\"tw-selpop-btn\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n setComposing(pending);\n setPending(null);\n }}\n >\n 💬 Comment\n </button>\n </div>\n )}\n\n {commentsActive && composing && (\n <Composer\n selection={composing}\n onSubmit={(body) => createThread(composing, body)}\n onCancel={() => {\n setComposing(null);\n window.getSelection()?.removeAllRanges();\n }}\n />\n )}\n\n {commentsActive && (\n <CommentsSidebar\n threads={threads}\n me={me}\n open={open}\n onClose={() => setOpen(false)}\n onReply={(threadId, body) => opts?.onReply?.(threadId, body)}\n onReact={(threadId, emoji) => opts?.onReact?.(threadId, emoji)}\n onResolve={(threadId, resolved) => opts?.onResolve?.(threadId, resolved)}\n onDelete={opts?.onDelete ? (threadId) => opts?.onDelete?.(threadId) : undefined}\n activeThreadId={activeThreadId}\n onSelectThread={(threadId) => setActiveThreadId(threadId)}\n />\n )}\n </>\n ) : null;\n\n return {\n commentsActive,\n active,\n shellActive,\n sidebarOpen: open && commentsActive,\n peers,\n threads,\n contentRef,\n onCommit,\n onSourceSelect,\n onPointer,\n overlay,\n };\n}\n\nconst EMPTY_THREADS: CommentThread[] = [];\n\n/** Clamp a fixed-position x so a popup/composer stays on screen. */\nfunction clampX(x: number): number {\n const w = typeof window === 'undefined' ? 1024 : window.innerWidth;\n return Math.max(8, Math.min(x, w - 288));\n}\n\n/** The comment composer: quoted selection + a body textarea + submit/cancel. */\nfunction Composer(props: {\n selection: PendingSelection;\n onSubmit: (body: string) => void;\n onCancel: () => void;\n}): React.ReactElement {\n const { selection, onSubmit, onCancel } = props;\n const [body, setBody] = React.useState('');\n const taRef = React.useRef<HTMLTextAreaElement>(null);\n React.useEffect(() => {\n taRef.current?.focus();\n }, []);\n const submit = () => {\n const v = body.trim();\n if (v) onSubmit(v);\n };\n return (\n <div\n className=\"tw-composer show\"\n style={{ left: clampX(selection.x), top: Math.max(8, selection.y - 8) }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n <div className=\"tw-composer-quote\">“{selection.quote}”</div>\n <textarea\n ref={taRef}\n value={body}\n placeholder=\"Add a comment…\"\n aria-label=\"Comment\"\n onChange={(e) => setBody(e.currentTarget.value)}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n submit();\n }\n }}\n />\n <div className=\"tw-composer-row\">\n <button type=\"button\" className=\"tw-composer-btn\" onClick={onCancel}>\n Cancel\n </button>\n <button type=\"button\" className=\"tw-composer-btn tw-composer-primary\" disabled={!body.trim()} onClick={submit}>\n Comment\n </button>\n </div>\n </div>\n );\n}\n\nexport const TypewrightEditor = React.forwardRef<TypewrightEditorHandle, TypewrightEditorProps>(\n function TypewrightEditor(props, forwardedRef): React.ReactElement {\n useInjectStyles();\n const {\n value,\n defaultValue,\n onChange,\n onSelectionChange,\n onModeChange,\n mode: modeProp = 'unified',\n unifiedReveal = 'block',\n extensions,\n folding,\n keymap,\n comments,\n presence,\n settings,\n readOnly = false,\n placeholder = 'Write Markdown…',\n theme,\n toolbar,\n overscan,\n className,\n style,\n } = props;\n\n // Mode is controlled-or-internal (like value/defaultValue): the internal\n // state is seeded from the prop, a changed prop from the parent wins, and\n // `setMode` drives it from inside (settings panel / imperative handle).\n const [modeState, setModeState] = React.useState<EditorMode>(modeProp);\n const lastModeProp = React.useRef(modeProp);\n if (modeProp !== lastModeProp.current) {\n lastModeProp.current = modeProp;\n setModeState(modeProp);\n }\n const mode = modeState;\n const setMode = React.useCallback(\n (m: EditorMode) => {\n setModeState(m);\n onModeChange?.(m);\n },\n [onModeChange],\n );\n\n // Settings surface (Phase B3): live, session-only OVERRIDES of the config\n // props. Each is seeded `undefined`/`{}` so — with no panel interaction — the\n // effective value below is exactly the prop and existing behaviour is\n // identical. `mode` already has its own internal state (setMode) above.\n const settingsOpts = React.useMemo<SettingsOptions | null>(() => normalizeSettings(settings), [settings]);\n const settingsActive = !!settingsOpts && settingsOpts.enabled !== false;\n const [toolbarOverride, setToolbarOverride] = React.useState<TypewrightEditorProps['toolbar'] | undefined>(undefined);\n const [themeOverride, setThemeOverride] = React.useState<'light' | 'dark' | 'auto' | undefined>(undefined);\n const [foldingOverride, setFoldingOverride] = React.useState<boolean | undefined>(undefined);\n const [extensionsOverride, setExtensionsOverride] = React.useState<Partial<Extensions>>({});\n const [settingsOpen, setSettingsOpen] = React.useState(false);\n const [paletteOpen, setPaletteOpen] = React.useState(false);\n\n // The gear lives in the shared top-right control strip (alongside the\n // presence/comments chrome). Built here so it can be threaded into the collab\n // bar; the panel + palette overlays render at the editor level (below).\n const settingsControl = settingsActive ? (\n <button\n type=\"button\"\n className={`tw-settings-gear${settingsOpen ? ' tw-on' : ''}`}\n aria-label={settingsOpen ? 'Hide settings' : 'Show settings'}\n aria-expanded={settingsOpen}\n onClick={() => setSettingsOpen((o) => !o)}\n >\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\" />\n </svg>\n </button>\n ) : null;\n\n // ⌘K / Ctrl+K opens the palette. Capture-phase + only when settings is active,\n // so it beats the ⌘K→link keymap binding and never hijacks otherwise.\n React.useEffect(() => {\n if (!settingsActive) return undefined;\n const onKey = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && !e.altKey && !e.shiftKey && (e.key === 'k' || e.key === 'K')) {\n e.preventDefault();\n e.stopPropagation();\n setPaletteOpen(true);\n }\n };\n document.addEventListener('keydown', onKey, true);\n return () => document.removeEventListener('keydown', onKey, true);\n }, [settingsActive]);\n\n // Parse: footnotes + conservative def-lists on by default; math only when the\n // extension is on (`$` is common in prose). Render: syntax highlighting when\n // enabled — math stays undefined so the escaped tw-math-src fallback holds.\n // Memoized on the resolved flags so the downstream parse memo stays stable.\n // Effective extensions: prop values overlaid with the live settings-panel\n // overrides (empty by default ⇒ identical to `extensions`).\n const effExtensions = React.useMemo<Extensions>(\n () => ({ ...extensions, ...extensionsOverride }),\n [extensions, extensionsOverride],\n );\n const mathOn = extEnabled(effExtensions.math);\n const highlightOn = extEnabled(effExtensions.syntaxHighlight);\n // Normalized extension options (null when the extension is off). MDX/Mermaid\n // gate the executable islands; Math supplies the render hook below.\n const mdxOpts = React.useMemo<MdxOptions | null>(() => extOptions<MdxOptions>(effExtensions.mdx), [effExtensions.mdx]);\n const mermaidOpts = React.useMemo<MermaidOptions | null>(\n () => extOptions<MermaidOptions>(effExtensions.mermaid),\n [effExtensions.mermaid],\n );\n const mathOpts = React.useMemo<MathOptions | null>(() => extOptions<MathOptions>(effExtensions.math), [effExtensions.math]);\n const parseOpts = React.useMemo<ParseOptions>(\n () => ({ footnotes: true, defLists: true, math: mathOn }),\n [mathOn],\n );\n // The host math renderer (trusted-as-sanitized per its MathOptions.render\n // contract) replaces the escaped `tw-math-src` fallback when supplied (C-7).\n const renderOpts = React.useMemo<RenderOptions>(\n () => ({ highlight: highlightOn ? highlightToHtml : undefined, math: mathOpts?.render }),\n [highlightOn, mathOpts],\n );\n const keymapBindings = React.useMemo(() => buildKeymap(keymap), [keymap]);\n\n // Mermaid's engine is host-supplied and async: resolve it once per config at\n // the editor level and hold the source in state. Until it resolves, mermaid\n // fences render as a plain code block (no island). MDX needs no async step —\n // its transform is synchronous config.\n const mdxIslandActive = !!mdxOpts && mdxOpts.transform !== undefined;\n const [mermaidEngineSrc, setMermaidEngineSrc] = React.useState<string | undefined>(undefined);\n React.useEffect(() => {\n const getEngine = mermaidOpts?.getEngine;\n if (!getEngine) {\n setMermaidEngineSrc(undefined);\n return undefined;\n }\n let canceled = false;\n Promise.resolve()\n .then(() => getEngine())\n .then((src) => {\n if (!canceled && typeof src === 'string') setMermaidEngineSrc(src);\n })\n .catch(() => {\n if (!canceled) setMermaidEngineSrc(undefined);\n });\n return () => {\n canceled = true;\n };\n }, [mermaidOpts]);\n const mermaidIslandActive = !!mermaidOpts && !!mermaidOpts.getEngine && mermaidEngineSrc !== undefined;\n\n const isControlled = value !== undefined;\n const [internal, setInternal] = React.useState<string>(defaultValue ?? '');\n const md = isControlled ? value ?? '' : internal;\n\n const mdRef = React.useRef(md);\n mdRef.current = md;\n\n // The most recent commit's `{prev → next}` transition + its change, captured\n // so UnifiedEditor's parse memo can take the incremental (dirty-block) fast\n // path (IJ4). Only consulted when it provably matches the string transition.\n const lastCommitRef = React.useRef<{ prev: string; change: DocChange; next: string } | null>(null);\n\n // Bumped whenever the virtualized visible-block set changes, so the collab\n // decoration pass re-runs and highlights mount on newly-scrolled-in blocks.\n const [visibleRev, setVisibleRev] = React.useState(0);\n const bumpVisible = React.useCallback(() => setVisibleRev((r) => r + 1), []);\n\n // Collaboration controller (comments + presence). Inert unless the host\n // passes `comments`/`presence`, so default rendering is unchanged.\n const collab = useCollab(comments, presence, md, mode, settingsControl, visibleRev);\n const { onCommit } = collab;\n\n const commitValue = React.useCallback(\n (next: string, change: DocChange) => {\n // Record the exact transition so the incremental parser can reuse the\n // previous tree (verified against the string transition before use).\n lastCommitRef.current = { prev: mdRef.current, change, next };\n if (!isControlled) setInternal(next);\n onChange?.(next, change);\n onCommit(change); // re-map comment anchors through this edit\n },\n [isControlled, onChange, onCommit],\n );\n\n // The focused source textarea registers itself so toolbar commands + the\n // imperative handle can act on the live selection.\n const activeSource = React.useRef<ActiveSource | null>(null);\n const register = React.useCallback((api: ActiveSource | null) => {\n if (api || activeSource.current) activeSource.current = api;\n }, []);\n const applyCmd = React.useCallback((cmd: Command) => {\n activeSource.current?.apply(cmd);\n }, []);\n React.useImperativeHandle(forwardedRef, () => ({ applyCommand: applyCmd, setMode }), [applyCmd, setMode]);\n\n // `folding` is `boolean | FoldingOptions`: a bare boolean toggles the whole\n // feature; the options object splits enabled / gutter visibility / persistence.\n const foldOpts: FoldingOptions | null = folding && typeof folding === 'object' ? folding : null;\n const foldingEnabled = folding === undefined ? true : foldOpts ? foldOpts.enabled !== false : folding !== false;\n const showGutter = foldOpts ? foldOpts.showGutter !== false : true;\n const persistKey = foldOpts ? foldOpts.persistKey : undefined;\n\n // Effective config: prop value unless the settings panel has overridden it, so\n // a panel toggle re-renders the editor live (override undefined ⇒ prop value).\n const effFolding = foldingOverride ?? foldingEnabled;\n const effAppearance = themeOverride ?? (theme?.appearance ?? 'auto');\n const effToolbar = toolbarOverride ?? toolbar;\n\n // Everything the block renderers need to decide + build executable islands.\n // Inert (both `*Active` false) unless the host wired MDX/Mermaid up, so the\n // default block rendering is untouched.\n const islands = React.useMemo<IslandCtx>(\n () => ({\n mdxActive: mdxIslandActive,\n mdxTransform: mdxOpts?.transform,\n mdxComponents: mdxOpts?.components,\n mdxSandbox: mdxOpts?.sandbox,\n mermaidActive: mermaidIslandActive,\n mermaidEngine: mermaidEngineSrc,\n theme: effAppearance === 'dark' ? 'dark' : 'light',\n }),\n [mdxIslandActive, mdxOpts, mermaidIslandActive, mermaidEngineSrc, effAppearance],\n );\n\n const rootClass = ['tw-editor', `tw-mode-${mode}`, effAppearance !== 'auto' ? `tw-theme-${effAppearance}` : '', className]\n .filter(Boolean)\n .join(' ');\n\n const toolbarMode: 'docked' | 'floating' = effToolbar === 'floating' ? 'floating' : 'docked';\n const showToolbar = !!effToolbar && !readOnly && (mode === 'edit' || mode === 'unified');\n const toolbarEl = showToolbar ? <Toolbar mode={toolbarMode} onCommand={applyCmd} /> : null;\n\n // When comments/presence are active, the editor content is wrapped in a\n // positioned shell that also hosts the selection popup, composer, presence\n // bar, and comments sidebar. Inactive → the content renders exactly as before.\n const shellClass = [\n 'tw-editor-shell',\n effAppearance !== 'auto' ? `tw-theme-${effAppearance}` : '',\n collab.sidebarOpen ? 'tw-comments-open' : '',\n ]\n .filter(Boolean)\n .join(' ');\n const shell = (content: React.ReactElement): React.ReactElement =>\n collab.shellActive ? (\n <div className={shellClass} onMouseUp={(e) => collab.onPointer(e.clientX, e.clientY)}>\n {content}\n {collab.overlay}\n </div>\n ) : content;\n\n // Live settings state fed to the panel, and the patch handler that routes each\n // key to its override setter (extensions merge shallowly). The panel + palette\n // are fixed-position overlays rendered alongside every mode's content.\n const settingsState: SettingsState = {\n mode,\n toolbar: effToolbar ?? false,\n folding: effFolding,\n theme: effAppearance,\n extensions: {\n // gfm is `boolean | Partial<GfmFeatures>` (no `enabled` field): any object\n // presence counts as on. The rest carry an `enabled` flag → extEnabled.\n gfm: effExtensions.gfm !== undefined && effExtensions.gfm !== false,\n mdx: extEnabled(effExtensions.mdx),\n mermaid: extEnabled(effExtensions.mermaid),\n math: extEnabled(effExtensions.math),\n syntaxHighlight: extEnabled(effExtensions.syntaxHighlight),\n },\n };\n const applySettingsPatch = React.useCallback(\n (patch: Partial<SettingsState>) => {\n if (patch.mode !== undefined) setMode(patch.mode);\n if (patch.toolbar !== undefined) setToolbarOverride(patch.toolbar);\n if (patch.folding !== undefined) setFoldingOverride(patch.folding);\n if (patch.theme !== undefined) setThemeOverride(patch.theme);\n if (patch.extensions !== undefined) {\n setExtensionsOverride((prev) => ({ ...prev, ...patch.extensions }));\n }\n },\n [setMode],\n );\n const paletteCommands = React.useMemo<PaletteCommand[]>(() => {\n const built = COMMANDS.map((c) => ({ id: c.id, label: c.label, kbd: c.kbd, group: c.group, run: () => applyCmd(c.id) }));\n const host = (settingsOpts?.commands ?? []).map((c) => ({ id: c.id, label: c.label, run: c.run }));\n return [...built, ...host];\n }, [applyCmd, settingsOpts]);\n const settingsSurfaces = settingsActive ? (\n <>\n <SettingsPanel open={settingsOpen} onClose={() => setSettingsOpen(false)} state={settingsState} onChange={applySettingsPatch} />\n <CommandPalette open={paletteOpen} onClose={() => setPaletteOpen(false)} commands={paletteCommands} />\n </>\n ) : null;\n // Wrap a mode's content in the shell, then append the settings overlays.\n const finish = (content: React.ReactElement): React.ReactElement =>\n settingsActive ? (\n <>\n {shell(content)}\n {settingsSurfaces}\n </>\n ) : (\n shell(content)\n );\n\n if (mode === 'edit') {\n return finish(\n <div className={rootClass} style={style} data-typewright=\"edit\">\n {toolbarEl}\n <SourceArea\n value={md}\n readOnly={readOnly}\n placeholder={placeholder}\n onChange={(next, change) => commitValue(next, change)}\n onSelect={onSelectionChange}\n register={register}\n bindings={keymapBindings}\n commentBase={collab.commentsActive ? 0 : undefined}\n onCommentSelect={collab.commentsActive ? collab.onSourceSelect : undefined}\n full\n />\n </div>,\n );\n }\n\n if (mode === 'read') {\n const readDoc = parse(md, parseOpts);\n // Only interleave per-block when the doc actually contains a live island;\n // otherwise the single sanitized-string path is kept byte-for-byte (so the\n // default, islands-off read mode is unchanged and existing e2e stays green).\n const hasIslands =\n (islands.mdxActive || islands.mermaidActive) &&\n readDoc.children.some((b) => isMdxIslandBlock(b, islands) || isMermaidIslandBlock(b, islands));\n if (!hasIslands) {\n const html = renderToHtml(readDoc, renderOpts);\n return finish(\n <div\n className={rootClass}\n style={style}\n data-typewright=\"read\"\n ref={collab.active ? collab.contentRef : undefined}\n // sanitized by render.ts\n dangerouslySetInnerHTML={{ __html: withA11yHints(html) || `<p class=\"tw-placeholder\">${escapeText(placeholder)}</p>` }}\n />,\n );\n }\n return finish(\n <div\n className={rootClass}\n style={style}\n data-typewright=\"read\"\n ref={collab.active ? collab.contentRef : undefined}\n >\n {readDoc.children.map((b, i) => {\n // Footnote defs are collected/emitted at the document end in the\n // string path; in the interleaved path they are skipped (matching\n // renderBlocks' document flow).\n if (b.type === 'footnoteDef') return null;\n const island = renderIsland(b, islands);\n if (island) return <React.Fragment key={`${i}-${b.from}`}>{island}</React.Fragment>;\n return (\n <div\n key={`${i}-${b.from}`}\n className=\"tw-block\"\n data-tw-from={b.from}\n data-tw-to={b.to}\n // sanitized by render.ts\n dangerouslySetInnerHTML={{ __html: withA11yHints(renderNode(b, renderOpts)) }}\n />\n );\n })}\n </div>,\n );\n }\n\n // unified + preview: editable block-level rich preview.\n // Caret-level source reveal (SPEC §5.2) is opt-in and ONLY in `unified` mode\n // when editable — every other case keeps today's block click-to-edit path.\n // The default (`unifiedReveal: 'block'`) is behaviourally unchanged (asserted\n // by the default-mode test in e2e/caret-reveal.spec.ts); note the block branch\n // itself was still touched by this release's a11y fixes (labels + conditional\n // role), so it is behaviourally — not byte-for-byte — identical to before.\n const caretReveal = mode === 'unified' && unifiedReveal === 'caret' && !readOnly;\n return finish(\n <UnifiedEditor\n md={md}\n mdRef={mdRef}\n rootClass={rootClass}\n style={style}\n readOnly={readOnly}\n caretReveal={caretReveal}\n placeholder={placeholder}\n foldingEnabled={effFolding}\n showGutter={showGutter}\n persistKey={persistKey}\n commitValue={commitValue}\n register={register}\n toolbar={toolbarEl}\n parseOpts={parseOpts}\n renderOpts={renderOpts}\n bindings={keymapBindings}\n islands={islands}\n contentRef={collab.active ? collab.contentRef : undefined}\n commentsActive={collab.commentsActive}\n onCommentSelect={collab.commentsActive ? collab.onSourceSelect : undefined}\n overscan={overscan}\n lastCommitRef={lastCommitRef}\n onVisibleChange={collab.active ? bumpVisible : undefined}\n />,\n );\n },\n);\n\n/* ------------------------------------------------------------------ *\n * Formatting toolbar\n * ------------------------------------------------------------------ */\n\nconst TB_GROUPS: { cmd: Command; label: string; text: string; cls?: string }[][] = [\n [\n { cmd: 'bold', label: 'Bold ⌘B', text: 'B', cls: 'b' },\n { cmd: 'italic', label: 'Italic ⌘I', text: 'I', cls: 'i' },\n { cmd: 'strikethrough', label: 'Strikethrough', text: 'S', cls: 's' },\n { cmd: 'inlineCode', label: 'Inline code ⌘E', text: '‹›' },\n { cmd: 'link', label: 'Link ⌘K', text: '↗' },\n ],\n [\n { cmd: 'heading1', label: 'Heading 1', text: 'H1' },\n { cmd: 'heading2', label: 'Heading 2', text: 'H2' },\n { cmd: 'bulletList', label: 'Bullet list', text: '•' },\n { cmd: 'orderedList', label: 'Numbered list', text: '1.' },\n { cmd: 'taskList', label: 'Task list', text: '☑' },\n { cmd: 'quote', label: 'Blockquote', text: '❝' },\n ],\n [\n { cmd: 'horizontalRule', label: 'Divider', text: '―' },\n { cmd: 'codeBlock', label: 'Code block', text: '{ }' },\n { cmd: 'table', label: 'Table', text: '▦' },\n ],\n];\n\nfunction Toolbar({ mode, onCommand }: { mode: 'docked' | 'floating'; onCommand: (cmd: Command) => void }): React.ReactElement {\n return (\n <div className={`tw-toolbar tw-toolbar-${mode}`} role=\"toolbar\" aria-label=\"Formatting\">\n {TB_GROUPS.map((group, gi) => (\n <React.Fragment key={gi}>\n {gi > 0 && <span className=\"tw-tb-sep\" aria-hidden=\"true\" />}\n {group.map((it) => (\n <button\n key={it.cmd}\n type=\"button\"\n className={`tw-tb-btn${it.cls ? ' tw-tb-' + it.cls : ''}`}\n title={it.label}\n aria-label={it.label}\n data-cmd={it.cmd}\n // keep the editor's selection: don't let the button steal focus\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => onCommand(it.cmd)}\n >\n {it.text}\n </button>\n ))}\n </React.Fragment>\n ))}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ *\n * Block-level viewport virtualization (IJ3) — tuning + scroll helpers\n * ------------------------------------------------------------------ *\n * Above VIRT_THRESHOLD visible blocks, only the blocks whose estimated vertical\n * span intersects the scroll viewport (± overscan) are mounted; two spacer divs\n * reserve the off-screen height. At/under the threshold the block list renders\n * exactly as before (no wrapper, no spacers), so small docs are unchanged.\n */\n\n/** Only virtualize once a doc has more than this many *visible* blocks. */\nconst VIRT_THRESHOLD = 150;\n/** Height (px) assumed for a block row we have not measured yet. */\nconst VIRT_EST_BLOCK = 40;\n/** Default overscan, in blocks, beyond each viewport edge (see `overscan`). */\nconst VIRT_OVERSCAN_BLOCKS = 6;\n/** Bounded first window rendered before the scroll container is measured. */\nconst VIRT_INITIAL = 50;\n\n/**\n * Nearest scrollable ancestor of `el` (a host-provided scroll region), or null.\n * Virtualization reuses the host's scroller when there is one; otherwise the\n * editor supplies its own bounded scroll region (see `tw-virt-scroll`).\n */\nfunction getScrollParent(el: HTMLElement): HTMLElement | null {\n let node: HTMLElement | null = el.parentElement;\n while (node) {\n const s = getComputedStyle(node);\n if (/(auto|scroll|overlay)/.test(s.overflowY + ' ' + s.overflow)) return node;\n node = node.parentElement;\n }\n return null;\n}\n\n/* ------------------------------------------------------------------ *\n * Unified (block-level) editor\n * ------------------------------------------------------------------ */\n\ninterface UnifiedProps {\n md: string;\n mdRef: React.MutableRefObject<string>;\n rootClass: string;\n style?: React.CSSProperties;\n readOnly: boolean;\n placeholder: string;\n /** Whether headings fold their sections at all. */\n foldingEnabled: boolean;\n /** Whether the per-heading fold gutter (chevron + options affordance) renders. */\n showGutter: boolean;\n /** localStorage namespace for persisting the folded set across reloads. */\n persistKey?: string;\n commitValue: (next: string, change: DocChange) => void;\n register?: (api: ActiveSource | null) => void;\n toolbar?: React.ReactNode;\n parseOpts: ParseOptions;\n renderOpts: RenderOptions;\n bindings: Map<string, Command>;\n /** Executable-island config (sandboxed MDX + Mermaid); inert when off. */\n islands: IslandCtx;\n /** Render eligible blocks with caret-level source reveal (SPEC §5.2, opt-in). */\n caretReveal?: boolean;\n /** Ref the collab layer walks for comment highlights + presence carets. */\n contentRef?: React.RefObject<HTMLDivElement | null>;\n /** Whether comments are active (enables selection-to-comment on blocks). */\n commentsActive?: boolean;\n /** Report a raw-source selection (document offsets) for the Comment popup. */\n onCommentSelect?: (docFrom: number, docTo: number, quote: string) => void;\n /** Overscan (extra blocks beyond each viewport edge) for large-doc virtualization. */\n overscan?: number;\n /** Last commit's `{prev → next}` transition, enabling the incremental parse fast path. */\n lastCommitRef?: React.MutableRefObject<{ prev: string; change: DocChange; next: string } | null>;\n /** Called when the virtualized visible-block set changes (re-runs comment decorations). */\n onVisibleChange?: () => void;\n}\n\nfunction UnifiedEditor(props: UnifiedProps): React.ReactElement {\n const { md, mdRef, rootClass, style, readOnly, placeholder, foldingEnabled, showGutter, persistKey, commitValue, register, toolbar, parseOpts, renderOpts, bindings, islands, caretReveal, contentRef, commentsActive, onCommentSelect, overscan, lastCommitRef, onVisibleChange } = props;\n const [active, setActive] = React.useState<number | null>(null);\n const [draft, setDraft] = React.useState('');\n // Folds are stored by heading KEY (a stable slug), NOT block index, so a\n // collapse tracks its heading across edits that insert/delete other blocks;\n // the keys resolve to current block indices each render (see `foldedHeadings`).\n // Seed from the persisted keys when a persistKey is configured, else empty.\n const [folds, setFolds] = React.useState<Set<string>>(() =>\n persistKey ? loadFoldSet(persistKey) : new Set(),\n );\n const [typing, setTyping] = React.useState(false);\n // Which heading index (if any) has its FoldMenu open, and the affordance rect\n // the fixed-position menu anchors to.\n const [foldMenuFor, setFoldMenuFor] = React.useState<number | null>(null);\n const [foldMenuRect, setFoldMenuRect] = React.useState<DOMRect | null>(null);\n\n const activeRef = React.useRef<number | null>(null);\n const draftRef = React.useRef('');\n activeRef.current = active;\n draftRef.current = draft;\n\n // FLIP: rows slide to their new position when a line's height changes on\n // reveal/commit, instead of jumping.\n const rowEls = React.useRef<Map<number, HTMLElement>>(new Map());\n const flipFrom = React.useRef<Map<number, number> | null>(null);\n const captureFlip = React.useCallback(() => {\n const m = new Map<number, number>();\n rowEls.current.forEach((el, k) => m.set(k, el.getBoundingClientRect().top));\n flipFrom.current = m;\n }, []);\n React.useLayoutEffect(() => {\n const from = flipFrom.current;\n if (!from) return;\n flipFrom.current = null;\n rowEls.current.forEach((el, k) => {\n const prev = from.get(k);\n if (prev == null) return;\n const dy = prev - el.getBoundingClientRect().top;\n if (Math.abs(dy) > 0.5) {\n el.style.transition = 'none';\n el.style.transform = `translateY(${dy}px)`;\n requestAnimationFrame(() => {\n el.style.transition = 'transform .3s cubic-bezier(.32,.72,0,1)';\n el.style.transform = '';\n });\n }\n });\n });\n\n // Parse with an incremental (dirty-block) fast path (IJ4): when the previous\n // parse tree is still valid and the last commit's change provably transforms\n // its source into `md` under the SAME options, reuse it. `parseIncremental` is\n // deep-equal to `parse` (and falls back internally), so this only saves work —\n // it can never change the resulting tree. Any mismatch → a full parse.\n const prevParse = React.useRef<{ src: string; opts: ParseOptions; doc: Document } | null>(null);\n const doc = React.useMemo(() => {\n const prev = prevParse.current;\n const lc = lastCommitRef?.current ?? null;\n let result: Document;\n if (\n prev &&\n lc &&\n prev.opts === parseOpts &&\n lc.next === md &&\n lc.prev === prev.src &&\n lc.prev !== md\n ) {\n result = parseIncremental(prev.doc, prev.src, lc.change, md, parseOpts);\n } else {\n result = parse(md, parseOpts);\n }\n prevParse.current = { src: md, opts: parseOpts, doc: result };\n return result;\n }, [md, parseOpts, lastCommitRef]);\n const blocks = doc.children;\n\n // Refs let the fold/menu callbacks read the freshest blocks/source without\n // being torn down and rebuilt on every parse.\n const blocksRef = React.useRef(blocks);\n blocksRef.current = blocks;\n const foldsRef = React.useRef(folds);\n foldsRef.current = folds;\n\n // Single fold-set writer: updates state and (when configured) persists the\n // folded heading keys so the collapse survives a reload. `folds` already holds\n // stable keys, so persistence is a direct write.\n const commitFolds = React.useCallback(\n (next: Set<string>) => {\n setFolds(next);\n if (persistKey) saveFoldSet(persistKey, next);\n },\n [persistKey],\n );\n\n const toggleFold = React.useCallback(\n (i: number) => {\n // Toggle by the clicked heading's stable key (indices drift across edits).\n const key = headingKeyMap(blocksRef.current, mdRef.current).get(i);\n if (!key) return;\n const next = new Set(foldsRef.current);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n commitFolds(next);\n },\n [commitFolds, mdRef],\n );\n\n const foldAll = React.useCallback(() => {\n const next = new Set<string>();\n headingKeyMap(blocksRef.current, mdRef.current).forEach((key) => next.add(key));\n commitFolds(next);\n }, [commitFolds, mdRef]);\n\n const unfoldAll = React.useCallback(() => commitFolds(new Set<string>()), [commitFolds]);\n\n // Rewrite a heading's `#`-run to `level` hashes via a splice over its marker\n // range `[from, contentFrom)` (contentFrom is exposed on the heading node).\n const setHeadingLevel = React.useCallback(\n (i: number, level: number) => {\n const b = blocksRef.current[i];\n if (!b || b.type !== 'heading') return;\n const src = mdRef.current;\n const marker = '#'.repeat(level) + ' ';\n const change: DocChange = { from: b.from, to: b.contentFrom, insert: marker };\n const next = src.slice(0, change.from) + marker + src.slice(change.to);\n if (next !== src) {\n commitValue(next, change);\n mdRef.current = next;\n }\n },\n [mdRef, commitValue],\n );\n\n const copyHeadingLink = React.useCallback(\n (i: number) => {\n const b = blocksRef.current[i];\n if (!b || b.type !== 'heading') return;\n const slug = slugify(mdRef.current.slice(b.contentFrom, b.to));\n try {\n void navigator.clipboard?.writeText('#' + slug);\n } catch {\n /* clipboard unavailable (permissions / insecure context) */\n }\n },\n [mdRef],\n );\n\n // A table cell / structural edit arrives as an already-scoped splice; apply it\n // to the current source and commit verbatim (TableGrid owns the range math).\n const handleTableChange = React.useCallback(\n (change: DocChange) => {\n const src = mdRef.current;\n const next = src.slice(0, change.from) + change.insert + src.slice(change.to);\n if (next !== src) {\n commitValue(next, { from: change.from, to: change.to, insert: change.insert });\n mdRef.current = next;\n }\n },\n [mdRef, commitValue],\n );\n\n const commit = React.useCallback((): { next: string; change: DocChange | null } => {\n const a = activeRef.current;\n const src = mdRef.current;\n activeRef.current = null;\n setActive(null);\n if (a === null) return { next: src, change: null };\n const b = parse(src, parseOpts).children[a];\n if (!b) return { next: src, change: null };\n const next = src.slice(0, b.from) + draftRef.current + src.slice(b.to);\n const change: DocChange = { from: b.from, to: b.to, insert: draftRef.current };\n if (next !== src) commitValue(next, change);\n mdRef.current = next; // keep the ref consistent for an immediate re-activation\n return { next, change };\n }, [mdRef, commitValue, parseOpts]);\n\n // Activate the block the user clicked (identified by its source OFFSET) after\n // committing any in-progress edit — the offset is mapped through that commit so\n // a block-count-changing edit can never target the wrong block (data-loss bug).\n const activate = React.useCallback(\n (clickedFrom: number) => {\n if (readOnly) return;\n captureFlip();\n const { next, change } = commit();\n let mapped = clickedFrom;\n if (change && clickedFrom >= change.to) {\n mapped = clickedFrom + (change.insert.length - (change.to - change.from));\n }\n const nextBlocks = parse(next, parseOpts).children;\n let idx = nextBlocks.findIndex((bl) => mapped >= bl.from && mapped < bl.to);\n if (idx < 0) idx = nextBlocks.findIndex((bl) => bl.from === mapped);\n const b = nextBlocks[idx];\n if (b) {\n const d = next.slice(b.from, b.to);\n draftRef.current = d;\n setDraft(d);\n activeRef.current = idx;\n setActive(idx);\n }\n },\n [commit, readOnly, captureFlip, parseOpts],\n );\n\n // Resolve the folded heading KEYS to the CURRENT block indices each render.\n // This is what makes a fold survive edits: after blocks shift, each stored key\n // re-anchors to its heading's new index (and a key whose heading was deleted\n // simply resolves to nothing), so the same section stays folded — never a\n // sibling. A pure memo (no effect/setState), so it can't loop or clobber an\n // active edit.\n const foldedHeadings = React.useMemo(() => {\n const set = new Set<number>();\n if (!foldingEnabled) return set;\n headingKeyMap(blocks, md).forEach((key, idx) => {\n if (folds.has(key)) set.add(idx);\n });\n return set;\n }, [blocks, md, folds, foldingEnabled]);\n\n // which block indices are hidden by a folded ancestor heading\n const hidden = React.useMemo(() => {\n const set = new Set<number>();\n if (!foldingEnabled) return set;\n for (let i = 0; i < blocks.length; i++) {\n const b = blocks[i]!;\n if (b.type === 'heading' && foldedHeadings.has(i)) {\n for (let j = i + 1; j < blocks.length; j++) {\n const n = blocks[j]!;\n if (n.type === 'heading' && n.level <= b.level) break;\n set.add(j);\n }\n }\n }\n return set;\n }, [blocks, foldedHeadings, foldingEnabled]);\n\n /* --- Block-level viewport virtualization (large docs only, IJ3) ------ */\n // The list of rows actually rendered (folded blocks excluded, as before).\n const visible = React.useMemo(() => {\n const arr: { b: Block; i: number }[] = [];\n for (let i = 0; i < blocks.length; i++) if (!hidden.has(i)) arr.push({ b: blocks[i]!, i });\n return arr;\n }, [blocks, hidden]);\n const virtualize = visible.length > VIRT_THRESHOLD;\n\n // `overscan` is interpreted as a count of blocks, converted to px via the\n // default block-height estimate. Default: VIRT_OVERSCAN_BLOCKS blocks/edge.\n const overscanPx = Math.max(overscan ?? VIRT_OVERSCAN_BLOCKS, 0) * VIRT_EST_BLOCK;\n\n // Measured row heights, keyed by block source offset (stable while scrolling an\n // unedited region); unmeasured blocks fall back to VIRT_EST_BLOCK.\n const heights = React.useRef<Map<number, number>>(new Map());\n const heightOf = (b: Block): number => heights.current.get(b.from) ?? VIRT_EST_BLOCK;\n\n const virtInnerRef = React.useRef<HTMLDivElement | null>(null);\n const virtScrollRef = React.useRef<HTMLDivElement | null>(null);\n const scrollerRef = React.useRef<HTMLElement | null>(null);\n const [ownScroller, setOwnScroller] = React.useState(false);\n const [range, setRange] = React.useState<{ start: number; end: number }>({ start: 0, end: 0 });\n\n const computeRange = (): { start: number; end: number } => {\n const n = visible.length;\n const scroller = scrollerRef.current;\n const content = virtInnerRef.current;\n if (!scroller || !content || n === 0) return { start: 0, end: Math.min(n, VIRT_INITIAL) };\n const scRect = scroller.getBoundingClientRect();\n const coRect = content.getBoundingClientRect();\n // Offset of the rows-content top within the scroller's scrollable content\n // (constant regardless of scroll position).\n const contentOffset = scroller.scrollTop + (coRect.top - scRect.top);\n const winTop = scroller.scrollTop - contentOffset - overscanPx;\n const winBottom = scroller.scrollTop - contentOffset + scroller.clientHeight + overscanPx;\n let cum = 0;\n let start = -1;\n let end = 0;\n for (let k = 0; k < n; k++) {\n const top = cum;\n const bottom = cum + heightOf(visible[k]!.b);\n if (bottom > winTop && top < winBottom) {\n if (start < 0) start = k;\n end = k + 1;\n }\n cum = bottom;\n if (top >= winBottom) break;\n }\n if (start < 0) { start = 0; end = 0; }\n // The block being edited must always stay mounted so its commit is never\n // lost, even if the user scrolled it out of view.\n const a = activeRef.current;\n if (a !== null) {\n const av = visible.findIndex((v) => v.i === a);\n if (av >= 0) {\n if (av < start) start = av;\n if (av + 1 > end) end = av + 1;\n }\n }\n return { start, end };\n };\n const computeRangeRef = React.useRef(computeRange);\n computeRangeRef.current = computeRange;\n\n const setRangeIfChanged = React.useCallback((r: { start: number; end: number }) => {\n setRange((prev) => (prev.start === r.start && prev.end === r.end ? prev : r));\n }, []);\n\n // Resolve the scroll container (a host-provided ancestor, else our own bounded\n // wrapper) and keep the window in sync with scroll + resize (rAF-throttled).\n React.useLayoutEffect(() => {\n if (!virtualize) return;\n const content = virtInnerRef.current;\n if (!content) return;\n let scroller: HTMLElement | null;\n if (ownScroller) {\n scroller = virtScrollRef.current;\n } else {\n scroller = getScrollParent(content);\n if (!scroller) { setOwnScroller(true); return; }\n }\n if (!scroller) return;\n scrollerRef.current = scroller;\n let raf = 0;\n const onScroll = (): void => {\n if (raf) return;\n raf = requestAnimationFrame(() => { raf = 0; setRangeIfChanged(computeRangeRef.current()); });\n };\n scroller.addEventListener('scroll', onScroll, { passive: true });\n const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(onScroll) : null;\n ro?.observe(scroller);\n if (typeof window !== 'undefined') window.addEventListener('resize', onScroll);\n setRangeIfChanged(computeRangeRef.current());\n return () => {\n scroller.removeEventListener('scroll', onScroll);\n ro?.disconnect();\n if (typeof window !== 'undefined') window.removeEventListener('resize', onScroll);\n if (raf) cancelAnimationFrame(raf);\n };\n }, [virtualize, ownScroller, setRangeIfChanged]);\n\n // After every render, measure mounted rows into the height cache and re-derive\n // the window (guarded so it converges without looping) — covers content/fold\n // changes, and refines estimates as real heights become known.\n React.useLayoutEffect(() => {\n if (!virtualize) return;\n rowEls.current.forEach((el, idx) => {\n const b = blocks[idx];\n if (!b) return;\n const h = el.offsetHeight;\n if (h > 0) heights.current.set(b.from, h);\n });\n setRangeIfChanged(computeRangeRef.current());\n });\n\n // Notify the parent when the visible set changes, so comment decorations\n // re-apply to newly-mounted blocks (no-op when comments/presence are off).\n React.useLayoutEffect(() => {\n if (virtualize) onVisibleChange?.();\n }, [range.start, range.end, virtualize, onVisibleChange]);\n\n if (readOnly && !md.trim()) {\n return (\n <div className={rootClass} style={style} data-typewright=\"unified\" ref={contentRef}>\n <p className=\"tw-placeholder\">{placeholder}</p>\n </div>\n );\n }\n // empty doc, or the user is typing into a fresh doc: edit the whole source\n // until they blur, then fall back to the block-rendered view.\n if (!md.trim() || typing) {\n return (\n <div className={rootClass} style={style} data-typewright=\"unified\" ref={contentRef}>\n {toolbar}\n <SourceArea\n value={md}\n full\n placeholder={placeholder}\n register={register}\n bindings={bindings}\n commentBase={commentsActive ? 0 : undefined}\n onCommentSelect={commentsActive ? onCommentSelect : undefined}\n onFocus={() => setTyping(true)}\n onBlur={() => setTyping(false)}\n onChange={(next, change) => commitValue(next, change)}\n />\n </div>\n );\n }\n\n const renderRow = (i: number, b: Block): React.ReactElement => {\n const isHeading = b.type === 'heading';\n const folded = isHeading && foldedHeadings.has(i);\n // Executable islands (MDX / Mermaid) render read-only in unified/preview —\n // like tables, they are NOT click-to-edit source; the raw source is\n // reached in `edit` mode. Null unless the host wired the extension up.\n const islandEl = renderIsland(b, islands);\n return (\n <div\n className=\"tw-row\"\n key={`${i}-${b.from}`}\n data-block-type={b.type}\n ref={(el) => {\n if (el) rowEls.current.set(i, el);\n else rowEls.current.delete(i);\n }}\n >\n {foldingEnabled && b.type === 'heading' && !readOnly && showGutter && (\n <>\n {/* Chevron: the fast path — a plain click toggles this section's fold. */}\n <button\n type=\"button\"\n className={`tw-fold${folded ? ' tw-folded' : ''}`}\n aria-label={folded ? 'Unfold section' : 'Fold section'}\n aria-expanded={!folded}\n onClick={() => toggleFold(i)}\n >\n <svg viewBox=\"0 0 24 24\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n {/* Options affordance: opens the heading FoldMenu (level, fold-all, copy link). */}\n <button\n type=\"button\"\n className=\"tw-fold-more\"\n aria-label=\"Heading options\"\n aria-haspopup=\"menu\"\n aria-expanded={foldMenuFor === i}\n onClick={(e) => {\n setFoldMenuRect(e.currentTarget.getBoundingClientRect());\n setFoldMenuFor(i);\n }}\n >\n <svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"currentColor\" stroke=\"none\" aria-hidden=\"true\">\n <circle cx=\"5\" cy=\"12\" r=\"1.7\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.7\" />\n <circle cx=\"19\" cy=\"12\" r=\"1.7\" />\n </svg>\n </button>\n {foldMenuFor === i && (\n <FoldMenu\n open\n level={b.level}\n folded={folded}\n anchorRect={foldMenuRect}\n onSetLevel={(n) => setHeadingLevel(i, n)}\n onToggleFold={() => toggleFold(i)}\n onFoldAll={foldAll}\n onUnfoldAll={unfoldAll}\n onCopyLink={() => copyHeadingLink(i)}\n onClose={() => setFoldMenuFor(null)}\n />\n )}\n </>\n )}\n {active === i && !readOnly ? (\n <SourceArea\n value={draft}\n autoFocus\n register={register}\n bindings={bindings}\n commentBase={commentsActive ? b.from : undefined}\n onCommentSelect={commentsActive ? onCommentSelect : undefined}\n onChange={(next) => setDraft(next)}\n onBlur={() => { captureFlip(); commit(); }}\n onEscape={() => { captureFlip(); commit(); }}\n />\n ) : islandEl ? (\n islandEl\n ) : b.type === 'table' && !readOnly ? (\n // A table is edited in its grid, not via a click-to-reveal source\n // textarea; the grid emits already-scoped splices we apply verbatim.\n <TableGrid table={b} source={mdRef.current} onChange={handleTableChange} readOnly={readOnly} />\n ) : caretReveal && isCaretEligible(b) ? (\n // Caret-level reveal (SPEC §5.2): edited in place via a managed\n // contentEditable that emits scoped splices — same commit path as\n // the table grid (apply the splice + commit → anchors/folds/parse\n // all keep working). Opt-in; never on the default block path.\n <CaretRevealBlock block={b} source={mdRef.current} onChange={handleTableChange} readOnly={readOnly} />\n ) : (() => {\n // Sanitized, a11y-hardened block HTML (task checkboxes labelled).\n const html = withA11yHints(renderNode(b, renderOpts));\n // A block whose content already holds a focusable control (link /\n // task checkbox) must NOT also be a role=\"button\" wrapper — that\n // nests interactive controls. Such blocks stay keyboard-operable\n // (tabindex + Enter/Space) but without the button role.\n const hasInteractive = HAS_INTERACTIVE_HTML.test(html);\n return (\n <div\n className=\"tw-block\"\n role={readOnly || hasInteractive ? undefined : 'button'}\n aria-label={!readOnly && hasInteractive ? 'Edit block source' : undefined}\n tabIndex={readOnly ? undefined : 0}\n data-tw-from={b.from}\n data-tw-to={b.to}\n onMouseDown={(e) => {\n if (readOnly) return;\n // When comments are active, let the browser start a native\n // selection (drag → Comment popup); a plain click still\n // reveals the source (handled in onClick below).\n if (commentsActive) return;\n e.preventDefault();\n activate(b.from);\n }}\n onClick={() => {\n if (readOnly || !commentsActive) return;\n const sel = window.getSelection();\n if (sel && !sel.isCollapsed && sel.toString().trim()) return; // drag-select → comment\n activate(b.from);\n }}\n onKeyDown={(e) => {\n if (!readOnly && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n activate(b.from);\n }\n }}\n // sanitized by render.ts\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n })()}\n {folded && (\n <button type=\"button\" className=\"tw-foldchip\" onClick={() => toggleFold(i)}>\n … {foldedSummary(blocks, i)}\n </button>\n )}\n </div>\n );\n };\n\n // Small doc: render exactly as before (no wrapper, no spacers).\n if (!virtualize) {\n return (\n <div className={rootClass} style={style} data-typewright=\"unified\" ref={contentRef}>\n {toolbar}\n {blocks.map((b, i) => (hidden.has(i) ? null : renderRow(i, b)))}\n </div>\n );\n }\n\n // Large doc: mount only the windowed run; reserve the rest with spacers.\n const start = Math.min(range.start, visible.length);\n const end = Math.min(range.end, visible.length);\n let topPx = 0;\n for (let k = 0; k < start; k++) topPx += heightOf(visible[k]!.b);\n let bottomPx = 0;\n for (let k = end; k < visible.length; k++) bottomPx += heightOf(visible[k]!.b);\n\n return (\n <div className={rootClass} style={style} data-typewright=\"unified\" ref={contentRef}>\n {toolbar}\n <div\n ref={virtScrollRef}\n className={ownScroller ? 'tw-virt-scroll' : undefined}\n style={ownScroller ? { overflow: 'auto', maxHeight: '70vh' } : undefined}\n >\n <div ref={virtInnerRef} className=\"tw-virt-content\">\n <div className=\"tw-virt-spacer\" aria-hidden=\"true\" style={{ height: topPx }} />\n {visible.slice(start, end).map(({ b, i }) => renderRow(i, b))}\n <div className=\"tw-virt-spacer\" aria-hidden=\"true\" style={{ height: bottomPx }} />\n </div>\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ *\n * Fold persistence — keyed by heading (stable across edits), not index\n * ------------------------------------------------------------------ */\n\nconst FOLD_STORE_PREFIX = 'typewright-folds:';\n\n/** GitHub-style heading slug: lowercase, spaces→`-`, drop non-alphanumeric-except-hyphen. */\nfunction slugify(text: string): string {\n return text.trim().toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n}\n\n/**\n * Block index → a stable persistence key for every heading. The key is the\n * heading's slug, disambiguated GitHub-style (`slug`, `slug-1`, …) when two\n * headings share a slug, so a folded set re-anchors to the right rows on reload\n * even though raw offsets/indices drift across edits.\n */\nexport function headingKeyMap(blocks: readonly Block[], src: string): Map<number, string> {\n const seen = new Map<string, number>();\n const out = new Map<number, string>();\n blocks.forEach((b, i) => {\n if (b.type !== 'heading') return;\n const base = slugify(src.slice(b.contentFrom, b.to)) || 'section';\n const n = seen.get(base) ?? 0;\n seen.set(base, n + 1);\n out.set(i, n === 0 ? base : `${base}-${n}`);\n });\n return out;\n}\n\n/** Load the persisted folded heading keys for `persistKey` (stable across edits). */\nfunction loadFoldSet(persistKey: string): Set<string> {\n const set = new Set<string>();\n if (typeof window === 'undefined') return set;\n let raw: string | null = null;\n try {\n raw = window.localStorage.getItem(FOLD_STORE_PREFIX + persistKey);\n } catch {\n return set;\n }\n if (!raw) return set;\n let keys: unknown;\n try {\n keys = JSON.parse(raw);\n } catch {\n return set;\n }\n if (!Array.isArray(keys)) return set;\n for (const k of keys) if (typeof k === 'string') set.add(k);\n return set;\n}\n\n/** Persist the folded heading keys under `persistKey`. */\nfunction saveFoldSet(persistKey: string, folds: Set<string>): void {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(FOLD_STORE_PREFIX + persistKey, JSON.stringify([...folds]));\n } catch {\n /* storage unavailable (private mode / quota) — folding still works in-session */\n }\n}\n\nfunction foldedSummary(blocks: readonly { type: string; level?: number }[], idx: number): string {\n const b = blocks[idx] as { level: number };\n let lines = 0;\n let subs = 0;\n for (let j = idx + 1; j < blocks.length; j++) {\n const n = blocks[j]!;\n if (n.type === 'heading' && (n as { level: number }).level <= b.level) break;\n if (n.type === 'heading') subs++;\n lines++;\n }\n return `${lines} block${lines === 1 ? '' : 's'}${subs ? ` · ${subs} subsection${subs === 1 ? '' : 's'}` : ''}`;\n}\n\n/* ------------------------------------------------------------------ *\n * Source textarea (edit mode + unified active block)\n * ------------------------------------------------------------------ */\n\ninterface SourceAreaProps {\n value: string;\n onChange: (value: string, change: DocChange) => void;\n onBlur?: () => void;\n onEscape?: () => void;\n onFocus?: () => void;\n onSelect?: (sel: import('../types').DocSelection) => void;\n autoFocus?: boolean;\n readOnly?: boolean;\n placeholder?: string;\n full?: boolean;\n register?: (api: ActiveSource | null) => void;\n /** Active keyboard shortcuts (canonical binding → command). */\n bindings?: Map<string, Command>;\n /** Document offset this textarea's local offset 0 maps to (for comment anchors). */\n commentBase?: number;\n /** Report a non-empty selection (document offsets) for the Comment popup. */\n onCommentSelect?: (docFrom: number, docTo: number, quote: string) => void;\n}\n\nfunction SourceArea(props: SourceAreaProps): React.ReactElement {\n const { value, onChange, onBlur, onEscape, onFocus, onSelect, autoFocus, readOnly, placeholder, full, register, bindings, commentBase, onCommentSelect } = props;\n const ref = React.useRef<HTMLTextAreaElement>(null);\n const pendingSel = React.useRef<[number, number] | null>(null);\n\n const apply = React.useCallback(\n (cmd: Command) => {\n const el = ref.current;\n if (!el) return;\n const val = el.value;\n const r = applyCommand(val, { from: el.selectionStart, to: el.selectionEnd }, cmd);\n pendingSel.current = [r.selection.from, r.selection.to];\n onChange(r.text, { from: 0, to: val.length, insert: r.text });\n },\n [onChange],\n );\n\n React.useEffect(() => {\n if (pendingSel.current && ref.current) {\n ref.current.selectionStart = pendingSel.current[0];\n ref.current.selectionEnd = pendingSel.current[1];\n pendingSel.current = null;\n }\n });\n\n const autoGrow = (el: HTMLTextAreaElement): void => {\n if (full) return;\n el.style.height = 'auto';\n el.style.height = `${el.scrollHeight}px`;\n };\n\n return (\n <textarea\n ref={ref}\n className={`tw-source${full ? ' tw-source-full' : ''}`}\n value={value}\n placeholder={placeholder}\n readOnly={readOnly}\n autoFocus={autoFocus}\n spellCheck={false}\n rows={full ? undefined : 1}\n onChange={(e) => {\n onChange(e.target.value, { from: 0, to: value.length, insert: e.target.value });\n autoGrow(e.currentTarget);\n }}\n onFocus={(e) => {\n autoGrow(e.currentTarget);\n onFocus?.();\n register?.({ apply });\n }}\n onBlur={() => {\n // Keep the last-focused source registered on blur: a focus-stealing\n // surface (the ⌘K command palette) must still be able to apply a command\n // to this textarea's retained selection. The apply() closure guards on a\n // null ref, so a since-unmounted source is a safe no-op.\n onBlur?.();\n }}\n onSelect={(e) => {\n const el = e.currentTarget;\n const from = el.selectionStart;\n const to = el.selectionEnd;\n onSelect?.({ main: { from, to }, ranges: [{ from, to }] });\n if (onCommentSelect && commentBase !== undefined && from !== to) {\n onCommentSelect(commentBase + from, commentBase + to, el.value.slice(from, to));\n }\n }}\n onKeyDown={(e) => {\n if (e.key === 'Escape' && onEscape) {\n e.preventDefault();\n onEscape();\n return;\n }\n // Route shortcuts through the SAME toggle-aware applyCommand path the\n // toolbar uses, so ⌘B toggles (and un-toggles) instead of double-wrapping.\n const cmd = bindings?.get(eventCanon(e));\n if (cmd) {\n e.preventDefault();\n apply(cmd);\n }\n }}\n />\n );\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\n/* ------------------------------------------------------------------ *\n * Default styles (injected once; drop-in with no external CSS)\n * ------------------------------------------------------------------ */\n\nconst TYPEWRIGHT_CSS = `\n.tw-editor { --tw-fg:#1a1d20; --tw-muted:#5a6169; --tw-faint:#8b929a; --tw-bg:#ffffff; --tw-chip:#f0f1f3; --tw-line:rgba(18,22,27,.1); --tw-accent:#2f6fed; --tw-accent-soft:rgba(47,111,237,.1); --tw-code-bg:#f6f7f9; font-family:-apple-system,\"SF Pro Text\",system-ui,sans-serif; color:var(--tw-fg); line-height:1.6; font-size:15px; }\n@media (prefers-color-scheme: dark) { .tw-editor:not(.tw-theme-light) { --tw-fg:#e8eaed; --tw-muted:#a3abb2; --tw-faint:#6a727a; --tw-bg:#0f1215; --tw-chip:#1e242b; --tw-line:rgba(255,255,255,.1); --tw-accent:#6ea3ff; --tw-accent-soft:rgba(110,163,255,.14); --tw-code-bg:#13171b; } }\n.tw-editor.tw-theme-dark { --tw-fg:#e8eaed; --tw-muted:#a3abb2; --tw-faint:#6a727a; --tw-bg:#0f1215; --tw-chip:#1e242b; --tw-line:rgba(255,255,255,.1); --tw-accent:#6ea3ff; --tw-accent-soft:rgba(110,163,255,.14); --tw-code-bg:#13171b; }\n.tw-editor { background:var(--tw-bg); border-radius:10px; }\n.tw-editor h1,.tw-editor h2,.tw-editor h3,.tw-editor h4,.tw-editor h5,.tw-editor h6 { font-weight:680; letter-spacing:-.02em; margin:.7em 0 .3em; line-height:1.25; }\n.tw-editor h1{font-size:1.8em} .tw-editor h2{font-size:1.45em} .tw-editor h3{font-size:1.2em} .tw-editor h4{font-size:1.05em}\n.tw-editor p{margin:.5em 0} .tw-editor ul,.tw-editor ol{margin:.4em 0; padding-left:1.5em} .tw-editor li{margin:.15em 0}\n.tw-editor a{color:var(--tw-accent); text-decoration:none; border-bottom:1px solid var(--tw-accent-soft)}\n.tw-editor code{font-family:\"SF Mono\",ui-monospace,Menlo,monospace; font-size:.88em; background:var(--tw-chip); border:1px solid var(--tw-line); border-radius:5px; padding:1px 5px}\n.tw-editor pre{background:var(--tw-code-bg); border:1px solid var(--tw-line); border-radius:9px; padding:12px 14px; overflow-x:auto; margin:.6em 0}\n.tw-editor pre code{background:none; border:0; padding:0; font-size:13px; line-height:1.55}\n.tw-editor blockquote{border-left:3px solid var(--tw-line); margin:.6em 0; padding:.1em 0 .1em 14px; color:var(--tw-muted)}\n.tw-editor table{border-collapse:collapse; margin:.6em 0; font-size:.95em} .tw-editor th,.tw-editor td{border:1px solid var(--tw-line); padding:6px 12px} .tw-editor th{background:var(--tw-chip)}\n.tw-editor hr{border:0; border-top:1px solid var(--tw-line); margin:1em 0}\n.tw-editor img{max-width:100%}\n.tw-editor input[type=checkbox]{margin-right:6px; vertical-align:middle}\n.tw-placeholder{color:var(--tw-faint)}\n.tw-mode-preview,.tw-mode-read,.tw-mode-unified{padding:14px 18px}\n.tw-mode-edit{padding:0}\n.tw-toolbar{display:flex; align-items:center; justify-content:center; gap:3px; flex-wrap:wrap; padding:5px 7px; margin-bottom:9px; border:1px solid var(--tw-line); border-radius:12px; background:color-mix(in srgb, var(--tw-bg) 80%, transparent); backdrop-filter:blur(18px) saturate(1.6); -webkit-backdrop-filter:blur(18px) saturate(1.6); position:sticky; top:0; z-index:5; box-shadow:0 4px 14px -8px rgba(0,0,0,.3), inset 0 1px 0 rgba(255,255,255,.06)}\n.tw-toolbar-floating{max-height:0; padding-top:0; padding-bottom:0; margin-bottom:0; opacity:0; overflow:hidden; border-color:transparent; box-shadow:none; transform:translateY(-7px); transition:max-height .28s cubic-bezier(.32,.72,0,1), opacity .2s, margin .28s cubic-bezier(.32,.72,0,1), padding .28s, transform .24s cubic-bezier(.32,.72,0,1)}\n.tw-editor:hover .tw-toolbar-floating,.tw-editor:focus-within .tw-toolbar-floating{max-height:84px; padding-top:5px; padding-bottom:5px; margin-bottom:9px; opacity:1; border-color:var(--tw-line); box-shadow:0 4px 14px -8px rgba(0,0,0,.3), inset 0 1px 0 rgba(255,255,255,.06); transform:none}\n.tw-tb-sep{width:1px; height:18px; background:var(--tw-line); margin:0 3px}\n.tw-tb-btn{min-width:28px; height:28px; padding:0 7px; border:1px solid transparent; background:transparent; border-radius:7px; color:var(--tw-muted); font-size:13px; line-height:1; cursor:pointer; display:inline-flex; align-items:center; justify-content:center; transition:color .15s,background .15s}\n.tw-tb-btn:hover{color:var(--tw-fg); background:var(--tw-accent-soft)}\n.tw-tb-b{font-weight:800} .tw-tb-i{font-style:italic; font-family:Georgia,serif} .tw-tb-s{text-decoration:line-through}\n.tw-row{transition:transform .3s cubic-bezier(.32,.72,0,1)}\n@keyframes tw-stream-in{from{opacity:0; transform:translateY(7px)}to{opacity:1; transform:none}}\n.tw-streamblk.tw-stream-in{animation:tw-stream-in .3s cubic-bezier(.32,.72,0,1) both}\n.tw-row{position:relative; display:flex; align-items:flex-start; gap:2px}\n.tw-block{flex:1; min-width:0; border-radius:6px; cursor:text; padding:1px 4px; margin-left:-4px; transition:background .15s}\n.tw-mode-unified .tw-block:hover,.tw-mode-preview .tw-block:hover{background:var(--tw-accent-soft)}\n.tw-block:focus-visible{outline:2px solid var(--tw-accent); outline-offset:2px}\n.tw-block>:first-child{margin-top:.15em} .tw-block>:last-child{margin-bottom:.15em}\n.tw-fold{flex:none; width:20px; height:24px; margin-top:.35em; border:0; background:none; color:var(--tw-faint); border-radius:5px; display:grid; place-items:center; cursor:pointer; opacity:.55; transition:opacity .15s,color .15s,transform .15s}\n.tw-fold:hover{opacity:1; color:var(--tw-accent)} .tw-fold.tw-folded svg{transform:rotate(-90deg)}\n.tw-fold-more{flex:none; width:18px; height:24px; margin-top:.35em; border:0; background:none; color:var(--tw-faint); border-radius:5px; display:grid; place-items:center; cursor:pointer; opacity:0; transition:opacity .15s,color .15s}\n.tw-row:hover .tw-fold-more,.tw-fold-more:focus-visible,.tw-fold-more[aria-expanded=\"true\"]{opacity:.6}\n.tw-fold-more:hover,.tw-fold-more[aria-expanded=\"true\"]{opacity:1; color:var(--tw-accent)}\n.tw-foldchip{margin-left:6px; font-size:12.5px; color:var(--tw-faint); background:none; border:1px dashed var(--tw-line); border-radius:7px; padding:2px 9px; cursor:pointer}\n.tw-foldchip:hover{color:var(--tw-muted); border-color:var(--tw-accent)}\n.tw-source{width:100%; box-sizing:border-box; font-family:\"SF Mono\",ui-monospace,Menlo,monospace; font-size:13.5px; line-height:1.6; color:var(--tw-fg); background:var(--tw-accent-soft); border:1px solid var(--tw-accent); border-radius:7px; padding:6px 9px; resize:none; outline:none}\n.tw-source-full{min-height:280px; height:100%; background:var(--tw-bg); border:0; border-radius:0; padding:16px 18px; font-size:14px}\n.tw-caret{display:inline-block; width:2px; height:1.05em; background:var(--tw-accent); vertical-align:text-bottom; margin-left:1px; border-radius:1px; animation:tw-blink 1.06s steps(1) infinite}\n@keyframes tw-blink{50%{opacity:0}}\n.tw-pending{opacity:.62; border-bottom:1.5px dashed var(--tw-accent); border-radius:1px}\n.tw-pending-strong{font-weight:680} .tw-pending-em{font-style:italic} .tw-pending-code{font-family:\"SF Mono\",ui-monospace,monospace}\n.tw-skeleton{border:1px solid var(--tw-line); border-radius:10px; padding:12px; margin:.6em 0; background:linear-gradient(100deg, var(--tw-chip) 30%, var(--tw-code-bg) 50%, var(--tw-chip) 70%); background-size:200% 100%; animation:tw-shimmer 1.3s infinite}\n.tw-skeleton-label{font-family:\"SF Mono\",ui-monospace,monospace; font-size:11px; color:var(--tw-accent)}\n.tw-skeleton-bar{height:8px; border-radius:4px; background:var(--tw-line); margin-top:9px} .tw-skeleton-bar.two{width:70%} .tw-skeleton-bar.three{width:45%}\n@keyframes tw-shimmer{to{background-position:-200% 0}}\n@media (prefers-reduced-motion: reduce){ .tw-caret,.tw-skeleton,.tw-streamblk.tw-stream-in,.tw-row{animation:none !important; transition:none !important} }\n.tw-editor .tw-tok-keyword{color:#cf222e} .tw-editor .tw-tok-string{color:#0a3069} .tw-editor .tw-tok-comment{color:#6e7781; font-style:italic} .tw-editor .tw-tok-number{color:#0550ae} .tw-editor .tw-tok-punct{color:var(--tw-muted)} .tw-editor .tw-tok-fn{color:#8250df} .tw-editor .tw-tok-type{color:#953800} .tw-editor .tw-tok-prop{color:#116329}\n@media (prefers-color-scheme: dark){ .tw-editor:not(.tw-theme-light) .tw-tok-keyword{color:#ff7b72} .tw-editor:not(.tw-theme-light) .tw-tok-string{color:#a5d6ff} .tw-editor:not(.tw-theme-light) .tw-tok-comment{color:#8b949e} .tw-editor:not(.tw-theme-light) .tw-tok-number{color:#79c0ff} .tw-editor:not(.tw-theme-light) .tw-tok-fn{color:#d2a8ff} .tw-editor:not(.tw-theme-light) .tw-tok-type{color:#ffa657} .tw-editor:not(.tw-theme-light) .tw-tok-prop{color:#7ee787} }\n.tw-editor.tw-theme-dark .tw-tok-keyword{color:#ff7b72} .tw-editor.tw-theme-dark .tw-tok-string{color:#a5d6ff} .tw-editor.tw-theme-dark .tw-tok-comment{color:#8b949e} .tw-editor.tw-theme-dark .tw-tok-number{color:#79c0ff} .tw-editor.tw-theme-dark .tw-tok-fn{color:#d2a8ff} .tw-editor.tw-theme-dark .tw-tok-type{color:#ffa657} .tw-editor.tw-theme-dark .tw-tok-prop{color:#7ee787}\n.tw-editor .tw-math-src{font-family:\"SF Mono\",ui-monospace,Menlo,monospace; font-size:.9em; background:var(--tw-code-bg); border:1px solid var(--tw-line); border-radius:5px; padding:1px 5px}\n.tw-editor div.tw-math-src{display:block; padding:8px 12px; margin:.6em 0; text-align:center; overflow-x:auto}\n.tw-editor .tw-footnotes{border-top:1px solid var(--tw-line); margin-top:1.4em; padding-top:.6em; font-size:.9em; color:var(--tw-muted)}\n.tw-editor .tw-fnref{font-size:.82em} .tw-editor .tw-fnref a{color:var(--tw-accent); border-bottom:0} .tw-editor .tw-fn-back{color:var(--tw-accent); border-bottom:0; margin-left:4px; text-decoration:none}\n.tw-editor dl{margin:.5em 0} .tw-editor dt{font-weight:680; margin-top:.4em} .tw-editor dd{margin:.15em 0 .35em 1.4em; color:var(--tw-muted)}\n/* ---- Collaboration: shell, comment highlights, presence, popup, composer ---- */\n.tw-editor-shell{ --tw-fg:#1a1d20; --tw-muted:#5a6169; --tw-faint:#8b929a; --tw-bg:#ffffff; --tw-chip:#f0f1f3; --tw-line:rgba(18,22,27,.1); --tw-accent:#2f6fed; --tw-accent-soft:rgba(47,111,237,.1); --tw-code-bg:#f6f7f9; position:relative; font-family:-apple-system,\"SF Pro Text\",system-ui,sans-serif }\n@media (prefers-color-scheme: dark){ .tw-editor-shell:not(.tw-theme-light){ --tw-fg:#e8eaed; --tw-muted:#a3abb2; --tw-faint:#6a727a; --tw-bg:#0f1215; --tw-chip:#1e242b; --tw-line:rgba(255,255,255,.1); --tw-accent:#6ea3ff; --tw-accent-soft:rgba(110,163,255,.14); --tw-code-bg:#13171b } }\n.tw-editor-shell.tw-theme-dark{ --tw-fg:#e8eaed; --tw-muted:#a3abb2; --tw-faint:#6a727a; --tw-bg:#0f1215; --tw-chip:#1e242b; --tw-line:rgba(255,255,255,.1); --tw-accent:#6ea3ff; --tw-accent-soft:rgba(110,163,255,.14); --tw-code-bg:#13171b }\n.tw-editor-shell.tw-comments-open>.tw-editor{margin-right:min(340px,82vw); transition:margin .26s cubic-bezier(.32,.72,0,1)}\n.tw-collab-bar{position:absolute; top:8px; right:10px; z-index:22; display:flex; align-items:center; gap:8px; pointer-events:none}\n.tw-collab-bar>*{pointer-events:auto}\n.tw-presence{display:flex; align-items:center}\n.tw-presence-av{width:26px; height:26px; border-radius:50%; display:grid; place-items:center; font-size:11px; font-weight:640; color:#0b0d0f; border:2px solid var(--tw-bg); margin-left:-7px; box-shadow:0 1px 3px rgba(0,0,0,.3)}\n.tw-presence-av:first-child{margin-left:0}\n.tw-comments-toggle{display:inline-flex; align-items:center; gap:6px; height:28px; padding:0 9px; border:1px solid var(--tw-line); border-radius:9px; background:color-mix(in srgb, var(--tw-bg) 82%, transparent); backdrop-filter:blur(16px) saturate(1.5); -webkit-backdrop-filter:blur(16px) saturate(1.5); color:var(--tw-muted); font:inherit; font-size:12.5px; cursor:pointer; transition:color .15s, border-color .15s, background .15s}\n.tw-comments-toggle:hover{color:var(--tw-fg); border-color:var(--tw-accent)}\n.tw-comments-toggle.tw-on{color:var(--tw-accent); border-color:var(--tw-accent); background:var(--tw-accent-soft)}\n.tw-comments-toggle:focus-visible{outline:2px solid var(--tw-accent); outline-offset:2px}\n.tw-comments-toggle svg{width:15px; height:15px; flex:none}\n.tw-comments-toggle-n{font-variant-numeric:tabular-nums; font-size:11px; font-weight:640; background:var(--tw-chip); border-radius:999px; padding:0 6px; line-height:1.6}\n.tw-settings-gear{display:inline-flex; align-items:center; justify-content:center; width:28px; height:28px; flex:none; border:1px solid var(--tw-line); border-radius:9px; background:color-mix(in srgb, var(--tw-bg) 82%, transparent); backdrop-filter:blur(16px) saturate(1.5); -webkit-backdrop-filter:blur(16px) saturate(1.5); color:var(--tw-muted); cursor:pointer; transition:color .15s, border-color .15s, background .15s}\n.tw-settings-gear:hover{color:var(--tw-fg); border-color:var(--tw-accent)}\n.tw-settings-gear.tw-on{color:var(--tw-accent); border-color:var(--tw-accent); background:var(--tw-accent-soft)}\n.tw-settings-gear:focus-visible{outline:2px solid var(--tw-accent); outline-offset:2px}\n.tw-settings-gear svg{width:15px; height:15px; flex:none}\n.tw-comment{background:var(--tw-accent-soft); border-bottom:2px solid var(--tw-accent); border-radius:3px; padding:0 1px; cursor:pointer}\n.tw-comment:hover{background:color-mix(in srgb, var(--tw-accent) 24%, transparent)}\n@keyframes tw-comment-hl-flash{0%,100%{background:var(--tw-accent-soft)} 25%,70%{background:color-mix(in srgb, var(--tw-accent) 38%, transparent)}}\n.tw-comment-flash{animation:tw-comment-hl-flash 1.4s ease}\n.tw-remote-cursor{position:relative; display:inline-block; width:0; border-left:2px solid var(--tw-remote, var(--tw-accent)); margin:0 -1px; vertical-align:text-bottom; height:1.05em}\n.tw-remote-flag{position:absolute; top:-1.15em; left:-1px; white-space:nowrap; font-size:9.5px; line-height:1.3; font-weight:640; color:#0b0d0f; background:var(--tw-remote, var(--tw-accent)); border-radius:4px 4px 4px 0; padding:0 4px; opacity:0; transform:translateY(2px); transition:opacity .15s, transform .15s; pointer-events:none}\n.tw-remote-cursor:hover .tw-remote-flag{opacity:1; transform:none}\n.tw-selpop{position:fixed; z-index:120; display:flex; align-items:center; gap:3px; padding:4px; background:color-mix(in srgb, var(--tw-bg) 86%, transparent); backdrop-filter:blur(22px) saturate(1.7); -webkit-backdrop-filter:blur(22px) saturate(1.7); border:1px solid var(--tw-line); border-radius:11px; box-shadow:0 12px 34px -10px rgba(0,0,0,.45), inset 0 1px 0 rgba(255,255,255,.06); opacity:0; transform:translateY(4px); transition:opacity .14s, transform .14s cubic-bezier(.32,.72,0,1)}\n.tw-selpop.show{opacity:1; transform:none}\n.tw-selpop-btn{height:27px; padding:0 10px; border:0; border-radius:8px; background:transparent; color:var(--tw-accent); font:inherit; font-size:12.5px; font-weight:560; cursor:pointer; white-space:nowrap}\n.tw-selpop-btn:hover{background:var(--tw-accent-soft)}\n.tw-composer{position:fixed; z-index:121; width:268px; padding:10px; background:color-mix(in srgb, var(--tw-bg) 90%, transparent); backdrop-filter:blur(22px) saturate(1.7); -webkit-backdrop-filter:blur(22px) saturate(1.7); border:1px solid var(--tw-line); border-radius:13px; box-shadow:0 20px 48px -12px rgba(0,0,0,.5), inset 0 1px 0 rgba(255,255,255,.06); color:var(--tw-fg); opacity:0; transform:translateY(6px) scale(.98); transition:opacity .16s, transform .16s cubic-bezier(.32,.72,0,1)}\n.tw-composer.show{opacity:1; transform:none}\n.tw-composer-quote{font-size:11.5px; color:var(--tw-muted); font-style:italic; border-left:2px solid var(--tw-accent-soft); padding-left:7px; margin-bottom:8px; overflow-wrap:anywhere}\n.tw-composer textarea{width:100%; box-sizing:border-box; height:62px; resize:none; background:var(--tw-bg); border:1px solid var(--tw-line); border-radius:9px; padding:8px 9px; font:inherit; font-size:13px; color:var(--tw-fg); outline:none; transition:border-color .15s}\n.tw-composer textarea:focus{border-color:var(--tw-accent)}\n.tw-composer textarea::placeholder{color:var(--tw-faint)}\n.tw-composer-row{display:flex; justify-content:flex-end; gap:6px; margin-top:8px}\n.tw-composer-btn{border:1px solid var(--tw-line); background:var(--tw-chip); color:var(--tw-muted); border-radius:8px; padding:5px 11px; font:inherit; font-size:12px; cursor:pointer; transition:color .15s, border-color .15s, background .15s}\n.tw-composer-btn:hover{color:var(--tw-fg); border-color:var(--tw-accent)}\n.tw-composer-btn:focus-visible{outline:2px solid var(--tw-accent); outline-offset:2px}\n.tw-composer-primary{background:var(--tw-accent); border-color:var(--tw-accent); color:#fff}\n.tw-composer-primary:hover{color:#fff; filter:brightness(1.06)}\n.tw-composer-btn:disabled{opacity:.5; cursor:default}\n@media (prefers-reduced-transparency: reduce){ .tw-selpop,.tw-composer,.tw-comments-toggle,.tw-settings-gear{backdrop-filter:none; -webkit-backdrop-filter:none; background:var(--tw-bg)} }\n@media (prefers-reduced-motion: reduce){ .tw-selpop,.tw-composer,.tw-comment-flash,.tw-editor-shell.tw-comments-open>.tw-editor{animation:none !important; transition:none !important} }\n`;\n","/**\n * Anticipatory streaming renderer (SPEC.md §8).\n *\n * Given a PARTIAL Markdown string (as it arrives token-by-token from an LLM),\n * render the confirmed prefix richly via the real parser/renderer, and\n * optimistically resolve the trailing incomplete construct — an unterminated\n * `**bo` renders as in-progress bold, an open ``` opens a code block, a forming\n * `<Comp` shows a component skeleton — so the preview reads as finished prose\n * while it is still streaming. Confirmed content is never reflowed.\n *\n * Open-delimiter detection is PARITY based (an odd number of a delimiter on the\n * active line means the last one is unclosed) so a completed span is never\n * mistaken for an open one.\n */\n\nimport { parse } from '../core/parser';\nimport { renderToHtml, renderInline } from '../core/render';\nimport type { AnticipationOptions } from '../types';\n\nexport interface AnticipateResult {\n /** Sanitized HTML for the current partial (safe to inject — render.ts escapes). */\n html: string;\n /** Which constructs are currently being anticipated (e.g. ['strong']). */\n pending: string[];\n}\n\ntype Opt = Required<AnticipationOptions>;\n\nfunction normalizeOpt(o: AnticipationOptions | boolean): Opt {\n const all = (v: boolean): Opt => ({\n emphasis: v, strong: v, code: v, strikethrough: v, links: v,\n headings: v, fences: v, listItems: v, tables: v, jsx: v,\n });\n if (o === true || o === undefined) return all(true);\n if (o === false) return all(false);\n return { ...all(true), ...o };\n}\n\nfunction esc(s: string): string {\n // escapes text AND attribute values (the fence language class, component name),\n // so `\"`/`'` must be escaped too — this is a security boundary.\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n/** Inline HTML for a single line via the real renderer (no <p> wrapper). */\nfunction inlineHtml(text: string): string {\n const doc = parse(text);\n const first = doc.children[0];\n if (first && (first.type === 'paragraph' || first.type === 'heading')) {\n return renderInline(first.children);\n }\n return esc(text);\n}\n\nconst CARET = '<span class=\"tw-caret\" aria-hidden=\"true\"></span>';\n\ninterface OpenRun {\n kind: string;\n tag: string;\n cls: string;\n /** Offset of the opening delimiter within the line. */\n opener: number;\n /** Delimiter length. */\n dl: number;\n}\n\nfunction indexesOf(line: string, sub: string): number[] {\n const out: number[] = [];\n let i = line.indexOf(sub);\n while (i >= 0) {\n out.push(i);\n i = line.indexOf(sub, i + sub.length);\n }\n return out;\n}\n\n/**\n * Offset of the `[` opening a still-forming link on the line, or null.\n *\n * Forming = an unclosed `[text…` (no `]` yet) OR a `[text](url…` whose\n * destination is still open (no closing `)`). A completed `[text](url)` — or a\n * bare closed `[text]` not followed by `(` — is NOT forming, so a finished link\n * is never mistaken for an open one (the STABILITY RULE).\n */\nfunction findOpenLink(line: string): number | null {\n const bi = line.lastIndexOf('[');\n if (bi < 0) return null;\n const rest = line.slice(bi);\n if (!rest.includes(']')) return bi; // \"[text…\"\n if (/^\\[[^\\]]*\\]\\([^)]*$/.test(rest)) return bi; // \"[text](url…\"\n return null;\n}\n\n/**\n * Push the trailing lone-`ch` emphasis run when its parity is odd. The doubled\n * `strong` form (`**`/`__`) is masked with an EQUAL-LENGTH sentinel first, so\n * strong pairs never count as emphasis while the surviving delimiter offsets\n * still line up with the original line (a plain strip would shift them).\n */\nfunction pushEmphasis(line: string, ch: string, dbl: string, cands: OpenRun[]): void {\n const masked = line.split(dbl).join('\u0001\u0001');\n const idx: number[] = [];\n for (let i = 0; i < masked.length; i++) if (masked[i] === ch) idx.push(i);\n if (idx.length % 2 === 1) {\n cands.push({ kind: 'emphasis', tag: 'em', cls: 'tw-pending tw-pending-em', opener: idx[idx.length - 1]!, dl: 1 });\n }\n}\n\n/** Find the OUTERMOST unclosed inline delimiter on a line, or null. */\nfunction findOpenRun(line: string, opt: Opt): OpenRun | null {\n const cands: OpenRun[] = [];\n\n if (opt.strong) {\n const x = indexesOf(line, '**');\n if (x.length % 2 === 1) cands.push({ kind: 'strong', tag: 'strong', cls: 'tw-pending tw-pending-strong', opener: x[x.length - 1]!, dl: 2 });\n }\n if (opt.strikethrough) {\n const x = indexesOf(line, '~~');\n if (x.length % 2 === 1) cands.push({ kind: 'strikethrough', tag: 'del', cls: 'tw-pending tw-pending-del', opener: x[x.length - 1]!, dl: 2 });\n }\n if (opt.code) {\n // ignore ``` fence runs — those are code-block markers, not inline code\n const ticks: number[] = [];\n for (const m of line.matchAll(/`+/g)) {\n if (m[0].length >= 3) continue;\n for (let k = 0; k < m[0].length; k++) ticks.push(m.index + k);\n }\n if (ticks.length % 2 === 1) cands.push({ kind: 'code', tag: 'code', cls: 'tw-pending tw-pending-code', opener: ticks[ticks.length - 1]!, dl: 1 });\n }\n if (opt.links) {\n const li = findOpenLink(line);\n if (li !== null) cands.push({ kind: 'link', tag: 'a', cls: 'tw-pending tw-pending-link', opener: li, dl: 1 });\n }\n if (opt.emphasis) {\n // `*` and `_` emphasis in parallel (mask their `**`/`__` strong forms first)\n pushEmphasis(line, '*', '**', cands);\n pushEmphasis(line, '_', '__', cands);\n }\n\n if (!cands.length) return null;\n cands.sort((a, b) => a.opener - b.opener); // outermost first\n return cands[0]!;\n}\n\nfunction isFormingJsx(line: string, opt: Opt): boolean {\n return opt.jsx && /<[A-Z][A-Za-z0-9]*\\b[^>]*$/.test(line) && !/\\/?>\\s*$/.test(line);\n}\n\n/**\n * A line whose active tail is a forming list item — `- `, `* `, `+ ` or `1. `\n * followed by a space. The text may be empty while it is still being typed, so\n * only the marker+space is required. Rendered as an in-progress <li>.\n */\nconst LIST_ITEM_RE = /^( {0,3})([-+*]|\\d{1,9}[.)])[ \\t]+(.*)$/;\nfunction isFormingListItem(line: string, opt: Opt): boolean {\n return opt.listItems && LIST_ITEM_RE.test(line);\n}\n\n/** A `| a | b` line — a table row (header, delimiter and data all start `|`). */\nconst TABLE_ROW_RE = /^ {0,3}\\|/;\nfunction splitTableCells(row: string): string[] {\n let s = row.trim();\n if (s.startsWith('|')) s = s.slice(1);\n if (s.endsWith('|')) s = s.slice(0, -1);\n return s.split('|').map((c) => c.trim());\n}\n\nfunction hasTrailing(line: string, opt: Opt): boolean {\n if (!line.trim()) return false;\n return (\n isFormingJsx(line, opt) ||\n isFormingListItem(line, opt) ||\n findOpenRun(line, opt) !== null\n );\n}\n\n/** Render a line whose trailing construct is being anticipated. */\nfunction renderActiveLine(line: string, opt: Opt, pending: string[], fallback?: string): string {\n if (isFormingJsx(line, opt)) {\n const name = /<([A-Z][A-Za-z0-9]*)/.exec(line)?.[1] ?? 'Component';\n pending.push('jsx');\n const label = fallback ? esc(fallback) : `‹${esc(name)}› rendering…`;\n return `<div class=\"tw-skeleton\" data-component=\"${esc(name)}\"><span class=\"tw-skeleton-label\">${label}</span><div class=\"tw-skeleton-bar\"></div><div class=\"tw-skeleton-bar\" style=\"width:70%\"></div></div>`;\n }\n\n if (isFormingListItem(line, opt)) return renderActiveListItem(line, opt, pending);\n\n const heading = /^(#{1,6})\\s+(.*)$/.exec(line);\n const body = heading ? (heading[2] ?? '') : line;\n const inner = renderInlineWithOpen(body, opt, pending);\n if (heading) return `<h${heading[1]!.length}>${inner}${CARET}</h${heading[1]!.length}>`;\n return `<p>${inner}${CARET}</p>`;\n}\n\n/**\n * An in-progress list item as its OWN single-item list. Committed items above\n * render through the real parser (their own <ul>/<ol>) and are never touched,\n * so anticipation only ADDS the forming item ahead of confirmation.\n */\nfunction renderActiveListItem(line: string, opt: Opt, pending: string[]): string {\n const m = LIST_ITEM_RE.exec(line)!;\n const marker = m[2]!;\n const content = m[3] ?? '';\n pending.push('listItem');\n const inner = content ? renderInlineWithOpen(content, opt, pending) : '';\n const li = `<li class=\"tw-pending tw-pending-li\">${inner}${CARET}</li>`;\n if (/\\d/.test(marker)) {\n const n = parseInt(marker, 10);\n const startAttr = Number.isFinite(n) && n !== 1 ? ` start=\"${esc(String(n))}\"` : '';\n return `<ol${startAttr} class=\"tw-pending tw-pending-list\">${li}</ol>`;\n }\n return `<ul class=\"tw-pending tw-pending-list\">${li}</ul>`;\n}\n\nfunction renderInlineWithOpen(text: string, opt: Opt, pending: string[]): string {\n const open = findOpenRun(text, opt);\n if (!open) return inlineHtml(text);\n const prefix = text.slice(0, open.opener);\n pending.push(open.kind);\n if (open.kind === 'link') {\n // Show the resolved link TEXT (up to `]`); the href is withheld until the\n // URL finishes, so a partial/unsafe destination is never emitted.\n const after = text.slice(open.opener + 1);\n const close = after.indexOf(']');\n const label = close >= 0 ? after.slice(0, close) : after;\n return `${inlineHtml(prefix)}<a class=\"${open.cls}\">${inlineHtml(label)}</a>`;\n }\n const content = text.slice(open.opener + open.dl);\n const inner = open.kind === 'code' ? esc(content) : inlineHtml(content);\n return `${inlineHtml(prefix)}<${open.tag} class=\"${open.cls}\">${inner}</${open.tag}>`;\n}\n\nfunction renderOpenFence(block: string, pending: string[]): string {\n const nl = block.indexOf('\\n');\n const info = block.slice(3, nl < 0 ? block.length : nl).trim();\n const lang = info.split(/\\s+/)[0] ?? '';\n const code = nl < 0 ? '' : block.slice(nl + 1);\n pending.push('code');\n const langAttr = lang ? ` class=\"language-${esc(lang)}\"` : '';\n return `<pre class=\"tw-codeblock\"><code${langAttr}>${esc(code)}${CARET}</code></pre>`;\n}\n\n/** An in-progress table row appended under a committed header+delimiter table. */\nfunction renderActiveTableRow(row: string, pending: string[]): string {\n const cells = splitTableCells(row);\n pending.push('tableRow');\n let tds = '';\n for (let i = 0; i < cells.length; i++) {\n const caret = i === cells.length - 1 ? CARET : '';\n tds += `<td>${cells[i] ? inlineHtml(cells[i]!) : ''}${caret}</td>`;\n }\n return `<table class=\"tw-pending tw-pending-table\"><tbody><tr>${tds}</tr></tbody></table>`;\n}\n\nexport function anticipate(\n partial: string,\n options: AnticipationOptions | boolean = true,\n componentFallback?: string,\n): AnticipateResult {\n const opt = normalizeOpt(options);\n const pending: string[] = [];\n if (!partial) return { html: '', pending };\n\n // 1) open fenced code block — an odd number of ``` fences means the last is open\n const fenceCount = (partial.match(/^```/gm) ?? []).length;\n if (opt.fences && fenceCount % 2 === 1) {\n const idx = partial.lastIndexOf('```');\n const committed = partial.slice(0, idx).replace(/\\n+$/, '');\n const open = partial.slice(idx);\n const committedHtml = committed.trim() ? renderToHtml(parse(committed)) : '';\n return { html: committedHtml + renderOpenFence(open, pending), pending };\n }\n\n // 2) in-progress table row — a `| …` last line under a committed table\n // (header+delimiter, or a fuller table above). Uses the multi-line\n // committed/active split like the fence path, so the confirmed rows —\n // which do not change until the active row commits — are never reflowed.\n if (opt.tables) {\n const nl = partial.lastIndexOf('\\n');\n if (nl >= 0) {\n const row = partial.slice(nl + 1);\n if (TABLE_ROW_RE.test(row)) {\n const committed = partial.slice(0, nl);\n const doc = parse(committed);\n const last = doc.children[doc.children.length - 1];\n if (last && last.type === 'table') {\n return { html: renderToHtml(doc) + renderActiveTableRow(row, pending), pending };\n }\n }\n }\n }\n\n // 3) anticipate a trailing construct on the LAST line, if any\n const lastNl = partial.lastIndexOf('\\n');\n const active = lastNl >= 0 ? partial.slice(lastNl + 1) : partial;\n if (!hasTrailing(active, opt)) {\n // nothing to anticipate — render the whole thing as-is\n return { html: renderToHtml(parse(partial)), pending };\n }\n const committed = lastNl >= 0 ? partial.slice(0, lastNl) : '';\n const committedHtml = committed.trim() ? renderToHtml(parse(committed)) : '';\n return { html: committedHtml + renderActiveLine(active, opt, pending, componentFallback), pending };\n}\n","/**\n * `typewright/streaming` — feed an AI/LLM token stream into a preview.\n *\n * Text accumulation, stream piping, and smoothing are implemented:\n * `createStreamController` buffers the incoming stream and, when `smooth` is\n * set, drives a timer that reveals a steadily-growing prefix so bursty chunk\n * arrivals read as smooth typing. The anticipatory formatting renderer —\n * turning an incomplete `*bo` into in-progress bold, an unterminated fence into\n * an open code block, and partial JSX into a component skeleton (SPEC.md §8) —\n * lives in {@link anticipate} and is wired into the React `StreamingPreview`\n * component in `typewright`.\n */\n\nimport type { StreamController, StreamOptions } from '../types';\n\nexport type {\n StreamController,\n StreamOptions,\n AnticipationOptions,\n} from '../types';\n\nexport { anticipate } from './anticipate';\nexport type { AnticipateResult } from './anticipate';\n\n/** Default reveal rate when `smooth` is `true` (chars/second). */\nconst DEFAULT_CPS = 220;\n/** Reveal-timer cadence — ~30fps, so the cursor advances in small steady steps. */\nconst TICK_MS = 1000 / 30;\n\n/**\n * Create a controller that accumulates an incoming token stream and emits the\n * running text on every update.\n *\n * When {@link StreamOptions.smooth} is set the FULL buffer is retained (readable\n * via `.text`) but `onUpdate` receives only a steadily-revealed prefix: a timer\n * advances a reveal cursor at the target rate (`charsPerSecond`, or a default),\n * so bursty chunk arrivals read as smooth typing. `end()` reveals everything and\n * clears the timer; `reset()` clears it too — no timer or handle is ever leaked.\n *\n * @param onUpdate Called with the emitted text (revealed prefix when smoothing)\n * and whether the stream has ended.\n * @param options Anticipation / smoothing options (see SPEC.md §8).\n */\nexport function createStreamController(\n onUpdate: (text: string, complete: boolean) => void,\n options: StreamOptions = {},\n): StreamController {\n const smoothCfg =\n !options.smooth\n ? null\n : typeof options.smooth === 'object'\n ? options.smooth\n : { charsPerSecond: DEFAULT_CPS };\n const cps = smoothCfg && smoothCfg.charsPerSecond > 0 ? smoothCfg.charsPerSecond : DEFAULT_CPS;\n // Chars revealed per tick — deterministic (no wall-clock), so it is stable\n // under fake timers and averages to the requested rate.\n const perTick = Math.max(1, Math.round((cps * TICK_MS) / 1000));\n\n let text = '';\n let revealed = 0;\n let complete = false;\n let timer: ReturnType<typeof setInterval> | null = null;\n\n const emit = (): void => onUpdate(smoothCfg ? text.slice(0, revealed) : text, complete);\n\n const stopTimer = (): void => {\n if (timer !== null) {\n clearInterval(timer);\n timer = null;\n }\n };\n const tick = (): void => {\n revealed = Math.min(text.length, revealed + perTick);\n emit();\n if (revealed >= text.length) stopTimer();\n };\n const ensureTimer = (): void => {\n if (timer !== null || complete || revealed >= text.length) return;\n timer = setInterval(tick, TICK_MS);\n };\n\n return {\n push(chunk: string): void {\n if (complete) return;\n text += chunk;\n if (smoothCfg) ensureTimer();\n emit();\n },\n replace(full: string): void {\n text = full;\n complete = false;\n if (smoothCfg) {\n if (revealed > text.length) revealed = text.length;\n ensureTimer();\n }\n emit();\n },\n end(): void {\n complete = true;\n revealed = text.length; // flush everything on completion\n stopTimer();\n emit();\n },\n reset(): void {\n text = '';\n revealed = 0;\n complete = false;\n stopTimer();\n emit();\n },\n get text(): string {\n return text;\n },\n get complete(): boolean {\n return complete;\n },\n };\n}\n\n/**\n * Drive a controller from an async iterable or a `ReadableStream` of string\n * chunks, calling `end()` when the source is exhausted.\n *\n * @example\n * const controller = createStreamController(setText);\n * await pipeStream(llmResponse.textStream, controller);\n */\nexport async function pipeStream(\n source: AsyncIterable<string> | ReadableStream<string>,\n controller: StreamController,\n): Promise<void> {\n if (Symbol.asyncIterator in source) {\n for await (const chunk of source as AsyncIterable<string>) {\n controller.push(chunk);\n }\n } else {\n const reader = source.getReader();\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value != null) controller.push(value);\n }\n }\n controller.end();\n}\n","import * as React from 'react';\nimport { anticipate } from '../streaming/anticipate';\nimport { createStreamController, pipeStream } from '../streaming';\nimport type { AnticipationOptions } from '../types';\nimport { useInjectStyles } from './TypewrightEditor';\n\n/**\n * Streaming preview — renders an AI/LLM token stream incrementally while\n * anticipating incomplete formatting (SPEC.md §8). Committed blocks are\n * reconciled in place (stable, no flicker); new blocks animate in and a block\n * whose type changes (e.g. skeleton → resolved) re-animates. The HTML comes\n * from the sanitizing renderer + class-only pending markup, so it is safe.\n *\n * Drive it with an updating `text` prop, or hand it a `stream` (async iterable\n * or ReadableStream of string chunks).\n */\nexport interface StreamingPreviewProps {\n /** Controlled accumulated text. */\n text?: string;\n /** A stream of chunks to consume (alternative to `text`). */\n stream?: AsyncIterable<string> | ReadableStream<string>;\n /** Which incomplete constructs to optimistically render. */\n anticipate?: boolean | AnticipationOptions;\n /**\n * Reveal characters smoothly rather than in raw chunk jumps (only affects the\n * `stream` path — the controlled `text` prop is the host's to pace). `true`\n * uses a default rate; `{ charsPerSecond }` sets it. Mirrors `StreamOptions.smooth`.\n */\n smooth?: boolean | { charsPerSecond: number };\n /** Label shown inside the skeleton of a component whose props are still streaming. */\n componentFallback?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function StreamingPreview(props: StreamingPreviewProps): React.ReactElement {\n useInjectStyles();\n const {\n text: controlledText,\n stream,\n anticipate: ant = true,\n smooth,\n componentFallback,\n className,\n style,\n } = props;\n const [streamed, setStreamed] = React.useState('');\n const value = controlledText !== undefined ? controlledText : streamed;\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (!stream) return;\n let cancelled = false;\n setStreamed('');\n const controller = createStreamController(\n (t) => {\n if (!cancelled) setStreamed(t);\n },\n { smooth },\n );\n void pipeStream(stream, controller).catch(() => {\n /* stream errored — keep what we have */\n });\n return () => {\n cancelled = true;\n controller.reset(); // clear any pending reveal timer on unmount/re-subscribe\n };\n }, [stream, smooth]);\n\n // Reconcile the anticipated HTML into the container block-by-block.\n React.useEffect(() => {\n const container = containerRef.current;\n if (!container || typeof document === 'undefined') return;\n\n if (!value.trim()) {\n container.replaceChildren();\n return;\n }\n\n const { html } = anticipate(value, ant, componentFallback);\n const tmp = document.createElement('div');\n tmp.innerHTML = html; // sanitized by render.ts + class-only pending markup\n const next = Array.from(tmp.children) as HTMLElement[];\n\n for (let i = 0; i < next.length; i++) {\n const nb = next[i]!;\n const wrapper = container.children[i] as HTMLElement | undefined;\n if (!wrapper) {\n const w = document.createElement('div');\n w.className = 'tw-streamblk tw-stream-in';\n w.appendChild(nb);\n container.appendChild(w);\n continue;\n }\n const cur = wrapper.firstElementChild as HTMLElement | null;\n if (!cur || cur.outerHTML === nb.outerHTML) continue; // unchanged — keep stable\n const typeChanged = cur.tagName !== nb.tagName || cur.className !== nb.className;\n wrapper.replaceChildren(nb);\n if (typeChanged) {\n wrapper.classList.remove('tw-stream-in');\n void wrapper.offsetWidth; // reflow to restart the animation\n wrapper.classList.add('tw-stream-in');\n }\n }\n while (container.children.length > next.length) container.lastElementChild?.remove();\n }, [value, ant, componentFallback]);\n\n const cls = ['tw-editor', 'tw-streaming', className].filter(Boolean).join(' ');\n return <div ref={containerRef} className={cls} style={style} data-typewright=\"streaming\" />;\n}\n"]}