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/react/CaretRevealBlock.tsx","../../src/react/CommentsSidebar.tsx","../../src/react/FoldMenu.tsx","../../src/react/SandboxIsland.tsx","../../src/react/SettingsSurface.tsx","../../src/react/TableGrid.tsx","../../src/react/TypewrightEditor.tsx","../../src/react/StreamingPreview.tsx"],"names":["React","React2","jsx","React3","jsxs","React4","React5","React6","Fragment","TypewrightEditor","start","end","React8"],"mappings":"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","file":"index.js","sourcesContent":["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","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","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"]}