@particle-academy/react-fancy 5.68.0 → 5.70.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 (137) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/dist/{PastedFilesInput-Bt3KSTVN.d.ts → PastedFilesInput-BT5y95sb.d.ts} +2 -1
  3. package/dist/{PastedFilesInput-CUQeOeOA.d.cts → PastedFilesInput-Cd4k6a38.d.cts} +2 -1
  4. package/dist/autocomplete.cjs +3 -2
  5. package/dist/autocomplete.js +2 -1
  6. package/dist/chunk-2C64OVOZ.cjs +18 -0
  7. package/dist/chunk-2C64OVOZ.cjs.map +1 -0
  8. package/dist/{chunk-BX7EDTL4.js → chunk-37D5PYEF.js} +4 -3
  9. package/dist/chunk-37D5PYEF.js.map +1 -0
  10. package/dist/{chunk-UJRMY54A.cjs → chunk-3QCAOD2W.cjs} +4 -2
  11. package/dist/chunk-3QCAOD2W.cjs.map +1 -0
  12. package/dist/{chunk-KSU6RYWU.cjs → chunk-3T3LBIQA.cjs} +4 -2
  13. package/dist/chunk-3T3LBIQA.cjs.map +1 -0
  14. package/dist/{chunk-E4DXICU3.cjs → chunk-5YRSYS2F.cjs} +10 -10
  15. package/dist/{chunk-E4DXICU3.cjs.map → chunk-5YRSYS2F.cjs.map} +1 -1
  16. package/dist/{chunk-U5LKNGHU.cjs → chunk-6EA3DSPT.cjs} +14 -13
  17. package/dist/chunk-6EA3DSPT.cjs.map +1 -0
  18. package/dist/{chunk-YIKXJWO4.js → chunk-6PRXG7L6.js} +7 -5
  19. package/dist/chunk-6PRXG7L6.js.map +1 -0
  20. package/dist/{chunk-WKPBCB67.cjs → chunk-6QAF35AJ.cjs} +4 -2
  21. package/dist/chunk-6QAF35AJ.cjs.map +1 -0
  22. package/dist/chunk-6V44RRSB.cjs +11 -0
  23. package/dist/chunk-6V44RRSB.cjs.map +1 -0
  24. package/dist/chunk-AC3W3TIV.js +67 -0
  25. package/dist/chunk-AC3W3TIV.js.map +1 -0
  26. package/dist/{chunk-G35XN5WV.js → chunk-CDW7MFPG.js} +4 -2
  27. package/dist/chunk-CDW7MFPG.js.map +1 -0
  28. package/dist/{chunk-DCAD2JPP.js → chunk-EZL5DILH.js} +7 -6
  29. package/dist/chunk-EZL5DILH.js.map +1 -0
  30. package/dist/{chunk-ARO2DNGS.js → chunk-EZZKHMR4.js} +4 -2
  31. package/dist/chunk-EZZKHMR4.js.map +1 -0
  32. package/dist/{chunk-TQ77ZWBD.js → chunk-F4GMOMUT.js} +3 -3
  33. package/dist/{chunk-TQ77ZWBD.js.map → chunk-F4GMOMUT.js.map} +1 -1
  34. package/dist/{chunk-R6URPHEP.cjs → chunk-FHRVSYJU.cjs} +4 -3
  35. package/dist/chunk-FHRVSYJU.cjs.map +1 -0
  36. package/dist/{chunk-QSGAFKK2.js → chunk-HN5J7TK6.js} +46 -11
  37. package/dist/chunk-HN5J7TK6.js.map +1 -0
  38. package/dist/{chunk-6CAXLP7D.cjs → chunk-HNJXBMHI.cjs} +6 -6
  39. package/dist/{chunk-6CAXLP7D.cjs.map → chunk-HNJXBMHI.cjs.map} +1 -1
  40. package/dist/chunk-I3LAFKJU.js +16 -0
  41. package/dist/chunk-I3LAFKJU.js.map +1 -0
  42. package/dist/{chunk-23AVEYUP.js → chunk-J7S42MJP.js} +87 -29
  43. package/dist/chunk-J7S42MJP.js.map +1 -0
  44. package/dist/{chunk-HFK5SBNM.cjs → chunk-KKYILQTG.cjs} +7 -5
  45. package/dist/chunk-KKYILQTG.cjs.map +1 -0
  46. package/dist/{chunk-7FYRFNPX.cjs → chunk-LBSAWRFT.cjs} +52 -17
  47. package/dist/chunk-LBSAWRFT.cjs.map +1 -0
  48. package/dist/{chunk-FVI4JDLA.js → chunk-M6UAVA2I.js} +4 -2
  49. package/dist/chunk-M6UAVA2I.js.map +1 -0
  50. package/dist/{chunk-2LQR4EAN.js → chunk-NAYXNVNU.js} +7 -3
  51. package/dist/chunk-NAYXNVNU.js.map +1 -0
  52. package/dist/{chunk-G5DMYAWL.cjs → chunk-O5ORO2RX.cjs} +5 -2
  53. package/dist/chunk-O5ORO2RX.cjs.map +1 -0
  54. package/dist/{chunk-B4LVQ4QI.js → chunk-PJNUGSKI.js} +3 -3
  55. package/dist/{chunk-B4LVQ4QI.js.map → chunk-PJNUGSKI.js.map} +1 -1
  56. package/dist/{chunk-464QSZ4A.cjs → chunk-R3EJNGJV.cjs} +7 -3
  57. package/dist/chunk-R3EJNGJV.cjs.map +1 -0
  58. package/dist/chunk-S42OGG43.js +9 -0
  59. package/dist/chunk-S42OGG43.js.map +1 -0
  60. package/dist/{chunk-VZNBTCGA.js → chunk-TCMOD3WW.js} +4 -3
  61. package/dist/chunk-TCMOD3WW.js.map +1 -0
  62. package/dist/{chunk-6MXFZ3B5.cjs → chunk-UK6BGM74.cjs} +4 -3
  63. package/dist/chunk-UK6BGM74.cjs.map +1 -0
  64. package/dist/{chunk-XS3EIQFP.js → chunk-WZAKEJDL.js} +5 -2
  65. package/dist/chunk-WZAKEJDL.js.map +1 -0
  66. package/dist/{chunk-SAG6DHQK.cjs → chunk-XAKZ6VBP.cjs} +92 -34
  67. package/dist/chunk-XAKZ6VBP.cjs.map +1 -0
  68. package/dist/chunk-XNHAJQRF.cjs +69 -0
  69. package/dist/chunk-XNHAJQRF.cjs.map +1 -0
  70. package/dist/command.cjs +4 -3
  71. package/dist/command.js +2 -1
  72. package/dist/composer.cjs +7 -4
  73. package/dist/composer.d.cts +44 -2
  74. package/dist/composer.d.ts +44 -2
  75. package/dist/composer.js +5 -2
  76. package/dist/content-renderer.cjs +5 -4
  77. package/dist/content-renderer.js +2 -1
  78. package/dist/editor.cjs +5 -4
  79. package/dist/editor.js +3 -2
  80. package/dist/file-browser.cjs +6 -5
  81. package/dist/file-browser.js +2 -1
  82. package/dist/{index-XR5t8bTq.d.ts → index-BAtF94lw.d.ts} +69 -5
  83. package/dist/{index-DWtSViJ3.d.cts → index-xwL2MACB.d.cts} +69 -5
  84. package/dist/index.cjs +61 -58
  85. package/dist/index.cjs.map +1 -1
  86. package/dist/index.d.cts +3 -2
  87. package/dist/index.d.ts +3 -2
  88. package/dist/index.js +16 -13
  89. package/dist/index.js.map +1 -1
  90. package/dist/input-tag.cjs +7 -6
  91. package/dist/input-tag.js +2 -1
  92. package/dist/input.cjs +4 -3
  93. package/dist/input.js +3 -2
  94. package/dist/inputs.cjs +6 -5
  95. package/dist/inputs.js +4 -3
  96. package/dist/json-editor.cjs +16 -15
  97. package/dist/json-editor.js +5 -4
  98. package/dist/paste-pills.cjs +15 -14
  99. package/dist/paste-pills.d.cts +1 -1
  100. package/dist/paste-pills.d.ts +1 -1
  101. package/dist/paste-pills.js +2 -1
  102. package/dist/pillbox.cjs +3 -2
  103. package/dist/pillbox.js +2 -1
  104. package/dist/prompt-input.cjs +8 -5
  105. package/dist/prompt-input.d.cts +2 -1
  106. package/dist/prompt-input.d.ts +2 -1
  107. package/dist/prompt-input.js +5 -2
  108. package/dist/select.cjs +3 -2
  109. package/dist/select.js +2 -1
  110. package/dist/use-acknowledged-submit-7nC0vSCP.d.cts +12 -0
  111. package/dist/use-acknowledged-submit-7nC0vSCP.d.ts +12 -0
  112. package/docs/Composer.md +62 -2
  113. package/docs/ContentRenderer.md +4 -1
  114. package/docs/PromptInput.md +67 -6
  115. package/package.json +1 -1
  116. package/dist/chunk-23AVEYUP.js.map +0 -1
  117. package/dist/chunk-2LQR4EAN.js.map +0 -1
  118. package/dist/chunk-464QSZ4A.cjs.map +0 -1
  119. package/dist/chunk-6MXFZ3B5.cjs.map +0 -1
  120. package/dist/chunk-7FYRFNPX.cjs.map +0 -1
  121. package/dist/chunk-ARO2DNGS.js.map +0 -1
  122. package/dist/chunk-BX7EDTL4.js.map +0 -1
  123. package/dist/chunk-DCAD2JPP.js.map +0 -1
  124. package/dist/chunk-FVI4JDLA.js.map +0 -1
  125. package/dist/chunk-G35XN5WV.js.map +0 -1
  126. package/dist/chunk-G5DMYAWL.cjs.map +0 -1
  127. package/dist/chunk-HFK5SBNM.cjs.map +0 -1
  128. package/dist/chunk-KSU6RYWU.cjs.map +0 -1
  129. package/dist/chunk-QSGAFKK2.js.map +0 -1
  130. package/dist/chunk-R6URPHEP.cjs.map +0 -1
  131. package/dist/chunk-SAG6DHQK.cjs.map +0 -1
  132. package/dist/chunk-U5LKNGHU.cjs.map +0 -1
  133. package/dist/chunk-UJRMY54A.cjs.map +0 -1
  134. package/dist/chunk-VZNBTCGA.js.map +0 -1
  135. package/dist/chunk-WKPBCB67.cjs.map +0 -1
  136. package/dist/chunk-XS3EIQFP.js.map +0 -1
  137. package/dist/chunk-YIKXJWO4.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ContentRenderer/extensions.ts","../src/utils/markdown.ts","../src/components/Editor/editor.utils.ts","../src/components/ContentRenderer/markdown-blocks.ts","../src/components/ContentRenderer/copy.tsx","../src/components/ContentRenderer/RenderedContent.tsx","../src/components/ContentRenderer/ContentRenderer.tsx"],"names":["marked","indent","useMemo","jsx","Fragment","useRef","useState","useCallback","jsxs"],"mappings":"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","file":"chunk-NAYXNVNU.js","sourcesContent":["import type { ComponentType, ReactNode } from \"react\";\nimport { sanitizeHref } from \"../../utils/sanitize\";\n\n/** Props passed to every render-extension component. */\nexport interface RenderExtensionProps {\n /**\n * The inner content of the custom tag (raw string). For an extension with\n * `markdown: true` in markdown content this is the raw MARKDOWN body, before\n * conversion. Either way it is untrusted: render `children` rather than\n * injecting it.\n */\n content: string;\n /**\n * Parsed attributes from the opening tag. Event handlers (`on*`), `srcdoc`,\n * and URL attributes with an unsafe scheme are removed (unless the renderer\n * is `unsafe`).\n */\n attributes: Record<string, string>;\n /**\n * Only for extensions with `markdown: true`: the body, rendered by the same\n * pipeline as the rest of the content (sanitised, nested extensions, copy\n * buttons).\n */\n children?: ReactNode;\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 * The tag's body is MARKDOWN. In markdown content, a tag that starts a line\n * is lifted out of the source before conversion, so the component gets the\n * raw markdown as `content` and the rendered, sanitised body as `children`.\n * In HTML content the body is HTML and `children` renders it.\n * @default false\n */\n markdown?: boolean;\n}\n\nconst URL_ATTRS = new Set([\"href\", \"src\", \"action\", \"formaction\", \"xlink:href\"]);\n\n/**\n * Drop attributes that could run code if a component spread them onto the\n * DOM — the same rules the HTML sanitiser applies to an element.\n */\nexport function safeAttributes(attrs: Record<string, string>): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [name, value] of Object.entries(attrs)) {\n const lower = name.toLowerCase();\n if (lower.startsWith(\"on\") || lower === \"srcdoc\") continue;\n if (URL_ATTRS.has(lower)) {\n const safe = sanitizeHref(value);\n if (safe === undefined) continue;\n out[name] = safe;\n continue;\n }\n out[name] = value;\n }\n return out;\n}\n\n/** Parse, and unless `unsafe`, clean the attribute text of an opening tag. */\nexport function tagAttributes(raw: string, unsafe: boolean): Record<string, string> {\n const attrs = raw ? parseAttributes(raw) : {};\n return unsafe ? attrs : safeAttributes(attrs);\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","/**\n * Source-level scanning for ContentRenderer: lifting custom tags with a\n * MARKDOWN body out of the source before it is converted, and finding where an\n * in-progress stream should be cut so a half-arrived tag or fence never shows.\n *\n * Both work on the markdown SOURCE and both must ignore code: a `<result>`\n * inside a fenced block or an inline code span is an example, not a tag.\n */\n\n/** A complete custom tag found outside code. */\ninterface TagToken {\n kind: \"open\" | \"close\";\n /** Lower-cased tag name. */\n name: string;\n start: number;\n end: number;\n /** Raw attribute text of an opening tag (may be empty). */\n attrs: string;\n /** The tag starts its line, after at most three spaces of indent. */\n lineStart: boolean;\n}\n\ninterface ScanResult {\n tokens: TagToken[];\n /** Start of the line that opened a fence which never closed, or -1. */\n openFenceStart: number;\n /** The fence that never closed (its marker character and length), or null. */\n openFence: { char: string; len: number } | null;\n}\n\n/** A piece of markdown source: plain markdown, or a lifted tag + its body. */\nexport type MarkdownBlock =\n | { type: \"markdown\"; source: string }\n | { type: \"tag\"; tag: string; attrs: string; body: string };\n\nconst FENCE_OPEN = /^ {0,3}(`{3,}|~{3,})(.*)$/;\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/** Blank out inline code spans so tag search skips them; keeps offsets. */\nfunction maskInlineCode(line: string): string {\n let out = \"\";\n let i = 0;\n while (i < line.length) {\n if (line[i] !== \"`\") {\n out += line[i];\n i++;\n continue;\n }\n let n = 0;\n while (line[i + n] === \"`\") n++;\n const fence = \"`\".repeat(n);\n // The closing run must be exactly n backticks long.\n let search = i + n;\n let close = -1;\n while (search < line.length) {\n const at = line.indexOf(fence, search);\n if (at < 0) break;\n let len = 0;\n while (line[at + len] === \"`\") len++;\n if (len === n) {\n close = at;\n break;\n }\n search = at + len;\n }\n if (close < 0) {\n out += fence;\n i += n;\n continue;\n }\n out += \" \".repeat(close + n - i);\n i = close + n;\n }\n return out;\n}\n\nfunction scan(src: string, names: string[], trackFences: boolean): ScanResult {\n const tokens: TagToken[] = [];\n let openFenceStart = -1;\n if (names.length === 0 && !trackFences) return { tokens, openFenceStart, openFence: null };\n\n const tagRe = names.length\n ? new RegExp(`<(\\\\/?)(${names.map(escapeRegExp).join(\"|\")})(?=[\\\\s>/])([^>]*)>`, \"gi\")\n : null;\n\n let fence: { char: string; len: number } | null = null;\n let pos = 0;\n while (pos <= src.length) {\n const nl = src.indexOf(\"\\n\", pos);\n const lineEnd = nl < 0 ? src.length : nl;\n const line = src.slice(pos, lineEnd);\n\n if (trackFences) {\n if (fence) {\n const close = new RegExp(`^ {0,3}${fence.char === \"`\" ? \"`\" : \"~\"}{${fence.len},}\\\\s*$`);\n if (close.test(line)) {\n fence = null;\n openFenceStart = -1;\n }\n pos = lineEnd + 1;\n if (nl < 0) break;\n continue;\n }\n const m = FENCE_OPEN.exec(line);\n if (m && !(m[1][0] === \"`\" && m[2].includes(\"`\"))) {\n fence = { char: m[1][0], len: m[1].length };\n openFenceStart = pos;\n pos = lineEnd + 1;\n if (nl < 0) break;\n continue;\n }\n }\n\n if (tagRe) {\n const masked = trackFences ? maskInlineCode(line) : line;\n const indent = /^ {0,3}/.exec(masked)![0].length;\n tagRe.lastIndex = 0;\n let t: RegExpExecArray | null;\n while ((t = tagRe.exec(masked)) !== null) {\n const isClose = t[1] === \"/\";\n const attrs = t[3];\n if (isClose && attrs.trim() !== \"\") continue;\n if (!isClose && attrs.trimEnd().endsWith(\"/\")) continue; // self-closing\n tokens.push({\n kind: isClose ? \"close\" : \"open\",\n name: t[2].toLowerCase(),\n start: pos + t.index,\n end: pos + t.index + t[0].length,\n attrs: isClose ? \"\" : attrs.trim(),\n lineStart: t.index === indent,\n });\n }\n }\n\n if (nl < 0) break;\n pos = lineEnd + 1;\n }\n\n return { tokens, openFenceStart, openFence: fence };\n}\n\n/**\n * Where a partial tag that could still become a registered one starts on the\n * last line (`<`, `</res`, `<result title=\"x`), or -1. A `<` that cannot\n * become a known tag (`a < b`, `a<b`) is prose and is never held back.\n */\nfunction partialTagAt(lastLine: string, names: string[], markdown: boolean): number {\n if (!names.length) return -1;\n const masked = markdown ? maskInlineCode(lastLine) : lastLine;\n const lt = masked.lastIndexOf(\"<\");\n if (lt < 0) return -1;\n const m = /^<(\\/?)([A-Za-z][\\w-]*)?([^>]*)$/.exec(masked.slice(lt));\n if (!m) return -1;\n const name = (m[2] ?? \"\").toLowerCase();\n const rest = m[3];\n let partial = false;\n if (!name) partial = rest === \"\";\n else if (names.includes(name)) partial = rest === \"\" || /^\\s/.test(rest);\n else partial = rest === \"\" && names.some((n) => n.startsWith(name));\n return partial ? lt : -1;\n}\n\n/** Registered tags opened before `cut` and not yet closed, outermost first. */\nfunction openTagsBefore(tokens: TagToken[], cut: number): TagToken[] {\n const stack: TagToken[] = [];\n for (const t of tokens) {\n if (t.start >= cut) break;\n if (t.kind === \"open\") {\n stack.push(t);\n continue;\n }\n for (let k = stack.length - 1; k >= 0; k--) {\n if (stack[k].name === t.name) {\n stack.length = k;\n break;\n }\n }\n }\n return stack;\n}\n\n/**\n * Split markdown source into plain markdown and lifted tags whose names are in\n * `tags`. A tag is lifted only when its opening tag starts a line (block\n * level) and a matching closing tag exists; same-name nesting is balanced. An\n * unclosed tag stays in the markdown, where it is sanitised like any HTML.\n */\nexport function splitMarkdownBlocks(src: string, tags: string[]): MarkdownBlock[] {\n const names = tags.map((t) => t.toLowerCase());\n if (names.length === 0) return src ? [{ type: \"markdown\", source: src }] : [];\n\n const { tokens } = scan(src, names, true);\n const blocks: MarkdownBlock[] = [];\n let cursor = 0;\n let i = 0;\n\n while (i < tokens.length) {\n const open = tokens[i];\n if (open.kind !== \"open\" || !open.lineStart || open.start < cursor) {\n i++;\n continue;\n }\n let depth = 0;\n let closeIdx = -1;\n for (let j = i; j < tokens.length; j++) {\n const t = tokens[j];\n if (t.name !== open.name) continue;\n depth += t.kind === \"open\" ? 1 : -1;\n if (depth === 0) {\n closeIdx = j;\n break;\n }\n }\n if (closeIdx < 0) {\n i++;\n continue;\n }\n const close = tokens[closeIdx];\n if (open.start > cursor) blocks.push({ type: \"markdown\", source: src.slice(cursor, open.start) });\n blocks.push({ type: \"tag\", tag: open.name, attrs: open.attrs, body: src.slice(open.end, close.start) });\n cursor = close.end;\n i = closeIdx + 1;\n }\n\n if (cursor < src.length) blocks.push({ type: \"markdown\", source: src.slice(cursor) });\n return blocks;\n}\n\n/**\n * Where to cut a still-streaming source so nothing unfinished shows: an open\n * custom tag (from its opening tag), an open code fence (from its fence line),\n * or a partial tag at the very end (`<`, `</res`, `<result title=\"x`). Returns\n * `src.length` when everything present is complete.\n *\n * A `<` that cannot become a known tag (`a < b`, `a<b`) is prose and is never\n * held back. Unknown tags are never held back.\n */\nexport function streamingCut(src: string, tags: string[], markdown: boolean): number {\n const names = tags.map((t) => t.toLowerCase());\n const { tokens, openFenceStart } = scan(src, names, markdown);\n let cut = src.length;\n\n if (openFenceStart >= 0) cut = Math.min(cut, openFenceStart);\n\n const stack = openTagsBefore(tokens, cut);\n if (stack.length) cut = Math.min(cut, stack[0].start);\n\n // Only the last line can hold something still arriving.\n const lastLineStart = src.lastIndexOf(\"\\n\", cut - 1) + 1;\n const lastLine = src.slice(lastLineStart, cut);\n\n if (markdown && /^ {0,3}(`{1,2}|~{1,2})$/.test(lastLine)) {\n return Math.min(cut, lastLineStart);\n }\n\n const lt = partialTagAt(lastLine, names, markdown);\n if (lt >= 0) cut = Math.min(cut, lastLineStart + lt);\n\n return cut;\n}\n\n/** A still-streaming source made renderable as it fills (`streaming=\"progressive\"`). */\nexport interface ProgressiveSource {\n /** The source with partial trailing markers held back and open blocks closed. */\n source: string;\n /**\n * A code fence was still open and has been closed here, so the LAST code\n * block in the rendered output is the one still arriving.\n */\n openFence: boolean;\n}\n\n/**\n * Progressive streaming: show an open block as it fills instead of holding it\n * back. What is still held back is only what cannot be rendered honestly yet:\n *\n * - a partial tag at the very end that could still become a registered one\n * (`<`, `<result title=\"Do`, `</res`), exactly as `streamingCut` holds it;\n * - a fence opener line with no newline yet (its info string may be partial);\n * - a fence marker still arriving (a run of backticks or tildes shorter than a\n * fence), whether it would open or close one.\n *\n * Then an open code fence is closed with its own marker, and every registered\n * tag still open is closed innermost first, so the normal pipeline renders the\n * body-so-far: lifted, converted, sanitised, with nested extensions, exactly\n * as the final render will once the real closing tags arrive.\n */\nexport function streamingProgressive(src: string, tags: string[], markdown: boolean): ProgressiveSource {\n const names = tags.map((t) => t.toLowerCase());\n const { tokens, openFenceStart, openFence } = scan(src, names, markdown);\n let cut = src.length;\n let fence = openFenceStart >= 0 ? openFence : null;\n\n const lastLineStart = src.lastIndexOf(\"\\n\", cut - 1) + 1;\n const lastLine = src.slice(lastLineStart);\n\n if (fence) {\n if (openFenceStart === lastLineStart) {\n // The opener itself is still arriving: hold it, there is no code yet.\n cut = openFenceStart;\n fence = null;\n } else {\n // Inside code `<` is just code, so no partial-tag check; only a closing\n // marker still arriving is held.\n const m = /^ {0,3}(`+|~+)$/.exec(lastLine);\n if (m && m[1][0] === fence.char && m[1].length < fence.len) cut = lastLineStart;\n }\n } else if (markdown && /^ {0,3}(`{1,2}|~{1,2})$/.test(lastLine)) {\n cut = lastLineStart;\n } else {\n const lt = partialTagAt(lastLine, names, markdown);\n if (lt >= 0) cut = lastLineStart + lt;\n }\n\n let out = src.slice(0, cut);\n if (fence) {\n out += (out.endsWith(\"\\n\") ? \"\" : \"\\n\") + fence.char.repeat(fence.len) + \"\\n\";\n }\n const stack = openTagsBefore(tokens, fence ? openFenceStart : cut);\n for (let k = stack.length - 1; k >= 0; k--) out += `</${stack[k].name}>`;\n\n return { source: out, openFence: fence !== null };\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type RefObject,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Button } from \"../Button/Button\";\nimport type {\n ContentClipboardPayload,\n ContentClipboardWriter,\n ContentCopyEvent,\n ContentCopyKind,\n} from \"./ContentRenderer.types\";\n\n/** How long the check icon stays after a copy. */\nconst FEEDBACK_MS = 2000;\n/** A clipboard write that never settles is a silent failure; give up after this. */\nconst WRITE_TIMEOUT_MS = 5000;\n\nexport interface CopyContextValue {\n code: boolean;\n table: boolean;\n /** Write, announce, and report one copy. Resolves to whether it worked. */\n copy: (payload: ContentClipboardPayload, button: HTMLElement) => Promise<boolean>;\n /**\n * Progressive streaming closed an open code fence: the last code block of\n * the tail chunk is still arriving and gets no copy button until it closes.\n */\n holdTailCode?: boolean;\n}\n\nexport const CopyContext = createContext<CopyContextValue | null>(null);\n\n/**\n * Default clipboard writer: text/html + text/plain via `ClipboardItem` where\n * the browser has it, else (or if that write rejects) plain `writeText`.\n * Throws when nothing could be written, so the caller can say so.\n */\nexport async function defaultClipboardWriter(payload: ContentClipboardPayload): Promise<void> {\n const clip = typeof navigator !== \"undefined\" ? navigator.clipboard : undefined;\n if (!clip) throw new Error(\"Clipboard API unavailable\");\n\n const Item = (globalThis as { ClipboardItem?: typeof ClipboardItem }).ClipboardItem;\n if (payload.html && Item && typeof clip.write === \"function\") {\n try {\n await clip.write([\n new Item({\n \"text/html\": new Blob([payload.html], { type: \"text/html\" }),\n \"text/plain\": new Blob([payload.text], { type: \"text/plain\" }),\n }),\n ]);\n return;\n } catch {\n // Rich write refused (permissions, unsupported type): fall back to text.\n }\n }\n if (typeof clip.writeText !== \"function\") throw new Error(\"Clipboard writeText unavailable\");\n await clip.writeText(payload.text);\n}\n\n/** Run a writer, treating a throw, a rejection, `false`, or a hang as failure. */\nexport async function runWriter(\n writer: ContentClipboardWriter,\n payload: ContentClipboardPayload,\n): Promise<boolean> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const result = await Promise.race([\n Promise.resolve().then(() => writer(payload)),\n new Promise<false>((resolve) => {\n timer = setTimeout(() => resolve(false), WRITE_TIMEOUT_MS);\n }),\n ]);\n return result !== false;\n } catch {\n return false;\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\n/** Code exactly as written: the `<code>` text, minus the newline marked appends. */\nexport function codeText(pre: HTMLElement, fromMarkdown: boolean): string {\n const text = (pre.querySelector(\"code\") ?? pre).textContent ?? \"\";\n return fromMarkdown && text.endsWith(\"\\n\") ? text.slice(0, -1) : text;\n}\n\n/** A table as TSV: tab between cells, newline between rows, no trailing newline. */\nexport function tableTsv(table: HTMLTableElement): string {\n const rows: string[] = [];\n for (const tr of Array.from(table.querySelectorAll(\"tr\"))) {\n // Only this table's own cells, not those of a table nested in a cell.\n if (tr.closest(\"table\") !== table) continue;\n const cells = Array.from(tr.children).filter((c) => c.tagName === \"TD\" || c.tagName === \"TH\");\n rows.push(cells.map((c) => cellText(c)).join(\"\\t\"));\n }\n return rows.join(\"\\n\");\n}\n\nfunction cellText(cell: Element): string {\n const clone = cell.cloneNode(true) as Element;\n for (const br of Array.from(clone.querySelectorAll(\"br\"))) br.replaceWith(\" \");\n return (clone.textContent ?? \"\").replace(/[\\t\\r\\n]+/g, \" \").replace(/ {2,}/g, \" \").trim();\n}\n\ninterface Target {\n kind: ContentCopyKind;\n el: HTMLElement;\n host: HTMLElement;\n}\n\n/**\n * Sanitised HTML rendered with `dangerouslySetInnerHTML`, plus a react-fancy\n * copy `Button` portalled next to every `<pre>` and `<table>` in it.\n *\n * Each block is wrapped in a `data-react-fancy-content-copy-block` element and\n * the button lives beside the block, never inside it, so the button's own text\n * can never end up in what is copied.\n */\nexport function HtmlChunk({\n html,\n fromMarkdown,\n tail = false,\n}: {\n html: string;\n fromMarkdown: boolean;\n /** This chunk is the last thing rendered, so it holds any block still arriving. */\n tail?: boolean;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const ctx = useContext(CopyContext);\n const [targets, setTargets] = useState<Target[]>([]);\n const code = ctx?.code ?? false;\n const table = ctx?.table ?? false;\n const holdLastCode = tail && (ctx?.holdTailCode ?? false);\n // React 19 re-assigns innerHTML whenever this prop is a NEW object, even\n // with the same string, which would wipe the wrappers on every re-render\n // (including the one that mounts the buttons). One object per string.\n const inner = useMemo(() => ({ __html: html }), [html]);\n\n useLayoutEffect(() => {\n const root = ref.current;\n if (!root || (!code && !table)) {\n setTargets([]);\n return;\n }\n const found: Target[] = [];\n const selector = [code && \"pre\", table && \"table\"].filter(Boolean).join(\",\");\n const inProgress = holdLastCode ? Array.from(root.querySelectorAll(\"pre\")).pop() : undefined;\n for (const el of Array.from(root.querySelectorAll<HTMLElement>(selector))) {\n if (el === inProgress) continue;\n const kind: ContentCopyKind = el.tagName === \"PRE\" ? \"code\" : \"table\";\n const wrapper = document.createElement(\"div\");\n wrapper.setAttribute(\"data-react-fancy-content-copy-block\", kind);\n wrapper.className = kind === \"code\" ? \"group relative\" : \"group relative flex flex-col\";\n // Inline too: the code button is absolute, and a host whose Tailwind\n // never generated `relative` would let it escape the block (genie#1290).\n wrapper.style.position = \"relative\";\n const host = document.createElement(\"div\");\n host.setAttribute(\"data-react-fancy-content-copy-host\", \"\");\n host.className =\n kind === \"code\" ? \"absolute right-2 top-2 z-10\" : \"flex justify-end\";\n el.replaceWith(wrapper);\n if (kind === \"table\") wrapper.append(host, el);\n else wrapper.append(el, host);\n found.push({ kind, el, host });\n }\n setTargets(found);\n return () => {\n for (const t of found) {\n const wrapper = t.host.parentElement;\n if (wrapper?.parentNode) wrapper.replaceWith(t.el);\n }\n };\n }, [html, code, table, holdLastCode]);\n\n return (\n <>\n <div ref={ref} dangerouslySetInnerHTML={inner} />\n {targets.map((t, i) =>\n createPortal(\n <CopyButton kind={t.kind} target={t.el} fromMarkdown={fromMarkdown} />,\n t.host,\n `${i}`,\n ),\n )}\n </>\n );\n}\n\ntype CopyState = \"idle\" | \"copied\" | \"failed\";\n\nfunction CopyButton({\n kind,\n target,\n fromMarkdown,\n}: {\n kind: ContentCopyKind;\n target: HTMLElement;\n fromMarkdown: boolean;\n}) {\n const ctx = useContext(CopyContext);\n const [state, setState] = useState<CopyState>(\"idle\");\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const btn = useRef<HTMLButtonElement>(null);\n\n useEffect(() => () => clearTimeout(timer.current), []);\n\n const onClick = useCallback(async () => {\n if (!ctx || !btn.current) return;\n const text =\n kind === \"code\" ? codeText(target, fromMarkdown) : tableTsv(target as HTMLTableElement);\n const ok = await ctx.copy({ kind, text, html: target.outerHTML }, btn.current);\n setState(ok ? \"copied\" : \"failed\");\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setState(\"idle\"), FEEDBACK_MS);\n }, [ctx, kind, target, fromMarkdown]);\n\n const idleLabel = kind === \"code\" ? \"Copy code\" : \"Copy table\";\n const label = state === \"copied\" ? \"Copied\" : state === \"failed\" ? \"Copy failed\" : idleLabel;\n\n return (\n <Button\n ref={btn}\n type=\"button\"\n size=\"xs\"\n variant=\"ghost\"\n icon={state === \"copied\" ? \"check\" : state === \"failed\" ? \"x\" : \"copy\"}\n aria-label={label}\n title={label}\n data-react-fancy-content-copy={kind}\n data-copy-state={state}\n onClick={onClick}\n className={\n kind === \"code\"\n ? \"text-zinc-300 hover:bg-zinc-800 hover:text-white opacity-70 group-hover:opacity-100 focus-visible:opacity-100\"\n : \"opacity-70 group-hover:opacity-100 focus-visible:opacity-100\"\n }\n />\n );\n}\n\n/** Build the copy pipeline a ContentRenderer root shares with its chunks. */\nexport function useCopyPipeline({\n writer,\n onCopy,\n rootRef,\n announce,\n}: {\n writer: ContentClipboardWriter | undefined;\n onCopy: ((event: ContentCopyEvent) => void) | undefined;\n rootRef: RefObject<HTMLElement | null>;\n announce: (message: string) => void;\n}) {\n // Read the latest props at click time without re-creating the context.\n const latest = useRef({ writer, onCopy, announce });\n latest.current = { writer, onCopy, announce };\n\n return useCallback(\n async (payload: ContentClipboardPayload, button: HTMLElement) => {\n const { writer: w, onCopy: report, announce: say } = latest.current;\n const ok = await runWriter(w ?? defaultClipboardWriter, payload);\n say(ok ? \"Copied\" : \"Copy failed\");\n const all = rootRef.current\n ? Array.from(rootRef.current.querySelectorAll(\"[data-react-fancy-content-copy]\"))\n : [];\n report?.({ ...payload, index: all.indexOf(button), ok });\n return ok;\n },\n [rootRef],\n );\n}\n","import { useMemo } from \"react\";\nimport { markdownToRawHtml } from \"../../utils/markdown\";\nimport { sanitizeHtml } from \"../../utils/sanitize\";\nimport type { RenderExtension } from \"./extensions\";\nimport { parseSegments, tagAttributes } from \"./extensions\";\nimport { splitMarkdownBlocks } from \"./markdown-blocks\";\nimport { HtmlChunk } from \"./copy\";\n\n/**\n * Markdown-body tags nest; past this depth a body is rendered as plain\n * sanitised content with no further extensions, so hostile input cannot\n * recurse without bound.\n */\nconst MAX_DEPTH = 8;\n\ninterface ContentBodyProps {\n source: string;\n format: \"html\" | \"markdown\";\n extensions: RenderExtension[];\n unsafe: boolean;\n depth?: number;\n /**\n * This body is the last thing the renderer shows, so under progressive\n * streaming it holds any block still arriving. Passed only to the last piece.\n */\n tail?: boolean;\n}\n\n/** Index of the last piece that renders anything, or -1. */\nfunction lastIndexWith<T>(items: T[], renders: (item: T) => boolean): number {\n for (let i = items.length - 1; i >= 0; i--) if (renders(items[i])) return i;\n return -1;\n}\n\n/**\n * Renders a source string. In markdown, extensions marked `markdown: true` are\n * lifted out of the SOURCE first (so their body is still markdown); every\n * other piece is converted, sanitised, and then searched for the remaining\n * extension tags as before.\n */\nexport function ContentBody({ source, format, extensions, unsafe, depth = 0, tail = false }: ContentBodyProps) {\n const active = depth >= MAX_DEPTH ? [] : extensions;\n const blocks = useMemo(() => {\n if (format !== \"markdown\") return null;\n const mdTags = active.filter((e) => e.markdown).map((e) => e.tag);\n return splitMarkdownBlocks(source, mdTags);\n }, [source, format, active]);\n\n if (!blocks) {\n const html = unsafe ? source : sanitizeHtml(source);\n return (\n <RenderedContent\n html={html}\n extensions={active}\n unsafe={unsafe}\n fromMarkdown={false}\n depth={depth}\n tail={tail}\n />\n );\n }\n\n const last = tail\n ? lastIndexWith(blocks, (b) => b.type === \"tag\" || b.source.trim() !== \"\")\n : -1;\n\n return (\n <>\n {blocks.map((block, i) => {\n if (block.type === \"markdown\") {\n const raw = markdownToRawHtml(block.source);\n const html = unsafe ? raw : sanitizeHtml(raw);\n return (\n <RenderedContent\n key={i}\n html={html}\n extensions={active}\n unsafe={unsafe}\n fromMarkdown\n depth={depth}\n tail={i === last}\n />\n );\n }\n const ext = active.find((e) => e.tag.toLowerCase() === block.tag);\n if (!ext) return null;\n const Component = ext.component;\n const Wrapper = ext.block !== false ? \"div\" : \"span\";\n return (\n <Wrapper key={i} data-render-extension={block.tag}>\n <Component content={block.body} attributes={tagAttributes(block.attrs, unsafe)}>\n <ContentBody\n source={block.body}\n format=\"markdown\"\n extensions={active}\n unsafe={unsafe}\n depth={depth + 1}\n tail={i === last}\n />\n </Component>\n </Wrapper>\n );\n })}\n </>\n );\n}\n\ninterface RenderedContentProps {\n html: string;\n extensions: RenderExtension[];\n /**\n * If true, html is rendered as-is without per-segment sanitization. Caller\n * (ContentBody) is expected to have already sanitized — or explicitly opted\n * out — at the top level.\n */\n unsafe: boolean;\n /** The HTML came from marked, so a code block's text ends in an added newline. */\n fromMarkdown: boolean;\n depth: number;\n /** See `ContentBodyProps.tail`. */\n tail?: boolean;\n}\n\n/**\n * Renders an HTML string with extension support. Plain HTML segments are\n * injected (with copy buttons); custom-tag segments are rendered via their\n * registered React component.\n */\nexport function RenderedContent({\n html,\n extensions,\n unsafe,\n fromMarkdown,\n depth,\n tail = false,\n}: RenderedContentProps) {\n const segments = useMemo(() => parseSegments(html, extensions), [html, extensions]);\n\n const renderHtml = (content: string): string => (unsafe ? content : sanitizeHtml(content));\n\n if (segments.length === 0) return null;\n\n // Fast path: no extensions matched.\n if (segments.length === 1 && segments[0].type === \"html\") {\n return <HtmlChunk html={renderHtml(segments[0].content)} fromMarkdown={fromMarkdown} tail={tail} />;\n }\n\n const last = tail\n ? lastIndexWith(segments, (s) => s.type === \"extension\" || s.content.trim() !== \"\")\n : -1;\n\n return (\n <>\n {segments.map((segment, i) => {\n if (segment.type === \"html\") {\n return segment.content ? (\n <HtmlChunk\n key={i}\n html={renderHtml(segment.content)}\n fromMarkdown={fromMarkdown}\n tail={i === last}\n />\n ) : null;\n }\n\n const ext = extensions.find((e) => e.tag.toLowerCase() === segment.tag);\n if (!ext) return null;\n\n const Component = ext.component;\n const Wrapper = ext.block !== false ? \"div\" : \"span\";\n // A markdown-body tag reached here only as HTML (inline, unclosed, or\n // in HTML content); its body is HTML, rendered the same way.\n const children = ext.markdown ? (\n <ContentBody\n source={segment.content}\n format=\"html\"\n extensions={extensions}\n unsafe={unsafe}\n depth={depth + 1}\n tail={i === last}\n />\n ) : undefined;\n\n return (\n <Wrapper key={i} data-render-extension={segment.tag}>\n <Component content={segment.content} attributes={segment.attributes}>\n {children}\n </Component>\n </Wrapper>\n );\n })}\n </>\n );\n}\n\nRenderedContent.displayName = \"RenderedContent\";\nContentBody.displayName = \"ContentBody\";\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { visuallyHidden } from \"../../utils/visually-hidden\";\nimport { proseClasses, detectFormat } from \"../Editor/editor.utils\";\nimport { mergeExtensions } from \"./extensions\";\nimport { ContentBody } from \"./RenderedContent\";\nimport { CopyContext, useCopyPipeline, type CopyContextValue } from \"./copy\";\nimport { streamingCut, streamingProgressive } from \"./markdown-blocks\";\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 copyButtons = true,\n onCopy,\n clipboardWriter,\n streaming = false,\n}: ContentRendererProps) {\n const extensions = useMemo(\n () => mergeExtensions(instanceExtensions),\n [instanceExtensions],\n );\n\n // Guard nullish input: marked.parse throws \"input parameter is undefined\n // or null\", which during render would crash the whole React tree. Treat\n // missing content as empty.\n const safe = value ?? \"\";\n const resolvedFormat = format === \"auto\" ? detectFormat(safe) : format;\n\n const progressive = streaming === \"progressive\";\n const { source, openFence } = useMemo(() => {\n if (!streaming) return { source: safe, openFence: false };\n const tags = extensions.map((e) => e.tag);\n const markdown = resolvedFormat === \"markdown\";\n if (progressive) return streamingProgressive(safe, tags, markdown);\n return { source: safe.slice(0, streamingCut(safe, tags, markdown)), openFence: false };\n }, [safe, streaming, progressive, extensions, resolvedFormat]);\n\n const codeOn = copyButtons === true || (typeof copyButtons === \"object\" && copyButtons.code !== false);\n const tableOn = copyButtons === true || (typeof copyButtons === \"object\" && copyButtons.table !== false);\n const copyOn = codeOn || tableOn;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const [announcement, setAnnouncement] = useState(\"\");\n const announce = useCallback((message: string) => {\n // Clear first so the same message twice in a row is announced twice.\n setAnnouncement(\"\");\n queueMicrotask(() => setAnnouncement(message));\n }, []);\n const copy = useCopyPipeline({ writer: clipboardWriter, onCopy, rootRef, announce });\n const copyContext = useMemo<CopyContextValue>(\n () => ({ code: codeOn, table: tableOn, copy, holdTailCode: openFence }),\n [codeOn, tableOn, copy, openFence],\n );\n\n // The live region is `position: absolute`. With nothing positioned around it,\n // it escapes to an ancestor outside an unpositioned scroll container and\n // stretches the document (genie#1290). So the root contains it, unless the\n // host's className already positions the root (twMerge drops our `relative`\n // when it does): sticky / absolute / fixed contain it too, and an explicit\n // `static` is the host's call.\n const contain = copyOn && cn(\"relative\", className).split(\" \").includes(\"relative\");\n\n return (\n <div\n ref={rootRef}\n data-react-fancy-content-renderer=\"\"\n data-streaming={streaming ? \"true\" : undefined}\n data-streaming-mode={progressive ? \"progressive\" : undefined}\n style={contain ? { lineHeight: lineSpacing, position: \"relative\" } : { lineHeight: lineSpacing }}\n className={cn(\"text-sm\", proseClasses, className)}\n >\n <CopyContext.Provider value={copyContext}>\n <ContentBody\n source={source}\n format={resolvedFormat}\n extensions={extensions}\n unsafe={unsafe}\n tail\n />\n </CopyContext.Provider>\n {copyOn && (\n <span\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n data-react-fancy-content-renderer-live=\"\"\n className=\"sr-only\"\n style={visuallyHidden}\n >\n {announcement}\n </span>\n )}\n </div>\n );\n}\n\nContentRenderer.displayName = \"ContentRenderer\";\n"]}
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ var chunk6V44RRSB_cjs = require('./chunk-6V44RRSB.cjs');
3
4
  var chunkSNHU2AI4_cjs = require('./chunk-SNHU2AI4.cjs');
4
5
  var chunkZU5Q77OT_cjs = require('./chunk-ZU5Q77OT.cjs');
5
6
  var react = require('react');
@@ -147,6 +148,7 @@ function FileBrowserPathBar({
147
148
  onChange: (e) => setDraft(e.target.value),
148
149
  onKeyDown: (e) => {
149
150
  if (e.key === "Enter") {
151
+ if (chunk6V44RRSB_cjs.isImeComposing(e)) return;
150
152
  e.preventDefault();
151
153
  commit();
152
154
  } else if (e.key === "Escape") {
@@ -312,6 +314,7 @@ function FileBrowserNewFolder({ className }) {
312
314
  },
313
315
  onKeyDown: (e) => {
314
316
  if (e.key === "Enter") {
317
+ if (chunk6V44RRSB_cjs.isImeComposing(e)) return;
315
318
  e.preventDefault();
316
319
  void submit();
317
320
  } else if (e.key === "Escape") {
@@ -1084,5 +1087,5 @@ exports.FileBrowser = FileBrowser;
1084
1087
  exports.FileBrowserNewFolder = FileBrowserNewFolder;
1085
1088
  exports.useFileBrowser = useFileBrowser;
1086
1089
  exports.validateFolderName = validateFolderName;
1087
- //# sourceMappingURL=chunk-G5DMYAWL.cjs.map
1088
- //# sourceMappingURL=chunk-G5DMYAWL.cjs.map
1090
+ //# sourceMappingURL=chunk-O5ORO2RX.cjs.map
1091
+ //# sourceMappingURL=chunk-O5ORO2RX.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/FileBrowser/FileBrowser.context.ts","../src/components/FileBrowser/FileBrowser.utils.ts","../src/components/FileBrowser/FileBrowserPathBar.tsx","../src/components/FileBrowser/FileBrowserNewFolder.tsx","../src/components/FileBrowser/FileBrowserToolbar.tsx","../src/components/FileBrowser/FileBrowserNode.tsx","../src/components/FileBrowser/FileBrowserTree.tsx","../src/components/FileBrowser/FileBrowser.tsx"],"names":["createContext","useContext","useState","jsxs","cn","jsx","isImeComposing","Fragment","ChevronRight","Pencil","useRef","useEffect","FolderPlus","Search","X","ArrowUp","ArrowDown","CircleAlert","RotateCw","Loader2","useControllableState","useMemo","useCallback"],"mappings":"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","file":"chunk-O5ORO2RX.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { FileBrowserContextValue } from \"./FileBrowser.types\";\n\nexport const FileBrowserContext = createContext<FileBrowserContextValue | null>(null);\n\nexport function useFileBrowser(): FileBrowserContextValue {\n const ctx = useContext(FileBrowserContext);\n if (!ctx) {\n throw new Error(\"useFileBrowser must be used within a <FileBrowser> component\");\n }\n return ctx;\n}\n","import type { FileEntry, FileSort } from \"./FileBrowser.types\";\n\n/**\n * Normalize free-typed path input: forward slashes, collapsed separators,\n * resolved `.` / `..` segments, no trailing slash. Absolute paths stay\n * absolute; relative paths stay relative (entry paths are identity and are\n * never rewritten — this is only for the editable path input).\n */\nexport function normalizePath(input: string): string {\n const raw = input.trim().replace(/\\\\/g, \"/\");\n if (raw === \"\") return \"/\";\n const absolute = raw.startsWith(\"/\");\n const out: string[] = [];\n for (const segment of raw.split(\"/\")) {\n if (segment === \"\" || segment === \".\") continue;\n if (segment === \"..\") {\n out.pop();\n continue;\n }\n out.push(segment);\n }\n if (out.length === 0) return \"/\";\n return (absolute ? \"/\" : \"\") + out.join(\"/\");\n}\n\n/** Parent of a path. Paths without a separator group under `\"/\"`. */\nexport function parentPath(path: string): string {\n const i = path.lastIndexOf(\"/\");\n if (i === -1) return \"/\";\n if (i === 0) return \"/\";\n return path.slice(0, i);\n}\n\nexport interface PathSegment {\n label: string;\n path: string;\n}\n\n/** Cumulative breadcrumb segments for a path (root anchor excluded). */\nexport function pathSegments(path: string): PathSegment[] {\n const absolute = path.startsWith(\"/\");\n const parts = path.split(\"/\").filter(Boolean);\n const segments: PathSegment[] = [];\n let acc = \"\";\n parts.forEach((part, i) => {\n acc = i === 0 && !absolute ? part : `${acc}/${part}`;\n segments.push({ label: part, path: acc });\n });\n return segments;\n}\n\n/**\n * Deterministic, numeric-aware name comparison. The locale is pinned to \"en\"\n * so server and client renders order identically (SSR safety).\n */\nfunction compareNames(a: string, b: string): number {\n const cmp = a.localeCompare(b, \"en\", { numeric: true, sensitivity: \"base\" });\n if (cmp !== 0) return cmp;\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/** Dirs-first, then the active sort field, with a stable ascending name tie-break. */\nexport function compareFileEntries(a: FileEntry, b: FileEntry, sort: FileSort): number {\n if (a.kind !== b.kind) return a.kind === \"dir\" ? -1 : 1;\n const direction = sort.direction === \"desc\" ? -1 : 1;\n let cmp: number;\n switch (sort.by) {\n case \"size\":\n cmp = (a.size ?? -1) - (b.size ?? -1);\n break;\n case \"mtime\": {\n const am = a.mtime ?? \"\";\n const bm = b.mtime ?? \"\";\n cmp = am < bm ? -1 : am > bm ? 1 : 0;\n break;\n }\n default:\n cmp = compareNames(a.name, b.name);\n }\n if (cmp !== 0) return direction * cmp;\n return compareNames(a.name, b.name);\n}\n\n/**\n * Whether a dir shows an expand affordance: known-empty dirs never do\n * (`hasChildren: false`, or a loaded/snapshot listing of zero entries);\n * unknown-depth dirs only do when a provider can load them.\n */\nexport function isEntryExpandable(\n entry: FileEntry,\n children: FileEntry[] | undefined,\n hasProvider: boolean,\n): boolean {\n if (entry.kind !== \"dir\" || entry.hasChildren === false) return false;\n if (children !== undefined) return children.length > 0;\n return hasProvider;\n}\n\n/**\n * Client-side name filter over loaded nodes only: an entry matches when its\n * name contains the query, or (for dirs) when any already-loaded descendant\n * matches. Never triggers loads.\n */\nexport function entryMatchesFilter(\n entry: FileEntry,\n query: string,\n entriesFor: (path: string) => FileEntry[] | undefined,\n visited: Set<string> = new Set(),\n): boolean {\n if (entry.name.toLowerCase().includes(query)) return true;\n if (entry.kind !== \"dir\" || visited.has(entry.path)) return false;\n visited.add(entry.path);\n const children = entriesFor(entry.path);\n return children?.some((child) => entryMatchesFilter(child, query, entriesFor, visited)) ?? false;\n}\n\n/** Compact, deterministic byte formatting (\"1.4 KB\", \"12 MB\"). */\nexport function formatFileSize(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return \"\";\n if (bytes < 1024) return `${bytes} B`;\n const units = [\"KB\", \"MB\", \"GB\", \"TB\"];\n let value = bytes;\n let unit = -1;\n do {\n value /= 1024;\n unit++;\n } while (value >= 1024 && unit < units.length - 1);\n const rounded = value >= 100 ? Math.round(value) : Math.round(value * 10) / 10;\n return `${rounded} ${units[unit]}`;\n}\n\n/**\n * Why a proposed folder name cannot be used, or `null` if it can.\n *\n * Only checks what the BROWSER can know: that the name is a name rather than a\n * path, and that nothing in this directory already answers to it. Case\n * sensitivity, reserved device names and length limits depend on a filesystem\n * this component cannot see, so they stay the host's to enforce — and the host\n * rejecting a create is a supported outcome, surfaced on the form.\n *\n * A collision counts against FILES too. `mkdir` fails the same way either way,\n * and \"there is already an index.ts here\" is the useful message.\n */\nexport function validateFolderName(\n raw: string,\n siblings: ReadonlyArray<{ name: string }>,\n): string | null {\n const name = raw.trim();\n\n if (name === \"\") return \"Enter a name.\";\n // `/` and `\\` make it a path, not a name; `.`/`..` are traversal. Forwarding\n // either would make the host decide what an escape attempt means.\n if (name.includes(\"/\") || name.includes(\"\\\\\")) return \"A name cannot contain / or \\.\";\n if (name === \".\" || name === \"..\") return \"That name is reserved.\";\n\n if (siblings.some((entry) => entry.name === name)) {\n return `“${name}” already exists here.`;\n }\n\n return null;\n}\n","import { Fragment, useState } from \"react\";\nimport { ChevronRight, Pencil } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { isImeComposing } from \"../../utils/ime\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { normalizePath, pathSegments } from \"./FileBrowser.utils\";\nimport type { FileBrowserPathBarProps } from \"./FileBrowser.types\";\n\n// Segment styling mirrors Breadcrumbs.Item (the Breadcrumbs component itself\n// is href-only and collapses to a dropdown on mobile, so the path bar renders\n// its own always-visible, click-to-navigate trail).\nconst SEGMENT_CLASS =\n \"shrink-0 rounded text-[13px] text-[color:var(--fancy-text-muted,var(--color-zinc-500))] transition-colors hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\";\nconst ACTIVE_SEGMENT_CLASS = \"shrink-0 truncate text-[13px] font-medium text-zinc-900 dark:text-white\";\n\n/**\n * Breadcrumb trail over the current directory plus an editable path input —\n * type a POSIX-style path and press Enter to navigate (lazy-loading it in\n * provider mode). Escape or blur cancels the edit.\n */\nexport function FileBrowserPathBar({\n editable = true,\n placeholder = \"/path/to/folder\",\n className,\n}: FileBrowserPathBarProps) {\n const { path, navigate } = useFileBrowser();\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(\"\");\n\n const startEdit = () => {\n setDraft(path);\n setEditing(true);\n };\n\n const commit = () => {\n navigate(normalizePath(draft));\n setEditing(false);\n };\n\n const segments = pathSegments(path);\n const atRoot = segments.length === 0;\n\n return (\n <div\n data-react-fancy-file-browser-path=\"\"\n className={cn(\n \"flex items-center gap-1 border-b border-[color:var(--fancy-border,var(--color-zinc-200))] px-2 py-1.5 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n className,\n )}\n >\n {editing ? (\n <input\n data-react-fancy-file-browser-path-input=\"\"\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n if (isImeComposing(e)) return;\n e.preventDefault();\n commit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setEditing(false);\n }\n }}\n onBlur={() => setEditing(false)}\n autoFocus\n spellCheck={false}\n placeholder={placeholder}\n aria-label=\"Path\"\n className=\"min-w-0 flex-1 rounded-md border border-zinc-300 bg-transparent px-2 py-0.5 font-mono text-xs text-[color:var(--fancy-text-soft,var(--color-zinc-700))] outline-none placeholder:text-zinc-400 focus:border-blue-400 dark:border-zinc-600 dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\"\n />\n ) : (\n <nav\n aria-label=\"Path\"\n onDoubleClick={editable ? startEdit : undefined}\n className=\"flex min-w-0 flex-1 items-center gap-1 overflow-x-auto\"\n >\n {atRoot ? (\n <span data-react-fancy-file-browser-path-segment=\"\" aria-current=\"location\" className={ACTIVE_SEGMENT_CLASS}>\n /\n </span>\n ) : (\n <button\n type=\"button\"\n data-react-fancy-file-browser-path-segment=\"\"\n onClick={() => navigate(\"/\")}\n className={SEGMENT_CLASS}\n >\n /\n </button>\n )}\n {segments.map((segment, i) => {\n const last = i === segments.length - 1;\n return (\n <Fragment key={segment.path}>\n {i > 0 && (\n <ChevronRight size={12} aria-hidden=\"true\" className=\"shrink-0 text-zinc-400\" />\n )}\n {last ? (\n <span\n data-react-fancy-file-browser-path-segment=\"\"\n aria-current=\"location\"\n className={ACTIVE_SEGMENT_CLASS}\n >\n {segment.label}\n </span>\n ) : (\n <button\n type=\"button\"\n data-react-fancy-file-browser-path-segment=\"\"\n onClick={() => navigate(segment.path)}\n className={SEGMENT_CLASS}\n >\n {segment.label}\n </button>\n )}\n </Fragment>\n );\n })}\n </nav>\n )}\n {editable && !editing && (\n <button\n type=\"button\"\n aria-label=\"Edit path\"\n onClick={startEdit}\n className=\"shrink-0 rounded-md p-1 text-zinc-400 transition-colors hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-zinc-600 dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:hover:text-zinc-300\"\n >\n <Pencil size={13} />\n </button>\n )}\n </div>\n );\n}\n\nFileBrowserPathBar.displayName = \"FileBrowserPathBar\";\n","import { useEffect, useRef, useState } from \"react\";\nimport { FolderPlus } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { isImeComposing } from \"../../utils/ime\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { validateFolderName } from \"./FileBrowser.utils\";\n\n/**\n * The \"New folder\" affordance — rendered only when the host opted in by\n * supplying `onCreateFolder`.\n *\n * ## Why an inline input and not `window.prompt`\n *\n * A prompt blocks the event loop, cannot be styled or themed, is unusable on\n * mobile, and — the one that matters for this suite — cannot be driven by an\n * agent. The Human+ contract asks that every interactive element carry a stable\n * handle an agent can target; a native dialog has none.\n *\n * ## Why validation lives here\n *\n * The browser already knows what is in the current directory. The host would\n * have to round-trip to find out, so a duplicate name becomes a failed write\n * and an error toast instead of a message before anything is attempted. Name\n * rules that are about PATHS rather than policy — separators, `.`, `..` — are\n * checked here too: those are not names, and forwarding them makes the host\n * decide what a traversal attempt means.\n *\n * Anything else is the host's call. This does not guess at case-sensitivity,\n * reserved Windows device names, or length limits, because the answer depends\n * on a filesystem the browser cannot see.\n */\nexport function FileBrowserNewFolder({ className }: { className?: string }) {\n const { path, entriesFor, onCreateFolder, loadPath, hasProvider } = useFileBrowser();\n\n const [open, setOpen] = useState(false);\n const [name, setName] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (open) inputRef.current?.focus();\n }, [open]);\n\n // Navigating away mid-name would otherwise create the folder in a directory\n // the person is no longer looking at.\n useEffect(() => {\n setOpen(false);\n setName(\"\");\n setError(null);\n }, [path]);\n\n if (!onCreateFolder) return null;\n\n const siblings = entriesFor(path) ?? [];\n const problem = validateFolderName(name, siblings);\n const canSubmit = !busy && problem === null;\n\n const close = () => {\n setOpen(false);\n setName(\"\");\n setError(null);\n };\n\n const submit = async () => {\n if (busy) return;\n const trimmed = name.trim();\n const invalid = validateFolderName(name, siblings);\n if (invalid) {\n setError(invalid);\n return;\n }\n\n setBusy(true);\n setError(null);\n try {\n await onCreateFolder({ parentPath: path, name: trimmed });\n // Only on success. Reloading after a failure would hide the failure\n // behind an unchanged listing, and closing would claim it worked.\n if (hasProvider) loadPath(path, { reload: true });\n setOpen(false);\n setName(\"\");\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setBusy(false);\n }\n };\n\n if (!open) {\n return (\n <button\n type=\"button\"\n data-react-fancy-file-browser-new-folder=\"\"\n onClick={() => setOpen(true)}\n title={`New folder in ${path}`}\n className={cn(\n \"flex shrink-0 items-center gap-1 rounded-md px-1.5 py-0.5 text-xs text-zinc-500 transition-colors\",\n \"hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\",\n className,\n )}\n >\n <FolderPlus size={13} aria-hidden=\"true\" />\n New folder\n </button>\n );\n }\n\n // Show the reason as soon as there is a name to judge — but not for an empty\n // field, which is \"not typed yet\" rather than wrong.\n //\n // This pairs with the disabled submit deliberately. A disabled button and no\n // explanation is the worst combination: the person has typed something\n // reasonable, the control is dead, and nothing says the folder already\n // exists. Either the button explains on click or the message is already\n // there; this takes the second, so the answer arrives before they reach for\n // the button.\n const shown = error ?? (name.trim() !== \"\" ? problem : null);\n\n return (\n <div\n data-react-fancy-file-browser-new-folder-form=\"\"\n className={cn(\"flex shrink-0 flex-col gap-0.5\", className)}\n >\n <div className=\"flex items-center gap-1\">\n <FolderPlus size={13} aria-hidden=\"true\" className=\"shrink-0 text-zinc-400\" />\n <input\n ref={inputRef}\n type=\"text\"\n data-react-fancy-file-browser-new-folder-input=\"\"\n value={name}\n disabled={busy}\n aria-label=\"New folder name\"\n aria-invalid={shown ? true : undefined}\n spellCheck={false}\n placeholder=\"Folder name\"\n onChange={(e) => {\n setName(e.target.value);\n if (error) setError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n if (isImeComposing(e)) return;\n e.preventDefault();\n void submit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n close();\n }\n }}\n className={cn(\n \"w-32 min-w-0 rounded-md border px-1.5 py-0.5 text-xs outline-none\",\n \"bg-transparent text-[color:var(--fancy-text-soft,var(--color-zinc-700))] placeholder:text-zinc-400 dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\",\n shown ? \"border-red-400 dark:border-red-500\" : \"border-[color:var(--fancy-border,var(--color-zinc-200))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n )}\n />\n <button\n type=\"button\"\n data-react-fancy-file-browser-new-folder-submit=\"\"\n disabled={!canSubmit}\n onClick={() => void submit()}\n className=\"rounded-md px-1.5 py-0.5 text-xs font-medium text-violet-600 transition-colors hover:bg-violet-50 disabled:cursor-not-allowed disabled:opacity-40 dark:text-violet-400 dark:hover:bg-violet-500/10\"\n >\n {busy ? \"Creating…\" : \"Create\"}\n </button>\n <button\n type=\"button\"\n data-react-fancy-file-browser-new-folder-cancel=\"\"\n onClick={close}\n className=\"rounded-md px-1.5 py-0.5 text-xs text-zinc-500 transition-colors hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\"\n >\n Cancel\n </button>\n </div>\n {shown && (\n <p\n data-react-fancy-file-browser-new-folder-error=\"\"\n role=\"alert\"\n className=\"pl-4 text-[11px] text-red-600 dark:text-red-400\"\n >\n {shown}\n </p>\n )}\n </div>\n );\n}\n\nFileBrowserNewFolder.displayName = \"FileBrowserNewFolder\";\n","import { ArrowDown, ArrowUp, Search, X } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { FileBrowserNewFolder } from \"./FileBrowserNewFolder\";\nimport type { FileBrowserToolbarProps, FileSortField } from \"./FileBrowser.types\";\n\nconst SORT_FIELDS: { field: FileSortField; label: string }[] = [\n { field: \"name\", label: \"Name\" },\n { field: \"size\", label: \"Size\" },\n { field: \"mtime\", label: \"Modified\" },\n];\n\n/**\n * Toolbar: client-side name filter (over loaded nodes only — never triggers\n * loads) plus a dirs-first sort control. Clicking the active sort field flips\n * its direction.\n */\nexport function FileBrowserToolbar({ filterPlaceholder = \"Filter\", className }: FileBrowserToolbarProps) {\n const { filter, setFilter, sort, setSort } = useFileBrowser();\n\n return (\n <div\n data-react-fancy-file-browser-toolbar=\"\"\n className={cn(\n \"flex items-center gap-2 border-b border-[color:var(--fancy-border,var(--color-zinc-200))] px-2 py-1.5 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n className,\n )}\n >\n <div\n data-react-fancy-file-browser-filter=\"\"\n className=\"flex min-w-0 flex-1 items-center gap-1.5 rounded-md border border-[color:var(--fancy-border,var(--color-zinc-200))] px-2 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\"\n >\n <Search size={13} aria-hidden=\"true\" className=\"shrink-0 text-zinc-400\" />\n <input\n type=\"text\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n placeholder={filterPlaceholder}\n aria-label=\"Filter by name\"\n spellCheck={false}\n className=\"min-w-0 flex-1 bg-transparent py-1 text-xs text-[color:var(--fancy-text-soft,var(--color-zinc-700))] outline-none placeholder:text-zinc-400 dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\"\n />\n {filter !== \"\" && (\n <button\n type=\"button\"\n aria-label=\"Clear filter\"\n onClick={() => setFilter(\"\")}\n className=\"shrink-0 text-zinc-400 transition-colors hover:text-zinc-600 dark:hover:text-zinc-300\"\n >\n <X size={12} />\n </button>\n )}\n </div>\n <div\n data-react-fancy-file-browser-sort=\"\"\n role=\"group\"\n aria-label=\"Sort\"\n className=\"flex shrink-0 items-center gap-0.5\"\n >\n {SORT_FIELDS.map(({ field, label }) => {\n const active = sort.by === field;\n return (\n <button\n key={field}\n type=\"button\"\n data-sort-field={field}\n aria-pressed={active}\n onClick={() =>\n setSort(\n active\n ? { by: field, direction: sort.direction === \"asc\" ? \"desc\" : \"asc\" }\n : { by: field, direction: \"asc\" },\n )\n }\n className={cn(\n \"flex items-center gap-0.5 rounded-md px-1.5 py-0.5 text-xs transition-colors\",\n active\n ? \"bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] font-medium text-zinc-900 dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:text-white\"\n : \"text-[color:var(--fancy-text-muted,var(--color-zinc-500))] hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\",\n )}\n >\n {label}\n {active &&\n (sort.direction === \"asc\" ? (\n <ArrowUp size={11} aria-hidden=\"true\" />\n ) : (\n <ArrowDown size={11} aria-hidden=\"true\" />\n ))}\n </button>\n );\n })}\n </div>\n <FileBrowserNewFolder />\n </div>\n );\n}\n\nFileBrowserToolbar.displayName = \"FileBrowserToolbar\";\n","import { ChevronRight, CircleAlert, Loader2, RotateCw } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { formatFileSize, isEntryExpandable } from \"./FileBrowser.utils\";\nimport type { FileBrowserNodeProps } from \"./FileBrowser.types\";\n\n// ---------------------------------------------------------------------------\n// Icons — mirror TreeNav's file/folder icons so both tree surfaces look the\n// same (TreeNav keeps them internal; duplicating ~40 lines beats widening its\n// public API).\n// ---------------------------------------------------------------------------\n\nconst EXT_COLORS: Record<string, string> = {\n ts: \"#3178c6\",\n tsx: \"#3178c6\",\n js: \"#f7df1e\",\n jsx: \"#f7df1e\",\n php: \"#777bb4\",\n html: \"#e34c26\",\n htm: \"#e34c26\",\n css: \"#264de4\",\n json: \"#a1a1aa\",\n md: \"#71717a\",\n yaml: \"#cb171e\",\n yml: \"#cb171e\",\n};\n\nfunction FileIcon({ ext }: { ext?: string }) {\n const color = (ext && EXT_COLORS[ext.toLowerCase()]) || \"#71717a\";\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M4 1h5.5L13 4.5V14a1 1 0 01-1 1H4a1 1 0 01-1-1V2a1 1 0 011-1z\" stroke={color} strokeWidth=\"1.2\" />\n <path d=\"M9 1v4h4\" stroke={color} strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction FolderIcon({ open }: { open: boolean }) {\n if (open) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M1.5 3.5a1 1 0 011-1h3l1.5 1.5H13a1 1 0 011 1V5H2.5V3.5z\" fill=\"#fbbf24\" />\n <path d=\"M1 6h13l-1.5 7.5H2.5L1 6z\" fill=\"#fbbf24\" opacity=\"0.7\" />\n </svg>\n );\n }\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0\">\n <path d=\"M1.5 3a1 1 0 011-1h3l1.5 1.5H13a1 1 0 011 1v8a1 1 0 01-1 1H2.5a1 1 0 01-1-1V3z\" fill=\"#fbbf24\" />\n </svg>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Status rows — loading / error / empty placeholders inside the tree. Not\n// treeitems (they never receive roving focus); the owning folder carries\n// `aria-busy` while its children load.\n// ---------------------------------------------------------------------------\n\nexport interface FileBrowserStatusRowProps {\n depth: number;\n kind: \"loading\" | \"error\" | \"empty\" | \"no-matches\" | \"unknown\";\n message?: string;\n onRetry?: () => void;\n}\n\nexport function FileBrowserStatusRow({ depth, kind, message, onRetry }: FileBrowserStatusRowProps) {\n const { indentSize } = useFileBrowser();\n const paddingLeft = depth * indentSize + 4 + 18;\n\n if (kind === \"error\") {\n return (\n <div\n role=\"none\"\n data-react-fancy-file-browser-status=\"error\"\n className=\"flex items-center gap-1.5 py-0.5 pr-2 text-xs text-red-600 dark:text-red-400\"\n style={{ paddingLeft }}\n >\n <CircleAlert size={12} className=\"shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{message || \"Failed to load\"}</span>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"flex shrink-0 items-center gap-1 rounded-md px-1.5 py-0.5 text-[11px] text-[color:var(--fancy-text-muted,var(--color-zinc-500))] transition-colors hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-zinc-700 dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:hover:text-zinc-200\"\n >\n <RotateCw size={11} />\n Retry\n </button>\n )}\n </div>\n );\n }\n\n return (\n <div\n role=\"none\"\n data-react-fancy-file-browser-status={kind}\n className=\"flex items-center gap-1.5 py-0.5 text-xs text-[color:var(--fancy-text-faint,var(--color-zinc-400))] italic dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\"\n style={{ paddingLeft }}\n >\n {kind === \"loading\" && <Loader2 size={12} className=\"shrink-0 animate-spin\" aria-hidden=\"true\" />}\n <span className=\"truncate\">\n {kind === \"loading\" ? \"Loading…\" : kind === \"empty\" ? \"Empty\" : kind === \"no-matches\" ? \"No matches\" : \"No entries\"}\n </span>\n </div>\n );\n}\n\nFileBrowserStatusRow.displayName = \"FileBrowserStatusRow\";\n\n// ---------------------------------------------------------------------------\n// Node\n// ---------------------------------------------------------------------------\n\nexport function FileBrowserNode({ entry, depth }: FileBrowserNodeProps) {\n const {\n entriesFor, visibleChildrenFor, statusFor, errorFor, loadPath, hasProvider,\n expandedPaths, toggleExpanded, navigate,\n isSelected, isSelectable, selectEntry,\n tabFocusPath, setFocusedPath, focusRow, registerRow,\n indentSize, showIcons,\n } = useFileBrowser();\n\n const rawChildren = entriesFor(entry.path);\n const childrenKnown = rawChildren !== undefined;\n const expandable = isEntryExpandable(entry, rawChildren, hasProvider);\n const expanded = expandable && expandedPaths.includes(entry.path);\n const status = statusFor(entry.path);\n const selectable = isSelectable(entry);\n const selected = isSelected(entry.path);\n const loading = expanded && !childrenKnown && status === \"loading\";\n const paddingLeft = depth * indentSize + 4;\n const ext = entry.name.includes(\".\") ? entry.name.split(\".\").pop() : undefined;\n\n const handleClick = () => {\n if (entry.disabled) return;\n setFocusedPath(entry.path);\n focusRow(entry.path);\n if (selectable) selectEntry(entry);\n if (expandable) toggleExpanded(entry.path);\n };\n\n const handleDoubleClick = () => {\n if (entry.disabled || entry.kind !== \"dir\") return;\n navigate(entry.path);\n };\n\n const handleChevronClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!entry.disabled && expandable) toggleExpanded(entry.path);\n };\n\n const visibleChildren = expanded && childrenKnown ? visibleChildrenFor(entry.path) : [];\n\n return (\n <div\n role=\"treeitem\"\n data-react-fancy-file-browser-node=\"\"\n data-path={entry.path}\n data-kind={entry.kind}\n aria-level={depth + 1}\n aria-expanded={expandable ? expanded : undefined}\n aria-selected={selectable ? selected : undefined}\n aria-disabled={entry.disabled || undefined}\n aria-busy={loading || undefined}\n tabIndex={tabFocusPath === entry.path ? 0 : -1}\n ref={(el) => registerRow(entry.path, el)}\n onFocus={(e) => {\n if (e.target === e.currentTarget) setFocusedPath(entry.path);\n }}\n className=\"group outline-none\"\n >\n <div\n data-react-fancy-file-browser-row=\"\"\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-1 rounded-md py-0.5 pr-2 text-left text-[13px] transition-colors select-none\",\n selected\n ? \"bg-blue-500/15 text-blue-600 dark:text-blue-400\"\n : \"text-[color:var(--fancy-text-soft,var(--color-zinc-700))] hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n entry.disabled && \"pointer-events-none opacity-40\",\n \"group-focus-visible:ring-2 group-focus-visible:ring-blue-500/40 group-focus-visible:ring-inset\",\n )}\n style={{ paddingLeft }}\n >\n {expandable ? (\n loading ? (\n <Loader2 size={14} className=\"shrink-0 animate-spin text-zinc-400\" aria-hidden=\"true\" />\n ) : (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onClick={handleChevronClick}\n className=\"flex shrink-0 items-center justify-center text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300\"\n >\n <ChevronRight\n size={14}\n className={cn(\"transition-transform duration-150\", expanded && \"rotate-90\")}\n />\n </button>\n )\n ) : (\n <span className=\"w-3.5 shrink-0\" />\n )}\n {showIcons &&\n (entry.kind === \"dir\" ? <FolderIcon open={expanded} /> : <FileIcon ext={ext} />)}\n <span className=\"min-w-0 flex-1 truncate\">{entry.name}</span>\n {entry.kind === \"file\" && entry.size !== undefined && (\n <span className=\"shrink-0 text-[11px] text-[color:var(--fancy-text-faint,var(--color-zinc-400))] tabular-nums dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\">\n {formatFileSize(entry.size)}\n </span>\n )}\n </div>\n\n {expanded && (\n <div role=\"group\" data-react-fancy-file-browser-node-children=\"\">\n {/* An expanded-but-unknown folder is only reachable with a provider;\n \"idle\" means its lazy load is about to start, so render it as\n loading (keeps SSR output and the first client frame identical). */}\n {!childrenKnown && (status === \"loading\" || status === \"idle\") && (\n <FileBrowserStatusRow depth={depth + 1} kind=\"loading\" />\n )}\n {!childrenKnown && status === \"error\" && (\n <FileBrowserStatusRow\n depth={depth + 1}\n kind=\"error\"\n message={errorFor(entry.path)}\n onRetry={() => loadPath(entry.path, { reload: true })}\n />\n )}\n {childrenKnown &&\n (visibleChildren.length > 0 ? (\n visibleChildren.map((child) => (\n <FileBrowserNode key={child.path} entry={child} depth={depth + 1} />\n ))\n ) : (\n <FileBrowserStatusRow\n depth={depth + 1}\n kind={rawChildren!.length === 0 ? \"empty\" : \"no-matches\"}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nFileBrowserNode.displayName = \"FileBrowserNode\";\n","import { cn } from \"../../utils/cn\";\nimport { useFileBrowser } from \"./FileBrowser.context\";\nimport { FileBrowserNode, FileBrowserStatusRow } from \"./FileBrowserNode\";\nimport type { FileBrowserRow, FileBrowserTreeProps } from \"./FileBrowser.types\";\n\n/**\n * The tree pane: ARIA `tree` semantics, roving tabindex, and full keyboard\n * navigation (arrows / Enter / Space / Home / End) over the flattened row\n * order. Lazy loads fire on expand only.\n */\nexport function FileBrowserTree({ ariaLabel = \"Files\", className }: FileBrowserTreeProps) {\n const ctx = useFileBrowser();\n const {\n path, entriesFor, visibleChildrenFor, statusFor, errorFor, loadPath, hasProvider,\n visibleRows, tabFocusPath, setFocusedPath, focusRow,\n toggleExpanded, isSelectable, selectEntry, navigate, multiple,\n } = ctx;\n\n const rootEntries = entriesFor(path);\n const rootStatus = statusFor(path);\n const rootChildren = rootEntries !== undefined ? visibleChildrenFor(path) : [];\n\n const moveTo = (row: FileBrowserRow) => {\n setFocusedPath(row.entry.path);\n focusRow(row.entry.path);\n };\n\n const activate = (row: FileBrowserRow) => {\n if (row.entry.disabled) return;\n if (isSelectable(row.entry)) selectEntry(row.entry);\n if (row.expandable) toggleExpanded(row.entry.path);\n else if (row.entry.kind === \"dir\" && !isSelectable(row.entry)) navigate(row.entry.path);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n const rows = visibleRows;\n if (rows.length === 0) return;\n const index = rows.findIndex((row) => row.entry.path === tabFocusPath);\n const current = index >= 0 ? rows[index] : rows[0];\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n if (index < rows.length - 1) moveTo(rows[index + 1]);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (index > 0) moveTo(rows[index - 1]);\n break;\n case \"Home\":\n e.preventDefault();\n moveTo(rows[0]);\n break;\n case \"End\":\n e.preventDefault();\n moveTo(rows[rows.length - 1]);\n break;\n case \"ArrowRight\":\n e.preventDefault();\n if (current.entry.disabled) break;\n if (current.expandable && !current.expanded) {\n toggleExpanded(current.entry.path);\n } else if (current.expanded) {\n const firstChild = rows[index + 1];\n if (firstChild && firstChild.parentPath === current.entry.path) moveTo(firstChild);\n }\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n if (current.expanded && !current.entry.disabled) {\n toggleExpanded(current.entry.path);\n } else if (current.parentPath) {\n const parent = rows.find((row) => row.entry.path === current.parentPath);\n if (parent) moveTo(parent);\n }\n break;\n case \"Enter\":\n e.preventDefault();\n activate(current);\n break;\n case \" \":\n e.preventDefault();\n if (!current.entry.disabled) selectEntry(current.entry);\n break;\n }\n };\n\n return (\n <div\n role=\"tree\"\n aria-label={ariaLabel}\n aria-multiselectable={multiple || undefined}\n data-react-fancy-file-browser-tree=\"\"\n className={cn(\"min-h-0 flex-1 overflow-auto p-1\", className)}\n onKeyDown={handleKeyDown}\n >\n {/* \"idle\" with a provider renders as loading too: loads fire in an\n effect, so this is what the server (and first client frame) shows\n right before the request starts — keeps SSR + hydration identical. */}\n {rootEntries === undefined && hasProvider && (rootStatus === \"loading\" || rootStatus === \"idle\") && (\n <FileBrowserStatusRow depth={0} kind=\"loading\" />\n )}\n {rootEntries === undefined && rootStatus === \"error\" && (\n <FileBrowserStatusRow\n depth={0}\n kind=\"error\"\n message={errorFor(path)}\n onRetry={() => loadPath(path, { reload: true })}\n />\n )}\n {rootEntries === undefined && rootStatus === \"idle\" && !hasProvider && (\n <FileBrowserStatusRow depth={0} kind=\"unknown\" />\n )}\n {rootEntries !== undefined &&\n (rootChildren.length > 0 ? (\n rootChildren.map((entry) => (\n <FileBrowserNode key={entry.path} entry={entry} depth={0} />\n ))\n ) : (\n <FileBrowserStatusRow depth={0} kind={rootEntries.length === 0 ? \"empty\" : \"no-matches\"} />\n ))}\n </div>\n );\n}\n\nFileBrowserTree.displayName = \"FileBrowserTree\";\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport { FileBrowserContext } from \"./FileBrowser.context\";\nimport { FileBrowserPathBar } from \"./FileBrowserPathBar\";\nimport { FileBrowserToolbar } from \"./FileBrowserToolbar\";\nimport { FileBrowserTree } from \"./FileBrowserTree\";\nimport { FileBrowserNode } from \"./FileBrowserNode\";\nimport {\n compareFileEntries,\n entryMatchesFilter,\n isEntryExpandable,\n parentPath,\n} from \"./FileBrowser.utils\";\nimport type {\n FileBrowserContextValue,\n FileBrowserProps,\n FileBrowserRow,\n FileEntry,\n FileLoadStatus,\n FileSnapshotNode,\n FileSort,\n} from \"./FileBrowser.types\";\n\nconst DEFAULT_SORT: FileSort = { by: \"name\", direction: \"asc\" };\n\nfunction snapshotNodeToEntry(node: FileSnapshotNode): FileEntry {\n const { children: _children, ...entry } = node;\n return entry;\n}\n\n/**\n * Index a snapshot tree into a `parent path -> children` map. Roots group\n * under their own parent path (usually `\"/\"`); any node with a materialized\n * `children` array defines that folder's listing. Dirs with `children`\n * undefined stay unknown — a provider fills them lazily in hybrid mode.\n */\nfunction buildSnapshotMap(snapshot: FileSnapshotNode[] | undefined): Map<string, FileEntry[]> {\n const map = new Map<string, FileEntry[]>();\n if (!snapshot || snapshot.length === 0) return map;\n\n for (const root of snapshot) {\n const parent = parentPath(root.path);\n const list = map.get(parent);\n if (list) list.push(snapshotNodeToEntry(root));\n else map.set(parent, [snapshotNodeToEntry(root)]);\n }\n\n const walk = (nodes: FileSnapshotNode[]) => {\n for (const node of nodes) {\n if (node.children) {\n map.set(node.path, node.children.map(snapshotNodeToEntry));\n walk(node.children);\n }\n }\n };\n walk(snapshot);\n\n return map;\n}\n\n/**\n * FileBrowser — remote-capable file/folder browser + directory picker.\n *\n * Browses any file tree the host can describe — local FS, HTTP, SSH, or a\n * remote machine streaming snapshots — via two feeding modes that may be\n * combined:\n *\n * - **Provider mode (lazy pull):** pass `provider.loadChildren(path)`. Folders\n * load on first expand with per-node loading + error states; the tree is\n * never walked eagerly.\n * - **Snapshot mode (streamed push):** pass a JSON-friendly `snapshot` tree\n * and replace/patch it as chunks arrive (relay / WebSocket / MCP). The\n * snapshot is the source of truth for every path it covers; with a provider\n * also present, unknown-depth folders stay lazily loadable (hybrid).\n *\n * Fully controlled per the Human+ component contract (`value`/`onChange`,\n * `path`/`onPathChange`, `expandedPaths`/`onExpandedChange`, plus\n * `sort`/`filter`), with uncontrolled `defaultX` fallbacks. Every row carries\n * a `data-path` attribute — paths are the stable handles agents target, never\n * indexes or generated ids.\n *\n * Agent bridge sketch (ships later in `@particle-academy/agent-integrations`):\n * `registerFilesBridge(server, { adapter })` will expose MCP tools over this\n * surface — `files_list(path)`, `files_expand(path)` / `files_collapse(path)`,\n * `files_select(paths)`, `files_navigate(path)`, and\n * `files_request_snapshot(path, depth)` — with each mutation emitting an\n * `AgentActivity` event so presence, undo, and coaching layers compose. The\n * adapter maps those tools onto the same controlled props\n * (`value`/`path`/`expandedPaths`) and provider/snapshot contract; no DOM\n * scraping required.\n *\n * Read-only in v1: no content preview (pair with fancy-code's `FileViewer`)\n * and no write operations — rename/delete/upload arrive later behind a\n * `pendingMode`-gated iteration.\n */\nfunction FileBrowserRoot({\n provider,\n snapshot,\n select = \"file\",\n multiple = false,\n value,\n defaultValue,\n onChange,\n path,\n defaultPath = \"/\",\n onPathChange,\n expandedPaths,\n defaultExpandedPaths,\n onExpandedChange,\n sort,\n defaultSort,\n onSortChange,\n filter,\n defaultFilter,\n onFilterChange,\n onError,\n onCreateFolder,\n indentSize = 16,\n showIcons = true,\n className,\n children,\n}: FileBrowserProps) {\n // ---------------------------------------------------------------------------\n // Controlled / uncontrolled state\n // ---------------------------------------------------------------------------\n\n const [currentPath, setCurrentPath] = useControllableState(path, defaultPath, onPathChange);\n const [expanded, setExpanded] = useControllableState(\n expandedPaths,\n defaultExpandedPaths ?? [],\n onExpandedChange,\n );\n const [sortState, setSortState] = useControllableState(sort, defaultSort ?? DEFAULT_SORT, onSortChange);\n const [filterState, setFilterState] = useControllableState(filter, defaultFilter ?? \"\", onFilterChange);\n\n // Selection is managed directly (not via useControllableState) because\n // onChange also receives the matching FileEntry objects.\n const [internalValue, setInternalValue] = useState<string | string[] | null>(\n () => defaultValue ?? (multiple ? [] : null),\n );\n const selection = value !== undefined ? value : internalValue;\n const selectedPaths = useMemo(\n () => (selection == null ? [] : Array.isArray(selection) ? selection : [selection]),\n [selection],\n );\n\n // ---------------------------------------------------------------------------\n // Data layer — snapshot map + lazy provider cache\n // ---------------------------------------------------------------------------\n\n const snapshotMap = useMemo(() => buildSnapshotMap(snapshot), [snapshot]);\n\n const [loadedChildren, setLoadedChildren] = useState<Record<string, FileEntry[]>>({});\n const [loadStatus, setLoadStatus] = useState<Record<string, FileLoadStatus>>({});\n const [loadErrors, setLoadErrors] = useState<Record<string, string>>({});\n\n const seqCounter = useRef(0);\n const requestSeq = useRef<Record<string, number>>({});\n\n // Latest-state refs so `loadPath` stays referentially stable.\n const stateRef = useRef({ snapshotMap, loadedChildren, loadStatus });\n stateRef.current = { snapshotMap, loadedChildren, loadStatus };\n const providerRef = useRef(provider);\n providerRef.current = provider;\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const loadPath = useCallback((targetPath: string, options?: { reload?: boolean }) => {\n const prov = providerRef.current;\n if (!prov) return;\n const { snapshotMap: snap, loadedChildren: loaded, loadStatus: statuses } = stateRef.current;\n const status = statuses[targetPath] ?? \"idle\";\n if (status === \"loading\") return;\n const known = snap.get(targetPath) ?? loaded[targetPath];\n if (!options?.reload && (known !== undefined || status === \"error\")) return;\n\n const requestId = ++seqCounter.current;\n requestSeq.current[targetPath] = requestId;\n setLoadStatus((prev) => ({ ...prev, [targetPath]: \"loading\" }));\n\n prov.loadChildren(targetPath).then(\n (entries) => {\n if (requestSeq.current[targetPath] !== requestId) return;\n setLoadedChildren((prev) => ({ ...prev, [targetPath]: entries }));\n setLoadStatus((prev) => ({ ...prev, [targetPath]: \"loaded\" }));\n setLoadErrors((prev) => {\n if (!(targetPath in prev)) return prev;\n const next = { ...prev };\n delete next[targetPath];\n return next;\n });\n },\n (error: unknown) => {\n if (requestSeq.current[targetPath] !== requestId) return;\n setLoadStatus((prev) => ({ ...prev, [targetPath]: \"error\" }));\n setLoadErrors((prev) => ({\n ...prev,\n [targetPath]: error instanceof Error ? error.message : String(error),\n }));\n onErrorRef.current?.(targetPath, error);\n },\n );\n }, []);\n\n const entriesFor = useCallback(\n (p: string) => snapshotMap.get(p) ?? loadedChildren[p],\n [snapshotMap, loadedChildren],\n );\n\n const statusFor = useCallback(\n (p: string): FileLoadStatus => {\n if (snapshotMap.has(p)) return \"loaded\";\n const status = loadStatus[p];\n if (status) return status;\n return loadedChildren[p] !== undefined ? \"loaded\" : \"idle\";\n },\n [snapshotMap, loadStatus, loadedChildren],\n );\n\n const errorFor = useCallback((p: string) => loadErrors[p], [loadErrors]);\n\n // Lazy loading — only the current directory and explicitly expanded folders\n // (including expansions driven from outside via the controlled\n // `expandedPaths` prop). Never an eager walk; errored paths wait for an\n // explicit retry.\n useEffect(() => {\n if (!provider) return;\n loadPath(currentPath);\n for (const p of expanded) loadPath(p);\n }, [provider, currentPath, expanded, snapshotMap, loadPath]);\n\n // ---------------------------------------------------------------------------\n // Filter + sort + flattened visible rows\n // ---------------------------------------------------------------------------\n\n const filterLower = filterState.trim().toLowerCase();\n\n const visibleChildrenFor = useCallback(\n (p: string): FileEntry[] => {\n const entries = entriesFor(p);\n if (!entries) return [];\n const filtered = filterLower\n ? entries.filter((entry) => entryMatchesFilter(entry, filterLower, entriesFor))\n : entries.slice();\n return filtered.sort((a, b) => compareFileEntries(a, b, sortState));\n },\n [entriesFor, filterLower, sortState],\n );\n\n const visibleRows = useMemo(() => {\n const rows: FileBrowserRow[] = [];\n const visited = new Set<string>([currentPath]);\n const walk = (p: string, depth: number, parent: string | null) => {\n for (const entry of visibleChildrenFor(p)) {\n const expandable = isEntryExpandable(entry, entriesFor(entry.path), !!provider);\n const isOpen = expandable && expanded.includes(entry.path);\n rows.push({ entry, depth, expandable, expanded: isOpen, parentPath: parent });\n if (isOpen && !visited.has(entry.path)) {\n visited.add(entry.path);\n walk(entry.path, depth + 1, entry.path);\n }\n }\n };\n walk(currentPath, 0, null);\n return rows;\n }, [visibleChildrenFor, entriesFor, provider, expanded, currentPath]);\n\n // ---------------------------------------------------------------------------\n // Selection\n // ---------------------------------------------------------------------------\n\n const entryIndex = useMemo(() => {\n const map = new Map<string, FileEntry>();\n for (const list of snapshotMap.values()) {\n for (const entry of list) map.set(entry.path, entry);\n }\n for (const list of Object.values(loadedChildren)) {\n for (const entry of list) {\n if (!map.has(entry.path)) map.set(entry.path, entry);\n }\n }\n return map;\n }, [snapshotMap, loadedChildren]);\n\n const isSelectable = useCallback(\n (entry: FileEntry) =>\n !entry.disabled &&\n (select === \"both\" || (select === \"file\" ? entry.kind === \"file\" : entry.kind === \"dir\")),\n [select],\n );\n\n const isSelected = useCallback((p: string) => selectedPaths.includes(p), [selectedPaths]);\n\n const commitSelection = useCallback(\n (paths: string[]) => {\n const nextValue = multiple ? paths : (paths[0] ?? null);\n if (value === undefined) setInternalValue(nextValue);\n onChangeRef.current?.(\n nextValue,\n paths\n .map((p) => entryIndex.get(p))\n .filter((entry): entry is FileEntry => entry !== undefined),\n );\n },\n [multiple, value, entryIndex],\n );\n\n const selectEntry = useCallback(\n (entry: FileEntry) => {\n if (!isSelectable(entry)) return;\n if (multiple) {\n commitSelection(\n selectedPaths.includes(entry.path)\n ? selectedPaths.filter((p) => p !== entry.path)\n : [...selectedPaths, entry.path],\n );\n } else {\n commitSelection([entry.path]);\n }\n },\n [isSelectable, multiple, selectedPaths, commitSelection],\n );\n\n // ---------------------------------------------------------------------------\n // Expansion, navigation, roving focus\n // ---------------------------------------------------------------------------\n\n const toggleExpanded = useCallback(\n (p: string) => {\n setExpanded((prev) => (prev.includes(p) ? prev.filter((x) => x !== p) : [...prev, p]));\n },\n [setExpanded],\n );\n\n const [focusedPath, setFocusedPath] = useState<string | null>(null);\n\n const navigate = useCallback(\n (p: string) => {\n setCurrentPath(p);\n setFilterState(\"\");\n setFocusedPath(null);\n },\n [setCurrentPath, setFilterState],\n );\n\n const rowRefs = useRef(new Map<string, HTMLElement>());\n\n const registerRow = useCallback((p: string, el: HTMLElement | null) => {\n if (el) rowRefs.current.set(p, el);\n else rowRefs.current.delete(p);\n }, []);\n\n const focusRow = useCallback((p: string) => {\n rowRefs.current.get(p)?.focus();\n }, []);\n\n const tabFocusPath = useMemo(() => {\n if (focusedPath && visibleRows.some((row) => row.entry.path === focusedPath)) {\n return focusedPath;\n }\n return visibleRows[0]?.entry.path ?? null;\n }, [focusedPath, visibleRows]);\n\n // ---------------------------------------------------------------------------\n // Context + render\n // ---------------------------------------------------------------------------\n\n const ctx = useMemo<FileBrowserContextValue>(\n () => ({\n entriesFor,\n visibleChildrenFor,\n statusFor,\n errorFor,\n loadPath,\n hasProvider: !!provider,\n path: currentPath,\n navigate,\n expandedPaths: expanded,\n toggleExpanded,\n select,\n multiple,\n selectedPaths,\n isSelected,\n isSelectable,\n selectEntry,\n sort: sortState,\n setSort: setSortState,\n filter: filterState,\n setFilter: setFilterState,\n visibleRows,\n focusedPath,\n setFocusedPath,\n tabFocusPath,\n focusRow,\n registerRow,\n indentSize,\n showIcons,\n onCreateFolder,\n }),\n [\n entriesFor, visibleChildrenFor, statusFor, errorFor, loadPath, provider,\n currentPath, navigate, expanded, toggleExpanded, select, multiple,\n selectedPaths, isSelected, isSelectable, selectEntry, sortState,\n setSortState, filterState, setFilterState, visibleRows, focusedPath,\n tabFocusPath, focusRow, registerRow, indentSize, showIcons, onCreateFolder,\n ],\n );\n\n return (\n <FileBrowserContext.Provider value={ctx}>\n <div\n data-react-fancy-file-browser=\"\"\n className={cn(\n \"flex flex-col overflow-hidden rounded-lg border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] text-sm dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n className,\n )}\n >\n {children ?? (\n <>\n <FileBrowserPathBar />\n <FileBrowserToolbar />\n <FileBrowserTree />\n </>\n )}\n </div>\n </FileBrowserContext.Provider>\n );\n}\n\nFileBrowserRoot.displayName = \"FileBrowser\";\n\nexport const FileBrowser = Object.assign(FileBrowserRoot, {\n PathBar: FileBrowserPathBar,\n Toolbar: FileBrowserToolbar,\n Tree: FileBrowserTree,\n Node: FileBrowserNode,\n});\n"]}