@latentic/live-markdown 0.0.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.
- package/LICENSE +21 -0
- package/README.md +265 -0
- package/dist/index.d.ts +805 -0
- package/dist/index.js +5804 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +36 -0
- package/package.json +90 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/frontmatter.ts","../src/codemirror/byteOffset.ts","../src/codemirror/caretLayer.ts","../src/codemirror/selectionLayer.ts","../src/codemirror/clipboard/htmlToMarkdown.ts","../src/codemirror/clipboard/pasteMarkdown.ts","../src/codemirror/core/treeAt.ts","../src/codemirror/clipboard/copyRich.ts","../src/codemirror/updateBus.ts","../src/codemirror/code/codePalette.ts","../src/codemirror/code/codeHighlight.ts","../src/codemirror/core/lineStructure.ts","../src/codemirror/code/fenceAutoClose.ts","../src/codemirror/code/codeLanguageMenu.ts","../src/codemirror/code/codeLangAffordance.ts","../src/codemirror/mermaid/mermaidRender.ts","../src/codemirror/mermaid/mermaidWidget.ts","../src/codemirror/mermaid/mermaidPlugin.ts","../src/codemirror/code/fenceCaretGuard.ts","../src/codemirror/code/fenceDeleteGuards.ts","../src/codemirror/code/fenceTabIndent.ts","../src/codemirror/code/highlightFence.ts","../src/codemirror/core/paint.ts","../src/codemirror/core/parseToEnd.ts","../src/codemirror/core/hrWidget.ts","../src/codemirror/html/htmlWidget.ts","../src/imageSrcResolver.ts","../src/codemirror/core/hostFacets.ts","../src/imageInsert.ts","../src/codemirror/image/imageEditEvent.ts","../src/codemirror/image/imageActionMenu.ts","../src/codemirror/image/imageWidget.ts","../src/codemirror/list/bulletWidget.ts","../src/codemirror/list/taskCheckboxWidget.ts","../src/codemirror/core/registry.ts","../src/codemirror/core/plugin.ts","../src/codemirror/core/editorTheme.ts","../src/links/workspaceLink.ts","../src/links/wikilink.ts","../src/codemirror/core/codeContext.ts","../src/codemirror/wikilink/wikilinkPlugin.ts","../src/codemirror/interaction/clickModel.ts","../src/codemirror/table/tableInline.ts","../src/codemirror/table/tableModel.ts","../src/codemirror/table/tableCell.ts","../src/codemirror/tablev2/tableV2Sync.ts","../src/codemirror/tablev2/tableWidgetV2.ts","../src/codemirror/table/tableField.ts","../src/codemirror/interaction/visiblePosition.ts","../src/codemirror/interaction/cursorModel.ts","../src/codemirror/table/tableArmed.ts","../src/codemirror/interaction/deleteNormalizer.ts","../src/codemirror/interaction/flankingGuard.ts","../src/codemirror/list/listContinuation.ts","../src/codemirror/list/listIndent.ts","../src/codemirror/format/formatCommands.ts","../src/codemirror/format/blockCommands.ts","../src/codemirror/image/imageInsertHandlers.ts","../src/codemirror/extensions/loader.ts","../src/codemirror/highlight/highlightPlugin.ts","../src/codemirror/extensions/highlightExtension.ts","../src/codemirror/footnote/footnotePlugin.ts","../src/codemirror/extensions/footnoteExtension.ts","../src/codemirror/math/mathWidget.ts","../src/codemirror/math/mathPlugin.ts","../src/codemirror/extensions/mathExtension.ts","../src/codemirror/extensions/mermaidExtension.ts","../src/codemirror/table/tableGeometry.ts","../src/codemirror/table/tableEditCommands.ts","../src/codemirror/table/tableCellNav.ts","../src/codemirror/tablev2/cellEditingSurface.ts","../src/codemirror/tablev2/cellText.ts","../src/codemirror/tablev2/inlineCellSurface.ts","../src/codemirror/tablev2/tableV2HoverControls.ts","../src/codemirror/table/tableExcerpt.ts","../src/codemirror/table/tableContextMenu.ts","../src/codemirror/tablev2/bridgeRules.ts","../src/codemirror/tablev2/tableV2Selection.ts","../src/codemirror/tablev2/tableV2Interaction.ts","../src/codemirror/extensions/tableExtension.ts","../src/codemirror/extensions/wikilinkExtension.ts","../src/codemirror/CodeMirrorMarkdownEditor.tsx"],"names":["markdown","line","style","layer","RectangleMarker","Prec","EditorView","tags","service","mark","prefix","insert","keymap","EditorSelection","language","syntaxTree","ViewPlugin","resolve","width","height","WidgetType","Decoration","StateField","EditorState","languages","Facet","ensureSyntaxTree","raw","buildDecorations","cells","DOMPurify","indent","newIndent","content","cmKeymap","HIDE","tableRect","commentOn","parsed","flushPendingToBuffer"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * YAML frontmatter parsing + serialization.\n *\n * Convention: `--- yaml ---` block at the very top of a markdown\n * file (before any other content). Format:\n *\n * ---\n * status: draft\n * tags:\n * - application\n * - fellowship\n * ---\n *\n * # Real content starts here\n *\n * This module separates the YAML chunk from the prose chunk so\n * the WYSIWYG editor can render only the prose (no raw `key:\n * value` lines bleeding into the user's writing surface) while a\n * separate properties UI shows / edits the frontmatter.\n *\n * Round-trip rules:\n * - If a file has no frontmatter on disk, we MUST NOT add one\n * on save just because the properties panel exists.\n * - If a file has frontmatter, we serialize it using the same\n * keys/order the user wrote (best effort — yaml lib preserves\n * scalar formatting but not always blank lines / comments).\n * - The fence marker is always exactly `---` on its own line.\n * Some Obsidian users prefer `+++` (TOML) — out of scope for\n * v1; we round-trip those as body content unchanged.\n */\n\nimport { parse, stringify } from \"yaml\";\n\n/**\n * The frontmatter value type. Each entry is whatever YAML can\n * decode to — strings, numbers, booleans, arrays, nested objects.\n * The properties UI handles primitives + flat arrays cleanly;\n * nested objects fall back to a raw YAML editor.\n */\nexport type FrontmatterValue = string | number | boolean | null | FrontmatterValue[] | { [key: string]: FrontmatterValue };\nexport type Frontmatter = Record<string, FrontmatterValue>;\n\nexport interface MarkdownDocument {\n /** Parsed YAML key/values. `null` means \"no frontmatter block present\". */\n frontmatter: Frontmatter | null;\n /** The prose portion — everything after the closing `---`. */\n body: string;\n}\n\n/**\n * Regex matches the frontmatter block at the start of a file:\n * a `---` line, then any content (lazy), then a `---` line.\n * Multiline mode + dot-matches-newline. The block must start at\n * the very first character — frontmatter in the middle of a doc\n * doesn't count.\n *\n * Capture groups:\n * 1. The raw YAML body between the fences (no fences included)\n * 2. The optional newline after the closing fence\n */\nconst FRONTMATTER_RE = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---(\\r?\\n)?/;\n\n/**\n * Split a markdown string into its frontmatter + body. Tolerant\n * of:\n * - No frontmatter at all → `frontmatter: null, body: input`\n * - Malformed YAML → `frontmatter: null, body: input` (we treat\n * the whole thing as prose rather than show parse errors)\n * - Empty frontmatter block (`---\\n---`) → `frontmatter: {}`\n */\nexport function parseFrontmatter(markdown: string): MarkdownDocument {\n const match = markdown.match(FRONTMATTER_RE);\n if (!match) {\n return { frontmatter: null, body: markdown };\n }\n const yamlBody = match[1];\n const afterFence = markdown.slice(match[0].length);\n try {\n const parsed = parse(yamlBody) as unknown;\n // Empty block → empty record; primitive at top level → not\n // a valid frontmatter shape, treat as no frontmatter.\n if (parsed == null) {\n return { frontmatter: {}, body: afterFence };\n }\n if (typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return { frontmatter: null, body: markdown };\n }\n return { frontmatter: parsed as Frontmatter, body: afterFence };\n } catch {\n // Malformed YAML — surface as plain content. Better to show\n // the raw chars than to drop user-visible bytes silently.\n return { frontmatter: null, body: markdown };\n }\n}\n\n/**\n * Recombine frontmatter + body into a markdown string. Inverse\n * of `parseFrontmatter` for legal inputs.\n *\n * - `frontmatter: null` → just the body, no `---` fences added\n * - `frontmatter: {}` → no fences either (an empty frontmatter\n * block is semantically the same as \"no frontmatter\" and we\n * prefer the cleaner shape on save)\n * - Otherwise → `---\\n<yaml>\\n---\\n<body>`\n */\nexport function serializeMarkdown(doc: MarkdownDocument): string {\n if (doc.frontmatter == null || Object.keys(doc.frontmatter).length === 0) {\n return doc.body;\n }\n const yamlBlock = stringify(doc.frontmatter, {\n // Match the conventional GitHub / Obsidian dialect: 2-space\n // indent for lists, no leading dashes shift, plain string\n // style when possible.\n indent: 2,\n lineWidth: 0,\n }).trimEnd();\n // Exactly one newline between the closing fence and the body.\n // That single newline gets consumed by `FRONTMATTER_RE` on\n // re-parse, so `body` round-trips byte-identical. If the\n // caller wants a blank line between the frontmatter and a\n // heading, they should include the leading `\\n` in `body`.\n return `---\\n${yamlBlock}\\n---\\n${doc.body}`;\n}\n\n/**\n * Helper: update a single frontmatter field in a markdown string\n * without touching the body. Used by the Properties UI when the\n * user edits one value at a time.\n *\n * If the file had no frontmatter, this adds one with just the\n * one field. If the value is `null` and the key exists, removes\n * the key (and removes the whole frontmatter block if it becomes\n * empty).\n */\nexport function setFrontmatterField(\n markdown: string,\n key: string,\n value: FrontmatterValue | null,\n): string {\n const doc = parseFrontmatter(markdown);\n const current: Frontmatter = doc.frontmatter ?? {};\n if (value === null) {\n delete current[key];\n } else {\n current[key] = value;\n }\n return serializeMarkdown({\n frontmatter: Object.keys(current).length === 0 ? null : current,\n body: doc.body,\n });\n}\n","import { type EditorState } from \"@codemirror/state\";\n\nimport { type SourceRange } from \"../types\";\n\n/**\n * The editor's public {@link SourceRange} is contracted in UTF-8 byte offsets\n * (see types.ts) — that's what the host persists and maps with (chat excerpt\n * line:col, comment anchoring). CodeMirror, though, indexes the document in\n * UTF-16 code units. Convert at the one boundary where a range leaves the\n * editor (the selection snapshot, the table excerpt) so a multi-byte character\n * before the position doesn't skew the reported offset. For all-ASCII text the\n * two coincide and this is the identity.\n */\nexport function byteOffsetAt(state: EditorState, pos: number): number {\n const prefix = state.sliceDoc(0, pos);\n let bytes = 0;\n for (let i = 0; i < prefix.length; ) {\n const codePoint = prefix.codePointAt(i)!;\n bytes += codePoint < 0x80 ? 1 : codePoint < 0x800 ? 2 : codePoint < 0x10000 ? 3 : 4;\n i += codePoint >= 0x10000 ? 2 : 1;\n }\n return bytes;\n}\n\n/** A {@link SourceRange} (byte offsets) for the CM code-unit span `[from, to)`. */\nexport function byteRangeOf(state: EditorState, from: number, to: number): SourceRange {\n return { start: byteOffsetAt(state, from), end: byteOffsetAt(state, to) };\n}\n","/**\n * Drawn caret (#62 — interaction-spec §7.4).\n *\n * The caret must be drawn from `EditorState.selection`: WKWebView paints the\n * native contentEditable caret on BOTH sides of an atomic widget boundary\n * (#62). Selection RANGES are painted by the sibling layer in\n * `selectionLayer.ts` — also from logical state, since native ::selection\n * can't survive the virtualized viewport — using forward-geometry rects that\n * avoid `drawSelection()`'s far-edge `posAtCoords` probe (the #90 flashing).\n *\n * The layer keeps the `cm-cursorLayer` class so existing styling hooks\n * (table arming's caret-hide, the base theme's blink animation) apply.\n */\n\nimport { Prec, type Extension } from \"@codemirror/state\";\nimport { EditorView, layer, RectangleMarker, type ViewUpdate } from \"@codemirror/view\";\n\nfunction relevant(update: ViewUpdate): boolean {\n return (\n update.docChanged ||\n update.selectionSet ||\n update.geometryChanged ||\n update.viewportChanged ||\n update.focusChanged\n );\n}\n\nconst caretLayer = layer({\n above: true,\n class: \"cm-cursorLayer\",\n update(update, dom) {\n // Restart the blink so a just-moved caret is immediately visible.\n if (update.selectionSet) {\n dom.style.animationName = dom.style.animationName === \"cm-blink\" ? \"cm-blink2\" : \"cm-blink\";\n }\n return relevant(update);\n },\n markers(view) {\n const markers: RectangleMarker[] = [];\n for (const range of view.state.selection.ranges) {\n if (!range.empty) continue;\n const cls =\n range === view.state.selection.main\n ? \"cm-cursor cm-cursor-primary\"\n : \"cm-cursor cm-cursor-secondary\";\n markers.push(...RectangleMarker.forRange(view, cls, range));\n }\n return markers;\n },\n});\n\n// The drawn caret replaces the native one; the native SELECTION stays.\nconst hideNativeCaret = Prec.highest(\n EditorView.theme({\n \".cm-content\": { caretColor: \"transparent\" },\n // Native-caret islands: tablev2 cells edit with the BROWSER caret (no\n // drawn caret of their own), so they win the color back — a direct rule\n // on the element beats the inherited transparent.\n '.cm-content [contenteditable=\"plaintext-only\"]': {\n caretColor: \"var(--cds-text-primary, #161616)\",\n },\n // While a cell edit is active the drawn caret would ghost at the parked\n // main-selection position; the surface stamps this class on the editor.\n \"&.cm-tablev2-editing .cm-cursorLayer\": { display: \"none\" },\n }),\n);\n\nexport const drawnCaret: Extension = [caretLayer, hideNativeCaret];\n","/**\n * Drawn selection over a virtualized viewport (#166).\n *\n * CodeMirror renders only the visible viewport, and the browser's native\n * `::selection` can only highlight DOM that exists — so with native painting,\n * a Cmd+A or Shift-extended selection shows highlight only on whatever\n * happened to be rendered, and scrolling away and back loses it entirely.\n * This layer paints selection ranges FROM LOGICAL STATE\n * (`state.selection` × the current viewport), so the highlight is correct at\n * every scroll position by construction.\n *\n * Why not CM6's own `drawSelection()`: its wrapped-line handling reverse-maps\n * the editor's far-left/right edge through `posAtCoords` per endpoint, and on\n * lines that start with hidden markers + widgets that probe jitters between\n * before/after the hidden prefix, flashing between one-piece and three-piece\n * painting per drag update (#90). The rects here derive only from FORWARD\n * geometry — `coordsAtPos` of the actual endpoints plus line-block boxes —\n * with no reverse edge probe anywhere:\n *\n * * endpoints in the same visual row → one rect between their coords;\n * * a wrapped or multi-line range → a partial rect for the first row, a\n * partial rect for the last row, and ONE full-width rect for everything\n * between (which also spans block widgets and hidden rows);\n * * a block widget wholly inside a range additionally gets a translucent\n * ABOVE-content tint (`cm-selectionWidgetTint`): widgets paint opaque\n * backgrounds over a below-content layer, so without it a selected\n * table/diagram would show no feedback at all.\n *\n * Known coarseness: partial rows of RTL text paint full-width (bidi span\n * splitting is deliberately not reimplemented here); LTR documents paint\n * glyph-accurately.\n *\n * The native `::selection` stays for the tablev2 cell editors (their own\n * contenteditable islands) and is made transparent everywhere else — the DOM\n * selection itself is untouched, so IME, copy, and focus behavior keep\n * working on the real selection.\n */\n\nimport { Prec, type Extension, type SelectionRange } from \"@codemirror/state\";\nimport {\n BlockType,\n Direction,\n EditorView,\n layer,\n RectangleMarker,\n type BlockInfo,\n} from \"@codemirror/view\";\n\n/** Client-rect → document-space base, mirroring CM6's own layer arithmetic. */\nfunction layerBase(view: EditorView): { left: number; top: number } {\n const rect = view.scrollDOM.getBoundingClientRect();\n const left =\n view.textDirection === Direction.LTR\n ? rect.left\n : rect.right - view.scrollDOM.clientWidth * view.scaleX;\n return {\n left: left - view.scrollDOM.scrollLeft * view.scaleX,\n top: rect.top - view.scrollDOM.scrollTop * view.scaleY,\n };\n}\n\ninterface ContentEdges {\n left: number;\n right: number;\n}\n\n/** The horizontal band text can occupy, in client coordinates. */\nfunction contentEdges(view: EditorView): ContentEdges {\n const rect = view.contentDOM.getBoundingClientRect();\n const line = view.contentDOM.querySelector(\".cm-line\");\n const style = line ? window.getComputedStyle(line) : null;\n const padLeft = style ? parseInt(style.paddingLeft) || 0 : 0;\n const padRight = style ? parseInt(style.paddingRight) || 0 : 0;\n return { left: rect.left + padLeft, right: rect.right - padRight };\n}\n\nfunction isTextBlock(block: BlockInfo): boolean {\n return block.type === BlockType.Text || Array.isArray(block.type);\n}\n\nclass Rect {\n constructor(\n readonly left: number,\n readonly top: number,\n readonly right: number,\n readonly bottom: number,\n ) {}\n}\n\n/**\n * Selection rectangles for one range, clamped to the viewport. Every rect is\n * derived from forward endpoint geometry; positions whose coords are\n * unavailable (jsdom, or an endpoint inside a replaced range) degrade to the\n * enclosing block's box rather than throwing.\n */\nfunction rectsForRange(view: EditorView, range: SelectionRange, edges: ContentEdges): Rect[] {\n if (range.to <= view.viewport.from || range.from >= view.viewport.to) return [];\n const from = Math.max(range.from, view.viewport.from);\n const to = Math.min(range.to, view.viewport.to);\n const startBlock = view.lineBlockAt(from);\n const endBlock = view.lineBlockAt(to);\n const contentTop = view.contentDOM.getBoundingClientRect().top;\n\n // A selection endpoint sitting on a widget block has no glyph coords; its\n // \"row\" is the widget's whole box.\n const startCoords = isTextBlock(startBlock) ? view.coordsAtPos(from, 1) : null;\n const endCoords = isTextBlock(endBlock) ? view.coordsAtPos(to, -1) : null;\n const startTop = startCoords ? startCoords.top : contentTop + startBlock.top;\n const startBottom = startCoords ? startCoords.bottom : contentTop + startBlock.bottom;\n const endTop = endCoords ? endCoords.top : contentTop + endBlock.top;\n const endBottom = endCoords ? endCoords.bottom : contentTop + endBlock.bottom;\n const startLeft = startCoords ? startCoords.left : edges.left;\n const endRight = endCoords ? endCoords.right : edges.right;\n\n // Same visual row: row boxes share their top edge, so the endpoint tops\n // are equal by construction (adjacent rows differ by a full row height).\n if (endTop - startTop < 1) {\n return [new Rect(startLeft, startTop, Math.max(endRight, startLeft), endBottom)];\n }\n\n const rects: Rect[] = [\n // Partial first row: selection start to the row's right edge.\n new Rect(startLeft, startTop, edges.right, startBottom),\n // Everything between the first and last rows — full width. Wrapped rows\n // of the endpoint lines, whole middle lines, and block widgets all fall\n // inside this band, which is what makes the shape probe-free.\n new Rect(edges.left, startBottom, edges.right, endTop),\n // Partial last row: the row's left edge to the selection end.\n new Rect(edges.left, endTop, endRight, endBottom),\n ];\n return rects.filter((r) => r.bottom > r.top || r.right > r.left);\n}\n\nconst selectionLayer = layer({\n above: false,\n class: \"cm-selectionLayer\",\n update: (update) =>\n update.docChanged || update.selectionSet || update.viewportChanged || update.geometryChanged,\n markers(view) {\n const base = layerBase(view);\n const edges = contentEdges(view);\n const markers: RectangleMarker[] = [];\n for (const range of view.state.selection.ranges) {\n if (range.empty) continue;\n for (const rect of rectsForRange(view, range, edges)) {\n markers.push(\n new RectangleMarker(\n \"cm-selectionBackground\",\n rect.left - base.left,\n rect.top - base.top,\n Math.max(0, rect.right - rect.left),\n rect.bottom - rect.top,\n ),\n );\n }\n }\n return markers;\n },\n});\n\n/** Translucent tint ABOVE block widgets wholly covered by a selection — the\n * below-content band is hidden behind their opaque backgrounds. */\nconst widgetTintLayer = layer({\n above: true,\n class: \"cm-selectionWidgetLayer\",\n update: (update) =>\n update.docChanged || update.selectionSet || update.viewportChanged || update.geometryChanged,\n markers(view) {\n const covering = view.state.selection.ranges.filter((r) => !r.empty);\n if (covering.length === 0) return [];\n const base = layerBase(view);\n const edges = contentEdges(view);\n const contentTop = view.contentDOM.getBoundingClientRect().top;\n const markers: RectangleMarker[] = [];\n for (const block of view.viewportLineBlocks) {\n if (isTextBlock(block)) continue;\n if (!covering.some((r) => r.from <= block.from && r.to >= block.to)) continue;\n markers.push(\n new RectangleMarker(\n \"cm-selectionWidgetTint\",\n edges.left - base.left,\n contentTop + block.top - base.top,\n Math.max(0, edges.right - edges.left),\n block.bottom - block.top,\n ),\n );\n }\n return markers;\n },\n});\n\n// The drawn layer replaces the native highlight; the DOM selection itself\n// stays (IME, copy, focus). The tablev2 cell editors are separate\n// contenteditable islands that keep the native paint.\nconst hideNativeSelection = Prec.highest(\n EditorView.theme({\n \".cm-content ::selection, .cm-content::selection\": {\n backgroundColor: \"transparent\",\n },\n '.cm-content [contenteditable=\"plaintext-only\"] ::selection, .cm-content [contenteditable=\"plaintext-only\"]::selection':\n {\n backgroundColor: \"var(--cds-highlight, #d0e2ff)\",\n },\n }),\n);\n\nexport const drawnSelection: Extension = [selectionLayer, widgetTintLayer, hideNativeSelection];\n","/**\n * Clipboard HTML → Markdown (#134), the paste half of clipboard interop.\n *\n * Real-world clipboard HTML is hostile: Google Docs wraps everything in a\n * `<b id=\"docs-internal-guid…\" style=\"font-weight:normal\">` and expresses ALL\n * formatting as `<span style>`; Word exports `mso-` styled soup. The DOM is\n * normalized here first — styled spans become real `<strong>/<em>/<s>`\n * elements, wrapper lies are unwrapped — so turndown converts semantics, not\n * vendor quirks.\n */\n\nimport TurndownService from \"turndown\";\n// @ts-expect-error — no published types; the joplin fork is the maintained\n// GFM ruleset (tables, strikethrough, task lists).\nimport { gfm } from \"@joplin/turndown-plugin-gfm\";\n\n/** Marks HTML that Compose itself put on the clipboard (see copyRich.ts).\n * The paste handler sees it and uses the lossless text/plain markdown\n * instead of re-converting our own rendering. */\nexport const COMPOSE_CLIPBOARD_ATTR = \"data-compose-markdown\";\n\nexport function isComposeClipboardHtml(html: string): boolean {\n return html.includes(COMPOSE_CLIPBOARD_ATTR);\n}\n\nfunction isBoldStyle(style: CSSStyleDeclaration): boolean {\n const weight = style.fontWeight;\n const numeric = Number(weight);\n return weight === \"bold\" || weight === \"bolder\" || (!Number.isNaN(numeric) && numeric >= 600);\n}\n\n/** Rewrite vendor styling into semantic elements, in place. */\nfunction normalizeVendorDom(root: HTMLElement): void {\n // Google Docs signs its fragments with a guid-carrying <b> whose\n // font-weight is NORMAL — unwrap it or the whole paste turns bold.\n root.querySelectorAll(\"b[id^='docs-internal-guid']\").forEach((wrapper) => {\n wrapper.replaceWith(...Array.from(wrapper.childNodes));\n });\n\n // Docs also wraps every list item's content in a <p>, which converts as a\n // LOOSE list (`- item` + blank lines). Unwrap sole-child paragraphs so\n // lists come out tight, the house style.\n root.querySelectorAll(\"li > p:only-child\").forEach((p) => {\n p.replaceWith(...Array.from(p.childNodes));\n });\n\n // Styled spans → semantic elements (Docs never emits <strong>/<em>).\n // Nested wrappers so bold+italic+strike combinations all survive.\n root.querySelectorAll(\"span\").forEach((span) => {\n const style = span.style;\n if (!style) return;\n const tags: string[] = [];\n if (isBoldStyle(style)) tags.push(\"strong\");\n if (style.fontStyle === \"italic\") tags.push(\"em\");\n if (style.textDecoration.includes(\"line-through\")) tags.push(\"s\");\n if (tags.length === 0) return;\n const doc = span.ownerDocument;\n const outermost = doc.createElement(tags[0]);\n let innermost = outermost;\n for (const tag of tags.slice(1)) {\n const next = doc.createElement(tag);\n innermost.appendChild(next);\n innermost = next;\n }\n innermost.append(...Array.from(span.childNodes));\n span.replaceWith(outermost);\n });\n}\n\nfunction buildTurndown(): TurndownService {\n const service = new TurndownService({\n headingStyle: \"atx\",\n hr: \"---\",\n bulletListMarker: \"-\",\n codeBlockStyle: \"fenced\",\n emDelimiter: \"*\",\n strongDelimiter: \"**\",\n });\n service.use(gfm);\n // Stock turndown pads every bullet to `- ` (a 4-char unit). House style\n // is the tight `- item` / `1. item`, with continuation lines indented to\n // the marker's own width — still CommonMark-correct for nesting.\n service.addRule(\"tightListItem\", {\n filter: \"li\",\n replacement: (content, node, options) => {\n const parent = node.parentNode as HTMLElement;\n let prefix = `${options.bulletListMarker} `;\n if (parent.nodeName === \"OL\") {\n const items = Array.from(parent.children).filter((child) => child.nodeName === \"LI\");\n const start = Number(parent.getAttribute(\"start\") ?? \"1\");\n prefix = `${start + items.indexOf(node as Element)}. `;\n }\n const indent = \" \".repeat(prefix.length);\n const inner = content\n .replace(/^\\n+/, \"\")\n .replace(/\\n+$/, \"\\n\")\n .replace(/\\n/gm, `\\n${indent}`);\n return prefix + inner + (node.nextSibling && !/\\n$/.test(inner) ? \"\\n\" : \"\");\n },\n });\n // Images degrade honestly (#134): a remote image becomes a LINK — never a\n // hot-loading `![...]` embed — and an inline data: blob keeps only its alt\n // text (a base64 wall would bury the document).\n service.addRule(\"imagesAsLinks\", {\n filter: \"img\",\n replacement: (_content, node) => {\n const img = node as HTMLImageElement;\n const alt = img.getAttribute(\"alt\")?.trim() || \"image\";\n const src = img.getAttribute(\"src\") ?? \"\";\n if (!src || src.startsWith(\"data:\")) return alt === \"image\" ? \"\" : alt;\n return `[${alt}](${src})`;\n },\n });\n return service;\n}\n\nlet service: TurndownService | null = null;\n\n/** Convert clipboard HTML to house-style Markdown. Returns \"\" when nothing\n * convertible remains (caller falls back to the native plain paste). */\nexport function htmlToMarkdown(html: string): string {\n const doc = new DOMParser().parseFromString(html, \"text/html\");\n doc.body.querySelectorAll(\"style,script,meta,head,title\").forEach((el) => el.remove());\n normalizeVendorDom(doc.body);\n service ??= buildTurndown();\n return service.turndown(doc.body.innerHTML).trim();\n}\n","/**\n * Rich paste (#134): clipboard HTML converts to Markdown at the caret, so a\n * paste from Google Docs / Word / the web keeps headings, emphasis, lists,\n * links, and tables instead of flattening to plain text.\n *\n * Precedence contract:\n * - image files on the clipboard belong to imageInsertHandlers — skipped;\n * - Compose's own copies carry {@link COMPOSE_CLIPBOARD_ATTR} — skipped, so\n * the native path pastes the lossless text/plain markdown;\n * - Mod-Shift-v pastes verbatim plain text (the escape hatch).\n */\n\nimport { EditorView, keymap } from \"@codemirror/view\";\nimport { type Extension } from \"@codemirror/state\";\n\nimport { htmlToMarkdown, isComposeClipboardHtml } from \"./htmlToMarkdown\";\n\nfunction insertText(view: EditorView, text: string): void {\n view.dispatch(view.state.replaceSelection(text), {\n userEvent: \"input.paste\",\n scrollIntoView: true,\n });\n}\n\nconst pasteHandler = EditorView.domEventHandlers({\n paste(event, view) {\n if (event.defaultPrevented) return false;\n const data = event.clipboardData;\n if (!data) return false;\n // Image bytes → the image pipeline, not text conversion.\n if (data.files.length > 0) return false;\n const html = data.getData(\"text/html\");\n if (!html || isComposeClipboardHtml(html)) return false;\n const markdown = htmlToMarkdown(html);\n if (!markdown) return false;\n event.preventDefault();\n insertText(view, markdown);\n return true;\n },\n});\n\nconst verbatimPasteKeymap = keymap.of([\n {\n key: \"Mod-Shift-v\",\n run: (view) => {\n // Async clipboard read — allowed here because it rides a user gesture.\n // A denial (or an empty clipboard) quietly does nothing rather than\n // erroring into the document.\n void navigator.clipboard\n .readText()\n .then((text) => {\n if (text) insertText(view, text);\n })\n .catch(() => {});\n return true;\n },\n },\n]);\n\n/** The paste half of clipboard interop; compose after imageInsertHandlers. */\nexport const markdownPaste: Extension = [pasteHandler, verbatimPasteKeymap];\n","import { ensureSyntaxTree, syntaxTree } from \"@codemirror/language\";\nimport type { EditorState } from \"@codemirror/state\";\n\n/**\n * How long a structural lookup may spend parsing. It runs inside a keystroke,\n * so this is a budget rather than a guarantee: past it we answer from whatever\n * has been parsed, exactly as before.\n */\nconst PARSE_BUDGET_MS = 50;\n\n/**\n * A syntax tree that reaches `pos`.\n *\n * `syntaxTree` returns only what the **viewport** has driven the parser\n * through, so `resolveInner` past that point reports the position as bare\n * `Document`. Every command that asks \"am I inside a list / a fence / a table?\"\n * then gets \"no\" and takes the plain-text path: a wrong answer, not a slow one.\n *\n * Measured in WebKit, the engine we ship on, with real layout — two regimes.\n *\n * On the frame a document opens the parser has covered a few thousand\n * characters: 3,009 of 7,902, viewport 0–331, for an editor 11,404px tall. The\n * idle parse then catches up within about half a second, so near the viewport\n * this is a race — and it heals before a hand-test can see it.\n *\n * Further out it never heals. The idle parse stops 100,000 characters past the\n * viewport: the tree plateaus at 100,739 for a 167k-character document and a\n * 341k one alike, and stays there. `ensureSyntaxTree` resumes from that plateau\n * and finishes the 341k document in 43ms — inside the budget above.\n *\n * Only for questions about a *position*. Decoration plugins iterate\n * `view.visibleRanges` and should keep using `syntaxTree` directly: there,\n * being limited to the viewport is the point.\n */\n/// The tree type, named without importing `@lezer/common` — it is a transitive\n/// dependency, and a declaration referring to it by pnpm path is not portable\n/// for anyone consuming the built package.\ntype Tree = ReturnType<typeof syntaxTree>;\n\nexport function treeAt(state: EditorState, pos: number): Tree {\n return ensureSyntaxTree(state, pos + 1, PARSE_BUDGET_MS) ?? syntaxTree(state);\n}\n","/**\n * Rich copy/cut (#135): every copy writes BOTH clipboard flavors —\n *\n * text/plain — the markdown SOURCE of the selection (lossless: editors,\n * terminals, and Compose→Compose round trips);\n * text/html — the selection rendered by the host (Google Docs, Slack,\n * Word, and Gmail paste it formatted).\n *\n * The HTML carries {@link COMPOSE_CLIPBOARD_ATTR} so our own paste handler\n * prefers the markdown flavor instead of re-converting our rendering.\n *\n * Stays out of the way of: the table surface's TSV cell-selection copy (a\n * capture-phase document listener that preventDefaults first), and CM's\n * native empty-selection behavior. Without a host renderer the handler still\n * runs — plain-only, but through one code path.\n */\n\nimport { EditorView } from \"@codemirror/view\";\nimport { Facet, type EditorState, type Extension } from \"@codemirror/state\";\n\nimport { COMPOSE_CLIPBOARD_ATTR } from \"./htmlToMarkdown\";\nimport { treeAt } from \"../core/treeAt\";\n\n/** Host-supplied markdown → HTML renderer for clipboard writes. Null (the\n * default) copies plain markdown only. Wired like the other host seams —\n * see hostFacets.ts. */\nexport type RenderClipboardHtml = (markdown: string) => string | null;\n\nexport const renderClipboardHtmlFacet = Facet.define<\n RenderClipboardHtml | null,\n RenderClipboardHtml | null\n>({\n combine: (values) => values[0] ?? null,\n});\n\n/** Inline constructs whose delimiters hide in rich mode. A selection made by\n * eye starts at the first VISIBLE character — in source, that's just past\n * the opening marker — so a naive slice ships an orphaned `**` (#140). */\nconst MARKER_PAIRED = new Set([\"Emphasis\", \"StrongEmphasis\", \"Strikethrough\", \"InlineCode\"]);\n\n/**\n * Slice the selection as balanced markdown: when an edge lands inside a\n * marker-paired node, the missing delimiter is synthesized onto that edge —\n * copy what the user SAW (`**Priorties**`), not where the hidden markers\n * happened to fall. A mid-content selection (neither marker covered) stays a\n * plain slice; delimiter style (`*` vs `_`, `~~`, backticks) is preserved by\n * copying the node's actual mark text.\n */\nexport function balancedSlice(state: EditorState, from: number, to: number): string {\n const tree = treeAt(state, to);\n let prefix = \"\";\n let suffix = \"\";\n tree.iterate({\n from,\n to,\n enter: (node) => {\n if (!MARKER_PAIRED.has(node.name)) return;\n if (node.from >= from && node.to <= to) return false; // marks travel with the slice\n const first = node.node.firstChild;\n const last = node.node.lastChild;\n if (!first || !last || !first.name.endsWith(\"Mark\") || !last.name.endsWith(\"Mark\")) {\n return;\n }\n // An edge landing in the CONTENT region (between the marks) gets that\n // side's marker synthesized. Each edge repairs independently: the\n // screen shows the selected span formatted, so the copy carries the\n // formatting even when both marks fall outside the selection. An edge\n // inside a marker itself (raw-mode oddity) is left exactly as sliced.\n const contentStart = first.to;\n const contentEnd = last.from;\n // Outer nodes visit first: opening repairs append (outer→inner order),\n // closing repairs prepend (inner→outer), so nesting stays well-formed.\n if (from >= contentStart && from < contentEnd) {\n prefix = prefix + state.sliceDoc(first.from, first.to);\n }\n if (to > contentStart && to <= contentEnd) {\n suffix = state.sliceDoc(last.from, last.to) + suffix;\n }\n },\n });\n return prefix + state.sliceDoc(from, to) + suffix;\n}\n\nfunction handleClipboard(event: ClipboardEvent, view: EditorView, cut: boolean): boolean {\n if (event.defaultPrevented) return false;\n const data = event.clipboardData;\n if (!data) return false;\n const ranges = view.state.selection.ranges.filter((range) => !range.empty);\n if (ranges.length === 0) return false;\n\n const markdown = ranges\n .map((range) => balancedSlice(view.state, range.from, range.to))\n .join(view.state.lineBreak);\n data.setData(\"text/plain\", markdown);\n const render = view.state.facet(renderClipboardHtmlFacet);\n const html = render?.(markdown);\n if (html) {\n data.setData(\"text/html\", `<div ${COMPOSE_CLIPBOARD_ATTR}=\"true\">${html}</div>`);\n }\n event.preventDefault();\n\n if (cut && !view.state.readOnly) {\n view.dispatch(view.state.replaceSelection(\"\"), {\n userEvent: \"delete.cut\",\n scrollIntoView: true,\n });\n }\n return true;\n}\n\n/** The copy half of clipboard interop. */\nexport const richCopy: Extension = EditorView.domEventHandlers({\n copy(event, view) {\n return handleClipboard(event, view, false);\n },\n cut(event, view) {\n return handleClipboard(event, view, true);\n },\n});\n","/**\n * Editor-update fan-out that survives `view.setState`.\n *\n * Reactive chrome (toolbar pressed-states, the selection-actions bubble)\n * needs a callback on every selection/doc change. Injecting an\n * `EditorView.updateListener` with `StateEffect.appendConfig` only patches\n * the CURRENT state's configuration — the next `view.setState` (tab switch,\n * file reload) builds a fresh state from the base extensions and the\n * listener silently dies, freezing the chrome at the previous document's\n * context.\n *\n * The bus lives IN the base extensions, so every created state carries it,\n * while subscriptions key on the `EditorView` — the object that is stable\n * across state swaps.\n */\n\nimport { ViewPlugin, type EditorView, type ViewUpdate } from \"@codemirror/view\";\n\nconst subscribers = new WeakMap<EditorView, Set<(update: ViewUpdate) => void>>();\n\n/** Include once in the editor's base extension list. */\nexport const updateBus = ViewPlugin.define((view) => ({\n update(update: ViewUpdate) {\n const set = subscribers.get(view);\n if (!set) return;\n for (const fn of [...set]) fn(update);\n },\n}));\n\n/**\n * Subscribe to every update of `view`, across all its future states.\n * Returns the unsubscribe function — call it in the effect cleanup.\n */\nexport function onEditorUpdate(\n view: EditorView,\n fn: (update: ViewUpdate) => void,\n): () => void {\n let set = subscribers.get(view);\n if (!set) {\n set = new Set();\n subscribers.set(view, set);\n }\n set.add(fn);\n return () => {\n set.delete(fn);\n };\n}\n","/**\n * The one code-syntax palette (One Light values — ADR 0002), consumed by both\n * renderers so code looks the same everywhere it appears:\n *\n * - the EDITOR, via `codeHighlight.ts` (a CodeMirror `HighlightStyle` built\n * from these specs), and\n * - the CLIPBOARD, via `highlightFence.ts` (inline-styled spans — pasted HTML\n * carries no stylesheet, so classes would be dead weight there).\n */\n\nimport { tags, type Tag } from \"@lezer/highlight\";\n\nexport interface CodeStyleSpec {\n tag: Tag | readonly Tag[];\n color: string;\n fontStyle?: string;\n}\n\nexport const CODE_PALETTE: readonly CodeStyleSpec[] = [\n { tag: [tags.keyword, tags.modifier, tags.operatorKeyword], color: \"#a626a4\" },\n { tag: [tags.string, tags.special(tags.string)], color: \"#50a14f\" },\n { tag: tags.comment, color: \"#a0a1a7\", fontStyle: \"italic\" },\n { tag: [tags.number, tags.bool, tags.null, tags.atom], color: \"#986801\" },\n { tag: [tags.function(tags.variableName), tags.function(tags.propertyName)], color: \"#4078f2\" },\n { tag: [tags.typeName, tags.className, tags.namespace], color: \"#c18401\" },\n { tag: tags.definition(tags.variableName), color: \"#e45649\" },\n { tag: tags.propertyName, color: \"#4078f2\" },\n { tag: [tags.tagName, tags.self], color: \"#e45649\" },\n { tag: tags.attributeName, color: \"#986801\" },\n { tag: [tags.regexp, tags.escape], color: \"#0184bc\" },\n { tag: tags.invalid, color: \"#ca1243\" },\n];\n","/**\n * Syntax colors for fenced-code content (ADR 0002). The markdown grammar's\n * own constructs (headings, emphasis, links…) are styled by the decoration\n * registry + editorTheme, NOT here — so this style deliberately covers only\n * tags that code languages emit and markdown does not. The palette itself\n * lives in [codePalette](./codePalette.ts), shared with the clipboard's\n * inline-styled renderer.\n */\n\nimport { HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\n\nimport { CODE_PALETTE } from \"./codePalette\";\n\nconst style = HighlightStyle.define(\n CODE_PALETTE.map((spec) => ({ tag: spec.tag, color: spec.color, fontStyle: spec.fontStyle })),\n);\n\nexport const codeHighlight = syntaxHighlighting(style);\n","/**\n * What the GRAMMAR says a line is — resolved from the Lezer syntax tree, not\n * from regexes over the line's text (#61). Text lies where the tree doesn't:\n * `- item` inside a code fence isn't a list item, a nested ` - item` is one\n * even though its marker isn't at column 0, and ` - item` under a list is\n * a nested item while the same text at top level is indented code. Commands\n * that reshape a line consult this and edit the marker range the PARSER\n * identified.\n */\n\nimport type { EditorState, Line } from \"@codemirror/state\";\nimport { treeAt } from \"./treeAt\";\n\nexport interface LineListInfo {\n kind: \"bullet\" | \"ordered\";\n /** The item carries a task checkbox (`- [ ] …`). */\n task: boolean;\n /** Source range of the list marker (plus checkbox for tasks), INCLUDING the\n * single space that separates it from the content. */\n markFrom: number;\n markTo: number;\n}\n\nexport interface LineStructure {\n /** Line belongs to a BLOCK code context (fenced or indented code, including\n * the fence lines themselves) — structure commands must not rewrite code.\n * Inline code inside a paragraph does not count: the line is still prose. */\n inCode: boolean;\n /** ATX heading when the line is one, with its mark range (hashes +\n * following space). */\n heading: { level: number; markFrom: number; markTo: number } | null;\n list: LineListInfo | null;\n /** Outermost blockquote marker starting this line (`> `), when present. */\n quote: { markFrom: number; markTo: number } | null;\n /** Where this line's own content starts — after indentation and any\n * blockquote markers. A fresh line-type marker belongs here, so indented\n * and quoted lines keep their prefix. */\n contentFrom: number;\n}\n\nconst HEADING = /^ATXHeading(\\d)$/;\n\n/** The slice of Lezer's SyntaxNode these lookups touch. */\ntype NodeLike = {\n readonly name: string;\n readonly from: number;\n readonly to: number;\n readonly parent: NodeLike | null;\n getChild(type: string): NodeLike | null;\n};\n\n/** Extend a mark's end over the single following space, when present. */\nfunction withMarkerSpace(state: EditorState, to: number, lineTo: number): number {\n return to < lineTo && state.sliceDoc(to, to + 1) === \" \" ? to + 1 : to;\n}\n\nfunction firstNonWhitespace(state: EditorState, from: number, to: number): number {\n const text = state.sliceDoc(from, to);\n return from + (text.length - text.trimStart().length);\n}\n\nexport function lineStructure(state: EditorState, line: Line): LineStructure {\n const result: LineStructure = {\n inCode: false,\n heading: null,\n list: null,\n quote: null,\n contentFrom: firstNonWhitespace(state, line.from, line.to),\n };\n\n const tree = treeAt(state, result.contentFrom);\n // Resolve at the first content character. Blockquote markers are container\n // prefixes, not content — step past each one (`> > - x` → resolve at `-`)\n // so the line's own structure is an ancestor of the resolve point.\n let node = tree.resolveInner(result.contentFrom, 1) as unknown as NodeLike;\n while (node.name === \"QuoteMark\" && node.from >= line.from) {\n result.quote ??= {\n markFrom: node.from,\n markTo: withMarkerSpace(state, node.to, line.to),\n };\n result.contentFrom = firstNonWhitespace(state, node.to, line.to);\n node = tree.resolveInner(result.contentFrom, 1) as unknown as NodeLike;\n }\n\n // Every structural fact about the resolve point is one of its ancestors.\n for (let cur: NodeLike | null = node; cur; cur = cur.parent) {\n const name = cur.name;\n if (name === \"FencedCode\" || name === \"CodeBlock\") {\n result.inCode = true;\n continue;\n }\n const heading = HEADING.exec(name);\n if (heading && cur.from >= line.from && cur.from <= result.contentFrom) {\n const mark = cur.getChild(\"HeaderMark\");\n if (mark) {\n result.heading = {\n level: Number(heading[1]),\n markFrom: mark.from,\n markTo: withMarkerSpace(state, mark.to, line.to),\n };\n }\n continue;\n }\n // The innermost ListItem STARTING on this line owns the line's marker; an\n // item merely continuing here (wrapped paragraph) contributes nothing.\n if (name === \"ListItem\" && !result.list && cur.from >= line.from && cur.from <= line.to) {\n const mark = cur.getChild(\"ListMark\");\n if (!mark || mark.from > line.to) continue;\n const taskMark = cur.getChild(\"Task\")?.getChild(\"TaskMarker\") ?? null;\n result.list = {\n kind: cur.parent?.name === \"OrderedList\" ? \"ordered\" : \"bullet\",\n task: Boolean(taskMark),\n markFrom: mark.from,\n markTo: withMarkerSpace(state, (taskMark ?? mark).to, line.to),\n };\n }\n }\n return result;\n}\n","/**\n * Fence lifecycle (#91, interaction-spec §9.5, §12.4–.6).\n *\n * An unclosed fence runs to the end of the document per CommonMark, so the\n * moment ``` is typed everything below renders as one giant code block —\n * grammar-correct, wrong WYSIWYG. The behaviors here keep blocks bounded,\n * enterable, and escapable:\n *\n * - TYPE-TIME close (§12.4): the keystroke completing a fence opener at a\n * line's CONTENT start — top level, inside a list item, inside a quote\n * (positions from `lineStructure`, not a line regex) — inserts an empty\n * content line plus the matching closer at the same content column. The\n * caret STAYS on the opener, so typing continues the language tag\n * (```mermaid — the universal fence idiom, rendered live as the visible\n * pill) and Enter steps onto the content line (§12.5). Quote prefixes are\n * carried onto the inserted lines; list prefixes become continuation\n * indent.\n * - ENTER close: Enter at the end of an unclosed opener line (e.g. pasted)\n * closes it with the caret inside.\n * - ENTER step-in (§12.5): Enter on a CLOSED block's opener whose first\n * content line is empty moves the caret onto that line instead of\n * inserting another.\n * - ENTER exit (§12.6): Enter on the block's empty last content line\n * removes that line and moves the caret below the closing fence,\n * creating the line when the block ends the document.\n *\n * Typing on a CLOSED fence's own rows re-sites into content (§12.7) — see\n * resiteFenceLineTyping — which also closes the old gap where lengthening\n * the opener in place re-opened the block.\n */\n\nimport { EditorSelection, EditorState, Prec, type Transaction } from \"@codemirror/state\";\nimport { keymap, type Command } from \"@codemirror/view\";\n\nimport { lineStructure } from \"../core/lineStructure\";\nimport { treeAt } from \"../core/treeAt\";\n\n/** The FencedCode syntax node, as a structural stand-in (`@lezer/common` stays\n * a transitive dep). Exported because `fenceAt` returns it. */\nexport type FenceNode = {\n readonly name: string;\n readonly from: number;\n readonly to: number;\n readonly parent: FenceNode | null;\n getChildren(type: string): readonly FenceNode[];\n};\n\n/** Continuation prefix for a line inserted inside the same containers as\n * `line` up to `contentStart`: quote marks carry over, everything else\n * becomes plain indent. */\nfunction containerPrefix(text: string): string {\n return [...text].map((c) => (c === \">\" ? \">\" : \" \")).join(\"\");\n}\n\n/** §12.7 — typing on a CLOSED fence's own rows can never edit the fence.\n * On the closing line, trailing text stops it closing (CommonMark allows no\n * info string there) and the block re-opens, swallowing everything below.\n * On the opener, typing extends the language tag — which users hit when they\n * click the block's first gray row meaning to type CODE. Both re-site: the\n * closer row onto a fresh content line before the closer; the opener row to\n * the start of the first content line. (An UNCLOSED opener still types in\n * place — that's the language flow for a pasted fence.) Editing an existing\n * language tag moves to RAW mode, spec-noted. Returns the replacement spec,\n * or null when the insertion is elsewhere. */\nfunction resiteFenceLineTyping(\n tr: Transaction,\n from: number,\n text: string,\n): { changes: { from: number; insert: string }; selection: ReturnType<typeof EditorSelection.cursor>; userEvent: string } | null {\n const state = tr.startState;\n let node = fenceAt(state, from);\n if (!node) {\n // Column 0 of the opener row sits ON the fence node's from-boundary,\n // where side -1 resolves to the sibling before the block. Probe from the\n // line's end instead; only accept a fence whose opener IS this line.\n const line = state.doc.lineAt(from);\n if (from !== line.from || line.to === line.from) return null;\n const probed = fenceAt(state, line.to);\n if (!probed || state.doc.lineAt(probed.from).from !== line.from) return null;\n node = probed;\n }\n const marks = node.getChildren(\"CodeMark\");\n if (marks.length < 2) return null;\n const openerLine = state.doc.lineAt(node.from);\n const closer = marks[marks.length - 1];\n const closerLine = state.doc.lineAt(closer.from);\n if (from >= openerLine.from && from <= openerLine.to) {\n // Fresh-block language flow (§12.4): while the block holds no code yet,\n // typing after the opening marks extends the info string IN PLACE —\n // ```mermaid⏎ — with the visible pill as live feedback. A fence character\n // is excluded (a 4th backtick must not grow the marks), and a block WITH\n // content keeps the clicked-the-gray-row-means-code re-site below.\n const bodyIsEmpty =\n closerLine.number - openerLine.number < 2 ||\n state.doc\n .sliceString(openerLine.to, closerLine.from)\n .split(\"\\n\")\n .every((lineText) => /^[>\\s]*$/.test(lineText));\n if (\n bodyIsEmpty &&\n from >= marks[0].to &&\n from <= openerLine.to &&\n text !== \"`\" &&\n text !== \"~\"\n ) {\n return null;\n }\n // No content line exists in a bare ```/``` pair post-§12.4, but a pasted\n // block may lack one — fall back to a fresh line after the opener.\n if (openerLine.to + 1 <= closerLine.from - 1) {\n const contentStart = openerLine.to + 1;\n return {\n changes: { from: contentStart, insert: text },\n selection: EditorSelection.cursor(contentStart + text.length),\n userEvent: \"input.type\",\n };\n }\n const prefix = containerPrefix(state.doc.sliceString(openerLine.from, node.from));\n const insert = `${state.lineBreak}${prefix}${text}`;\n return {\n changes: { from: openerLine.to, insert },\n selection: EditorSelection.cursor(openerLine.to + insert.length),\n userEvent: \"input.type\",\n };\n }\n if (from < closerLine.from || from > closerLine.to) return null;\n const prefix = containerPrefix(state.doc.sliceString(closerLine.from, closer.from));\n const insert = `${state.lineBreak}${prefix}${text}`;\n const at = closerLine.from - 1;\n return {\n changes: { from: at, insert },\n selection: EditorSelection.cursor(at + insert.length),\n userEvent: \"input.type\",\n };\n}\n\n/** The keystroke that completes a ```/~~~ opener at a line's content start\n * closes the fence below, before the unclosed state can swallow the rest of\n * the document; a keystroke on a closed fence's closing line re-sites onto a\n * fresh content line (§12.7). */\nexport const fenceTypeAutoClose = EditorState.transactionFilter.of((tr: Transaction) => {\n if (!tr.docChanged || !tr.isUserEvent(\"input.type\") || tr.isUserEvent(\"input.type.compose\")) {\n return tr;\n }\n let single: { from: number; ch: string } | null = null;\n let eligible = true;\n tr.changes.iterChanges((fromA, toA, _fromB, _toB, inserted) => {\n const ch = inserted.toString();\n if (single || fromA !== toA || ch.includes(\"\\n\")) eligible = false;\n else single = { from: fromA, ch };\n });\n if (!eligible || !single) return tr;\n\n const resited = resiteFenceLineTyping(tr, (single as { from: number }).from, (single as { ch: string }).ch);\n if (resited) return [resited];\n\n const { ch: typed } = single as { from: number; ch: string };\n if (typed !== \"`\" && typed !== \"~\") return tr;\n const { from } = single as { from: number };\n\n // The line must have been prose before the keystroke — a backtick typed\n // inside an existing block is literal, and an opener line of a closed\n // fence (typing a 4th backtick) must not stack another closer.\n const oldLine = tr.startState.doc.lineAt(from);\n const info = lineStructure(tr.startState, oldLine);\n if (info.inCode) return tr;\n\n // The fence must occupy the line's whole CONTENT — everything after the\n // block markers the grammar sees (list/task marker, quote marks).\n const contentStart = info.list ? info.list.markTo : info.contentFrom;\n const newLine = tr.newDoc.lineAt(from + 1);\n const content = tr.newDoc.sliceString(contentStart, newLine.to);\n if (!/^(`{3,}|~{3,})$/.test(content) || from + 1 !== newLine.to) return tr;\n\n // Continuation prefix for the inserted lines: quote marks carry over,\n // everything else (list markers, indent) becomes plain indent so the new\n // lines stay inside the same container at the fence's column.\n const prefix = containerPrefix(tr.newDoc.sliceString(newLine.from, contentStart));\n const brk = tr.startState.lineBreak;\n return [\n tr,\n {\n changes: { from: newLine.to, insert: `${brk}${prefix}${brk}${prefix}${content}` },\n // The caret STAYS at the end of the opener: typing continues the\n // language tag (```mermaid), Enter steps into the body (§12.5).\n selection: EditorSelection.cursor(newLine.to),\n sequential: true,\n },\n ];\n});\n\n/** The FencedCode ancestor at `pos`, or null.\n *\n * Resolves from {@link treeAt}, not `syntaxTree`: a tree that stops short of\n * `pos` reports it as bare `Document`, and the delete guards then merge a code\n * block into the prose above it. */\nexport function fenceAt(state: EditorState, pos: number): FenceNode | null {\n let node = treeAt(state, pos).resolveInner(pos, -1) as unknown as FenceNode | null;\n while (node && node.name !== \"FencedCode\") node = node.parent;\n return node;\n}\n\nexport const fenceAutoClose: Command = (view) => {\n const { state } = view;\n const { main } = state.selection;\n if (!main.empty) return false;\n const line = state.doc.lineAt(main.head);\n if (main.head !== line.to) return false;\n\n const node = fenceAt(state, main.head);\n // Only on the fence's OPENING line.\n if (!node || node.from < line.from) return false;\n const marks = node.getChildren(\"CodeMark\");\n const open = marks[0];\n if (!open) return false;\n\n if (marks.length >= 2) {\n // §12.5 — closed block: step onto an existing empty first content line.\n // \"Empty\" includes container prefixes — inside a blockquote that line is\n // \"> \", the same shape bodyIsEmpty accepts above.\n if (line.to < state.doc.length) {\n const next = state.doc.lineAt(line.to + 1);\n const closerLine = state.doc.lineAt(marks[marks.length - 1].from);\n if (next.number < closerLine.number && /^[>\\s]*$/.test(next.text)) {\n view.dispatch({\n selection: EditorSelection.cursor(next.to),\n scrollIntoView: true,\n userEvent: \"select\",\n });\n return true;\n }\n }\n return false;\n }\n\n const fence = state.sliceDoc(open.from, open.to);\n const indent = state.sliceDoc(line.from, open.from);\n view.dispatch({\n changes: { from: line.to, insert: `${state.lineBreak}${state.lineBreak}${indent}${fence}` },\n selection: EditorSelection.cursor(line.to + state.lineBreak.length),\n scrollIntoView: true,\n userEvent: \"input\",\n });\n return true;\n};\n\n/** Enter on the block's empty last content line exits below the fence. */\nexport const fenceExitBlock: Command = (view) => {\n const { state } = view;\n const { main } = state.selection;\n if (!main.empty) return false;\n const line = state.doc.lineAt(main.head);\n if (line.from !== line.to) return false; // only a fully empty line exits\n\n const node = fenceAt(state, main.head);\n if (!node || node.from >= line.from) return false;\n const marks = node.getChildren(\"CodeMark\");\n if (marks.length < 2) return false; // unclosed: Enter just adds code lines\n const closing = marks[marks.length - 1];\n // The empty line must sit directly above the closing fence line.\n if (state.doc.lineAt(closing.from).number !== line.number + 1) return false;\n\n const docLen = state.doc.length;\n const changes = [{ from: line.from - 1, to: line.to, insert: \"\" }] as {\n from: number;\n to?: number;\n insert: string;\n }[];\n if (node.to === docLen) changes.push({ from: docLen, insert: state.lineBreak });\n const removed = line.to - line.from + 1;\n view.dispatch({\n changes,\n // Just past the (shifted) closing fence's newline — the line below.\n selection: EditorSelection.cursor(node.to - removed + 1),\n scrollIntoView: true,\n userEvent: \"input\",\n });\n return true;\n};\n\nexport const fenceAutoCloseKeymap = Prec.highest(\n keymap.of([\n { key: \"Enter\", run: fenceAutoClose },\n { key: \"Enter\", run: fenceExitBlock },\n ]),\n);\n","/**\n * Language + block menus for fenced code (ADR 0002).\n *\n * Typing the language right after ``` works while the block is still empty\n * (§12.4 keeps the caret on the opener) — these menus are the POINTER path,\n * and the only path once a block has content: the opener-row pill (real or\n * \"plain\" placeholder) opens a searchable chooser, and right-click anywhere\n * in a block offers \"Set language…\" and \"Copy code\". Menus mount on\n * document.body with inline styles (outside the editor's scoped theme), the\n * same pattern as the table menu.\n */\n\nimport { EditorSelection, type ChangeSpec, type EditorState } from \"@codemirror/state\";\nimport { type EditorView } from \"@codemirror/view\";\nimport { languages } from \"@codemirror/language-data\";\n\nimport { fenceAt } from \"./fenceAutoClose\";\n\n/** `fenceAt` resolves side -1 and misses the fence's own from-boundary — the\n * very position callers naturally pass (node.from). Probe one step in. */\nexport function fenceAtLoose(state: EditorState, pos: number) {\n return fenceAt(state, pos) ?? fenceAt(state, Math.min(pos + 1, state.doc.length));\n}\n\n/** Replace the fence's info string (everything after the opening marks on the\n * opener line) with `info`; null clears it. Null result = no fence at pos. */\nexport function setFenceInfo(\n state: EditorState,\n fencePos: number,\n info: string | null,\n): ChangeSpec | null {\n const node = fenceAtLoose(state, fencePos);\n if (!node) return null;\n const opener = node.getChildren(\"CodeMark\")[0];\n if (!opener) return null;\n const openerLine = state.doc.lineAt(node.from);\n return { from: opener.to, to: openerLine.to, insert: info ?? \"\" };\n}\n\n/** The block's code content (between opener and closer lines). */\nexport function fenceContent(state: EditorState, fencePos: number): string | null {\n const node = fenceAtLoose(state, fencePos);\n if (!node) return null;\n const marks = node.getChildren(\"CodeMark\");\n if (marks.length < 2) return null;\n const openerLine = state.doc.lineAt(node.from);\n const closerLine = state.doc.lineAt(marks[marks.length - 1].from);\n if (closerLine.from - 1 <= openerLine.to) return \"\";\n return state.sliceDoc(openerLine.to + 1, closerLine.from - 1);\n}\n\n/** Write the block's content to the clipboard; returns it (for tests). */\nexport function copyFenceCode(view: EditorView, fencePos: number): string | null {\n const content = fenceContent(view.state, fencePos);\n if (content === null) return null;\n void navigator.clipboard?.writeText(content).catch(() => {\n // Clipboard API denied (rare in the webview): execCommand fallback.\n const area = document.createElement(\"textarea\");\n area.value = content;\n document.body.appendChild(area);\n area.select();\n document.execCommand(\"copy\");\n area.remove();\n });\n return content;\n}\n\ninterface MenuHandle {\n root: HTMLElement;\n destroy(): void;\n}\n\nfunction mountMenu(x: number, y: number): MenuHandle {\n const root = document.createElement(\"div\");\n root.className = \"cm-code-menu\";\n root.setAttribute(\"role\", \"menu\");\n root.style.cssText =\n \"position:fixed;z-index:1000;min-width:12rem;padding:0.25rem;\" +\n \"background:var(--cds-layer-01,#ffffff);border:0.0625rem solid var(--cds-border-subtle-01,#e0e0e0);\" +\n \"border-radius:0.375rem;box-shadow:0 0.125rem 0.75rem rgba(0,0,0,0.18);font-size:0.875rem;\";\n root.style.left = `${x}px`;\n root.style.top = `${y}px`;\n document.body.appendChild(root);\n\n const onOutside = (event: MouseEvent): void => {\n if (!root.contains(event.target as Node)) destroy();\n };\n const onEscape = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") destroy();\n };\n function destroy(): void {\n root.remove();\n document.removeEventListener(\"mousedown\", onOutside, true);\n document.removeEventListener(\"keydown\", onEscape, true);\n }\n // Defer registration past the event that opened the menu.\n setTimeout(() => {\n document.addEventListener(\"mousedown\", onOutside, true);\n document.addEventListener(\"keydown\", onEscape, true);\n }, 0);\n\n const clamp = () => {\n const rect = root.getBoundingClientRect();\n if (rect.right > window.innerWidth) root.style.left = `${x - rect.width}px`;\n if (rect.bottom > window.innerHeight) root.style.top = `${Math.max(0, y - rect.height)}px`;\n };\n queueMicrotask(clamp);\n return { root, destroy };\n}\n\nfunction itemButton(label: string, hint?: string): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = \"cm-code-menu__item\";\n button.style.cssText =\n \"display:flex;justify-content:space-between;gap:1rem;width:100%;padding:0.3rem 0.6rem;\" +\n \"border:none;background:none;text-align:left;cursor:pointer;border-radius:0.25rem;color:inherit;\";\n button.addEventListener(\"mouseenter\", () => (button.style.background = \"var(--cds-layer-hover-01,#e8e8e8)\"));\n button.addEventListener(\"mouseleave\", () => (button.style.background = \"none\"));\n const name = document.createElement(\"span\");\n name.textContent = label;\n button.appendChild(name);\n if (hint) {\n const alias = document.createElement(\"span\");\n alias.textContent = hint;\n alias.style.cssText = \"color:var(--cds-text-secondary,#6f6f6f);font-size:0.75rem;\";\n button.appendChild(alias);\n }\n return button;\n}\n\n/** The markdown info string we write for a chosen language: its shortest\n * alias (`ts`, `js`, `py`) — the idiomatic fence tag. */\nexport function infoFor(name: string): string | null {\n const lang = languages.find((l) => l.name === name);\n if (!lang) return null;\n return [...lang.alias, lang.name.toLowerCase()].sort((a, b) => a.length - b.length)[0];\n}\n\nexport interface LanguageEntry {\n label: string;\n hint?: string;\n info: string | null;\n haystack: string;\n}\n\n/** Fence tags Compose RENDERS rather than parses — no CodeMirror grammar\n * exists for them, so they'd otherwise be absent from the chooser, and\n * type-time auto-close (§12.4) makes this menu the only way to give a\n * from-scratch fence its language. */\nconst RENDERED_FENCE_TAGS: LanguageEntry[] = [\n {\n label: \"Mermaid\",\n hint: \"diagram\",\n info: \"mermaid\",\n haystack: \"mermaid diagram flowchart sequence graph chart\",\n },\n];\n\n/** Every choosable entry: Plain text first, then grammars and rendered tags\n * merged A→Z. */\nexport function languageEntries(): LanguageEntry[] {\n return [\n { label: \"Plain text\", info: null, haystack: \"plain text none\" },\n ...[\n ...languages.map((l) => ({\n label: l.name,\n hint: infoFor(l.name) ?? undefined,\n info: infoFor(l.name),\n haystack: `${l.name} ${l.alias.join(\" \")}`.toLowerCase(),\n })),\n ...RENDERED_FENCE_TAGS,\n ].sort((a, b) => a.label.localeCompare(b.label)),\n ];\n}\n\nexport interface LanguageMenuArgs {\n view: EditorView;\n x: number;\n y: number;\n /** Any position inside the target fence. */\n fencePos: number;\n}\n\n/** Searchable language chooser; picking dispatches the info-string change as\n * one undo step. */\nexport function showLanguageMenu(args: LanguageMenuArgs): void {\n const menu = mountMenu(args.x, args.y);\n\n const search = document.createElement(\"input\");\n search.type = \"text\";\n search.placeholder = \"Search languages…\";\n search.className = \"cm-code-menu__search\";\n search.style.cssText =\n \"width:100%;box-sizing:border-box;margin-bottom:0.25rem;padding:0.3rem 0.5rem;\" +\n \"border:0.0625rem solid var(--cds-border-subtle-01,#e0e0e0);border-radius:0.25rem;font:inherit;outline-color:var(--cds-focus,#0f62fe);\";\n menu.root.appendChild(search);\n\n const list = document.createElement(\"div\");\n list.style.cssText = \"max-height:16rem;overflow-y:auto;\";\n menu.root.appendChild(list);\n\n const apply = (info: string | null): void => {\n const change = setFenceInfo(args.view.state, args.fencePos, info) as {\n from: number;\n to: number;\n insert: string;\n } | null;\n menu.destroy();\n if (change) {\n // Language chosen → drop the caret at the start of the first content\n // line, ready to type the code (or diagram) itself.\n const newLength = args.view.state.doc.length - (change.to - change.from) + change.insert.length;\n const anchor = Math.min(change.from + change.insert.length + 1, newLength);\n args.view.dispatch({\n changes: change,\n selection: EditorSelection.cursor(anchor),\n userEvent: \"input.code.language\",\n });\n }\n args.view.focus();\n };\n\n const entries = languageEntries();\n\n const render = (filter: string): void => {\n list.textContent = \"\";\n const needle = filter.trim().toLowerCase();\n for (const entry of entries.filter((e) => !needle || e.haystack.includes(needle))) {\n const button = itemButton(entry.label, entry.hint);\n button.addEventListener(\"click\", () => apply(entry.info));\n list.appendChild(button);\n }\n };\n render(\"\");\n search.addEventListener(\"input\", () => render(search.value));\n // Enter picks the top visible match.\n search.addEventListener(\"keydown\", (event) => {\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n list.querySelector(\"button\")?.click();\n });\n search.focus();\n}\n\n/** Right-click menu for a code block: set language, copy content. */\nexport function showCodeBlockMenu(args: LanguageMenuArgs): void {\n const menu = mountMenu(args.x, args.y);\n const language = itemButton(\"Set language…\");\n language.addEventListener(\"click\", () => {\n menu.destroy();\n showLanguageMenu(args);\n });\n const copy = itemButton(\"Copy code\");\n copy.addEventListener(\"click\", () => {\n copyFenceCode(args.view, args.fencePos);\n menu.destroy();\n args.view.focus();\n });\n menu.root.append(language, copy);\n}\n","/**\n * The opener-row language affordance (ADR 0002).\n *\n * A CLOSED fence with a language shows its styled CodeInfo text (the pill);\n * one without gets a \"plain\" placeholder pill widget so every block has a\n * click target. Clicking either opens the searchable language chooser;\n * right-clicking anywhere in a block opens the block menu (set language,\n * copy code). Pointer handling is delegated — one listener per editor — and\n * clicks are swallowed on mousedown so the fence caret guard (§12.9) never\n * sees them.\n */\n\nimport { syntaxTree } from \"@codemirror/language\";\nimport { type EditorState, type Extension, type Range, StateField } from \"@codemirror/state\";\nimport { Decoration, type DecorationSet, EditorView, ViewPlugin, WidgetType } from \"@codemirror/view\";\n\nimport { fenceAtLoose, showCodeBlockMenu, showLanguageMenu } from \"./codeLanguageMenu\";\n\nclass PlainLangPill extends WidgetType {\n override eq(): boolean {\n return true;\n }\n\n override toDOM(): HTMLElement {\n const pill = document.createElement(\"span\");\n pill.className = \"cm-code-info cm-code-info--unset\";\n pill.textContent = \"plain\";\n return pill;\n }\n\n override ignoreEvent(): boolean {\n return false;\n }\n}\n\nconst PILL = Decoration.widget({ widget: new PlainLangPill(), side: 1 });\n\nfunction buildPills(state: EditorState): DecorationSet {\n const ranges: Range<Decoration>[] = [];\n syntaxTree(state).iterate({\n enter(node) {\n if (node.name !== \"FencedCode\") return;\n const marks = node.node.getChildren(\"CodeMark\");\n if (marks.length < 2) return; // unclosed: the language flow is typing\n if (node.node.getChildren(\"CodeInfo\").length > 0) return;\n ranges.push(PILL.range(marks[0].to));\n },\n });\n return Decoration.set(ranges, true);\n}\n\nconst plainPillField = StateField.define<DecorationSet>({\n create: buildPills,\n update(value, tr) {\n if (tr.docChanged || syntaxTree(tr.state) !== syntaxTree(tr.startState)) {\n return buildPills(tr.state);\n }\n return value;\n },\n provide: (f) => EditorView.decorations.from(f),\n});\n\n/** The fence containing the event point, resolved through the view. */\nfunction fenceAtEvent(view: EditorView, event: MouseEvent): number | null {\n const pos = view.posAtCoords({ x: event.clientX, y: event.clientY });\n if (pos === null) return null;\n const node = fenceAtLoose(view.state, pos);\n return node ? node.from : null;\n}\n\nconst interactionPlugin = ViewPlugin.define((view) => {\n const onMouseDown = (event: MouseEvent): void => {\n if (event.button !== 0) return;\n const target = event.target as HTMLElement;\n if (!target.closest?.(\".cm-code-info\")) return;\n const fencePos = fenceAtEvent(view, event);\n if (fencePos === null) return;\n // Swallow the press: the pill is a control, not text — the caret must\n // not move (and §12.9 must not re-site it).\n event.preventDefault();\n event.stopPropagation();\n showLanguageMenu({ view, x: event.clientX, y: event.clientY, fencePos });\n };\n\n const onContextMenu = (event: MouseEvent): void => {\n const fencePos = fenceAtEvent(view, event);\n if (fencePos === null) return;\n event.preventDefault();\n showCodeBlockMenu({ view, x: event.clientX, y: event.clientY, fencePos });\n };\n\n view.dom.addEventListener(\"mousedown\", onMouseDown, true);\n view.dom.addEventListener(\"contextmenu\", onContextMenu);\n return {\n destroy() {\n view.dom.removeEventListener(\"mousedown\", onMouseDown, true);\n view.dom.removeEventListener(\"contextmenu\", onContextMenu);\n },\n };\n});\n\nexport const codeLanguageUI: Extension = [plainPillField, interactionPlugin];\n","/**\n * Mermaid rendering, decoupled from CodeMirror — shared by the editor widget,\n * the document export (which ships the SVG to the backend), and the clipboard\n * (which needs a PNG, since Google Docs/Word drop SVG on paste).\n *\n * The mermaid library is heavy (~2 MB minified), so it loads lazily on the\n * first diagram — bundled with the app, never fetched at runtime, so diagrams\n * work fully offline. Render results are cached by source text; PNGs are\n * rasterised once per diagram in the background (see {@link warmMermaidPng})\n * so the SYNCHRONOUS copy event can embed them from cache.\n */\n\nexport type MermaidRenderResult = { ok: true; svg: string } | { ok: false; message: string };\n\n/** Whether a fence info string denotes a rendered mermaid diagram — the tag\n * alone, any casing, no trailing meta (\"mermaid title=x\" is source, not a\n * diagram). The one definition shared by the editor plugin, the export's SVG\n * collector, and the clipboard, so every surface classifies identically. */\nexport function isMermaidFenceInfo(info: string): boolean {\n return /^mermaid\\s*$/i.test(info.trim());\n}\n\nlet mermaidLoader: Promise<typeof import(\"mermaid\").default> | null = null;\n\nfunction loadMermaid(): Promise<typeof import(\"mermaid\").default> {\n mermaidLoader ??= import(\"mermaid\").then((mod) => {\n const mermaid = mod.default;\n mermaid.initialize({\n startOnLoad: false,\n // \"strict\" escapes HTML in labels and blocks script/click directives —\n // fence content is the user's own doc, but pasted diagrams shouldn't\n // be able to inject markup either.\n securityLevel: \"strict\",\n theme: \"neutral\",\n fontFamily: \"inherit\",\n // SVG-native <text> labels, not <foreignObject> HTML: canvas refuses to\n // rasterise foreignObject content (the clipboard PNG taints), and\n // text-only SVGs travel better through the export paths. The root key\n // is what mermaid 11.16 honours (`flowchart.htmlLabels` is deprecated\n // and loses to the root's default).\n htmlLabels: false,\n flowchart: { htmlLabels: false },\n class: { htmlLabels: false },\n // On a parse error mermaid otherwise injects its own bomb-icon SVG\n // into <body>; callers render their own error states.\n suppressErrorRendering: true,\n });\n return mermaid;\n });\n return mermaidLoader;\n}\n\nlet renderSeq = 0;\n\n/** Render results by fence source. Bounded: a doc being actively rewritten\n * produces a new key per keystroke-burst, and SVG strings are not small. */\nconst svgCache = new Map<string, MermaidRenderResult>();\nconst SVG_CACHE_CAP = 100;\n\nfunction remember(source: string, result: MermaidRenderResult): void {\n if (svgCache.size >= SVG_CACHE_CAP) {\n const oldest = svgCache.keys().next().value;\n if (oldest !== undefined) svgCache.delete(oldest);\n }\n svgCache.set(source, result);\n}\n\n/** The cached render for a source, or null — the SYNCHRONOUS path. The widget\n * uses it to fill a re-created diagram in the same task (no pending flash, no\n * measure churn on caret-in/out toggles). */\nexport function getCachedMermaidSvg(source: string): MermaidRenderResult | null {\n return svgCache.get(source) ?? null;\n}\n\n/** Render a mermaid diagram source to SVG, memoised by source. Never rejects —\n * a parse error resolves to `{ ok: false, message }`. */\nexport async function renderMermaidToSvg(source: string): Promise<MermaidRenderResult> {\n const cached = svgCache.get(source);\n if (cached) return cached;\n let result: MermaidRenderResult;\n try {\n const mermaid = await loadMermaid();\n const { svg } = await mermaid.render(`cm-mermaid-${renderSeq++}`, source);\n result = { ok: true, svg };\n } catch (error) {\n result = { ok: false, message: error instanceof Error ? error.message : String(error) };\n }\n remember(source, result);\n return result;\n}\n\n// ── PNG side (clipboard) ─────────────────────────────────────────────────────\n//\n// Keys are the TRIMMED diagram source: the markdown pipeline hands the\n// clipboard a fence body with a trailing newline, the widget hands the warm\n// path the fence's inner text — trimming is the meeting point (the export's\n// SVG map uses the same convention).\n\nconst pngCache = new Map<string, string>();\nconst pngPending = new Set<string>();\nconst PNG_CACHE_CAP = 24;\n\n/** The cached PNG data URI for a diagram source, if it has been rasterised. */\nexport function getCachedMermaidPng(source: string): string | null {\n return pngCache.get(source.trim()) ?? null;\n}\n\n/** Render + rasterise a diagram in the background so a LATER (synchronous)\n * clipboard copy can embed it from cache. Fire-and-forget: failures leave the\n * cache empty and the copy degrades to the source block. */\nexport async function warmMermaidPng(source: string): Promise<void> {\n const key = source.trim();\n if (key === \"\" || pngCache.has(key) || pngPending.has(key)) return;\n pngPending.add(key);\n try {\n const rendered = await renderMermaidToSvg(key);\n if (!rendered.ok) return;\n const png = await rasterizeSvgToPngDataUri(rendered.svg);\n if (!png) return;\n if (pngCache.size >= PNG_CACHE_CAP) {\n const oldest = pngCache.keys().next().value;\n if (oldest !== undefined) pngCache.delete(oldest);\n }\n pngCache.set(key, png);\n } finally {\n pngPending.delete(key);\n }\n}\n\n/** Rasterise an SVG string to a PNG data URI at `scale`× its intrinsic size\n * (2× by default, so the pasted image stays sharp on retina targets).\n * Resolves null when the SVG has no readable dimensions or drawing fails. */\nexport async function rasterizeSvgToPngDataUri(svg: string, scale = 2): Promise<string | null> {\n const dims = svgDimensions(svg);\n if (!dims) return null;\n // WebKit refuses to draw an SVG image without explicit width/height (mermaid\n // emits width=\"100%\" + a viewBox), so pin the intrinsic size first.\n const sized = withExplicitSize(svg, dims);\n const url = URL.createObjectURL(new Blob([sized], { type: \"image/svg+xml\" }));\n try {\n const image = new Image();\n await new Promise<void>((resolve, reject) => {\n image.onload = () => resolve();\n image.onerror = () => reject(new Error(\"svg image failed to load\"));\n image.src = url;\n });\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(dims.width * scale));\n canvas.height = Math.max(1, Math.round(dims.height * scale));\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n return canvas.toDataURL(\"image/png\");\n } catch {\n return null;\n } finally {\n URL.revokeObjectURL(url);\n }\n}\n\n/** Intrinsic diagram size from the root svg's viewBox (mermaid always emits\n * one), falling back to numeric width/height attributes. */\nfunction svgDimensions(svg: string): { width: number; height: number } | null {\n const root = svg.match(/<svg[^>]*>/)?.[0];\n if (!root) return null;\n const viewBox = root.match(/viewBox\\s*=\\s*\"([\\d.\\s+-]+)\"/)?.[1]?.trim().split(/\\s+/);\n if (viewBox?.length === 4) {\n const width = Number(viewBox[2]);\n const height = Number(viewBox[3]);\n if (width > 0 && height > 0) return { width, height };\n }\n const width = Number(root.match(/\\bwidth\\s*=\\s*\"([\\d.]+)\"/)?.[1]);\n const height = Number(root.match(/\\bheight\\s*=\\s*\"([\\d.]+)\"/)?.[1]);\n return width > 0 && height > 0 ? { width, height } : null;\n}\n\nfunction withExplicitSize(svg: string, dims: { width: number; height: number }): string {\n return svg.replace(/<svg([^>]*)>/, (_match, attrs: string) => {\n const cleaned = attrs\n .replace(/\\swidth\\s*=\\s*\"[^\"]*\"/, \"\")\n .replace(/\\sheight\\s*=\\s*\"[^\"]*\"/, \"\");\n return `<svg${cleaned} width=\"${dims.width}\" height=\"${dims.height}\">`;\n });\n}\n","/**\n * Mermaid diagram widget — a closed ```mermaid fence rendered as a diagram\n * block. Clicking the diagram moves the caret into the fence, which flips the\n * block back to source (mermaidPlugin owns that swap).\n *\n * Rendering itself (lazy mermaid load, SVG cache, clipboard PNG warm-up) lives\n * in [mermaidRender](./mermaidRender.ts) — this file owns only the widget:\n * measured heights are cached by source so `estimatedHeight` answers with the\n * real height and re-created widgets never shift the scroll position (the\n * #120 contract).\n */\n\nimport { EditorView, WidgetType } from \"@codemirror/view\";\n\nimport {\n getCachedMermaidSvg,\n renderMermaidToSvg,\n warmMermaidPng,\n type MermaidRenderResult,\n} from \"./mermaidRender\";\n\ntype RenderResult = MermaidRenderResult;\n\nconst measuredHeights = new Map<string, number>();\nconst MEASURED_CACHE_CAP = 100;\n\nfunction rememberHeight(source: string, height: number): void {\n if (measuredHeights.size >= MEASURED_CACHE_CAP) {\n const oldest = measuredHeights.keys().next().value;\n if (oldest !== undefined) measuredHeights.delete(oldest);\n }\n measuredHeights.set(source, height);\n}\n\n/** Pre-measure estimate: diagram height doesn't map cleanly onto source\n * lines, but ~a node-row per line is the right order of magnitude, and the\n * measured cache replaces the guess after the first real render. */\nexport function estimateMermaidHeight(source: string): number {\n const lines = source === \"\" ? 1 : source.split(\"\\n\").length;\n return Math.min(520, Math.max(140, 96 + lines * 32));\n}\n\n/** The rendered source per container, so `updateDOM` can tell a\n * selection-only flip (toggle a class in place) from a source change\n * (rebuild + re-render). */\nconst containerSources = new WeakMap<HTMLElement, string>();\n\nexport class MermaidWidget extends WidgetType {\n constructor(\n readonly source: string,\n /** The fence is covered by a (spanning) selection — native selection\n * paints nothing over a block widget, so the widget shows its own\n * selected state. */\n readonly selected = false,\n ) {\n super();\n }\n\n /** Identity = source + selected. Edits elsewhere shift the fence's position\n * but must not tear down the diagram DOM; a selected flip alone updates\n * the class in place via {@link updateDOM}. */\n override eq(other: MermaidWidget): boolean {\n return other.source === this.source && other.selected === this.selected;\n }\n\n override updateDOM(dom: HTMLElement): boolean {\n if (containerSources.get(dom) !== this.source) return false;\n dom.classList.toggle(\"cm-mermaid-block--selected\", this.selected);\n return true;\n }\n\n override toDOM(view: EditorView): HTMLElement {\n const container = document.createElement(\"div\");\n container.className = \"cm-mermaid-block\";\n if (this.selected) container.classList.add(\"cm-mermaid-block--selected\");\n containerSources.set(container, this.source);\n container.setAttribute(\"role\", \"img\");\n container.setAttribute(\"aria-label\", \"Mermaid diagram — click to select, double-click to edit\");\n container.title = \"Click to select · double-click to edit\";\n // A diagram is an OBJECT first: click selects the whole fence (still\n // rendered — the reveal rule ignores spanning selections), so ⌘C copies\n // it without ever flashing to source. Editing is the deliberate action:\n // double-click, or the Edit chip.\n container.addEventListener(\"mousedown\", (event) => {\n event.preventDefault();\n if (event.detail >= 2) {\n revealSource(view, container);\n } else {\n selectFenceBlock(view, container);\n }\n });\n\n const cached = getCachedMermaidSvg(this.source);\n if (cached) {\n this.fill(container, cached, view);\n } else {\n container.classList.add(\"cm-mermaid-block--pending\");\n container.textContent = \"Rendering diagram…\";\n void renderMermaidToSvg(this.source).then((result) => {\n if (!container.isConnected) return;\n container.classList.remove(\"cm-mermaid-block--pending\");\n container.textContent = \"\";\n this.fill(container, result, view);\n });\n }\n return container;\n }\n\n private fill(container: HTMLElement, result: RenderResult, view: EditorView): void {\n if (result.ok) {\n container.innerHTML = result.svg;\n // Rasterise a clipboard PNG in the background — the copy event is\n // synchronous, so it can only embed diagrams warmed ahead of time.\n // Deferred off the paint path (NOT requestIdleCallback: WebKit never\n // runs it while the window is unfocused).\n window.setTimeout(() => void warmMermaidPng(this.source), 300);\n } else {\n container.classList.add(\"cm-mermaid-block--error\");\n const title = document.createElement(\"div\");\n title.className = \"cm-mermaid-error__title\";\n title.textContent = \"Mermaid couldn't render this diagram — double-click to edit the source\";\n const message = document.createElement(\"pre\");\n message.className = \"cm-mermaid-error__message\";\n message.textContent = result.message;\n container.append(title, message);\n }\n // The hover-revealed Edit chip is the pointer path INTO the source\n // (alongside double-click); a plain click selects the block instead.\n // Present in the ERROR state too — a broken diagram is exactly where\n // the edit affordance matters most.\n const edit = document.createElement(\"span\");\n edit.className = \"cm-mermaid-edit\";\n edit.setAttribute(\"role\", \"button\");\n edit.setAttribute(\"aria-label\", \"Edit diagram source\");\n edit.title = \"Edit source\";\n edit.textContent = \"Edit\";\n edit.addEventListener(\"mousedown\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n revealSource(view, container);\n });\n container.appendChild(edit);\n // Record the real height in a controlled measure pass — never let CM\n // discover the layout shift mid-scroll.\n view.requestMeasure({\n read: () => {\n if (container.isConnected && container.offsetHeight > 0) {\n rememberHeight(this.source, container.offsetHeight);\n }\n },\n });\n }\n\n /** The widget owns its events (click-to-edit); CM must not also react. */\n override ignoreEvent(): boolean {\n return true;\n }\n\n override get estimatedHeight(): number {\n return measuredHeights.get(this.source) ?? estimateMermaidHeight(this.source);\n }\n}\n\n/** Move the caret onto the fence's first content line (the opener when the\n * fence is empty) — the plugin sees the selection inside and reveals the\n * source in the widget's place. */\nfunction revealSource(view: EditorView, container: HTMLElement): void {\n const fenceStart = view.posAtDOM(container);\n const opener = view.state.doc.lineAt(fenceStart);\n view.dispatch({\n selection: { anchor: Math.min(opener.to + 1, view.state.doc.length) },\n });\n view.focus();\n}\n\n/** Select the whole fence as one block. Both endpoints sit ON the fence's\n * boundaries — not inside — so the diagram stays rendered while selected,\n * and ⌘C picks up the full fence markdown (which the clipboard enrichment\n * turns back into the diagram). */\nfunction selectFenceBlock(view: EditorView, container: HTMLElement): void {\n const fenceStart = view.posAtDOM(container);\n const doc = view.state.doc;\n const opener = doc.lineAt(fenceStart);\n const markChar = opener.text.trim()[0];\n const markCount = opener.text.trim().length - opener.text.trim().replace(/^(`+|~+)/, \"\").length;\n const closerRe = new RegExp(`^\\\\s*\\\\${markChar}{${Math.max(markCount, 3)},}\\\\s*$`);\n let end = opener.to;\n for (let lineNumber = opener.number + 1; lineNumber <= doc.lines; lineNumber += 1) {\n const line = doc.line(lineNumber);\n end = line.to;\n if (closerRe.test(line.text)) break;\n }\n view.dispatch({ selection: { anchor: opener.from, head: end } });\n view.focus();\n}\n","/**\n * Mermaid fences (#125) — a CLOSED ```mermaid fence renders as a diagram\n * block while the caret is outside it; a caret or selection touching the\n * fence reveals the source (the code-block contract), and leaving re-renders.\n *\n * A StateField, not a ViewPlugin: the replacement spans line breaks, and CM6\n * only honours block-level multi-line replaces delivered via a field (same\n * constraint as tableField/mathPlugin).\n */\n\nimport { isMermaidFenceInfo } from \"./mermaidRender\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport { type EditorState, type Range, StateField } from \"@codemirror/state\";\nimport { Decoration, type DecorationSet, EditorView } from \"@codemirror/view\";\n\nimport { MermaidWidget } from \"./mermaidWidget\";\n\n// Structural stand-in for a Lezer node — `@lezer/common` is a transitive\n// dep this package deliberately doesn't import from (same convention as\n// tableModel's SyntaxNodeLike).\ntype FenceNodeLike = {\n readonly from: number;\n readonly to: number;\n getChild(type: string): { readonly from: number; readonly to: number } | null;\n getChildren(type: string): readonly unknown[];\n};\n\nexport interface MermaidFence {\n from: number;\n to: number;\n source: string;\n}\n\n\nfunction mermaidFenceAt(state: EditorState, node: FenceNodeLike): MermaidFence | null {\n const info = node.getChild(\"CodeInfo\");\n if (!info || !isMermaidFenceInfo(state.sliceDoc(info.from, info.to))) return null;\n // Closed fences only (opener AND closer CodeMark). An unclosed fence runs\n // to the end of the doc — rendering it while the user is still typing\n // lines would yank the block out from under the caret.\n if (node.getChildren(\"CodeMark\").length < 2) return null;\n // A block replace must cover whole lines. A fence indented inside a list\n // item starts mid-line, so it stays as source instead.\n const opener = state.doc.lineAt(node.from);\n const closer = state.doc.lineAt(node.to);\n if (node.from !== opener.from || node.to !== closer.to) return null;\n const text = node.getChild(\"CodeText\");\n return {\n from: node.from,\n to: node.to,\n source: text ? state.sliceDoc(text.from, text.to) : \"\",\n };\n}\n\nfunction findFences(state: EditorState): MermaidFence[] {\n const fences: MermaidFence[] = [];\n syntaxTree(state).iterate({\n enter(node) {\n if (node.name !== \"FencedCode\") return;\n const fence = mermaidFenceAt(state, node.node);\n if (fence) fences.push(fence);\n },\n });\n return fences;\n}\n\n/** A fence reveals its source only when a selection ENDPOINT sits strictly\n * inside it — click-to-edit places the caret there, and selecting within the\n * revealed source keeps it revealed. A selection merely SPANNING the fence\n * (drag-across, select-all, copying a region) keeps the diagram rendered:\n * flipping to source mid-drag read as \"copying turns it back into code\",\n * and the height jump made the drag jumpy. */\nfunction selectionReveals(state: EditorState, fence: MermaidFence): boolean {\n const inside = (pos: number) => pos > fence.from && pos < fence.to;\n return state.selection.ranges.some((range) => inside(range.anchor) || inside(range.head));\n}\n\ninterface MermaidFieldValue {\n fences: MermaidFence[];\n decorations: DecorationSet;\n}\n\n/** A selection fully covering the fence — the click-to-select state. The\n * widget paints it (native selection can't draw over a block widget). */\nfunction selectionCovers(state: EditorState, fence: MermaidFence): boolean {\n return state.selection.ranges.some(\n (range) => !range.empty && range.from <= fence.from && range.to >= fence.to,\n );\n}\n\nfunction build(state: EditorState, fences: MermaidFence[]): MermaidFieldValue {\n const ranges: Range<Decoration>[] = [];\n for (const fence of fences) {\n if (selectionReveals(state, fence)) continue;\n ranges.push(\n Decoration.replace({\n widget: new MermaidWidget(fence.source, selectionCovers(state, fence)),\n block: true,\n }).range(fence.from, fence.to),\n );\n }\n return { fences, decorations: Decoration.set(ranges, true) };\n}\n\nexport const mermaidField = StateField.define<MermaidFieldValue>({\n create: (state) => build(state, findFences(state)),\n update(value, tr) {\n // Fences re-extract on edits AND on parse progress — CM parses lazily,\n // so fences far down a long doc only enter the tree as the user scrolls\n // (the tableField lesson). Selection-only changes rebuild from the\n // cached fence list: that's the cheap path that flips a fence between\n // widget and source on every caret move.\n if (tr.docChanged || syntaxTree(tr.state) !== syntaxTree(tr.startState)) {\n return build(tr.state, findFences(tr.state));\n }\n if (tr.selection) {\n return build(tr.state, value.fences);\n }\n return value;\n },\n provide: (field) => [\n EditorView.decorations.from(field, (value) => value.decorations),\n // The replaced span is atomic: the caret skips over the widget instead\n // of stepping through hidden fence source. Revealed fences carry no\n // replace decoration, so caret motion inside them stays free.\n EditorView.atomicRanges.of(\n (view) => view.state.field(field, false)?.decorations ?? Decoration.none,\n ),\n ],\n});\n","/**\n * §12.9 — a closed fence's marker rows never hold the caret.\n *\n * The opener/closer lines are block chrome: a caret parked there types\n * somewhere else (the §12.7 re-site), which reads as a jump. Instead the\n * caret is re-placed the moment a selection lands on a marker row:\n *\n * - pointer clicks: nearest content edge (opener → first content line's\n * start, closer → last content line's end)\n * - forward motion (Down/Right): through the row into the block, or out\n * below it; holds at the content edge when nothing follows the block\n * - backward motion (Up/Left): out above the block, or back to content\n *\n * A fence currently rendered as a BLOCK WIDGET (a mermaid diagram) inverts\n * the rule: moving the caret INTO its content would reveal the source — so a\n * click landing beside the widget flipped the diagram to code. Those fences\n * snap the caret to the boundary OUTSIDE the block instead; entering one is\n * a deliberate act (double-click / Edit chip / click-to-edit).\n *\n * Unclosed fences keep the caret — typing a language on a pasted opener\n * needs it — and blocks with no content line are left alone (§12.7 re-sites\n * any typing there safely). Range selections and multi-cursor pass through.\n */\n\nimport { EditorSelection, EditorState, type Transaction } from \"@codemirror/state\";\n\nimport { fenceAt } from \"./fenceAutoClose\";\nimport { mermaidField } from \"../mermaid/mermaidPlugin\";\n\n/** Is this fence currently replaced by a rendered block widget? */\nfunction widgetCovered(state: EditorState, from: number, to: number): boolean {\n const field = state.field(mermaidField, false);\n if (!field) return false;\n let covered = false;\n field.decorations.between(from, to, () => {\n covered = true;\n return false;\n });\n return covered;\n}\n\nexport const fenceCaretGuard = EditorState.transactionFilter.of((tr: Transaction) => {\n if (tr.docChanged || !tr.selection) return tr;\n if (tr.selection.ranges.length > 1) return tr;\n const sel = tr.selection.main;\n if (!sel.empty) return tr;\n\n const state = tr.startState;\n const line = state.doc.lineAt(sel.head);\n if (line.to === line.from) return tr;\n const node = fenceAt(state, line.to);\n if (!node) return tr;\n const marks = node.getChildren(\"CodeMark\");\n if (marks.length < 2) return tr;\n\n const openerLine = state.doc.lineAt(node.from);\n const closerLine = state.doc.lineAt(marks[marks.length - 1].from);\n if (closerLine.number - openerLine.number < 2) return tr;\n const onOpener = line.number === openerLine.number;\n if (!onOpener && line.number !== closerLine.number) return tr;\n\n const covered = widgetCovered(state, node.from, node.to);\n // §12.9 exempts no-content blocks, and a body of only blank (or\n // quote-prefixed blank) lines is no content — the shape type-time\n // auto-close leaves while the language is still being typed on the\n // opener, where arrowing over a typo must not throw the caret out.\n // Widget-rendered fences keep the outside-snap: their opener is hidden\n // chrome regardless of body.\n if (!covered) {\n let bodyEmpty = true;\n for (let n = openerLine.number + 1; n < closerLine.number; n += 1) {\n if (!/^[>\\s]*$/.test(state.doc.line(n).text)) {\n bodyEmpty = false;\n break;\n }\n }\n if (bodyEmpty) return tr;\n }\n\n const oldHead = state.selection.main.head;\n const pointer = tr.isUserEvent(\"select.pointer\");\n const backward = !pointer && sel.head < oldHead;\n\n let target: number;\n if (covered) {\n target = onOpener ? openerLine.from : closerLine.to;\n } else {\n const contentStart = openerLine.to + 1;\n const lastContentEnd = closerLine.from - 1;\n if (onOpener) {\n target = backward && openerLine.from > 0 ? openerLine.from - 1 : contentStart;\n } else if (pointer || backward) {\n target = lastContentEnd;\n } else {\n target = closerLine.to < state.doc.length ? closerLine.to + 1 : lastContentEnd;\n }\n }\n if (target === sel.head) return tr;\n return [tr, { selection: EditorSelection.cursor(target), sequential: true }];\n});\n","/**\n * Fence walls for deletion (interaction-spec §12.1–.3).\n *\n * Fence lines are structure, not text: a character-level join that merges a\n * fence line with its neighbor corrupts the pair — content becomes the\n * opener's invisible info string, or the closer gains trailing text and\n * stops closing, re-pairing the opener with a later fence and swallowing\n * unrelated content. The delete normalizer consults these guards whenever a\n * Backspace/Delete would cross a line boundary; they answer with the §12\n * behavior (wall, park, plain code-line join, or whole-block deletion) and\n * report whether they handled the press.\n */\n\nimport { EditorSelection, type EditorState } from \"@codemirror/state\";\nimport type { EditorView } from \"@codemirror/view\";\n\nimport { fenceAt } from \"./fenceAutoClose\";\n\ninterface BlockInfo {\n openerLine: { number: number; to: number };\n closerLine: { number: number; from: number } | null;\n /** First/last content positions (line-granular). */\n contentFrom: number;\n contentTo: number;\n contentEmpty: boolean;\n}\n\ntype FenceNode = NonNullable<ReturnType<typeof fenceAt>>;\n\nfunction blockInfo(state: EditorState, node: FenceNode): BlockInfo {\n const marks = node.getChildren(\"CodeMark\");\n const openerLine = state.doc.lineAt(node.from);\n const closerMark = marks.length >= 2 ? marks[marks.length - 1] : null;\n const closerLine = closerMark ? state.doc.lineAt(closerMark.from) : null;\n const contentFrom = Math.min(openerLine.to + 1, node.to);\n const contentTo = closerLine ? Math.max(closerLine.from - 1, contentFrom) : node.to;\n const contentEmpty =\n !closerLine ||\n contentFrom >= closerLine.from ||\n state.doc.sliceString(contentFrom, contentTo).trim() === \"\";\n return { openerLine, closerLine, contentFrom, contentTo, contentEmpty };\n}\n\nfunction park(view: EditorView, pos: number): true {\n view.dispatch({\n selection: EditorSelection.cursor(pos),\n scrollIntoView: true,\n userEvent: \"select\",\n });\n return true;\n}\n\nfunction deleteWholeBlock(view: EditorView, node: FenceNode, userEvent: string): true {\n const docLen = view.state.doc.length;\n // Take one bounding newline with the block so no empty line is left behind.\n const to = node.to < docLen ? node.to + 1 : node.to;\n const from = node.to >= docLen && node.from > 0 ? node.from - 1 : node.from;\n view.dispatch({\n changes: { from, to, insert: \"\" },\n selection: EditorSelection.cursor(from),\n scrollIntoView: true,\n userEvent,\n });\n return true;\n}\n\nfunction joinNewline(view: EditorView, at: number, userEvent: string): true {\n view.dispatch({\n changes: { from: at, to: at + 1, insert: \"\" },\n selection: EditorSelection.cursor(at),\n scrollIntoView: true,\n userEvent,\n });\n return true;\n}\n\n/** Backspace whose deletion would cross upward out of `line`. True when the\n * press was handled (edit, park, or deliberate wall no-op). */\nexport function fenceBackspaceGuard(view: EditorView, pos: number): boolean {\n const { state } = view;\n const line = state.doc.lineAt(pos);\n if (line.from === 0) return false;\n const prevLine = state.doc.lineAt(line.from - 1);\n\n const inside = fenceAt(state, pos);\n if (inside) {\n const info = blockInfo(state, inside);\n if (line.number === info.openerLine.number) {\n // Caret on the opener line: joining it onto the prose above dissolves\n // the fence. Move up instead.\n return park(view, prevLine.to);\n }\n if (info.closerLine && line.number === info.closerLine.number) {\n // Caret on the closer line: pulling it up corrupts the pair.\n return park(view, prevLine.to);\n }\n if (prevLine.number === info.openerLine.number) {\n // §12.1 — first content line: the wall is solid; an effectively empty\n // block collapses whole instead.\n if (info.contentEmpty) return deleteWholeBlock(view, inside, \"delete.backward\");\n return true;\n }\n // Interior code lines join plainly — never through blockPrefixLength,\n // which would eat code that merely looks like a list marker.\n return joinNewline(view, line.from - 1, \"delete.backward\");\n }\n\n const prevFence = fenceAt(state, prevLine.to);\n if (prevFence) {\n const info = blockInfo(state, prevFence);\n if (info.closerLine && prevLine.number === info.closerLine.number) {\n // §12.2 — approaching from below: park at the content end (or collapse\n // an empty block whole).\n if (info.contentEmpty) return deleteWholeBlock(view, prevFence, \"delete.backward\");\n return park(view, info.contentTo);\n }\n }\n return false;\n}\n\n/** Forward-delete whose deletion would cross downward out of `line`. */\nexport function fenceDeleteGuard(view: EditorView, pos: number): boolean {\n const { state } = view;\n const line = state.doc.lineAt(pos);\n if (line.to >= state.doc.length) return false;\n const nextLine = state.doc.lineAt(line.to + 1);\n\n const inside = fenceAt(state, pos);\n if (inside) {\n const info = blockInfo(state, inside);\n if (line.number === info.openerLine.number) {\n // Caret on the opener: pulling content up makes it the invisible info\n // string. Step into the block instead.\n return park(view, nextLine.from);\n }\n if (info.closerLine && line.number === info.closerLine.number) {\n return park(view, nextLine.from);\n }\n if (info.closerLine && nextLine.number === info.closerLine.number) {\n // §12.1 mirror — last content line.\n if (info.contentEmpty) return deleteWholeBlock(view, inside, \"delete.forward\");\n return true;\n }\n return joinNewline(view, line.to, \"delete.forward\");\n }\n\n const nextFence = fenceAt(state, Math.min(nextLine.to, state.doc.length));\n if (nextFence && state.doc.lineAt(nextFence.from).number === nextLine.number) {\n const info = blockInfo(state, nextFence);\n // §12.2 mirror — approaching from above: park at the content start.\n if (info.contentEmpty) return deleteWholeBlock(view, nextFence, \"delete.forward\");\n return park(view, info.contentFrom);\n }\n return false;\n}\n","/**\n * Tab inside a fenced code block indents; Shift-Tab dedents (§12.8).\n *\n * Without a binding, the browser's default Tab handling moves FOCUS — the\n * caret \"jumped out of the editor to the rich/raw button\" mid-code. Both\n * commands decline outside code so list indentation (`listIndent.ts`) and\n * the accessibility default keep their behavior everywhere else.\n */\n\nimport { EditorSelection, Prec } from \"@codemirror/state\";\nimport { type Command, keymap } from \"@codemirror/view\";\n\nimport { fenceAt } from \"./fenceAutoClose\";\n\nconst INDENT = \" \";\n\n/** Caret strictly inside a fence (not on the opener/closer lines). */\nfunction inFenceContent(view: Parameters<Command>[0]): boolean {\n const { state } = view;\n const head = state.selection.main.head;\n const node = fenceAt(state, head);\n if (!node) return false;\n const line = state.doc.lineAt(head);\n const marks = node.getChildren(\"CodeMark\");\n if (line.from <= node.from) return false;\n const closer = marks.length >= 2 ? marks[marks.length - 1] : null;\n return !closer || line.to < state.doc.lineAt(closer.from).from;\n}\n\nexport const fenceTabIndent: Command = (view) => {\n if (!inFenceContent(view)) return false;\n const head = view.state.selection.main.head;\n view.dispatch({\n changes: { from: head, insert: INDENT },\n selection: EditorSelection.cursor(head + INDENT.length),\n userEvent: \"input.type\",\n });\n return true;\n};\n\nexport const fenceTabDedent: Command = (view) => {\n if (!inFenceContent(view)) return false;\n const { state } = view;\n const line = state.doc.lineAt(state.selection.main.head);\n const leading = line.text.match(/^ {1,2}/)?.[0].length ?? 0;\n if (leading === 0) return true;\n view.dispatch({\n changes: { from: line.from, to: line.from + leading, insert: \"\" },\n userEvent: \"delete.dedent\",\n });\n return true;\n};\n\nexport const fenceTabKeymap = Prec.high(\n keymap.of([\n { key: \"Tab\", run: fenceTabIndent },\n { key: \"Shift-Tab\", run: fenceTabDedent },\n ]),\n);\n","/**\n * Synchronous fence highlighting for the clipboard (#149).\n *\n * A copy event writes `text/html` synchronously, so highlighting must not\n * await anything. The trick: the grammars are the SAME `@codemirror/language-data`\n * singletons the editor's nested fence parse loads — any fence visible in the\n * editor has its grammar warm, so highlighting the copied code is a sync parse.\n * A cold grammar (copy from a doc whose fence never rendered) kicks the load\n * and returns null: THIS copy ships plain, the next one is highlighted.\n *\n * Output is inline-styled spans (the palette from\n * [codePalette](./codePalette.ts), same colors as the editor) — pasted HTML\n * carries no stylesheet, so classes would be dead weight in Docs/Word.\n */\n\nimport { LanguageDescription } from \"@codemirror/language\";\nimport { languages } from \"@codemirror/language-data\";\nimport { highlightCode, tagHighlighter } from \"@lezer/highlight\";\n\nimport { CODE_PALETTE } from \"./codePalette\";\n\nexport interface HighlightedSpan {\n text: string;\n /** Inline CSS for the span; absent for unstyled text (incl. line breaks). */\n style?: string;\n}\n\nconst styleByClass = new Map(\n CODE_PALETTE.map((spec, index) => [\n `tok${index}`,\n `color:${spec.color}${spec.fontStyle ? `;font-style:${spec.fontStyle}` : \"\"}`,\n ]),\n);\n\n// tagHighlighter implements lezer's tag-containment matching (a token tagged\n// `function(variableName)` matches a spec on either tag) — hand-rolling that\n// gets the precedence subtly wrong.\nconst paletteHighlighter = tagHighlighter(\n CODE_PALETTE.map((spec, index) => ({ tag: spec.tag as never, class: `tok${index}` })),\n);\n\nfunction styleFor(classes: string): string | undefined {\n const styles = classes\n .split(\" \")\n .map((cls) => styleByClass.get(cls))\n .filter(Boolean);\n return styles.length > 0 ? styles.join(\";\") : undefined;\n}\n\n/** Highlight `code` as `lang` into inline-styled spans, or null when no\n * grammar matches or the grammar isn't loaded yet (the load is kicked so a\n * later copy succeeds). Never throws — a parser hiccup falls back to null. */\nexport function highlightFenceSpans(lang: string, code: string): HighlightedSpan[] | null {\n const description = LanguageDescription.matchLanguageName(languages, lang, true);\n if (!description) return null;\n if (!description.support) {\n void description.load().catch(() => {});\n return null;\n }\n try {\n const parser = description.support.language.parser;\n const spans: HighlightedSpan[] = [];\n highlightCode(\n code,\n parser.parse(code),\n paletteHighlighter,\n (text, classes) => spans.push(classes ? { text, style: styleFor(classes) } : { text }),\n () => spans.push({ text: \"\\n\" }),\n );\n return spans;\n } catch {\n return null;\n }\n}\n","/**\n * The rendering contract: one polymorphic shape for \"how does a Lezer node\n * render\", replacing three parallel dispatch surfaces (a data-entry union, a\n * widget-name union + builders map, and a contextual-override switch).\n *\n * NodeRule = (ctx) => Paint — one function per node NAME\n * Paint = which CM6 mechanism — a CLOSED union\n *\n * The openness is split on the right axis: CONSTRUCTS grow (every new node\n * adds a rule — one entry, one place, usually one line via the combinators\n * below), while the ways to PAINT don't (line class / span mark / hide /\n * widget / nothing — CodeMirror's own vocabulary). The single switch over\n * `Paint` lives in the painter (plugin.ts) and never changes when a\n * construct is added.\n *\n * Context (the bare-URL lesson: a node name can mean different things in\n * different parents) is not a bolt-on — every rule IS a function of context;\n * simple rules just ignore it.\n *\n * Extensions contribute rules through {@link nodeRulesFacet}: a plugin that\n * introduces node names ships its rules alongside its grammar, touching no\n * core file.\n */\n\nimport { Facet, type EditorState } from \"@codemirror/state\";\nimport { type Decoration } from \"@codemirror/view\";\n\n// Structural stand-in for a Lezer node (`@lezer/common` is a transitive dep\n// this package deliberately doesn't import from).\nexport interface NodeLike {\n readonly name: string;\n readonly from: number;\n readonly to: number;\n readonly parent: NodeLike | null;\n readonly firstChild: NodeLike | null;\n readonly nextSibling: NodeLike | null;\n readonly prevSibling: NodeLike | null;\n getChild(type: string): NodeLike | null;\n}\n\n/** Everything a rule may consult. */\nexport interface NodeContext {\n readonly name: string;\n readonly from: number;\n readonly to: number;\n /** The parent node's name — the common contextual discriminator. */\n readonly parentName: string | undefined;\n /** Full structural node, for rules that need siblings/children. */\n readonly node: NodeLike;\n /** Rules are pure over state — no view dependency, so non-editor\n * renderers (table cells) can invoke the same rules. */\n readonly state: EditorState;\n}\n\n/** One painting instruction, in CodeMirror's own vocabulary. */\nexport type Paint =\n /** Stamp a line class — on the node's first line, or every spanned line. */\n | { readonly paint: \"lineClass\"; readonly className: string; readonly span: \"first\" | \"all\" }\n /** Style the node's span. */\n | { readonly paint: \"mark\"; readonly className: string }\n /**\n * Hide a range (default: the node, plus its one separator space when\n * line-leading) and make it atomic to caret motion. `atomicTo` widens the\n * atom past the hidden range (marker + space move as one unit).\n */\n | {\n readonly paint: \"hide\";\n readonly range?: { readonly from: number; readonly to: number };\n readonly expandSpace?: boolean;\n readonly atomicTo?: number;\n }\n /** Replace the (hidden) span with a widget decoration. */\n | { readonly paint: \"widget\"; readonly deco: Decoration; readonly atomicTo?: number }\n /** Leave the node alone — visible raw source. */\n | { readonly paint: \"none\" };\n\nexport interface RuleMeta {\n readonly intent: \"render-raw\" | \"structural\";\n readonly why: string;\n}\n\n/** How one node name renders. `meta` tags the deliberate do-nothing rules so\n * the coverage test can insist their reason is documented. */\nexport type NodeRule = ((ctx: NodeContext) => Paint) & { readonly meta?: RuleMeta };\n\nexport type NodeRules = Readonly<Record<string, NodeRule>>;\n\n/* ---------------- Combinators — the common rules as one-liners ------------ */\n\nconst NONE: Paint = { paint: \"none\" };\n\n/** Style the node's span with a class. */\nexport function mark(className: string): NodeRule {\n const paint: Paint = { paint: \"mark\", className };\n return () => paint;\n}\n\n/** Stamp a line class on every line the node spans. */\nexport function line(className: string): NodeRule {\n const paint: Paint = { paint: \"lineClass\", className, span: \"all\" };\n return () => paint;\n}\n\n/** Stamp a line class on the node's first line only (headings). */\nexport function headingLine(className: string): NodeRule {\n const paint: Paint = { paint: \"lineClass\", className, span: \"first\" };\n return () => paint;\n}\n\n/** Hide the node (marker chrome), atomically. */\nexport function hideAlways(): NodeRule {\n const paint: Paint = { paint: \"hide\" };\n return () => paint;\n}\n\n/** Deliberately unstyled-for-now, visible raw — `why` documents the intent. */\nexport function raw(why: string): NodeRule {\n return Object.assign(() => NONE, { meta: { intent: \"render-raw\", why } as RuleMeta });\n}\n\n/** A parser grouping construct, never directly visible — `why` says which. */\nexport function structural(why: string): NodeRule {\n return Object.assign(() => NONE, { meta: { intent: \"structural\", why } as RuleMeta });\n}\n\nexport const none: Paint = NONE;\n\n/* ---------------- Extension seam ----------------------------------------- */\n\n/**\n * Rules contributed by extensions, merged over the base table (an extension\n * may also deliberately override a base rule — last provider wins). The\n * painter reads THIS, never the base table directly.\n */\nexport const nodeRulesFacet = Facet.define<NodeRules, NodeRules>({\n combine(values) {\n return Object.assign({}, ...values);\n },\n});\n","import { forceParsing, language, syntaxTree } from \"@codemirror/language\";\nimport type { Extension } from \"@codemirror/state\";\nimport { ViewPlugin, type EditorView, type ViewUpdate } from \"@codemirror/view\";\n\n/** Work per slice. Small enough to never register as jank between frames. */\nconst SLICE_MS = 10;\n\n/** Gap between slices, leaving the main thread mostly idle while the tail of a\n * large document parses. Markdown covers ~240k characters in ~43ms of work, so\n * even a very large note finishes within a few hundred ms of opening. */\nconst GAP_MS = 25;\n\n/**\n * Drives the parse to the end of the document, establishing the invariant the\n * rest of the editor is written against: **the installed syntax tree covers\n * the whole document**, not just what the viewport happened to render.\n *\n * Without it, CodeMirror's own background work stops 100,000 characters past\n * the viewport (measured: the tree plateaus at 100,739 for a 167k-character\n * document and a 341k one alike, and never advances again). Everything\n * downstream of the tree is then silently wrong for the rest of the document:\n * table and mermaid widgets never materialize, code-language affordances never\n * appear, and structural commands are left to re-parse at the caret\n * ({@link treeAt} — still wanted, since a keystroke can land before this\n * finishes).\n *\n * Scheduled with `setTimeout`, not `requestIdleCallback`: WebKit stops\n * delivering idle callbacks to an unfocused window, and a note opened while\n * the app is in the background must still be parsed when the user comes back\n * to it.\n */\nexport const parseToEnd: Extension = ViewPlugin.fromClass(\n class {\n private timer: number | null = null;\n\n constructor(private readonly view: EditorView) {\n this.schedule();\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged) this.schedule();\n }\n\n destroy() {\n if (this.timer !== null) window.clearTimeout(this.timer);\n }\n\n private schedule() {\n if (this.timer !== null) return;\n this.timer = window.setTimeout(this.work, GAP_MS);\n }\n\n private readonly work = () => {\n this.timer = null;\n const { state } = this.view;\n // Without a language nothing will ever parse; rescheduling would poll\n // forever for a tree that never comes.\n if (!state.facet(language)) return;\n if (syntaxTree(state).length >= state.doc.length) return;\n forceParsing(this.view, state.doc.length, SLICE_MS);\n // Reschedule until covered, not until progress: a slice can spend its\n // whole budget without committing a longer tree (measured: the resume\n // from CodeMirror's own stop point commits nothing on the first slice,\n // then covers the rest of the document on the next).\n this.schedule();\n };\n },\n);\n","/**\n * Horizontal-rule widget — replaces `---` / `***` / `___` source\n * with a styled inline `<span>` that draws a horizontal line.\n *\n * Kept as an inline widget (not `block: true`) so the line still\n * participates in CM6's normal line-metric measurement; CSS draws\n * the rule via a full-width border.\n */\n\nimport { Decoration, EditorView, WidgetType } from \"@codemirror/view\";\n\nimport { type NodeRule } from \"./paint\";\n\nexport class HorizontalRuleWidget extends WidgetType {\n override eq(_other: HorizontalRuleWidget): boolean {\n return true;\n }\n\n override toDOM(_view: EditorView): HTMLElement {\n const span = document.createElement(\"span\");\n span.className = \"cm-hr-widget\";\n return span;\n }\n\n override ignoreEvent(): boolean {\n return false;\n }\n}\n\n/* ---------------- The HorizontalRule rule ---------------- */\n\n\n\n// Stateless → one shared decoration; allocating per node per viewport build\n// is pure GC pressure.\nconst HR_REPLACE = Decoration.replace({ widget: new HorizontalRuleWidget() });\n\n/** `---` → a styled `<hr>` widget. */\nexport const horizontalRuleRule: NodeRule = () => ({ paint: \"widget\", deco: HR_REPLACE });\n","import DOMPurify from \"dompurify\";\n\nimport { type NodeRule, type Paint, none } from \"../core/paint\";\nimport { Decoration, EditorView, WidgetType } from \"@codemirror/view\";\n\nconst SANITIZE_CONFIG = {\n FORBID_TAGS: [\"script\", \"style\", \"iframe\", \"object\", \"embed\", \"form\", \"input\", \"button\"] as string[],\n FORBID_ATTR: [\"on*\"] as string[],\n ALLOWED_URI_REGEXP:\n /^(?:(?:https?|mailto|tel|data:image\\/(?:png|jpeg|gif|webp|svg\\+xml)):)/i,\n RETURN_TRUSTED_TYPE: false,\n};\n\n/**\n * Would this HTML draw anything the user can SEE once sanitized? A stripped\n * or unknown tag (`<yourname>`, `</b>`, `<script>…`) sanitizes to nothing —\n * replacing such a span with a widget renders the user's text invisibly, the\n * same dead-zone class as the hidden bare-URL bug. Callers keep the raw\n * source visible instead of widget-replacing when this is false.\n *\n * Memoized: the rules invoke this per HTML node on every painter rebuild\n * (each keystroke), and the verdict for a given string never changes — the\n * sanitize + template parse must not run repeatedly for unchanged spans.\n */\nconst visibilityVerdicts = new Map<string, boolean>();\nconst VERDICT_CACHE_MAX = 500;\n\nexport function htmlRendersVisibly(html: string): boolean {\n // Without a DOM there is nothing to probe; report invisible so rules leave\n // the raw source in place (never a widget a non-DOM host can't render).\n if (typeof document === \"undefined\") return false;\n const cached = visibilityVerdicts.get(html);\n if (cached !== undefined) return cached;\n const probe = document.createElement(\"template\");\n probe.innerHTML = DOMPurify.sanitize(html, SANITIZE_CONFIG) as unknown as string;\n const content = probe.content;\n const visible =\n (content.textContent ?? \"\").trim() !== \"\" || content.querySelector(\"img, br, hr\") !== null;\n if (visibilityVerdicts.size >= VERDICT_CACHE_MAX) {\n const oldest = visibilityVerdicts.keys().next().value;\n if (oldest !== undefined) visibilityVerdicts.delete(oldest);\n }\n visibilityVerdicts.set(html, visible);\n return visible;\n}\n\nexport class HtmlWidget extends WidgetType {\n constructor(\n readonly html: string,\n readonly isBlock: boolean,\n ) {\n super();\n }\n\n override eq(other: HtmlWidget): boolean {\n return other.html === this.html && other.isBlock === this.isBlock;\n }\n\n override toDOM(_view: EditorView): HTMLElement {\n const container = document.createElement(this.isBlock ? \"div\" : \"span\");\n container.className = this.isBlock ? \"cm-html-block\" : \"cm-html-inline\";\n container.innerHTML = DOMPurify.sanitize(this.html, SANITIZE_CONFIG) as unknown as string;\n return container;\n }\n\n override ignoreEvent(): boolean {\n return false;\n }\n}\n\n/* ---------------- The HTMLTag / HTMLBlock rules ---------------- */\n\n/** An inline `<tag>` → rendered HTML; a tag that sanitizes to nothing visible\n * (`<yourname>`, `</b>`, `<script>`) stays raw text — never an invisible\n * hole where the user's typing vanished. */\nexport const htmlInlineRule: NodeRule = (ctx): Paint => {\n const html = ctx.state.sliceDoc(ctx.from, ctx.to);\n if (!htmlRendersVisibly(html)) return none;\n return { paint: \"widget\", deco: Decoration.replace({ widget: new HtmlWidget(html, false) }) };\n};\n\n/** A single-line HTML block → rendered HTML. Multi-line blocks stay raw\n * source: they fail CM6's \"no plugin-level multi-line replace\" rule, until a\n * StateField carries them (Phase 5). Same invisible-hole guard as inline. */\nexport const htmlBlockRule: NodeRule = (ctx): Paint => {\n const doc = ctx.state.doc;\n if (doc.lineAt(ctx.from).number !== doc.lineAt(ctx.to).number) return none;\n const html = ctx.state.sliceDoc(ctx.from, ctx.to);\n if (!htmlRendersVisibly(html)) return none;\n return { paint: \"widget\", deco: Decoration.replace({ widget: new HtmlWidget(html, true) }) };\n};\n","/**\n * Display-time resolution of image `src` values for the editor — the\n * environment-agnostic pieces.\n *\n * Markdown stores image references **workspace-relative and portable** (e.g.\n * `images/pasted-….png`), which is what lands on disk and survives moving the\n * folder between machines. A WebView, though, can't load a bare relative path\n * against its app origin, so a host that streams local files needs to map the\n * reference onto its own asset protocol.\n *\n * This module provides the host-independent parts: the POSIX path helpers\n * (`computeFileDir` / `joinPath` / …), the `hasUriScheme` guard, and\n * `defaultResolveImageSrc` (render as-is — the browser/SSR default). A desktop\n * host composes these with its file API (e.g. Tauri `convertFileSrc`) to build\n * its own resolver and injects it via the editor's `resolveImageSrc` prop. The\n * stored markdown reference is never rewritten — only the rendered `<img src>`.\n *\n * Paths are treated as POSIX (`/`), matching the macOS/Linux workspace folders\n * this targets. Windows-style drive paths are passed through unresolved.\n */\nexport interface ImageResolveContext {\n /** Absolute OS directory of the markdown file being edited, or null. */\n fileDir: string | null;\n}\n\n// Anything that already carries a scheme (`data:`, `http(s):`, `asset:`,\n// `blob:`, `file:`, `tauri:`, `mailto:` …), a protocol-relative `//`, or a bare\n// fragment `#` is \"already resolvable\" — no path resolution applies.\nconst HAS_SCHEME = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/|#)/i;\n\n/**\n * True when `src` already carries a URI scheme, a protocol-relative `//`, or a\n * bare fragment — i.e. it's directly loadable and needs no path resolution. A\n * host's display-src resolver uses this to decide whether to map a relative\n * workspace path onto its own asset protocol.\n */\nexport function hasUriScheme(src: string): boolean {\n return HAS_SCHEME.test(src.trim());\n}\n\n/**\n * Environment-agnostic default for the editor's `resolveImageSrcFacet`: render\n * the reference as-is. Data URLs and absolute/schemed URLs load directly; a\n * relative ref resolves against the page origin (or shows broken if no backing\n * file). A desktop host overrides the facet with its own resolver, which maps\n * relative paths onto a local asset protocol.\n */\nexport function defaultResolveImageSrc(rawSrc: string, _ctx: ImageResolveContext): string {\n return rawSrc.trim();\n}\n\n/**\n * The directory a relative image reference resolves against: the folder\n * containing the active markdown file. Falls back to the workspace root when\n * the file path is unknown, and to null when there's no workspace.\n */\nexport function computeFileDir(\n workspaceRoot: string | null | undefined,\n filePath: string | null | undefined,\n): string | null {\n if (!workspaceRoot) return null;\n if (!filePath) return workspaceRoot;\n return dirnamePath(joinPath(workspaceRoot, filePath));\n}\n\nexport function isAbsolutePath(p: string): boolean {\n return p.startsWith(\"/\");\n}\n\n/** POSIX `dirname`: the parent of a path, with trailing slashes ignored. */\nexport function dirnamePath(p: string): string {\n const trimmed = p.replace(/\\/+$/, \"\");\n const idx = trimmed.lastIndexOf(\"/\");\n if (idx < 0) return \".\";\n if (idx === 0) return \"/\";\n return trimmed.slice(0, idx);\n}\n\n/**\n * Join `rel` onto `dir`, normalizing `.` and `..` segments. Absolute-ness is\n * inherited from `dir`; `..` never escapes above an absolute root.\n */\nexport function joinPath(dir: string, rel: string): string {\n const isAbs = isAbsolutePath(dir);\n const out: string[] = [];\n for (const part of `${dir}/${rel}`.split(\"/\")) {\n if (part === \"\" || part === \".\") continue;\n if (part === \"..\") {\n if (out.length && out[out.length - 1] !== \"..\") {\n out.pop();\n } else if (!isAbs) {\n out.push(\"..\");\n }\n continue;\n }\n out.push(part);\n }\n return (isAbs ? \"/\" : \"\") + out.join(\"/\");\n}\n","/**\n * Host-environment injection seams.\n *\n * The editor surface is environment-agnostic: it knows how to render and edit\n * markdown, but NOT how to read/write files, resolve asset URLs, or open links —\n * those depend on where it's embedded (a Tauri desktop shell, a plain browser, a\n * server-rendered preview). Each capability is a CM6 facet with a sensible\n * browser default; the React host overrides it by setting the facet from a prop.\n *\n * Keeping these as facets (not React context) lets the non-React CM6 plugins and\n * widgets — image paste handlers, the inline `<img>` widget, the click model —\n * read them straight off `view.state`.\n */\n\nimport { Facet } from \"@codemirror/state\";\n\nimport { defaultResolveImageSrc, type ImageResolveContext } from \"../../imageSrcResolver\";\nimport { type SourceRange } from \"../../types\";\n\nexport type ResolveImageSrc = (rawSrc: string, ctx: ImageResolveContext) => string;\nexport type SaveImageBytes = (relPath: string, bytes: Uint8Array) => Promise<void>;\nexport type OpenExternalUrl = (url: string) => void;\n/** Viewport point a comment composer should anchor to (the right-click point). */\nexport type CommentAnchor = { x: number; y: number };\nexport type CommentOnExcerpt = (\n excerpt: { text: string; range: SourceRange },\n anchor: CommentAnchor,\n) => void;\n\n/**\n * Turn a markdown image `src` into a URL the view can load. Default: pass the\n * reference through unchanged (data URLs and absolute URLs render directly; a\n * browser resolves relative refs against the page origin). A desktop host\n * overrides this to map workspace-relative paths onto its asset protocol.\n */\nexport const resolveImageSrcFacet = Facet.define<ResolveImageSrc, ResolveImageSrc>({\n combine: (values) => values[0] ?? defaultResolveImageSrc,\n});\n\n/**\n * Persist pasted/dropped image bytes at a workspace-relative path. Default:\n * `null` — the insert pipeline then inlines the image as a `data:` URL so it\n * still survives a reload. A desktop host provides a writer that saves to disk\n * and the markdown reference stays a portable relative path.\n */\nexport const saveImageBytesFacet = Facet.define<SaveImageBytes | null, SaveImageBytes | null>({\n combine: (values) => values[0] ?? null,\n});\n\n/**\n * Open a clicked external link. Default: a new browser tab. A desktop host\n * overrides this to leave the app's webview via its shell-open API.\n */\nexport const openExternalUrlFacet = Facet.define<OpenExternalUrl, OpenExternalUrl>({\n combine: (values) => values[0] ?? defaultOpenExternalUrl,\n});\n\n/**\n * Comment on a selected table row/column — the table context menu hands its\n * excerpt + anchor point here. Default: `null` — the menu then omits its\n * \"Comment on this row/column\" items. A desktop host opens its comment composer\n * (the same one a text selection uses) seeded with the excerpt.\n */\nexport const commentOnExcerptFacet = Facet.define<\n CommentOnExcerpt | null,\n CommentOnExcerpt | null\n>({\n combine: (values) => values[0] ?? null,\n});\n\nfunction defaultOpenExternalUrl(url: string): void {\n if (typeof window !== \"undefined\") {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n }\n}\n","/**\n * Image-insertion pipeline. Used by both paste-from-clipboard and\n * drag-and-drop. Both produce a `Blob`; this module turns the blob\n * into a markdown-reference-able path:\n *\n * * When a `saveBytes` writer is injected (a desktop host): writes\n * the bytes to `images/<timestamp>-<hash>.<ext>` and returns the\n * relative path. The markdown reference is portable across\n * machines because it's a real on-disk file.\n * * Otherwise (plain browser, or the write fails): falls back to a\n * data URL embedded directly in the markdown. The markdown file\n * bloats but the image stays visible through page reload without\n * needing a binary file API.\n *\n * The writer is injected rather than imported so this module stays\n * environment-agnostic — the editor reads it off a CM6 facet\n * ({@link saveImageBytesFacet}) the host wires up.\n *\n * Returned `markdownReference` is what the caller drops into\n * ``. `warning` is set in the data-URL fallback case so\n * the caller can surface a note to the user.\n */\nexport interface ImageInsertOptions {\n blob: Blob;\n /**\n * Persist the bytes at a workspace-relative path. `null`/omitted ⇒\n * inline as a data URL (browser fallback).\n */\n saveBytes?: ((relPath: string, bytes: Uint8Array) => Promise<void>) | null;\n /**\n * Alt text the user typed (currently always synthesized as\n * \"pasted-image\" or \"dropped-image\"; in phase 3d the inline\n * rename UI lets the user edit it post-insert).\n */\n alt?: string;\n}\n\nexport interface ImageInsertResult {\n markdownReference: string;\n alt: string;\n warning?: string;\n}\n\n/**\n * Save the blob and return the markdown reference. Errors are\n * structured (the caller decides whether to retry with a fallback\n * or surface a notification).\n */\nexport async function insertImageBlob(opts: ImageInsertOptions): Promise<ImageInsertResult> {\n const alt = opts.alt ?? defaultAltFromMime(opts.blob.type);\n const filename = buildImageFilename(opts.blob.type);\n\n // Try the on-disk pipeline first. Falls back to a data URL when no\n // writer is injected (plain browser) or the write fails for a\n // recoverable reason.\n if (opts.saveBytes) {\n try {\n const bytes = new Uint8Array(await opts.blob.arrayBuffer());\n await opts.saveBytes(`images/${filename}`, bytes);\n return {\n markdownReference: `images/${filename}`,\n alt,\n };\n } catch (error) {\n return {\n markdownReference: await blobToDataUrl(opts.blob),\n alt,\n warning:\n error instanceof Error\n ? `Saved as inline data URL: ${error.message}`\n : \"Saved as inline data URL — workspace write unavailable\",\n };\n }\n }\n\n return {\n markdownReference: await blobToDataUrl(opts.blob),\n alt,\n warning: \"Saved as inline data URL — no file storage configured\",\n };\n}\n\n/**\n * Build a markdown image insertion string from the result. Keeps\n * the call site (handlePaste / handleDrop) tidy.\n */\nexport function buildImageMarkdown(result: ImageInsertResult): string {\n return ``;\n}\n\n/**\n * Scan a DataTransferItemList for image blobs. Returns every\n * image found, in order. Empty array when nothing matches —\n * caller treats that as \"fall through to text paste\".\n */\nexport function extractImageBlobs(items: DataTransferItemList | null | undefined): Blob[] {\n if (!items) return [];\n const blobs: Blob[] = [];\n for (let i = 0; i < items.length; i += 1) {\n const item = items[i];\n if (item.kind === \"file\" && item.type.startsWith(\"image/\")) {\n const blob = item.getAsFile();\n if (blob) {\n blobs.push(blob);\n }\n }\n }\n return blobs;\n}\n\n/**\n * Scan a FileList (drag-and-drop's `dataTransfer.files`) for\n * image files. Drag-drop and paste use different shapes; this\n * keeps the two paths symmetrical at the call site.\n */\nexport function extractImageFiles(files: FileList | null | undefined): File[] {\n if (!files) return [];\n const out: File[] = [];\n for (let i = 0; i < files.length; i += 1) {\n const file = files[i];\n if (file.type.startsWith(\"image/\")) {\n out.push(file);\n }\n }\n return out;\n}\n\nfunction defaultAltFromMime(mime: string): string {\n const sub = mime.split(\"/\")[1] ?? \"image\";\n return `pasted-${sub}`;\n}\n\nfunction buildImageFilename(mime: string): string {\n const ext = extensionForMime(mime);\n // Timestamp first so files sort chronologically; short suffix\n // disambiguates within-tick collisions (multi-image drops).\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\");\n const suffix = Math.random().toString(36).slice(2, 8);\n return `pasted-${ts}-${suffix}.${ext}`;\n}\n\nfunction extensionForMime(mime: string): string {\n switch (mime) {\n case \"image/png\":\n return \"png\";\n case \"image/jpeg\":\n case \"image/jpg\":\n return \"jpg\";\n case \"image/gif\":\n return \"gif\";\n case \"image/webp\":\n return \"webp\";\n case \"image/svg+xml\":\n return \"svg\";\n case \"image/bmp\":\n return \"bmp\";\n default:\n return \"bin\";\n }\n}\n\nasync function blobToDataUrl(blob: Blob): Promise<string> {\n // Built-in `FileReader.readAsDataURL` is the conventional path\n // but it isn't available in node test environments. Building\n // the data URL by hand from the byte buffer keeps the helper\n // testable AND avoids an extra async hop in production.\n const buffer = new Uint8Array(await blob.arrayBuffer());\n const base64 = bytesToBase64(buffer);\n const mime = blob.type || \"application/octet-stream\";\n return `data:${mime};base64,${base64}`;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n // Browser path — `btoa` over the string built from char codes.\n if (typeof btoa === \"function\") {\n let binary = \"\";\n const chunk = 0x8000;\n for (let i = 0; i < bytes.length; i += chunk) {\n // String.fromCharCode handles small slices; chunking\n // avoids the \"Maximum call stack size exceeded\" issue with\n // the spread operator on multi-MB images.\n binary += String.fromCharCode(...bytes.subarray(i, i + chunk));\n }\n return btoa(binary);\n }\n // Node path — Buffer is available in vitest's node environment.\n // We use `globalThis` to avoid pulling in a Node type\n // declaration on the browser side.\n const buffer = (globalThis as unknown as { Buffer?: { from: (b: Uint8Array) => { toString: (enc: string) => string } } }).Buffer;\n if (buffer && typeof buffer.from === \"function\") {\n return buffer.from(bytes).toString(\"base64\");\n }\n throw new Error(\"No base64 encoder available in this environment\");\n}\n","import type { EditorView } from \"@codemirror/view\";\n\n/**\n * The \"edit this image's alt text\" custom-event contract — a plain constant and\n * type with NO runtime CodeMirror dependency (the `EditorView` reference is\n * `import type`, erased at build). The lazy-loaded editor dispatches this event;\n * the host shell listens for it. Keeping the contract here means a host can\n * import the event name without pulling the whole editor into its initial\n * bundle (it previously came from `imageActionMenu`, which imports CodeMirror).\n */\nexport const IMAGE_EDIT_ALT_EVENT = \"ai-editor:edit-image-alt\";\n\nexport interface ImageEditAltEventDetail {\n view: EditorView;\n sourceFrom: number;\n sourceTo: number;\n currentAlt: string;\n rawSrc: string;\n}\n","import { EditorView } from \"@codemirror/view\";\n\nimport {\n buildImageMarkdown,\n insertImageBlob,\n} from \"../../imageInsert\";\nimport { saveImageBytesFacet } from \"../core/hostFacets\";\nimport { IMAGE_EDIT_ALT_EVENT, type ImageEditAltEventDetail } from \"./imageEditEvent\";\n\ninterface ShowMenuArgs {\n x: number;\n y: number;\n view: EditorView;\n alt: string;\n rawSrc: string;\n sourceFrom: number;\n sourceTo: number;\n}\n\nexport function showImageActionMenu(args: ShowMenuArgs): void {\n const menu = document.createElement(\"div\");\n menu.className = \"cm-image-menu\";\n menu.setAttribute(\"role\", \"menu\");\n menu.style.position = \"fixed\";\n menu.style.left = `${args.x}px`;\n menu.style.top = `${args.y}px`;\n menu.style.zIndex = \"1000\";\n\n function destroy() {\n menu.remove();\n document.removeEventListener(\"mousedown\", onOutside, true);\n document.removeEventListener(\"keydown\", onEscape, true);\n }\n\n function onOutside(e: MouseEvent) {\n if (!menu.contains(e.target as Node)) destroy();\n }\n\n function onEscape(e: KeyboardEvent) {\n if (e.key === \"Escape\") destroy();\n }\n\n function makeItem(label: string, onClick: () => void, danger = false): HTMLButtonElement {\n const b = document.createElement(\"button\");\n b.type = \"button\";\n b.className = danger\n ? \"cm-image-menu__item cm-image-menu__item--danger\"\n : \"cm-image-menu__item\";\n b.setAttribute(\"role\", \"menuitem\");\n b.textContent = label;\n b.addEventListener(\"click\", () => {\n onClick();\n destroy();\n });\n return b;\n }\n\n menu.appendChild(\n makeItem(\"Edit alt text…\", () => {\n const event = new CustomEvent<ImageEditAltEventDetail>(IMAGE_EDIT_ALT_EVENT, {\n detail: {\n view: args.view,\n sourceFrom: args.sourceFrom,\n sourceTo: args.sourceTo,\n currentAlt: args.alt,\n rawSrc: args.rawSrc,\n },\n });\n window.dispatchEvent(event);\n }),\n );\n\n menu.appendChild(\n makeItem(\"Replace image…\", () => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n input.onchange = () => {\n const file = input.files?.[0];\n if (!file) return;\n void (async () => {\n try {\n const result = await insertImageBlob({\n blob: file,\n saveBytes: args.view.state.facet(saveImageBytesFacet),\n });\n const newMd = buildImageMarkdown(result);\n args.view.dispatch({\n changes: { from: args.sourceFrom, to: args.sourceTo, insert: newMd },\n userEvent: \"input.replace.image\",\n });\n } catch (error) {\n console.error(\"Failed to replace image:\", error);\n }\n })();\n };\n input.click();\n }),\n );\n\n menu.appendChild(\n makeItem(\"Copy markdown source\", () => {\n const source = args.view.state.sliceDoc(args.sourceFrom, args.sourceTo);\n void navigator.clipboard.writeText(source);\n }),\n );\n\n menu.appendChild(\n makeItem(\n \"Delete image\",\n () => {\n args.view.dispatch({\n changes: { from: args.sourceFrom, to: args.sourceTo, insert: \"\" },\n userEvent: \"delete.image\",\n });\n },\n true,\n ),\n );\n\n document.body.appendChild(menu);\n\n const rect = menu.getBoundingClientRect();\n const overflowRight = rect.right - window.innerWidth;\n if (overflowRight > 0) menu.style.left = `${args.x - overflowRight - 8}px`;\n const overflowBottom = rect.bottom - window.innerHeight;\n if (overflowBottom > 0) menu.style.top = `${args.y - overflowBottom - 8}px`;\n\n setTimeout(() => {\n document.addEventListener(\"mousedown\", onOutside, true);\n document.addEventListener(\"keydown\", onEscape, true);\n }, 0);\n}\n","/**\n * Inline image widget — renders markdown `` as a real\n * `<img>` element.\n *\n * Source resolution goes through `resolveDisplaySrc` (the same\n * function the Tiptap editor uses), so workspace-relative paths\n * become `asset://…` URLs that the Tauri WebKit can stream from\n * disk.\n *\n * Click handling is intentionally minimal in this phase: the widget\n * doesn't intercept clicks, so a click lands the caret at the\n * widget's boundary. Spec section 7.6 calls for \"click selects image\n * block + toolbar\"; that ships when the image metadata editor lands\n * in a later phase.\n */\n\nimport { Facet } from \"@codemirror/state\";\nimport { type NodeRule, type Paint } from \"../core/paint\";\nimport { Decoration, EditorView, WidgetType } from \"@codemirror/view\";\n\nimport { type ImageResolveContext } from \"../../imageSrcResolver\";\nimport { resolveImageSrcFacet } from \"../core/hostFacets\";\nimport { showImageActionMenu } from \"./imageActionMenu\";\n\n/**\n * Resolver facet — wired by the React editor so the plugin can turn\n * relative `images/foo.png` into a `<img src=…>` the webview can\n * fetch. Combine returns the first registered resolver, or a no-op\n * if none.\n */\nexport const imageContextFacet = Facet.define<\n ImageResolveContext,\n ImageResolveContext\n>({\n combine: (values) => values[0] ?? { fileDir: null },\n});\n\n/** Rendered heights per image, so a re-render (tab switch, edits above)\n * reserves the real space instead of re-guessing. Keyed by resolve context +\n * src — the same image in two docs can render at different widths. */\nconst measuredImageHeights = new Map<string, number>();\n\n/** Pre-load estimate. CM6 places everything below an unmeasured widget with\n * this; images previously claimed one text line, so each unloaded image hid\n * ~180px of scroll error that surfaced as a viewport jump on load. */\nconst IMAGE_ESTIMATE_PX = 200;\n\nexport class ImageWidget extends WidgetType {\n private readonly measureKey: string;\n\n constructor(\n readonly alt: string,\n readonly rawSrc: string,\n readonly ctx: ImageResolveContext,\n /** Source range of the `` markdown that produced this widget. */\n readonly sourceFrom: number,\n readonly sourceTo: number,\n ) {\n super();\n this.measureKey = `${ctx.fileDir ?? \"\"}\\n${rawSrc}`;\n }\n\n override eq(other: ImageWidget): boolean {\n return (\n other.alt === this.alt &&\n other.rawSrc === this.rawSrc &&\n other.ctx.fileDir === this.ctx.fileDir &&\n other.sourceFrom === this.sourceFrom\n );\n }\n\n override toDOM(view: EditorView): HTMLElement {\n const img = document.createElement(\"img\");\n img.className = \"cm-image-widget\";\n img.alt = this.alt;\n img.src = view.state.facet(resolveImageSrcFacet)(this.rawSrc, this.ctx);\n img.loading = \"lazy\";\n // The real height arrives asynchronously; record it and re-measure NOW —\n // in a controlled pass — rather than letting CM discover the layout shift\n // during the user's next scroll or selection.\n img.addEventListener(\"load\", () => {\n const height = img.offsetHeight || img.naturalHeight;\n if (height > 0) {\n measuredImageHeights.set(this.measureKey, height);\n }\n view.requestMeasure();\n });\n img.addEventListener(\"error\", () => view.requestMeasure());\n img.addEventListener(\"contextmenu\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n showImageActionMenu({\n x: e.clientX,\n y: e.clientY,\n view,\n alt: this.alt,\n rawSrc: this.rawSrc,\n sourceFrom: this.sourceFrom,\n sourceTo: this.sourceTo,\n });\n });\n return img;\n }\n\n override ignoreEvent(): boolean {\n return false;\n }\n\n override get estimatedHeight(): number {\n return measuredImageHeights.get(this.measureKey) ?? IMAGE_ESTIMATE_PX;\n }\n}\n\n/* ---------------- The Image rule ---------------- */\n\n/** `` → an inline `<img>` widget; src resolution via the host\n * facet (workspace-relative paths → asset URLs). */\nexport const imageRule: NodeRule = (ctx): Paint => {\n const state = ctx.state;\n const label = ctx.node.getChild(\"LinkLabel\");\n const url = ctx.node.getChild(\"URL\");\n const alt = label ? state.sliceDoc(label.from, label.to) : \"\";\n const rawSrc = url ? state.sliceDoc(url.from, url.to) : \"\";\n const imageCtx = state.facet(imageContextFacet);\n return {\n paint: \"widget\",\n deco: Decoration.replace({\n widget: new ImageWidget(alt, rawSrc, imageCtx, ctx.from, ctx.to),\n }),\n };\n};\n","/**\n * Bullet widget — a real DOM element CM6 places where the hidden\n * `ListMark` (`-` / `*` / `1.`) used to be.\n *\n * Why a widget and not a CSS `::before`:\n * * `::before` is a pseudo-element. It paints in the right spot\n * but is NOT part of CM6's line metric (the requestMeasure\n * cycle reads `offsetTop` / `getBoundingClientRect` on real\n * elements and lines, not pseudo siblings). With `::before` the\n * bullet drifts visually as font size or padding changes, and\n * click coordinates on the bullet column return the wrong byte.\n * * A `WidgetType` rendered via `Decoration.replace({widget})`\n * becomes a real `<span>` in the line — its width, height, and\n * baseline participate in measurement. Click→byte is exact;\n * scroll alignment is exact.\n *\n * Same pattern Zettlr uses for its `BulletWidget` (see\n * `markdown-editor/renderers/render-emphasis.ts`).\n */\n\nimport { Decoration, WidgetType, type EditorView } from \"@codemirror/view\";\n\nimport { type NodeRule, type Paint, none } from \"../core/paint\";\n\nexport class BulletWidget extends WidgetType {\n /**\n * Eq returns true if two widgets are interchangeable — when CM6\n * reuses the existing DOM instead of replacing it. Bullets are\n * stateless so any two bullet widgets are equivalent.\n */\n override eq(_other: BulletWidget): boolean {\n return true;\n }\n\n override toDOM(_view: EditorView): HTMLElement {\n const el = document.createElement(\"span\");\n el.className = \"cm-bullet-widget\";\n el.textContent = \"•\";\n return el;\n }\n\n /**\n * Widgets can swallow input events; we don't want our bullet to.\n * `ignoreEvent` returning `false` lets the click pass through to\n * the editor, so clicking on the bullet column lands the caret at\n * the start of the list item content.\n */\n override ignoreEvent(): boolean {\n return false;\n }\n}\n\n/**\n * Ordered-list marker widget — the counterpart of {@link BulletWidget} for\n * `OrderedList` items. An ordered item's hidden `ListMark` is its number\n * (`1.`, `2.`, …), so unlike a bullet (which swaps `-` for `•`) this renders the\n * marker's own text — otherwise a numbered list would render as bullets.\n */\nexport class OrderedMarkerWidget extends WidgetType {\n constructor(private readonly marker: string) {\n super();\n }\n\n /** Carries its number, so CM6 only rebuilds the DOM when the number changes. */\n override eq(other: OrderedMarkerWidget): boolean {\n return other.marker === this.marker;\n }\n\n override toDOM(_view: EditorView): HTMLElement {\n const el = document.createElement(\"span\");\n el.className = \"cm-bullet-widget cm-ordered-marker\";\n el.textContent = this.marker;\n return el;\n }\n\n override ignoreEvent(): boolean {\n return false;\n }\n}\n\n/* ---------------- The ListMark rule ---------------- */\n\n\n\nconst BULLET_REPLACE = Decoration.replace({ widget: new BulletWidget() });\n\n/**\n * A `-`/`*`/`+`/`1.` list mark → bullet, its number, or (for a task item)\n * nothing beside the checkbox.\n */\nexport const listMarkRule: NodeRule = (ctx): Paint => {\n // A marker renders only once it's COMPLETE — followed by a space. A lone\n // `-` at the end of a line is text the user is still typing; rendering it\n // as a bullet mid-type is the surprise we avoid (CommonMark does count it\n // as an empty item).\n if (ctx.state.doc.sliceString(ctx.to, ctx.to + 1) !== \" \") {\n return none;\n }\n const atomicTo = ctx.to + 1;\n const listItem = ctx.node.parent;\n // A task item's checkbox IS its marker (`ListItem` → `ListMark` + `Task`):\n // hide the list mark rather than drawing a bullet next to the checkbox.\n if (listItem?.getChild(\"Task\")) {\n return { paint: \"hide\", atomicTo };\n }\n // An ordered item renders its number, never a `•`. Renumber on display\n // (CommonMark): start at the first item's number and increment by position,\n // so `1. 1. 1.` shows as `1. 2. 3.`. The source delimiter (`.`/`)`) is kept.\n const list = listItem?.parent;\n if (list?.name === \"OrderedList\") {\n const state = ctx.state;\n const delimiter = state.sliceDoc(ctx.from, ctx.to).replace(/^\\d+/, \"\") || \".\";\n const firstMark = list.firstChild?.getChild(\"ListMark\");\n const start = firstMark\n ? Number.parseInt(state.sliceDoc(firstMark.from, firstMark.to), 10)\n : 1;\n let offset = 0;\n for (let sibling = listItem?.prevSibling; sibling; sibling = sibling.prevSibling) {\n if (sibling.name === \"ListItem\") offset += 1;\n }\n const ordinal = (Number.isNaN(start) ? 1 : start) + offset;\n return {\n paint: \"widget\",\n deco: Decoration.replace({ widget: new OrderedMarkerWidget(`${ordinal}${delimiter}`) }),\n atomicTo,\n };\n }\n return { paint: \"widget\", deco: BULLET_REPLACE, atomicTo };\n};\n","/**\n * Task checkbox widget — renders `[ ]` / `[x]` as a real interactive\n * `<input type=\"checkbox\">`. Clicking toggles the source.\n *\n * Per spec section 16.4: source `- [ ] Task` becomes a visible\n * `☐ Task` with a real checkbox. Toggling persists as source change\n * (`[ ]` ↔ `[x]`).\n */\n\nimport { Decoration, EditorView, WidgetType } from \"@codemirror/view\";\n\nimport { type NodeRule, type Paint } from \"../core/paint\";\n\nexport class TaskCheckboxWidget extends WidgetType {\n constructor(\n readonly checked: boolean,\n /**\n * Source position of the marker's first character (`[`). Used at\n * click time to dispatch the toggling change. Included in `eq()`\n * so CM6 doesn't reuse a widget whose `from` has drifted under\n * us — if the document was edited above the task item, the\n * dispatched range must be the *current* source position, not a\n * stale one.\n */\n readonly from: number,\n ) {\n super();\n }\n\n override eq(other: TaskCheckboxWidget): boolean {\n return other.checked === this.checked && other.from === this.from;\n }\n\n override toDOM(view: EditorView): HTMLElement {\n const input = document.createElement(\"input\");\n input.type = \"checkbox\";\n input.checked = this.checked;\n input.className = \"cm-task-checkbox\";\n // Stop propagation so clicking the checkbox doesn't also place\n // the caret at the marker position.\n input.addEventListener(\"mousedown\", (e) => e.stopPropagation());\n input.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n const newMarker = this.checked ? \"[ ]\" : \"[x]\";\n view.dispatch({\n changes: { from: this.from, to: this.from + 3, insert: newMarker },\n userEvent: \"input.format.task\",\n });\n });\n return input;\n }\n\n override ignoreEvent(): boolean {\n return false;\n }\n}\n\n/* ---------------- The TaskMarker rule ---------------- */\n\n\n\n/** `[ ]` / `[x]` → a real checkbox widget, checked state from the source. */\nexport const taskMarkerRule: NodeRule = (ctx): Paint => {\n const checked = /\\[[xX]\\]/.test(ctx.state.sliceDoc(ctx.from, ctx.to));\n const spaceFollows = ctx.state.doc.sliceString(ctx.to, ctx.to + 1) === \" \";\n return {\n paint: \"widget\",\n deco: Decoration.replace({ widget: new TaskCheckboxWidget(checked, ctx.from) }),\n ...(spaceFollows ? { atomicTo: ctx.to + 1 } : {}),\n };\n};\n","/**\n * Canonical table: every Lezer markdown node name → its {@link NodeRule} —\n * ONE place answering \"how does this construct render\". The Lezer parser\n * handles CommonMark + GFM spec compliance; this file is the visual contract.\n *\n * Why a table of rules (functions), not data:\n *\n * 1. **Completeness is auditable.** `registry.test.ts` reads the live\n * parser's node set and fails when any node Lezer emits has no entry\n * here — a lezer-markdown bump that adds a node trips the gate before\n * it ships unstyled. Only the KEYS matter for that, so entries are free\n * to be behavior.\n * 2. **Context is first-class.** A node name can mean different things in\n * different parents (a URL inside `[text](url)` is chrome; a bare\n * pasted URL is content — hiding it made an invisible dead zone).\n * Every rule receives context; contextual entries are ordinary inline\n * functions, readable at the point of definition.\n * 3. **Adding a construct touches one place.** A styled span is a\n * one-liner via the combinators; a widget construct exports its rule\n * from its own module and is listed here; an EXTENSION with its own\n * grammar ships rules via `nodeRulesFacet` and never touches this file.\n * 4. **Deliberate non-styling stays documented.** `raw(why)` /\n * `structural(why)` tag their rules; the coverage test insists the\n * `why` is present.\n *\n * The rules speak {@link Paint} — CodeMirror's own mechanisms (line class,\n * span mark, hide, widget, nothing). That union is CLOSED: constructs grow,\n * ways to paint don't, so the single switch over Paint lives in the painter\n * (plugin.ts) and no new construct ever edits it.\n */\n\nimport { horizontalRuleRule } from \"./hrWidget\";\nimport { htmlBlockRule, htmlInlineRule } from \"../html/htmlWidget\";\nimport { imageRule } from \"../image/imageWidget\";\nimport { listMarkRule } from \"../list/bulletWidget\";\nimport {\n headingLine,\n hideAlways,\n line,\n mark,\n raw,\n structural,\n type NodeContext,\n type NodeRules,\n} from \"./paint\";\nimport { taskMarkerRule } from \"../list/taskCheckboxWidget\";\n\n/** Does this URL's parent Link render any visible label text? The label is\n * everything between the opening `[` and closing `]` marks; whitespace-only\n * counts as invisible (a lone space is a dead zone in practice). */\nfunction linkHasVisibleLabel(ctx: NodeContext): boolean {\n const link = ctx.node.parent;\n if (!link) return false;\n let bracketOpen: { readonly to: number } | null = null;\n let bracketClose: { readonly from: number } | null = null;\n for (let child = link.firstChild; child; child = child.nextSibling) {\n if (child.name !== \"LinkMark\") continue;\n const mark = ctx.state.sliceDoc(child.from, child.to);\n if (mark === \"[\" && !bracketOpen) bracketOpen = child;\n else if (mark === \"]\" && !bracketClose) bracketClose = child;\n }\n if (!bracketOpen || !bracketClose || bracketClose.from <= bracketOpen.to) return false;\n return ctx.state.sliceDoc(bracketOpen.to, bracketClose.from).trim() !== \"\";\n}\n\nexport const NODE_RULES: NodeRules = {\n // ----- Structural wrappers (never directly styled) -----\n Document: structural(\"top-level wrapper\"),\n Paragraph: structural(\"body font is the default\"),\n\n // ----- ATX headings (`# H1` … `###### H6`) -----\n ATXHeading1: headingLine(\"cm-heading cm-heading--1\"),\n ATXHeading2: headingLine(\"cm-heading cm-heading--2\"),\n ATXHeading3: headingLine(\"cm-heading cm-heading--3\"),\n ATXHeading4: headingLine(\"cm-heading cm-heading--4\"),\n ATXHeading5: headingLine(\"cm-heading cm-heading--5\"),\n ATXHeading6: headingLine(\"cm-heading cm-heading--6\"),\n\n // ----- Setext headings (`=====` / `-----` under text) -----\n SetextHeading1: raw(\"Phase 2: same line scaling as ATXHeading1\"),\n SetextHeading2: raw(\"Phase 2: same line scaling as ATXHeading2\"),\n\n // ----- Block-level constructs -----\n Blockquote: line(\"cm-blockquote\"),\n BulletList: structural(\"ListItem children carry the styling\"),\n OrderedList: structural(\"ListItem children carry the styling\"),\n ListItem: line(\"cm-list-line\"),\n FencedCode: line(\"cm-fenced-code\"),\n CodeBlock: raw(\"Phase 2: indented code-block, same style as FencedCode\"),\n HorizontalRule: horizontalRuleRule, // `---` → styled `<hr>` widget\n HTMLBlock: htmlBlockRule,\n LinkReference: raw(\"Phase 2: reference-style links resolve in click handler\"),\n\n // ----- Inline styling -----\n Emphasis: mark(\"cm-emphasis\"),\n StrongEmphasis: mark(\"cm-strong\"),\n InlineCode: mark(\"cm-inline-code\"),\n Link: mark(\"cm-link\"),\n Image: imageRule, // `` → inline `<img>` widget\n\n // ----- Inline literal sub-nodes (rendered inside their parent) -----\n // Inside a Link the URL is chrome ONLY when a visible label exists — for\n // `[](url)` / `[ ](url)` the URL is the link's entire visible content, and\n // hiding it (with the marks already hidden) left an invisible dead zone.\n // Bare GFM autolinks and <angle> autolinks emit the SAME node name, and\n // there the URL IS the content — same class of bug when hidden.\n URL: (ctx) => {\n if (ctx.parentName !== \"Link\") return { paint: \"mark\", className: \"cm-link\" };\n return linkHasVisibleLabel(ctx)\n ? { paint: \"hide\" }\n : { paint: \"mark\", className: \"cm-link\" };\n },\n LinkLabel: raw(\"visible inside Link; parent mark styles it\"),\n LinkTitle: hideAlways(), // `[text](URL \"title\")` — title never visible\n CodeText: raw(\"interior of FencedCode/InlineCode; parent decoration covers it\"),\n CodeInfo: mark(\"cm-code-info\"), // language tag on the opener row — visible so typing there is never invisible (§12.4)\n HardBreak: structural(\"trailing two-spaces or backslash, no visible glyph\"),\n Comment: raw(\"Phase 2: dim inline HTML comments\"),\n CommentBlock: raw(\"Phase 2: dim block HTML comments\"),\n ProcessingInstruction: raw(\"Phase 2: dim like HTML comments\"),\n ProcessingInstructionBlock: raw(\"Phase 2: dim like HTML comments\"),\n Entity: raw(\"HTML entities like & render as-is, by design\"),\n // Backslash-escape: hide only the leading `\\`, so `\\'` renders as `'` per\n // CommonMark rather than showing a literal backslash.\n Escape: (ctx) => ({\n paint: \"hide\",\n range: { from: ctx.from, to: ctx.from + 1 },\n expandSpace: false,\n }),\n HTMLTag: htmlInlineRule,\n\n // ----- Syntax markers (hidden always — non-technical UX, distinct from Obsidian's Live Preview) -----\n // `#` marks on ATX headings hide; a SETEXT heading's underline is that\n // heading's only marker on its own line — hiding it left an invisible,\n // unclickable dead line. Visible until setext gets real styling.\n HeaderMark: (ctx) =>\n ctx.parentName?.startsWith(\"SetextHeading\") ? { paint: \"none\" } : { paint: \"hide\" },\n EmphasisMark: hideAlways(), // `*` / `_`\n CodeMark: hideAlways(), // backticks for inline / fence pairs for blocks\n LinkMark: hideAlways(), // `[`/`]`/`(`/`)`\n QuoteMark: hideAlways(), // `>`\n ListMark: listMarkRule, // `-`/`1.` → bullet / number / nothing beside a checkbox\n TaskMarker: taskMarkerRule, // `[ ]` / `[x]` → real checkbox\n\n // ----- GFM extensions (enabled via `markdownLanguage`) -----\n Strikethrough: mark(\"cm-strikethrough\"),\n // `~~` joins the hidden-marker system like EmphasisMark — the flanking\n // guard and delete normalizer already assume these semantics; leaving the\n // marks visible made deletion eat single tildes (interaction-spec §8.1).\n StrikethroughMark: hideAlways(),\n Subscript: raw(\"Phase 2: vertical-align: sub\"),\n SubscriptMark: raw(\"Phase 2: hide `~` off-parent\"),\n Superscript: raw(\"Phase 2: vertical-align: super\"),\n SuperscriptMark: raw(\"Phase 2: hide `^` off-parent\"),\n Emoji: raw(\"Phase 2: replace `:smile:` with the emoji glyph\"),\n Autolink: raw(\"wrapper of a visible URL child; Phase 2 wires click-to-open\"),\n Task: raw(\"Phase 2: render task list items with a real checkbox\"),\n\n // GFM tables — handled by a dedicated StateField that emits the block\n // widget on Table nodes (CM6 forbids multi-line replace from a ViewPlugin,\n // so this rules-driven plugin can't do that shape; see tableField.ts).\n Table: structural(\"tableField StateField owns Table rendering\"),\n TableHeader: structural(\"covered by Table widget\"),\n TableRow: structural(\"covered by Table widget\"),\n TableCell: structural(\"covered by Table widget\"),\n TableDelimiter: structural(\"covered by Table widget\"),\n};\n","/**\n * Markdown decoration plugin — the PAINTER. Walks the Lezer tree against the\n * visible viewport, asks each node's {@link NodeRule} how to render, and\n * applies the returned {@link Paint}.\n *\n * The painter contains *no* construct knowledge: rules live in the base\n * table (`NODE_RULES`) merged with any extension-contributed rules\n * (`nodeRulesFacet`). The one switch here is over `Paint` — CodeMirror's\n * closed set of mechanisms — so adding a construct, widget, contextual\n * override, or whole extension never edits this file.\n *\n * Perf shape (unchanged from the spike):\n * * Walks `view.visibleRanges` against `syntaxTree(view.state)` —\n * the work is proportional to the viewport, not the document.\n * * Rebuilt on doc change or viewport change.\n *\n * Decoration ordering (CM6 requires `from`-then-`startSide` ascending):\n * * Line decorations collected in one bucket, mark / replace in\n * another. The final `Decoration.set` lets CM6 sort defensively,\n * costing ~µs on the typical viewport — cheaper than risking the\n * \"decorations out of order\" runtime error.\n */\n\nimport { ensureSyntaxTree, syntaxTree } from \"@codemirror/language\";\nimport { RangeSetBuilder, type Range } from \"@codemirror/state\";\nimport {\n Decoration,\n EditorView,\n type DecorationSet,\n ViewPlugin,\n type PluginValue,\n type ViewUpdate,\n} from \"@codemirror/view\";\n\nimport { nodeRulesFacet, type NodeLike, type NodeRules } from \"./paint\";\nimport { NODE_RULES } from \"./registry\";\n\n/* ---------------- Decoration instances ----------------- */\n//\n// Cached per `className` so we don't allocate a Decoration per node\n// per build. CM6 dedups internally, but skipping the call is cheaper.\n\nconst lineDecoCache = new Map<string, Decoration>();\nconst markDecoCache = new Map<string, Decoration>();\nconst HIDE_MARKER = Decoration.replace({});\n\nfunction lineDeco(className: string): Decoration {\n let d = lineDecoCache.get(className);\n if (!d) {\n d = Decoration.line({ class: className });\n lineDecoCache.set(className, d);\n }\n return d;\n}\n\nfunction markDeco(className: string): Decoration {\n let d = markDecoCache.get(className);\n if (!d) {\n d = Decoration.mark({ class: className });\n markDecoCache.set(className, d);\n }\n return d;\n}\n\n/* ---------------- Effective rules ---------------- */\n\n// Base + extension rules, merged once per distinct facet value (the facet\n// result is referentially stable until providers change).\nconst mergedRulesCache = new WeakMap<NodeRules, NodeRules>();\n\nfunction effectiveRules(view: EditorView): NodeRules {\n const extra = view.state.facet(nodeRulesFacet);\n if (Object.keys(extra).length === 0) return NODE_RULES;\n let merged = mergedRulesCache.get(extra);\n if (!merged) {\n merged = Object.assign({}, NODE_RULES, extra);\n mergedRulesCache.set(extra, merged);\n }\n return merged;\n}\n\n/* ---------------- The painter ---------------- */\n\ninterface BuildResult {\n decorations: DecorationSet;\n /**\n * Every hidden/replaced range, surfaced as `EditorView.atomicRanges` so\n * cursor motion (arrow keys, drag-select, double-click) treats hidden\n * markup as a single atom — the user moves \"around\" hidden `**` instead\n * of getting stranded between two invisible characters.\n */\n atomic: DecorationSet;\n}\n\n/**\n * Block-level markers (`# ` heading, `> ` quote, `- ` list item) are\n * followed by exactly one separator space; we hide that space along\n * with the marker so the rendered line starts at the first content\n * char. Inline markers (`*`, backticks) don't have this — only the\n * line-leading case applies.\n */\nfunction expandTrailingSpace(\n view: EditorView,\n range: { from: number; to: number },\n): number {\n const line = view.state.doc.lineAt(range.from);\n if (range.from !== line.from) return range.to;\n const charAfter = view.state.doc.sliceString(range.to, range.to + 1);\n return charAfter === \" \" ? range.to + 1 : range.to;\n}\n\nfunction buildDecorations(view: EditorView): BuildResult {\n const rules = effectiveRules(view);\n const lineDecs: Range<Decoration>[] = [];\n const markDecs: Range<Decoration>[] = [];\n const atomicBuilder = new RangeSetBuilder<Decoration>();\n // Force-parse through the viewport so a list/task marker stays rendered while\n // typing: the incremental tree can lag for the just-edited line on a large\n // doc, briefly dropping the widget back to raw source (#37). Bounded to the\n // viewport + a timeout, so a large note doesn't pay a full re-parse per key.\n const tree = ensureSyntaxTree(view.state, view.viewport.to, 100) ?? syntaxTree(view.state);\n\n // Stamp a Decoration.line on every line overlapping the given\n // range. CM6 requires `Decoration.line` to be anchored at a line\n // start; this helper does the line-iteration once for callers.\n const stampLineRange = (deco: Decoration, from: number, to: number) => {\n let pos = from;\n while (pos <= to) {\n const line = view.state.doc.lineAt(pos);\n lineDecs.push(deco.range(line.from));\n if (line.to >= to) break;\n pos = line.to + 1;\n }\n };\n\n for (const { from, to } of view.visibleRanges) {\n tree.iterate({\n from,\n to,\n enter: (node) => {\n const rule = rules[node.name];\n if (!rule) {\n // Unknown node — the coverage test prevents this for the base\n // grammar; an extension grammar's node without a contributed rule\n // lands here. Skip silently rather than throw: a missing rule\n // must not break editing.\n return;\n }\n // `node.node` materializes a SyntaxNode (lezer's documented-expensive\n // path); most rules are constant combinators that never read it, so\n // the context exposes it — and the parent walk — through lazy getters\n // that only pay when a contextual rule actually asks.\n const paint = rule({\n name: node.name,\n from: node.from,\n to: node.to,\n get parentName() {\n return node.node.parent?.name;\n },\n get node() {\n return node.node as unknown as NodeLike;\n },\n state: view.state,\n });\n\n switch (paint.paint) {\n case \"lineClass\": {\n if (paint.span === \"first\") {\n const line = view.state.doc.lineAt(node.from);\n lineDecs.push(lineDeco(paint.className).range(line.from));\n } else {\n stampLineRange(lineDeco(paint.className), node.from, node.to);\n }\n return;\n }\n case \"mark\": {\n markDecs.push(markDeco(paint.className).range(node.from, node.to));\n return;\n }\n case \"hide\": {\n const range = paint.range ?? node;\n const hideEnd =\n paint.expandSpace === false ? range.to : expandTrailingSpace(view, range);\n markDecs.push(HIDE_MARKER.range(range.from, hideEnd));\n atomicBuilder.add(\n range.from,\n Math.max(hideEnd, paint.atomicTo ?? hideEnd),\n HIDE_MARKER,\n );\n return;\n }\n case \"widget\": {\n const hideEnd = expandTrailingSpace(view, node);\n markDecs.push(paint.deco.range(node.from, hideEnd));\n atomicBuilder.add(\n node.from,\n Math.max(hideEnd, paint.atomicTo ?? hideEnd),\n paint.deco,\n );\n return;\n }\n case \"none\":\n return;\n }\n },\n });\n }\n\n // Line decorations before mark/replace at the same point — this is\n // the canonical CM6 ordering. Concat-then-sort is one O(n log n)\n // for the whole viewport, dwarfed by the parse cost.\n const all: Range<Decoration>[] = lineDecs.concat(markDecs);\n return {\n decorations: Decoration.set(all, /* sort */ true),\n atomic: atomicBuilder.finish(),\n };\n}\n\nexport const markdownDecorationsPlugin = ViewPlugin.fromClass(\n class implements PluginValue {\n decorations: DecorationSet;\n atomic: DecorationSet;\n constructor(view: EditorView) {\n const built = buildDecorations(view);\n this.decorations = built.decorations;\n this.atomic = built.atomic;\n }\n update(update: ViewUpdate) {\n // No decoration depends on the cursor (markers never reveal on\n // proximity), so caret-only transactions skip the whole build path.\n if (update.docChanged || update.viewportChanged) {\n const built = buildDecorations(update.view);\n this.decorations = built.decorations;\n this.atomic = built.atomic;\n }\n }\n },\n {\n decorations: (v) => v.decorations,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomic ?? Decoration.none),\n },\n);\n","/**\n * Editor theme.\n *\n * Lives in `EditorView.baseTheme` rather than in `global.scss` for\n * three load-bearing reasons:\n *\n * 1. **Line-metric integrity.** CM6 measures line heights from the\n * DOM through a `requestMeasure` cycle to compute click → byte\n * and scroll → viewport mappings. Styles injected via\n * `EditorView.theme` participate in that cycle at the right\n * moment; styles from an external sheet can land *after* the\n * first measurement, so clicks land on the wrong line until the\n * next measure fires. (This was the click-drift the spike\n * shipped — fixed by moving here.)\n * 2. **Specificity that beats the base theme without `!important`.**\n * CM6 ships its monospace-and-purple base theme via the same\n * mechanism; layering `EditorView.theme` on top is the only\n * collision-free pattern.\n * 3. **No margin/padding on heading lines.** Margins between\n * `.cm-line` siblings shift visual position without changing\n * `offsetTop`, so the metric cache and the eye disagree —\n * that's the canonical click-on-wrong-line bug. We change\n * `font:` (which doesn't touch line-height), nothing else.\n *\n * Zettlr's `markdown-editor/theme/editor.ts` is the canonical\n * reference for this pattern in the open-source ecosystem.\n */\n\nimport { EditorView } from \"@codemirror/view\";\n\n/**\n * `EditorView.theme` (not `baseTheme`) — `baseTheme` is the\n * low-priority slot meant for theme packages and gets out-specifity'd\n * by any app-level CSS (Carbon's globals in our case). `theme` is the\n * app-priority slot; our intent is to override CM6's defaults, so\n * this is the right tier.\n */\nexport const editorBaseTheme = EditorView.theme({\n // CM6 paints a focus outline by default. The caret IS the focus\n // indicator in Compose; the box would be visual noise.\n \"&.cm-focused\": {\n outline: \"none\",\n },\n\n // Body type. Override CM6's monospace default *here* (not in the\n // external stylesheet) so the measurement cycle sees it.\n \".cm-content\": {\n fontFamily:\n \"var(--cds-body-01-font-family, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", sans-serif)\",\n fontSize: \"1rem\",\n // Tight line-height: the caret height tracks the line box\n // (line-height × font-size), so anything above 1.4 starts to\n // feel disproportionate. 1.4 is the value Zettlr uses for the\n // same reason.\n lineHeight: \"1.4\",\n color: \"var(--cds-text-primary, #161616)\",\n maxWidth: \"48rem\",\n margin: \"0 auto\",\n },\n\n // Scroller padding — kept here so it's part of the same theme\n // bundle as the content metrics.\n \".cm-scroller\": {\n padding: \"1.5rem 3rem\",\n },\n\n // Drawn selection (selectionLayer.ts) — ranges paint from logical state so\n // the highlight survives the virtualized viewport. The widget tint sits\n // ABOVE block widgets (their opaque backgrounds hide the below-layer band).\n \".cm-selectionBackground\": {\n background: \"var(--cds-highlight, #d0e2ff)\",\n },\n \"&:not(.cm-focused) .cm-selectionBackground\": {\n background: \"var(--cds-layer-accent-01, #e0e0e0)\",\n },\n \".cm-selectionWidgetTint\": {\n background: \"rgba(15, 98, 254, 0.08)\",\n },\n\n // Caret stroke. CM6 owns the height (it tracks the current line-box,\n // so headings get a heading-sized caret automatically per spec 6.2).\n // Width is spec's 1 px at the default root size, in rem so it follows the\n // user's text-size preference; \"thick caret\" mode is a Phase-N follow-up.\n \".cm-cursor, .cm-dropCursor\": {\n borderLeftWidth: \"0.0625rem\",\n },\n\n // Headings — `font:` shorthand changes size + weight *without*\n // setting line-height (it inherits the content's 1.5). The vertical\n // breathing room is `padding` not `margin` for the click-metric\n // reason above — sibling margins drift, sibling padding doesn't.\n \".cm-heading--1\": {\n fontWeight: \"700\",\n fontSize: \"2.0rem\",\n lineHeight: \"1.3\",\n paddingTop: \"0.6em\",\n paddingBottom: \"0.2em\",\n },\n \".cm-heading--2\": {\n fontWeight: \"700\",\n fontSize: \"1.6rem\",\n lineHeight: \"1.3\",\n paddingTop: \"0.5em\",\n paddingBottom: \"0.15em\",\n },\n \".cm-heading--3\": {\n fontWeight: \"700\",\n fontSize: \"1.3rem\",\n lineHeight: \"1.3\",\n paddingTop: \"0.4em\",\n paddingBottom: \"0.1em\",\n },\n \".cm-heading--4\": { fontWeight: \"700\", fontSize: \"1.15rem\", paddingTop: \"0.3em\" },\n \".cm-heading--5\": { fontWeight: \"700\", fontSize: \"1.05rem\", paddingTop: \"0.25em\" },\n \".cm-heading--6\": {\n fontWeight: \"700\",\n fontSize: \"1.0rem\",\n color: \"var(--cds-text-secondary, #525252)\",\n paddingTop: \"0.2em\",\n },\n\n // Inline / block styling. All sized by font + color only — never\n // by margin/padding, never by line-height override.\n \".cm-strong\": { fontWeight: \"700\" },\n \".cm-emphasis\": { fontStyle: \"italic\" },\n \".cm-strikethrough\": { textDecoration: \"line-through\" },\n\n // Code backgrounds are translucent, never opaque: the drawn selection\n // (selectionLayer.ts) paints BELOW the content, so an opaque background here\n // blanks the highlight on exactly these rows/chips while the prose around\n // them tints. The alphas composite to the intended resting colors on the\n // white canvas — #e0e0e0 for the inline chip, #f6f8fa (GitHub-style) for\n // fence lines.\n \".cm-inline-code\": {\n fontFamily:\n \"var(--cds-code-01-font-family, ui-monospace, \\\"SF Mono\\\", Menlo, monospace)\",\n fontSize: \"0.92em\",\n padding: \"0 0.25em\",\n background: \"rgba(141, 141, 141, 0.27)\",\n borderRadius: \"0.1875rem\",\n },\n\n \".cm-fenced-code\": {\n fontFamily:\n \"var(--cds-code-01-font-family, ui-monospace, \\\"SF Mono\\\", Menlo, monospace)\",\n fontSize: \"0.92em\",\n background: \"rgba(30, 80, 130, 0.04)\",\n paddingLeft: \"0.75em\",\n paddingBottom: \"0\",\n },\n // Language tag on a fence's opener row — visible (never invisible typing)\n // and rendered as a small pill so it reads as the block's chrome, not as a\n // wrong-font first code line (§12.4/§12.7).\n \".cm-code-info\": {\n color: \"var(--cds-text-secondary, #6f6f6f)\",\n fontSize: \"0.75em\",\n background: \"var(--cds-layer-accent-01, #e8ebee)\",\n padding: \"0.1em 0.5em\",\n borderRadius: \"999rem\",\n verticalAlign: \"0.1em\",\n cursor: \"pointer\",\n },\n \".cm-code-info:hover\": {\n background: \"var(--cds-layer-accent-hover-01, #d1d7dc)\",\n color: \"var(--cds-text-primary, #161616)\",\n },\n // The languageless placeholder: same chip, dimmed, so every closed block\n // has a discoverable language control.\n \".cm-code-info--unset\": {\n opacity: \"0.55\",\n fontStyle: \"italic\",\n },\n\n \".cm-blockquote\": {\n borderInlineStart: \"0.1875rem solid var(--cds-border-subtle-02, #c6c6c6)\",\n paddingInlineStart: \"0.75em\",\n color: \"var(--cds-text-secondary, #525252)\",\n fontStyle: \"italic\",\n },\n\n // List-item line: small left indent so the bullet widget sits in\n // its own column. Padding (not margin) keeps click metrics exact.\n \".cm-list-line\": {\n paddingInlineStart: \"0.5em\",\n },\n\n // Bullet widget — styled here so the widget's HTML inherits the\n // right colour against body type.\n \".cm-bullet-widget\": {\n display: \"inline-block\",\n width: \"1em\",\n color: \"var(--cds-text-secondary, #525252)\",\n fontWeight: \"700\",\n },\n\n // Ordered-list number (`1.`) — wider than a bullet's fixed 1em so multi-digit\n // markers fit, with a small gap before the item text. Normal weight: a bold\n // number reads as heavier than the body text it labels.\n \".cm-ordered-marker\": {\n width: \"auto\",\n minWidth: \"1.2em\",\n marginRight: \"0.3em\",\n fontWeight: \"normal\",\n },\n\n // Task list checkbox — drawn as a Carbon checkbox, not the native control: a\n // 1rem square that fills with the icon token and shows a white tick when\n // checked. `appearance: none` is what replaces WebKit's small rounded default;\n // the box then matches the design system rather than approximating it with an\n // accent colour over the native shape.\n \".cm-task-checkbox\": {\n appearance: \"none\",\n WebkitAppearance: \"none\",\n boxSizing: \"border-box\",\n position: \"relative\",\n width: \"1rem\",\n height: \"1rem\",\n margin: \"0 0.4em 0 0\",\n cursor: \"pointer\",\n verticalAlign: \"-0.15em\",\n border: \"0.0625rem solid var(--cds-icon-primary, #161616)\",\n borderRadius: \"0.0625rem\",\n background: \"transparent\",\n },\n \".cm-task-checkbox:checked\": {\n background: \"var(--cds-icon-primary, #161616)\",\n borderColor: \"var(--cds-icon-primary, #161616)\",\n },\n // The tick: an L (right + bottom border) rotated 45° into a check.\n \".cm-task-checkbox:checked::after\": {\n content: \"''\",\n position: \"absolute\",\n left: \"0.3125rem\",\n top: \"0.0625rem\",\n width: \"0.25rem\",\n height: \"0.5rem\",\n border: \"solid var(--cds-icon-on-color, #ffffff)\",\n borderWidth: \"0 0.125rem 0.125rem 0\",\n transform: \"rotate(45deg)\",\n },\n \".cm-task-checkbox:focus-visible\": {\n outline: \"0.125rem solid var(--cds-focus, #0f62fe)\",\n outlineOffset: \"0.0625rem\",\n },\n\n // Inline image widget. Constrained max-width so a single large\n // image doesn't blow up the editor; lazy loading via `<img loading=\"lazy\">`.\n \".cm-image-widget\": {\n display: \"inline-block\",\n maxWidth: \"min(100%, 32rem)\",\n height: \"auto\",\n borderRadius: \"0.25rem\",\n margin: \"0.25em 0\",\n },\n\n // Horizontal-rule widget. Inline span styled as a full-width\n // border so the line stays inside CM6's line layout.\n \".cm-hr-widget\": {\n display: \"inline-block\",\n width: \"100%\",\n height: \"0\",\n borderTop: \"0.0625rem solid var(--cds-border-subtle-02, #c6c6c6)\",\n verticalAlign: \"middle\",\n },\n\n \".cm-table-widget\": {\n borderCollapse: \"collapse\",\n width: \"100%\",\n // `fixed` distributes width evenly across columns instead of letting the\n // auto algorithm shrink columns toward their content — with the inherited\n // `cm-lineWrapping` word-breaking, an auto-shrunk column wraps one\n // character per line (\"T / o / p / i / c\").\n tableLayout: \"fixed\",\n },\n \".cm-table-widget th, .cm-table-widget td\": {\n border: \"0.0625rem solid var(--cds-border-subtle-02, #c6c6c6)\",\n padding: \"0.4em 0.75em\",\n verticalAlign: \"top\",\n // No native text-selection: a drag would otherwise zig-zag a ragged\n // selection across cells (uneven heights). `tablev2` tracks the\n // drag and tints whole cells uniformly instead; the cell editor re-enables\n // selection for its own content (below).\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n // Wrap at word boundaries like prose (overriding the `word-break: break-word`\n // cm-lineWrapping inherits onto `.cm-content`), but still break a single\n // over-long token (e.g. `complementarity/orchestration`) so it can't spill\n // past its fixed-width column into the neighbour.\n overflowWrap: \"break-word\",\n wordBreak: \"normal\",\n },\n \".cm-table-widget thead th\": {\n background: \"var(--cds-layer-accent-01, #e8e8e8)\",\n fontWeight: \"600\",\n textAlign: \"left\",\n },\n // The cell editor's own content stays selectable so a mounted cell edits\n // normally (only the surrounding grid is locked, above).\n \".cm-table-widget .cm-content\": {\n userSelect: \"text\",\n WebkitUserSelect: \"text\",\n },\n // Cell highlight: `--selected` is a drag-selection (tablev2);\n // `--hover` previews the row/column a \"Comment on this row/column\" menu item\n // targets; `--commenting` is held by the host while that comment composer is\n // open. All read as the same even tint.\n \".cm-table-cell--selected, .cm-table-cell--hover, .cm-table-cell--commenting\": {\n backgroundColor: \"var(--cds-highlight, #d0e2ff)\",\n },\n\n // Hover inserters (tablev2/tableV2HoverControls.ts). The wrapper reserves a top + left\n // padding gutter; JS parks the two \"+\" circles in it — clear of the grid, so\n // they never clip at a corner or sit under the header.\n \".cm-table-wrap\": {\n position: \"relative\",\n // Vertical spacing is PADDING, never margin — the same rule the headings and\n // lists above follow. CM6 measures a block widget's height from its border\n // box (margins excluded), so a margin here under-measures the table and\n // drifts every click below it down onto the next line. The top padding\n // doubles as the hover-\"+\" gutter.\n paddingTop: \"2.5em\",\n paddingBottom: \"0.5em\",\n paddingLeft: \"2em\",\n },\n\n // Two-step delete (tableArmed.ts). The first Backspace/Delete next to a table\n // parks the caret at its edge and arms it: the table gets a blue \"selected\"\n // outline, and a green line is drawn at the armed edge — Zettlr's \"green line\n // cursor behind the table\" cue, signalling the next press removes it. The\n // caret is hidden while arming (it renders on the blank line just past the\n // table, which reads as \"the cursor never moved\") by hiding the drawn cursor\n // layer.\n \"&.cm-table-arming .cm-cursorLayer\": {\n display: \"none\",\n },\n \".cm-table-armed .cm-table-widget\": {\n outline: \"0.125rem solid var(--cds-border-interactive, #0f62fe)\",\n outlineOffset: \"0.0625rem\",\n position: \"relative\",\n },\n \".cm-table-wrap[data-armed-edge] .cm-table-widget::after\": {\n content: \"''\",\n position: \"absolute\",\n left: \"0\",\n right: \"0\",\n height: \"0.1875rem\",\n background: \"var(--cds-support-success, #24a148)\",\n pointerEvents: \"none\",\n },\n \".cm-table-wrap[data-armed-edge=\\\"end\\\"] .cm-table-widget::after\": {\n bottom: \"-0.375rem\",\n },\n \".cm-table-wrap[data-armed-edge=\\\"start\\\"] .cm-table-widget::after\": {\n top: \"-0.375rem\",\n },\n \".cm-table-inserter\": {\n position: \"absolute\",\n display: \"none\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"1.25rem\",\n height: \"1.25rem\",\n borderRadius: \"50%\",\n appearance: \"none\",\n border: \"none\",\n padding: \"0\",\n cursor: \"pointer\",\n zIndex: \"3\",\n // Subtle at rest (a neutral chip); the primary accent is the hover\n // affordance. The glyph is a centred SVG stroked with currentColor.\n background: \"var(--cds-layer-accent-01, #e0e0e0)\",\n color: \"var(--cds-icon-secondary, #525252)\",\n boxShadow: \"0 0.0625rem 0.125rem rgba(0, 0, 0, 0.12)\",\n transition: \"background 80ms ease, color 80ms ease\",\n },\n \".cm-table-inserter:hover\": {\n background: \"var(--cds-link-primary, #0f62fe)\",\n color: \"#ffffff\",\n },\n\n \".cm-image-menu\": {\n background: \"var(--cds-layer-01, #ffffff)\",\n border: \"0.0625rem solid var(--cds-border-subtle-01, #e0e0e0)\",\n borderRadius: \"0.125rem\",\n boxShadow: \"0 0.25rem 0.75rem rgba(0, 0, 0, 0.15)\",\n padding: \"0.25rem 0\",\n minWidth: \"11rem\",\n fontFamily:\n \"var(--cds-body-01-font-family, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", sans-serif)\",\n fontSize: \"0.875rem\",\n },\n \".cm-image-menu__item\": {\n appearance: \"none\",\n background: \"transparent\",\n border: \"none\",\n textAlign: \"start\",\n padding: \"0.4rem 0.75rem\",\n cursor: \"pointer\",\n width: \"100%\",\n color: \"var(--cds-text-primary, #161616)\",\n font: \"inherit\",\n },\n \".cm-image-menu__item:hover\": {\n background: \"var(--cds-layer-hover-01, #e8e8e8)\",\n },\n \".cm-image-menu__item--danger\": {\n color: \"var(--cds-text-error, #da1e28)\",\n },\n\n \".cm-math-inline\": {\n fontFamily: \"KaTeX_Main, serif\",\n },\n \".cm-math-block\": {\n display: \"block\",\n margin: \"0.5em 0\",\n textAlign: \"center\",\n fontFamily: \"KaTeX_Main, serif\",\n },\n\n // A diagram reads as CONTENT, not a control: no fill or pointer on hover —\n // just a hairline frame plus a corner \"Edit\" chip as the click-to-edit cue.\n \".cm-mermaid-block\": {\n position: \"relative\",\n display: \"flex\",\n justifyContent: \"center\",\n margin: \"0.5em 0\",\n padding: \"0.75em\",\n borderRadius: \"0.25rem\",\n },\n \".cm-mermaid-block:hover\": {\n outline: \"0.0625rem solid var(--cds-border-subtle-01, #e0e0e0)\",\n },\n // The click-to-select state — native selection paints nothing over a block\n // widget, so the widget carries its own \"I'm selected, ⌘C copies me\" look.\n \".cm-mermaid-block--selected, .cm-mermaid-block--selected:hover\": {\n outline: \"0.125rem solid var(--cds-focus, #0f62fe)\",\n outlineOffset: \"-0.125rem\",\n background: \"rgba(15, 98, 254, 0.06)\",\n },\n \".cm-mermaid-edit\": {\n position: \"absolute\",\n insetBlockStart: \"0.375rem\",\n insetInlineEnd: \"0.375rem\",\n padding: \"0.1rem 0.5rem\",\n fontSize: \"0.75rem\",\n color: \"var(--cds-text-secondary, #525252)\",\n background: \"var(--cds-layer-01, #f4f4f4)\",\n border: \"0.0625rem solid var(--cds-border-subtle-01, #e0e0e0)\",\n borderRadius: \"999rem\",\n cursor: \"pointer\",\n opacity: \"0\",\n transition: \"opacity 80ms ease\",\n },\n \".cm-mermaid-block:hover .cm-mermaid-edit\": {\n opacity: \"1\",\n },\n \".cm-mermaid-block > svg\": {\n maxWidth: \"100%\",\n height: \"auto\",\n // Uniform click handling: SVG sub-elements otherwise swallow pointer\n // events over parts of the diagram, making click-to-select land only on\n // the background.\n pointerEvents: \"none\",\n },\n \".cm-mermaid-block--pending\": {\n color: \"var(--cds-text-secondary, #525252)\",\n fontStyle: \"italic\",\n },\n \".cm-mermaid-block--error\": {\n display: \"block\",\n borderLeft: \"0.1875rem solid var(--cds-support-error, #da1e28)\",\n background: \"var(--cds-layer-01, #f4f4f4)\",\n },\n \".cm-mermaid-error__title\": {\n color: \"var(--cds-text-error, #da1e28)\",\n fontSize: \"0.875em\",\n },\n \".cm-mermaid-error__message\": {\n margin: \"0.5em 0 0\",\n fontFamily: \"'IBM Plex Mono', ui-monospace, monospace\",\n fontSize: \"0.75em\",\n color: \"var(--cds-text-secondary, #525252)\",\n whiteSpace: \"pre-wrap\",\n overflowWrap: \"anywhere\",\n },\n\n \".cm-html-inline, .cm-html-block\": {\n display: \"inline\",\n },\n \".cm-html-block\": {\n display: \"block\",\n margin: \"0.5em 0\",\n },\n\n \".cm-link\": {\n color: \"var(--cds-link-primary, #0f62fe)\",\n textDecoration: \"underline\",\n },\n\n // Wikilink label — distinguish from regular markdown links via a\n // dashed underline so a non-technical reader can tell at a glance\n // that this is a vault-internal target. Matches the Tiptap version\n // (`.wikilink`).\n \".cm-wikilink\": {\n color: \"var(--cds-link-primary, #0f62fe)\",\n textDecoration: \"underline dashed\",\n cursor: \"pointer\",\n },\n\n // Explicit yellow, not var(--cds-highlight): the app maps that token to the\n // drawn-selection color, and a mark bound to it is indistinguishable from\n // selected text. Translucent so the below-content selection band reads\n // through; the alpha composites to the intended #fff8c5 resting yellow on\n // the white canvas.\n \".cm-highlight\": {\n background: \"rgba(255, 235, 89, 0.35)\",\n padding: \"0 0.1em\",\n borderRadius: \"0.125rem\",\n },\n\n \".cm-footnote-ref\": {\n fontSize: \"0.75em\",\n verticalAlign: \"super\",\n color: \"var(--cds-link-primary, #0f62fe)\",\n cursor: \"pointer\",\n },\n\n \".cm-footnote-def\": {\n fontSize: \"0.875em\",\n color: \"var(--cds-text-secondary, #525252)\",\n paddingInlineStart: \"0.5em\",\n borderInlineStart: \"0.125rem solid var(--cds-border-subtle-02, #c6c6c6)\",\n },\n});\n","/**\n * Resolve a markdown link href to a navigation target.\n *\n * A link in a document (or an agent's chat reply) is either:\n * - **external** — anything with a URI scheme (`https:`, `mailto:`, …) or a\n * protocol-relative `//host`; opened in the browser, and\n * - **internal** — a workspace-relative path that resolves to a file the\n * workspace actually contains; opened in a tab.\n *\n * This is pure path resolution (normalize `.`/`..`, reject escaping the vault\n * root, membership-check against the known files) — it is **not** the index's\n * link parser. The index already resolves links into `graphEdges`; this just\n * decides where a *clicked* href points so the UI can navigate. An href that\n * looks internal but matches no known file returns `null` (a broken link, not\n * something to navigate to).\n */\n\nexport type ResolvedWorkspaceLink =\n | { kind: \"internal\"; path: string }\n | { kind: \"external\"; href: string };\n\n// A URI scheme (`https:`, `mailto:`, `tel:`, `data:`, …). A workspace-relative\n// path never has one.\nconst URI_SCHEME = /^[a-z][a-z0-9+.-]*:/i;\nconst HAS_EXTENSION = /\\.[a-z0-9]+$/i;\n\nexport interface ResolveWorkspaceLinkOptions {\n /** Workspace-relative path of the document the link lives in. Relative hrefs\n * resolve against this file's directory. Omitted ⇒ resolve from the vault\n * root (used for agent chat replies, which emit root-relative paths). */\n fromPath?: string;\n /** Every workspace-relative file path, for membership checks. */\n knownPaths: ReadonlySet<string>;\n}\n\nexport function resolveWorkspaceLink(\n href: string,\n options: ResolveWorkspaceLinkOptions,\n): ResolvedWorkspaceLink | null {\n const raw = href.trim();\n if (raw === \"\" || raw.startsWith(\"#\")) {\n // Empty, or an in-page anchor — not a cross-file link.\n return null;\n }\n if (URI_SCHEME.test(raw) || raw.startsWith(\"//\")) {\n return { kind: \"external\", href: raw };\n }\n\n // Workspace path. Drop any ?query / #fragment, then percent-decode.\n const pathPart = decodeSegment(raw.split(/[?#]/, 1)[0] ?? \"\");\n if (pathPart === \"\") {\n return null;\n }\n // A leading \"/\" means \"from the vault root\", not the filesystem root.\n const base = pathPart.startsWith(\"/\") || !options.fromPath ? \"\" : dirOf(options.fromPath);\n const normalized = normalizeWorkspacePath(base, pathPart);\n if (normalized === null) {\n // `..` escaped the vault root — never navigate outside it.\n return null;\n }\n if (options.knownPaths.has(normalized)) {\n return { kind: \"internal\", path: normalized };\n }\n // Tolerate an extensionless link to a markdown note (`notes/plan` → `.md`).\n if (!HAS_EXTENSION.test(normalized) && options.knownPaths.has(`${normalized}.md`)) {\n return { kind: \"internal\", path: `${normalized}.md` };\n }\n return null;\n}\n\nfunction dirOf(path: string): string {\n const slash = path.lastIndexOf(\"/\");\n return slash === -1 ? \"\" : path.slice(0, slash);\n}\n\nfunction decodeSegment(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\n/**\n * Join `base` + `rel`, resolving `.`/`..` segments. Returns `null` if `..`\n * walks above the vault root.\n */\nfunction normalizeWorkspacePath(base: string, rel: string): string | null {\n const parts = base ? base.split(\"/\") : [];\n for (const segment of rel.split(\"/\")) {\n if (segment === \"\" || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n if (parts.length === 0) {\n return null;\n }\n parts.pop();\n continue;\n }\n parts.push(segment);\n }\n return parts.join(\"/\");\n}\n","import { resolveWorkspaceLink } from \"./workspaceLink\";\n\n/**\n * Wikilink (`[[target]]` / `[[target|label]]`) parsing + target resolution.\n *\n * The canonical rule lives in the `workspace-index` crate\n * (`wikilink_target_and_label` / `resolve_document_target` / `path_stem_matches`\n * / `slug_key`) — that's what builds the backlink graph. This is the\n * **client-side mirror** used to navigate a *clicked* wikilink, so the editor\n * and chat agree with the sidebar's backlinks. Keep the two in sync; if the\n * crate's rule changes, change it here too.\n *\n * Difference from the crate: an unresolved target returns `null` (we only\n * navigate to files that exist), whereas the crate keeps a would-be path for\n * the graph edge.\n */\n\n/** Split a wikilink body into its target and display label. */\nexport function parseWikilinkBody(body: string): { target: string; label: string } {\n const pipe = body.indexOf(\"|\");\n const target = (pipe === -1 ? body : body.slice(0, pipe)).trim();\n const rawLabel = pipe === -1 ? target : body.slice(pipe + 1).trim();\n return { target, label: rawLabel === \"\" ? target : rawLabel };\n}\n\n/** Resolve a wikilink target to an existing workspace file path, or `null`. */\nexport function resolveWikilinkTarget(\n rawTarget: string,\n options: { fromPath?: string; knownPaths: ReadonlySet<string> },\n): string | null {\n const target = (rawTarget.split(\"#\", 1)[0] ?? \"\").trim().replace(/\\\\/g, \"/\");\n if (target === \"\") {\n return null;\n }\n const withExtension = target.toLowerCase().endsWith(\".md\") ? target : `${target}.md`;\n\n // Path-like target (`sub/note`, `./note`, `../note`): resolve like a relative\n // link — against the source file's dir first, then the vault root.\n if (target.includes(\"/\") || target.startsWith(\".\")) {\n const relative = resolveWorkspaceLink(withExtension, options);\n if (relative?.kind === \"internal\") {\n return relative.path;\n }\n const fromRoot = resolveWorkspaceLink(withExtension, { knownPaths: options.knownPaths });\n return fromRoot?.kind === \"internal\" ? fromRoot.path : null;\n }\n\n // Bare name: a root-level `<target>.md`, else any file whose stem matches.\n if (options.knownPaths.has(withExtension)) {\n return withExtension;\n }\n for (const path of options.knownPaths) {\n if (pathStemMatches(path, target)) {\n return path;\n }\n }\n return null;\n}\n\nfunction pathStemMatches(path: string, target: string): boolean {\n const withoutExtension = path.endsWith(\".md\") ? path.slice(0, -3) : path;\n const basename = withoutExtension.split(\"/\").pop() ?? withoutExtension;\n const targetLower = target.toLowerCase();\n return (\n withoutExtension.toLowerCase() === targetLower ||\n basename.toLowerCase() === targetLower ||\n slugKey(withoutExtension) === slugKey(target) ||\n slugKey(basename) === slugKey(target)\n );\n}\n\n/** Mirror of the crate's `slug_key`: lowercase alphanumerics, collapse\n * ` -_/` to single dashes, drop other punctuation. */\nfunction slugKey(value: string): string {\n let raw = \"\";\n for (const ch of value) {\n if (/[\\p{L}\\p{N}]/u.test(ch)) {\n raw += ch.toLowerCase();\n } else if (ch === \" \" || ch === \"-\" || ch === \"_\" || ch === \"/\") {\n raw += \"-\";\n }\n }\n return raw.split(\"-\").filter(Boolean).join(\"-\");\n}\n","/**\n * Grammar-level code-context test for the regex-scanning inline plugins\n * (wikilink, highlight, footnote, math). Lezer emits no nodes for those\n * constructs, so the plugins scan raw text — but code is literal, and the\n * scans must skip it, exactly as the export pre-pass does (`protected_regions`\n * in `src-tauri/src/export/html.rs`, derived from comrak's parse).\n *\n * A plugin guards a match by its OPENER and CLOSER positions: either sitting\n * in code disqualifies the match, while a code span strictly inside the body\n * (`[[a `b` c]]`) does not — the same rule the export applies.\n */\n\nimport { ensureSyntaxTree, syntaxTree } from \"@codemirror/language\";\nimport type { EditorState } from \"@codemirror/state\";\nimport type { EditorView } from \"@codemirror/view\";\n\ntype Tree = ReturnType<typeof syntaxTree>;\n\n/** The slice of Lezer's SyntaxNode the ancestor walk touches. */\ntype NodeLike = { readonly name: string; readonly parent: NodeLike | null };\n\nconst CODE_NODES = new Set([\"FencedCode\", \"CodeBlock\", \"InlineCode\"]);\n\n/** The tree parsed through the viewport — the painter's forced-parse bound\n * (see `plugin.ts`), so a just-typed fence is already in the tree when a\n * viewport-scanning plugin consults the guard. */\nexport function viewportTree(view: EditorView): Tree {\n return ensureSyntaxTree(view.state, view.viewport.to, 100) ?? syntaxTree(view.state);\n}\n\n/** The tree parsed through the whole document, for doc-wide state-level scans\n * (math). Falls back to the partial tree when the parse budget runs out —\n * the guard then degrades to the unguarded behavior past the parse frontier. */\nexport function docTree(state: EditorState): Tree {\n return ensureSyntaxTree(state, state.doc.length, 20) ?? syntaxTree(state);\n}\n\n/** Whether the character at `pos` is code — inside a fenced or indented code\n * block or an inline code span. `resolveInner` descends into a fence's nested\n * `codeLanguages` parse; the parent walk crosses back into the markdown tree,\n * so the enclosing FencedCode still answers. */\nexport function inCode(tree: Tree, pos: number): boolean {\n let node = tree.resolveInner(pos, 1) as unknown as NodeLike | null;\n for (; node; node = node.parent) {\n if (CODE_NODES.has(node.name)) return true;\n }\n return false;\n}\n","/**\n * Wikilink decoration plugin — recognises `[[target]]` and\n * `[[target|alias]]` spans in the visible viewport, hides the\n * `[[` / `|target` / `]]` markup, and styles the visible label as\n * a clickable link.\n *\n * Why a separate plugin from `markdownDecorationsPlugin`: wikilinks\n * aren't part of CommonMark / GFM, so Lezer's parser doesn't emit a\n * node for them. We scan the visible text directly, skipping matches\n * in code contexts (`codeContext.ts`) where `[[…]]` is literal. Same\n * shape as the Tiptap `wikilinkExtension` — port of that logic, not\n * a new design.\n *\n * Click navigation lives in `clickModel.ts` (it shares the\n * link-target resolution path).\n */\n\nimport { Facet, type Range } from \"@codemirror/state\";\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type PluginValue,\n type ViewUpdate,\n} from \"@codemirror/view\";\n\nimport { parseWikilinkBody } from \"../../links/wikilink\";\nimport { inCode, viewportTree } from \"../core/codeContext\";\n\nconst WIKILINK_RE = /\\[\\[([^\\]\\n]+?)\\]\\]/g;\n\n/** Hides the `[[ … | ]]` syntax characters. */\nconst HIDE = Decoration.replace({});\n\n/** Class on the visible label so CSS can paint it as a link. */\nconst linkMark = Decoration.mark({ class: \"cm-wikilink\" });\n\n/**\n * Workspace-relative current file path. Wired by the editor's React\n * shell so the navigation click can resolve relative-style\n * wikilinks (`./note`, `../note`).\n */\nexport const wikilinkFromPathFacet = Facet.define<string | undefined, string | undefined>({\n combine: (vals) => vals[0],\n});\n\n/**\n * Set of every workspace-relative path. Used to resolve a wikilink\n * target to a real file. Combine prefers the first registered set\n * (the editor only adds one).\n */\nexport const wikilinkTargetsFacet = Facet.define<\n ReadonlySet<string>,\n ReadonlySet<string>\n>({\n combine: (vals) => vals[0] ?? new Set(),\n});\n\n/**\n * Build the decoration set for the visible viewport. Walks visible\n * ranges, scans each line's text for `[[…]]` matches, and emits\n * hide-replace + mark decorations.\n */\nfunction buildDecorations(view: EditorView): { decorations: DecorationSet; atomic: DecorationSet } {\n const builder: Range<Decoration>[] = [];\n const atomicBuilder: Range<Decoration>[] = [];\n const tree = viewportTree(view);\n\n for (const { from, to } of view.visibleRanges) {\n const text = view.state.sliceDoc(from, to);\n WIKILINK_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = WIKILINK_RE.exec(text)) !== null) {\n const body = match[1] ?? \"\";\n const { target } = parseWikilinkBody(body);\n if (target === \"\") continue;\n\n const matchStart = from + match.index;\n const matchEnd = matchStart + match[0].length;\n if (inCode(tree, matchStart) || inCode(tree, matchEnd - 2)) continue;\n const bodyStart = matchStart + 2; // after `[[`\n const bodyEnd = matchEnd - 2; // before `]]`\n\n // Compute the visible-label range. `[[target|alias]]` shows\n // `alias`; `[[target]]` shows `target`.\n const pipe = body.indexOf(\"|\");\n let labelStart = bodyStart;\n let labelEnd = bodyEnd;\n if (pipe !== -1) {\n const aliasRaw = body.slice(pipe + 1);\n if (aliasRaw.trim() !== \"\") {\n labelStart = bodyStart + pipe + 1;\n } else {\n labelEnd = bodyStart + pipe;\n }\n }\n\n // Hide `[[` (and the `target|` prefix if there's an alias).\n builder.push(HIDE.range(matchStart, labelStart));\n atomicBuilder.push(HIDE.range(matchStart, labelStart));\n // Style the visible label.\n builder.push(linkMark.range(labelStart, labelEnd));\n // Hide `]]` (and the trailing target if the alias was empty).\n builder.push(HIDE.range(labelEnd, matchEnd));\n atomicBuilder.push(HIDE.range(labelEnd, matchEnd));\n }\n }\n\n // Decorations must be sorted by `from` then `startSide`. The\n // produced order from the regex scan is already document-order so\n // `sort: true` is a cheap defensive insurance.\n return {\n decorations: Decoration.set(builder, true),\n atomic: Decoration.set(atomicBuilder, true),\n };\n}\n\nexport const wikilinkPlugin = ViewPlugin.fromClass(\n class implements PluginValue {\n decorations: DecorationSet;\n atomic: DecorationSet;\n constructor(view: EditorView) {\n const built = buildDecorations(view);\n this.decorations = built.decorations;\n this.atomic = built.atomic;\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n const built = buildDecorations(update.view);\n this.decorations = built.decorations;\n this.atomic = built.atomic;\n }\n }\n },\n {\n decorations: (v) => v.decorations,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomic ?? Decoration.none),\n },\n);\n","/**\n * Click model — handles the mouse interactions spec 7 requires that\n * CM6 doesn't already do natively.\n *\n * The default CM6 click path is *good* for normal text clicks: it\n * computes a byte position via `posAtCoords`, handles padding past\n * EOL by snapping to line end, supports drag-select, double-click\n * to select word, triple-click to select line. We do **not** want\n * to fight any of that — every previous attempt to intercept\n * mousedown ate the first click in some case (lost focus, blocked\n * drag start, etc).\n *\n * So this handler narrows to the single interaction CM6 can't infer\n * for us: **Cmd / Ctrl-click on a link → follow it** (spec 7.4). A\n * link to a known workspace file opens that note in a tab; a link\n * with a URI scheme opens in the browser. Plain click on a link\n * still places the caret in the link text via CM6's default.\n *\n * Checkbox toggles (7.5), image selection (7.6), and table cell\n * editing (7.8) are widget-driven — they handle their own clicks\n * via the widget DOM, so they don't appear here.\n *\n * Caret-never-inside-hidden-marker (spec 6.3) is enforced by the\n * decoration plugin's atomic ranges; the click handler doesn't need\n * a snap-to-content fallback because hidden ranges are rendered\n * width-0 by `Decoration.replace`, so clicks visually can't land on\n * them. Trust the rendering.\n */\n\nimport { EditorSelection, Facet } from \"@codemirror/state\";\nimport { EditorView } from \"@codemirror/view\";\n\nimport { parseWikilinkBody, resolveWikilinkTarget } from \"../../links/wikilink\";\nimport { resolveWorkspaceLink } from \"../../links/workspaceLink\";\nimport { inCode } from \"../core/codeContext\";\nimport { openExternalUrlFacet } from \"../core/hostFacets\";\nimport { wikilinkFromPathFacet, wikilinkTargetsFacet } from \"../wikilink/wikilinkPlugin\";\nimport { treeAt } from \"../core/treeAt\";\n\n/**\n * Navigation callback registered by the editor's React shell. Routes a\n * clicked workspace-relative path back through `selectFile`.\n */\nexport const navigateToFacet = Facet.define<\n (path: string) => void,\n ((path: string) => void) | null\n>({\n combine: (vals) => vals[0] ?? null,\n});\n\n/**\n * Walk up from a syntax node to find a `Link` ancestor and return\n * its URL — or `null` if the click wasn't on a link.\n */\nexport function linkUrlAt(view: EditorView, pos: number): string | null {\n const node = treeAt(view.state, pos).resolveInner(pos, 1);\n let n: typeof node | null = node;\n while (n && n.name !== \"Link\") n = n.parent;\n if (!n) return null;\n const urlNode = n.node.getChild(\"URL\");\n if (!urlNode) return null;\n return view.state.sliceDoc(urlNode.from, urlNode.to);\n}\n\n/**\n * If `pos` falls inside a `[[…]]` wikilink, return the workspace\n * file path it resolves to (or null if unresolved). Wikilinks are\n * detected via the same regex + code-context guard `wikilinkPlugin`\n * uses; we re-scan the current line at click time because the plugin\n * doesn't expose its matches.\n */\nexport function wikilinkTargetAt(view: EditorView, pos: number): string | null {\n const line = view.state.doc.lineAt(pos);\n const text = line.text;\n const re = /\\[\\[([^\\]\\n]+?)\\]\\]/g;\n const tree = treeAt(view.state, line.to);\n let m: RegExpExecArray | null;\n while ((m = re.exec(text)) !== null) {\n const matchStart = line.from + m.index;\n const matchEnd = matchStart + m[0].length;\n if (pos < matchStart || pos > matchEnd) continue;\n if (inCode(tree, matchStart) || inCode(tree, matchEnd - 2)) continue;\n const { target } = parseWikilinkBody(m[1] ?? \"\");\n if (!target) return null;\n const fromPath = view.state.facet(wikilinkFromPathFacet);\n const knownPaths = view.state.facet(wikilinkTargetsFacet);\n return resolveWikilinkTarget(target, { fromPath, knownPaths });\n }\n return null;\n}\n\n/** What a Cmd/Ctrl-clicked link resolves to. */\nexport type LinkAction =\n | { kind: \"navigate\"; path: string }\n | { kind: \"open\"; href: string };\n\n/**\n * Resolve the link under `pos` to an action. A markdown link `[t](href)` or a\n * `[[wikilink]]` that names a known workspace file → navigate in-app; a markdown\n * link with a URI scheme (`https:`, `mailto:`, …) → open in the browser; plain\n * text, a broken internal link, or an in-page `#anchor` → null, leaving the\n * click to CM6's default. Pure over editor state, so it's unit-testable with an\n * explicit pos — the DOM click path can't run under jsdom's layout-less\n * `posAtCoords`.\n */\nexport function linkActionAt(view: EditorView, pos: number): LinkAction | null {\n const url = linkUrlAt(view, pos);\n if (url) {\n const fromPath = view.state.facet(wikilinkFromPathFacet);\n const knownPaths = view.state.facet(wikilinkTargetsFacet);\n const resolved = resolveWorkspaceLink(url, { fromPath, knownPaths });\n if (resolved?.kind === \"internal\") return { kind: \"navigate\", path: resolved.path };\n if (resolved?.kind === \"external\") return { kind: \"open\", href: resolved.href };\n return null;\n }\n const target = wikilinkTargetAt(view, pos);\n return target ? { kind: \"navigate\", path: target } : null;\n}\n\nexport const clickModel = EditorView.domEventHandlers({\n mousedown(event, view) {\n // Only intervene on Cmd/Ctrl-click — everything else stays\n // with CM6's default click path so focus + drag-select + EOL\n // snapping all keep working.\n if (event.button !== 0) return false;\n if (!(event.metaKey || event.ctrlKey)) return false;\n const pos = view.posAtCoords({ x: event.clientX, y: event.clientY });\n if (pos == null) return false;\n const action = linkActionAt(view, pos);\n if (action?.kind === \"navigate\") {\n const navigate = view.state.facet(navigateToFacet);\n if (navigate) {\n event.preventDefault();\n navigate(action.path);\n return true;\n }\n } else if (action?.kind === \"open\") {\n event.preventDefault();\n view.state.facet(openExternalUrlFacet)(action.href);\n return true;\n }\n return false;\n },\n contextmenu(event, view) {\n // Right-click → select the word under the pointer and let the\n // selection comment bubble surface its menu. Spec section 7.4\n // (comment context menu on highlight) is the same UX whether\n // the user dragged a selection or right-clicked — both produce\n // a non-empty selection so the bubble appears.\n //\n // If the user has an existing selection that covers the click,\n // leave it as-is; otherwise expand the click position to the\n // word boundary.\n const pos = view.posAtCoords({ x: event.clientX, y: event.clientY });\n if (pos == null) return false;\n const current = view.state.selection.main;\n if (!current.empty && pos >= current.from && pos <= current.to) {\n // Existing selection covers the click — no need to re-select.\n return false;\n }\n const wordRange = view.state.wordAt(pos);\n if (!wordRange || wordRange.from === wordRange.to) return false;\n event.preventDefault();\n view.dispatch({\n selection: EditorSelection.range(wordRange.from, wordRange.to),\n userEvent: \"select.pointer\",\n });\n return true;\n },\n});\n","/**\n * Renders a table cell's inline markdown to an HTML string by walking the Lezer\n * inline nodes already parsed inside the `TableCell`, styled through the SAME\n * {@link NODE_RULES} the live editor uses: a `mark` paint becomes a `<span>`\n * carrying that rule's class (`cm-strong`, `cm-inline-code`, `cm-link`, …), so\n * a cell's bold/code/link is painted by the exact `.cm-*` theme rules as body\n * text — not a second, drifting set of styles. Hidden chrome drops out;\n * not-yet-styled constructs pass through as raw markdown, matching how the\n * body leaves them today. Cells render STRINGS, not DOM, so a `widget` paint\n * passes the node's raw source through (the cell's DOMPurify pass keeps\n * allow-listed inline HTML like `<br>` and drops the rest).\n *\n * Reading the parsed tree (rather than re-parsing the cell string) preserves\n * escaped pipes and leaves literal inline HTML (`<br>`) in the gaps between\n * nodes intact — the cell's DOMPurify pass (tableCell.ts) sanitises the result.\n */\n\nimport { type EditorState } from \"@codemirror/state\";\n\nimport { type NodeLike } from \"../core/paint\";\nimport { NODE_RULES } from \"../core/registry\";\n\ntype SyntaxNodeLike = {\n readonly name: string;\n readonly from: number;\n readonly to: number;\n readonly firstChild: SyntaxNodeLike | null;\n readonly nextSibling: SyntaxNodeLike | null;\n};\n\nfunction escapeText(value: string): string {\n return value.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\nfunction escapeAttr(value: string): string {\n return escapeText(value).replace(/\"/g, \""\");\n}\n\n/**\n * `InlineCode` content sits between its two `CodeMark` backtick children and is\n * literal — no nested markdown — so it's entity-escaped rather than recursed.\n */\nfunction codeText(state: EditorState, node: SyntaxNodeLike): string {\n let innerFrom = node.from;\n let innerTo = node.to;\n let seenMark = false;\n for (let child = node.firstChild; child; child = child.nextSibling) {\n if (child.name !== \"CodeMark\") continue;\n if (!seenMark) {\n innerFrom = child.to;\n seenMark = true;\n }\n innerTo = child.from;\n }\n return state.sliceDoc(innerFrom, innerTo);\n}\n\nfunction renderLink(state: EditorState, node: SyntaxNodeLike, className: string): string {\n let url = \"\";\n let labelFrom = -1;\n let labelTo = -1;\n for (let child = node.firstChild; child; child = child.nextSibling) {\n if (child.name === \"URL\") url = state.sliceDoc(child.from, child.to);\n else if (child.name === \"LinkMark\") {\n const mark = state.sliceDoc(child.from, child.to);\n if (mark === \"[\") labelFrom = child.to;\n else if (mark === \"]\" && labelTo < 0) labelTo = child.from;\n }\n }\n if (labelFrom < 0 || labelTo < 0) return state.sliceDoc(node.from, node.to);\n const label = renderRange(state, node, labelFrom, labelTo);\n // Keep the anchor — the widget's click handler routes a Cmd-click through to\n // the host opener — but carry `.cm-link` so it matches body links.\n return url\n ? `<a href=\"${escapeAttr(url)}\" class=\"${className}\">${label}</a>`\n : `<span class=\"${className}\">${label}</span>`;\n}\n\n/** A registry `mark` node → `<span class=\"…\">`, reusing the editor's own class. */\nfunction renderMark(state: EditorState, node: SyntaxNodeLike, className: string): string {\n if (node.name === \"InlineCode\") {\n // Literal content between the backtick `CodeMark`s — entity-escaped, no recursion.\n return `<span class=\"${className}\">${escapeText(codeText(state, node))}</span>`;\n }\n if (node.name === \"Link\") {\n return renderLink(state, node, className);\n }\n return `<span class=\"${className}\">${renderRange(state, node, node.from, node.to)}</span>`;\n}\n\nfunction renderNode(state: EditorState, parent: SyntaxNodeLike, node: SyntaxNodeLike): string {\n const rule = NODE_RULES[node.name];\n // An unknown node (no rule) is emitted verbatim.\n if (!rule) return state.sliceDoc(node.from, node.to);\n const paint = rule({\n name: node.name,\n from: node.from,\n to: node.to,\n parentName: parent.name,\n node: node as unknown as NodeLike,\n state,\n });\n switch (paint.paint) {\n case \"mark\":\n return renderMark(state, node, paint.className);\n case \"hide\": {\n // Emit whatever the rule did NOT hide — \"\" for whole-node chrome\n // (`**`, `` ` ``, a Link's URL), the escaped character for `\\x`.\n const hidden = paint.range ?? node;\n return state.sliceDoc(node.from, hidden.from) + state.sliceDoc(hidden.to, node.to);\n }\n case \"widget\":\n // Cells render strings, not DOM — the raw source passes through and\n // the cell's DOMPurify pass keeps allow-listed tags (`<br>`).\n return state.sliceDoc(node.from, node.to);\n default:\n // none / lineClass: recurse so nested styled marks still render, while\n // this node's own (unstyled) markup passes through as raw text.\n return renderRange(state, node, node.from, node.to);\n }\n}\n\n/**\n * Render `parent`'s inline content clipped to `[from, to)`: each child node\n * becomes its tag, and the un-tokenised text in the gaps between children\n * (plain text, inline HTML) is emitted verbatim.\n */\nfunction renderRange(\n state: EditorState,\n parent: SyntaxNodeLike,\n from: number,\n to: number,\n): string {\n let html = \"\";\n let pos = from;\n for (let child = parent.firstChild; child; child = child.nextSibling) {\n if (child.to <= from || child.from >= to) continue;\n if (child.from > pos) html += state.sliceDoc(pos, child.from);\n html += renderNode(state, parent, child);\n pos = child.to;\n }\n if (pos < to) html += state.sliceDoc(pos, to);\n return html;\n}\n\n/** Inline-render one `TableCell` node to a (still-to-be-sanitised) HTML string. */\nexport function renderInlineCell(state: EditorState, cell: SyntaxNodeLike): string {\n return renderRange(state, cell, cell.from, cell.to).trim();\n}\n","/**\n * Turns a Lezer `Table` node into the per-table row/column models the widget\n * renders. Reading the parsed tree (not re-splitting the source on `|`) keeps\n * the model aligned with Lezer's boundaries:\n *\n * - Escaped pipes (`x \\| y`) stay inside one `TableCell`.\n * - Cell inline markdown (`**b**`, `` `c` ``, links) renders via the cell's\n * inline child nodes (see {@link renderInlineCell}).\n * - Trailing prose Lezer folds into the table (no blank-line gap) carries no\n * `TableDelimiter`, so it's dropped rather than rendered as a junk row.\n * - Tables written with no blank line between them are merged by Lezer into a\n * single node; each interior delimiter row begins a new table, so one node\n * can yield several models.\n */\n\nimport { type EditorState } from \"@codemirror/state\";\n\nimport { renderInlineCell } from \"./tableInline\";\n\ntype SyntaxNodeLike = {\n readonly name: string;\n readonly from: number;\n readonly to: number;\n readonly firstChild: SyntaxNodeLike | null;\n readonly nextSibling: SyntaxNodeLike | null;\n};\n\nexport interface TableCellData {\n /** Inline-rendered HTML (sanitised at render time). */\n html: string;\n /** The cell's content range in the document — the span a cell editor edits. */\n from: number;\n to: number;\n}\n\nexport interface TableData {\n header: TableCellData[];\n rows: TableCellData[][];\n alignments: Array<\"left\" | \"right\" | \"center\" | null>;\n}\n\n/** One rendered table plus the document range its source occupies. */\nexport interface TableModel {\n data: TableData;\n from: number;\n to: number;\n}\n\nfunction alignmentFor(spec: string): \"left\" | \"right\" | \"center\" | null {\n const t = spec.trim();\n if (!t) return null;\n const left = t.startsWith(\":\");\n const right = t.endsWith(\":\");\n if (left && right) return \"center\";\n if (right) return \"right\";\n if (left) return \"left\";\n return null;\n}\n\n/**\n * A row's cells in document order, including empty ones. Lezer emits a\n * `TableCell` only for non-empty cells, so an empty cell shows up as two\n * adjacent `TableDelimiter` pipes with nothing between — reconstruct those as\n * empty cells (range = the gap) so blank or freshly inserted rows and columns\n * still render and stay editable. Walking the pipe/cell nodes (rather than\n * splitting on `|`) keeps an escaped pipe (`x \\| y`) inside its one cell.\n */\nfunction cells(state: EditorState, row: SyntaxNodeLike): TableCellData[] {\n const out: TableCellData[] = [];\n let lastPipeTo: number | null = null;\n let sawCell = false;\n for (let child = row.firstChild; child; child = child.nextSibling) {\n if (child.name === \"TableCell\") {\n out.push({ html: renderInlineCell(state, child), from: child.from, to: child.to });\n sawCell = true;\n } else if (child.name === \"TableDelimiter\") {\n if (lastPipeTo !== null && !sawCell) {\n out.push({ html: \"\", from: lastPipeTo, to: child.from });\n }\n lastPipeTo = child.to;\n sawCell = false;\n }\n }\n return out;\n}\n\n/**\n * A genuine GFM row carries at least one `TableDelimiter` (the `|` pipes).\n * Lezer folds a blank-line-less trailing paragraph into the table as a\n * `TableRow` with a single cell and no delimiter — prose, not a row.\n */\nfunction isContentRow(row: SyntaxNodeLike): boolean {\n for (let child = row.firstChild; child; child = child.nextSibling) {\n if (child.name === \"TableDelimiter\") return true;\n }\n return false;\n}\n\nfunction alignmentsFrom(state: EditorState, delimiterLine: SyntaxNodeLike): string[] {\n return state\n .sliceDoc(delimiterLine.from, delimiterLine.to)\n .replace(/^\\s*\\|/, \"\")\n .replace(/\\|\\s*$/, \"\")\n .split(\"|\")\n .map((s) => s.trim());\n}\n\nfunction rowCellTexts(state: EditorState, row: SyntaxNodeLike): string[] {\n const cells: string[] = [];\n for (let child = row.firstChild; child; child = child.nextSibling) {\n if (child.name === \"TableCell\") cells.push(state.sliceDoc(child.from, child.to).trim());\n }\n return cells;\n}\n\n/** `| --- | :-: |`: every cell is a dash run with optional alignment colons. */\nfunction isDelimiterCells(cells: string[]): boolean {\n return cells.length > 0 && cells.every((c) => /^:?-+:?$/.test(c));\n}\n\n/**\n * Whether a line is a delimiter (alignment) row. Lezer tags only the FIRST\n * one as a `TableDelimiter` node; the separator of a back-to-back table is a\n * plain `TableRow` whose cells happen to be dash runs, so those are detected by\n * content.\n */\nfunction isDelimiterRow(state: EditorState, node: SyntaxNodeLike): boolean {\n if (node.name === \"TableDelimiter\") return true;\n return isDelimiterCells(rowCellTexts(state, node));\n}\n\ninterface Item {\n node: SyntaxNodeLike;\n isDelimiter: boolean;\n}\n\n/** The Table node's header/row lines and delimiter lines, in document order. */\nfunction tableItems(state: EditorState, table: SyntaxNodeLike): Item[] {\n const items: Item[] = [];\n for (let child = table.firstChild; child; child = child.nextSibling) {\n if (\n child.name === \"TableHeader\" ||\n child.name === \"TableRow\" ||\n child.name === \"TableDelimiter\"\n ) {\n items.push({ node: child, isDelimiter: isDelimiterRow(state, child) });\n }\n }\n return items;\n}\n\n/**\n * Body rows for the table whose delimiter is at `delimiterIndex`: content rows\n * up to the header of the next back-to-back table (the row immediately before\n * the next delimiter), skipping folded-in prose.\n */\nfunction bodyRows(\n state: EditorState,\n items: Item[],\n delimiterIndex: number,\n): { rows: TableCellData[][]; to: number } {\n const rows: TableCellData[][] = [];\n let to = items[delimiterIndex].node.to;\n for (let j = delimiterIndex + 1; j < items.length; j++) {\n if (items[j].isDelimiter) break;\n if (items[j + 1]?.isDelimiter) break;\n if (!isContentRow(items[j].node)) continue;\n rows.push(cells(state, items[j].node));\n to = items[j].node.to;\n }\n return { rows, to };\n}\n\nexport function parseTableNode(state: EditorState, table: SyntaxNodeLike): TableModel[] {\n const items = tableItems(state, table);\n const models: TableModel[] = [];\n for (let k = 0; k < items.length; k++) {\n if (!items[k].isDelimiter) continue;\n const headerItem = items[k - 1];\n if (!headerItem || headerItem.isDelimiter) continue;\n const { rows, to } = bodyRows(state, items, k);\n models.push({\n data: {\n header: cells(state, headerItem.node),\n rows,\n alignments: alignmentsFrom(state, items[k].node).map(alignmentFor),\n },\n from: headerItem.node.from,\n to,\n });\n }\n return models;\n}\n","/**\n * Renders a table cell's inline HTML into safe DOM.\n *\n * The string is pre-rendered by {@link renderInlineCell} (markdown markup →\n * `<span>`s carrying the editor's `.cm-*` mark classes) and may also carry\n * literal inline HTML from the source — most commonly `<br>` to stack several\n * lines in one cell — so it can't go in as `textContent`. It's sanitized through\n * DOMPurify with an inline-only allow-list: emphasis, code, links, and `<br>`\n * pass through; block, script, and event-handler markup is stripped. `class` is\n * allowed (CSS classes are inert — no XSS surface) so the mark styling survives;\n * DOMPurify also neutralises unsafe `href` schemes (e.g. `javascript:`).\n */\n\nimport DOMPurify from \"dompurify\";\n\nconst CELL_SANITIZE_CONFIG = {\n ALLOWED_TAGS: [\"br\", \"b\", \"strong\", \"i\", \"em\", \"code\", \"sub\", \"sup\", \"del\", \"s\", \"u\", \"span\", \"a\"],\n ALLOWED_ATTR: [\"href\", \"class\"],\n RETURN_TRUSTED_TYPE: false,\n};\n\nexport function renderCellInto(el: HTMLElement, source: string): void {\n el.innerHTML = DOMPurify.sanitize(source, CELL_SANITIZE_CONFIG) as unknown as string;\n}\n","/**\n * Surface synchronisation for the V2 table (ADR 0001): after every document\n * change the widget DOM has been patched or recreated — remap the surface's\n * table anchor through the change, then let it re-attach the active edit.\n */\n\nimport { EditorView } from \"@codemirror/view\";\nimport { type Extension } from \"@codemirror/state\";\n\nimport { type CellEditingSurface } from \"./cellEditingSurface\";\n\nexport function tableV2Sync(surface: CellEditingSurface): Extension {\n return EditorView.updateListener.of((update) => {\n if (!update.docChanged) return;\n surface.mapThrough(update.changes);\n surface.reanchor(update.view);\n });\n}\n","/**\n * V2 table widget (ADR 0001): pure render, stable lifecycle, no editors inside.\n *\n * Lifecycle contract — the make-or-break constraint:\n * - `eq` compares source anchors + data, so ANY doc change (offsets shift)\n * makes CM consult `updateDOM`.\n * - `updateDOM` patches cell contents IN PLACE (element identity preserved)\n * and re-stamps the source anchor; it declines (→ full recreate) only when\n * the grid SHAPE changed.\n * - After either path, the tableV2 extension calls the active surface's\n * `reanchor` so an in-progress cell edit survives.\n *\n * Editing is delegated entirely to a {@link CellEditingSurface}; this file has\n * no caret, focus, or selection logic by design.\n */\n\nimport { syntaxTree } from \"@codemirror/language\";\nimport { type EditorState, StateField, type Extension, type Range } from \"@codemirror/state\";\nimport { Decoration, type DecorationSet, EditorView, WidgetType } from \"@codemirror/view\";\n\nimport { renderCellInto } from \"../table/tableCell\";\nimport { parseTableNode, type TableCellData, type TableData } from \"../table/tableModel\";\nimport { type CellEditingSurface } from \"./cellEditingSurface\";\nimport { tableV2Sync } from \"./tableV2Sync\";\n\nfunction fillCell(el: HTMLElement, cell: TableCellData, row: number, col: number): void {\n renderCellInto(el, cell.html);\n el.dataset.row = String(row);\n el.dataset.col = String(col);\n // The structure menu's row/column hover-tint locates cells by source pos.\n el.dataset.cellFrom = String(cell.from);\n}\n\n/** One rendered text line inside a cell (theme line-height + padding). */\nconst ROW_LINE_PX = 28;\n/** Header row + top/bottom borders. */\nconst HEADER_PX = 30;\n/** Characters a full table row fits per rendered line at the panel's usual\n * width. Auto layout shares this across columns proportionally to content,\n * so per-ROW totals predict wrapping far better than any per-column guess. */\nconst ROW_CHARS_PER_LINE = 85;\n\n/**\n * Wrap-aware height estimate for an unmeasured table. CM6 places everything\n * below an unmeasured widget using this number; the previous one-line-per-row\n * assumption under-estimated prose-heavy tables by 3-5×, so a fast scroll ran\n * on geometry that was off by hundreds of px per table — and the correction,\n * landing mid-interaction, yanked the viewport and re-anchored selections\n * onto whatever content shifted under the pointer.\n */\nexport function estimateTableHeight(data: TableData): number {\n let height = HEADER_PX;\n for (const row of data.rows) {\n const rowChars = row.reduce((sum, cell) => sum + Math.max(1, cell.to - cell.from), 0);\n height += Math.max(1, Math.ceil(rowChars / ROW_CHARS_PER_LINE)) * ROW_LINE_PX;\n }\n return height;\n}\n\nexport class TableWidgetV2 extends WidgetType {\n private readonly heightEstimate: number;\n\n constructor(\n readonly data: TableData,\n readonly sourceFrom: number,\n readonly sourceTo: number,\n ) {\n super();\n this.heightEstimate = estimateTableHeight(data);\n }\n\n override eq(other: TableWidgetV2): boolean {\n return (\n other.sourceFrom === this.sourceFrom &&\n other.sourceTo === this.sourceTo &&\n JSON.stringify(other.data) === JSON.stringify(this.data)\n );\n }\n\n override toDOM(): HTMLElement {\n const wrap = document.createElement(\"div\");\n // Both generations of class/stamp: cm-table-wrap carries the existing\n // theme + armed-delete styling; the v2 markers are what the surface reads.\n wrap.className = \"cm-tablev2-wrap cm-table-wrap\";\n wrap.dataset.tablev2From = String(this.sourceFrom);\n wrap.dataset.tableFrom = String(this.sourceFrom);\n\n const table = document.createElement(\"table\");\n table.className = \"cm-table-widget\";\n const thead = document.createElement(\"thead\");\n const headRow = document.createElement(\"tr\");\n this.data.header.forEach((cell, col) => {\n const th = document.createElement(\"th\");\n fillCell(th, cell, 0, col);\n const align = this.data.alignments[col];\n if (align) th.style.textAlign = align;\n headRow.appendChild(th);\n });\n thead.appendChild(headRow);\n table.appendChild(thead);\n\n const tbody = document.createElement(\"tbody\");\n this.data.rows.forEach((cells, r) => {\n const tr = document.createElement(\"tr\");\n cells.forEach((cell, col) => {\n const td = document.createElement(\"td\");\n fillCell(td, cell, r + 1, col);\n const align = this.data.alignments[col];\n if (align) td.style.textAlign = align;\n tr.appendChild(td);\n });\n tbody.appendChild(tr);\n });\n table.appendChild(tbody);\n wrap.appendChild(table);\n return wrap;\n }\n\n override updateDOM(dom: HTMLElement): boolean {\n if (dom.dataset.tablev2From === undefined) return false;\n const rows = dom.querySelectorAll(\"tr\");\n if (rows.length !== 1 + this.data.rows.length) return false;\n const grid: TableCellData[][] = [this.data.header, ...this.data.rows];\n for (let r = 0; r < grid.length; r++) {\n const cells = rows[r].children;\n if (cells.length !== grid[r].length) return false;\n }\n dom.dataset.tablev2From = String(this.sourceFrom);\n dom.dataset.tableFrom = String(this.sourceFrom);\n for (let r = 0; r < grid.length; r++) {\n const cells = rows[r].children;\n grid[r].forEach((cell, col) => {\n fillCell(cells[col] as HTMLElement, cell, r, col);\n });\n }\n return true;\n }\n\n // The surface owns all pointer/keyboard interaction inside the grid; CM\n // resolving those events against the atomic widget would fight it.\n override ignoreEvent(): boolean {\n return true;\n }\n\n override get estimatedHeight(): number {\n return this.heightEstimate;\n }\n}\n\nfunction buildDecorations(state: EditorState): DecorationSet {\n const ranges: Range<Decoration>[] = [];\n syntaxTree(state).iterate({\n enter(node) {\n if (node.name !== \"Table\") return;\n for (const model of parseTableNode(state, node.node)) {\n ranges.push(\n Decoration.replace({\n widget: new TableWidgetV2(model.data, model.from, model.to),\n block: true,\n }).range(model.from, model.to),\n );\n }\n },\n });\n return Decoration.set(ranges, true);\n}\n\n/** The V2 table extension: widget field + surface synchronisation. */\nexport function tableV2(surface: CellEditingSurface): Extension {\n const field = StateField.define<DecorationSet>({\n create: buildDecorations,\n update(value, tr) {\n if (tr.docChanged || syntaxTree(tr.state) !== syntaxTree(tr.startState)) {\n return buildDecorations(tr.state);\n }\n return value;\n },\n provide: (f) => EditorView.decorations.from(f),\n });\n return [field, tableV2Sync(surface)];\n}\n","import { syntaxTree } from \"@codemirror/language\";\nimport { type EditorState, StateField, type Range } from \"@codemirror/state\";\nimport { Decoration, type DecorationSet, EditorView } from \"@codemirror/view\";\n\nimport { parseTableNode } from \"./tableModel\";\nimport { TableWidgetV2 } from \"../tablev2/tableWidgetV2\";\n\nfunction buildTableDecorations(state: EditorState): DecorationSet {\n const ranges: Range<Decoration>[] = [];\n syntaxTree(state).iterate({\n enter(node) {\n if (node.name !== \"Table\") return;\n // One Lezer Table node can hold several tables (back-to-back, no blank\n // line between); each becomes its own widget over its own source range.\n for (const model of parseTableNode(state, node.node)) {\n ranges.push(\n Decoration.replace({\n widget: new TableWidgetV2(model.data, model.from, model.to),\n block: true,\n }).range(model.from, model.to),\n );\n }\n },\n });\n return Decoration.set(ranges, true);\n}\n\nexport const tableField = StateField.define<DecorationSet>({\n create: buildTableDecorations,\n update(value, tr) {\n // Rebuild on edits AND when the parser advances. CodeMirror parses lazily,\n // so on a long document the tables below the initially-parsed region only\n // enter the syntax tree as the user scrolls; without rebuilding on parse\n // progress they never get decorated and stay as raw `| … |` markdown.\n if (tr.docChanged || syntaxTree(tr.state) !== syntaxTree(tr.startState)) {\n return buildTableDecorations(tr.state);\n }\n return value;\n },\n provide: (f) => EditorView.decorations.from(f),\n});\n","/**\n * Visible-position navigation across hidden, atomic ranges.\n *\n * In Rich Edit Mode the caret may never land *inside* an atomic range — a\n * hidden inline marker (`**`, `[`, `` ` ``, …) or a whole table's `| … |` block\n * source. These helpers return the next / previous position that sits outside\n * every atomic range, so the arrow keys and the delete normalizer step *over* a\n * table the same way they step over an inline marker instead of walking into\n * its hidden source.\n *\n * Two atomic sources are consulted together: the decoration plugin's inline\n * ranges and the table field's block ranges. (The table also registers with\n * CM6's `EditorView.atomicRanges` facet, but that only governs CM6's *default*\n * commands — our `Prec.high` arrow/delete handlers run instead, so they have to\n * consult the table themselves or they march straight through the grid source.)\n *\n * \"Inside\" is strict: a position at a range's `from` or `to` is a boundary the\n * caret may rest on, not inside it.\n */\n\nimport { findClusterBreak } from \"@codemirror/state\";\nimport { type EditorView } from \"@codemirror/view\";\n\nimport { markdownDecorationsPlugin } from \"../core/plugin\";\nimport { tableField } from \"../table/tableField\";\n\ntype RangeQueryable = {\n between(from: number, to: number, f: (from: number, to: number) => void | false): void;\n};\n\n/** The atomic range strictly containing `p` (inline marker or table), or null. */\nfunction containingAtomic(view: EditorView, p: number): { from: number; to: number } | null {\n let found: { from: number; to: number } | null = null;\n const scan = (set: RangeQueryable | null | undefined): void => {\n if (found || !set) return;\n set.between(p, p, (from, to) => {\n if (from < p && p < to) {\n found = { from, to };\n return false;\n }\n });\n };\n scan(view.plugin(markdownDecorationsPlugin)?.atomic);\n scan(view.state.field(tableField, false));\n return found;\n}\n\n/**\n * A table whose far edge sits exactly at `p` in the direction of travel — its\n * `to` when stepping backward, its `from` when stepping forward. Block widgets\n * paint position `to` on the blank line just past the table (and `from` on the\n * line just before), so resting the caret there looks identical to the adjacent\n * line — a press that seems to do nothing. Treat the edge like the inside of the\n * table and step over the whole grid, so the caret moves through it in one key.\n */\nfunction tableEdgeAt(\n view: EditorView,\n p: number,\n dir: \"backward\" | \"forward\",\n): { from: number; to: number } | null {\n let found: { from: number; to: number } | null = null;\n view.state.field(tableField, false)?.between(p, p, (from, to) => {\n if (dir === \"backward\" ? to === p : from === p) {\n found = { from, to };\n return false;\n }\n });\n return found;\n}\n\n/** The atomic range whose far edge sits exactly at `p` on the given side —\n * the trailing edge when looking backward, the leading edge when forward. */\nfunction atomicTouching(\n view: EditorView,\n p: number,\n side: \"before\" | \"after\",\n): { from: number; to: number } | null {\n let found: { from: number; to: number } | null = null;\n const scan = (set: RangeQueryable | null | undefined): void => {\n if (found || !set) return;\n set.between(p, p, (from, to) => {\n if (from === to) return; // zero-length ranges aren't skippable content\n if (side === \"before\" ? to === p : from === p) {\n found = { from, to };\n return false;\n }\n });\n };\n scan(view.plugin(markdownDecorationsPlugin)?.atomic);\n scan(view.state.field(tableField, false));\n return found;\n}\n\n/**\n * The visible grapheme immediately before/after `pos` as a deletable source\n * range, skipping any hidden markers between it and the caret — or null at the\n * document edge. Unlike {@link previousVisiblePosition} (a caret MOTION stop),\n * this never folds a marker into the range: deleting it removes exactly one\n * visible character, so `**Compose**` backspaced from either side of its\n * hidden closing `**` becomes `**Compos**`, never raw `**Compos`. A newline\n * counts as the adjacent char — callers treat that as a line-join.\n */\nexport function visibleCharBefore(\n view: EditorView,\n pos: number,\n): { from: number; to: number } | null {\n let e = pos;\n for (;;) {\n const range = containingAtomic(view, e) ?? atomicTouching(view, e, \"before\");\n if (!range) break;\n e = range.from;\n }\n if (e <= 0) return null;\n const line = view.state.doc.lineAt(e);\n if (e === line.from) return { from: e - 1, to: e };\n return { from: line.from + findClusterBreak(line.text, e - line.from, false), to: e };\n}\n\nexport function visibleCharAfter(\n view: EditorView,\n pos: number,\n): { from: number; to: number } | null {\n const docLen = view.state.doc.length;\n let s = pos;\n for (;;) {\n const range = containingAtomic(view, s) ?? atomicTouching(view, s, \"after\");\n if (!range) break;\n s = range.to;\n }\n if (s >= docLen) return null;\n const line = view.state.doc.lineAt(s);\n if (s === line.to) return { from: s, to: s + 1 };\n return { from: s, to: line.from + findClusterBreak(line.text, s - line.from, true) };\n}\n\nexport function previousVisiblePosition(view: EditorView, pos: number): number {\n if (pos <= 0) return 0;\n let p = pos - 1;\n while (p > 0) {\n const range = containingAtomic(view, p) ?? tableEdgeAt(view, p, \"backward\");\n if (range) p = range.from - 1;\n else return p;\n }\n return 0;\n}\n\nexport function nextVisiblePosition(view: EditorView, pos: number): number {\n const docLen = view.state.doc.length;\n if (pos >= docLen) return docLen;\n let p = pos + 1;\n while (p < docLen) {\n const range = containingAtomic(view, p) ?? tableEdgeAt(view, p, \"forward\");\n if (range) p = range.to + 1;\n else return p;\n }\n return docLen;\n}\n","/**\n * Cursor model — visible-position navigation across hidden markdown\n * syntax.\n *\n * Per spec section 6.3, in Rich Edit Mode the caret may never land\n * inside a hidden marker. The natural CM6 atomic-ranges behaviour\n * snaps the caret to the nearest *boundary* of a hidden region —\n * but boundaries of a hidden region look the same visually (the\n * `**` between them is hidden), so left-arrow from \"end of bold\"\n * appears to do nothing on the first press and only moves on the\n * second.\n *\n * This module replaces those motions with commands that compute\n * the **next visible source position** in one step:\n *\n * 1. Step one source character in the desired direction.\n * 2. If that step landed strictly inside an atomic range, jump\n * past the range entirely (one character beyond its far edge).\n * 3. Repeat until the position is outside every atomic range or\n * at the document boundary.\n *\n * The output is the position the user expects: one visible char\n * to the left or right of where they were. Hidden markers cease to\n * exist as cursor stops.\n *\n * Wired at `Prec.high` so the bindings beat `defaultKeymap`.\n */\n\nimport { EditorSelection, Prec } from \"@codemirror/state\";\nimport { type Command, keymap } from \"@codemirror/view\";\n\nimport { nextVisiblePosition, previousVisiblePosition } from \"./visiblePosition\";\n\nexport const cursorVisibleCharLeft: Command = (view) => {\n const main = view.state.selection.main;\n const newPos = main.empty\n ? previousVisiblePosition(view, main.head)\n : Math.min(main.from, main.to);\n view.dispatch({\n selection: EditorSelection.cursor(newPos),\n userEvent: \"select.move\",\n scrollIntoView: true,\n });\n return true;\n};\n\nexport const cursorVisibleCharRight: Command = (view) => {\n const main = view.state.selection.main;\n const newPos = main.empty\n ? nextVisiblePosition(view, main.head)\n : Math.max(main.from, main.to);\n view.dispatch({\n selection: EditorSelection.cursor(newPos),\n userEvent: \"select.move\",\n scrollIntoView: true,\n });\n return true;\n};\n\nexport const selectVisibleCharLeft: Command = (view) => {\n const main = view.state.selection.main;\n view.dispatch({\n selection: EditorSelection.range(main.anchor, previousVisiblePosition(view, main.head)),\n userEvent: \"select.extend\",\n scrollIntoView: true,\n });\n return true;\n};\n\nexport const selectVisibleCharRight: Command = (view) => {\n const main = view.state.selection.main;\n view.dispatch({\n selection: EditorSelection.range(main.anchor, nextVisiblePosition(view, main.head)),\n userEvent: \"select.extend\",\n scrollIntoView: true,\n });\n return true;\n};\n\nexport const cursorModelKeymap = Prec.high(\n keymap.of([\n { key: \"ArrowLeft\", run: cursorVisibleCharLeft },\n { key: \"ArrowRight\", run: cursorVisibleCharRight },\n { key: \"Shift-ArrowLeft\", run: selectVisibleCharLeft },\n { key: \"Shift-ArrowRight\", run: selectVisibleCharRight },\n ]),\n);\n","/**\n * Visible \"armed for deletion\" state for the two-step table delete.\n *\n * The first Backspace/Delete next to a table parks the caret at the table's\n * edge instead of editing its hidden source (see deleteNormalizer), and records\n * that intent here via `setArmedTable`. While armed, this plugin outlines the\n * table and draws a green \"cursor behind the table\" line at the parked edge —\n * the cue that the next press removes it (Zettlr's affordance) — and the theme\n * hides the real caret.\n *\n * Arming is EXPLICIT, not inferred from the caret resting at an edge: ordinary\n * navigation lands the caret on a table edge too, and that must not arm\n * anything or hide the cursor. Any later move or edit disarms.\n */\n\nimport { StateEffect, StateField, type EditorState } from \"@codemirror/state\";\nimport { EditorView, ViewPlugin, type ViewUpdate } from \"@codemirror/view\";\n\n/** Which edge of a table the caret is parked against. `\"end\"` is the trailing\n * edge (a Backspace from the line below); `\"start\"` is the leading edge (a\n * Delete from the line above). The edge decides where the green line is drawn\n * — under the table or over it. */\nexport interface ArmedTable {\n from: number;\n edge: \"start\" | \"end\";\n}\n\n/** Arm (with an `ArmedTable`) or disarm (with null) the two-step table delete.\n * Dispatched by the delete normalizer when its first press parks the caret. */\nexport const setArmedTable = StateEffect.define<ArmedTable | null>();\n\n/** The armed table, or null. Set only by `setArmedTable`; cleared by any cursor\n * move or document edit, so navigating onto a table edge never arms it. */\nexport const armedTableField = StateField.define<ArmedTable | null>({\n create: () => null,\n update(value, tr) {\n for (const effect of tr.effects) if (effect.is(setArmedTable)) return effect.value;\n if (tr.selection || tr.docChanged) return null;\n return value;\n },\n});\n\nexport function armedTable(state: EditorState): ArmedTable | null {\n return state.field(armedTableField, false) ?? null;\n}\n\nclass TableArmedHighlighter {\n constructor(view: EditorView) {\n this.sync(view);\n }\n\n update(update: ViewUpdate): void {\n if (update.selectionSet || update.docChanged || update.viewportChanged) {\n this.sync(update.view);\n }\n }\n\n private sync(view: EditorView): void {\n const armed = armedTable(view.state);\n // Root class lets the theme hide the parked caret — it would otherwise blink\n // on the blank line just past the table (table.to is a block boundary CM\n // paints below the widget), competing with the outline + green edge line.\n view.dom.classList.toggle(\"cm-table-arming\", armed !== null);\n for (const wrap of view.dom.querySelectorAll<HTMLElement>(\".cm-table-wrap\")) {\n const isArmed = armed !== null && Number(wrap.dataset.tableFrom) === armed.from;\n wrap.classList.toggle(\"cm-table-armed\", isArmed);\n if (armed && isArmed) wrap.dataset.armedEdge = armed.edge;\n else delete wrap.dataset.armedEdge;\n }\n }\n}\n\nexport const tableArmedHighlight = ViewPlugin.fromClass(TableArmedHighlighter);\n","/**\n * Backspace / Delete normalizer — spec section 8.2 and 8.3.\n *\n * Two invariants this enforces:\n *\n * 1. **Backspace deletes visible content first.** Hidden markdown\n * markers are never the unit of deletion in Rich Edit Mode.\n * So pressing backspace at the end of `**bold**` removes the\n * `d` (turning the source into `**bol**`), not the closing `**`.\n *\n * 2. **Empty styled spans collapse entirely.** If a backspace\n * would leave a span with no content (e.g. backspace inside\n * `**X**` where `X` is the only char), we delete the entire\n * construct — markers and all — instead of leaving dangling\n * `****` / `[]()` / ` `` ` behind.\n *\n * The same rules apply forward for Delete.\n *\n * Constructs we normalise:\n *\n * * `StrongEmphasis` (`**…**`)\n * * `Emphasis` (`*…*` / `_…_`)\n * * `InlineCode` (`` `…` ``)\n * * `Link` (`[…](…)`)\n * * `Strikethrough` (`~~…~~`)\n *\n * Each is identified by Lezer's node name; the content range is\n * `firstChild.to .. lastChild.from`.\n */\n\nimport { EditorSelection, Prec, type ChangeSpec } from \"@codemirror/state\";\nimport { type Command, EditorView, keymap } from \"@codemirror/view\";\n\nimport { fenceBackspaceGuard, fenceDeleteGuard } from \"../code/fenceDeleteGuards\";\nimport { lineStructure } from \"../core/lineStructure\";\nimport { setArmedTable } from \"../table/tableArmed\";\nimport { tableField } from \"../table/tableField\";\nimport { visibleCharAfter, visibleCharBefore } from \"./visiblePosition\";\nimport { treeAt } from \"../core/treeAt\";\n\n// Lezer's SyntaxNode type isn't directly exposed via @codemirror/language's\n// public types and `@lezer/common` is a transitive dep. The structural\n// shape we use is small enough to inline rather than pull a new direct\n// dependency just for the type.\ntype SyntaxNodeLike = {\n readonly name: string;\n readonly from: number;\n readonly to: number;\n readonly parent: SyntaxNodeLike | null;\n readonly firstChild: SyntaxNodeLike | null;\n readonly lastChild: SyntaxNodeLike | null;\n};\n\nconst COLLAPSIBLE_SPAN_NAMES = new Set([\n \"StrongEmphasis\",\n \"Emphasis\",\n \"InlineCode\",\n \"Link\",\n \"Strikethrough\",\n]);\n\n/**\n * Length of a line's leading **block** prefix — the list marker (`- `, `* `,\n * `1. `), ATX heading marker (`## `), and/or blockquote marker (`> `), including\n * nesting/indentation. Everything after is **inline** content (which may begin\n * with hidden inline markers like `**`). Used to line-join without eating inline\n * markers: backspacing at the visible start of `- **B**` deletes the newline +\n * `- ` but keeps `**B**`. Pure (operates on the line text) so it's unit-testable\n * without an `EditorView`.\n */\nexport function blockPrefixLength(lineText: string): number {\n const match = lineText.match(/^(?:\\s*(?:[-*+]|\\d+[.)])\\s+|#{1,6}\\s+|>\\s?)+/);\n return match ? match[0].length : 0;\n}\n\n/**\n * If the planned deletion `[from, to]` would empty (or already empties)\n * a collapsible styled span, return the span's full source range\n * (markers included). Otherwise return `null`.\n */\nfunction findCollapsibleSpan(\n view: EditorView,\n from: number,\n to: number,\n): { from: number; to: number } | null {\n const tree = treeAt(view.state, to);\n // Walk up from the deletion's left edge.\n let node: SyntaxNodeLike | null = tree.resolveInner(from, 1) as unknown as SyntaxNodeLike;\n while (node) {\n if (COLLAPSIBLE_SPAN_NAMES.has(node.name)) {\n const first = node.firstChild;\n const last = node.lastChild;\n if (first && last && first !== last) {\n const contentStart = first.to;\n const contentEnd = last.from;\n // Remaining content after deletion =\n // [contentStart, from) ∪ [to, contentEnd)\n // span collapses if both halves are empty.\n const leftKept = Math.max(0, from - contentStart);\n const rightKept = Math.max(0, contentEnd - to);\n if (leftKept === 0 && rightKept === 0) {\n return { from: node.from, to: node.to };\n }\n }\n // Stop at the first collapsible match — outer spans aren't\n // affected by inner-content deletes.\n break;\n }\n node = node.parent;\n }\n return null;\n}\n\nfunction applyDeletion(view: EditorView, from: number, to: number): boolean {\n if (from === to) return true;\n const span = findCollapsibleSpan(view, from, to);\n let changes: ChangeSpec;\n let caret: number;\n if (span) {\n changes = { from: span.from, to: span.to, insert: \"\" };\n caret = span.from;\n } else {\n changes = { from, to, insert: \"\" };\n caret = from;\n }\n view.dispatch({\n changes,\n selection: EditorSelection.cursor(caret),\n userEvent: from < view.state.selection.main.head ? \"delete.backward\" : \"delete.forward\",\n scrollIntoView: true,\n });\n return true;\n}\n\n/** The table whose source ends just before `pos` (only whitespace between), or\n * null — so Backspace can treat a table as one atomic block rather than edit\n * its hidden `| … |` source. */\nfunction tableBefore(view: EditorView, pos: number): { from: number; to: number } | null {\n let p = pos;\n while (p > 0 && /\\s/.test(view.state.doc.sliceString(p - 1, p))) p--;\n let found: { from: number; to: number } | null = null;\n view.state.field(tableField, false)?.between(p, p, (from, to) => {\n if (to === p) {\n found = { from, to };\n return false;\n }\n });\n return found;\n}\n\n/** The table whose source starts just after `pos` (only whitespace between). */\nfunction tableAfter(view: EditorView, pos: number): { from: number; to: number } | null {\n const docLen = view.state.doc.length;\n let p = pos;\n while (p < docLen && /\\s/.test(view.state.doc.sliceString(p, p + 1))) p++;\n let found: { from: number; to: number } | null = null;\n view.state.field(tableField, false)?.between(p, p, (from, to) => {\n if (from === p) {\n found = { from, to };\n return false;\n }\n });\n return found;\n}\n\n/**\n * Two-press table delete (Zettlr-style). When the caret reaches a table from\n * the line below/above, the first press parks the caret at the table's `edge`\n * — a visible caret sitting just past the table, NOT a selection — and the\n * second press (caret now AT that edge) removes the whole table. Never edits\n * the hidden `| … |` source.\n */\nfunction tableDeleteStep(\n view: EditorView,\n table: { from: number; to: number },\n pos: number,\n edge: number,\n): boolean {\n if (pos === edge) {\n return applyDeletion(view, table.from, table.to);\n }\n view.dispatch({\n selection: EditorSelection.cursor(edge),\n effects: setArmedTable.of({ from: table.from, edge: edge === table.to ? \"end\" : \"start\" }),\n userEvent: \"select\",\n scrollIntoView: true,\n });\n return true;\n}\n\nexport const visibleBackspace: Command = (view) => {\n const sel = view.state.selection.main;\n if (!sel.empty) {\n // Non-empty selection: delete it as a whole. Default backspace\n // works fine here; we explicitly mirror that to keep the userEvent\n // tagged consistently.\n return applyDeletion(view, sel.from, sel.to);\n }\n const pos = sel.head;\n if (pos === 0) return true;\n // A table just before the caret → park the caret at its end (first press); a\n // second press, caret now at that end, removes it. Never edits hidden source.\n const before = tableBefore(view, pos);\n if (before) return tableDeleteStep(view, before, pos, before.to);\n // The unit of deletion is the visible grapheme left of the caret — never a\n // hidden marker, and never marker + char folded together (the caret can rest\n // on either side of a hidden closing `**`; both must delete just the char).\n const ch = visibleCharBefore(view, pos);\n const line = view.state.doc.lineAt(pos);\n // §8.2a — nothing VISIBLE stands between the caret and the line's own\n // marker (the walked-back char ends at/inside the marker range, or there is\n // none at all) — wherever the caret sits among hidden ranges, I2. The\n // marker dies first: checkbox, bullet, number, or hashes are removed in\n // place and the line becomes plain text where it stands. Joining up is the\n // NEXT press.\n const structure = lineStructure(view.state, line);\n const lineMark = structure.list ?? structure.heading;\n if (lineMark && (!ch || ch.to <= lineMark.markTo)) {\n return applyDeletion(view, lineMark.markFrom, lineMark.markTo);\n }\n if (!ch) return true; // nothing visible before the caret (doc/line 1 start)\n // The previous visible char is on an earlier line. This is a line-join, not\n // an inline delete: delete only the preceding newline + this line's block\n // prefix (a quote's `> `), leaving inline content and its hidden leading\n // markers (`**B**`) intact. List/heading markers were §8.2a's press.\n if (ch.from < line.from && line.from > 0) {\n // Fence lines are structure: crossing one walls, parks, or collapses the\n // block instead of merging text into a fence (§12.1–.2).\n if (fenceBackspaceGuard(view, pos)) return true;\n const prefixLen = blockPrefixLength(view.state.doc.sliceString(line.from, line.to));\n return applyDeletion(view, line.from - 1, line.from + prefixLen);\n }\n return applyDeletion(view, ch.from, ch.to);\n};\n\nexport const visibleDeleteForward: Command = (view) => {\n const sel = view.state.selection.main;\n if (!sel.empty) {\n return applyDeletion(view, sel.from, sel.to);\n }\n const pos = sel.head;\n const docLen = view.state.doc.length;\n if (pos >= docLen) return true;\n // Mirror of Backspace: a table just after the caret → park the caret at its\n // start (first press), then a second press removes it.\n const after = tableAfter(view, pos);\n if (after) return tableDeleteStep(view, after, pos, after.from);\n // The unit of deletion is the visible grapheme right of the caret — from a\n // line start this skips a hidden opening `**` and deletes the first letter,\n // never carving `**C` out of `**Compose**`.\n const ch = visibleCharAfter(view, pos);\n if (!ch) return true; // nothing visible after the caret\n const line = view.state.doc.lineAt(pos);\n // Forward-join — the mirror of backspace's line-join. The next visible char\n // is on a later line; delete only the newline + the next line's block\n // prefix, keeping inline markers on both sides.\n if (ch.from >= line.to && line.to < docLen) {\n if (fenceDeleteGuard(view, pos)) return true;\n const next = view.state.doc.lineAt(line.to + 1);\n const prefixLen = blockPrefixLength(view.state.doc.sliceString(next.from, next.to));\n return applyDeletion(view, line.to, next.from + prefixLen);\n }\n return applyDeletion(view, ch.from, ch.to);\n};\n\nexport const deleteNormalizerKeymap = Prec.high(\n keymap.of([\n { key: \"Backspace\", run: visibleBackspace },\n { key: \"Delete\", run: visibleDeleteForward },\n ]),\n);\n","/**\n * Keep typed whitespace from dissolving emphasis (#94).\n *\n * CommonMark's flanking rules make a closing `**`/`*`/`~~` delimiter literal\n * when preceded by whitespace (and an opening one when followed by it). The\n * caret's resting position at a bold word's end is INSIDE the construct —\n * before the hidden closing marker — so typing a space there writes\n * `**Compose **`, the delimiters stop parsing, and the raw markers appear in\n * rich mode.\n *\n * Whitespace typed at a flanking-sensitive construct's content edge belongs\n * OUTSIDE its markers: `**Compose** ` / ` **Compose**`. This filter re-sites\n * such insertions; everything else passes through untouched. Inline code is\n * exempt — code spans have no flanking rule and edge spaces are meaningful.\n */\n\nimport { EditorSelection, EditorState, type Transaction } from \"@codemirror/state\";\nimport { treeAt } from \"../core/treeAt\";\n\nconst FLANKING_SENSITIVE = new Set([\"StrongEmphasis\", \"Emphasis\", \"Strikethrough\"]);\n\ntype NodeLike = {\n readonly name: string;\n readonly from: number;\n readonly to: number;\n readonly parent: NodeLike | null;\n readonly firstChild: NodeLike | null;\n readonly lastChild: NodeLike | null;\n};\n\n/** Where a whitespace insertion at `pos` must land so no construct's\n * delimiter is invalidated — hopping outward through nested constructs\n * (`***x***` needs two hops). Returns `pos` itself when it isn't at a\n * flanking-sensitive content edge. */\nfunction siteOutsideFlanking(state: EditorState, pos: number, side: \"end\" | \"start\"): number {\n for (;;) {\n // Re-acquired each hop: `pos` moves outward to an enclosing node's edge,\n // which can sit past what the previous round parsed.\n const tree = treeAt(state, pos);\n let node = tree.resolveInner(pos, side === \"end\" ? -1 : 1) as unknown as NodeLike | null;\n let moved = false;\n for (; node; node = node.parent) {\n if (!FLANKING_SENSITIVE.has(node.name)) continue;\n const mark = side === \"end\" ? node.lastChild : node.firstChild;\n const boundary = side === \"end\" ? mark?.from : mark?.to;\n if (boundary === pos) {\n pos = side === \"end\" ? node.to : node.from;\n moved = true;\n break;\n }\n }\n if (!moved) return pos;\n }\n}\n\nexport const flankingGuard = EditorState.transactionFilter.of((tr: Transaction) => {\n if (!tr.docChanged || !tr.isUserEvent(\"input.type\") || tr.isUserEvent(\"input.type.compose\")) {\n return tr;\n }\n // Exactly one pure insertion of whitespace — a keystroke, not a wrap/paste.\n let insertion: { from: number; text: string } | null = null;\n let eligible = true;\n tr.changes.iterChanges((fromA, toA, _fromB, _toB, inserted) => {\n if (insertion || fromA !== toA || !/^\\s+$/.test(inserted.toString())) eligible = false;\n else insertion = { from: fromA, text: inserted.toString() };\n });\n if (!eligible || !insertion) return tr;\n const { from, text } = insertion as { from: number; text: string };\n\n const end = siteOutsideFlanking(tr.startState, from, \"end\");\n const resited = end !== from ? end : siteOutsideFlanking(tr.startState, from, \"start\");\n if (resited === from) return tr;\n\n return {\n changes: { from: resited, insert: text },\n selection: EditorSelection.cursor(resited + text.length),\n userEvent: \"input.type\",\n scrollIntoView: true,\n };\n});\n","import { EditorSelection, Prec } from \"@codemirror/state\";\nimport { keymap, type Command } from \"@codemirror/view\";\n\nimport { lineStructure } from \"../core/lineStructure\";\nimport { treeAt } from \"../core/treeAt\";\n\n/**\n * Tight list continuation on Enter.\n *\n * `@codemirror/lang-markdown`'s stock `insertNewlineContinueMarkup` continues a\n * list when you press Enter, but for any list it considers \"non-tight\" (loose —\n * because a blank line crept in, or a paragraph lazily continues below the\n * list) it PREPENDS a blank line on every Enter. To the user that reads as the\n * caret \"skipping a line\": you wanted a new bullet on the very next line and\n * got a gap instead. People editing a rich bullet list expect Enter to always\n * drop the next bullet tight against the current one.\n *\n * This command handles two cases: Enter at the END of a NON-EMPTY, non-task\n * bullet/ordered item — inserting a plain `\\n<indent><marker> ` with no blank\n * line, always tight — and Enter at a TASK item's content start, splitting it\n * into an empty unchecked box above and the original item below (#95). Empty\n * items (exit-the-list), task continuation at line end, code blocks,\n * blockquotes, other mid-line splits, and every non-list case return `false`\n * and fall through to the stock markdown / default Enter handlers, so their\n * existing behavior is untouched. Bound at `Prec.highest` so it runs before\n * the markdown keymap's Enter.\n */\nexport const tightListContinuation: Command = (view) => {\n const { state } = view;\n const { main } = state.selection;\n if (!main.empty) return false;\n const line = state.doc.lineAt(main.head);\n\n // Task-item split at the content start (#95). The stock handler leaves the\n // remaining empty item spelled `- [ ]` — WITHOUT the trailing space — and\n // the grammar reads that as a bullet whose text is a literal `[ ]`, so the\n // checkbox markdown shows raw. Emit the split ourselves: the current line\n // keeps an empty UNCHECKED box (`- [ ] `, space intact), the text moves to\n // a new item that keeps the original marker and checked state.\n const info = lineStructure(state, line);\n if (\n info.list?.task &&\n !info.inCode &&\n main.head === info.list.markTo &&\n info.list.markTo < line.to\n ) {\n const mark = state.sliceDoc(info.list.markFrom, info.list.markTo);\n const indent = state.sliceDoc(line.from, info.list.markFrom);\n const insert = `${state.lineBreak}${indent}${mark}`;\n view.dispatch({\n changes: [\n // Same length as `mark` — the caret math below relies on that.\n { from: info.list.markFrom, to: info.list.markTo, insert: mark.replace(/\\[[xX]\\]/, \"[ ]\") },\n { from: main.head, insert },\n ],\n selection: EditorSelection.cursor(main.head + insert.length),\n scrollIntoView: true,\n userEvent: \"input\",\n });\n return true;\n }\n\n // Only when continuing from the very end of the line — not splitting mid-item.\n if (main.head !== line.to) return false;\n\n const match = /^(\\s*)([-*+]|\\d+[.)])\\s+(\\S.*)$/.exec(line.text);\n if (!match) return false; // empty item or not a list line → let the stock handler decide\n const [, indent, marker, content] = match;\n if (/^\\[[ xX]\\]/.test(content)) return false; // task item → stock handler keeps the checkbox\n\n // Confirm we're genuinely inside a list and NOT a code block (a `- x` line\n // inside a fenced block matches the regex but must not be auto-continued).\n let inList = false;\n const cursor = treeAt(state, main.head).resolveInner(main.head, -1).cursor();\n do {\n const name = cursor.name;\n if (name === \"ListItem\" || name === \"BulletList\" || name === \"OrderedList\") {\n inList = true;\n }\n if (/Code/.test(name)) return false;\n } while (cursor.parent());\n if (!inList) return false;\n\n const ordered = /^(\\d+)([.)])$/.exec(marker);\n const nextMarker = ordered ? `${parseInt(ordered[1], 10) + 1}${ordered[2]}` : marker;\n const insert = `${state.lineBreak}${indent}${nextMarker} `;\n view.dispatch({\n changes: { from: main.head, insert },\n selection: EditorSelection.cursor(main.head + insert.length),\n scrollIntoView: true,\n userEvent: \"input\",\n });\n return true;\n};\n\nexport const tightListKeymap = Prec.highest(\n keymap.of([{ key: \"Enter\", run: tightListContinuation }]),\n);\n","/**\n * List indent / outdent on Tab / Shift-Tab.\n *\n * Tab nests the current list item one level under its preceding sibling;\n * Shift-Tab promotes it one level. The step is the *parent's marker width*\n * (3 columns under `1. `, 2 under `- `), never a fixed unit — that's what lets\n * CommonMark parse the result as a real sublist; a naive two-space indent\n * mis-nests ordered items. A freshly nested ordered item is renumbered to `1`\n * so its sublist renders from one (the decoration plugin renumbers the rest by\n * position).\n *\n * Both commands are gated on the caret sitting in a list line, so anywhere else\n * — prose, a fenced code block — they return false and Tab keeps its normal\n * behaviour rather than hijacking focus or inserting a stray indent.\n */\n\nimport { type ChangeSpec, type EditorState, Prec } from \"@codemirror/state\";\nimport { type Command, EditorView, keymap } from \"@codemirror/view\";\nimport { treeAt } from \"../core/treeAt\";\n\ninterface ListMarker {\n /** Leading-space count. */\n indent: number;\n /** Marker plus its one trailing space: `- ` → 2, `12. ` → 4. */\n markerWidth: number;\n ordered: boolean;\n}\n\nconst LIST_LINE = /^(\\s*)([-*+] |\\d+[.)] )/;\n\nfunction listMarker(text: string): ListMarker | null {\n const m = LIST_LINE.exec(text);\n if (!m) return null;\n return { indent: m[1].length, markerWidth: m[2].length, ordered: /\\d/.test(m[2]) };\n}\n\n/** A list line, but not one that's actually inside a fenced code block. */\nfunction inListContext(state: EditorState, pos: number): boolean {\n if (!listMarker(state.doc.lineAt(pos).text)) return false;\n const cursor = treeAt(state, pos).resolveInner(pos, -1).cursor();\n do {\n if (/Code/.test(cursor.name)) return false;\n } while (cursor.parent());\n return true;\n}\n\n/** The preceding sibling to nest under, or null when this is the first item at\n * its level (nothing above to nest under) or the list breaks above. Blank\n * lines — a loose list — are stepped over. */\nfunction nestingParent(state: EditorState, lineNo: number, indent: number): ListMarker | null {\n for (let n = lineNo - 1; n >= 1; n--) {\n const text = state.doc.line(n).text;\n if (text.trim() === \"\") continue;\n const info = listMarker(text);\n if (!info) return null;\n if (info.indent === indent) return info;\n if (info.indent < indent) return null;\n }\n return null;\n}\n\n/** The nearest shallower list line; its indent is where an outdent lands. Null\n * → outdent all the way to column 0. */\nfunction outdentTarget(state: EditorState, lineNo: number, indent: number): ListMarker | null {\n for (let n = lineNo - 1; n >= 1; n--) {\n const text = state.doc.line(n).text;\n if (text.trim() === \"\") continue;\n const info = listMarker(text);\n if (!info) return null;\n if (info.indent < indent) return info;\n }\n return null;\n}\n\nfunction changeForLine(\n state: EditorState,\n lineNo: number,\n dir: \"indent\" | \"outdent\",\n): ChangeSpec | null {\n const line = state.doc.line(lineNo);\n const info = listMarker(line.text);\n if (!info) return null;\n\n if (dir === \"indent\") {\n const parent = nestingParent(state, lineNo, info.indent);\n if (!parent) return null; // first item at its level — can't nest\n const newIndent = parent.indent + parent.markerWidth;\n if (newIndent <= info.indent) return null;\n if (info.ordered) {\n // Rewrite the indent and the leading number together so the new sublist\n // starts at `1`; the plugin renumbers any siblings by position.\n const digits = /^\\d+/.exec(line.text.slice(info.indent))?.[0] ?? \"\";\n return {\n from: line.from,\n to: line.from + info.indent + digits.length,\n insert: \" \".repeat(newIndent) + \"1\",\n };\n }\n return { from: line.from, insert: \" \".repeat(newIndent - info.indent) };\n }\n\n if (info.indent === 0) return null; // top level — nothing to outdent\n const newIndent = outdentTarget(state, lineNo, info.indent)?.indent ?? 0;\n return { from: line.from, to: line.from + (info.indent - newIndent), insert: \"\" };\n}\n\nfunction changeListIndent(view: EditorView, dir: \"indent\" | \"outdent\"): boolean {\n const { state } = view;\n const range = state.selection.main;\n if (!inListContext(state, range.from)) return false;\n\n const changes: ChangeSpec[] = [];\n const firstLine = state.doc.lineAt(range.from).number;\n const lastLine = state.doc.lineAt(range.to).number;\n for (let n = firstLine; n <= lastLine; n++) {\n const change = changeForLine(state, n, dir);\n if (change) changes.push(change);\n }\n // Still consume Tab inside a list when nothing moves (first item, or top-level\n // outdent), so it never drops a literal tab into the list.\n if (changes.length === 0) return true;\n\n view.dispatch({\n changes,\n scrollIntoView: true,\n userEvent: dir === \"indent\" ? \"input.indent\" : \"delete.dedent\",\n });\n return true;\n}\n\nexport const indentListItem: Command = (view) => changeListIndent(view, \"indent\");\nexport const outdentListItem: Command = (view) => changeListIndent(view, \"outdent\");\n\nexport const listIndentKeymap = Prec.highest(\n keymap.of([\n { key: \"Tab\", run: indentListItem },\n { key: \"Shift-Tab\", run: outdentListItem },\n ]),\n);\n","/**\n * Formatting commands — spec section 9.\n *\n * Cmd/Ctrl + B → toggle bold (`**…**`)\n * Cmd/Ctrl + I → toggle italic (`*…*`)\n * Cmd/Ctrl + E → toggle inline code (`` `…` ``)\n *\n * Toggle, not insert: pressing Cmd+B with the caret already inside a\n * `StrongEmphasis` removes the bold, mirroring Tiptap / Pages / Word.\n *\n * Cmd+K (link popover) is Phase 2.8 — it needs a UI affordance and\n * is intentionally not bound here.\n *\n * These commands work uniformly on collapsed selections (where they\n * just insert the markers and place the caret between them) and on\n * non-collapsed selections (where they wrap the visible content).\n */\n\nimport { EditorSelection, Prec } from \"@codemirror/state\";\nimport { type Command, EditorView, keymap } from \"@codemirror/view\";\nimport { treeAt } from \"../core/treeAt\";\n\ntype SyntaxNodeLike = {\n readonly name: string;\n readonly from: number;\n readonly to: number;\n readonly parent: SyntaxNodeLike | null;\n};\n\ninterface FormatSpec {\n readonly markName: string; // Lezer node name for the wrapping construct\n readonly opener: string;\n readonly closer: string;\n /** CommonMark's flanking rules make emphasis delimiters literal when the\n * opener is followed — or the closer preceded — by whitespace: `**compose **`\n * is plain text, not bold. Specs with this flag wrap only the selection's\n * non-whitespace core, leaving edge spaces outside the markers (Word /\n * Pages / Obsidian behavior). Code spans have no flanking rule and may\n * meaningfully contain edge spaces, so they wrap verbatim. */\n readonly keepEdgeWhitespaceOutside: boolean;\n}\n\nconst FORMAT_BOLD: FormatSpec = {\n markName: \"StrongEmphasis\",\n opener: \"**\",\n closer: \"**\",\n keepEdgeWhitespaceOutside: true,\n};\nconst FORMAT_ITALIC: FormatSpec = {\n markName: \"Emphasis\",\n opener: \"*\",\n closer: \"*\",\n keepEdgeWhitespaceOutside: true,\n};\nconst FORMAT_CODE: FormatSpec = {\n markName: \"InlineCode\",\n opener: \"`\",\n closer: \"`\",\n keepEdgeWhitespaceOutside: false,\n};\n\nfunction nearestAncestor(\n view: EditorView,\n pos: number,\n name: string,\n): { from: number; to: number } | null {\n let node: SyntaxNodeLike | null = treeAt(view.state, pos).resolveInner(\n pos,\n 1,\n ) as unknown as SyntaxNodeLike;\n while (node) {\n if (node.name === name) return { from: node.from, to: node.to };\n node = node.parent;\n }\n return null;\n}\n\n/**\n * Delimiters + content for a code span, per CommonMark: the backtick fence\n * must be LONGER than any backtick run inside the content (`` `a`b` `` is\n * broken source), and content that starts or ends with a backtick needs one\n * space of padding — the renderer strips exactly one space from each side.\n */\nfunction codeSpanWrap(core: string): { fence: string; content: string } {\n const runs = core.match(/`+/g) ?? [];\n const longest = runs.reduce((max, run) => Math.max(max, run.length), 0);\n const fence = \"`\".repeat(longest + 1);\n const pad = core.startsWith(\"`\") || core.endsWith(\"`\") ? \" \" : \"\";\n return { fence, content: pad + core + pad };\n}\n\n/** Undo {@link codeSpanWrap}: measure the actual fence off the source (any\n * run length), then strip the one-space padding pair the grammar treats as\n * invisible. Null when the text isn't a well-formed span. */\nfunction codeSpanUnwrap(text: string): string | null {\n const fence = /^`+/.exec(text)?.[0];\n if (!fence || !text.endsWith(fence) || text.length < fence.length * 2) return null;\n let content = text.slice(fence.length, text.length - fence.length);\n if (content.startsWith(\" \") && content.endsWith(\" \") && content.trim() !== \"\") {\n content = content.slice(1, -1);\n }\n return content;\n}\n\nfunction makeToggleCommand(spec: FormatSpec): Command {\n return (view) => {\n const sel = view.state.selection.main;\n\n // Case 1: caret/selection sits inside an existing instance of this\n // construct → strip the markers (toggle off).\n const existing = nearestAncestor(view, sel.head, spec.markName);\n if (existing) {\n const { from, to } = existing;\n const text = view.state.sliceDoc(from, to);\n if (spec.markName === \"InlineCode\") {\n // Code spans carry variable-length fences + optional padding — undo\n // them off the actual source, not the spec's one-backtick default.\n const content = codeSpanUnwrap(text);\n if (content !== null) {\n view.dispatch({\n changes: { from, to, insert: content },\n selection: sel.empty\n ? EditorSelection.cursor(\n Math.min(Math.max(from, sel.head - 1), from + content.length),\n )\n : EditorSelection.range(from, from + content.length),\n userEvent: \"input.format.unwrap\",\n });\n return true;\n }\n }\n if (text.startsWith(spec.opener) && text.endsWith(spec.closer)) {\n const content = text.slice(spec.opener.length, text.length - spec.closer.length);\n const newSelFrom = from;\n const newSelTo = from + content.length;\n view.dispatch({\n changes: { from, to, insert: content },\n selection: sel.empty\n ? EditorSelection.cursor(Math.max(newSelFrom, sel.head - spec.opener.length))\n : EditorSelection.range(newSelFrom, newSelTo),\n userEvent: \"input.format.unwrap\",\n });\n return true;\n }\n }\n\n // Case 2: wrap. Collapsed selection inserts markers + places caret\n // between them; ranged selection wraps the content.\n if (sel.empty) {\n const insert = spec.opener + spec.closer;\n view.dispatch({\n changes: { from: sel.head, insert },\n selection: EditorSelection.cursor(sel.head + spec.opener.length),\n userEvent: \"input.format.wrap\",\n });\n return true;\n }\n const content = view.state.sliceDoc(sel.from, sel.to);\n // Shrink the wrap to the selection's non-whitespace core where the grammar\n // demands it — wrapping edge spaces would emit markdown the parser is\n // REQUIRED to treat as literal text (see keepEdgeWhitespaceOutside).\n const leading = spec.keepEdgeWhitespaceOutside\n ? content.length - content.trimStart().length\n : 0;\n const trailing = spec.keepEdgeWhitespaceOutside\n ? content.length - content.trimEnd().length\n : 0;\n const core = content.slice(leading, content.length - trailing);\n if (!core) {\n // Nothing but whitespace selected — no formatting to apply.\n return true;\n }\n const wrapFrom = sel.from + leading;\n const wrapTo = sel.to - trailing;\n // Code spans size their fence to the content (backticks inside need a\n // longer fence) — the other constructs use the spec's fixed markers.\n const { opener, inner } =\n spec.markName === \"InlineCode\"\n ? (() => {\n const { fence, content: padded } = codeSpanWrap(core);\n return { opener: fence, inner: padded };\n })()\n : { opener: spec.opener, inner: core };\n const wrapped = opener + inner + opener;\n view.dispatch({\n changes: { from: wrapFrom, to: wrapTo, insert: wrapped },\n selection: EditorSelection.range(\n wrapFrom + opener.length,\n wrapFrom + opener.length + inner.length,\n ),\n userEvent: \"input.format.wrap\",\n });\n return true;\n };\n}\n\nexport const formatCommands = {\n toggleBold: makeToggleCommand(FORMAT_BOLD),\n toggleItalic: makeToggleCommand(FORMAT_ITALIC),\n toggleInlineCode: makeToggleCommand(FORMAT_CODE),\n};\n\nexport const formatCommandsKeymap = Prec.high(\n keymap.of([\n { key: \"Mod-b\", run: formatCommands.toggleBold },\n { key: \"Mod-i\", run: formatCommands.toggleItalic },\n { key: \"Mod-e\", run: formatCommands.toggleInlineCode },\n ]),\n);\n","/**\n * Block-level commands — heading levels, bullet/ordered list, blockquote.\n *\n * Each command operates on the current line at the caret. Toggle\n * semantics: applying H2 to a line that's already H2 removes the\n * heading; applying H2 to a line that's H1 swaps the marker.\n *\n * These commands edit the **markdown source** at the line start.\n * Lezer reparses, decorations recompute, the heading / list / quote\n * appears rendered. No special rendering pipeline — the markers go\n * through the same hide-always treatment as user-typed markdown.\n *\n * Selection-aware: if a non-empty selection spans multiple lines,\n * the operation applies to every line. (Useful for bullet/quote.)\n */\n\nimport { EditorSelection, type ChangeSpec, type Line, Prec } from \"@codemirror/state\";\nimport { type Command, EditorView, keymap } from \"@codemirror/view\";\n\nimport { lineStructure, type LineStructure } from \"../core/lineStructure\";\n\nfunction eachLineInSelection(view: EditorView): Line[] {\n const lines: Line[] = [];\n const seen = new Set<number>();\n for (const range of view.state.selection.ranges) {\n let pos = range.from;\n while (pos <= range.to) {\n const line = view.state.doc.lineAt(pos);\n if (!seen.has(line.number)) {\n seen.add(line.number);\n lines.push(line);\n }\n if (line.to >= range.to) break;\n pos = line.to + 1;\n }\n }\n return lines;\n}\n\nfunction dispatchLineChanges(view: EditorView, changes: ChangeSpec[], userEvent: string): boolean {\n if (changes.length === 0) return true;\n const changeSet = view.state.changes(changes);\n // Map the selection with assoc +1 so the caret rides forward over a prepended\n // marker, staying with the user's text rather than stranding before it.\n view.dispatch({ changes: changeSet, selection: view.state.selection.map(changeSet, 1), userEvent });\n return true;\n}\n\n// Heading, bullet, and ordered are mutually-exclusive line types: setting one\n// replaces any other already on the line (so `- x` → heading is `## x`, not\n// `## - x`). Blockquote and code are containers — they compose — so they're not\n// part of this set. Line classification comes from the SYNTAX TREE\n// (lineStructure, #61): a `- x` inside a code fence is code, not a bullet, and\n// a nested ` - x` is a bullet even though its marker isn't at column 0.\n\n/** The selected lines the structure commands may touch, each with what the\n * grammar says it is. Code lines are excluded wholesale — a formatting toolbar\n * must never rewrite code. */\nfunction structuredLines(view: EditorView): { line: Line; info: LineStructure }[] {\n return eachLineInSelection(view)\n .map((line) => ({ line, info: lineStructure(view.state, line) }))\n .filter(({ info }) => !info.inCode);\n}\n\n/** Replace this line's current type marker (heading or list, whichever the\n * tree found) with `marker`, or insert `marker` at the content start — so\n * nested/indented lines keep their indentation. */\nfunction swapLineMarker({ info }: { info: LineStructure }, marker: string): ChangeSpec {\n const existing = info.heading ?? info.list;\n return existing\n ? { from: existing.markFrom, to: existing.markTo, insert: marker }\n : { from: info.contentFrom, insert: marker };\n}\n\n/* -------- Heading -------- */\n\nfunction makeToggleHeading(level: 1 | 2 | 3 | 4 | 5 | 6): Command {\n const marker = `${\"#\".repeat(level)} `;\n return (view) => {\n const changes: ChangeSpec[] = [];\n for (const entry of structuredLines(view)) {\n const { info } = entry;\n if (info.heading && info.heading.level === level) {\n // Already this level → back to a paragraph.\n changes.push({ from: info.heading.markFrom, to: info.heading.markTo, insert: \"\" });\n } else {\n changes.push(swapLineMarker(entry, marker));\n }\n }\n return dispatchLineChanges(view, changes, \"input.format.heading\");\n };\n}\n\n/* -------- Bullet list -------- */\n\n// All-or-nothing toggle: strip the list only when *every* selected line is\n// already a bullet, otherwise make them all bullets (converting ordered items\n// and leaving existing bullets be). A per-line toggle would make a mixed\n// selection more inconsistent — un-bulleting some lines while bulleting others.\nconst toggleBulletList: Command = (view) => {\n const entries = structuredLines(view);\n const allBullets =\n entries.length > 0 && entries.every(({ info }) => info.list?.kind === \"bullet\");\n const changes: ChangeSpec[] = [];\n for (const entry of entries) {\n const { info } = entry;\n if (allBullets) {\n changes.push({ from: info.list!.markFrom, to: info.list!.markTo, insert: \"\" });\n } else if (info.list?.kind !== \"bullet\") {\n changes.push(swapLineMarker(entry, \"- \"));\n }\n }\n return dispatchLineChanges(view, changes, \"input.format.list\");\n};\n\n/* -------- Ordered list -------- */\n\n// All-or-nothing toggle (see bullets). When making the selection ordered, every\n// line is (re)numbered from 1 so a mixed or mis-numbered selection comes out\n// sequential.\nconst toggleOrderedList: Command = (view) => {\n const entries = structuredLines(view);\n const allOrdered =\n entries.length > 0 && entries.every(({ info }) => info.list?.kind === \"ordered\");\n const changes: ChangeSpec[] = [];\n let counter = 0;\n for (const entry of entries) {\n const { info } = entry;\n if (allOrdered) {\n changes.push({ from: info.list!.markFrom, to: info.list!.markTo, insert: \"\" });\n } else {\n counter += 1;\n changes.push(swapLineMarker(entry, `${counter}. `));\n }\n }\n return dispatchLineChanges(view, changes, \"input.format.list\");\n};\n\n/* -------- Task list -------- */\n\n// All-or-nothing toggle: strip the checkbox prefix only when every selected line\n// is already a task, otherwise make them all tasks (replacing any other line\n// marker; a plain line or other list item gains a `- [ ] `).\nconst toggleTaskList: Command = (view) => {\n const entries = structuredLines(view);\n const allTasks = entries.length > 0 && entries.every(({ info }) => info.list?.task);\n const changes: ChangeSpec[] = [];\n for (const entry of entries) {\n const { info } = entry;\n if (allTasks) {\n changes.push({ from: info.list!.markFrom, to: info.list!.markTo, insert: \"\" });\n } else if (!info.list?.task) {\n changes.push(swapLineMarker(entry, \"- [ ] \"));\n }\n }\n return dispatchLineChanges(view, changes, \"input.format.task\");\n};\n\n/* -------- Blockquote -------- */\n\n// Per-line (not all-or-nothing): quotes are containers, so each line\n// independently gains a level or sheds its outermost one.\nconst toggleBlockquote: Command = (view) => {\n const changes: ChangeSpec[] = [];\n for (const { info } of structuredLines(view)) {\n changes.push(\n info.quote\n ? { from: info.quote.markFrom, to: info.quote.markTo, insert: \"\" }\n : { from: info.contentFrom, insert: \"> \" },\n );\n }\n return dispatchLineChanges(view, changes, \"input.format.blockquote\");\n};\n\n/* -------- Code block (toggle fenced block around selection) -------- */\n\nconst toggleCodeBlock: Command = (view) => {\n const sel = view.state.selection.main;\n // Toggle a fence around the current/selection lines.\n const firstLine = view.state.doc.lineAt(sel.from);\n const lastLine = view.state.doc.lineAt(sel.to);\n // Detect if both fences already exist (line before firstLine starts\n // with ``` and line after lastLine starts with ```).\n const above = firstLine.number > 1 ? view.state.doc.line(firstLine.number - 1) : null;\n const below = lastLine.number < view.state.doc.lines ? view.state.doc.line(lastLine.number + 1) : null;\n if (above && /^```/.test(above.text) && below && /^```/.test(below.text)) {\n // Strip both fences\n view.dispatch({\n changes: [\n { from: above.from, to: above.to + 1, insert: \"\" },\n { from: below.from - 1, to: below.to, insert: \"\" },\n ],\n userEvent: \"input.format.code-block\",\n });\n return true;\n }\n // Wrap selection in fences. The fence must be LONGER than any backtick run\n // inside the wrapped content — wrapping text that itself contains ``` with a\n // ``` fence would close the block early and spill the rest as prose.\n const inner = view.state.sliceDoc(firstLine.from, lastLine.to);\n const longestRun = (inner.match(/`+/g) ?? []).reduce((max, run) => Math.max(max, run.length), 0);\n const fence = \"`\".repeat(Math.max(3, longestRun + 1));\n view.dispatch({\n changes: [\n { from: firstLine.from, insert: `${fence}\\n` },\n { from: lastLine.to, insert: `\\n${fence}` },\n ],\n selection: EditorSelection.cursor(firstLine.from + fence.length + 1),\n userEvent: \"input.format.code-block\",\n });\n return true;\n};\n\n/* -------- Insert table (GFM 2×2 skeleton) -------- */\n\nconst TABLE_SKELETON = \"| Header | Header |\\n| --- | --- |\\n| Cell | Cell |\";\n// Offset from the table's start to the first header cell's content, so the\n// caret lands ready to type the first column header (\"| \" → 2 chars in).\nconst FIRST_CELL_OFFSET = 2;\n\n// GFM requires a blank line before a table for it to parse as one. Insert the\n// skeleton on its own block: in place when the caret sits on a blank line,\n// otherwise pushed below the current line with a separating blank line.\nconst insertTable: Command = (view) => {\n const sel = view.state.selection.main;\n const line = view.state.doc.lineAt(sel.from);\n const onBlankLine = line.text.trim().length === 0;\n\n const prefix = onBlankLine ? \"\" : \"\\n\\n\";\n const from = onBlankLine ? line.from : line.to;\n const to = line.to;\n const caret = from + prefix.length + FIRST_CELL_OFFSET;\n\n view.dispatch({\n changes: { from, to, insert: `${prefix}${TABLE_SKELETON}` },\n selection: EditorSelection.range(caret, caret + \"Header\".length),\n userEvent: \"input.format.table\",\n });\n return true;\n};\n\nexport const blockCommands = {\n toggleHeading1: makeToggleHeading(1),\n toggleHeading2: makeToggleHeading(2),\n toggleHeading3: makeToggleHeading(3),\n toggleBulletList,\n toggleOrderedList,\n toggleTaskList,\n toggleBlockquote,\n toggleCodeBlock,\n insertTable,\n};\n\nexport const blockCommandsKeymap = Prec.high(\n keymap.of([\n { key: \"Mod-1\", run: blockCommands.toggleHeading1 },\n { key: \"Mod-2\", run: blockCommands.toggleHeading2 },\n { key: \"Mod-3\", run: blockCommands.toggleHeading3 },\n { key: \"Mod-Shift-7\", run: blockCommands.toggleOrderedList },\n { key: \"Mod-Shift-8\", run: blockCommands.toggleBulletList },\n { key: \"Mod-Shift-9\", run: blockCommands.toggleBlockquote },\n ]),\n);\n","/**\n * Image insertion handlers for CM6 — paste image bytes from the\n * clipboard or drop image files into the editor, save them through\n * the existing `insertImageBlob` pipeline, then insert the\n * resulting `` markdown at the caret.\n *\n * Same pipeline the Tiptap editor uses; the editor surface differs\n * but the persistence + markdown-reference logic is shared.\n */\n\nimport { EditorSelection } from \"@codemirror/state\";\nimport { EditorView } from \"@codemirror/view\";\n\nimport {\n buildImageMarkdown,\n extractImageBlobs,\n extractImageFiles,\n insertImageBlob,\n} from \"../../imageInsert\";\nimport { saveImageBytesFacet } from \"../core/hostFacets\";\n\nexport async function insertBlobsAtCaret(view: EditorView, blobs: Blob[]): Promise<void> {\n const saveBytes = view.state.facet(saveImageBytesFacet);\n for (const blob of blobs) {\n try {\n const result = await insertImageBlob({ blob, saveBytes });\n const md = buildImageMarkdown(result);\n const pos = view.state.selection.main.head;\n const insert = md + \"\\n\\n\";\n view.dispatch({\n changes: { from: pos, insert },\n selection: EditorSelection.cursor(pos + insert.length),\n userEvent: \"input.paste.image\",\n });\n if (result.warning) {\n // Browser-dev fallback to data URL — surface via console so\n // the user knows the markdown bloated.\n // eslint-disable-next-line no-console\n console.info(`Image inserted with fallback: ${result.warning}`);\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\"Failed to insert image:\", error);\n }\n }\n}\n\nexport const imageInsertHandlers = EditorView.domEventHandlers({\n paste(event, view) {\n const blobs = extractImageBlobs(event.clipboardData?.items);\n if (blobs.length === 0) return false;\n event.preventDefault();\n void insertBlobsAtCaret(view, blobs);\n return true;\n },\n drop(event, view) {\n const files = extractImageFiles(event.dataTransfer?.files);\n if (files.length === 0) return false;\n event.preventDefault();\n void insertBlobsAtCaret(view, files);\n return true;\n },\n});\n\n/**\n * Open the browser's native file picker, then run the picked files\n * through the same insert pipeline. Called by the toolbar's Image\n * button.\n */\nexport function pickImageFileForCaret(view: EditorView): void {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n input.multiple = true;\n input.onchange = () => {\n const files = input.files ? Array.from(input.files) : [];\n if (files.length > 0) void insertBlobsAtCaret(view, files);\n };\n input.click();\n}\n","import { type Extension } from \"@codemirror/state\";\nimport { keymap as cmKeymap } from \"@codemirror/view\";\n\nimport { nodeRulesFacet } from \"../core\";\nimport { type MarkdownExtension, type ToolbarContribution } from \"./types\";\n\nexport interface ComposedExtension {\n extensions: Extension[];\n toolbar: ToolbarContribution[];\n}\n\nexport function composeExtensions(modules: readonly MarkdownExtension[]): ComposedExtension {\n const extensions: Extension[] = [];\n const toolbar: ToolbarContribution[] = [];\n const allKeyBindings: import(\"@codemirror/view\").KeyBinding[] = [];\n const seenRuleNames = new Set<string>();\n\n for (const mod of modules) {\n if (mod.extensions?.length) extensions.push(...mod.extensions);\n if (mod.keymap?.length) allKeyBindings.push(...mod.keymap);\n if (mod.toolbar?.length) toolbar.push(...mod.toolbar);\n if (mod.rules) {\n // An extension's node rules feed the decoration painter through the\n // facet — introducing (or deliberately overriding) a construct never\n // touches the base table.\n extensions.push(nodeRulesFacet.of(mod.rules));\n for (const name of Object.keys(mod.rules)) {\n if (seenRuleNames.has(name)) {\n // eslint-disable-next-line no-console\n console.warn(\n `MarkdownExtension \"${mod.name}\" overrides node rule \"${name}\" already provided by another extension.`,\n );\n }\n seenRuleNames.add(name);\n }\n }\n }\n\n if (allKeyBindings.length) extensions.push(cmKeymap.of(allKeyBindings));\n\n return { extensions, toolbar };\n}\n","import { type Range } from \"@codemirror/state\";\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type PluginValue,\n type ViewUpdate,\n} from \"@codemirror/view\";\n\nimport { inCode, viewportTree } from \"../core/codeContext\";\n\nconst HIGHLIGHT_RE = /==([^=\\n]+?)==/g;\nconst HIDE = Decoration.replace({});\nconst highlightMark = Decoration.mark({ class: \"cm-highlight\" });\n\nfunction buildDecorations(view: EditorView): { decorations: DecorationSet; atomic: DecorationSet } {\n const marks: Range<Decoration>[] = [];\n const atomic: Range<Decoration>[] = [];\n const tree = viewportTree(view);\n\n for (const { from, to } of view.visibleRanges) {\n const text = view.state.sliceDoc(from, to);\n HIGHLIGHT_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = HIGHLIGHT_RE.exec(text)) !== null) {\n const matchStart = from + match.index;\n const matchEnd = matchStart + match[0].length;\n if (inCode(tree, matchStart) || inCode(tree, matchEnd - 2)) continue;\n const innerStart = matchStart + 2;\n const innerEnd = matchEnd - 2;\n if (innerEnd <= innerStart) continue;\n\n marks.push(HIDE.range(matchStart, innerStart));\n atomic.push(HIDE.range(matchStart, innerStart));\n marks.push(highlightMark.range(innerStart, innerEnd));\n marks.push(HIDE.range(innerEnd, matchEnd));\n atomic.push(HIDE.range(innerEnd, matchEnd));\n }\n }\n\n return {\n decorations: Decoration.set(marks, true),\n atomic: Decoration.set(atomic, true),\n };\n}\n\nexport const highlightPlugin = ViewPlugin.fromClass(\n class implements PluginValue {\n decorations: DecorationSet;\n atomic: DecorationSet;\n constructor(view: EditorView) {\n const built = buildDecorations(view);\n this.decorations = built.decorations;\n this.atomic = built.atomic;\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n const built = buildDecorations(update.view);\n this.decorations = built.decorations;\n this.atomic = built.atomic;\n }\n }\n },\n {\n decorations: (v) => v.decorations,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomic ?? Decoration.none),\n },\n);\n","import { highlightPlugin } from \"../highlight\";\n\nimport { type MarkdownExtension } from \"./types\";\n\nexport const highlightExtension: MarkdownExtension = {\n name: \"@compose/highlight\",\n version: \"0.1.0\",\n description: \"Renders `==text==` with a yellow highlight background.\",\n extensions: [highlightPlugin],\n};\n","import { type Range } from \"@codemirror/state\";\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type PluginValue,\n type ViewUpdate,\n} from \"@codemirror/view\";\n\nimport { inCode, viewportTree } from \"../core/codeContext\";\n\nconst FOOTNOTE_REF_RE = /(?<!\\])\\[\\^([^\\]\\s]+)\\](?!:)/g;\nconst FOOTNOTE_DEF_LINE_RE = /^\\[\\^([^\\]\\s]+)\\]:\\s/;\n\nconst refLabelMark = Decoration.mark({ class: \"cm-footnote-ref\" });\nconst refHide = Decoration.replace({});\nconst defLineDeco = Decoration.line({ class: \"cm-footnote-def\" });\n\nfunction buildDecorations(view: EditorView): { decorations: DecorationSet; atomic: DecorationSet } {\n const lineDecs: Range<Decoration>[] = [];\n const markDecs: Range<Decoration>[] = [];\n const atomic: Range<Decoration>[] = [];\n const tree = viewportTree(view);\n\n for (const { from, to } of view.visibleRanges) {\n let lineNum = view.state.doc.lineAt(from).number;\n const lastLineNum = view.state.doc.lineAt(to).number;\n while (lineNum <= lastLineNum) {\n const line = view.state.doc.line(lineNum);\n\n if (FOOTNOTE_DEF_LINE_RE.test(line.text) && !inCode(tree, line.from)) {\n lineDecs.push(defLineDeco.range(line.from));\n } else {\n FOOTNOTE_REF_RE.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = FOOTNOTE_REF_RE.exec(line.text)) !== null) {\n const matchStart = line.from + m.index;\n const matchEnd = matchStart + m[0].length;\n if (inCode(tree, matchStart) || inCode(tree, matchEnd - 1)) continue;\n const labelStart = matchStart + 2;\n const labelEnd = matchEnd - 1;\n if (labelEnd <= labelStart) continue;\n\n markDecs.push(refHide.range(matchStart, labelStart));\n atomic.push(refHide.range(matchStart, labelStart));\n markDecs.push(refLabelMark.range(labelStart, labelEnd));\n markDecs.push(refHide.range(labelEnd, matchEnd));\n atomic.push(refHide.range(labelEnd, matchEnd));\n }\n }\n\n lineNum += 1;\n }\n }\n\n return {\n decorations: Decoration.set(lineDecs.concat(markDecs), true),\n atomic: Decoration.set(atomic, true),\n };\n}\n\nexport const footnotePlugin = ViewPlugin.fromClass(\n class implements PluginValue {\n decorations: DecorationSet;\n atomic: DecorationSet;\n constructor(view: EditorView) {\n const built = buildDecorations(view);\n this.decorations = built.decorations;\n this.atomic = built.atomic;\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n const built = buildDecorations(update.view);\n this.decorations = built.decorations;\n this.atomic = built.atomic;\n }\n }\n },\n {\n decorations: (v) => v.decorations,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomic ?? Decoration.none),\n },\n);\n","import { footnotePlugin } from \"../footnote\";\n\nimport { type MarkdownExtension } from \"./types\";\n\nexport const footnoteExtension: MarkdownExtension = {\n name: \"@compose/footnote\",\n version: \"0.1.0\",\n description: \"Renders `[^id]` references and `[^id]:` definitions with tooltip jump.\",\n extensions: [footnotePlugin],\n};\n","import katex from \"katex\";\nimport { EditorView, WidgetType } from \"@codemirror/view\";\n\nexport class MathWidget extends WidgetType {\n constructor(\n readonly tex: string,\n readonly displayMode: boolean,\n ) {\n super();\n }\n\n override eq(other: MathWidget): boolean {\n return other.tex === this.tex && other.displayMode === this.displayMode;\n }\n\n override toDOM(_view: EditorView): HTMLElement {\n const span = document.createElement(this.displayMode ? \"div\" : \"span\");\n span.className = this.displayMode ? \"cm-math-block\" : \"cm-math-inline\";\n try {\n katex.render(this.tex, span, {\n displayMode: this.displayMode,\n throwOnError: false,\n output: \"html\",\n });\n } catch {\n span.textContent = this.tex;\n }\n return span;\n }\n\n override ignoreEvent(): boolean {\n return false;\n }\n}\n","import { type EditorState, type Range, StateField } from \"@codemirror/state\";\nimport { Decoration, type DecorationSet, EditorView } from \"@codemirror/view\";\n\nimport { docTree, inCode } from \"../core/codeContext\";\nimport { MathWidget } from \"./mathWidget\";\n\nconst INLINE_MATH_RE = /(?<![\\\\$])\\$(?!\\s)([^\\n$]+?)(?<!\\s)\\$(?!\\d)/g;\n\nfunction computeDecorations(state: EditorState): { decorations: DecorationSet; atomic: DecorationSet } {\n const marks: Range<Decoration>[] = [];\n const atomic: Range<Decoration>[] = [];\n const doc = state.doc;\n const totalLines = doc.lines;\n const tree = docTree(state);\n // A `$$` line delimits a block only in prose — inside a code block it is\n // literal text, neither an opener nor a closer.\n const blockMarkAt = (num: number): boolean => {\n const line = doc.line(num);\n return line.text.trim() === \"$$\" && !inCode(tree, line.from + line.text.indexOf(\"$\"));\n };\n\n let lineNum = 1;\n while (lineNum <= totalLines) {\n const line = doc.line(lineNum);\n const text = line.text;\n\n // Single-line block: `$$ … $$` on one line.\n const single = text.match(/^\\$\\$(.+)\\$\\$\\s*$/);\n if (single && !inCode(tree, line.from)) {\n const replace = Decoration.replace({ widget: new MathWidget(single[1], true) });\n marks.push(replace.range(line.from, line.to));\n atomic.push(replace.range(line.from, line.to));\n lineNum += 1;\n continue;\n }\n\n // Multi-line block: a lone `$$` opens it; scan to the next lone `$$`. This\n // span crosses line breaks, so it must be a `block: true` replacement and\n // is delivered via a StateField — CM6 forbids both a plugin-supplied and a\n // non-block replace from covering a line break, and a real layout engine\n // renders such a span as raw source rather than the widget.\n if (blockMarkAt(lineNum)) {\n let close = lineNum + 1;\n while (close <= totalLines && !blockMarkAt(close)) {\n close += 1;\n }\n if (close <= totalLines) {\n const closeLine = doc.line(close);\n const tex = doc.sliceString(line.to, closeLine.from).trim();\n const replace = Decoration.replace({ widget: new MathWidget(tex, true), block: true });\n marks.push(replace.range(line.from, closeLine.to));\n atomic.push(replace.range(line.from, closeLine.to));\n lineNum = close + 1;\n continue;\n }\n }\n\n // Inline `$ … $`.\n INLINE_MATH_RE.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = INLINE_MATH_RE.exec(text)) !== null) {\n const matchStart = line.from + m.index;\n const matchEnd = matchStart + m[0].length;\n if (inCode(tree, matchStart) || inCode(tree, matchEnd - 1)) continue;\n const replace = Decoration.replace({ widget: new MathWidget(m[1], false) });\n marks.push(replace.range(matchStart, matchEnd));\n atomic.push(replace.range(matchStart, matchEnd));\n }\n lineNum += 1;\n }\n\n return {\n decorations: Decoration.set(marks, true),\n atomic: Decoration.set(atomic, true),\n };\n}\n\nexport const mathPlugin = StateField.define<{ decorations: DecorationSet; atomic: DecorationSet }>({\n create: (state) => computeDecorations(state),\n update: (value, tr) => (tr.docChanged ? computeDecorations(tr.state) : value),\n provide: (field) => [\n EditorView.decorations.from(field, (value) => value.decorations),\n EditorView.atomicRanges.of((view) => view.state.field(field, false)?.atomic ?? Decoration.none),\n ],\n});\n","import { mathPlugin } from \"../math\";\n\nimport { type MarkdownExtension } from \"./types\";\n\nexport const mathExtension: MarkdownExtension = {\n name: \"@compose/math\",\n version: \"0.1.0\",\n description: \"Renders `$x$` inline and `$$x$$` block math via KaTeX.\",\n extensions: [mathPlugin],\n};\n","import { mermaidField } from \"../mermaid\";\n\nimport { type MarkdownExtension } from \"./types\";\n\nexport const mermaidExtension: MarkdownExtension = {\n name: \"@compose/mermaid\",\n version: \"0.1.0\",\n description:\n \"Renders closed ```mermaid fences as diagrams; click a diagram to edit its source.\",\n extensions: [mermaidField],\n};\n","import { type EditorState } from \"@codemirror/state\";\n\nimport { parseTableNode, type TableModel } from \"./tableModel\";\nimport { treeAt } from \"../core/treeAt\";\n\n/**\n * Position → table geometry: which table a document offset falls in, and the\n * pipe boundaries / column index of a cell. Shared by the structural edit\n * commands and the row/column excerpt builder — both reason about a table from a\n * cell position, so the geometry lives apart from either's specific job.\n */\n\n/** Minimal Lezer node shape — `parseTableNode`'s, plus `parent` for walking up. */\nexport type LezerNode = {\n readonly name: string;\n readonly from: number;\n readonly to: number;\n readonly firstChild: LezerNode | null;\n readonly nextSibling: LezerNode | null;\n readonly parent: LezerNode | null;\n};\n\n/**\n * The table model whose source range encloses `pos`, or null. Resolves the\n * enclosing `Table` node, then — since Lezer merges blank-line-less tables into\n * one node — picks the back-to-back sub-table that actually contains `pos`.\n */\nexport function modelAt(state: EditorState, pos: number): TableModel | null {\n // side +1: at a boundary, resolve the node that STARTS at `pos` (the table),\n // not the gap before it — so the table's own `from` (used for keyboard entry\n // and cell navigation) still finds it. Inside a cell this is unchanged.\n let node = treeAt(state, pos).resolveInner(pos, 1) as unknown as LezerNode | null;\n while (node && node.name !== \"Table\") node = node.parent;\n if (!node) return null;\n return parseTableNode(state, node).find((m) => pos >= m.from && pos <= m.to) ?? null;\n}\n\n/** Absolute positions of the unescaped `|` pipes in `line`. */\nexport function pipes(state: EditorState, line: { from: number; to: number }): number[] {\n const text = state.doc.sliceString(line.from, line.to);\n const out: number[] = [];\n for (let i = 0; i < text.length; i++) {\n if (text[i] === \"|\" && text[i - 1] !== \"\\\\\") out.push(line.from + i);\n }\n return out;\n}\n\n/** The 0-based column `pos` sits in — the cell after the last pipe before it. */\nexport function columnAt(state: EditorState, pos: number): number {\n const line = state.doc.lineAt(pos);\n const before = pipes(state, line).filter((p) => p < pos).length;\n return Math.max(0, before - 1);\n}\n","import { type ChangeSpec, type EditorState } from \"@codemirror/state\";\n\nimport { type TableModel } from \"./tableModel\";\nimport { columnAt, modelAt, pipes } from \"./tableGeometry\";\n\n/**\n * Structural table edits — add/remove rows (columns land next) — as pure\n * `ChangeSpec` builders computed from the Lezer tree, never from the rendered\n * DOM. Each takes the document position the action targets (a cell the cursor or\n * a control sits in) and returns the change, or null when `pos` isn't in a table.\n * The rebuilt table widget re-renders from the new source, so there's nothing to\n * keep in sync.\n */\n\n/** An empty body row with `columns` cells: `| | | … |`. */\nfunction emptyRow(columns: number): string {\n return \"|\" + \" |\".repeat(columns);\n}\n\n/** The header + delimiter lines of `model` (the delimiter is the line after the\n * header). */\nfunction frame(state: EditorState, model: TableModel) {\n const header = state.doc.lineAt(model.from);\n return { header, delimiter: state.doc.lineAt(header.to + 1) };\n}\n\n/**\n * Insert an empty row below the row at `pos`. From the header or delimiter the\n * new row becomes the first body row (right after the delimiter).\n */\nexport function addRowBelow(state: EditorState, pos: number): ChangeSpec | null {\n const model = modelAt(state, pos);\n if (!model) return null;\n const { delimiter } = frame(state, model);\n const current = state.doc.lineAt(pos);\n const after = current.from <= delimiter.from ? delimiter : current;\n return { from: after.to, insert: \"\\n\" + emptyRow(model.data.header.length) };\n}\n\n/**\n * Insert an empty row above the body row at `pos`. From the header or delimiter\n * it inserts as the first body row.\n */\nexport function addRowAbove(state: EditorState, pos: number): ChangeSpec | null {\n const model = modelAt(state, pos);\n if (!model) return null;\n const { delimiter } = frame(state, model);\n const current = state.doc.lineAt(pos);\n const row = emptyRow(model.data.header.length);\n if (current.from <= delimiter.from) {\n return { from: delimiter.to, insert: \"\\n\" + row };\n }\n return { from: current.from, insert: row + \"\\n\" };\n}\n\n/**\n * Delete the body row at `pos`. A no-op on the header or delimiter (those define\n * the table); deleting the last body row is allowed and leaves an empty-bodied\n * table.\n */\nexport function deleteRow(state: EditorState, pos: number): ChangeSpec | null {\n const model = modelAt(state, pos);\n if (!model) return null;\n const { delimiter } = frame(state, model);\n const current = state.doc.lineAt(pos);\n if (current.from <= delimiter.from) return null;\n // Take the line and the newline that precedes it, joining its neighbours.\n return { from: current.from - 1, to: current.to };\n}\n\n/**\n * Insert an empty column at the pipe boundary `offset` past the cursor's column\n * (1 = to its right, 0 = to its left), in every row. The delimiter row gets a\n * `---` cell, content rows an empty one.\n */\nfunction insertColumn(state: EditorState, pos: number, offset: 0 | 1): ChangeSpec | null {\n const model = modelAt(state, pos);\n if (!model) return null;\n const boundary = columnAt(state, pos) + offset;\n const start = state.doc.lineAt(model.from).number;\n const end = state.doc.lineAt(model.to).number;\n const changes: ChangeSpec[] = [];\n for (let n = start; n <= end; n++) {\n const line = state.doc.line(n);\n const p = pipes(state, line);\n if (boundary < p.length) {\n changes.push({ from: p[boundary] + 1, insert: n === start + 1 ? \" --- |\" : \" |\" });\n }\n }\n return changes.length ? changes : null;\n}\n\n/** Insert an empty column to the right of the cursor's column. */\nexport function addColumnAfter(state: EditorState, pos: number): ChangeSpec | null {\n return insertColumn(state, pos, 1);\n}\n\n/** Insert an empty column to the left of the cursor's column. */\nexport function addColumnBefore(state: EditorState, pos: number): ChangeSpec | null {\n return insertColumn(state, pos, 0);\n}\n\n/** Delete the cursor's column from every row. No-op on a single-column table. */\nexport function deleteColumn(state: EditorState, pos: number): ChangeSpec | null {\n const model = modelAt(state, pos);\n if (!model || model.data.header.length <= 1) return null;\n const col = columnAt(state, pos);\n const start = state.doc.lineAt(model.from).number;\n const end = state.doc.lineAt(model.to).number;\n const changes: ChangeSpec[] = [];\n for (let n = start; n <= end; n++) {\n const p = pipes(state, state.doc.line(n));\n if (col + 1 < p.length) changes.push({ from: p[col], to: p[col + 1] });\n }\n return changes.length ? changes : null;\n}\n\n/** Remove the whole table at `pos` (its source lines and the line break after\n * them); the surrounding prose is untouched. */\nexport function deleteTable(state: EditorState, pos: number): ChangeSpec | null {\n const model = modelAt(state, pos);\n if (!model) return null;\n return { from: model.from, to: Math.min(state.doc.length, model.to + 1) };\n}\n","import { type TableModel } from \"./tableModel\";\n\n/**\n * Pure geometry for moving the caret between table cells. A table is rendered as\n * one atomic block whose cells are edited in per-cell subviews; navigation maps\n * a (row, col) + direction to the next cell or to an exit out of the table. Row 0\n * is the header; the `| --- |` delimiter row is not navigable. Kept pure (no\n * EditorView) so the step math is unit-testable; mounting lives in\n * {@link mountCellSubview}.\n */\n\n/** Navigable rows: the header plus every body row. */\nexport function rowCount(model: TableModel): number {\n return 1 + model.data.rows.length;\n}\n\n/** The cell at (row, col) — row 0 is the header — or null when out of range. */\nexport function cellAt(model: TableModel, row: number, col: number) {\n const cells = row === 0 ? model.data.header : model.data.rows[row - 1];\n return cells?.[col] ?? null;\n}\n\n/** The (row, col) of the cell whose source starts at `from`, or null. */\nexport function positionOf(model: TableModel, from: number): { row: number; col: number } | null {\n for (let row = 0; row < rowCount(model); row++) {\n const cells = row === 0 ? model.data.header : model.data.rows[row - 1];\n const col = cells.findIndex((cell) => cell.from === from);\n if (col >= 0) return { row, col };\n }\n return null;\n}\n\nexport type NavDir = \"next\" | \"prev\" | \"up\" | \"down\";\nexport type ExitEdge = \"above\" | \"below\" | \"before\" | \"after\";\nexport type NavTarget =\n | { kind: \"cell\"; row: number; col: number }\n | { kind: \"exit\"; edge: ExitEdge };\n\n/**\n * Where `dir` moves from (row, col): an adjacent cell, or an exit edge when it\n * leaves the table. `next`/`prev` (Tab / shift-Tab, or Left/Right at a cell's\n * text edge) wrap across rows in reading order; `up`/`down` stay in the column.\n */\nexport function stepCell(model: TableModel, row: number, col: number, dir: NavDir): NavTarget {\n return stepGrid(rowCount(model), model.data.header.length, row, col, dir);\n}\n\n/** {@link stepCell} on bare grid dimensions — the tablev2 bridge has the\n * dimensions but no model object. Single home for the step math. */\nexport function stepGrid(\n rows: number,\n cols: number,\n row: number,\n col: number,\n dir: NavDir,\n): NavTarget {\n switch (dir) {\n case \"next\":\n if (col + 1 < cols) return { kind: \"cell\", row, col: col + 1 };\n if (row + 1 < rows) return { kind: \"cell\", row: row + 1, col: 0 };\n return { kind: \"exit\", edge: \"after\" };\n case \"prev\":\n if (col > 0) return { kind: \"cell\", row, col: col - 1 };\n if (row > 0) return { kind: \"cell\", row: row - 1, col: cols - 1 };\n return { kind: \"exit\", edge: \"before\" };\n case \"down\":\n return row + 1 < rows ? { kind: \"cell\", row: row + 1, col } : { kind: \"exit\", edge: \"below\" };\n case \"up\":\n return row > 0 ? { kind: \"cell\", row: row - 1, col } : { kind: \"exit\", edge: \"above\" };\n }\n}\n\n/**\n * Where the caret lands when leaving the table at `edge`. The table is one atomic\n * block spanning [from, to]: a caret at `from` is shoved forward past the whole\n * block by CodeMirror, and a caret at `to` stays on the block's last (hidden) row\n * — either boundary keeps the caret on the grid, so a stray arrow press is then\n * needed to clear it. Stepping one position outward reaches the real neighbouring\n * line: `from - 1` ends the line above, `to + 1` starts the line below (the blank\n * line a GFM table is separated by). Both are clamped to the document.\n */\nexport function exitCaretPos(edge: ExitEdge, from: number, to: number, docLength: number): number {\n return edge === \"above\" || edge === \"before\"\n ? Math.max(0, from - 1)\n : Math.min(to + 1, docLength);\n}\n","/**\n * The swappable cell-editing seam (ADR 0001 §Editing surface).\n *\n * The table model, bridge rules, commands, and menu are identical for both\n * candidate surfaces; only *where typing physically happens* differs:\n *\n * - inline (B): the cell `<td>` itself becomes contenteditable.\n * - overlay (C): one shared editor is positioned over the cell rect,\n * portaled outside CodeMirror's DOM.\n *\n * A surface manages at most ONE active edit. It is told about document\n * changes (`mapThrough`) and widget DOM updates (`reanchor`) by the tableV2\n * extension, and resolves the cell's CURRENT source range only at commit\n * time — so edits merge cleanly with concurrent external changes.\n */\n\nimport { type ChangeDesc, type EditorState } from \"@codemirror/state\";\nimport { type EditorView } from \"@codemirror/view\";\n\nimport { cellAt } from \"../table/tableCellNav\";\nimport { modelAt } from \"../table/tableGeometry\";\n\nexport interface CellRef {\n /** 0 = header row; 1.. = body rows. */\n row: number;\n col: number;\n}\n\nexport interface ActiveEdit {\n ref: CellRef;\n /** Live unescaped cell text. */\n text: string;\n /** Caret offset within `text`. */\n caret: number;\n}\n\nexport interface CellEditingSurface {\n readonly kind: \"inline\" | \"overlay\";\n /** Begin editing `ref` in the table anchored at `tableFrom` (source start).\n * Returns false when the cell can't be resolved. */\n begin(view: EditorView, tableFrom: number, ref: CellRef, caret?: number): boolean;\n active(): ActiveEdit | null;\n /** The DOM element that hosts typing while an edit is active. */\n editingElement(): HTMLElement | null;\n /** Move the active edit's caret — DOM selection AND the live mirror, so a\n * bridge key arriving before the async selectionchange reads the truth. */\n placeCaret(offset: number): void;\n /** The current source position of the active edit's table, or null. */\n anchor(): number | null;\n /** Keep the table anchor position current across document changes. */\n mapThrough(changes: ChangeDesc): void;\n /** Called after the widget DOM was patched or recreated: re-attach the\n * editing UI, preserving live text, caret, and focus. */\n reanchor(view: EditorView): void;\n /** Resolve the cell's current range and write the live text (if changed);\n * ends the edit. */\n commit(view: EditorView): void;\n /** End the edit without writing. */\n cancel(): void;\n}\n\n/** The rendered element for a cell, resolved through the widget's CURRENT\n * source-anchor stamp (re-stamped on every toDOM/updateDOM). */\nexport function cellElement(\n view: EditorView,\n tableFrom: number,\n ref: CellRef,\n): HTMLElement | null {\n for (const wrap of view.dom.querySelectorAll<HTMLElement>(\"[data-tablev2-from]\")) {\n if (Number(wrap.dataset.tablev2From) !== tableFrom) continue;\n return wrap.querySelector<HTMLElement>(`[data-row=\"${ref.row}\"][data-col=\"${ref.col}\"]`);\n }\n return null;\n}\n\n/** The cell's current source range, from the freshly-parsed model. */\nexport function cellRange(\n state: EditorState,\n tableFrom: number,\n ref: CellRef,\n): { from: number; to: number } | null {\n const model = modelAt(state, tableFrom);\n if (!model) return null;\n const cell = cellAt(model, ref.row, ref.col);\n return cell ? { from: cell.from, to: cell.to } : null;\n}\n\n/** Collapse the selection at `offset` within `el` (flat text content). */\nexport function setCaret(el: HTMLElement, offset: number): void {\n let textNode = el.firstChild;\n if (!textNode || textNode.nodeType !== Node.TEXT_NODE) {\n textNode = el.ownerDocument.createTextNode(el.textContent ?? \"\");\n el.textContent = \"\";\n el.appendChild(textNode);\n }\n const max = textNode.textContent?.length ?? 0;\n el.ownerDocument.getSelection()?.collapse(textNode, Math.max(0, Math.min(offset, max)));\n}\n\n/** The selection's caret offset within `el`, or null when it's elsewhere. */\nexport function caretOffset(el: HTMLElement): number | null {\n const sel = el.ownerDocument.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n const range = sel.getRangeAt(0);\n if (!el.contains(range.startContainer)) return null;\n const pre = range.cloneRange();\n pre.selectNodeContents(el);\n pre.setEnd(range.startContainer, range.startOffset);\n return pre.toString().length;\n}\n\n/** Caret offset at a viewport point inside `el`, or null when the point\n * resolves elsewhere (borders, padding gutters). WebKit API. */\nexport function offsetAtPoint(el: HTMLElement, x: number, y: number): number | null {\n const doc = el.ownerDocument as Document & {\n caretRangeFromPoint?: (x: number, y: number) => Range | null;\n };\n const range = doc.caretRangeFromPoint?.(x, y);\n if (!range || !el.contains(range.startContainer)) return null;\n const pre = range.cloneRange();\n pre.selectNodeContents(el);\n pre.setEnd(range.startContainer, range.startOffset);\n return pre.toString().length;\n}\n\n/** Whether the caret sits on the first/last VISUAL line of `el` — a wrapped\n * cell spans several. Vertical bridge motion only leaves the cell from its\n * edge lines. Empty or unmeasurable selections count as single-line. */\nexport function visualEdges(el: HTMLElement): {\n onFirstVisualLine: boolean;\n onLastVisualLine: boolean;\n} {\n const single = { onFirstVisualLine: true, onLastVisualLine: true };\n const sel = el.ownerDocument.getSelection();\n if (!sel || sel.rangeCount === 0) return single;\n const range = sel.getRangeAt(0);\n if (!el.contains(range.startContainer)) return single;\n const rects = range.getClientRects();\n if (rects.length === 0) return single;\n const caret = rects[0];\n const elRect = el.getBoundingClientRect();\n const line = caret.height || parseFloat(getComputedStyle(el).lineHeight) || 16;\n return {\n onFirstVisualLine: caret.top - elRect.top < line * 0.75,\n onLastVisualLine: elRect.bottom - caret.bottom < line * 0.75,\n };\n}\n","/**\n * Cell text ↔ source transforms (GFM). A raw `|` inside a cell starts a new\n * column; the only literal pipe is `\\|`. Surfaces edit the UNESCAPED text and\n * re-escape on commit, so typing `|` in a cell can never shift the row.\n * Canonical home for the redesign (ADR 0001); the nested-editor copies retire\n * with `tableCellSubview.ts`.\n */\n\nexport function unescapePipes(source: string): string {\n return source.replace(/\\\\\\|/g, \"|\");\n}\n\nexport function escapePipes(text: string): string {\n return text.replace(/\\|/g, \"\\\\|\");\n}\n","/**\n * Surface B — the cell `<td>` itself edits (ADR 0001 §Editing surface).\n *\n * `begin` swaps the rendered cell content for the raw text and flips the cell\n * to `contenteditable=\"plaintext-only\"`; the browser owns caret, typing, and\n * intra-cell selection from there. Live text and caret are mirrored into\n * surface state on every input/selection change, because the DOM copy is NOT\n * durable: any widget patch rewrites cell innerHTML from (stale) data, and a\n * full widget recreate replaces the element wholesale. `reanchor` restores\n * text, caret, and focus onto whatever element currently renders the cell.\n */\n\nimport { type ChangeDesc } from \"@codemirror/state\";\nimport { type EditorView } from \"@codemirror/view\";\n\nimport { renderCellInto } from \"../table/tableCell\";\nimport { modelAt } from \"../table/tableGeometry\";\nimport { cellAt } from \"../table/tableCellNav\";\nimport {\n type ActiveEdit,\n type CellEditingSurface,\n type CellRef,\n caretOffset,\n cellElement,\n cellRange,\n setCaret,\n} from \"./cellEditingSurface\";\nimport { escapePipes, unescapePipes } from \"./cellText\";\n\ninterface EditState {\n view: EditorView;\n tableFrom: number;\n ref: CellRef;\n el: HTMLElement;\n text: string;\n caret: number;\n original: string;\n}\n\nexport class InlineCellSurface implements CellEditingSurface {\n readonly kind = \"inline\" as const;\n private edit: EditState | null = null;\n\n private readonly onInput = (): void => {\n const s = this.edit;\n if (!s) return;\n s.text = s.el.textContent ?? \"\";\n s.caret = caretOffset(s.el) ?? s.text.length;\n };\n\n private readonly onSelectionChange = (): void => {\n const s = this.edit;\n if (!s) return;\n const offset = caretOffset(s.el);\n if (offset !== null) s.caret = offset;\n };\n\n // Focus genuinely leaving the edit (sidebar, chat, another editor) commits\n // it — the boundary-commit model's outermost boundary. Checked a microtask\n // later so intra-table hops (commit→begin refocuses synchronously) and\n // reanchor's restore never observe a transiently blurred element.\n private readonly onFocusOut = (): void => {\n queueMicrotask(() => {\n const s = this.edit;\n if (!s) return;\n const active = s.el.ownerDocument.activeElement;\n if (active === s.el || s.el.contains(active)) return;\n this.commit(s.view);\n });\n };\n\n // CM6 history is the canonical undo (ADR 0001): the cell keeps NO undo\n // stack of its own. Mid-edit undo deterministically reverts to the text the\n // edit began with; committed steps belong to the main editor's history.\n private readonly onBeforeInput = (event: InputEvent): void => {\n if (!event.inputType.startsWith(\"history\")) return;\n event.preventDefault();\n const s = this.edit;\n if (!s || event.inputType !== \"historyUndo\") return;\n s.text = s.original;\n s.el.textContent = s.original;\n this.placeCaret(s.original.length);\n };\n\n begin(view: EditorView, tableFrom: number, ref: CellRef, caret = 0): boolean {\n this.cancel();\n const el = cellElement(view, tableFrom, ref);\n const range = cellRange(view.state, tableFrom, ref);\n if (!el || !range) return false;\n const text = unescapePipes(view.state.sliceDoc(range.from, range.to));\n this.edit = { view, tableFrom, ref, el, text, caret: Math.min(caret, text.length), original: text };\n this.attach(el);\n return true;\n }\n\n active(): ActiveEdit | null {\n const s = this.edit;\n return s ? { ref: s.ref, text: s.text, caret: s.caret } : null;\n }\n\n editingElement(): HTMLElement | null {\n return this.edit?.el ?? null;\n }\n\n placeCaret(offset: number): void {\n const s = this.edit;\n if (!s) return;\n s.caret = Math.max(0, Math.min(offset, s.text.length));\n setCaret(s.el, s.caret);\n }\n\n anchor(): number | null {\n return this.edit?.tableFrom ?? null;\n }\n\n mapThrough(changes: ChangeDesc): void {\n if (this.edit) this.edit.tableFrom = changes.mapPos(this.edit.tableFrom);\n }\n\n reanchor(view: EditorView): void {\n const s = this.edit;\n if (!s) return;\n const el = cellElement(view, s.tableFrom, s.ref);\n if (!el) return;\n const clobbered =\n el !== s.el ||\n el.textContent !== s.text ||\n el.getAttribute(\"contenteditable\") !== \"plaintext-only\";\n if (el !== s.el) {\n s.el.removeEventListener(\"input\", this.onInput);\n s.el.removeEventListener(\"beforeinput\", this.onBeforeInput);\n s.el.removeEventListener(\"focusout\", this.onFocusOut);\n el.addEventListener(\"input\", this.onInput);\n el.addEventListener(\"beforeinput\", this.onBeforeInput);\n el.addEventListener(\"focusout\", this.onFocusOut);\n s.el = el;\n }\n if (clobbered) {\n this.applyEditableState(el, s);\n } else if (el.ownerDocument.activeElement !== el) {\n el.focus();\n setCaret(el, s.caret);\n }\n }\n\n commit(view: EditorView): void {\n const s = this.edit;\n if (!s) return;\n const range = cellRange(view.state, s.tableFrom, s.ref);\n this.teardown();\n if (!range) return;\n if (s.text !== s.original) {\n view.dispatch({\n changes: { from: range.from, to: range.to, insert: escapePipes(s.text) },\n userEvent: \"input.table.cell\",\n });\n return;\n }\n // Unchanged: no transaction will re-render this cell — restore its\n // rendered content ourselves.\n const model = modelAt(view.state, s.tableFrom);\n const cell = model ? cellAt(model, s.ref.row, s.ref.col) : null;\n if (cell) renderCellInto(s.el, cell.html);\n }\n\n cancel(): void {\n const s = this.edit;\n if (!s) return;\n this.teardown();\n s.el.textContent = s.original;\n }\n\n private attach(el: HTMLElement): void {\n const s = this.edit;\n if (!s) return;\n s.view.dom.classList.add(\"cm-tablev2-editing\");\n this.applyEditableState(el, s);\n el.addEventListener(\"input\", this.onInput);\n el.addEventListener(\"beforeinput\", this.onBeforeInput);\n el.addEventListener(\"focusout\", this.onFocusOut);\n el.ownerDocument.addEventListener(\"selectionchange\", this.onSelectionChange);\n }\n\n private applyEditableState(el: HTMLElement, s: EditState): void {\n el.textContent = s.text;\n el.setAttribute(\"contenteditable\", \"plaintext-only\");\n el.focus();\n setCaret(el, s.caret);\n }\n\n private teardown(): void {\n const s = this.edit;\n if (!s) return;\n s.view.dom.classList.remove(\"cm-tablev2-editing\");\n s.el.removeEventListener(\"input\", this.onInput);\n s.el.removeEventListener(\"beforeinput\", this.onBeforeInput);\n s.el.removeEventListener(\"focusout\", this.onFocusOut);\n s.el.ownerDocument.removeEventListener(\"selectionchange\", this.onSelectionChange);\n s.el.removeAttribute(\"contenteditable\");\n this.edit = null;\n }\n}\n","/**\n * Zettlr-style quick inserters for the V2 table: hovering a cell reveals a\n * \"+\" in the wrap's gutter — below-left for a row, top-right for a column —\n * inserting relative to the hovered cell. The right-click menu carries the\n * full command set; these are the two high-frequency shortcuts.\n *\n * Ported from the V1 controls with both approved fixes baked in:\n * - repositioning is gated on the hovered CELL changing (per-mousemove\n * rewrites made the buttons jitter — \"flashing\"),\n * - the glyph is a centred SVG on a subtle neutral chip; the primary accent\n * is the hover state, not the resting state (editorTheme).\n *\n * One delegated listener per editor; buttons attach lazily per wrap and are\n * re-attached automatically after a widget recreate (the next mousemove).\n */\n\nimport { ViewPlugin } from \"@codemirror/view\";\nimport { type ChangeSpec, type EditorState } from \"@codemirror/state\";\n\nimport { addColumnAfter, addRowBelow } from \"../table/tableEditCommands\";\n\ntype InsertCommand = (state: EditorState, pos: number) => ChangeSpec | null;\n\n/** Inserter circle diameter; keep in sync with `.cm-table-inserter`. */\nconst PLUS = 20;\n\nconst PLUS_SVG =\n '<svg viewBox=\"0 0 16 16\" width=\"11\" height=\"11\" aria-hidden=\"true\">' +\n '<path d=\"M8 2.75v10.5M2.75 8h10.5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/></svg>';\n\nfunction makeInserter(kind: \"row\" | \"column\", label: string): HTMLButtonElement {\n const el = document.createElement(\"button\");\n el.type = \"button\";\n el.className = `cm-table-inserter cm-table-inserter--${kind}`;\n el.setAttribute(\"aria-label\", label);\n el.innerHTML = PLUS_SVG;\n return el;\n}\n\nexport function tableV2HoverControls() {\n return ViewPlugin.define((view) => {\n let lastCell: Element | null = null;\n\n const runInsert = (event: Event): void => {\n const button = event.currentTarget as HTMLElement;\n const pos = Number(button.dataset.pos);\n if (Number.isNaN(pos)) return;\n const command: InsertCommand = button.classList.contains(\"cm-table-inserter--row\")\n ? addRowBelow\n : addColumnAfter;\n const change = command(view.state, pos);\n if (change) view.dispatch({ changes: change, userEvent: \"input.table.structure\" });\n };\n\n const ensure = (wrap: HTMLElement): { row: HTMLElement; col: HTMLElement } => {\n let row = wrap.querySelector<HTMLElement>(\":scope > .cm-table-inserter--row\");\n let col = wrap.querySelector<HTMLElement>(\":scope > .cm-table-inserter--column\");\n if (!row) {\n row = makeInserter(\"row\", \"Insert row below\");\n row.addEventListener(\"click\", runInsert);\n wrap.appendChild(row);\n }\n if (!col) {\n col = makeInserter(\"column\", \"Insert column right\");\n col.addEventListener(\"click\", runInsert);\n wrap.appendChild(col);\n }\n return { row, col };\n };\n\n const hideAll = (): void => {\n lastCell = null;\n view.dom\n .querySelectorAll<HTMLElement>(\".cm-table-inserter\")\n .forEach((el) => (el.style.display = \"none\"));\n };\n\n const onMouseMove = (event: MouseEvent): void => {\n const target = event.target as HTMLElement;\n // On an inserter: leave it exactly where it is so it stays clickable.\n if (target.closest?.(\".cm-table-inserter\")) return;\n const cell = target.closest?.(\"[data-cell-from]\");\n const wrap = target.closest?.(\"[data-tablev2-from]\");\n if (!(cell instanceof HTMLElement) || !(wrap instanceof HTMLElement)) {\n hideAll();\n return;\n }\n if (cell.getAttribute(\"contenteditable\")) {\n // The cell is being edited — stay out of its way.\n hideAll();\n return;\n }\n // Reposition only when the hovered cell changes: per-move rewrites\n // jitter (\"flashing\") while the pointer travels within one cell.\n if (cell === lastCell) return;\n lastCell = cell;\n\n const { row, col } = ensure(wrap);\n row.dataset.pos = cell.dataset.cellFrom;\n col.dataset.pos = cell.dataset.cellFrom;\n\n const table = wrap.querySelector(\"table\");\n if (!table) return;\n const cellRect = cell.getBoundingClientRect();\n const tableRect = table.getBoundingClientRect();\n const wrapRect = wrap.getBoundingClientRect();\n const leftGutter = tableRect.left - wrapRect.left;\n const topGutter = tableRect.top - wrapRect.top;\n\n row.style.display = \"flex\";\n row.style.left = `${(leftGutter - PLUS) / 2}px`;\n row.style.top = `${cellRect.bottom - wrapRect.top - PLUS / 2}px`;\n\n col.style.display = \"flex\";\n col.style.left = `${cellRect.right - wrapRect.left - PLUS / 2}px`;\n col.style.top = `${(topGutter - PLUS) / 2}px`;\n };\n\n view.dom.addEventListener(\"mousemove\", onMouseMove);\n view.dom.addEventListener(\"mouseleave\", hideAll);\n return {\n destroy() {\n view.dom.removeEventListener(\"mousemove\", onMouseMove);\n view.dom.removeEventListener(\"mouseleave\", hideAll);\n },\n };\n });\n}\n","import { type EditorState } from \"@codemirror/state\";\n\nimport { type SourceRange } from \"../../types\";\nimport { byteRangeOf } from \"../byteOffset\";\nimport { columnAt, modelAt, pipes } from \"./tableGeometry\";\n\n/**\n * Pull a table row or column out as a self-contained markdown table fragment,\n * paired with the source range it came from. Drives the table context menu's\n * \"Ask the assistant about this row/column\": the fragment is the quoted excerpt\n * the assistant sees, the range anchors the chat's source chip.\n */\nexport interface TableExcerpt {\n text: string;\n range: SourceRange;\n}\n\n/** Source text of column `col` on table line `lineNumber` (between its pipes),\n * trimmed; empty string when the line has no such cell. */\nfunction cellText(state: EditorState, lineNumber: number, col: number): string {\n const line = state.doc.line(lineNumber);\n const ps = pipes(state, line);\n if (col + 1 >= ps.length) return \"\";\n return state.sliceDoc(ps[col] + 1, ps[col + 1]).trim();\n}\n\n/**\n * The row at `pos` as a standalone table — the header and delimiter lines plus\n * this row, verbatim — so the assistant receives valid, self-describing markdown.\n * Right-clicking the header row yields just the header. Range = the clicked row's\n * line. Null when `pos` isn't in a table.\n */\nexport function rowExcerptAt(state: EditorState, pos: number): TableExcerpt | null {\n const model = modelAt(state, pos);\n if (!model) return null;\n const header = state.doc.lineAt(model.from);\n const row = state.doc.lineAt(pos);\n const lines =\n row.from <= header.to\n ? [header.text]\n : [header.text, state.doc.line(header.number + 1).text, row.text];\n return { text: lines.join(\"\\n\"), range: byteRangeOf(state, row.from, row.to) };\n}\n\n/**\n * The column at `pos` as a one-column table — its header cell, a delimiter, and\n * the cell from every body row. Range = the whole table (a column's source is\n * non-contiguous, so the chip anchors to the table). Null when `pos` isn't in a\n * table.\n */\nexport function columnExcerptAt(state: EditorState, pos: number): TableExcerpt | null {\n const model = modelAt(state, pos);\n if (!model) return null;\n const col = columnAt(state, pos);\n const headerLine = state.doc.lineAt(model.from).number;\n const lastLine = state.doc.lineAt(model.to).number;\n const lines = [`| ${cellText(state, headerLine, col)} |`, \"| --- |\"];\n for (let n = headerLine + 2; n <= lastLine; n++) {\n lines.push(`| ${cellText(state, n, col)} |`);\n }\n return { text: lines.join(\"\\n\"), range: byteRangeOf(state, model.from, model.to) };\n}\n","import { type ChangeSpec, type EditorState } from \"@codemirror/state\";\nimport { type EditorView } from \"@codemirror/view\";\n\nimport {\n addColumnAfter,\n addColumnBefore,\n addRowAbove,\n addRowBelow,\n deleteColumn,\n deleteRow,\n} from \"./tableEditCommands\";\nimport { commentOnExcerptFacet } from \"../core/hostFacets\";\nimport { columnExcerptAt, rowExcerptAt } from \"./tableExcerpt\";\n\ntype TableCommand = (state: EditorState, pos: number) => ChangeSpec | null;\n\n/** Previews the row/column a \"Comment on this row/column\" item targets. */\nconst HOVER_CLASS = \"cm-table-cell--hover\";\n/** Held on a row/column's cells (styled like the hover) while the host's comment\n * composer for it is open; the host clears it on close. */\nconst COMMENTING_CLASS = \"cm-table-cell--commenting\";\n\ninterface ShowTableMenuArgs {\n x: number;\n y: number;\n view: EditorView;\n /** A document position inside the target cell (its `data-cell-from`). */\n pos: number;\n /** When provided (tablev2), a \"Select row/column/table\" group is offered;\n * the host owns the selection state. */\n selectCells?: (axis: \"row\" | \"column\" | \"table\") => void;\n}\n\n/** The rendered cells of the row or column the target cell sits in — located by\n * the `data-cell-from` the widget stamps on each `<th>`/`<td>`. Used to tint\n * the row/column a menu item is about to act on. Exported for tests. */\nexport function targetCells(view: EditorView, pos: number, axis: \"row\" | \"column\"): HTMLElement[] {\n const cell = view.dom.querySelector(`[data-cell-from=\"${pos}\"]`);\n if (!(cell instanceof HTMLElement)) return [];\n const row = cell.closest(\"tr\");\n if (!row) return [];\n if (axis === \"row\") {\n return Array.from(row.querySelectorAll<HTMLElement>(\"th, td\"));\n }\n const table = cell.closest(\"table\");\n const col = Array.from(row.children).indexOf(cell);\n if (!table || col < 0) return [];\n return Array.from(table.querySelectorAll<HTMLElement>(\"tr\"))\n .map((tr) => tr.children[col])\n .filter((el): el is HTMLElement => el instanceof HTMLElement);\n}\n\n/** Right-click menu over a table cell: insert/delete rows and columns. Each item\n * runs the matching {@link tableEditCommands} builder against the cell position\n * and dispatches the change. */\nexport function showTableMenu(args: ShowTableMenuArgs): void {\n const menu = document.createElement(\"div\");\n menu.className = \"cm-table-menu\";\n menu.setAttribute(\"role\", \"menu\");\n // Styled inline: the menu mounts on document.body, outside the editor element\n // that CodeMirror scopes its theme styles to, so a stylesheet rule never\n // reaches it. Inline styles always apply.\n menu.style.cssText =\n \"position:fixed;z-index:1000;display:flex;flex-direction:column;min-width:12rem;\" +\n \"padding:0.25rem 0;background:var(--cds-layer-01,#ffffff);\" +\n \"border:0.0625rem solid var(--cds-border-subtle-01,#e0e0e0);border-radius:0.125rem;\" +\n \"box-shadow:0 0.25rem 0.75rem rgba(0,0,0,0.15);\" +\n \"font:0.875rem/1.4 var(--cds-body-01-font-family,-apple-system,BlinkMacSystemFont,sans-serif);\";\n menu.style.left = `${args.x}px`;\n menu.style.top = `${args.y}px`;\n\n // Tint the row/column a menu item targets while it's hovered, so you see what\n // you're about to act on before you click. A theme class on the cells (cleared\n // on leave and on close) — distinct from the persistent `--commenting` class a\n // chosen comment leaves behind for the host to clear.\n let clearHighlight: (() => void) | null = null;\n function highlightTarget(axis: \"row\" | \"column\"): void {\n clearHighlight?.();\n const cells = targetCells(args.view, args.pos, axis);\n cells.forEach((cell) => cell.classList.add(HOVER_CLASS));\n clearHighlight = () => {\n cells.forEach((cell) => cell.classList.remove(HOVER_CLASS));\n clearHighlight = null;\n };\n }\n\n function destroy(): void {\n clearHighlight?.();\n menu.remove();\n document.removeEventListener(\"mousedown\", onOutside, true);\n document.removeEventListener(\"keydown\", onEscape, true);\n }\n function onOutside(event: MouseEvent): void {\n if (!menu.contains(event.target as Node)) destroy();\n }\n function onEscape(event: KeyboardEvent): void {\n if (event.key === \"Escape\") destroy();\n }\n\n function addAction(label: string, run: () => void, danger = false): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = danger\n ? \"cm-table-menu__item cm-table-menu__item--danger\"\n : \"cm-table-menu__item\";\n button.setAttribute(\"role\", \"menuitem\");\n button.textContent = label;\n button.style.cssText =\n \"appearance:none;background:transparent;border:none;text-align:left;width:100%;\" +\n \"padding:0.4rem 0.75rem;cursor:pointer;font:inherit;color:\" +\n (danger ? \"var(--cds-text-error,#da1e28)\" : \"var(--cds-text-primary,#161616)\") +\n \";\";\n button.addEventListener(\"mouseenter\", () => {\n button.style.background = \"var(--cds-layer-hover-01,#e8e8e8)\";\n });\n button.addEventListener(\"mouseleave\", () => {\n button.style.background = \"transparent\";\n });\n button.addEventListener(\"click\", () => {\n run();\n destroy();\n });\n menu.appendChild(button);\n return button;\n }\n\n /** A structural-edit item: run the command builder and dispatch its change. */\n function add(label: string, command: TableCommand, danger = false): void {\n addAction(\n label,\n () => {\n const change = command(args.view.state, args.pos);\n if (change) {\n args.view.dispatch({ changes: change, userEvent: \"input.table.structure\" });\n args.view.focus();\n }\n },\n danger,\n );\n }\n\n function separator(): void {\n const sep = document.createElement(\"div\");\n sep.className = \"cm-table-menu__sep\";\n sep.style.cssText =\n \"height:0.0625rem;margin:0.25rem 0;background:var(--cds-border-subtle-01,#e0e0e0);\";\n menu.appendChild(sep);\n }\n\n // \"Comment on this row/column\" — only when the host wired the facet (a desktop\n // shell with the comment composer). Hands the row/column off as an excerpt +\n // the click point; the host opens its comment composer there. The chosen\n // row/column keeps the `--commenting` tint until the host closes the composer.\n const comment = args.view.state.facet(commentOnExcerptFacet);\n if (comment) {\n function commentOn(axis: \"row\" | \"column\"): void {\n const excerpt = (axis === \"row\" ? rowExcerptAt : columnExcerptAt)(args.view.state, args.pos);\n if (!excerpt) return;\n targetCells(args.view, args.pos, axis).forEach((c) => c.classList.add(COMMENTING_CLASS));\n comment!(excerpt, { x: args.x, y: args.y });\n }\n const rowItem = addAction(\"Comment on this row\", () => commentOn(\"row\"));\n rowItem.addEventListener(\"mouseenter\", () => highlightTarget(\"row\"));\n rowItem.addEventListener(\"mouseleave\", () => clearHighlight?.());\n const columnItem = addAction(\"Comment on this column\", () => commentOn(\"column\"));\n columnItem.addEventListener(\"mouseenter\", () => highlightTarget(\"column\"));\n columnItem.addEventListener(\"mouseleave\", () => clearHighlight?.());\n separator();\n }\n\n if (args.selectCells) {\n const select = (axis: \"row\" | \"column\" | \"table\") => () => args.selectCells!(axis);\n addAction(\"Select row\", select(\"row\"));\n addAction(\"Select column\", select(\"column\"));\n addAction(\"Select table\", select(\"table\"));\n separator();\n }\n\n add(\"Insert row above\", addRowAbove);\n add(\"Insert row below\", addRowBelow);\n add(\"Delete row\", deleteRow, true);\n separator();\n add(\"Insert column left\", addColumnBefore);\n add(\"Insert column right\", addColumnAfter);\n add(\"Delete column\", deleteColumn, true);\n\n document.body.appendChild(menu);\n\n const rect = menu.getBoundingClientRect();\n if (rect.right > window.innerWidth) menu.style.left = `${args.x - rect.width}px`;\n if (rect.bottom > window.innerHeight) menu.style.top = `${args.y - rect.height}px`;\n\n setTimeout(() => {\n document.addEventListener(\"mousedown\", onOutside, true);\n document.addEventListener(\"keydown\", onEscape, true);\n }, 0);\n}\n","/**\n * The bridge's key decisions (ADR 0001): given where the caret sits inside a\n * cell, either the browser handles the key natively (mid-text editing) or the\n * bridge takes over at a boundary — stepping to a neighbour cell or exiting\n * the table. Pure — the grid math delegates to {@link stepCell}; geometry\n * (wrapped-line detection) arrives as booleans computed by the surface.\n *\n * Structural invariant: no key ever merges cells or rows. Backspace/Delete at\n * a cell edge NAVIGATES; structure changes only happen through explicit\n * commands (tableEditCommands).\n */\n\nimport { type NavDir, type NavTarget, rowCount, stepGrid } from \"../table/tableCellNav\";\nimport { type TableModel } from \"../table/tableModel\";\n\nexport type BridgeKey =\n | \"Tab\"\n | \"Shift-Tab\"\n | \"ArrowRight\"\n | \"ArrowLeft\"\n | \"ArrowUp\"\n | \"ArrowDown\"\n | \"Backspace\"\n | \"Delete\"\n | \"Enter\";\n\nexport interface BridgeInput {\n /** Grid dimensions: rows includes the header. */\n rows: number;\n cols: number;\n /** Caret cell (row 0 = header) and text position. */\n row: number;\n col: number;\n offset: number;\n length: number;\n /** Real-geometry flags from the surface (wrapped cells). */\n onFirstVisualLine: boolean;\n onLastVisualLine: boolean;\n}\n\nexport type BridgeAction =\n | { kind: \"native\" }\n | { kind: \"focusCell\"; row: number; col: number; caret: \"start\" | \"end\" }\n | { kind: \"exit\"; edge: \"before\" | \"after\" };\n\nconst NATIVE: BridgeAction = { kind: \"native\" };\n\n/** Dimensions of `model` as BridgeInput expects them. */\nexport function gridSize(model: TableModel): { rows: number; cols: number } {\n return { rows: rowCount(model), cols: model.data.header.length };\n}\n\nfunction resolve(input: BridgeInput, dir: NavDir, caret: \"start\" | \"end\"): BridgeAction {\n const target: NavTarget = stepGrid(input.rows, input.cols, input.row, input.col, dir);\n if (target.kind === \"cell\") return { kind: \"focusCell\", row: target.row, col: target.col, caret };\n return { kind: \"exit\", edge: target.edge === \"above\" || target.edge === \"before\" ? \"before\" : \"after\" };\n}\n\nexport function bridgeKey(input: BridgeInput, key: BridgeKey): BridgeAction {\n const atStart = input.offset === 0;\n const atEnd = input.offset >= input.length;\n switch (key) {\n case \"Tab\":\n return resolve(input, \"next\", \"start\");\n case \"Shift-Tab\":\n return resolve(input, \"prev\", \"end\");\n case \"ArrowRight\":\n return atEnd ? resolve(input, \"next\", \"start\") : NATIVE;\n case \"ArrowLeft\":\n return atStart ? resolve(input, \"prev\", \"end\") : NATIVE;\n case \"ArrowDown\":\n return input.onLastVisualLine ? resolve(input, \"down\", \"start\") : NATIVE;\n case \"ArrowUp\":\n return input.onFirstVisualLine ? resolve(input, \"up\", \"start\") : NATIVE;\n case \"Backspace\":\n return atStart ? resolve(input, \"prev\", \"end\") : NATIVE;\n case \"Delete\":\n return atEnd ? resolve(input, \"next\", \"start\") : NATIVE;\n case \"Enter\":\n return resolve(input, \"down\", \"start\");\n default:\n return NATIVE;\n }\n}\n","/**\n * Whole-cell visual selection (feature scenarios 11–13). A drag across cells\n * never produces a ragged native text selection — it selects whole cells,\n * painted with a class; copy serialises the selected rectangle as TSV from\n * the CURRENT document. Selection is transient: any document change clears it.\n *\n * The rectangle math is pure and dimension-based so the @pure tier can\n * enumerate it without a model or DOM.\n */\n\nimport { type EditorView } from \"@codemirror/view\";\n\nimport { cellAt } from \"../table/tableCellNav\";\nimport { modelAt } from \"../table/tableGeometry\";\nimport { type CellRef, cellElement } from \"./cellEditingSurface\";\nimport { unescapePipes } from \"./cellText\";\n\n// The V1 theme already styles this class; reuse it wholesale.\nexport const SELECTED_CLASS = \"cm-table-cell--selected\";\n\nexport interface CellRect {\n r0: number;\n c0: number;\n r1: number;\n c1: number;\n}\n\n/** The normalised rectangle spanned by two cells. */\nexport function rectOf(a: CellRef, b: CellRef): CellRect {\n return {\n r0: Math.min(a.row, b.row),\n c0: Math.min(a.col, b.col),\n r1: Math.max(a.row, b.row),\n c1: Math.max(a.col, b.col),\n };\n}\n\n/** Every cell in `rect`, row-major. */\nexport function refsIn(rect: CellRect): CellRef[] {\n const refs: CellRef[] = [];\n for (let row = rect.r0; row <= rect.r1; row++) {\n for (let col = rect.c0; col <= rect.c1; col++) refs.push({ row, col });\n }\n return refs;\n}\n\n/** One whole column of a `rows`-high grid (row 0 = header). */\nexport function columnRect(rows: number, col: number): CellRect {\n return { r0: 0, c0: col, r1: rows - 1, c1: col };\n}\n\n/** One whole row of a `cols`-wide grid. */\nexport function rowRect(cols: number, row: number): CellRect {\n return { r0: row, c0: 0, r1: row, c1: cols - 1 };\n}\n\n/** The whole grid. */\nexport function tableRect(rows: number, cols: number): CellRect {\n return { r0: 0, c0: 0, r1: rows - 1, c1: cols - 1 };\n}\n\nexport class CellSelectionController {\n private sel: { tableFrom: number; rect: CellRect } | null = null;\n\n set(view: EditorView, tableFrom: number, rect: CellRect): void {\n this.unpaint(view);\n this.sel = { tableFrom, rect };\n for (const ref of refsIn(rect)) {\n cellElement(view, tableFrom, ref)?.classList.add(SELECTED_CLASS);\n }\n }\n\n get(): { tableFrom: number; rect: CellRect } | null {\n return this.sel;\n }\n\n clear(view: EditorView): void {\n this.unpaint(view);\n this.sel = null;\n }\n\n /** The selected rectangle as TSV, resolved from the current document. */\n tsv(view: EditorView): string | null {\n const s = this.sel;\n if (!s) return null;\n const model = modelAt(view.state, s.tableFrom);\n if (!model) return null;\n const lines: string[] = [];\n for (let row = s.rect.r0; row <= s.rect.r1; row++) {\n const cells: string[] = [];\n for (let col = s.rect.c0; col <= s.rect.c1; col++) {\n const cell = cellAt(model, row, col);\n cells.push(cell ? unescapePipes(view.state.sliceDoc(cell.from, cell.to)) : \"\");\n }\n lines.push(cells.join(\"\\t\"));\n }\n return lines.join(\"\\n\");\n }\n\n private unpaint(view: EditorView): void {\n view.dom\n .querySelectorAll(`.${SELECTED_CLASS}`)\n .forEach((el) => el.classList.remove(SELECTED_CLASS));\n }\n}\n","/**\n * The interaction wiring around a {@link CellEditingSurface} (ADR 0001):\n *\n * - pointer: one press lifecycle owns the mouse. A press that stays in its\n * cell is a CLICK → edit begins on release with the caret at the pressed\n * point (caretRangeFromPoint). A press that crosses into another cell is a\n * DRAG → whole-cell selection (never a ragged native text selection).\n * Presses inside the active editing element stay native. Handled by\n * NATIVE listeners because the widget's `ignoreEvent() → true` hides\n * these events from CodeMirror — which is also what keeps a table click\n * from ever moving the main caret.\n * - keys: a document-capture keydown runs {@link bridgeKey} while an edit is\n * active — mid-text keys stay native; boundary keys commit and step to the\n * neighbour cell or exit to the main document (exitCaretPos).\n * - copy: with a cell selection active, copy yields TSV.\n * - context menu: right-click on a cell opens the structure menu\n * (insert/delete row/column) targeting that cell's position.\n * - entry: ArrowDown/ArrowUp in the MAIN editor next to a table enters its\n * first/last row (the table is an atomic block the caret can't land on).\n */\n\nimport { Prec } from \"@codemirror/state\";\nimport { EditorView, ViewPlugin, keymap } from \"@codemirror/view\";\nimport { type Extension } from \"@codemirror/state\";\n\nimport { showTableMenu } from \"../table/tableContextMenu\";\nimport { exitCaretPos, rowCount } from \"../table/tableCellNav\";\nimport { modelAt } from \"../table/tableGeometry\";\nimport {\n type CellEditingSurface,\n type CellRef,\n cellRange,\n offsetAtPoint,\n visualEdges,\n} from \"./cellEditingSurface\";\nimport { type BridgeKey, bridgeKey, gridSize } from \"./bridgeRules\";\nimport {\n CellSelectionController,\n columnRect,\n rectOf,\n rowRect,\n tableRect,\n} from \"./tableV2Selection\";\n\nfunction refOf(cellEl: HTMLElement): CellRef {\n return { row: Number(cellEl.dataset.row), col: Number(cellEl.dataset.col) };\n}\n\nfunction hitCell(target: EventTarget | null): { cellEl: HTMLElement; tableFrom: number } | null {\n if (!(target instanceof HTMLElement)) return null;\n const cellEl = target.closest?.(\"[data-row][data-col]\");\n const wrap = target.closest?.(\"[data-tablev2-from]\");\n if (!(cellEl instanceof HTMLElement) || !(wrap instanceof HTMLElement)) return null;\n return { cellEl, tableFrom: Number(wrap.dataset.tablev2From) };\n}\n\n/** Map a KeyboardEvent to a bridge key; null = not the bridge's business. */\nfunction bridgeKeyOf(event: KeyboardEvent): BridgeKey | null {\n if (event.metaKey || event.ctrlKey || event.altKey) return null;\n switch (event.key) {\n case \"Tab\":\n return event.shiftKey ? \"Shift-Tab\" : \"Tab\";\n case \"ArrowRight\":\n case \"ArrowLeft\":\n case \"ArrowUp\":\n case \"ArrowDown\":\n case \"Backspace\":\n case \"Delete\":\n case \"Enter\":\n return event.shiftKey ? null : (event.key as BridgeKey);\n default:\n return null;\n }\n}\n\ninterface Press {\n tableFrom: number;\n startRef: CellRef;\n startX: number;\n startY: number;\n dragged: boolean;\n}\n\nfunction pointerPlugin(surface: CellEditingSurface, selection: CellSelectionController) {\n return ViewPlugin.define((view) => {\n let press: Press | null = null;\n\n const onMouseMove = (event: MouseEvent): void => {\n if (!press) return;\n const hit = hitCell(event.target);\n if (!hit || hit.tableFrom !== press.tableFrom) return;\n const ref = refOf(hit.cellEl);\n const crossed = ref.row !== press.startRef.row || ref.col !== press.startRef.col;\n if (crossed || press.dragged) {\n press.dragged = true;\n selection.set(view, press.tableFrom, rectOf(press.startRef, ref));\n }\n };\n\n const onMouseUp = (): void => {\n const p = press;\n press = null;\n window.removeEventListener(\"mousemove\", onMouseMove, true);\n window.removeEventListener(\"mouseup\", onMouseUp, true);\n if (!p || p.dragged) return; // a drag leaves its selection standing\n if (!surface.begin(view, p.tableFrom, p.startRef, 0)) return;\n const el = surface.editingElement();\n if (!el) return;\n const offset = offsetAtPoint(el, p.startX, p.startY);\n surface.placeCaret(offset ?? surface.active()!.text.length);\n };\n\n const onMouseDown = (event: MouseEvent): void => {\n if (event.button !== 0) return;\n const editing = surface.editingElement();\n if (editing && event.target instanceof Node && editing.contains(event.target)) return;\n const hit = hitCell(event.target);\n if (!hit) {\n // A press outside any table (prose, gutters): selection is done.\n selection.clear(view);\n return;\n }\n event.preventDefault();\n surface.commit(view);\n selection.clear(view);\n press = {\n tableFrom: hit.tableFrom,\n startRef: refOf(hit.cellEl),\n startX: event.clientX,\n startY: event.clientY,\n dragged: false,\n };\n window.addEventListener(\"mousemove\", onMouseMove, true);\n window.addEventListener(\"mouseup\", onMouseUp, true);\n };\n\n const onContextMenu = (event: MouseEvent): void => {\n const hit = hitCell(event.target);\n if (!hit) return;\n event.preventDefault();\n surface.commit(view);\n const ref = refOf(hit.cellEl);\n const range = cellRange(view.state, hit.tableFrom, ref);\n if (!range) return;\n showTableMenu({\n x: event.clientX,\n y: event.clientY,\n view,\n pos: range.from,\n selectCells: (axis) => {\n const model = modelAt(view.state, hit.tableFrom);\n if (!model) return;\n const { rows, cols } = gridSize(model);\n const rect =\n axis === \"row\"\n ? rowRect(cols, ref.row)\n : axis === \"column\"\n ? columnRect(rows, ref.col)\n : tableRect(rows, cols);\n selection.set(view, hit.tableFrom, rect);\n },\n });\n };\n\n const onCopy = (event: ClipboardEvent): void => {\n const tsv = selection.tsv(view);\n if (tsv === null) return;\n event.clipboardData?.setData(\"text/plain\", tsv);\n event.preventDefault();\n };\n\n view.dom.addEventListener(\"mousedown\", onMouseDown);\n view.dom.addEventListener(\"contextmenu\", onContextMenu);\n document.addEventListener(\"copy\", onCopy, true);\n return {\n update(update: { docChanged: boolean }) {\n // Cell geometry changed under the selection: transient by design.\n if (update.docChanged) selection.clear(view);\n },\n destroy() {\n view.dom.removeEventListener(\"mousedown\", onMouseDown);\n view.dom.removeEventListener(\"contextmenu\", onContextMenu);\n document.removeEventListener(\"copy\", onCopy, true);\n window.removeEventListener(\"mousemove\", onMouseMove, true);\n window.removeEventListener(\"mouseup\", onMouseUp, true);\n },\n };\n });\n}\n\nfunction keyPlugin(surface: CellEditingSurface) {\n return ViewPlugin.define((view) => {\n const onKeyDown = (event: KeyboardEvent): void => {\n const el = surface.editingElement();\n if (!el || !(event.target instanceof Node) || !el.contains(event.target)) return;\n const key = bridgeKeyOf(event);\n if (!key) return;\n const active = surface.active();\n const tableFrom = surface.anchor();\n if (!active || tableFrom === null) return;\n const model = modelAt(view.state, tableFrom);\n if (!model) return;\n const action = bridgeKey(\n {\n ...gridSize(model),\n row: active.ref.row,\n col: active.ref.col,\n offset: active.caret,\n length: active.text.length,\n ...visualEdges(el),\n },\n key,\n );\n if (action.kind === \"native\") return;\n event.preventDefault();\n surface.commit(view);\n if (action.kind === \"focusCell\") {\n surface.begin(\n view,\n tableFrom,\n { row: action.row, col: action.col },\n action.caret === \"end\" ? Number.MAX_SAFE_INTEGER : 0,\n );\n return;\n }\n const after = modelAt(view.state, tableFrom);\n if (!after) return;\n const pos = exitCaretPos(\n action.edge === \"before\" ? \"above\" : \"below\",\n after.from,\n after.to,\n view.state.doc.length,\n );\n view.focus();\n view.dispatch({ selection: { anchor: pos }, scrollIntoView: true });\n };\n document.addEventListener(\"keydown\", onKeyDown, true);\n return {\n destroy() {\n document.removeEventListener(\"keydown\", onKeyDown, true);\n },\n };\n });\n}\n\n/** Enter the table's first/last row when vertical motion in the main editor\n * reaches it — the block widget itself can't hold the caret. */\nfunction enterTable(view: EditorView, surface: CellEditingSurface, dir: \"up\" | \"down\"): boolean {\n const { main } = view.state.selection;\n if (!main.empty) return false;\n const doc = view.state.doc;\n const line = doc.lineAt(main.head);\n const neighbour = dir === \"down\" ? line.number + 1 : line.number - 1;\n if (neighbour < 1 || neighbour > doc.lines) return false;\n const target = doc.line(neighbour);\n // Probe INSIDE the neighbour line: its end sits on the table node's own end\n // boundary, which side-sensitive resolution misses.\n const probe = dir === \"down\" ? target.from : Math.max(target.from, target.to - 1);\n const model = modelAt(view.state, probe);\n if (!model) return false;\n const ref: CellRef =\n dir === \"down\" ? { row: 0, col: 0 } : { row: rowCount(model) - 1, col: 0 };\n return surface.begin(view, model.from, ref, 0);\n}\n\n/** All interaction wiring for the V2 table; compose with `tableV2(surface)`. */\nexport function tableV2Interaction(surface: CellEditingSurface): Extension {\n const selection = new CellSelectionController();\n return [\n pointerPlugin(surface, selection),\n keyPlugin(surface),\n Prec.high(\n keymap.of([\n { key: \"ArrowDown\", run: (view) => enterTable(view, surface, \"down\") },\n { key: \"ArrowUp\", run: (view) => enterTable(view, surface, \"up\") },\n ]),\n ),\n ];\n}\n","import { EditorView } from \"@codemirror/view\";\n\nimport { armedTableField, tableArmedHighlight, tableField } from \"../table\";\nimport { InlineCellSurface } from \"../tablev2/inlineCellSurface\";\nimport { tableV2HoverControls } from \"../tablev2/tableV2HoverControls\";\nimport { tableV2Interaction } from \"../tablev2/tableV2Interaction\";\nimport { tableV2Sync } from \"../tablev2/tableV2Sync\";\n\nimport { type MarkdownExtension } from \"./types\";\n\n/**\n * A FACTORY, not a const: each composition gets its own editing surface (the\n * one-active-edit state), so two mounted editors can never share a cell edit.\n */\nexport function tableExtension(): MarkdownExtension {\n const surface = new InlineCellSurface();\n return {\n name: \"@compose/table\",\n version: \"0.2.0\",\n description:\n \"Renders GFM tables as a grid widget; cells edit natively in place (ADR 0001).\",\n extensions: [\n tableField,\n // Treat each table as one atomic block: the caret, clicks, and selection\n // skip over it instead of landing on its hidden `| … |` source. Without\n // this, arrows/clicks resolve to hidden offsets and Backspace edits a\n // hidden pipe — corrupting the grid (and eating the blank-line separator).\n EditorView.atomicRanges.of((view) => view.state.field(tableField)),\n // Two-step delete: the field records which table the next press deletes;\n // the plugin outlines it and draws the \"armed\" edge line.\n armedTableField,\n tableArmedHighlight,\n // Keep the surface's table anchor + active edit alive across doc changes.\n tableV2Sync(surface),\n // Click-to-edit at the clicked character, bridge keys (Tab/arrows/\n // Backspace/Delete/Enter), whole-cell drag selection + TSV copy, the\n // structure menu, and table entry/exit from the main document.\n tableV2Interaction(surface),\n // Hover \"+\" quick inserters (row below / column right).\n tableV2HoverControls(),\n ],\n };\n}\n","import { wikilinkPlugin } from \"../wikilink\";\n\nimport { type MarkdownExtension } from \"./types\";\n\nexport const wikilinkExtension: MarkdownExtension = {\n name: \"@compose/wikilink\",\n version: \"0.1.0\",\n description: \"Renders `[[target]]` / `[[target|alias]]` as clickable links.\",\n extensions: [wikilinkPlugin],\n};\n","/**\n * Phase-1 CodeMirror 6 markdown editor — the spike behind the\n * `compose.editorEngine.v1 = \"codemirror\"` flag.\n *\n * What is wired:\n * * @codemirror/lang-markdown for tokenization + the small built-in\n * Markdown keymap (continue-list-on-Enter, etc).\n * * `markdownDecorationsPlugin` for live-preview headings + bold +\n * italic. Lists, links, wikilinks, images, comments, tables are\n * Phase 2+.\n * * Same `value` / `onChange` contract as `TiptapMarkdownEditor`,\n * same frontmatter split, same hash-based loop guard. Switching\n * engines mid-session is safe — the file on disk is unchanged.\n * * `mode === \"source\"` disables decorations so the user sees raw\n * markdown. Same toggle, same shortcut, just no marker-hiding.\n *\n * Deliberately NOT wired in Phase 1 (so this file stays small and\n * the spike actually proves the scaling claim):\n * * Toolbar formatting buttons (B / I / H1…) — `EditorFileActions`\n * still renders so Save / History / Export / Comments / Chat\n * work from the toolbar. Formatting buttons port in Phase 2.\n * * Image paste / drop, link picker, wikilink rendering, comment\n * overlay, selection-to-chat bubble. The Tiptap editor handles\n * these today; the CodeMirror editor will once the spike clears.\n *\n * Public surface mirrors `TiptapMarkdownEditorProps` so AppShell's\n * dispatch is symmetric; Phase-2-or-later callbacks are accepted\n * (and ignored) here rather than guarded at every call site.\n */\n\nimport {\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { defaultKeymap, history, historyKeymap } from \"@codemirror/commands\";\nimport { markdown, markdownKeymap, markdownLanguage } from \"@codemirror/lang-markdown\";\nimport { languages } from \"@codemirror/language-data\";\nimport { Annotation, EditorSelection, EditorState, type Extension } from \"@codemirror/state\";\nimport { EditorView, keymap } from \"@codemirror/view\";\n\nimport { parseFrontmatter, serializeMarkdown, type Frontmatter } from \"../frontmatter\";\nimport type { DocumentTextChange, SourceRange } from \"../types\";\nimport { byteRangeOf } from \"./byteOffset\";\nimport { drawnCaret } from \"./caretLayer\";\nimport { drawnSelection } from \"./selectionLayer\";\nimport { markdownPaste } from \"./clipboard/pasteMarkdown\";\nimport {\n renderClipboardHtmlFacet,\n richCopy,\n type RenderClipboardHtml,\n} from \"./clipboard/copyRich\";\nimport { onEditorUpdate, updateBus } from \"./updateBus\";\nimport {\n codeHighlight,\n codeLanguageUI,\n fenceAutoCloseKeymap,\n fenceCaretGuard,\n fenceTabKeymap,\n fenceTypeAutoClose,\n} from \"./code\";\nimport {\n commentOnExcerptFacet,\n editorBaseTheme,\n markdownDecorationsPlugin,\n openExternalUrlFacet,\n parseToEnd,\n resolveImageSrcFacet,\n saveImageBytesFacet,\n type CommentOnExcerpt,\n type OpenExternalUrl,\n type ResolveImageSrc,\n type SaveImageBytes,\n} from \"./core\";\nimport {\n clickModel,\n cursorModelKeymap,\n deleteNormalizerKeymap,\n flankingGuard,\n navigateToFacet,\n} from \"./interaction\";\nimport { tightListKeymap, listIndentKeymap } from \"./list\";\nimport { formatCommandsKeymap, blockCommandsKeymap } from \"./format\";\nimport { imageContextFacet, imageInsertHandlers } from \"./image\";\nimport { computeFileDir, type ImageResolveContext } from \"../imageSrcResolver\";\nimport { wikilinkFromPathFacet, wikilinkTargetsFacet } from \"./wikilink\";\nimport {\n composeExtensions,\n footnoteExtension,\n highlightExtension,\n mathExtension,\n mermaidExtension,\n tableExtension,\n wikilinkExtension,\n} from \"./extensions\";\n\nexport type CodeMirrorEditorMode = \"wysiwyg\" | \"source\";\n\n/** A non-empty editor selection, in document byte offsets. */\nexport interface EditorSelectionSnapshot {\n range: SourceRange;\n text: string;\n}\n\nexport interface CodeMirrorMarkdownEditorProps {\n mode?: CodeMirrorEditorMode;\n onChange: (value: string, changes: DocumentTextChange[]) => void;\n value: string;\n workspaceRoot?: string;\n filePath?: string;\n linkTargets?: ReadonlySet<string>;\n onNavigateToLink?: (path: string) => void;\n /**\n * Host-rendered toolbar. The editor owns the live `EditorView` and hands it to\n * the slot; the host builds whatever toolbar UI it wants (formatting buttons,\n * file actions, …) around it. Omit for a chromeless editor. Return a STABLE\n * element shape so the host's own memoisation can hold across keystrokes.\n */\n toolbar?: (ctx: { view: EditorView }) => ReactNode;\n /**\n * Host-rendered actions for the current text selection (e.g. a comment / ask\n * bubble). Called with the live selection (or `null` when collapsed) and a\n * `dismiss` that collapses the selection back to a caret. Omit for none.\n */\n selectionActions?: (ctx: {\n selection: EditorSelectionSnapshot | null;\n dismiss: () => void;\n }) => ReactNode;\n // ── Host-environment seams (all optional; browser-friendly defaults) ───────\n /**\n * Map a markdown image `src` to a loadable URL. Default: render the reference\n * as-is. A desktop host maps workspace-relative paths onto its asset protocol.\n */\n resolveImageSrc?: ResolveImageSrc;\n /**\n * Persist a pasted/dropped image's bytes at a workspace-relative path.\n * Default: omitted ⇒ the image is inlined as a `data:` URL.\n */\n saveImageBytes?: SaveImageBytes;\n /**\n * Open a clicked external link. Default: a new browser tab. A desktop host\n * overrides this to leave the app's webview.\n */\n onOpenExternalUrl?: OpenExternalUrl;\n /**\n * Comment on a selected table row/column — wired to the table context menu's\n * \"Comment on this row / column\". The host opens its comment composer at the\n * given anchor, seeded with the excerpt. Default: omitted ⇒ no such menu items.\n */\n onCommentOnExcerpt?: CommentOnExcerpt;\n /**\n * Render a markdown selection to HTML for the clipboard, so a copy pastes\n * formatted into Google Docs / Slack / Word (the markdown source always\n * rides along as text/plain). Default: omitted ⇒ plain-only copies.\n */\n renderClipboardHtml?: RenderClipboardHtml;\n /**\n * Called once, right after a tab-switch content swap commits and paints.\n * Used by the host for latency instrumentation; no-op by default.\n */\n onAfterContentSwap?: () => void;\n /**\n * Receives a synchronous `flush()` that pulls the editor's live (debounce-\n * lagged) content into the last `onChange` immediately — the host calls it\n * before persisting. `null` is passed on unmount. Lets a host avoid writing\n * stale buffers on Cmd+S / tab close.\n */\n onFlushReady?: (flush: (() => void) | null) => void;\n}\n\n/** Tags the editor's own programmatic content swaps (external value patch,\n * save echo) so the autosave listener can tell them from user edits. A\n * cross-update boolean can't do this job: `setState` swaps fire NO update to\n * consume it, and the stale flag then swallowed the user's next real edit —\n * a lone RAW-mode fix looked saved but never was (#108). */\nconst programmaticSwap = Annotation.define<boolean>();\n\nconst AUTOSAVE_DEBOUNCE_MS = 500;\n\n// Same tiny FNV-1a hash the Tiptap editor uses — dedup of save\n// loops only, never used for identity. Kept duplicated rather than\n// importing across feature folders; a shared util can land later if\n// a third caller appears.\nfunction hashString(s: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < s.length; i += 1) {\n h ^= s.charCodeAt(i);\n h = (h * 0x01000193) >>> 0;\n }\n return h.toString(16);\n}\n\nfunction CodeMirrorMarkdownEditorInner({\n mode = \"wysiwyg\",\n onChange,\n value,\n workspaceRoot,\n filePath,\n linkTargets,\n onNavigateToLink,\n toolbar,\n selectionActions,\n resolveImageSrc,\n saveImageBytes,\n onOpenExternalUrl,\n onCommentOnExcerpt,\n renderClipboardHtml,\n onAfterContentSwap,\n onFlushReady,\n}: CodeMirrorMarkdownEditorProps) {\n // Frontmatter split — same shape as the Tiptap editor. The\n // editor surface only ever sees the body; YAML is held aside in\n // a ref and recombined on save.\n const parsedRef = useRef(parseFrontmatter(value));\n const frontmatterRef = useRef<Frontmatter | null>(parsedRef.current.frontmatter);\n const bodyRef = useRef<string>(parsedRef.current.body);\n\n // Loop guard: hash of the last markdown WE emitted. When `value`\n // comes back matching this hash the change is our own echo and\n // we skip the reload (otherwise file watcher → setContent →\n // update → save → file watcher loops).\n const lastEmittedHashRef = useRef<string>(hashString(value));\n\n // Debounce timer for autosave.\n const autosaveTimerRef = useRef<number | null>(null);\n\n // The mount node — given to CM6's `parent` option.\n const hostRef = useRef<HTMLDivElement | null>(null);\n // The live editor instance, held in a ref because React's\n // ref-callback pattern is enough for setup/teardown and we never\n // need a re-render on view changes.\n const viewRef = useRef<EditorView | null>(null);\n // Toolbar needs a re-renderable handle on the view so its pressed-\n // state buttons can subscribe to caret motion. Mirror the ref into\n // state once the view mounts.\n const [viewForToolbar, setViewForToolbar] = useState<EditorView | null>(null);\n\n // Selection snapshot driving the floating comment bubble. Same\n // shape as the Tiptap editor's `bubbleSelection`. Updated on\n // every selection change (rAF-polled); cleared when selection is\n // empty.\n const [bubbleSelection, setBubbleSelection] = useState<\n { range: SourceRange; text: string } | null\n >(null);\n\n const onChangeRef = useRef(onChange);\n useLayoutEffect(function syncLatestOnChangeRef() {\n onChangeRef.current = onChange;\n });\n\n // Host-seam callbacks are read through refs so the facet values (baked into\n // each per-tab EditorState at build time) always call the LATEST prop, never\n // a stale closure — even though the state is rebuilt only on mode/tab change.\n const resolveImageSrcRef = useRef(resolveImageSrc);\n const saveImageBytesRef = useRef(saveImageBytes);\n const openExternalUrlRef = useRef(onOpenExternalUrl);\n const onCommentOnExcerptRef = useRef(onCommentOnExcerpt);\n const renderClipboardHtmlRef = useRef(renderClipboardHtml);\n const onAfterContentSwapRef = useRef(onAfterContentSwap);\n const onFlushReadyRef = useRef(onFlushReady);\n useLayoutEffect(function syncHostSeamRefs() {\n resolveImageSrcRef.current = resolveImageSrc;\n saveImageBytesRef.current = saveImageBytes;\n openExternalUrlRef.current = onOpenExternalUrl;\n onCommentOnExcerptRef.current = onCommentOnExcerpt;\n renderClipboardHtmlRef.current = renderClipboardHtml;\n onAfterContentSwapRef.current = onAfterContentSwap;\n onFlushReadyRef.current = onFlushReady;\n });\n\n // Latest mode kept in a ref so the editor lifecycle effect\n // doesn't tear down and rebuild on a wysiwyg ↔ source toggle.\n // Decorations are added or removed via `Compartment` in the\n // Phase-2 cut; for the spike, we rebuild the view on mode change\n // (rare) but NOT on every keystroke.\n const decorationsEnabled = mode === \"wysiwyg\";\n\n // Image src resolution context — passed to the decoration plugin\n // via a CM6 facet so the inline image widget can turn workspace-\n // relative paths into asset:// URLs the webview can fetch.\n const imageCtx = useMemo<ImageResolveContext>(\n () => ({ fileDir: computeFileDir(workspaceRoot, filePath) }),\n [workspaceRoot, filePath],\n );\n\n // Per-tab EditorState cache. The dominant tab-switch cost on a 1 MB\n // note was CodeMirror re-parsing the whole document on every switch\n // (measured ~140ms p99, see docs/perf-spec.md §5). We keep the live\n // `EditorView` mounted across tab switches and swap its `EditorState`\n // instead — `view.setState(cached)` is a pointer swap, not a re-parse.\n // Switching back to an already-open tab restores its cursor, scroll,\n // and undo history for free.\n //\n // Keyed by file path. `syncedHashRef` records the content hash each\n // cached state reflects so we can tell \"the store's value still\n // matches this cached state\" (fast restore) from \"the file changed\n // under us\" (rebuild for correctness).\n const editorStatesRef = useRef<Map<string, EditorState>>(new Map());\n const syncedHashRef = useRef<Map<string, string>>(new Map());\n const currentFileRef = useRef<string | undefined>(filePath);\n // Tracks the decoration mode the live state was built for, so the\n // mode-change effect can skip its initial run (mount already built\n // the correct state).\n const modeInitializedRef = useRef<boolean>(decorationsEnabled);\n\n // Build the full extension list from the CURRENT props. Called when a\n // tab's state is first created (and on mode change). Each per-file\n // state bakes in that file's path-dependent facets (image dir,\n // wikilink source path), so a restored state stays correct for its\n // own file.\n function buildExtensions(): Extension[] {\n const base: Extension[] = [\n history(),\n // Update fan-out for reactive chrome (toolbar pressed-states, selection\n // bubble). Must ride the BASE extensions: anything appended to a single\n // state's config dies on the next setState (tab switch) and the chrome\n // freezes at the previous document's context.\n updateBus,\n // Whitespace typed at a bold/italic/strike content edge lands outside\n // the markers, or the closing delimiter stops parsing (#94).\n flankingGuard,\n // Caret and selection both draw from the editor's own selection state:\n // the native contentEditable caret double-paints at atomic widget\n // boundaries (#62), and native ::selection can only highlight rendered\n // DOM, so a whole-document selection loses its highlight outside the\n // virtualized viewport (#166). Table cells run their own subview\n // without either, keeping their native caret and selection.\n drawnCaret,\n drawnSelection,\n // Tight list continuation — Enter drops the next bullet directly below,\n // never with a blank-line gap (overrides the stock markdown Enter for\n // non-empty list items; see listContinuation.ts).\n tightListKeymap,\n // Enter on a just-typed ``` closes the fence with the caret inside —\n // an unclosed fence would swallow the rest of the document (#91).\n fenceAutoCloseKeymap,\n // The keystroke completing a bare ``` closes the fence immediately, so\n // an unclosed opener never swallows the document below (§9.5).\n fenceTypeAutoClose,\n // Tab indents inside a code block (Shift-Tab dedents) — otherwise the\n // browser's focus navigation steals the key mid-code (§12.8).\n fenceTabKeymap,\n // The caret never parks on a fence's marker rows: clicks land on the\n // nearest content edge, arrow motion crosses out of the block (§12.9).\n fenceCaretGuard,\n // Opener-row language pill (+ \"plain\" placeholder) opens the chooser;\n // right-click a block for set-language / copy-code (ADR 0002).\n codeLanguageUI,\n // Tab / Shift-Tab nest / promote a list item by the parent marker width\n // (list-aware; falls through to normal Tab outside a list — listIndent.ts).\n listIndentKeymap,\n keymap.of([...defaultKeymap, ...historyKeymap, ...markdownKeymap]),\n // markdownLanguage = CommonMark + GFM (tables, task lists,\n // strikethrough). Without `base`, `markdown()` uses bare\n // CommonMark — Lezer never produces Table / Task / Strikethrough\n // nodes and our registry can't decorate them.\n //\n // `remove: [\"SetextHeading\"]` disables setext headings — the rule that a\n // line of text immediately followed by a line of `---` (or `===`) turns\n // the text into a heading. That rule silently rewrites the line ABOVE\n // when you type `-` under a paragraph, which is surprising in a rich\n // editor (and fought our \"lone `-` is literal until a space\" bullet\n // rule). ATX `#` headings are unaffected.\n // `codeLanguages` gives fenced blocks a real nested parse (lazily\n // loaded per info string) — actual syntax highlighting via\n // codeHighlight, which styles only code-emitted tags (ADR 0002).\n markdown({\n base: markdownLanguage,\n codeLanguages: languages,\n extensions: [{ remove: [\"SetextHeading\"] }],\n }),\n codeHighlight,\n EditorView.lineWrapping,\n // Editor-internal styling (font, line-height, heading sizes,\n // marker widget styling) lives in `editorBaseTheme` so it\n // participates in CM6's line-metric measurement cycle. Don't\n // duplicate these rules in `global.scss` — that's where the\n // earlier click-drift bug came from.\n editorBaseTheme,\n // Image-src resolution context for the inline image widget.\n imageContextFacet.of(imageCtx),\n // Image paste / drop pipeline. Pulls bytes off the clipboard\n // or DataTransfer, saves through `insertImageBlob`, inserts\n // `` at the caret.\n imageInsertHandlers,\n // Clipboard interop (#134/#135): rich pastes convert to markdown\n // (image-file pastes stay with the handler above); copies carry\n // markdown + rendered HTML. After imageInsertHandlers so file pastes\n // resolve there first.\n markdownPaste,\n richCopy,\n renderClipboardHtmlFacet.of((markdown) =>\n (renderClipboardHtmlRef.current ?? (() => null))(markdown),\n ),\n // Host-environment seams. Registered as stable wrappers (reading the\n // latest prop through a ref) only when the host provides the capability;\n // otherwise the facet's browser default applies. See hostFacets.ts.\n ...(resolveImageSrc\n ? [\n resolveImageSrcFacet.of((rawSrc, ctx) =>\n (resolveImageSrcRef.current ?? ((s: string) => s))(rawSrc, ctx),\n ),\n ]\n : []),\n ...(saveImageBytes\n ? [\n saveImageBytesFacet.of((relPath, bytes) => {\n const fn = saveImageBytesRef.current;\n return fn ? fn(relPath, bytes) : Promise.reject(new Error(\"no saver\"));\n }),\n ]\n : []),\n ...(onOpenExternalUrl\n ? [\n openExternalUrlFacet.of((url) => {\n openExternalUrlRef.current?.(url);\n }),\n ]\n : []),\n ...(onCommentOnExcerpt\n ? [\n commentOnExcerptFacet.of((excerpt, anchor) => {\n onCommentOnExcerptRef.current?.(excerpt, anchor);\n }),\n ]\n : []),\n // Wikilink resolution facets stay in both modes so Cmd-click\n // can navigate from Raw view too — only the decorating plugin\n // itself is gated by `decorationsEnabled` below.\n wikilinkFromPathFacet.of(filePath),\n wikilinkTargetsFacet.of(linkTargets ?? new Set<string>()),\n ...(onNavigateToLink ? [navigateToFacet.of(onNavigateToLink)] : []),\n // Cursor model: arrow/shift+arrow → next visible source\n // position, skipping hidden markdown syntax in one step.\n cursorModelKeymap,\n // Backspace / Delete: removes visible content; collapses an\n // emptied styled span (no dangling `****`).\n deleteNormalizerKeymap,\n // Cmd+B / Cmd+I / Cmd+E: toggle bold / italic / inline code.\n formatCommandsKeymap,\n // Cmd+1..3 / Cmd+Shift+7..9: heading levels, lists, blockquote.\n blockCommandsKeymap,\n // Click model: Cmd/Ctrl-click on a link opens it; caret\n // placement never lands inside a hidden marker (snap-to-content).\n clickModel,\n // The editor invariant: the syntax tree covers the whole document, not\n // just what the viewport rendered — widgets, affordances and structural\n // commands anywhere in the note are wrong without it.\n parseToEnd,\n EditorView.updateListener.of((update) => {\n if (!update.docChanged) return;\n // Our own content swaps must not echo a save; anything involving a\n // real user transaction must.\n if (update.transactions.every((tr) => tr.annotation(programmaticSwap))) {\n return;\n }\n if (autosaveTimerRef.current !== null) {\n window.clearTimeout(autosaveTimerRef.current);\n }\n autosaveTimerRef.current = window.setTimeout(() => {\n autosaveTimerRef.current = null;\n const body = update.view.state.doc.toString();\n bodyRef.current = body;\n const full = serializeMarkdown({\n frontmatter: frontmatterRef.current,\n body,\n });\n const hash = hashString(full);\n if (hash === lastEmittedHashRef.current) return;\n lastEmittedHashRef.current = hash;\n if (currentFileRef.current !== undefined) {\n syncedHashRef.current.set(currentFileRef.current, hash);\n }\n onChangeRef.current(full, []);\n }, AUTOSAVE_DEBOUNCE_MS);\n }),\n ];\n if (decorationsEnabled) {\n base.push(markdownDecorationsPlugin);\n const composed = composeExtensions([\n wikilinkExtension,\n highlightExtension,\n footnoteExtension,\n mathExtension,\n mermaidExtension,\n tableExtension(),\n ]);\n base.push(...composed.extensions);\n }\n return base;\n }\n // `buildExtensions` is intentionally a plain closure read inside\n // effects (not a hook dep) — the effects below decide WHEN a state is\n // rebuilt, so we don't want a fresh `extensions` identity to force a\n // remount the way it did before this cache existed.\n const buildExtensionsRef = useRef(buildExtensions);\n useLayoutEffect(function syncBuildExtensionsRef() {\n buildExtensionsRef.current = buildExtensions;\n });\n\n // Mount the view ONCE. Subsequent tab switches swap state (below)\n // rather than tearing down — that's the whole point of the cache.\n useEffect(function mountEditorView() {\n const host = hostRef.current;\n if (!host) return;\n const initial = EditorState.create({\n doc: bodyRef.current,\n extensions: buildExtensionsRef.current(),\n });\n if (currentFileRef.current !== undefined) {\n editorStatesRef.current.set(currentFileRef.current, initial);\n syncedHashRef.current.set(currentFileRef.current, lastEmittedHashRef.current);\n }\n const view = new EditorView({ state: initial, parent: host });\n viewRef.current = view;\n setViewForToolbar(view);\n return function teardownEditorView() {\n bodyRef.current = view.state.doc.toString();\n view.destroy();\n viewRef.current = null;\n setViewForToolbar(null);\n };\n // Mount-once: deps intentionally empty. Tab switches go through the\n // sync effect; mode changes through the rebuild effect below.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(function syncEditorToActiveFile() {\n const view = viewRef.current;\n if (!view) return;\n const incomingHash = hashString(value);\n const switchingFile = currentFileRef.current !== filePath;\n\n if (!switchingFile) {\n // Same file, external value change (LLM write / file watcher) or\n // our own save echo. Patch the live doc in place.\n if (incomingHash === lastEmittedHashRef.current) return;\n const parsed = parseFrontmatter(value);\n frontmatterRef.current = parsed.frontmatter;\n bodyRef.current = parsed.body;\n lastEmittedHashRef.current = incomingHash;\n view.dispatch({\n changes: { from: 0, to: view.state.doc.length, insert: parsed.body },\n annotations: programmaticSwap.of(true),\n });\n if (filePath !== undefined) syncedHashRef.current.set(filePath, incomingHash);\n return;\n }\n\n // --- Tab switch ---\n const prev = currentFileRef.current;\n\n // Flush any pending autosave for the OUTGOING file FIRST. The view\n // now persists across switches, so a stale timer would otherwise\n // fire against the incoming file's state and write the wrong\n // content. We run the save synchronously with the outgoing doc +\n // frontmatter (still current at this point).\n if (autosaveTimerRef.current !== null) {\n window.clearTimeout(autosaveTimerRef.current);\n autosaveTimerRef.current = null;\n const outgoingBody = view.state.doc.toString();\n const outgoingFull = serializeMarkdown({\n frontmatter: frontmatterRef.current,\n body: outgoingBody,\n });\n const outgoingHash = hashString(outgoingFull);\n if (outgoingHash !== lastEmittedHashRef.current) {\n if (prev !== undefined) syncedHashRef.current.set(prev, outgoingHash);\n onChangeRef.current(outgoingFull, []);\n }\n }\n\n // Stash the outgoing tab's live state (cursor + scroll + undo + any\n // edits) for instant restore later.\n if (prev !== undefined) editorStatesRef.current.set(prev, view.state);\n\n const parsed = parseFrontmatter(value);\n frontmatterRef.current = parsed.frontmatter;\n bodyRef.current = parsed.body;\n lastEmittedHashRef.current = incomingHash;\n currentFileRef.current = filePath;\n\n const key = filePath ?? \"\";\n const cached = editorStatesRef.current.get(key);\n const cachedHash = syncedHashRef.current.get(key);\n if (cached && cachedHash === incomingHash) {\n // FAST PATH — pointer swap, no parse. ~5ms regardless of doc size.\n view.setState(cached);\n } else {\n // Cache miss (first open) or the file changed under us — build a\n // fresh state and cache it.\n const state = EditorState.create({\n doc: parsed.body,\n extensions: buildExtensionsRef.current(),\n });\n editorStatesRef.current.set(key, state);\n syncedHashRef.current.set(key, incomingHash);\n view.setState(state);\n }\n // Content-swap end signal: rAF puts us after CM6's measure +\n // browser paint, so a host's latency probe covers the full \"click\n // → new content visible\" interval (see docs/perf-spec.md §5).\n requestAnimationFrame(() => onAfterContentSwapRef.current?.());\n }, [filePath, value]);\n\n // Mode toggle (Rich ↔ Raw) changes the decoration extensions, so\n // every cached state is stale. Rebuild the active file's state from\n // its live doc and drop the cache; other tabs rebuild lazily on next\n // visit. Rare event — not on the hot path.\n useEffect(function rebuildOnModeChange() {\n const view = viewRef.current;\n if (!view) return;\n // Skip the initial run (mount already built the right state).\n if (modeInitializedRef.current === decorationsEnabled) return;\n modeInitializedRef.current = decorationsEnabled;\n const liveBody = view.state.doc.toString();\n editorStatesRef.current.clear();\n syncedHashRef.current.clear();\n const state = EditorState.create({\n doc: liveBody,\n extensions: buildExtensionsRef.current(),\n });\n if (currentFileRef.current !== undefined) {\n editorStatesRef.current.set(currentFileRef.current, state);\n syncedHashRef.current.set(currentFileRef.current, lastEmittedHashRef.current);\n }\n view.setState(state);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [decorationsEnabled]);\n\n // Pull the live editor content into the store buffer synchronously,\n // cancelling the pending 500ms autosave debounce. The store's save path\n // (`saveActiveFile` — Cmd+S / autosave / close) calls this first so it\n // never persists the stale, debounce-lagged buffer. Reads only refs, so\n // a single stable identity is fine.\n const flushPendingToBuffer = useCallback(function flushPendingToBuffer() {\n const view = viewRef.current;\n if (!view) return;\n if (autosaveTimerRef.current !== null) {\n window.clearTimeout(autosaveTimerRef.current);\n autosaveTimerRef.current = null;\n }\n const body = view.state.doc.toString();\n bodyRef.current = body;\n const full = serializeMarkdown({ frontmatter: frontmatterRef.current, body });\n const hash = hashString(full);\n if (hash === lastEmittedHashRef.current) return;\n lastEmittedHashRef.current = hash;\n onChangeRef.current(full, []);\n }, []);\n\n useEffect(function registerFlushBridge() {\n onFlushReadyRef.current?.(flushPendingToBuffer);\n return function unregisterFlushBridge() {\n onFlushReadyRef.current?.(null);\n };\n }, [flushPendingToBuffer]);\n\n useEffect(function cancelPendingAutosaveOnUnmount() {\n return function clearAutosaveTimer() {\n if (autosaveTimerRef.current !== null) {\n window.clearTimeout(autosaveTimerRef.current);\n }\n };\n }, []);\n\n useEffect(\n function trackSelectionForCommentBubble() {\n const view = viewForToolbar;\n if (!view) return;\n const refresh = () => {\n const main = view.state.selection.main;\n if (main.empty) {\n setBubbleSelection(null);\n } else {\n setBubbleSelection({\n range: byteRangeOf(view.state, main.from, main.to),\n text: view.state.sliceDoc(main.from, main.to),\n });\n }\n };\n refresh();\n // Subscribe via the update bus (not an appended updateListener — that\n // dies on the next setState and the bubble freezes; see updateBus.ts).\n return onEditorUpdate(view, (update) => {\n if (update.docChanged || update.selectionSet) refresh();\n });\n },\n [viewForToolbar],\n );\n\n // Collapse the selection back to a caret — handed to the selection-actions\n // slot so a host can dismiss its bubble after an action lands. Stable (reads\n // the view ref), so it doesn't churn the host's memoised slot.\n const dismissSelection = useCallback(() => {\n const view = viewRef.current;\n if (!view) return;\n const head = view.state.selection.main.head;\n view.dispatch({ selection: EditorSelection.cursor(head) });\n }, []);\n\n // The toolbar slot is invoked through a memo keyed on the (mount-stable) view\n // and the host's slot identity — NOT on every render. So when a keystroke\n // re-renders this leaf, the toolbar element is referentially unchanged and a\n // memoised host toolbar holds (the perf win we'd otherwise lose by calling\n // the slot inline every render).\n const toolbarNode = useMemo(\n () => (viewForToolbar && toolbar ? toolbar({ view: viewForToolbar }) : null),\n [viewForToolbar, toolbar],\n );\n // The selection slot, by contrast, SHOULD refresh when the selection moves —\n // that's its input. Memoised on the selection so it's stable between\n // selection changes but updates when one happens.\n const selectionNode = useMemo(\n () =>\n selectionActions\n ? selectionActions({ selection: bubbleSelection, dismiss: dismissSelection })\n : null,\n [selectionActions, bubbleSelection, dismissSelection],\n );\n\n // `cm-editor-host` owns the editor surface layout (toolbar row + scroll area\n // + selection overlay). The toolbar and selection UI are host-rendered slots\n // — the editor stays agnostic about save / export / comments / chat.\n return (\n <div className=\"tiptap-editor cm-editor-host\">\n {toolbarNode}\n <div className=\"tiptap-editor__scroll cm-editor-host__scroll\" ref={hostRef} />\n {selectionNode}\n </div>\n );\n}\n\n/**\n * Memoised export — same reason as the Tiptap editor. AppShell\n * re-renders on every chat-thread token; without memoisation each\n * token would blow through the editor's render path.\n */\nexport const CodeMirrorMarkdownEditor = memo(CodeMirrorMarkdownEditorInner);\n"]}
|