@particle-academy/react-fancy 5.65.0 → 5.67.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/dist/{PastePills.types-CDyotkUb.d.cts → PastePills.types-CpXzsuwJ.d.cts} +2 -0
  3. package/dist/{PastePills.types-CDyotkUb.d.ts → PastePills.types-CpXzsuwJ.d.ts} +2 -0
  4. package/dist/{PastedFilesInput-CrgNoEBd.d.ts → PastedFilesInput-Bt3KSTVN.d.ts} +1 -1
  5. package/dist/{PastedFilesInput-DQ1eZaHk.d.cts → PastedFilesInput-CUQeOeOA.d.cts} +1 -1
  6. package/dist/button.cjs +3 -4
  7. package/dist/button.js +1 -2
  8. package/dist/{chunk-COXHFZR6.js → chunk-23AVEYUP.js} +14 -8
  9. package/dist/chunk-23AVEYUP.js.map +1 -0
  10. package/dist/{chunk-C5YX5XVL.cjs → chunk-3U7PUZLI.cjs} +214 -4
  11. package/dist/chunk-3U7PUZLI.cjs.map +1 -0
  12. package/dist/{chunk-ATIDUWY6.cjs → chunk-4S5DFN5N.cjs} +12 -12
  13. package/dist/{chunk-ATIDUWY6.cjs.map → chunk-4S5DFN5N.cjs.map} +1 -1
  14. package/dist/{chunk-CMC2TOEQ.cjs → chunk-6CAXLP7D.cjs} +6 -6
  15. package/dist/{chunk-CMC2TOEQ.cjs.map → chunk-6CAXLP7D.cjs.map} +1 -1
  16. package/dist/{chunk-TQGRXJ74.cjs → chunk-7FYRFNPX.cjs} +9 -9
  17. package/dist/{chunk-TQGRXJ74.cjs.map → chunk-7FYRFNPX.cjs.map} +1 -1
  18. package/dist/{chunk-MVVHUTXA.js → chunk-B4LVQ4QI.js} +3 -3
  19. package/dist/{chunk-MVVHUTXA.js.map → chunk-B4LVQ4QI.js.map} +1 -1
  20. package/dist/{chunk-QP35Z2WB.js → chunk-BL5IKSB3.js} +3 -3
  21. package/dist/{chunk-QP35Z2WB.js.map → chunk-BL5IKSB3.js.map} +1 -1
  22. package/dist/{chunk-SZH7TFME.js → chunk-DCAD2JPP.js} +4 -4
  23. package/dist/{chunk-SZH7TFME.js.map → chunk-DCAD2JPP.js.map} +1 -1
  24. package/dist/{chunk-MCQJFMDP.cjs → chunk-E5UU666U.cjs} +478 -36
  25. package/dist/chunk-E5UU666U.cjs.map +1 -0
  26. package/dist/{chunk-L24LUSEE.js → chunk-FXOT4P4P.js} +478 -36
  27. package/dist/chunk-FXOT4P4P.js.map +1 -0
  28. package/dist/{chunk-CAUEKGMR.js → chunk-HEY4SMS2.js} +4 -4
  29. package/dist/{chunk-CAUEKGMR.js.map → chunk-HEY4SMS2.js.map} +1 -1
  30. package/dist/{chunk-QNQNGARW.cjs → chunk-HFK5SBNM.cjs} +27 -9
  31. package/dist/chunk-HFK5SBNM.cjs.map +1 -0
  32. package/dist/{chunk-TLRRMYNV.js → chunk-OXERDFFF.js} +212 -4
  33. package/dist/chunk-OXERDFFF.js.map +1 -0
  34. package/dist/{chunk-ELFTEJBT.js → chunk-QSGAFKK2.js} +3 -3
  35. package/dist/{chunk-ELFTEJBT.js.map → chunk-QSGAFKK2.js.map} +1 -1
  36. package/dist/{chunk-SYEHWUM5.cjs → chunk-RALJMI7C.cjs} +4 -4
  37. package/dist/{chunk-SYEHWUM5.cjs.map → chunk-RALJMI7C.cjs.map} +1 -1
  38. package/dist/{chunk-UM4JXBRZ.cjs → chunk-S3NB6LDV.cjs} +4 -4
  39. package/dist/{chunk-UM4JXBRZ.cjs.map → chunk-S3NB6LDV.cjs.map} +1 -1
  40. package/dist/{chunk-C463C4MM.cjs → chunk-SAG6DHQK.cjs} +22 -16
  41. package/dist/chunk-SAG6DHQK.cjs.map +1 -0
  42. package/dist/{chunk-4XHG6Q42.cjs → chunk-U5LKNGHU.cjs} +21 -21
  43. package/dist/{chunk-4XHG6Q42.cjs.map → chunk-U5LKNGHU.cjs.map} +1 -1
  44. package/dist/{chunk-M52S3TFI.js → chunk-WFR7HKJL.js} +3 -3
  45. package/dist/{chunk-M52S3TFI.js.map → chunk-WFR7HKJL.js.map} +1 -1
  46. package/dist/{chunk-NILA2LZY.js → chunk-YIKXJWO4.js} +27 -9
  47. package/dist/chunk-YIKXJWO4.js.map +1 -0
  48. package/dist/composer.cjs +4 -4
  49. package/dist/composer.d.cts +2 -2
  50. package/dist/composer.d.ts +2 -2
  51. package/dist/composer.js +2 -2
  52. package/dist/content-renderer.cjs +7 -5
  53. package/dist/content-renderer.d.cts +56 -4
  54. package/dist/content-renderer.d.ts +56 -4
  55. package/dist/content-renderer.js +4 -2
  56. package/dist/editor.cjs +6 -5
  57. package/dist/editor.d.cts +1 -1
  58. package/dist/editor.d.ts +1 -1
  59. package/dist/editor.js +4 -3
  60. package/dist/{extensions-6PVd3-vB.d.cts → extensions-DiByZIpD.d.cts} +26 -3
  61. package/dist/{extensions-6PVd3-vB.d.ts → extensions-DiByZIpD.d.ts} +26 -3
  62. package/dist/{index-CCJVT9Hu.d.cts → index-DWtSViJ3.d.cts} +7 -1
  63. package/dist/{index-DRlltbdV.d.ts → index-XR5t8bTq.d.ts} +7 -1
  64. package/dist/index.cjs +47 -48
  65. package/dist/index.cjs.map +1 -1
  66. package/dist/index.d.cts +5 -5
  67. package/dist/index.d.ts +5 -5
  68. package/dist/index.js +10 -11
  69. package/dist/index.js.map +1 -1
  70. package/dist/input.cjs +3 -3
  71. package/dist/input.d.cts +1 -1
  72. package/dist/input.d.ts +1 -1
  73. package/dist/input.js +2 -2
  74. package/dist/inputs.cjs +3 -3
  75. package/dist/inputs.d.cts +1 -1
  76. package/dist/inputs.d.ts +1 -1
  77. package/dist/inputs.js +2 -2
  78. package/dist/json-editor.cjs +15 -16
  79. package/dist/json-editor.js +4 -5
  80. package/dist/magic-wand.cjs +3 -4
  81. package/dist/magic-wand.js +2 -3
  82. package/dist/paste-pills.cjs +14 -14
  83. package/dist/paste-pills.d.cts +3 -3
  84. package/dist/paste-pills.d.ts +3 -3
  85. package/dist/paste-pills.js +1 -1
  86. package/dist/prompt-input.cjs +6 -7
  87. package/dist/prompt-input.d.cts +2 -2
  88. package/dist/prompt-input.d.ts +2 -2
  89. package/dist/prompt-input.js +3 -4
  90. package/dist/reason-tag.cjs +3 -4
  91. package/dist/reason-tag.js +2 -3
  92. package/docs/ContentRenderer.md +138 -3
  93. package/docs/PromptInput.md +24 -1
  94. package/package.json +1 -1
  95. package/dist/chunk-6TBRBN7H.js +0 -212
  96. package/dist/chunk-6TBRBN7H.js.map +0 -1
  97. package/dist/chunk-C463C4MM.cjs.map +0 -1
  98. package/dist/chunk-C5YX5XVL.cjs.map +0 -1
  99. package/dist/chunk-COXHFZR6.js.map +0 -1
  100. package/dist/chunk-L24LUSEE.js.map +0 -1
  101. package/dist/chunk-MCQJFMDP.cjs.map +0 -1
  102. package/dist/chunk-NILA2LZY.js.map +0 -1
  103. package/dist/chunk-QNQNGARW.cjs.map +0 -1
  104. package/dist/chunk-TLRRMYNV.js.map +0 -1
  105. package/dist/chunk-X2FC7ODX.cjs +0 -215
  106. package/dist/chunk-X2FC7ODX.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/ContentRenderer/extensions.ts","../src/utils/markdown.ts","../src/components/Editor/editor.utils.ts","../src/components/ContentRenderer/RenderedContent.tsx","../src/components/ContentRenderer/ContentRenderer.tsx"],"names":["marked","useMemo","jsx"],"mappings":"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","file":"chunk-L24LUSEE.js","sourcesContent":["import type { ComponentType } from \"react\";\n\n/** Props passed to every render-extension component. */\nexport interface RenderExtensionProps {\n /** The inner content of the custom tag (raw string). */\n content: string;\n /** Parsed HTML attributes from the opening tag. */\n attributes: Record<string, string>;\n}\n\n/** Registers a custom tag with a React component for rendering. */\nexport interface RenderExtension {\n /** Tag name to match, e.g. \"questions\", \"thinking\". Case-insensitive. */\n tag: string;\n /** React component that renders the matched tag. */\n component: ComponentType<RenderExtensionProps>;\n /**\n * Whether this is a block-level element.\n * Block extensions are wrapped in a `<div>`, inline in a `<span>`.\n * @default true\n */\n block?: boolean;\n}\n\n/** A parsed segment — either raw HTML or a matched extension tag. */\nexport type ContentSegment =\n | { type: \"html\"; content: string }\n | { type: \"extension\"; tag: string; content: string; attributes: Record<string, string> };\n\n// ---------------------------------------------------------------------------\n// Global extension registry\n// ---------------------------------------------------------------------------\n\nconst globalRegistry: RenderExtension[] = [];\n\n/** Register a single render extension globally (available to all ContentRenderer and Editor instances). */\nexport function registerExtension(extension: RenderExtension): void {\n const idx = globalRegistry.findIndex(\n (e) => e.tag.toLowerCase() === extension.tag.toLowerCase(),\n );\n if (idx >= 0) {\n globalRegistry[idx] = extension;\n } else {\n globalRegistry.push(extension);\n }\n}\n\n/** Register multiple render extensions globally. */\nexport function registerExtensions(extensions: RenderExtension[]): void {\n for (const ext of extensions) {\n registerExtension(ext);\n }\n}\n\n/** Get a snapshot of the current global registry. */\nexport function getGlobalExtensions(): RenderExtension[] {\n return [...globalRegistry];\n}\n\n// ---------------------------------------------------------------------------\n// Parsing\n// ---------------------------------------------------------------------------\n\n/** Parse attributes from an opening tag string like `tag foo=\"bar\" baz=\"qux\"`. */\nfunction parseAttributes(attrString: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const re = /(\\w[\\w-]*)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|(\\S+)))?/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(attrString)) !== null) {\n attrs[m[1]] = m[2] ?? m[3] ?? m[4] ?? \"\";\n }\n return attrs;\n}\n\n/**\n * Split an HTML string into segments of plain HTML and matched extension tags.\n *\n * Handles:\n * - `<tag>content</tag>`\n * - `<tag attr=\"val\">content</tag>`\n * - Nested different-tags inside the content (preserved as raw HTML)\n * - Self-nesting of the same tag (greedy — matches outermost)\n */\nexport function parseSegments(\n html: string,\n extensions: RenderExtension[],\n): ContentSegment[] {\n if (extensions.length === 0) {\n return html ? [{ type: \"html\", content: html }] : [];\n }\n\n const tagNames = extensions.map((e) => e.tag).join(\"|\");\n // Match opening tag with optional attributes, then content, then closing tag.\n // Uses a non-greedy match for content — if same-tag nesting is needed the\n // consumer should use distinct tag names.\n const pattern = new RegExp(\n `<(${tagNames})((?:\\\\s+[^>]*)?)>([\\\\s\\\\S]*?)<\\\\/\\\\1>`,\n \"gi\",\n );\n\n const segments: ContentSegment[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = pattern.exec(html)) !== null) {\n // Push any HTML before this match\n if (match.index > lastIndex) {\n segments.push({ type: \"html\", content: html.slice(lastIndex, match.index) });\n }\n\n const tag = match[1].toLowerCase();\n const rawAttrs = match[2] ? match[2].trim() : \"\";\n const innerContent = match[3];\n\n segments.push({\n type: \"extension\",\n tag,\n content: innerContent,\n attributes: rawAttrs ? parseAttributes(rawAttrs) : {},\n });\n\n lastIndex = match.index + match[0].length;\n }\n\n // Push any trailing HTML\n if (lastIndex < html.length) {\n segments.push({ type: \"html\", content: html.slice(lastIndex) });\n }\n\n return segments;\n}\n\n/**\n * Merge per-instance extensions with the global registry.\n * Instance extensions override globals with the same tag name.\n */\nexport function mergeExtensions(\n instanceExtensions?: RenderExtension[],\n): RenderExtension[] {\n const globals = getGlobalExtensions();\n if (!instanceExtensions || instanceExtensions.length === 0) return globals;\n if (globals.length === 0) return instanceExtensions;\n\n const merged = [...globals];\n for (const ext of instanceExtensions) {\n const idx = merged.findIndex(\n (e) => e.tag.toLowerCase() === ext.tag.toLowerCase(),\n );\n if (idx >= 0) {\n merged[idx] = ext;\n } else {\n merged.push(ext);\n }\n }\n return merged;\n}\n","import { marked } from \"marked\";\nimport { sanitizeHtml, type SanitizeHtmlOptions } from \"./sanitize\";\n\n/**\n * Parse markdown to HTML WITHOUT sanitising. Internal: ContentRenderer's\n * `unsafe` path needs the raw output; everything public goes through\n * {@link renderMarkdown}.\n */\nexport function markdownToRawHtml(markdown: string | null | undefined): string {\n // marked.parse throws on nullish input; treat missing content as empty.\n return marked.parse(markdown ?? \"\", { async: false }) as string;\n}\n\n/**\n * Render markdown (GitHub-flavoured) to sanitised HTML — the same parser and\n * output `ContentRenderer` uses, so a host never has to import the parser\n * itself.\n *\n * With no `sanitize` options the default blocklist of {@link sanitizeHtml} is\n * applied; pass allowlist options to keep only what you list:\n *\n * ```ts\n * renderMarkdown(md, { allowedTags: [\"p\", \"strong\", \"a\"], allowedAttributes: [\"href\"] })\n * ```\n */\nexport function renderMarkdown(\n markdown: string,\n sanitize?: SanitizeHtmlOptions,\n): string {\n return sanitizeHtml(markdownToRawHtml(markdown), sanitize);\n}\n","import { marked, type Token, type Tokens } from \"marked\";\nimport type { RenderExtension } from \"../ContentRenderer/extensions\";\n\n/**\n * Shared prose typography classes for Editor.Content and ContentRenderer.\n * Hand-rolled since we don't depend on @tailwindcss/typography.\n */\nexport const proseClasses = [\n \"[&_h1]:text-2xl [&_h1]:font-bold [&_h1]:mt-4 [&_h1]:mb-2\",\n \"[&_h2]:text-xl [&_h2]:font-semibold [&_h2]:mt-3 [&_h2]:mb-2\",\n \"[&_h3]:text-lg [&_h3]:font-semibold [&_h3]:mt-2 [&_h3]:mb-1\",\n \"[&_p]:mb-2\",\n \"[&_a]:text-blue-500 [&_a]:underline\",\n \"[&_ul]:list-disc [&_ul]:pl-5 [&_ol]:list-decimal [&_ol]:pl-5\",\n \"[&_li]:mb-1\",\n \"[&_blockquote]:border-l-4 [&_blockquote]:border-zinc-300 [&_blockquote]:pl-4 [&_blockquote]:italic [&_blockquote]:text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] dark:[&_blockquote]:border-zinc-600 dark:[&_blockquote]:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))]\",\n \"[&_code]:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] [&_code]:px-1 [&_code]:rounded [&_code]:text-sm dark:[&_code]:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n \"[&_pre]:bg-zinc-950 [&_pre]:text-zinc-100 [&_pre]:p-4 [&_pre]:rounded-lg [&_pre]:overflow-x-auto\",\n \"[&_pre_code]:bg-transparent [&_pre_code]:px-0\",\n \"[&_strong]:font-bold [&_em]:italic\",\n].join(\" \");\n\nconst HTML_TAG_PATTERN = /<(p|div|br|h[1-6]|ul|ol|strong|em|a |img |table|pre|code|blockquote)[>\\s/]/i;\n\n/** Detect whether a string is likely HTML or Markdown. */\nexport function detectFormat(value: string): \"html\" | \"markdown\" {\n return HTML_TAG_PATTERN.test(value) ? \"html\" : \"markdown\";\n}\n\n/**\n * Build a set of known HTML tag names. Extension tags are excluded\n * so that the \"strip remaining tags\" step preserves them.\n */\nconst STANDARD_HTML_TAGS = new Set([\n \"a\", \"abbr\", \"address\", \"area\", \"article\", \"aside\", \"audio\",\n \"b\", \"base\", \"bdi\", \"bdo\", \"blockquote\", \"body\", \"br\", \"button\",\n \"canvas\", \"caption\", \"cite\", \"code\", \"col\", \"colgroup\",\n \"data\", \"datalist\", \"dd\", \"del\", \"details\", \"dfn\", \"dialog\", \"div\", \"dl\", \"dt\",\n \"em\", \"embed\",\n \"fieldset\", \"figcaption\", \"figure\", \"footer\", \"form\",\n \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"head\", \"header\", \"hgroup\", \"hr\", \"html\",\n \"i\", \"iframe\", \"img\", \"input\", \"ins\",\n \"kbd\",\n \"label\", \"legend\", \"li\", \"link\",\n \"main\", \"map\", \"mark\", \"menu\", \"meta\", \"meter\",\n \"nav\", \"noscript\",\n \"object\", \"ol\", \"optgroup\", \"option\", \"output\",\n \"p\", \"param\", \"picture\", \"pre\", \"progress\",\n \"q\",\n \"rp\", \"rt\", \"ruby\",\n \"s\", \"samp\", \"script\", \"section\", \"select\", \"slot\", \"small\", \"source\", \"span\",\n \"strike\", \"strong\", \"style\", \"sub\", \"summary\", \"sup\",\n \"table\", \"tbody\", \"td\", \"template\", \"textarea\", \"tfoot\", \"th\", \"thead\", \"time\", \"title\", \"tr\", \"track\",\n \"u\", \"ul\",\n \"var\", \"video\",\n \"wbr\",\n]);\n\n/**\n * HTML-to-Markdown converter for editor output.\n *\n * Walks the parsed DOM rather than rewriting the HTML string, because markup\n * structure is what decides markdown spacing and a string rewrite cannot see\n * it. The regex version this replaces turned every whitespace text node\n * between tags into a literal newline: marked emits `</li>\\n<li>`, so every\n * tight list came back with a blank line between items — and a fresh item\n * from Enter (which Chromium inserts with NO whitespace node) came back\n * without one, so an edit to the last item made the list loose after the\n * FIRST item only.\n *\n * Rules: whitespace-only text between blocks is formatting, not content.\n * Blocks are separated by a blank line; a list is tight unless one of its\n * items holds a `<p>` (marked's marker for a loose list), so loose lists stay\n * loose and tight lists stay tight. Custom extension tags are preserved as-is.\n *\n * Given the `source` map {@link markdownToEditorHtml} produced when the\n * document was loaded, output is source-preserving instead: every block the\n * person did not change is emitted from its original markdown, byte for byte.\n *\n * Without a DOM (SSR) it falls back to the older string rewrite.\n */\nexport function htmlToMarkdown(html: string, source?: MarkdownSource | null): string {\n if (typeof document === \"undefined\") return legacyHtmlToMarkdown(html);\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n if (source) return serializeWithSource(template.content, source);\n return serializeBlocks(template.content).replace(/^\\n+/, \"\").replace(/\\s+$/, \"\");\n}\n\n/* ------------------------------------------------------------------------ *\n * Source-preserving markdown\n *\n * When markdown is loaded, each top-level block (paragraph, heading, list,\n * table, code block, quote, rule, HTML block) is rendered on its own and its\n * elements are tagged `data-md-block=\"<n>\"`, with the block's ORIGINAL source\n * text and a snapshot of its rendered HTML kept beside it. List items get\n * `data-md-item`, table rows `data-md-row`, mapped the same way.\n *\n * On output, a block whose elements still serialise to the snapshot is\n * emitted from its source slice, exactly. Only changed or new blocks are\n * serialised from the DOM, and the source between two blocks that are still\n * neighbours (blank lines, link reference definitions, HTML comments) is\n * emitted verbatim, as is the text after the last block.\n *\n * Chromium clones the element it splits on Enter, attributes included, so a\n * tag can appear twice; the FIRST copy that still matches its snapshot owns\n * the source, and any other copy is treated as new content.\n * ------------------------------------------------------------------------ */\n\nconst BLOCK_ATTR = \"data-md-block\";\nconst ITEM_ATTR = \"data-md-item\";\nconst ROW_ATTR = \"data-md-row\";\n\ninterface SourceList {\n bullet: string;\n delimiter: string;\n loose: boolean;\n /** Each item's source, trailing newlines excluded. */\n items: string[];\n /** itemGaps[k]: the source between item k and item k + 1. */\n itemGaps: string[];\n itemSnapshots: string[];\n}\n\ninterface SourceTable {\n /** The table's source lines: header, alignment row, then one per body row. */\n lines: string[];\n columns: number;\n /** Snapshot per source line index (0 = header, 2.. = body rows). */\n rowSnapshots: Map<number, string>;\n}\n\ninterface SourceBlock {\n /** The block's source, trailing newlines excluded. */\n raw: string;\n /** Concatenated outerHTML of the block's rendered elements, as seeded. */\n snapshot: string;\n elementCount: number;\n list?: SourceList;\n table?: SourceTable;\n}\n\n/** The original source of a markdown document, mapped to the blocks rendered from it. */\nexport interface MarkdownSource {\n /** Source before the first block. */\n leading: string;\n blocks: SourceBlock[];\n /** gaps[i]: the source between block i and block i + 1, or the end of the document. */\n gaps: string[];\n}\n\nfunction stripTrailingNewlines(text: string): string {\n return text.replace(/\\n+$/, \"\");\n}\n\nfunction indexAttr(el: Element, attr: string, size: number): number | undefined {\n const value = el.getAttribute(attr);\n if (value == null || !/^\\d+$/.test(value)) return undefined;\n const n = Number(value);\n return n < size ? n : undefined;\n}\n\n/**\n * Render markdown for the Editor, tagging each block with its source.\n * Returns `source: null` (plain rendering) when the source cannot be mapped\n * exactly: no DOM, or `\\r` line endings, which the lexer normalises away.\n */\nexport function markdownToEditorHtml(\n md: string,\n sanitize: (html: string) => string = (html) => html,\n): { html: string; source: MarkdownSource | null } {\n const plain = () => ({\n html: sanitize((marked.parse(md, { async: false }) as string).trim()),\n source: null,\n });\n if (typeof document === \"undefined\" || md.includes(\"\\r\")) return plain();\n\n const tokens = marked.lexer(md);\n const parts: string[] = [];\n const spans: { start: number; end: number; token: Token }[] = [];\n let cursor = 0;\n for (const token of tokens) {\n if (token.type === \"space\") continue;\n const at = md.indexOf(token.raw, cursor);\n if (at < 0) return plain();\n cursor = at + token.raw.length;\n\n const template = document.createElement(\"template\");\n template.innerHTML = marked.parser([token]);\n let nodes = Array.from(template.content.childNodes);\n const strayText = nodes.some((n) => n.nodeType === 3 && (n.textContent ?? \"\").trim() !== \"\");\n if (!nodes.some(isElement) && !strayText) {\n // Renders nothing visible (an HTML comment): its source stays in the gap.\n parts.push(template.innerHTML.trim());\n continue;\n }\n if (strayText) {\n const wrapper = document.createElement(\"div\");\n wrapper.append(...nodes);\n template.content.append(wrapper);\n nodes = [wrapper];\n }\n const id = spans.length;\n const elements = nodes.filter(isElement);\n for (const el of elements) el.setAttribute(BLOCK_ATTR, String(id));\n if (token.type === \"list\" && elements.length === 1) {\n const items = Array.from(elements[0]!.children).filter((c) => tagOf(c) === \"li\");\n if (items.length === (token as Tokens.List).items.length) {\n items.forEach((li, k) => li.setAttribute(ITEM_ATTR, String(k)));\n }\n }\n if (token.type === \"table\" && elements.length === 1) {\n const rows = tableRows(elements[0]!);\n if (rows.length === (token as Tokens.Table).rows.length + 1) {\n rows.forEach((tr, i) => tr.setAttribute(ROW_ATTR, String(i === 0 ? 0 : i + 1)));\n }\n }\n parts.push(template.innerHTML.trim());\n spans.push({ start: at, end: at + stripTrailingNewlines(token.raw).length, token });\n }\n\n const html = sanitize(parts.join(\"\\n\"));\n if (spans.length === 0) return { html, source: null };\n\n // Snapshot what the DOM will actually hold — after sanitising.\n const seeded = document.createElement(\"template\");\n seeded.innerHTML = html;\n const byId = new Map<number, Element[]>();\n for (const node of Array.from(seeded.content.childNodes)) {\n if (!isElement(node)) continue;\n const id = indexAttr(node, BLOCK_ATTR, spans.length);\n if (id === undefined) continue;\n byId.set(id, [...(byId.get(id) ?? []), node]);\n }\n\n const blocks: SourceBlock[] = spans.map((span, id) => {\n const elements = byId.get(id) ?? [];\n const block: SourceBlock = {\n raw: md.slice(span.start, span.end),\n snapshot: elements.map((el) => el.outerHTML).join(\"\"),\n elementCount: elements.length,\n };\n if (span.token.type === \"list\" && elements.length === 1) {\n block.list = sourceList(md, span.start, span.token as Tokens.List, elements[0]!);\n }\n if (span.token.type === \"table\" && elements.length === 1) {\n block.table = sourceTable(block.raw, span.token as Tokens.Table, elements[0]!);\n }\n return block;\n });\n const gaps = spans.map((span, i) => md.slice(span.end, spans[i + 1]?.start ?? md.length));\n return { html, source: { leading: md.slice(0, spans[0]!.start), blocks, gaps } };\n}\n\nfunction sourceList(md: string, start: number, token: Tokens.List, list: Element): SourceList | undefined {\n const lis = Array.from(list.children).filter((c) => tagOf(c) === \"li\");\n if (lis.length !== token.items.length || lis.length === 0) return undefined;\n const items: string[] = [];\n const bounds: [number, number][] = [];\n let cursor = start;\n for (const item of token.items) {\n const at = md.indexOf(item.raw, cursor);\n if (at < 0) return undefined;\n const body = stripTrailingNewlines(item.raw);\n items.push(body);\n bounds.push([at, at + body.length]);\n cursor = at + item.raw.length;\n }\n const itemGaps = bounds.slice(0, -1).map(([, end], k) => md.slice(end, bounds[k + 1]![0]));\n const first = items[0]!;\n return {\n bullet: /^\\s*([*+-])/.exec(first)?.[1] ?? \"-\",\n delimiter: /^\\s*\\d+([.)])/.exec(first)?.[1] ?? \".\",\n loose: token.loose,\n items,\n itemGaps,\n itemSnapshots: lis.map((li) => li.outerHTML),\n };\n}\n\nfunction sourceTable(raw: string, token: Tokens.Table, table: Element): SourceTable | undefined {\n const lines = raw.split(\"\\n\");\n const rows = tableRows(table);\n if (lines.length !== rows.length + 1) return undefined;\n const rowSnapshots = new Map<number, string>();\n for (const tr of rows) {\n const r = indexAttr(tr, ROW_ATTR, lines.length);\n if (r !== undefined) rowSnapshots.set(r, tr.outerHTML);\n }\n return { lines, columns: token.header.length, rowSnapshots };\n}\n\ntype Piece = { text: string; id?: number; kind: Block[\"kind\"] };\n\nfunction outerHtmlOf(nodes: readonly Node[]): string {\n return nodes.filter(isElement).map((el) => el.outerHTML).join(\"\");\n}\n\nfunction serializeWithSource(root: Node, src: MarkdownSource): string {\n // 1. Group the top-level nodes: runs sharing one block tag, and runs of untagged content.\n type Segment = { id?: number; nodes: Node[] };\n const segments: Segment[] = [];\n for (const node of Array.from(root.childNodes)) {\n const last = segments[segments.length - 1];\n if (node.nodeType === 3 && (node.textContent ?? \"\").trim() === \"\") {\n if (last && last.id === undefined) last.nodes.push(node);\n continue;\n }\n const id = isElement(node) ? indexAttr(node, BLOCK_ATTR, src.blocks.length) : undefined;\n if (last && last.id === id) last.nodes.push(node);\n else segments.push({ id, nodes: [node] });\n }\n\n // 2. The first segment per block that still matches its snapshot owns the source.\n const verbatim = new Map<number, number>();\n segments.forEach((seg, i) => {\n if (seg.id === undefined || verbatim.has(seg.id)) return;\n if (outerHtmlOf(seg.nodes) === src.blocks[seg.id]!.snapshot) verbatim.set(seg.id, i);\n });\n\n // 3. One piece per output block.\n const pieces: Piece[] = [];\n const owned = new Set<number>(verbatim.keys());\n const fresh = (nodes: readonly Node[]) => {\n for (const b of collectBlocks(nodes)) pieces.push({ text: b.text, kind: b.kind });\n };\n segments.forEach((seg, i) => {\n if (seg.id === undefined) return fresh(seg.nodes);\n const id = seg.id;\n const block = src.blocks[id]!;\n if (verbatim.get(id) === i) return void pieces.push({ text: block.raw, id, kind: \"block\" });\n if (owned.has(id)) return fresh(seg.nodes);\n owned.add(id);\n if (block.elementCount === 1) {\n // Enter at the edge of a block: the original survives whole beside its clone.\n const j = seg.nodes.findIndex((n) => isElement(n) && n.outerHTML === block.snapshot);\n if (j >= 0) {\n fresh(seg.nodes.slice(0, j));\n pieces.push({ text: block.raw, id, kind: \"block\" });\n fresh(seg.nodes.slice(j + 1));\n return;\n }\n }\n pieces.push({ text: serializeChangedBlock(seg.nodes, block), id, kind: \"block\" });\n });\n if (pieces.length === 0) return \"\";\n\n // 4. Join, reusing the original source between blocks that are still neighbours.\n const used = new Set<number>();\n const hasContent = (gap: string) => gap.trim() !== \"\";\n const separator = (a: Piece, b: Piece): string => {\n if (a.id !== undefined && b.id === a.id + 1) {\n used.add(a.id);\n return src.gaps[a.id]!;\n }\n const fallback = a.kind === \"div\" || b.kind === \"div\" ? \"\\n\" : \"\\n\\n\";\n if (a.id === undefined || used.has(a.id)) return fallback;\n // Blocks between a and b were deleted: keep any definitions or comments they sat beside.\n const upto = b.id !== undefined && b.id > a.id ? b.id : a.id + 1;\n const range: number[] = [];\n for (let g = a.id; g < upto; g++) if (!used.has(g)) range.push(g);\n for (const g of range) used.add(g);\n const kept = range.map((g) => src.gaps[g]!).filter(hasContent).map((g) => g.trim());\n if (kept.length > 0) return `\\n\\n${kept.join(\"\\n\\n\")}\\n\\n`;\n const own = src.gaps[a.id]!;\n return (own.match(/\\n/g)?.length ?? 0) >= 2 ? own : fallback;\n };\n\n let out = src.leading;\n pieces.forEach((piece, i) => {\n if (i > 0) out += separator(pieces[i - 1]!, piece);\n out += piece.text;\n });\n\n const lastId = src.blocks.length - 1;\n const trailing = src.gaps[lastId]!;\n if (pieces[pieces.length - 1]!.id === lastId && !used.has(lastId)) {\n used.add(lastId);\n out += trailing;\n } else {\n const orphans = src.gaps\n .filter((gap, g) => !used.has(g) && hasContent(gap))\n .map((gap) => gap.trim());\n if (orphans.length > 0) out += `\\n\\n${orphans.join(\"\\n\\n\")}`;\n out += /\\s*$/.exec(trailing)![0];\n }\n return out;\n}\n\nfunction serializeChangedBlock(nodes: readonly Node[], block: SourceBlock): string {\n const elements = nodes.filter(isElement);\n if (elements.length === 1) {\n const el = elements[0]!;\n const tag = tagOf(el);\n if (block.list && (tag === \"ul\" || tag === \"ol\")) return serializeListWithSource(el, block.list);\n if (block.table && tag === \"table\") return serializeTableWithSource(el, block.table);\n }\n return joinBlocks(collectBlocks(nodes));\n}\n\n/**\n * A changed list: untouched items keep their source; changed and new items\n * are serialised with the list's original marker. Between two items that are\n * still neighbours the original separator is kept; elsewhere the separator\n * last used in the list is repeated.\n */\nfunction serializeListWithSource(list: Element, info: SourceList): string {\n const ordered = tagOf(list) === \"ol\";\n const children = Array.from(list.children);\n const verbatim = new Map<number, Element>();\n for (const li of children) {\n if (tagOf(li) !== \"li\") continue;\n const k = indexAttr(li, ITEM_ATTR, info.items.length);\n if (k !== undefined && !verbatim.has(k) && li.outerHTML === info.itemSnapshots[k]) verbatim.set(k, li);\n }\n const owned = new Set<number>(verbatim.keys());\n const out: { text: string; k?: number }[] = [];\n let num = ordered ? (Number.parseInt(list.getAttribute(\"start\") ?? \"1\", 10) || 1) - 1 : 0;\n const numberOf = (k: number) => Number(/^\\s*(\\d+)/.exec(info.items[k]!)?.[1] ?? Number.NaN);\n for (const child of children) {\n const tag = tagOf(child);\n if (tag === \"ul\" || tag === \"ol\") {\n const nested = indent(serializeList(child), ordered ? 3 : 2);\n if (out.length > 0) out[out.length - 1]!.text += `\\n${nested}`;\n else out.push({ text: nested });\n continue;\n }\n if (tag !== \"li\") continue;\n const k = indexAttr(child, ITEM_ATTR, info.items.length);\n if (k !== undefined && verbatim.get(k) === child) {\n if (ordered && !Number.isNaN(numberOf(k))) num = numberOf(k);\n out.push({ text: info.items[k]!, k });\n continue;\n }\n const mine = k !== undefined && !owned.has(k) ? k : undefined;\n if (mine !== undefined) owned.add(mine);\n num = ordered && mine !== undefined && !Number.isNaN(numberOf(mine)) ? numberOf(mine) : num + 1;\n const marker = ordered ? `${num}${info.delimiter} ` : `${info.bullet} `;\n out.push({\n text: `${marker}${indent(serializeListItem(child), marker.length, true)}`.replace(/[ \\t]+$/, \"\"),\n k: mine,\n });\n }\n let last: string | undefined;\n let text = \"\";\n out.forEach((item, i) => {\n if (i > 0) {\n const prev = out[i - 1]!;\n const sep =\n prev.k !== undefined && item.k === prev.k + 1\n ? info.itemGaps[prev.k]!\n : (last ?? info.itemGaps[0] ?? (info.loose ? \"\\n\\n\" : \"\\n\"));\n last = sep;\n text += sep;\n }\n text += item.text;\n });\n return text;\n}\n\n/**\n * A changed table: untouched rows keep their source line, the alignment row\n * is kept while the column count is unchanged, edited and new rows are\n * serialised as GFM rows.\n */\nfunction serializeTableWithSource(table: Element, info: SourceTable): string {\n const rows = tableRows(table);\n if (rows.length === 0) return \"\";\n const claimed = new Set<number>();\n const lines: string[] = [];\n rows.forEach((tr, i) => {\n const r = indexAttr(tr, ROW_ATTR, info.lines.length);\n if (r !== undefined && r !== 1 && !claimed.has(r) && tr.outerHTML === info.rowSnapshots.get(r)) {\n claimed.add(r);\n lines.push(info.lines[r]!);\n } else {\n lines.push(serializeTableRow(tr));\n }\n if (i === 0) {\n lines.push(tableCells(tr).length === info.columns ? info.lines[1]! : tableDelimiterRow(tr));\n }\n });\n return lines.join(\"\\n\");\n}\n\ntype Block = { kind: \"block\" | \"div\" | \"inline\"; text: string; tag?: string };\n\nconst BLOCK_TAGS = new Set([\n \"address\", \"article\", \"aside\", \"blockquote\", \"details\", \"dialog\", \"div\", \"dl\",\n \"fieldset\", \"figcaption\", \"figure\", \"footer\", \"form\", \"h1\", \"h2\", \"h3\", \"h4\",\n \"h5\", \"h6\", \"header\", \"hgroup\", \"hr\", \"li\", \"main\", \"nav\", \"ol\", \"p\", \"pre\",\n \"section\", \"table\", \"ul\",\n]);\n\nfunction isElement(node: Node): node is Element {\n return node.nodeType === 1;\n}\n\nfunction tagOf(node: Node): string {\n return isElement(node) ? node.tagName.toLowerCase() : \"\";\n}\n\nfunction isCustomTag(tag: string): boolean {\n return tag !== \"\" && !STANDARD_HTML_TAGS.has(tag);\n}\n\nfunction isBlockNode(node: Node): boolean {\n return isElement(node) && BLOCK_TAGS.has(tagOf(node));\n}\n\n/** Split a node's children (or a list of sibling nodes) into blocks, serialising each. */\nfunction collectBlocks(parent: Node | readonly Node[]): Block[] {\n const blocks: Block[] = [];\n let run: Node[] = [];\n const flush = () => {\n if (run.length === 0) return;\n const text = serializeInlineRun(run);\n run = [];\n if (text.trim() !== \"\") blocks.push({ kind: \"inline\", text });\n };\n const nodes = Array.isArray(parent) ? parent : Array.from((parent as Node).childNodes);\n for (const child of nodes) {\n if (isBlockNode(child)) {\n flush();\n const el = child as Element;\n const tag = tagOf(el);\n blocks.push({ kind: tag === \"div\" ? \"div\" : \"block\", text: serializeBlock(el), tag });\n } else {\n run.push(child);\n }\n }\n flush();\n return blocks;\n}\n\n/**\n * Join blocks: a blank line between real blocks; a single newline next to a\n * `<div>`, which is the line contentEditable makes when Enter is pressed\n * outside any paragraph.\n */\nfunction joinBlocks(blocks: Block[]): string {\n let out = \"\";\n blocks.forEach((b, i) => {\n if (i > 0) {\n const prev = blocks[i - 1]!;\n out += prev.kind === \"div\" || b.kind === \"div\" ? \"\\n\" : \"\\n\\n\";\n }\n out += b.text;\n });\n return out;\n}\n\nfunction serializeBlocks(parent: Node): string {\n return joinBlocks(collectBlocks(parent));\n}\n\nfunction serializeBlock(el: Element): string {\n const tag = tagOf(el);\n switch (tag) {\n case \"h1\":\n case \"h2\":\n case \"h3\":\n case \"h4\":\n case \"h5\":\n case \"h6\":\n return `${\"#\".repeat(Number(tag[1]))} ${serializeInline(el).trim()}`;\n case \"p\":\n case \"div\":\n return trimEdgeNewlines(serializeInline(el, true));\n case \"ul\":\n case \"ol\":\n return serializeList(el);\n case \"pre\":\n return serializePre(el);\n case \"blockquote\":\n return serializeBlocks(el)\n .split(\"\\n\")\n .map((line) => (line === \"\" ? \">\" : `> ${line}`))\n .join(\"\\n\");\n case \"hr\":\n return \"---\";\n case \"table\":\n return serializeTable(el);\n default:\n return serializeBlocks(el);\n }\n}\n\n/** The rows of a table, in document order, excluding rows of nested tables. */\nfunction tableRows(table: Element): Element[] {\n return Array.from(table.querySelectorAll(\"tr\")).filter((tr) => tr.closest(\"table\") === table);\n}\n\nfunction tableCells(tr: Element): Element[] {\n return Array.from(tr.children).filter((c) => tagOf(c) === \"td\" || tagOf(c) === \"th\");\n}\n\n/**\n * A cell's inline content on one line. GFM cells cannot hold a line break, so\n * a typed one becomes a literal `<br>`; every `|` is escaped, including inside\n * code spans, which is how GFM spells a pipe in a cell.\n */\nfunction serializeTableCell(cell: Element): string {\n const children = Array.from(cell.childNodes);\n while (children.length > 0 && tagOf(children[children.length - 1]!) === \"br\") children.pop();\n return children\n .map((n) => (tagOf(n) === \"br\" ? \"<br>\" : serializeInlineNode(n)))\n .join(\"\")\n .replace(/\\n/g, \" \")\n .replace(/\\|/g, \"\\\\|\")\n .trim();\n}\n\nfunction serializeTableRow(tr: Element): string {\n return `| ${tableCells(tr).map(serializeTableCell).join(\" | \")} |`;\n}\n\nfunction tableDelimiterRow(header: Element): string {\n const marks = tableCells(header).map((cell) => {\n const align = cell.getAttribute(\"align\") || (cell as HTMLElement).style?.textAlign || \"\";\n if (align === \"left\") return \":---\";\n if (align === \"center\") return \":---:\";\n if (align === \"right\") return \"---:\";\n return \"---\";\n });\n return `| ${marks.join(\" | \")} |`;\n}\n\n/** A GFM table: header row, alignment row, body rows. */\nfunction serializeTable(table: Element): string {\n const rows = tableRows(table);\n if (rows.length === 0) return \"\";\n const lines = rows.map(serializeTableRow);\n lines.splice(1, 0, tableDelimiterRow(rows[0]!));\n return lines.join(\"\\n\");\n}\n\nfunction serializePre(el: Element): string {\n const code = el.querySelector(\"code\");\n const lang = /(?:^|\\s)language-(\\S+)/.exec(code?.getAttribute(\"class\") ?? \"\")?.[1] ?? \"\";\n const text = (code ?? el).textContent ?? \"\";\n return `\\`\\`\\`${lang}\\n${text.replace(/\\n$/, \"\")}\\n\\`\\`\\``;\n}\n\nfunction serializeList(list: Element): string {\n const ordered = tagOf(list) === \"ol\";\n let n = ordered ? Number.parseInt(list.getAttribute(\"start\") ?? \"1\", 10) || 1 : 0;\n const items = Array.from(list.children);\n // marked wraps item text in <p> only when the list is loose.\n const loose = items.some(\n (li) => tagOf(li) === \"li\" && Array.from(li.children).some((c) => tagOf(c) === \"p\"),\n );\n const out: string[] = [];\n for (const item of items) {\n const tag = tagOf(item);\n if (tag === \"ul\" || tag === \"ol\") {\n // A list nested directly in a list (contentEditable's indent) belongs\n // to the item before it.\n const nested = indent(serializeList(item), ordered ? 3 : 2);\n if (out.length > 0) out[out.length - 1] += `\\n${nested}`;\n else out.push(nested);\n continue;\n }\n if (tag !== \"li\") continue;\n const marker = ordered ? `${n++}. ` : \"- \";\n out.push(`${marker}${indent(serializeListItem(item), marker.length, true)}`.replace(/[ \\t]+$/, \"\"));\n }\n return out.join(loose ? \"\\n\\n\" : \"\\n\");\n}\n\n/** An item's content: a nested list sits on the next line, other blocks after a blank line. */\nfunction serializeListItem(li: Element): string {\n const blocks = collectBlocks(li);\n let out = \"\";\n blocks.forEach((b, i) => {\n if (i > 0) out += b.tag === \"ul\" || b.tag === \"ol\" ? \"\\n\" : \"\\n\\n\";\n out += b.text;\n });\n return out;\n}\n\n/** Indent every non-empty line (optionally skipping the first) by `width` spaces. */\nfunction indent(text: string, width: number, skipFirst = false): string {\n const pad = \" \".repeat(width);\n return text\n .split(\"\\n\")\n .map((line, i) => (line === \"\" || (skipFirst && i === 0) ? line : pad + line))\n .join(\"\\n\");\n}\n\nfunction trimEdgeNewlines(text: string): string {\n return text.replace(/^\\n+/, \"\").replace(/\\n+$/, \"\");\n}\n\nfunction serializeInlineRun(nodes: Node[]): string {\n return trimEdgeNewlines(nodes.map((n) => serializeInlineNode(n)).join(\"\"));\n}\n\n/**\n * Serialise an element's children as inline content. In a block, a trailing\n * `<br>` is the placeholder contentEditable keeps in an empty line, not a\n * line break the person typed.\n */\nfunction serializeInline(el: Element, dropTrailingBr = false): string {\n const children = Array.from(el.childNodes);\n if (dropTrailingBr) {\n while (children.length > 0) {\n const last = children[children.length - 1]!;\n if (tagOf(last) === \"br\") children.pop();\n else break;\n }\n }\n return children.map((n) => serializeInlineNode(n)).join(\"\");\n}\n\nfunction serializeInlineNode(node: Node): string {\n if (node.nodeType === 3) return (node.textContent ?? \"\").replace(/ /g, \" \");\n if (!isElement(node)) return \"\";\n const tag = tagOf(node);\n if (isCustomTag(tag)) return node.outerHTML;\n if (BLOCK_TAGS.has(tag)) return serializeBlock(node);\n const inner = () => serializeInline(node);\n switch (tag) {\n case \"br\":\n return \"\\n\";\n case \"strong\":\n case \"b\":\n return `**${inner()}**`;\n case \"em\":\n case \"i\":\n return `*${inner()}*`;\n case \"s\":\n case \"strike\":\n case \"del\":\n return `~~${inner()}~~`;\n case \"code\":\n return `\\`${node.textContent ?? \"\"}\\``;\n case \"a\": {\n const href = node.getAttribute(\"href\");\n if (href == null) return inner();\n const title = node.getAttribute(\"title\");\n return `[${inner()}](${href}${title ? ` \"${title}\"` : \"\"})`;\n }\n case \"img\": {\n const title = node.getAttribute(\"title\");\n return `![${node.getAttribute(\"alt\") ?? \"\"}](${node.getAttribute(\"src\") ?? \"\"}${title ? ` \"${title}\"` : \"\"})`;\n }\n default:\n return inner();\n }\n}\n\n/** String-rewrite converter, kept only for environments with no DOM. */\nfunction legacyHtmlToMarkdown(html: string): string {\n let md = html;\n\n // Block elements first\n md = md.replace(/<h1[^>]*>(.*?)<\\/h1>/gi, \"# $1\\n\");\n md = md.replace(/<h2[^>]*>(.*?)<\\/h2>/gi, \"## $1\\n\");\n md = md.replace(/<h3[^>]*>(.*?)<\\/h3>/gi, \"### $1\\n\");\n md = md.replace(/<h4[^>]*>(.*?)<\\/h4>/gi, \"#### $1\\n\");\n md = md.replace(/<h5[^>]*>(.*?)<\\/h5>/gi, \"##### $1\\n\");\n md = md.replace(/<h6[^>]*>(.*?)<\\/h6>/gi, \"###### $1\\n\");\n\n // Lists\n md = md.replace(/<li[^>]*>(.*?)<\\/li>/gi, \"- $1\\n\");\n md = md.replace(/<\\/?[uo]l[^>]*>/gi, \"\\n\");\n\n // Inline formatting\n md = md.replace(/<strong[^>]*>(.*?)<\\/strong>/gi, \"**$1**\");\n md = md.replace(/<b[^>]*>(.*?)<\\/b>/gi, \"**$1**\");\n md = md.replace(/<em[^>]*>(.*?)<\\/em>/gi, \"*$1*\");\n md = md.replace(/<i[^>]*>(.*?)<\\/i>/gi, \"*$1*\");\n md = md.replace(/<u[^>]*>(.*?)<\\/u>/gi, \"$1\");\n md = md.replace(/<s[^>]*>(.*?)<\\/s>/gi, \"~~$1~~\");\n md = md.replace(/<strike[^>]*>(.*?)<\\/strike>/gi, \"~~$1~~\");\n md = md.replace(/<del[^>]*>(.*?)<\\/del>/gi, \"~~$1~~\");\n md = md.replace(/<code[^>]*>(.*?)<\\/code>/gi, \"`$1`\");\n\n // Links\n md = md.replace(/<a[^>]*href=\"([^\"]*)\"[^>]*>(.*?)<\\/a>/gi, \"[$2]($1)\");\n\n // Blockquotes\n md = md.replace(/<blockquote[^>]*>(.*?)<\\/blockquote>/gi, \"> $1\\n\");\n\n // Line breaks and paragraphs\n md = md.replace(/<br\\s*\\/?>/gi, \"\\n\");\n md = md.replace(/<p[^>]*>(.*?)<\\/p>/gi, \"$1\\n\\n\");\n md = md.replace(/<div[^>]*>(.*?)<\\/div>/gi, \"$1\\n\");\n\n // Strip only standard HTML tags — preserve unknown/custom tags\n md = md.replace(/<\\/?([a-z][a-z0-9]*)\\b[^>]*>/gi, (match, tagName: string) => {\n return STANDARD_HTML_TAGS.has(tagName.toLowerCase()) ? \"\" : match;\n });\n\n // Decode common HTML entities. Decode &amp; LAST so we never double-unescape:\n // e.g. \"&amp;lt;\" must decode to the literal \"&lt;\", not to \"<\".\n md = md.replace(/&lt;/g, \"<\");\n md = md.replace(/&gt;/g, \">\");\n md = md.replace(/&quot;/g, '\"');\n md = md.replace(/&#39;/g, \"'\");\n md = md.replace(/&nbsp;/g, \" \");\n md = md.replace(/&amp;/g, \"&\");\n\n // Clean up extra whitespace\n md = md.replace(/\\n{3,}/g, \"\\n\\n\");\n md = md.trim();\n\n return md;\n}\n\n/**\n * Generate CSS classes to visually distinguish custom extension tags\n * inside the contentEditable area. Returns Tailwind-style descendant selectors.\n */\nexport function extensionEditorClasses(extensions: RenderExtension[]): string {\n if (extensions.length === 0) return \"\";\n\n return extensions\n .map((ext) => {\n const tag = ext.tag.toLowerCase();\n return [\n `[&_${tag}]:block`,\n `[&_${tag}]:my-2`,\n `[&_${tag}]:rounded-lg`,\n `[&_${tag}]:border`,\n `[&_${tag}]:border-dashed`,\n `[&_${tag}]:border-zinc-300`,\n `[&_${tag}]:bg-zinc-50`,\n `[&_${tag}]:p-3`,\n `[&_${tag}]:text-xs`,\n `dark:[&_${tag}]:border-zinc-600`,\n `dark:[&_${tag}]:bg-zinc-800/50`,\n ].join(\" \");\n })\n .join(\" \");\n}\n","import { useMemo } from \"react\";\nimport { sanitizeHtml } from \"../../utils/sanitize\";\nimport type { RenderExtension } from \"./extensions\";\nimport { parseSegments, mergeExtensions } from \"./extensions\";\n\ninterface RenderedContentProps {\n html: string;\n extensions?: RenderExtension[];\n /**\n * If true, html is rendered as-is without per-segment sanitization. Caller\n * (ContentRenderer) is expected to have already sanitized — or explicitly\n * opted out — at the top level.\n */\n unsafe?: boolean;\n}\n\n/**\n * Internal component that renders an HTML string with extension support.\n * Plain HTML segments use dangerouslySetInnerHTML; custom-tag segments\n * are rendered via their registered React component.\n */\nexport function RenderedContent({\n html,\n extensions: instanceExtensions,\n unsafe = false,\n}: RenderedContentProps) {\n const extensions = useMemo(\n () => mergeExtensions(instanceExtensions),\n [instanceExtensions],\n );\n\n const segments = useMemo(\n () => parseSegments(html, extensions),\n [html, extensions],\n );\n\n const renderHtml = (content: string): string =>\n unsafe ? content : sanitizeHtml(content);\n\n // Fast path: no extensions matched — single dangerouslySetInnerHTML\n if (segments.length === 1 && segments[0].type === \"html\") {\n return <div dangerouslySetInnerHTML={{ __html: renderHtml(segments[0].content) }} />;\n }\n\n // No content at all\n if (segments.length === 0) {\n return null;\n }\n\n return (\n <>\n {segments.map((segment, i) => {\n if (segment.type === \"html\") {\n return segment.content ? (\n <div key={i} dangerouslySetInnerHTML={{ __html: renderHtml(segment.content) }} />\n ) : null;\n }\n\n const ext = extensions.find(\n (e) => e.tag.toLowerCase() === segment.tag,\n );\n if (!ext) return null;\n\n const Component = ext.component;\n const isBlock = ext.block !== false;\n const Wrapper = isBlock ? \"div\" : \"span\";\n\n return (\n <Wrapper key={i} data-render-extension={segment.tag}>\n <Component content={segment.content} attributes={segment.attributes} />\n </Wrapper>\n );\n })}\n </>\n );\n}\n\nRenderedContent.displayName = \"RenderedContent\";\n","import { useMemo } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { markdownToRawHtml } from \"../../utils/markdown\";\nimport { sanitizeHtml } from \"../../utils/sanitize\";\nimport { proseClasses, detectFormat } from \"../Editor/editor.utils\";\nimport { mergeExtensions } from \"./extensions\";\nimport { RenderedContent } from \"./RenderedContent\";\nimport type { ContentRendererProps } from \"./ContentRenderer.types\";\n\nexport function ContentRenderer({\n value,\n format = \"auto\",\n lineSpacing = 1.6,\n className,\n extensions: instanceExtensions,\n unsafe = false,\n}: ContentRendererProps) {\n const extensions = useMemo(\n () => mergeExtensions(instanceExtensions),\n [instanceExtensions],\n );\n\n const html = useMemo(() => {\n // Guard nullish input: marked.parse throws \"input parameter is undefined\n // or null\", which (inside this useMemo during render) would crash the whole\n // React tree. Treat missing content as empty.\n const safe = value ?? \"\";\n const resolvedFormat = format === \"auto\" ? detectFormat(safe) : format;\n const raw = resolvedFormat === \"markdown\" ? markdownToRawHtml(safe) : safe;\n return unsafe ? raw : sanitizeHtml(raw);\n }, [value, format, unsafe]);\n\n const hasExtensions = extensions.length > 0;\n\n return (\n <div\n data-react-fancy-content-renderer=\"\"\n style={{ lineHeight: lineSpacing }}\n className={cn(\"text-sm\", proseClasses, className)}\n >\n {hasExtensions ? (\n <RenderedContent html={html} extensions={extensions} unsafe={unsafe} />\n ) : (\n <div dangerouslySetInnerHTML={{ __html: html }} />\n )}\n </div>\n );\n}\n\nContentRenderer.displayName = \"ContentRenderer\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/ContentRenderer/extensions.ts","../src/utils/markdown.ts","../src/components/Editor/editor.utils.ts","../src/components/ContentRenderer/RenderedContent.tsx","../src/components/ContentRenderer/ContentRenderer.tsx"],"names":["marked","sanitizeHtml","useMemo","jsx","Fragment","cn"],"mappings":"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","file":"chunk-MCQJFMDP.cjs","sourcesContent":["import type { ComponentType } from \"react\";\n\n/** Props passed to every render-extension component. */\nexport interface RenderExtensionProps {\n /** The inner content of the custom tag (raw string). */\n content: string;\n /** Parsed HTML attributes from the opening tag. */\n attributes: Record<string, string>;\n}\n\n/** Registers a custom tag with a React component for rendering. */\nexport interface RenderExtension {\n /** Tag name to match, e.g. \"questions\", \"thinking\". Case-insensitive. */\n tag: string;\n /** React component that renders the matched tag. */\n component: ComponentType<RenderExtensionProps>;\n /**\n * Whether this is a block-level element.\n * Block extensions are wrapped in a `<div>`, inline in a `<span>`.\n * @default true\n */\n block?: boolean;\n}\n\n/** A parsed segment — either raw HTML or a matched extension tag. */\nexport type ContentSegment =\n | { type: \"html\"; content: string }\n | { type: \"extension\"; tag: string; content: string; attributes: Record<string, string> };\n\n// ---------------------------------------------------------------------------\n// Global extension registry\n// ---------------------------------------------------------------------------\n\nconst globalRegistry: RenderExtension[] = [];\n\n/** Register a single render extension globally (available to all ContentRenderer and Editor instances). */\nexport function registerExtension(extension: RenderExtension): void {\n const idx = globalRegistry.findIndex(\n (e) => e.tag.toLowerCase() === extension.tag.toLowerCase(),\n );\n if (idx >= 0) {\n globalRegistry[idx] = extension;\n } else {\n globalRegistry.push(extension);\n }\n}\n\n/** Register multiple render extensions globally. */\nexport function registerExtensions(extensions: RenderExtension[]): void {\n for (const ext of extensions) {\n registerExtension(ext);\n }\n}\n\n/** Get a snapshot of the current global registry. */\nexport function getGlobalExtensions(): RenderExtension[] {\n return [...globalRegistry];\n}\n\n// ---------------------------------------------------------------------------\n// Parsing\n// ---------------------------------------------------------------------------\n\n/** Parse attributes from an opening tag string like `tag foo=\"bar\" baz=\"qux\"`. */\nfunction parseAttributes(attrString: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const re = /(\\w[\\w-]*)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|(\\S+)))?/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(attrString)) !== null) {\n attrs[m[1]] = m[2] ?? m[3] ?? m[4] ?? \"\";\n }\n return attrs;\n}\n\n/**\n * Split an HTML string into segments of plain HTML and matched extension tags.\n *\n * Handles:\n * - `<tag>content</tag>`\n * - `<tag attr=\"val\">content</tag>`\n * - Nested different-tags inside the content (preserved as raw HTML)\n * - Self-nesting of the same tag (greedy — matches outermost)\n */\nexport function parseSegments(\n html: string,\n extensions: RenderExtension[],\n): ContentSegment[] {\n if (extensions.length === 0) {\n return html ? [{ type: \"html\", content: html }] : [];\n }\n\n const tagNames = extensions.map((e) => e.tag).join(\"|\");\n // Match opening tag with optional attributes, then content, then closing tag.\n // Uses a non-greedy match for content — if same-tag nesting is needed the\n // consumer should use distinct tag names.\n const pattern = new RegExp(\n `<(${tagNames})((?:\\\\s+[^>]*)?)>([\\\\s\\\\S]*?)<\\\\/\\\\1>`,\n \"gi\",\n );\n\n const segments: ContentSegment[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = pattern.exec(html)) !== null) {\n // Push any HTML before this match\n if (match.index > lastIndex) {\n segments.push({ type: \"html\", content: html.slice(lastIndex, match.index) });\n }\n\n const tag = match[1].toLowerCase();\n const rawAttrs = match[2] ? match[2].trim() : \"\";\n const innerContent = match[3];\n\n segments.push({\n type: \"extension\",\n tag,\n content: innerContent,\n attributes: rawAttrs ? parseAttributes(rawAttrs) : {},\n });\n\n lastIndex = match.index + match[0].length;\n }\n\n // Push any trailing HTML\n if (lastIndex < html.length) {\n segments.push({ type: \"html\", content: html.slice(lastIndex) });\n }\n\n return segments;\n}\n\n/**\n * Merge per-instance extensions with the global registry.\n * Instance extensions override globals with the same tag name.\n */\nexport function mergeExtensions(\n instanceExtensions?: RenderExtension[],\n): RenderExtension[] {\n const globals = getGlobalExtensions();\n if (!instanceExtensions || instanceExtensions.length === 0) return globals;\n if (globals.length === 0) return instanceExtensions;\n\n const merged = [...globals];\n for (const ext of instanceExtensions) {\n const idx = merged.findIndex(\n (e) => e.tag.toLowerCase() === ext.tag.toLowerCase(),\n );\n if (idx >= 0) {\n merged[idx] = ext;\n } else {\n merged.push(ext);\n }\n }\n return merged;\n}\n","import { marked } from \"marked\";\nimport { sanitizeHtml, type SanitizeHtmlOptions } from \"./sanitize\";\n\n/**\n * Parse markdown to HTML WITHOUT sanitising. Internal: ContentRenderer's\n * `unsafe` path needs the raw output; everything public goes through\n * {@link renderMarkdown}.\n */\nexport function markdownToRawHtml(markdown: string | null | undefined): string {\n // marked.parse throws on nullish input; treat missing content as empty.\n return marked.parse(markdown ?? \"\", { async: false }) as string;\n}\n\n/**\n * Render markdown (GitHub-flavoured) to sanitised HTML — the same parser and\n * output `ContentRenderer` uses, so a host never has to import the parser\n * itself.\n *\n * With no `sanitize` options the default blocklist of {@link sanitizeHtml} is\n * applied; pass allowlist options to keep only what you list:\n *\n * ```ts\n * renderMarkdown(md, { allowedTags: [\"p\", \"strong\", \"a\"], allowedAttributes: [\"href\"] })\n * ```\n */\nexport function renderMarkdown(\n markdown: string,\n sanitize?: SanitizeHtmlOptions,\n): string {\n return sanitizeHtml(markdownToRawHtml(markdown), sanitize);\n}\n","import { marked, type Token, type Tokens } from \"marked\";\nimport type { RenderExtension } from \"../ContentRenderer/extensions\";\n\n/**\n * Shared prose typography classes for Editor.Content and ContentRenderer.\n * Hand-rolled since we don't depend on @tailwindcss/typography.\n */\nexport const proseClasses = [\n \"[&_h1]:text-2xl [&_h1]:font-bold [&_h1]:mt-4 [&_h1]:mb-2\",\n \"[&_h2]:text-xl [&_h2]:font-semibold [&_h2]:mt-3 [&_h2]:mb-2\",\n \"[&_h3]:text-lg [&_h3]:font-semibold [&_h3]:mt-2 [&_h3]:mb-1\",\n \"[&_p]:mb-2\",\n \"[&_a]:text-blue-500 [&_a]:underline\",\n \"[&_ul]:list-disc [&_ul]:pl-5 [&_ol]:list-decimal [&_ol]:pl-5\",\n \"[&_li]:mb-1\",\n \"[&_blockquote]:border-l-4 [&_blockquote]:border-zinc-300 [&_blockquote]:pl-4 [&_blockquote]:italic [&_blockquote]:text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] dark:[&_blockquote]:border-zinc-600 dark:[&_blockquote]:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))]\",\n \"[&_code]:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] [&_code]:px-1 [&_code]:rounded [&_code]:text-sm dark:[&_code]:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n \"[&_pre]:bg-zinc-950 [&_pre]:text-zinc-100 [&_pre]:p-4 [&_pre]:rounded-lg [&_pre]:overflow-x-auto\",\n \"[&_pre_code]:bg-transparent [&_pre_code]:px-0\",\n \"[&_strong]:font-bold [&_em]:italic\",\n].join(\" \");\n\nconst HTML_TAG_PATTERN = /<(p|div|br|h[1-6]|ul|ol|strong|em|a |img |table|pre|code|blockquote)[>\\s/]/i;\n\n/** Detect whether a string is likely HTML or Markdown. */\nexport function detectFormat(value: string): \"html\" | \"markdown\" {\n return HTML_TAG_PATTERN.test(value) ? \"html\" : \"markdown\";\n}\n\n/**\n * Build a set of known HTML tag names. Extension tags are excluded\n * so that the \"strip remaining tags\" step preserves them.\n */\nconst STANDARD_HTML_TAGS = new Set([\n \"a\", \"abbr\", \"address\", \"area\", \"article\", \"aside\", \"audio\",\n \"b\", \"base\", \"bdi\", \"bdo\", \"blockquote\", \"body\", \"br\", \"button\",\n \"canvas\", \"caption\", \"cite\", \"code\", \"col\", \"colgroup\",\n \"data\", \"datalist\", \"dd\", \"del\", \"details\", \"dfn\", \"dialog\", \"div\", \"dl\", \"dt\",\n \"em\", \"embed\",\n \"fieldset\", \"figcaption\", \"figure\", \"footer\", \"form\",\n \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"head\", \"header\", \"hgroup\", \"hr\", \"html\",\n \"i\", \"iframe\", \"img\", \"input\", \"ins\",\n \"kbd\",\n \"label\", \"legend\", \"li\", \"link\",\n \"main\", \"map\", \"mark\", \"menu\", \"meta\", \"meter\",\n \"nav\", \"noscript\",\n \"object\", \"ol\", \"optgroup\", \"option\", \"output\",\n \"p\", \"param\", \"picture\", \"pre\", \"progress\",\n \"q\",\n \"rp\", \"rt\", \"ruby\",\n \"s\", \"samp\", \"script\", \"section\", \"select\", \"slot\", \"small\", \"source\", \"span\",\n \"strike\", \"strong\", \"style\", \"sub\", \"summary\", \"sup\",\n \"table\", \"tbody\", \"td\", \"template\", \"textarea\", \"tfoot\", \"th\", \"thead\", \"time\", \"title\", \"tr\", \"track\",\n \"u\", \"ul\",\n \"var\", \"video\",\n \"wbr\",\n]);\n\n/**\n * HTML-to-Markdown converter for editor output.\n *\n * Walks the parsed DOM rather than rewriting the HTML string, because markup\n * structure is what decides markdown spacing and a string rewrite cannot see\n * it. The regex version this replaces turned every whitespace text node\n * between tags into a literal newline: marked emits `</li>\\n<li>`, so every\n * tight list came back with a blank line between items — and a fresh item\n * from Enter (which Chromium inserts with NO whitespace node) came back\n * without one, so an edit to the last item made the list loose after the\n * FIRST item only.\n *\n * Rules: whitespace-only text between blocks is formatting, not content.\n * Blocks are separated by a blank line; a list is tight unless one of its\n * items holds a `<p>` (marked's marker for a loose list), so loose lists stay\n * loose and tight lists stay tight. Custom extension tags are preserved as-is.\n *\n * Given the `source` map {@link markdownToEditorHtml} produced when the\n * document was loaded, output is source-preserving instead: every block the\n * person did not change is emitted from its original markdown, byte for byte.\n *\n * Without a DOM (SSR) it falls back to the older string rewrite.\n */\nexport function htmlToMarkdown(html: string, source?: MarkdownSource | null): string {\n if (typeof document === \"undefined\") return legacyHtmlToMarkdown(html);\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n if (source) return serializeWithSource(template.content, source);\n return serializeBlocks(template.content).replace(/^\\n+/, \"\").replace(/\\s+$/, \"\");\n}\n\n/* ------------------------------------------------------------------------ *\n * Source-preserving markdown\n *\n * When markdown is loaded, each top-level block (paragraph, heading, list,\n * table, code block, quote, rule, HTML block) is rendered on its own and its\n * elements are tagged `data-md-block=\"<n>\"`, with the block's ORIGINAL source\n * text and a snapshot of its rendered HTML kept beside it. List items get\n * `data-md-item`, table rows `data-md-row`, mapped the same way.\n *\n * On output, a block whose elements still serialise to the snapshot is\n * emitted from its source slice, exactly. Only changed or new blocks are\n * serialised from the DOM, and the source between two blocks that are still\n * neighbours (blank lines, link reference definitions, HTML comments) is\n * emitted verbatim, as is the text after the last block.\n *\n * Chromium clones the element it splits on Enter, attributes included, so a\n * tag can appear twice; the FIRST copy that still matches its snapshot owns\n * the source, and any other copy is treated as new content.\n * ------------------------------------------------------------------------ */\n\nconst BLOCK_ATTR = \"data-md-block\";\nconst ITEM_ATTR = \"data-md-item\";\nconst ROW_ATTR = \"data-md-row\";\n\ninterface SourceList {\n bullet: string;\n delimiter: string;\n loose: boolean;\n /** Each item's source, trailing newlines excluded. */\n items: string[];\n /** itemGaps[k]: the source between item k and item k + 1. */\n itemGaps: string[];\n itemSnapshots: string[];\n}\n\ninterface SourceTable {\n /** The table's source lines: header, alignment row, then one per body row. */\n lines: string[];\n columns: number;\n /** Snapshot per source line index (0 = header, 2.. = body rows). */\n rowSnapshots: Map<number, string>;\n}\n\ninterface SourceBlock {\n /** The block's source, trailing newlines excluded. */\n raw: string;\n /** Concatenated outerHTML of the block's rendered elements, as seeded. */\n snapshot: string;\n elementCount: number;\n list?: SourceList;\n table?: SourceTable;\n}\n\n/** The original source of a markdown document, mapped to the blocks rendered from it. */\nexport interface MarkdownSource {\n /** Source before the first block. */\n leading: string;\n blocks: SourceBlock[];\n /** gaps[i]: the source between block i and block i + 1, or the end of the document. */\n gaps: string[];\n}\n\nfunction stripTrailingNewlines(text: string): string {\n return text.replace(/\\n+$/, \"\");\n}\n\nfunction indexAttr(el: Element, attr: string, size: number): number | undefined {\n const value = el.getAttribute(attr);\n if (value == null || !/^\\d+$/.test(value)) return undefined;\n const n = Number(value);\n return n < size ? n : undefined;\n}\n\n/**\n * Render markdown for the Editor, tagging each block with its source.\n * Returns `source: null` (plain rendering) when the source cannot be mapped\n * exactly: no DOM, or `\\r` line endings, which the lexer normalises away.\n */\nexport function markdownToEditorHtml(\n md: string,\n sanitize: (html: string) => string = (html) => html,\n): { html: string; source: MarkdownSource | null } {\n const plain = () => ({\n html: sanitize((marked.parse(md, { async: false }) as string).trim()),\n source: null,\n });\n if (typeof document === \"undefined\" || md.includes(\"\\r\")) return plain();\n\n const tokens = marked.lexer(md);\n const parts: string[] = [];\n const spans: { start: number; end: number; token: Token }[] = [];\n let cursor = 0;\n for (const token of tokens) {\n if (token.type === \"space\") continue;\n const at = md.indexOf(token.raw, cursor);\n if (at < 0) return plain();\n cursor = at + token.raw.length;\n\n const template = document.createElement(\"template\");\n template.innerHTML = marked.parser([token]);\n let nodes = Array.from(template.content.childNodes);\n const strayText = nodes.some((n) => n.nodeType === 3 && (n.textContent ?? \"\").trim() !== \"\");\n if (!nodes.some(isElement) && !strayText) {\n // Renders nothing visible (an HTML comment): its source stays in the gap.\n parts.push(template.innerHTML.trim());\n continue;\n }\n if (strayText) {\n const wrapper = document.createElement(\"div\");\n wrapper.append(...nodes);\n template.content.append(wrapper);\n nodes = [wrapper];\n }\n const id = spans.length;\n const elements = nodes.filter(isElement);\n for (const el of elements) el.setAttribute(BLOCK_ATTR, String(id));\n if (token.type === \"list\" && elements.length === 1) {\n const items = Array.from(elements[0]!.children).filter((c) => tagOf(c) === \"li\");\n if (items.length === (token as Tokens.List).items.length) {\n items.forEach((li, k) => li.setAttribute(ITEM_ATTR, String(k)));\n }\n }\n if (token.type === \"table\" && elements.length === 1) {\n const rows = tableRows(elements[0]!);\n if (rows.length === (token as Tokens.Table).rows.length + 1) {\n rows.forEach((tr, i) => tr.setAttribute(ROW_ATTR, String(i === 0 ? 0 : i + 1)));\n }\n }\n parts.push(template.innerHTML.trim());\n spans.push({ start: at, end: at + stripTrailingNewlines(token.raw).length, token });\n }\n\n const html = sanitize(parts.join(\"\\n\"));\n if (spans.length === 0) return { html, source: null };\n\n // Snapshot what the DOM will actually hold — after sanitising.\n const seeded = document.createElement(\"template\");\n seeded.innerHTML = html;\n const byId = new Map<number, Element[]>();\n for (const node of Array.from(seeded.content.childNodes)) {\n if (!isElement(node)) continue;\n const id = indexAttr(node, BLOCK_ATTR, spans.length);\n if (id === undefined) continue;\n byId.set(id, [...(byId.get(id) ?? []), node]);\n }\n\n const blocks: SourceBlock[] = spans.map((span, id) => {\n const elements = byId.get(id) ?? [];\n const block: SourceBlock = {\n raw: md.slice(span.start, span.end),\n snapshot: elements.map((el) => el.outerHTML).join(\"\"),\n elementCount: elements.length,\n };\n if (span.token.type === \"list\" && elements.length === 1) {\n block.list = sourceList(md, span.start, span.token as Tokens.List, elements[0]!);\n }\n if (span.token.type === \"table\" && elements.length === 1) {\n block.table = sourceTable(block.raw, span.token as Tokens.Table, elements[0]!);\n }\n return block;\n });\n const gaps = spans.map((span, i) => md.slice(span.end, spans[i + 1]?.start ?? md.length));\n return { html, source: { leading: md.slice(0, spans[0]!.start), blocks, gaps } };\n}\n\nfunction sourceList(md: string, start: number, token: Tokens.List, list: Element): SourceList | undefined {\n const lis = Array.from(list.children).filter((c) => tagOf(c) === \"li\");\n if (lis.length !== token.items.length || lis.length === 0) return undefined;\n const items: string[] = [];\n const bounds: [number, number][] = [];\n let cursor = start;\n for (const item of token.items) {\n const at = md.indexOf(item.raw, cursor);\n if (at < 0) return undefined;\n const body = stripTrailingNewlines(item.raw);\n items.push(body);\n bounds.push([at, at + body.length]);\n cursor = at + item.raw.length;\n }\n const itemGaps = bounds.slice(0, -1).map(([, end], k) => md.slice(end, bounds[k + 1]![0]));\n const first = items[0]!;\n return {\n bullet: /^\\s*([*+-])/.exec(first)?.[1] ?? \"-\",\n delimiter: /^\\s*\\d+([.)])/.exec(first)?.[1] ?? \".\",\n loose: token.loose,\n items,\n itemGaps,\n itemSnapshots: lis.map((li) => li.outerHTML),\n };\n}\n\nfunction sourceTable(raw: string, token: Tokens.Table, table: Element): SourceTable | undefined {\n const lines = raw.split(\"\\n\");\n const rows = tableRows(table);\n if (lines.length !== rows.length + 1) return undefined;\n const rowSnapshots = new Map<number, string>();\n for (const tr of rows) {\n const r = indexAttr(tr, ROW_ATTR, lines.length);\n if (r !== undefined) rowSnapshots.set(r, tr.outerHTML);\n }\n return { lines, columns: token.header.length, rowSnapshots };\n}\n\ntype Piece = { text: string; id?: number; kind: Block[\"kind\"] };\n\nfunction outerHtmlOf(nodes: readonly Node[]): string {\n return nodes.filter(isElement).map((el) => el.outerHTML).join(\"\");\n}\n\nfunction serializeWithSource(root: Node, src: MarkdownSource): string {\n // 1. Group the top-level nodes: runs sharing one block tag, and runs of untagged content.\n type Segment = { id?: number; nodes: Node[] };\n const segments: Segment[] = [];\n for (const node of Array.from(root.childNodes)) {\n const last = segments[segments.length - 1];\n if (node.nodeType === 3 && (node.textContent ?? \"\").trim() === \"\") {\n if (last && last.id === undefined) last.nodes.push(node);\n continue;\n }\n const id = isElement(node) ? indexAttr(node, BLOCK_ATTR, src.blocks.length) : undefined;\n if (last && last.id === id) last.nodes.push(node);\n else segments.push({ id, nodes: [node] });\n }\n\n // 2. The first segment per block that still matches its snapshot owns the source.\n const verbatim = new Map<number, number>();\n segments.forEach((seg, i) => {\n if (seg.id === undefined || verbatim.has(seg.id)) return;\n if (outerHtmlOf(seg.nodes) === src.blocks[seg.id]!.snapshot) verbatim.set(seg.id, i);\n });\n\n // 3. One piece per output block.\n const pieces: Piece[] = [];\n const owned = new Set<number>(verbatim.keys());\n const fresh = (nodes: readonly Node[]) => {\n for (const b of collectBlocks(nodes)) pieces.push({ text: b.text, kind: b.kind });\n };\n segments.forEach((seg, i) => {\n if (seg.id === undefined) return fresh(seg.nodes);\n const id = seg.id;\n const block = src.blocks[id]!;\n if (verbatim.get(id) === i) return void pieces.push({ text: block.raw, id, kind: \"block\" });\n if (owned.has(id)) return fresh(seg.nodes);\n owned.add(id);\n if (block.elementCount === 1) {\n // Enter at the edge of a block: the original survives whole beside its clone.\n const j = seg.nodes.findIndex((n) => isElement(n) && n.outerHTML === block.snapshot);\n if (j >= 0) {\n fresh(seg.nodes.slice(0, j));\n pieces.push({ text: block.raw, id, kind: \"block\" });\n fresh(seg.nodes.slice(j + 1));\n return;\n }\n }\n pieces.push({ text: serializeChangedBlock(seg.nodes, block), id, kind: \"block\" });\n });\n if (pieces.length === 0) return \"\";\n\n // 4. Join, reusing the original source between blocks that are still neighbours.\n const used = new Set<number>();\n const hasContent = (gap: string) => gap.trim() !== \"\";\n const separator = (a: Piece, b: Piece): string => {\n if (a.id !== undefined && b.id === a.id + 1) {\n used.add(a.id);\n return src.gaps[a.id]!;\n }\n const fallback = a.kind === \"div\" || b.kind === \"div\" ? \"\\n\" : \"\\n\\n\";\n if (a.id === undefined || used.has(a.id)) return fallback;\n // Blocks between a and b were deleted: keep any definitions or comments they sat beside.\n const upto = b.id !== undefined && b.id > a.id ? b.id : a.id + 1;\n const range: number[] = [];\n for (let g = a.id; g < upto; g++) if (!used.has(g)) range.push(g);\n for (const g of range) used.add(g);\n const kept = range.map((g) => src.gaps[g]!).filter(hasContent).map((g) => g.trim());\n if (kept.length > 0) return `\\n\\n${kept.join(\"\\n\\n\")}\\n\\n`;\n const own = src.gaps[a.id]!;\n return (own.match(/\\n/g)?.length ?? 0) >= 2 ? own : fallback;\n };\n\n let out = src.leading;\n pieces.forEach((piece, i) => {\n if (i > 0) out += separator(pieces[i - 1]!, piece);\n out += piece.text;\n });\n\n const lastId = src.blocks.length - 1;\n const trailing = src.gaps[lastId]!;\n if (pieces[pieces.length - 1]!.id === lastId && !used.has(lastId)) {\n used.add(lastId);\n out += trailing;\n } else {\n const orphans = src.gaps\n .filter((gap, g) => !used.has(g) && hasContent(gap))\n .map((gap) => gap.trim());\n if (orphans.length > 0) out += `\\n\\n${orphans.join(\"\\n\\n\")}`;\n out += /\\s*$/.exec(trailing)![0];\n }\n return out;\n}\n\nfunction serializeChangedBlock(nodes: readonly Node[], block: SourceBlock): string {\n const elements = nodes.filter(isElement);\n if (elements.length === 1) {\n const el = elements[0]!;\n const tag = tagOf(el);\n if (block.list && (tag === \"ul\" || tag === \"ol\")) return serializeListWithSource(el, block.list);\n if (block.table && tag === \"table\") return serializeTableWithSource(el, block.table);\n }\n return joinBlocks(collectBlocks(nodes));\n}\n\n/**\n * A changed list: untouched items keep their source; changed and new items\n * are serialised with the list's original marker. Between two items that are\n * still neighbours the original separator is kept; elsewhere the separator\n * last used in the list is repeated.\n */\nfunction serializeListWithSource(list: Element, info: SourceList): string {\n const ordered = tagOf(list) === \"ol\";\n const children = Array.from(list.children);\n const verbatim = new Map<number, Element>();\n for (const li of children) {\n if (tagOf(li) !== \"li\") continue;\n const k = indexAttr(li, ITEM_ATTR, info.items.length);\n if (k !== undefined && !verbatim.has(k) && li.outerHTML === info.itemSnapshots[k]) verbatim.set(k, li);\n }\n const owned = new Set<number>(verbatim.keys());\n const out: { text: string; k?: number }[] = [];\n let num = ordered ? (Number.parseInt(list.getAttribute(\"start\") ?? \"1\", 10) || 1) - 1 : 0;\n const numberOf = (k: number) => Number(/^\\s*(\\d+)/.exec(info.items[k]!)?.[1] ?? Number.NaN);\n for (const child of children) {\n const tag = tagOf(child);\n if (tag === \"ul\" || tag === \"ol\") {\n const nested = indent(serializeList(child), ordered ? 3 : 2);\n if (out.length > 0) out[out.length - 1]!.text += `\\n${nested}`;\n else out.push({ text: nested });\n continue;\n }\n if (tag !== \"li\") continue;\n const k = indexAttr(child, ITEM_ATTR, info.items.length);\n if (k !== undefined && verbatim.get(k) === child) {\n if (ordered && !Number.isNaN(numberOf(k))) num = numberOf(k);\n out.push({ text: info.items[k]!, k });\n continue;\n }\n const mine = k !== undefined && !owned.has(k) ? k : undefined;\n if (mine !== undefined) owned.add(mine);\n num = ordered && mine !== undefined && !Number.isNaN(numberOf(mine)) ? numberOf(mine) : num + 1;\n const marker = ordered ? `${num}${info.delimiter} ` : `${info.bullet} `;\n out.push({\n text: `${marker}${indent(serializeListItem(child), marker.length, true)}`.replace(/[ \\t]+$/, \"\"),\n k: mine,\n });\n }\n let last: string | undefined;\n let text = \"\";\n out.forEach((item, i) => {\n if (i > 0) {\n const prev = out[i - 1]!;\n const sep =\n prev.k !== undefined && item.k === prev.k + 1\n ? info.itemGaps[prev.k]!\n : (last ?? info.itemGaps[0] ?? (info.loose ? \"\\n\\n\" : \"\\n\"));\n last = sep;\n text += sep;\n }\n text += item.text;\n });\n return text;\n}\n\n/**\n * A changed table: untouched rows keep their source line, the alignment row\n * is kept while the column count is unchanged, edited and new rows are\n * serialised as GFM rows.\n */\nfunction serializeTableWithSource(table: Element, info: SourceTable): string {\n const rows = tableRows(table);\n if (rows.length === 0) return \"\";\n const claimed = new Set<number>();\n const lines: string[] = [];\n rows.forEach((tr, i) => {\n const r = indexAttr(tr, ROW_ATTR, info.lines.length);\n if (r !== undefined && r !== 1 && !claimed.has(r) && tr.outerHTML === info.rowSnapshots.get(r)) {\n claimed.add(r);\n lines.push(info.lines[r]!);\n } else {\n lines.push(serializeTableRow(tr));\n }\n if (i === 0) {\n lines.push(tableCells(tr).length === info.columns ? info.lines[1]! : tableDelimiterRow(tr));\n }\n });\n return lines.join(\"\\n\");\n}\n\ntype Block = { kind: \"block\" | \"div\" | \"inline\"; text: string; tag?: string };\n\nconst BLOCK_TAGS = new Set([\n \"address\", \"article\", \"aside\", \"blockquote\", \"details\", \"dialog\", \"div\", \"dl\",\n \"fieldset\", \"figcaption\", \"figure\", \"footer\", \"form\", \"h1\", \"h2\", \"h3\", \"h4\",\n \"h5\", \"h6\", \"header\", \"hgroup\", \"hr\", \"li\", \"main\", \"nav\", \"ol\", \"p\", \"pre\",\n \"section\", \"table\", \"ul\",\n]);\n\nfunction isElement(node: Node): node is Element {\n return node.nodeType === 1;\n}\n\nfunction tagOf(node: Node): string {\n return isElement(node) ? node.tagName.toLowerCase() : \"\";\n}\n\nfunction isCustomTag(tag: string): boolean {\n return tag !== \"\" && !STANDARD_HTML_TAGS.has(tag);\n}\n\nfunction isBlockNode(node: Node): boolean {\n return isElement(node) && BLOCK_TAGS.has(tagOf(node));\n}\n\n/** Split a node's children (or a list of sibling nodes) into blocks, serialising each. */\nfunction collectBlocks(parent: Node | readonly Node[]): Block[] {\n const blocks: Block[] = [];\n let run: Node[] = [];\n const flush = () => {\n if (run.length === 0) return;\n const text = serializeInlineRun(run);\n run = [];\n if (text.trim() !== \"\") blocks.push({ kind: \"inline\", text });\n };\n const nodes = Array.isArray(parent) ? parent : Array.from((parent as Node).childNodes);\n for (const child of nodes) {\n if (isBlockNode(child)) {\n flush();\n const el = child as Element;\n const tag = tagOf(el);\n blocks.push({ kind: tag === \"div\" ? \"div\" : \"block\", text: serializeBlock(el), tag });\n } else {\n run.push(child);\n }\n }\n flush();\n return blocks;\n}\n\n/**\n * Join blocks: a blank line between real blocks; a single newline next to a\n * `<div>`, which is the line contentEditable makes when Enter is pressed\n * outside any paragraph.\n */\nfunction joinBlocks(blocks: Block[]): string {\n let out = \"\";\n blocks.forEach((b, i) => {\n if (i > 0) {\n const prev = blocks[i - 1]!;\n out += prev.kind === \"div\" || b.kind === \"div\" ? \"\\n\" : \"\\n\\n\";\n }\n out += b.text;\n });\n return out;\n}\n\nfunction serializeBlocks(parent: Node): string {\n return joinBlocks(collectBlocks(parent));\n}\n\nfunction serializeBlock(el: Element): string {\n const tag = tagOf(el);\n switch (tag) {\n case \"h1\":\n case \"h2\":\n case \"h3\":\n case \"h4\":\n case \"h5\":\n case \"h6\":\n return `${\"#\".repeat(Number(tag[1]))} ${serializeInline(el).trim()}`;\n case \"p\":\n case \"div\":\n return trimEdgeNewlines(serializeInline(el, true));\n case \"ul\":\n case \"ol\":\n return serializeList(el);\n case \"pre\":\n return serializePre(el);\n case \"blockquote\":\n return serializeBlocks(el)\n .split(\"\\n\")\n .map((line) => (line === \"\" ? \">\" : `> ${line}`))\n .join(\"\\n\");\n case \"hr\":\n return \"---\";\n case \"table\":\n return serializeTable(el);\n default:\n return serializeBlocks(el);\n }\n}\n\n/** The rows of a table, in document order, excluding rows of nested tables. */\nfunction tableRows(table: Element): Element[] {\n return Array.from(table.querySelectorAll(\"tr\")).filter((tr) => tr.closest(\"table\") === table);\n}\n\nfunction tableCells(tr: Element): Element[] {\n return Array.from(tr.children).filter((c) => tagOf(c) === \"td\" || tagOf(c) === \"th\");\n}\n\n/**\n * A cell's inline content on one line. GFM cells cannot hold a line break, so\n * a typed one becomes a literal `<br>`; every `|` is escaped, including inside\n * code spans, which is how GFM spells a pipe in a cell.\n */\nfunction serializeTableCell(cell: Element): string {\n const children = Array.from(cell.childNodes);\n while (children.length > 0 && tagOf(children[children.length - 1]!) === \"br\") children.pop();\n return children\n .map((n) => (tagOf(n) === \"br\" ? \"<br>\" : serializeInlineNode(n)))\n .join(\"\")\n .replace(/\\n/g, \" \")\n .replace(/\\|/g, \"\\\\|\")\n .trim();\n}\n\nfunction serializeTableRow(tr: Element): string {\n return `| ${tableCells(tr).map(serializeTableCell).join(\" | \")} |`;\n}\n\nfunction tableDelimiterRow(header: Element): string {\n const marks = tableCells(header).map((cell) => {\n const align = cell.getAttribute(\"align\") || (cell as HTMLElement).style?.textAlign || \"\";\n if (align === \"left\") return \":---\";\n if (align === \"center\") return \":---:\";\n if (align === \"right\") return \"---:\";\n return \"---\";\n });\n return `| ${marks.join(\" | \")} |`;\n}\n\n/** A GFM table: header row, alignment row, body rows. */\nfunction serializeTable(table: Element): string {\n const rows = tableRows(table);\n if (rows.length === 0) return \"\";\n const lines = rows.map(serializeTableRow);\n lines.splice(1, 0, tableDelimiterRow(rows[0]!));\n return lines.join(\"\\n\");\n}\n\nfunction serializePre(el: Element): string {\n const code = el.querySelector(\"code\");\n const lang = /(?:^|\\s)language-(\\S+)/.exec(code?.getAttribute(\"class\") ?? \"\")?.[1] ?? \"\";\n const text = (code ?? el).textContent ?? \"\";\n return `\\`\\`\\`${lang}\\n${text.replace(/\\n$/, \"\")}\\n\\`\\`\\``;\n}\n\nfunction serializeList(list: Element): string {\n const ordered = tagOf(list) === \"ol\";\n let n = ordered ? Number.parseInt(list.getAttribute(\"start\") ?? \"1\", 10) || 1 : 0;\n const items = Array.from(list.children);\n // marked wraps item text in <p> only when the list is loose.\n const loose = items.some(\n (li) => tagOf(li) === \"li\" && Array.from(li.children).some((c) => tagOf(c) === \"p\"),\n );\n const out: string[] = [];\n for (const item of items) {\n const tag = tagOf(item);\n if (tag === \"ul\" || tag === \"ol\") {\n // A list nested directly in a list (contentEditable's indent) belongs\n // to the item before it.\n const nested = indent(serializeList(item), ordered ? 3 : 2);\n if (out.length > 0) out[out.length - 1] += `\\n${nested}`;\n else out.push(nested);\n continue;\n }\n if (tag !== \"li\") continue;\n const marker = ordered ? `${n++}. ` : \"- \";\n out.push(`${marker}${indent(serializeListItem(item), marker.length, true)}`.replace(/[ \\t]+$/, \"\"));\n }\n return out.join(loose ? \"\\n\\n\" : \"\\n\");\n}\n\n/** An item's content: a nested list sits on the next line, other blocks after a blank line. */\nfunction serializeListItem(li: Element): string {\n const blocks = collectBlocks(li);\n let out = \"\";\n blocks.forEach((b, i) => {\n if (i > 0) out += b.tag === \"ul\" || b.tag === \"ol\" ? \"\\n\" : \"\\n\\n\";\n out += b.text;\n });\n return out;\n}\n\n/** Indent every non-empty line (optionally skipping the first) by `width` spaces. */\nfunction indent(text: string, width: number, skipFirst = false): string {\n const pad = \" \".repeat(width);\n return text\n .split(\"\\n\")\n .map((line, i) => (line === \"\" || (skipFirst && i === 0) ? line : pad + line))\n .join(\"\\n\");\n}\n\nfunction trimEdgeNewlines(text: string): string {\n return text.replace(/^\\n+/, \"\").replace(/\\n+$/, \"\");\n}\n\nfunction serializeInlineRun(nodes: Node[]): string {\n return trimEdgeNewlines(nodes.map((n) => serializeInlineNode(n)).join(\"\"));\n}\n\n/**\n * Serialise an element's children as inline content. In a block, a trailing\n * `<br>` is the placeholder contentEditable keeps in an empty line, not a\n * line break the person typed.\n */\nfunction serializeInline(el: Element, dropTrailingBr = false): string {\n const children = Array.from(el.childNodes);\n if (dropTrailingBr) {\n while (children.length > 0) {\n const last = children[children.length - 1]!;\n if (tagOf(last) === \"br\") children.pop();\n else break;\n }\n }\n return children.map((n) => serializeInlineNode(n)).join(\"\");\n}\n\nfunction serializeInlineNode(node: Node): string {\n if (node.nodeType === 3) return (node.textContent ?? \"\").replace(/ /g, \" \");\n if (!isElement(node)) return \"\";\n const tag = tagOf(node);\n if (isCustomTag(tag)) return node.outerHTML;\n if (BLOCK_TAGS.has(tag)) return serializeBlock(node);\n const inner = () => serializeInline(node);\n switch (tag) {\n case \"br\":\n return \"\\n\";\n case \"strong\":\n case \"b\":\n return `**${inner()}**`;\n case \"em\":\n case \"i\":\n return `*${inner()}*`;\n case \"s\":\n case \"strike\":\n case \"del\":\n return `~~${inner()}~~`;\n case \"code\":\n return `\\`${node.textContent ?? \"\"}\\``;\n case \"a\": {\n const href = node.getAttribute(\"href\");\n if (href == null) return inner();\n const title = node.getAttribute(\"title\");\n return `[${inner()}](${href}${title ? ` \"${title}\"` : \"\"})`;\n }\n case \"img\": {\n const title = node.getAttribute(\"title\");\n return `![${node.getAttribute(\"alt\") ?? \"\"}](${node.getAttribute(\"src\") ?? \"\"}${title ? ` \"${title}\"` : \"\"})`;\n }\n default:\n return inner();\n }\n}\n\n/** String-rewrite converter, kept only for environments with no DOM. */\nfunction legacyHtmlToMarkdown(html: string): string {\n let md = html;\n\n // Block elements first\n md = md.replace(/<h1[^>]*>(.*?)<\\/h1>/gi, \"# $1\\n\");\n md = md.replace(/<h2[^>]*>(.*?)<\\/h2>/gi, \"## $1\\n\");\n md = md.replace(/<h3[^>]*>(.*?)<\\/h3>/gi, \"### $1\\n\");\n md = md.replace(/<h4[^>]*>(.*?)<\\/h4>/gi, \"#### $1\\n\");\n md = md.replace(/<h5[^>]*>(.*?)<\\/h5>/gi, \"##### $1\\n\");\n md = md.replace(/<h6[^>]*>(.*?)<\\/h6>/gi, \"###### $1\\n\");\n\n // Lists\n md = md.replace(/<li[^>]*>(.*?)<\\/li>/gi, \"- $1\\n\");\n md = md.replace(/<\\/?[uo]l[^>]*>/gi, \"\\n\");\n\n // Inline formatting\n md = md.replace(/<strong[^>]*>(.*?)<\\/strong>/gi, \"**$1**\");\n md = md.replace(/<b[^>]*>(.*?)<\\/b>/gi, \"**$1**\");\n md = md.replace(/<em[^>]*>(.*?)<\\/em>/gi, \"*$1*\");\n md = md.replace(/<i[^>]*>(.*?)<\\/i>/gi, \"*$1*\");\n md = md.replace(/<u[^>]*>(.*?)<\\/u>/gi, \"$1\");\n md = md.replace(/<s[^>]*>(.*?)<\\/s>/gi, \"~~$1~~\");\n md = md.replace(/<strike[^>]*>(.*?)<\\/strike>/gi, \"~~$1~~\");\n md = md.replace(/<del[^>]*>(.*?)<\\/del>/gi, \"~~$1~~\");\n md = md.replace(/<code[^>]*>(.*?)<\\/code>/gi, \"`$1`\");\n\n // Links\n md = md.replace(/<a[^>]*href=\"([^\"]*)\"[^>]*>(.*?)<\\/a>/gi, \"[$2]($1)\");\n\n // Blockquotes\n md = md.replace(/<blockquote[^>]*>(.*?)<\\/blockquote>/gi, \"> $1\\n\");\n\n // Line breaks and paragraphs\n md = md.replace(/<br\\s*\\/?>/gi, \"\\n\");\n md = md.replace(/<p[^>]*>(.*?)<\\/p>/gi, \"$1\\n\\n\");\n md = md.replace(/<div[^>]*>(.*?)<\\/div>/gi, \"$1\\n\");\n\n // Strip only standard HTML tags — preserve unknown/custom tags\n md = md.replace(/<\\/?([a-z][a-z0-9]*)\\b[^>]*>/gi, (match, tagName: string) => {\n return STANDARD_HTML_TAGS.has(tagName.toLowerCase()) ? \"\" : match;\n });\n\n // Decode common HTML entities. Decode &amp; LAST so we never double-unescape:\n // e.g. \"&amp;lt;\" must decode to the literal \"&lt;\", not to \"<\".\n md = md.replace(/&lt;/g, \"<\");\n md = md.replace(/&gt;/g, \">\");\n md = md.replace(/&quot;/g, '\"');\n md = md.replace(/&#39;/g, \"'\");\n md = md.replace(/&nbsp;/g, \" \");\n md = md.replace(/&amp;/g, \"&\");\n\n // Clean up extra whitespace\n md = md.replace(/\\n{3,}/g, \"\\n\\n\");\n md = md.trim();\n\n return md;\n}\n\n/**\n * Generate CSS classes to visually distinguish custom extension tags\n * inside the contentEditable area. Returns Tailwind-style descendant selectors.\n */\nexport function extensionEditorClasses(extensions: RenderExtension[]): string {\n if (extensions.length === 0) return \"\";\n\n return extensions\n .map((ext) => {\n const tag = ext.tag.toLowerCase();\n return [\n `[&_${tag}]:block`,\n `[&_${tag}]:my-2`,\n `[&_${tag}]:rounded-lg`,\n `[&_${tag}]:border`,\n `[&_${tag}]:border-dashed`,\n `[&_${tag}]:border-zinc-300`,\n `[&_${tag}]:bg-zinc-50`,\n `[&_${tag}]:p-3`,\n `[&_${tag}]:text-xs`,\n `dark:[&_${tag}]:border-zinc-600`,\n `dark:[&_${tag}]:bg-zinc-800/50`,\n ].join(\" \");\n })\n .join(\" \");\n}\n","import { useMemo } from \"react\";\nimport { sanitizeHtml } from \"../../utils/sanitize\";\nimport type { RenderExtension } from \"./extensions\";\nimport { parseSegments, mergeExtensions } from \"./extensions\";\n\ninterface RenderedContentProps {\n html: string;\n extensions?: RenderExtension[];\n /**\n * If true, html is rendered as-is without per-segment sanitization. Caller\n * (ContentRenderer) is expected to have already sanitized — or explicitly\n * opted out — at the top level.\n */\n unsafe?: boolean;\n}\n\n/**\n * Internal component that renders an HTML string with extension support.\n * Plain HTML segments use dangerouslySetInnerHTML; custom-tag segments\n * are rendered via their registered React component.\n */\nexport function RenderedContent({\n html,\n extensions: instanceExtensions,\n unsafe = false,\n}: RenderedContentProps) {\n const extensions = useMemo(\n () => mergeExtensions(instanceExtensions),\n [instanceExtensions],\n );\n\n const segments = useMemo(\n () => parseSegments(html, extensions),\n [html, extensions],\n );\n\n const renderHtml = (content: string): string =>\n unsafe ? content : sanitizeHtml(content);\n\n // Fast path: no extensions matched — single dangerouslySetInnerHTML\n if (segments.length === 1 && segments[0].type === \"html\") {\n return <div dangerouslySetInnerHTML={{ __html: renderHtml(segments[0].content) }} />;\n }\n\n // No content at all\n if (segments.length === 0) {\n return null;\n }\n\n return (\n <>\n {segments.map((segment, i) => {\n if (segment.type === \"html\") {\n return segment.content ? (\n <div key={i} dangerouslySetInnerHTML={{ __html: renderHtml(segment.content) }} />\n ) : null;\n }\n\n const ext = extensions.find(\n (e) => e.tag.toLowerCase() === segment.tag,\n );\n if (!ext) return null;\n\n const Component = ext.component;\n const isBlock = ext.block !== false;\n const Wrapper = isBlock ? \"div\" : \"span\";\n\n return (\n <Wrapper key={i} data-render-extension={segment.tag}>\n <Component content={segment.content} attributes={segment.attributes} />\n </Wrapper>\n );\n })}\n </>\n );\n}\n\nRenderedContent.displayName = \"RenderedContent\";\n","import { useMemo } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { markdownToRawHtml } from \"../../utils/markdown\";\nimport { sanitizeHtml } from \"../../utils/sanitize\";\nimport { proseClasses, detectFormat } from \"../Editor/editor.utils\";\nimport { mergeExtensions } from \"./extensions\";\nimport { RenderedContent } from \"./RenderedContent\";\nimport type { ContentRendererProps } from \"./ContentRenderer.types\";\n\nexport function ContentRenderer({\n value,\n format = \"auto\",\n lineSpacing = 1.6,\n className,\n extensions: instanceExtensions,\n unsafe = false,\n}: ContentRendererProps) {\n const extensions = useMemo(\n () => mergeExtensions(instanceExtensions),\n [instanceExtensions],\n );\n\n const html = useMemo(() => {\n // Guard nullish input: marked.parse throws \"input parameter is undefined\n // or null\", which (inside this useMemo during render) would crash the whole\n // React tree. Treat missing content as empty.\n const safe = value ?? \"\";\n const resolvedFormat = format === \"auto\" ? detectFormat(safe) : format;\n const raw = resolvedFormat === \"markdown\" ? markdownToRawHtml(safe) : safe;\n return unsafe ? raw : sanitizeHtml(raw);\n }, [value, format, unsafe]);\n\n const hasExtensions = extensions.length > 0;\n\n return (\n <div\n data-react-fancy-content-renderer=\"\"\n style={{ lineHeight: lineSpacing }}\n className={cn(\"text-sm\", proseClasses, className)}\n >\n {hasExtensions ? (\n <RenderedContent html={html} extensions={extensions} unsafe={unsafe} />\n ) : (\n <div dangerouslySetInnerHTML={{ __html: html }} />\n )}\n </div>\n );\n}\n\nContentRenderer.displayName = \"ContentRenderer\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/PastePills/use-paste-pills.ts","../src/components/PastePills/InlinePill.tsx","../src/components/PastePills/paste-markers.ts","../src/components/PastePills/use-inline-paste.tsx","../src/components/PastePills/InlinePasteEditor.tsx","../src/components/PastePills/PastedFilesInput.tsx"],"names":["useRef","useCallback","useState","jsx","InlinePasteEditor","id","range","jsxs","useEffect"],"mappings":"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","file":"chunk-NILA2LZY.js","sourcesContent":["import { useCallback, useRef } from \"react\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\n\n/**\n * A paste held beside a composer rather than inserted into it.\n *\n * There is deliberately **no `length` field.** It would be `text.length` and\n * nothing else, and a derived value stored beside its source is a value that can\n * disagree with it — the two drift the moment anything edits one. Read\n * `paste.text.length`.\n */\nexport interface HeldPaste {\n id: string;\n text: string;\n}\n\n/**\n * The minimum of a clipboard event this hook touches.\n *\n * Structural rather than `React.ClipboardEvent` so a host can call it from a\n * native listener, a synthetic one, or a test double. React's own event satisfies\n * it.\n */\nexport interface PasteEventLike {\n clipboardData?: { getData(type: string): string } | null;\n preventDefault(): void;\n}\n\nexport interface UsePastePillsOptions {\n /**\n * Hold a paste of at least this many characters. Try 500 — about a long\n * paragraph.\n *\n * **No default, on purpose.** Paste is a fundamental interaction, so holding one\n * is something a host asks for rather than something it discovers. Omit this and\n * `handlePaste` always returns `false` and touches nothing.\n */\n threshold?: number;\n /** Own the list yourself. Omit to let the hook keep it. */\n heldPastes?: HeldPaste[];\n onHeldPastesChange?: (pastes: HeldPaste[]) => void;\n}\n\nexport interface UsePastePillsResult {\n heldPastes: HeldPaste[];\n /**\n * Call this from your OWN paste handler. Returns `true` if it took the paste —\n * in which case it has already called `preventDefault()` — and `false` if it\n * declined, having touched nothing.\n *\n * Composable on purpose: a host whose handler already intercepts paste for its\n * own reasons needs to ask \"did you want this?\" rather than hand over the event.\n *\n * function onPaste(e) {\n * if (pills.handlePaste(e)) return;\n * // ...your own handling\n * }\n */\n handlePaste: (event: PasteEventLike) => boolean;\n /**\n * Hold `text` unconditionally and return the new pill's id.\n *\n * For a host that decides for itself what to hold and needs to know WHICH pill\n * it made — `Composer`'s inline placement puts the pill at the caret, so it needs\n * the id at paste time. Ignores `threshold`; the caller has already decided.\n */\n hold: (text: string) => string;\n /**\n * Removes the paste and returns its text, for the host to insert into its own\n * surface. `undefined` if there is no such id.\n *\n * The hook cannot insert it — it owns no DOM and does not know what a host's\n * surface is. That is the point.\n */\n expand: (id: string) => string | undefined;\n /** Discard one without returning it. */\n remove: (id: string) => void;\n /** Empty the list, e.g. after a send. */\n clear: () => void;\n}\n\n/**\n * Hold a large paste as state, so a composer can show it as a pill instead of\n * turning itself into a scrolling wall.\n *\n * ---------------------------------------------------------------------------\n * Why this is a hook and not just a feature of `Composer`\n * ---------------------------------------------------------------------------\n *\n * `Composer` shipped the behaviour in 5.31.0 and the MOIC estate, who specified it,\n * then established something I had missed: their chat input is a contenteditable\n * rendering inline `[deal:42|Acme]` badges, so they **cannot** adopt `Composer` (a\n * plain textarea) however much they want its behaviour. Their plan to delete their\n * own composer when ours landed could never have worked.\n *\n * So the logic lives here and **`Composer` is its first caller.** One\n * implementation rather than two, which matters more than the convenience: two\n * copies of a rule drift, and the copy nobody reads is the one that rots. The rule\n * that must not drift is the one in `Composer`'s own tests — a send with pills\n * still closed carries the text.\n *\n * It owns no DOM. The host renders the pills.\n *\n * ---------------------------------------------------------------------------\n * Who actually calls this (as of 5.32.0): `Composer`, and nothing else\n * ---------------------------------------------------------------------------\n *\n * The estate that specified it **withdrew before adopting it**, hours after it\n * shipped — their design moved the pill INTO the message as a `[paste:id|label]`\n * marker in the same grammar as their other object tags, which makes the message\n * itself the record of what is attached. A parallel `heldPastes` array would then be\n * a second place answering \"what am I sending?\", and the two would disagree the\n * moment someone backspaced a badge. Their reasoning was better than the spec.\n *\n * Recorded because a reader should not infer an extension point under active\n * external use. It is kept rather than withdrawn for two reasons that are about\n * cost, not optimism: it is published API on a 5.x package, so removing it needs a\n * major; and `Composer` calls it, so it is exercised by that component's tests on\n * every run and cannot rot unnoticed.\n *\n * **It gets no further surface without a real caller.** No extra options, no second\n * hook. An API with one hypothetical consumer is how a package accumulates surface\n * nobody uses.\n *\n * `hold` (5.38.0) met that bar: `Composer`'s inline placement — MOIC's\n * pill-inside-the-message design, built into the component — needs the id of the\n * pill it just made so it can put it at the caret.\n */\nexport function usePastePills({\n threshold,\n heldPastes: controlledHeldPastes,\n onHeldPastesChange,\n}: UsePastePillsOptions = {}): UsePastePillsResult {\n const [heldPastes, setHeldPastes] = useControllableState<HeldPaste[]>(\n controlledHeldPastes,\n [],\n onHeldPastesChange,\n );\n\n /*\n * A counter rather than `crypto.randomUUID()` or an index.\n *\n * An index is not an id — removing the first pill renumbers the rest, and a host\n * keying its DOM on that remounts every pill and loses hover state. A counter in\n * a ref is stable for the life of the component and needs no platform API that a\n * server renderer might lack.\n */\n const nextId = useRef(0);\n\n const hold = useCallback(\n (text: string): string => {\n /*\n * Skip any id the list already holds. A controlled list can arrive seeded\n * (restored drafts, an agent attaching a paste) before this counter has\n * counted anything, and minting `paste-1` beside an existing `paste-1` gives\n * two pills one id — expanding either then takes both.\n */\n let id: string;\n do {\n nextId.current += 1;\n id = `paste-${nextId.current}`;\n } while (heldPastes.some((p) => p.id === id));\n\n setHeldPastes((current) => [...current, { id, text }]);\n\n return id;\n },\n [heldPastes, setHeldPastes],\n );\n\n const handlePaste = useCallback(\n (event: PasteEventLike): boolean => {\n if (!threshold || threshold <= 0) return false;\n\n const text = event.clipboardData?.getData(\"text/plain\") ?? \"\";\n\n // Below the threshold, decline WITHOUT touching the event. A host calling\n // this from inside its own handler has to be able to carry on as if the hook\n // were not there.\n if (text.length < threshold) return false;\n\n event.preventDefault();\n hold(text);\n\n return true;\n },\n [threshold, hold],\n );\n\n const expand = useCallback(\n (id: string): string | undefined => {\n const found = heldPastes.find((p) => p.id === id);\n\n if (found === undefined) return undefined;\n\n setHeldPastes((current) => current.filter((p) => p.id !== id));\n\n return found.text;\n },\n [heldPastes, setHeldPastes],\n );\n\n const remove = useCallback(\n (id: string) => setHeldPastes((current) => current.filter((p) => p.id !== id)),\n [setHeldPastes],\n );\n\n const clear = useCallback(() => setHeldPastes([]), [setHeldPastes]);\n\n return { heldPastes, handlePaste, hold, expand, remove, clear };\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Popover } from \"../Popover\";\nimport type { ComposerPasteClassNames, ComposerPastePreview } from \"./PastePills.types\";\n\n/**\n * Thousands separators, written out rather than left to `toLocaleString()`.\n *\n * The number exists so someone can size the paste at a glance, and `2,036` sizes\n * faster than `2036`. It is not left to the runtime locale because the label beside\n * it (\"Pasted text\") is not localised either, so a locale-formatted number next to\n * an English noun would be half a translation.\n */\nexport function withSeparators(n: number): string {\n return String(n).replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n}\n\n/** First and last N characters, middle elided. The ends say WHICH paste this is. */\nexport function endsOf(text: string, chars: number): string {\n if (text.length <= chars * 2) return text;\n\n return `${text.slice(0, chars)} … ${text.slice(-chars)}`;\n}\n\nconst PILL_BASE =\n \"inline-flex select-none items-center rounded-md px-2 py-0.5 text-xs leading-5 transition-colors\";\nconst TEXT_PILL =\n \"cursor-pointer bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] text-zinc-700 hover:bg-zinc-200 dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:text-zinc-200 dark:hover:bg-zinc-700\";\nconst IMAGE_PILL =\n \"bg-rose-100 font-medium text-rose-600 dark:bg-rose-500/20 dark:text-rose-300\";\n/** Merged onto the Popover panel's own defaults: tighter padding for a preview. */\nconst PREVIEW_BASE = \"max-w-xs whitespace-pre-wrap break-all p-2 text-xs\";\n\n/**\n * An image's thumbnail, made from the File only while the preview is open.\n *\n * If the image cannot be shown — a Content-Security-Policy without `blob:` in\n * `img-src` is the usual reason — the label is shown instead. A broken `<img>`\n * with an empty `alt` renders as nothing at all, which is how a preview ends up\n * as an empty box.\n */\nfunction ImageThumb({ file, label }: { file: File; label: string }) {\n const [url, setUrl] = useState<string | null>(null);\n const [failed, setFailed] = useState(false);\n\n useEffect(() => {\n if (typeof URL.createObjectURL !== \"function\") return;\n const made = URL.createObjectURL(file);\n setUrl(made);\n setFailed(false);\n return () => URL.revokeObjectURL(made);\n }, [file]);\n\n return url && !failed ? (\n <img\n src={url}\n alt={label}\n onError={() => setFailed(true)}\n className=\"block max-h-40 max-w-[16rem] rounded\"\n />\n ) : (\n <span>{label}</span>\n );\n}\n\ninterface InlinePillProps {\n preview: ComposerPastePreview;\n previewChars: number;\n renderPastePreview?: (preview: ComposerPastePreview) => ReactNode;\n classNames?: ComposerPasteClassNames;\n disabled: boolean;\n onExpand: (id: string) => void;\n}\n\n/**\n * One pill inside the message, portalled by `Composer` into a placeholder the\n * editor made. Internal — its own file so its props are not read as `Composer`'s.\n *\n * The preview is a hover `Popover` (portalled, so the scrolling input cannot clip\n * it), and it opens on FOCUS too, so a keyboard user reaches the same preview. It\n * was a `Tooltip` until 5.51.0; a tooltip is for a short label, not an image.\n */\nexport function InlinePill({\n preview,\n previewChars,\n renderPastePreview,\n classNames,\n disabled,\n onExpand,\n}: InlinePillProps) {\n const [open, setOpen] = useState(false);\n const id = preview.kind === \"text\" ? preview.paste.id : preview.image.id;\n const content = (\n <span data-react-fancy-composer-paste-pill-preview={id}>\n {renderPastePreview?.(preview) ??\n (preview.kind === \"text\" ? (\n endsOf(preview.paste.text, previewChars)\n ) : (\n <ImageThumb file={preview.image.file} label={preview.image.label} />\n ))}\n </span>\n );\n const focusOpen = {\n onFocus: () => setOpen(true),\n onBlur: () => setOpen(false),\n };\n\n const pill =\n preview.kind === \"image\" ? (\n <span\n data-react-fancy-composer-image-pill={id}\n role=\"img\"\n tabIndex={0}\n aria-label={preview.image.label}\n {...focusOpen}\n className={cn(PILL_BASE, IMAGE_PILL, classNames?.pill, classNames?.imagePill)}\n >\n {preview.image.label}\n </span>\n ) : (\n <button\n type=\"button\"\n data-react-fancy-composer-paste-pill={id}\n onClick={() => onExpand(id)}\n disabled={disabled}\n aria-label={`Insert this pasted text, ${withSeparators(preview.paste.text.length)} characters`}\n {...focusOpen}\n className={cn(PILL_BASE, TEXT_PILL, classNames?.pill, classNames?.textPill)}\n >\n Pasted text · {withSeparators(preview.paste.text.length)} characters\n </button>\n );\n\n return (\n <Popover hover open={open} onOpenChange={setOpen} placement=\"top\">\n <Popover.Trigger>{pill}</Popover.Trigger>\n <Popover.Content className={cn(PREVIEW_BASE, classNames?.preview)}>\n {content}\n </Popover.Content>\n </Popover>\n );\n}\n","import type { HeldPaste } from \"./use-paste-pills\";\n\n/**\n * An image pasted into a `Composer` and held as a pill.\n *\n * `label` is stored rather than derived because the number in it is the order of\n * ARRIVAL: \"Pasted image 2\" must stay 2 after image 1 is deleted, and nothing left\n * in the list could recompute that.\n */\nexport interface HeldImage {\n id: string;\n file: File;\n label: string;\n}\n\n/**\n * U+FFFC OBJECT REPLACEMENT CHARACTER — Unicode's own \"an embedded object sits\n * here\". A marker is the id wrapped in a pair of them.\n *\n * Why the message carries a marker at all: with inline placement the message\n * ITSELF is the record of what is attached and where, so there is one answer to\n * \"what am I sending?\" rather than a text plus a parallel list that can disagree\n * the moment someone backspaces a pill. This is the MOIC estate's design for their\n * own composer, and the reason they withdrew from the beside-the-input layout.\n *\n * Only a marker whose id the composer actually holds is a pill; anything else is\n * left as text, so a stray U+FFFC in pasted content cannot invent an attachment.\n */\nexport const PILL_MARK = \"\\uFFFC\";\n\nconst MARKER = /\\uFFFC([^\\uFFFC\\n]+)\\uFFFC/g;\n\n/** The marker for a held paste or image, for a host or agent writing `value` itself. */\nexport function pasteMarker(id: string): string {\n return `${PILL_MARK}${id}${PILL_MARK}`;\n}\n\nexport type ValueSegment =\n | { type: \"text\"; text: string }\n | { type: \"pill\"; id: string };\n\n/** Split a value into text and pills. Markers for ids not in `known` stay text. */\nexport function segmentValue(value: string, known: ReadonlySet<string>): ValueSegment[] {\n const out: ValueSegment[] = [];\n let last = 0;\n\n for (const match of value.matchAll(MARKER)) {\n const id = match[1];\n if (!known.has(id)) continue;\n\n const start = match.index ?? 0;\n if (start > last) out.push({ type: \"text\", text: value.slice(last, start) });\n out.push({ type: \"pill\", id });\n last = start + match[0].length;\n }\n\n if (last < value.length) out.push({ type: \"text\", text: value.slice(last) });\n\n return out;\n}\n\n/** The id of every marker the value contains, in order, held or not. */\nexport function markedIds(value: string): string[] {\n return Array.from(value.matchAll(MARKER), (m) => m[1]);\n}\n\n/**\n * What actually gets sent: every text pill replaced by its full text, every image\n * pill by `[Pasted image N]` so the reader of the message can see where the image\n * sat. The images themselves go to `onSubmit`'s second argument.\n */\nexport function expandMarkers(\n value: string,\n pastes: readonly HeldPaste[],\n images: readonly HeldImage[],\n): string {\n const text = new Map(pastes.map((p) => [p.id, p.text]));\n const image = new Map(images.map((i) => [i.id, `[${i.label}]`]));\n\n return value.replace(MARKER, (whole, id: string) => text.get(id) ?? image.get(id) ?? whole);\n}\n","import { useCallback, useMemo, useRef, useState, type ReactNode, type RefObject } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { usePastePills, type HeldPaste } from \"./use-paste-pills\";\nimport { InlinePill } from \"./InlinePill\";\nimport type { InlinePasteEditorHandle, PillToInsert } from \"./InlinePasteEditor\";\nimport { expandMarkers, markedIds, type HeldImage } from \"./paste-markers\";\nimport type { ComposerPasteClassNames, ComposerPastePreview } from \"./PastePills.types\";\n\nexport interface UseInlinePasteOptions {\n pasteThreshold?: number;\n pasteImages?: boolean;\n previewChars: number;\n renderPastePreview?: (preview: ComposerPastePreview) => ReactNode;\n classNames?: ComposerPasteClassNames;\n disabled: boolean;\n heldPastes?: HeldPaste[];\n onHeldPastesChange?: (pastes: HeldPaste[]) => void;\n heldImages?: HeldImage[];\n onHeldImagesChange?: (images: HeldImage[]) => void;\n editorRef: RefObject<InlinePasteEditorHandle | null>;\n /**\n * Give a text pill a line to itself. Default `true`; a single-line field\n * (`Input`) has no lines to give, so its pills sit in the text.\n */\n blockText?: boolean;\n}\n\n/**\n * Everything inline paste pills need besides the editor itself: the held pastes\n * and images, deciding what a paste becomes, dropping a pill's hold when it is\n * deleted from the message, rendering the pills into the editor, and expanding\n * them on send.\n *\n * Shared by `Composer`, `PromptInput` and `Input` so they cannot disagree about\n * what a pill means. The rule that must not drift is the one `expand` and `imagesIn`\n * carry: a send with pills still closed carries everything they hold.\n */\nexport function useInlinePaste({\n pasteThreshold,\n pasteImages = false,\n previewChars,\n renderPastePreview,\n classNames,\n disabled,\n heldPastes: controlledHeldPastes,\n onHeldPastesChange,\n heldImages: controlledHeldImages,\n onHeldImagesChange,\n editorRef,\n blockText = true,\n}: UseInlinePasteOptions) {\n const pills = usePastePills({\n threshold: pasteThreshold,\n heldPastes: controlledHeldPastes,\n onHeldPastesChange,\n });\n const heldPastes = pills.heldPastes;\n const [heldImages, setHeldImages] = useControllableState<HeldImage[]>(\n controlledHeldImages,\n [],\n onHeldImagesChange,\n );\n const imageCount = useRef(0);\n\n const known = useMemo(\n () => new Set([...heldPastes.map((p) => p.id), ...heldImages.map((i) => i.id)]),\n [heldPastes, heldImages],\n );\n\n const holdImage = useCallback(\n (file: File): string => {\n let id: string;\n do {\n imageCount.current += 1;\n id = `image-${imageCount.current}`;\n } while (heldImages.some((i) => i.id === id));\n\n const image = { id, file, label: `Pasted image ${imageCount.current}` };\n setHeldImages((current) => [...current, image]);\n\n return id;\n },\n [heldImages, setHeldImages],\n );\n\n /** What a paste becomes. `null` means \"just text\". */\n const decidePaste = useCallback(\n (data: DataTransfer | null): PillToInsert[] | null => {\n const text = data?.getData(\"text/plain\") ?? \"\";\n\n // Only a PURE image paste: a clipboard with text as well usually carries a\n // picture OF that text (copying from a document), and holding it would turn\n // every pasted sentence into a screenshot of the sentence.\n if (pasteImages && text === \"\") {\n const files = Array.from(data?.files ?? []).filter((f) =>\n f.type.startsWith(\"image/\"),\n );\n if (files.length > 0) {\n return files.map((file) => ({ id: holdImage(file), block: false }));\n }\n }\n\n if (pasteThreshold && pasteThreshold > 0 && text.length >= pasteThreshold) {\n return [{ id: pills.hold(text), block: blockText }];\n }\n\n return null;\n },\n [pasteImages, pasteThreshold, holdImage, pills, blockText],\n );\n\n /*\n * The message is the record of what is attached. A pill backspaced out of it is\n * no longer attached, so its held entry goes too — otherwise state would say\n * \"attached\" about something the message no longer contains.\n */\n const prune = useCallback(\n (next: string) => {\n const present = new Set(markedIds(next));\n for (const paste of heldPastes) if (!present.has(paste.id)) pills.remove(paste.id);\n if (heldImages.some((i) => !present.has(i.id))) {\n setHeldImages((current) => current.filter((i) => present.has(i.id)));\n }\n },\n [heldPastes, heldImages, pills, setHeldImages],\n );\n\n const [hosts, setHosts] = useState<ReadonlyMap<string, HTMLElement>>(new Map());\n const onHostsChange = useCallback((next: ReadonlyMap<string, HTMLElement>) => {\n setHosts((prev) => {\n if (prev.size === next.size && [...next].every(([id, el]) => prev.get(id) === el)) {\n return prev;\n }\n return next;\n });\n }, []);\n\n /** Click a text pill and its full text takes the pill's place. */\n const expandPill = useCallback(\n (id: string) => {\n const text = pills.expand(id);\n if (text === undefined) return;\n editorRef.current?.replacePill(id, text);\n },\n [pills, editorRef],\n );\n\n /** The value as it is sent: every text pill expanded, every image marked. */\n const expand = useCallback(\n (value: string) => expandMarkers(value, heldPastes, heldImages),\n [heldPastes, heldImages],\n );\n\n /** The images the value still contains, in message order. */\n const imagesIn = useCallback(\n (value: string) =>\n markedIds(value).flatMap((id) => heldImages.filter((i) => i.id === id)),\n [heldImages],\n );\n\n const clear = useCallback(() => {\n pills.clear();\n setHeldImages([]);\n }, [pills, setHeldImages]);\n\n /** The pills, portalled into the placeholders the editor made. Render this anywhere. */\n const portals = Array.from(hosts, ([id, host]) => {\n const paste = heldPastes.find((p) => p.id === id);\n const image = paste ? undefined : heldImages.find((i) => i.id === id);\n const preview: ComposerPastePreview | null = paste\n ? { kind: \"text\", paste }\n : image\n ? { kind: \"image\", image }\n : null;\n\n return preview\n ? createPortal(\n <InlinePill\n preview={preview}\n previewChars={previewChars}\n renderPastePreview={renderPastePreview}\n classNames={classNames}\n disabled={disabled}\n onExpand={expandPill}\n />,\n host,\n id,\n )\n : null;\n });\n\n return {\n pills,\n heldPastes,\n heldImages,\n known,\n decidePaste,\n prune,\n onHostsChange,\n expand,\n imagesIn,\n clear,\n portals,\n };\n}\n","import {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { PILL_MARK, pasteMarker, segmentValue } from \"./paste-markers\";\n\n/** The attribute on the placeholder span a pill is portalled into. */\nexport const HOST_ATTR = \"data-react-fancy-composer-paste-host\";\n\n/** What a paste becomes, as decided by `Composer`. `block` pills get their own line. */\nexport interface PillToInsert {\n id: string;\n block: boolean;\n}\n\nexport interface InlinePasteEditorHandle {\n focus(): void;\n /** Swap a pill for plain text, where it sits. */\n replacePill(id: string, text: string): void;\n /**\n * Replace the whole value and put the caret at `caret` (an offset into the\n * value). For a host that edits text itself — `PromptInput`'s `/` and `@`\n * pickers — where rebuilding from `value` alone would lose the caret.\n */\n setValue(value: string, caret: number): void;\n}\n\ninterface InlinePasteEditorProps {\n value: string;\n /** Ids the composer holds. A marker for anything else stays text. */\n known: ReadonlySet<string>;\n /** `caret` is the caret's offset into `value`, or `value.length` if it is elsewhere. */\n onChange(value: string, caret: number): void;\n onSubmit(): void;\n /**\n * Which key sends. `\"enter\"` (default): Enter sends, Shift+Enter is a newline.\n * `\"mod-enter\"`: Ctrl/⌘+Enter sends and a plain Enter is a newline.\n */\n submitKey?: \"enter\" | \"mod-enter\";\n /** Runs BEFORE the editor's own key handling; `preventDefault()` to claim the key. */\n onKeyDown?(e: React.KeyboardEvent<HTMLDivElement>): void;\n placeholderClassName?: string;\n /** Height in px past which the input scrolls. Defaults to the class's max height. */\n maxHeight?: number;\n /** Return the pills a paste becomes, or null to insert its text as typed. */\n onPaste(data: DataTransfer | null): PillToInsert[] | null;\n /** Every pill placeholder currently in the editor, for the composer to portal into. */\n onHostsChange(hosts: ReadonlyMap<string, HTMLElement>): void;\n placeholder: string;\n disabled: boolean;\n className?: string;\n /**\n * `false` makes it a single-line field, as `Input` uses it: Enter always\n * submits, and a newline in pasted text becomes a space, as a browser does for\n * an `<input>`. A held paste keeps its newlines; it is only the field that has\n * one line. Default `true`.\n */\n multiline?: boolean;\n /** The editable surface's id, so a host can find it. */\n id?: string;\n /** Names the textbox for assistive tech; a `<div>` cannot be the target of a `<label>`. */\n ariaLabelledBy?: string;\n ariaInvalid?: boolean;\n style?: React.CSSProperties;\n}\n\n/**\n * Walk a node's children back into a value string.\n *\n * `<br>` as the LAST child of its parent is filler — browsers put one in an empty\n * line, and this editor puts one after a trailing newline so the caret has a line\n * to sit on — so it counts for nothing. Block elements a browser invents count as\n * a line break before them. Non-breaking spaces become spaces: a browser inserts\n * them for typed spaces it fears would collapse, not because anyone asked.\n */\nfunction serialize(parent: Node, keep: (id: string) => boolean): string {\n let out = \"\";\n const children = Array.from(parent.childNodes);\n\n children.forEach((node, i) => {\n if (node.nodeType === Node.TEXT_NODE) {\n out += (node.textContent ?? \"\").replace(/\\u00A0/g, \" \");\n return;\n }\n if (!(node instanceof HTMLElement)) return;\n\n const id = node.getAttribute(HOST_ATTR);\n if (id !== null) {\n if (keep(id)) out += pasteMarker(id);\n return;\n }\n if (node.tagName === \"BR\") {\n if (i !== children.length - 1) out += \"\\n\";\n return;\n }\n if (/^(DIV|P)$/.test(node.tagName) && out.length > 0 && !out.endsWith(\"\\n\")) {\n out += \"\\n\";\n }\n out += serialize(node, keep);\n });\n\n return out;\n}\n\nfunction makeHost(id: string): HTMLElement {\n const host = document.createElement(\"span\");\n host.setAttribute(\"contenteditable\", \"false\");\n host.setAttribute(HOST_ATTR, id);\n host.className = \"inline-block align-baseline\";\n return host;\n}\n\n/** A value ending in a newline needs a `<br>` after it, or the caret has no line to sit on. */\nfunction ensureTrailingBreak(root: HTMLElement, value: string) {\n const last = root.lastChild;\n const hasBreak = last instanceof HTMLElement && last.tagName === \"BR\";\n\n if (value.endsWith(\"\\n\") && !hasBreak) root.append(document.createElement(\"br\"));\n if (!value.endsWith(\"\\n\") && hasBreak && value.length > 0) last.remove();\n}\n\nfunction placeCaretAfter(node: Node) {\n const selection = window.getSelection();\n if (!selection) return;\n\n const range = document.createRange();\n range.setStartAfter(node);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n\n/**\n * Put the caret `offset` characters into the serialised value. Walks the shape\n * `render` produces — text nodes, pill hosts (each worth its marker's length) and\n * a trailing `<br>` — so it is only called straight after a render.\n */\nfunction placeCaretAtOffset(root: HTMLElement, offset: number, keep: (id: string) => boolean) {\n const selection = window.getSelection();\n if (!selection) return;\n\n const range = document.createRange();\n let remaining = offset;\n let placed = false;\n\n for (const node of Array.from(root.childNodes)) {\n if (node.nodeType === Node.TEXT_NODE) {\n const length = node.textContent?.length ?? 0;\n if (remaining <= length) {\n range.setStart(node, remaining);\n placed = true;\n break;\n }\n remaining -= length;\n continue;\n }\n const id = node instanceof HTMLElement ? node.getAttribute(HOST_ATTR) : null;\n if (id !== null && keep(id)) {\n const length = pasteMarker(id).length;\n if (remaining < length) {\n range.setStartAfter(node);\n placed = true;\n break;\n }\n remaining -= length;\n }\n }\n\n if (!placed) {\n range.selectNodeContents(root);\n range.collapse(false);\n const last = root.lastChild;\n if (last instanceof HTMLElement && last.tagName === \"BR\") range.setStartBefore(last);\n }\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n\n/**\n * The plain-text-plus-pills surface behind `Composer`'s inline placement.\n *\n * The DOM is the source of truth WHILE TYPING and `value` is its serialisation;\n * the DOM is rebuilt from `value` only when `value` changes from outside (a send,\n * a host, an agent). Rebuilding on every keystroke would throw the caret away.\n *\n * Every insertion is done here by hand, never by the browser: a paste is always\n * intercepted, so no foreign HTML ever lands in the editor, and Enter is handled\n * so a browser never invents a `<div>` per line.\n */\nexport const InlinePasteEditor = forwardRef<InlinePasteEditorHandle, InlinePasteEditorProps>(\n function InlinePasteEditor(\n {\n value,\n known,\n onChange,\n onSubmit,\n onPaste,\n onHostsChange,\n placeholder,\n disabled,\n className,\n submitKey = \"enter\",\n onKeyDown,\n placeholderClassName,\n maxHeight,\n multiline = true,\n id,\n ariaLabelledBy,\n ariaInvalid,\n style,\n },\n ref,\n ) {\n const rootRef = useRef<HTMLDivElement>(null);\n /** The last value this editor produced or rendered. Anything else came from outside. */\n const lastValue = useRef<string | null>(null);\n /**\n * Ids inserted here whose hold has not reached `known` yet. A pill is held and\n * placed in the same event, and the composer's state lands a render later.\n */\n const pending = useRef(new Set<string>());\n const knownRef = useRef(known);\n knownRef.current = known;\n\n const keep = useCallback(\n (id: string) => knownRef.current.has(id) || pending.current.has(id),\n [],\n );\n\n const reportHosts = useCallback(() => {\n const root = rootRef.current;\n if (!root) return;\n\n const hosts = new Map<string, HTMLElement>();\n root.querySelectorAll<HTMLElement>(`[${HOST_ATTR}]`).forEach((el) => {\n const id = el.getAttribute(HOST_ATTR)!;\n if (keep(id)) hosts.set(id, el);\n });\n onHostsChange(hosts);\n }, [keep, onHostsChange]);\n\n /** The caret's offset into the serialised value, or its length if the caret is elsewhere. */\n const caretOffset = useCallback(\n (whole: string): number => {\n const root = rootRef.current;\n const selection = window.getSelection();\n if (!root || !selection || selection.rangeCount === 0) return whole.length;\n\n const range = selection.getRangeAt(0);\n if (!root.contains(range.endContainer)) return whole.length;\n\n const head = document.createRange();\n head.selectNodeContents(root);\n head.setEnd(range.endContainer, range.endOffset);\n return serialize(head.cloneContents(), keep).length;\n },\n [keep],\n );\n\n /** Read the DOM back into a value and tell the composer. */\n const emit = useCallback(() => {\n const root = rootRef.current;\n if (!root) return;\n\n const next = serialize(root, keep);\n ensureTrailingBreak(root, next);\n reportHosts();\n\n // Reported even when the value is unchanged: a host reading the caret (a\n // `/` picker) needs to hear about it.\n lastValue.current = next;\n onChange(next, caretOffset(next));\n }, [keep, onChange, reportHosts, caretOffset]);\n\n /** Rebuild the DOM from a value. Throws the caret away; callers put it back. */\n const render = useCallback(\n (next: string) => {\n const root = rootRef.current;\n if (!root) return;\n\n root.replaceChildren();\n for (const segment of segmentValue(next, knownRef.current)) {\n if (segment.type === \"text\") {\n root.append(document.createTextNode(segment.text));\n } else {\n root.append(makeHost(segment.id));\n }\n }\n ensureTrailingBreak(root, next);\n lastValue.current = next;\n reportHosts();\n },\n [reportHosts],\n );\n\n /** The caret's range, or the end of the editor if the caret is elsewhere. */\n const caret = useCallback((): Range => {\n const root = rootRef.current!;\n const selection = window.getSelection();\n\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n if (root.contains(range.commonAncestorContainer)) return range;\n }\n\n const range = document.createRange();\n range.selectNodeContents(root);\n range.collapse(false);\n const last = root.lastChild;\n if (last instanceof HTMLElement && last.tagName === \"BR\") {\n range.setStartBefore(last);\n range.collapse(true);\n }\n return range;\n }, []);\n\n /** Replace the selection with `nodes` and leave the caret after them. */\n const insert = useCallback(\n (build: (before: string, after: string) => Node[]) => {\n const root = rootRef.current!;\n const range = caret();\n range.deleteContents();\n\n const head = document.createRange();\n head.selectNodeContents(root);\n head.setEnd(range.startContainer, range.startOffset);\n const tail = document.createRange();\n tail.selectNodeContents(root);\n tail.setStart(range.endContainer, range.endOffset);\n\n const nodes = build(\n serialize(head.cloneContents(), () => true),\n serialize(tail.cloneContents(), () => true),\n );\n if (nodes.length === 0) return;\n\n const fragment = document.createDocumentFragment();\n nodes.forEach((n) => fragment.append(n));\n range.insertNode(fragment);\n placeCaretAfter(nodes[nodes.length - 1]);\n emit();\n },\n [caret, emit],\n );\n\n const insertText = useCallback(\n (text: string) => insert(() => (text ? [document.createTextNode(text)] : [])),\n [insert],\n );\n\n /*\n * Rebuild from `value` when it changed from outside — or when `known` now\n * disagrees with the pills on screen, e.g. a host set a marker and then the\n * paste it names. Never on our own edits: that would discard the caret.\n */\n useLayoutEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n\n for (const id of pending.current) if (known.has(id)) pending.current.delete(id);\n\n const wanted = segmentValue(value, known)\n .flatMap((s) => (s.type === \"pill\" ? [s.id] : []))\n .join(PILL_MARK);\n const onScreen = Array.from(root.querySelectorAll(`[${HOST_ATTR}]`))\n .map((el) => el.getAttribute(HOST_ATTR))\n .filter((id): id is string => id !== null && keep(id))\n .join(PILL_MARK);\n\n if (value === lastValue.current && wanted === onScreen) return;\n\n render(value);\n }, [value, known, keep, render]);\n\n useImperativeHandle(\n ref,\n () => ({\n focus() {\n const root = rootRef.current;\n if (!root) return;\n root.focus();\n const range = caret();\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n },\n replacePill(id, text) {\n const root = rootRef.current;\n const host = Array.from(\n root?.querySelectorAll(`[${HOST_ATTR}]`) ?? [],\n ).find((el) => el.getAttribute(HOST_ATTR) === id);\n if (!root || !host) return;\n\n const node = document.createTextNode(text);\n host.replaceWith(node);\n root.focus();\n placeCaretAfter(node);\n emit();\n },\n setValue(next, offset) {\n const root = rootRef.current;\n if (!root) return;\n\n render(next);\n root.focus();\n placeCaretAtOffset(root, offset, keep);\n emit();\n },\n }),\n [caret, emit, render, keep],\n );\n\n const handlePaste = (e: React.ClipboardEvent<HTMLDivElement>) => {\n // ALWAYS intercepted: a browser left to paste into a contenteditable inserts\n // the clipboard's HTML, styles and all.\n e.preventDefault();\n if (disabled) return;\n\n const pills = onPaste(e.clipboardData);\n\n if (pills === null) {\n const text = (e.clipboardData?.getData(\"text/plain\") ?? \"\").replace(/\\r\\n?/g, \"\\n\");\n insertText(multiline ? text : text.replace(/\\n+/g, \" \"));\n return;\n }\n\n for (const { id } of pills) pending.current.add(id);\n\n insert((before, after) => {\n const nodes: Node[] = [];\n\n for (const { id, block } of pills) {\n if (block) {\n // A text pill gets a line to itself: a newline above unless it is\n // already at the start of one, and below unless one follows.\n const precededByBreak =\n nodes.length === 0\n ? before === \"\" || before.endsWith(\"\\n\")\n : nodes[nodes.length - 1].textContent === \"\\n\";\n if (!precededByBreak) nodes.push(document.createTextNode(\"\\n\"));\n nodes.push(makeHost(id));\n nodes.push(document.createTextNode(\"\\n\"));\n } else {\n nodes.push(makeHost(id));\n }\n }\n\n // The trailing newline of a block pill is redundant if one already follows.\n const last = nodes[nodes.length - 1];\n if (last.textContent === \"\\n\" && after.startsWith(\"\\n\")) nodes.pop();\n\n return nodes;\n });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (e.key !== \"Enter\" || e.nativeEvent.isComposing) return;\n\n e.preventDefault();\n const sends =\n !multiline || (submitKey === \"mod-enter\" ? e.ctrlKey || e.metaKey : !e.shiftKey);\n if (sends) {\n onSubmit();\n } else {\n insertText(\"\\n\");\n }\n };\n\n return (\n <div className=\"relative\">\n {value === \"\" && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute left-4 top-3 text-sm text-zinc-400\",\n placeholderClassName,\n )}\n >\n {placeholder}\n </span>\n )}\n <div\n ref={rootRef}\n id={id}\n data-react-fancy-composer-input=\"\"\n role=\"textbox\"\n aria-multiline={multiline}\n aria-labelledby={ariaLabelledBy}\n aria-invalid={ariaInvalid || undefined}\n aria-placeholder={placeholder}\n aria-disabled={disabled || undefined}\n contentEditable={!disabled}\n suppressContentEditableWarning\n onInput={emit}\n onPaste={handlePaste}\n onKeyDown={handleKeyDown}\n style={maxHeight === undefined ? style : { ...style, maxHeight }}\n className={cn(\n \"max-h-72 min-h-[4.5rem] w-full overflow-y-auto whitespace-pre-wrap break-words bg-transparent px-4 pt-3 text-sm outline-none\",\n className,\n )}\n />\n </div>\n );\n },\n);\n","import { useEffect, useRef } from \"react\";\n\nexport interface PastedFilesInputProps {\n /** The form field name the files are submitted under. */\n name: string;\n /** The files to submit, in the order the message holds them. */\n files: readonly File[];\n /** Associate with a `<form id>` elsewhere in the document, as `<input form>` does. */\n form?: string;\n}\n\n/**\n * A hidden `<input type=\"file\">` carrying the files pasted into a field, so a\n * plain `<form>` submits them with everything else.\n *\n * A pasted file is not in any form field: the clipboard hands it to the paste\n * handler and nowhere else. Held as a pill, it is attached as far as the person can\n * see, and a native submit would then post the text without it. A file input is\n * the one element a form posts files from, and its `files` can be set from a\n * `DataTransfer`, so the pills keep it in step: delete a pill and its file leaves\n * the input too.\n *\n * Hidden rather than visually hidden: `hidden` keeps it out of the tab order and\n * the accessibility tree, where the pills already represent it, and does not stop\n * a form submitting it.\n */\nexport function PastedFilesInput({ name, files, form }: PastedFilesInputProps) {\n const ref = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n const el = ref.current;\n // No DataTransfer (a server render, an old engine): nothing can be set, and\n // the host still has the files from its own state.\n if (!el || typeof DataTransfer === \"undefined\") return;\n\n const transfer = new DataTransfer();\n for (const file of files) transfer.items.add(file);\n el.files = transfer.files;\n }, [files]);\n\n return (\n <input\n ref={ref}\n type=\"file\"\n name={name}\n form={form}\n multiple\n hidden\n tabIndex={-1}\n data-react-fancy-pasted-files={name}\n />\n );\n}\n"]}