gridsmith-ui 0.24.0 → 0.26.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 (87) hide show
  1. package/README.md +8 -6
  2. package/dist/MentionList-CoNBRFGR.d.ts +8 -0
  3. package/dist/charts.d.ts +42 -1
  4. package/dist/charts.js +320 -89
  5. package/dist/charts.js.map +1 -1
  6. package/dist/chat.js +5 -4
  7. package/dist/chat.js.map +1 -1
  8. package/dist/{chunk-6XAU44U4.js → chunk-CYN5O567.js} +10 -23
  9. package/dist/chunk-CYN5O567.js.map +1 -0
  10. package/dist/{chunk-SBTBMAIU.js → chunk-EX64MN2U.js} +6 -6
  11. package/dist/{chunk-SBTBMAIU.js.map → chunk-EX64MN2U.js.map} +1 -1
  12. package/dist/chunk-HP7WUZPK.js +80 -0
  13. package/dist/chunk-HP7WUZPK.js.map +1 -0
  14. package/dist/{chunk-4LDYR7QP.js → chunk-HXVXJUGV.js} +53 -13
  15. package/dist/chunk-HXVXJUGV.js.map +1 -0
  16. package/dist/{chunk-MV7JXWXK.js → chunk-KWLNEH53.js} +8 -7
  17. package/dist/chunk-KWLNEH53.js.map +1 -0
  18. package/dist/{chunk-CXMV7SXJ.js → chunk-MD2EFMES.js} +5 -77
  19. package/dist/chunk-MD2EFMES.js.map +1 -0
  20. package/dist/{chunk-SVP2IG4S.js → chunk-MYIJNVTK.js} +7 -7
  21. package/dist/chunk-MYIJNVTK.js.map +1 -0
  22. package/dist/{chunk-IVCVNAXG.js → chunk-OTCEJN64.js} +3 -3
  23. package/dist/{chunk-IVCVNAXG.js.map → chunk-OTCEJN64.js.map} +1 -1
  24. package/dist/{chunk-2PWGJ4PK.js → chunk-QM4SJKWV.js} +11 -6
  25. package/dist/chunk-QM4SJKWV.js.map +1 -0
  26. package/dist/chunk-RWKCAKN3.js +209 -0
  27. package/dist/chunk-RWKCAKN3.js.map +1 -0
  28. package/dist/{chunk-2YSEME33.js → chunk-SFY2KMHG.js} +63 -6
  29. package/dist/chunk-SFY2KMHG.js.map +1 -0
  30. package/dist/{chunk-NCIZQYXQ.js → chunk-X2HEV7FB.js} +33 -3
  31. package/dist/chunk-X2HEV7FB.js.map +1 -0
  32. package/dist/{chunk-JXANCXK6.js → chunk-ZI3OQDET.js} +18 -4
  33. package/dist/chunk-ZI3OQDET.js.map +1 -0
  34. package/dist/{chunk-7TOJ4G7S.js → chunk-ZYVXV4WC.js} +14 -9
  35. package/dist/chunk-ZYVXV4WC.js.map +1 -0
  36. package/dist/data-grid.d.ts +1 -1
  37. package/dist/data-grid.js +13 -12
  38. package/dist/data-grid.js.map +1 -1
  39. package/dist/editor-mentions.d.ts +30 -0
  40. package/dist/editor-mentions.js +160 -0
  41. package/dist/editor-mentions.js.map +1 -0
  42. package/dist/editor.d.ts +23 -3
  43. package/dist/editor.js +58 -9
  44. package/dist/editor.js.map +1 -1
  45. package/dist/{feather-2JFSFLXN.js → feather-VFWLAILO.js} +12 -3
  46. package/dist/feather-VFWLAILO.js.map +1 -0
  47. package/dist/{heroicons-4AQ4YBVG.js → heroicons-H3Z7DFCF.js} +22 -7
  48. package/dist/heroicons-H3Z7DFCF.js.map +1 -0
  49. package/dist/icons.d.ts +11 -4
  50. package/dist/icons.js +1 -1
  51. package/dist/index.d.ts +202 -31
  52. package/dist/index.js +1473 -1181
  53. package/dist/index.js.map +1 -1
  54. package/dist/kanban.js +8 -8
  55. package/dist/kanban.js.map +1 -1
  56. package/dist/{lucide-RZC2FEMS.js → lucide-MR32KM4G.js} +12 -3
  57. package/dist/lucide-MR32KM4G.js.map +1 -0
  58. package/dist/{phosphor-CEN25FLM.js → phosphor-ABQQL5N5.js} +12 -3
  59. package/dist/phosphor-ABQQL5N5.js.map +1 -0
  60. package/dist/resizable.js +8 -8
  61. package/dist/roots.css +28 -0
  62. package/dist/{tabler-YXXC7Y6B.js → tabler-ANUSY4D2.js} +12 -3
  63. package/dist/tabler-ANUSY4D2.js.map +1 -0
  64. package/dist/tokens.css +6 -0
  65. package/dist/{use-pagination-DiJo0aW5.d.ts → use-pagination-BnKOnBdz.d.ts} +3 -0
  66. package/dist/virtualized.d.ts +1 -1
  67. package/dist/virtualized.js +7 -6
  68. package/dist/virtualized.js.map +1 -1
  69. package/dist-static/tokens.css +6 -0
  70. package/package.json +29 -21
  71. package/dist/chunk-2PWGJ4PK.js.map +0 -1
  72. package/dist/chunk-2YSEME33.js.map +0 -1
  73. package/dist/chunk-4LDYR7QP.js.map +0 -1
  74. package/dist/chunk-6XAU44U4.js.map +0 -1
  75. package/dist/chunk-7TOJ4G7S.js.map +0 -1
  76. package/dist/chunk-CXMV7SXJ.js.map +0 -1
  77. package/dist/chunk-JXANCXK6.js.map +0 -1
  78. package/dist/chunk-MV7JXWXK.js.map +0 -1
  79. package/dist/chunk-NCIZQYXQ.js.map +0 -1
  80. package/dist/chunk-SVP2IG4S.js.map +0 -1
  81. package/dist/chunk-WOVYHFUD.js +0 -50
  82. package/dist/chunk-WOVYHFUD.js.map +0 -1
  83. package/dist/feather-2JFSFLXN.js.map +0 -1
  84. package/dist/heroicons-4AQ4YBVG.js.map +0 -1
  85. package/dist/lucide-RZC2FEMS.js.map +0 -1
  86. package/dist/phosphor-CEN25FLM.js.map +0 -1
  87. package/dist/tabler-YXXC7Y6B.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../showcase/src/components/RichTextEditor.tsx"],"names":[],"mappings":"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","file":"editor.js","sourcesContent":["import { useState, useCallback, useRef, useEffect, useContext, useImperativeHandle, type Ref } from \"react\";\nimport { useCloseOnFocusOut, useOverlayLayer } from \"../lib/focus\";\nimport { useEditor, EditorContent, createDocument, type Editor } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Image from \"@tiptap/extension-image\";\nimport { Table } from \"@tiptap/extension-table\";\nimport { TableRow } from \"@tiptap/extension-table-row\";\nimport { TableCell } from \"@tiptap/extension-table-cell\";\nimport { TableHeader } from \"@tiptap/extension-table-header\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport CodeBlockLowlight from \"@tiptap/extension-code-block-lowlight\";\nimport { TextStyle, FontSize } from \"@tiptap/extension-text-style\";\nimport Color from \"@tiptap/extension-color\";\nimport Highlight from \"@tiptap/extension-highlight\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport TaskList from \"@tiptap/extension-task-list\";\nimport TaskItem from \"@tiptap/extension-task-item\";\nimport Subscript from \"@tiptap/extension-subscript\";\nimport Superscript from \"@tiptap/extension-superscript\";\nimport FontFamily from \"@tiptap/extension-font-family\";\nimport { all, createLowlight } from \"lowlight\";\nimport { cn, ACTIVE_RING, FOCUS_RING } from \"../lib/utils\";\nimport { Icon } from \"../lib/icons\";\nimport { useBreakpoint } from \"../lib/use-breakpoint\";\nimport { useScrollEdges } from \"../lib/use-scroll-edges\";\nimport { useLatest } from \"../lib/use-latest\";\nimport { FormChangeCtx } from \"../lib/form-context\";\n\nconst lowlight = createLowlight(all);\n\nexport type ToolbarGroup =\n | \"blockType\"\n | \"fontFamily\"\n | \"textSize\"\n | \"formatting\"\n | \"colors\"\n | \"alignment\"\n | \"lists\"\n | \"blocks\"\n | \"insert\"\n | \"extras\"\n | \"history\";\n\nconst DEFAULT_TOOLBAR: ToolbarGroup[] = [\n \"blockType\", \"fontFamily\", \"textSize\",\n \"formatting\", \"colors\", \"alignment\",\n \"lists\", \"blocks\", \"insert\", \"extras\", \"history\",\n];\n\nconst MINIMAL_TOOLBAR: ToolbarGroup[] = [\n \"formatting\", \"lists\", \"insert\", \"history\",\n];\n\n/** The editor's handle (Sprint 25.12 A16): what a page does to the document on purpose. */\nexport interface RichTextEditorHandle {\n /**\n * Replaces the whole document (a restore, a template). It always applies, even over text typed this session, and it's\n * a change like the user's own: onChange runs.\n */\n setContent: (html: string) => void;\n /** Inserts HTML where the cursor is (or was, when the editor lost focus), then focuses the editor. */\n insertContent: (html: string) => void;\n /** Inserts an image where the cursor is. */\n insertImage: (image: { src: string; alt?: string }) => void;\n focus: () => void;\n getHTML: () => string;\n}\n\nexport interface RichTextEditorProps {\n /**\n * The document, as HTML. The editor follows it (Sprint 25.12 A16): a new value from outside is applied at once, a\n * clear or a reset included, without calling onChange and outside the undo history (Ctrl+Z never takes it back), and\n * the cursor moves with the text around it. Its own output coming back late (an autosave's echo, markup a server\n * sanitised that parses the same) changes nothing. The editor follows a change of value: to put back the value the\n * page already holds (a Discard when the page stores only what was saved), call `handle.setContent`. A page that\n * switches records keys the editor by the record's id, so undo never crosses records.\n */\n content?: string;\n placeholder?: string;\n onChange?: (html: string) => void;\n /** false shows the document read-only, with no toolbar. Follows its prop. */\n editable?: boolean;\n toolbar?: ToolbarGroup[] | \"full\" | \"minimal\";\n className?: string;\n /** The root element. */\n ref?: Ref<HTMLDivElement>;\n /** The editor's handle: replace the document (a restore, a template) or insert at the cursor (an image, a link). */\n handle?: Ref<RichTextEditorHandle>;\n /**\n * The image button hands over to the page (a media library): call `insert` with the chosen image and it goes in at\n * the cursor. Without it, the button asks for an image URL.\n */\n onImageRequest?: (insert: (image: { src: string; alt?: string }) => void) => void;\n /** Accessible name for the editable area. Default \"Rich text editor\". */\n label?: string;\n}\n\ntype Doc = Editor[\"state\"][\"doc\"];\n/**\n * The editor's own outputs the page hasn't caught up with, which can still come back as late echoes: at most this many,\n * in at most this many characters (a large document with pasted images), and only the newest few parsed to compare.\n */\nconst OWN_OUTPUTS = 100;\nconst OWN_OUTPUT_CHARS = 4_000_000;\nconst PARSED_OUTPUTS = 10;\n\n/**\n * A value from outside, applied as the smallest replacement (0.21.0): the cursor maps through it, it isn't an undo\n * step, and it raises no update event, so neither onChange nor the form's mark hears of it.\n */\nfunction applyOutside(editor: Editor, incoming: Doc) {\n const { state } = editor;\n const start = state.doc.content.findDiffStart(incoming.content);\n if (start == null) return;\n let { a: endA, b: endB } = state.doc.content.findDiffEnd(incoming.content) ?? { a: state.doc.content.size, b: incoming.content.size };\n // repeated text around the change makes the ends overlap the start (ProseMirror's own reading of a DOM change)\n const overlap = start - Math.min(endA, endB);\n if (overlap > 0) { endA += overlap; endB += overlap; }\n let tr = state.tr;\n try {\n tr = tr.replace(start, endA, incoming.slice(start, endB));\n } catch {\n tr = state.tr.replaceWith(0, state.doc.content.size, incoming.content);\n }\n editor.view.dispatch(tr.setMeta(\"addToHistory\", false).setMeta(\"preventUpdate\", true));\n}\n\nexport function RichTextEditor({\n content = \"\",\n placeholder = \"Start writing...\",\n onChange,\n editable = true,\n toolbar = \"full\",\n className,\n ref, handle, onImageRequest, label = \"Rich text editor\" }: RichTextEditorProps) {\n const resolvedToolbar = toolbar === \"full\" ? DEFAULT_TOOLBAR : toolbar === \"minimal\" ? MINIMAL_TOOLBAR : toolbar;\n // A15: an edit is a change to the form the editor sits in (never a value the page sets)\n const reportChange = useLatest(useContext(FormChangeCtx));\n // The editor's own outputs the page hasn't caught up with, newest last: a value coming back that matches one is a late\n // echo, not a change. Once the page holds the newest, none of them can come back (0.21.0: an older one that matched\n // a clear or a reset swallowed it). Each is parsed only if a value needs comparing with it.\n const ownOutputs = useRef<Array<{ html: string; doc?: Doc }>>([]);\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n codeBlock: false,\n link: { openOnClick: false, HTMLAttributes: { class: \"rte-link\" } },\n }),\n Image.configure({ inline: false, allowBase64: true }),\n CodeBlockLowlight.configure({ lowlight }),\n Table.configure({ resizable: false }),\n TableRow,\n TableCell,\n TableHeader,\n Placeholder.configure({ placeholder }),\n TextStyle,\n FontSize,\n Color,\n Highlight.configure({ multicolor: true }),\n TextAlign.configure({ types: [\"heading\", \"paragraph\"] }),\n TaskList,\n TaskItem.configure({ nested: true }),\n Subscript,\n Superscript,\n FontFamily,\n ],\n content,\n editable,\n // Setting attributes replaces tiptap's defaults, so restore role=\"textbox\" alongside the name.\n editorProps: { attributes: { role: \"textbox\", \"aria-label\": label, \"aria-multiline\": \"true\" } },\n onUpdate: ({ editor: e }) => {\n const html = e.getHTML();\n const outputs = ownOutputs.current;\n outputs.push({ html });\n let chars = outputs.reduce((n, o) => n + o.html.length, 0);\n while (outputs.length > 1 && (outputs.length > OWN_OUTPUTS || chars > OWN_OUTPUT_CHARS)) chars -= outputs.shift()!.html.length;\n reportChange.current?.();\n onChange?.(html);\n },\n });\n\n // Following `content` (A16, R28-43): applied with no update event (so no onChange and no form mark), outside the undo\n // history, the cursor mapped through it (applyOutside). What counts as the same is decided like for like: a value\n // equal to the editor's own output, now or one the page hasn't caught up with, as text, else both sides parsed through\n // the editor's schema — never a parsed value against the live document, since parsing drops a paragraph's trailing\n // space the user just typed. Nothing is applied during an IME composition; a value that came during one is checked\n // again when it ends.\n const contentRef = useLatest(content);\n const outsideWaiting = useRef(false);\n const follow = useCallback((ed: Editor) => {\n if (ed.isDestroyed) return;\n const html = contentRef.current;\n const current = ed.getHTML();\n const outputs = ownOutputs.current;\n // the page holds what the editor shows: every output it could send back is older, and none will come now\n if (html === current) { outputs.length = 0; return; }\n // a late echo: nothing to apply, and the outputs before it are older still\n const echoed = outputs.map((o) => o.html).lastIndexOf(html);\n if (echoed !== -1) { outputs.splice(0, echoed); return; }\n const parse = (h: string): Doc => createDocument(h, ed.schema, {}, { errorOnInvalidContent: false });\n let incoming: Doc;\n try {\n incoming = parse(html);\n if (incoming.eq(parse(current))) { outputs.length = 0; return; }\n for (let i = outputs.length - 1; i >= Math.max(0, outputs.length - PARSED_OUTPUTS); i--) {\n const own = outputs[i];\n own.doc ??= parse(own.html);\n if (own.doc.eq(incoming)) { outputs.splice(0, i); return; }\n }\n } catch {\n return;\n }\n if (ed.view.composing) {\n outsideWaiting.current = true;\n return;\n }\n outputs.length = 0;\n applyOutside(ed, incoming);\n }, [contentRef]);\n\n useEffect(() => {\n if (editor) follow(editor);\n }, [editor, content, follow]);\n\n useEffect(() => {\n if (!editor) return;\n const dom = editor.view.dom;\n const onEnd = () => {\n if (!outsideWaiting.current) return;\n outsideWaiting.current = false;\n // ProseMirror reads the composition's last input after the event\n setTimeout(() => follow(editor));\n };\n dom.addEventListener(\"compositionend\", onEnd);\n return () => dom.removeEventListener(\"compositionend\", onEnd);\n }, [editor, follow]);\n\n // `editable` follows its prop (tiptap freezes it at creation); no update event, so no onChange\n useEffect(() => {\n if (editor && !editor.isDestroyed && editor.isEditable !== editable) editor.setEditable(editable, false);\n }, [editor, editable]);\n\n useImperativeHandle(handle, () => ({\n setContent: (html) => { if (editor && !editor.isDestroyed) editor.commands.setContent(html); },\n insertContent: (html) => { editor?.chain().focus().insertContent(html).run(); },\n insertImage: ({ src, alt }) => { editor?.chain().focus().setImage({ src, alt: alt || undefined }).run(); },\n focus: () => { editor?.commands.focus(); },\n getHTML: () => editor?.getHTML() ?? \"\",\n }), [editor]);\n\n if (!editor) return null;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col rounded-[var(--ds-radius-md)] overflow-hidden\",\n // Sprint 25.14 A20: a field's edge, at 3:1 like every other control's\n \"border-[length:var(--ds-border-width)] border-[var(--ds-input-border)]\",\n \"bg-[var(--ds-bg-surface)]\",\n className,\n )}\n >\n {editable && <Toolbar editor={editor} groups={resolvedToolbar} onImageRequest={onImageRequest} />}\n\n <EditorContent\n editor={editor}\n className={cn(\n \"rte-content\",\n \"flex-1 overflow-y-auto px-ds-4 py-ds-3\",\n \"text-sm text-[var(--ds-text-primary)]\",\n \"focus-within:outline-none\",\n )}\n />\n </div>\n );\n}\n\n/* ── Toolbar ──────────────────────────────────────────────────────── */\n\nconst TEXT_COLORS = [\n { label: \"Default\", value: \"\" },\n { label: \"Red\", value: \"#ef4444\" },\n { label: \"Orange\", value: \"#f97316\" },\n { label: \"Yellow\", value: \"#eab308\" },\n { label: \"Green\", value: \"#22c55e\" },\n { label: \"Blue\", value: \"#3b82f6\" },\n { label: \"Purple\", value: \"#a855f7\" },\n { label: \"Pink\", value: \"#ec4899\" },\n];\n\nconst HIGHLIGHT_COLORS = [\n { label: \"None\", value: \"\" },\n { label: \"Yellow\", value: \"#fef08a\" },\n { label: \"Green\", value: \"#bbf7d0\" },\n { label: \"Blue\", value: \"#bfdbfe\" },\n { label: \"Pink\", value: \"#fbcfe8\" },\n { label: \"Orange\", value: \"#fed7aa\" },\n { label: \"Purple\", value: \"#e9d5ff\" },\n];\n\nconst FONT_FAMILIES = [\n { label: \"Default\", value: \"\" },\n { label: \"Sans\", value: \"var(--ds-font-sans)\" },\n { label: \"Mono\", value: \"var(--ds-font-mono)\" },\n { label: \"Display\", value: \"var(--ds-font-display)\" },\n { label: \"Serif\", value: \"Georgia, serif\" },\n];\n\nconst TEXT_SIZES = [\n { label: \"Small\", value: \"0.85em\" },\n { label: \"Normal\", value: \"\" },\n { label: \"Large\", value: \"1.2em\" },\n { label: \"Huge\", value: \"1.5em\" },\n];\n\nfunction Toolbar({ editor, groups, onImageRequest }: { editor: Editor; groups: ToolbarGroup[]; onImageRequest?: RichTextEditorProps[\"onImageRequest\"] }) {\n const [, forceUpdate] = useState(0);\n const isMobile = useBreakpoint(\"sm\");\n\n useEffect(() => {\n const handler = () => forceUpdate((n) => n + 1);\n editor.on(\"selectionUpdate\", handler);\n editor.on(\"transaction\", handler);\n return () => {\n editor.off(\"selectionUpdate\", handler);\n editor.off(\"transaction\", handler);\n };\n }, [editor]);\n\n const inTable = editor.isActive(\"table\");\n const has = (g: ToolbarGroup) => groups.includes(g);\n // Sprint 25.14 A22: on a phone the toolbars scroll sideways with no scrollbar, so their edges fade where more waits,\n // as the Tabs strip and the Table do\n const { ref: toolbarRef, measure: measureToolbar, fadeProps: toolbarFade } = useScrollEdges<HTMLDivElement>({ enabled: isMobile });\n const { ref: tableBarRef, measure: measureTableBar, fadeProps: tableBarFade } = useScrollEdges<HTMLDivElement>({ enabled: isMobile && inTable });\n\n const groupElements: React.ReactNode[] = [];\n\n if (has(\"blockType\")) groupElements.push(<BlockTypeSelect key=\"blockType\" editor={editor} />);\n if (has(\"fontFamily\")) groupElements.push(<FontFamilySelect key=\"fontFamily\" editor={editor} />);\n if (has(\"textSize\")) groupElements.push(<TextSizeControls key=\"textSize\" editor={editor} />);\n\n if (has(\"formatting\")) {\n groupElements.push(\n <ToolGroup key=\"formatting\">\n <ToolBtn active={editor.isActive(\"bold\")} onClick={() => editor.chain().focus().toggleBold().run()} title=\"Bold (Ctrl+B)\">\n <Icon name=\"bold\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"italic\")} onClick={() => editor.chain().focus().toggleItalic().run()} title=\"Italic (Ctrl+I)\">\n <Icon name=\"italic\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"underline\")} onClick={() => editor.chain().focus().toggleUnderline().run()} title=\"Underline (Ctrl+U)\">\n <Icon name=\"underline\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"strike\")} onClick={() => editor.chain().focus().toggleStrike().run()} title=\"Strikethrough\">\n <Icon name=\"strikethrough\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"colors\")) {\n groupElements.push(\n <ToolGroup key=\"colors\">\n <ColorPicker\n colors={TEXT_COLORS}\n activeColor={editor.getAttributes(\"textStyle\").color ?? \"\"}\n onSelect={(c) => c ? editor.chain().focus().setColor(c).run() : editor.chain().focus().unsetColor().run()}\n title=\"Text color\"\n icon={<Icon name=\"type\" size={16} />}\n />\n <ColorPicker\n colors={HIGHLIGHT_COLORS}\n activeColor={editor.getAttributes(\"highlight\").color ?? \"\"}\n onSelect={(c) => c ? editor.chain().focus().toggleHighlight({ color: c }).run() : editor.chain().focus().unsetHighlight().run()}\n title=\"Highlight\"\n icon={<Icon name=\"highlight\" size={16} />}\n />\n </ToolGroup>\n );\n }\n\n if (has(\"alignment\")) {\n groupElements.push(\n <ToolGroup key=\"alignment\">\n <ToolBtn active={editor.isActive({ textAlign: \"left\" })} onClick={() => editor.chain().focus().setTextAlign(\"left\").run()} title=\"Align left\">\n <Icon name=\"align-left\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive({ textAlign: \"center\" })} onClick={() => editor.chain().focus().setTextAlign(\"center\").run()} title=\"Align center\">\n <Icon name=\"align-center\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive({ textAlign: \"right\" })} onClick={() => editor.chain().focus().setTextAlign(\"right\").run()} title=\"Align right\">\n <Icon name=\"align-right\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"lists\")) {\n groupElements.push(\n <ToolGroup key=\"lists\">\n <ToolBtn active={editor.isActive(\"bulletList\")} onClick={() => editor.chain().focus().toggleBulletList().run()} title=\"Bullet list\">\n <Icon name=\"list\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"orderedList\")} onClick={() => editor.chain().focus().toggleOrderedList().run()} title=\"Ordered list\">\n <Icon name=\"list-ordered\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"taskList\")} onClick={() => editor.chain().focus().toggleTaskList().run()} title=\"Task list\">\n <Icon name=\"list-checks\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"blocks\")) {\n groupElements.push(\n <ToolGroup key=\"blocks\">\n <ToolBtn active={editor.isActive(\"blockquote\")} onClick={() => editor.chain().focus().toggleBlockquote().run()} title=\"Blockquote\">\n <Icon name=\"quote\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"codeBlock\")} onClick={() => editor.chain().focus().toggleCodeBlock().run()} title=\"Code block\">\n <Icon name=\"code\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"insert\")) {\n groupElements.push(\n <ToolGroup key=\"insert\">\n <LinkPopover editor={editor} />\n {onImageRequest ? (\n // the page's media library is the one way in; its choice goes in at the cursor\n <ToolBtn onClick={() => onImageRequest((image) => { editor.chain().focus().setImage({ src: image.src, alt: image.alt || undefined }).run(); })} title=\"Image\">\n <Icon name=\"image\" size={16} />\n </ToolBtn>\n ) : (\n <ImagePopover editor={editor} />\n )}\n <ToolBtn onClick={() => editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run()} disabled={inTable} title=\"Insert table\">\n <Icon name=\"table\" size={16} />\n </ToolBtn>\n <ToolBtn onClick={() => editor.chain().focus().setHorizontalRule().run()} title=\"Horizontal rule\">\n <Icon name=\"minus\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"extras\")) {\n groupElements.push(\n <ToolGroup key=\"extras\">\n <ToolBtn active={editor.isActive(\"code\")} onClick={() => editor.chain().focus().toggleCode().run()} title=\"Inline code\">\n <Icon name=\"code\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"superscript\")} onClick={() => editor.chain().focus().toggleSuperscript().run()} title=\"Superscript\">\n <Icon name=\"superscript\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"subscript\")} onClick={() => editor.chain().focus().toggleSubscript().run()} title=\"Subscript\">\n <Icon name=\"subscript\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"history\")) {\n groupElements.push(\n <ToolGroup key=\"history\">\n <ToolBtn onClick={() => editor.chain().focus().undo().run()} disabled={!editor.can().undo()} title=\"Undo (Ctrl+Z)\">\n <Icon name=\"undo\" size={16} />\n </ToolBtn>\n <ToolBtn onClick={() => editor.chain().focus().redo().run()} disabled={!editor.can().redo()} title=\"Redo (Ctrl+Shift+Z)\">\n <Icon name=\"redo\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n const withDividers = groupElements.reduce<React.ReactNode[]>((acc, el, i) => {\n if (i > 0) acc.push(<Divider key={`d-${i}`} />);\n acc.push(el);\n return acc;\n }, []);\n\n return (\n <div className=\"border-b-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)] bg-[var(--ds-bg-muted)]\">\n <div\n ref={toolbarRef}\n onScroll={measureToolbar}\n {...toolbarFade}\n className={cn(\n \"flex items-center gap-ds-0.5 px-ds-2 py-ds-1\",\n isMobile ? \"overflow-x-auto flex-nowrap gs-scrollbar-none\" : \"flex-wrap\",\n )}\n >\n {withDividers}\n </div>\n\n {inTable && (\n <div ref={tableBarRef} onScroll={measureTableBar} {...tableBarFade} className={cn(\n \"flex items-center gap-ds-0.5 px-ds-2 py-ds-1 border-t-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n isMobile && \"overflow-x-auto flex-nowrap gs-scrollbar-none\",\n )}>\n <span className=\"text-2xs text-[var(--ds-text-muted)] uppercase tracking-wider mr-ds-1 shrink-0\">Table</span>\n <TableOpBtn onClick={() => editor.chain().focus().addRowAfter().run()} label=\"+ Row\" />\n <TableOpBtn onClick={() => editor.chain().focus().addColumnAfter().run()} label=\"+ Col\" />\n <Divider />\n <TableOpBtn onClick={() => editor.chain().focus().deleteRow().run()} label=\"− Row\" />\n <TableOpBtn onClick={() => editor.chain().focus().deleteColumn().run()} label=\"− Col\" />\n <Divider />\n <TableOpBtn onClick={() => editor.chain().focus().mergeCells().run()} label=\"Merge\" />\n <TableOpBtn onClick={() => editor.chain().focus().splitCell().run()} label=\"Split\" />\n <Divider />\n <ToolBtn onClick={() => editor.chain().focus().deleteTable().run()} title=\"Delete table\"><Icon name=\"trash\" size={14} /></ToolBtn>\n </div>\n )}\n </div>\n );\n}\n\n/* ── Block type select (paragraph / headings) ─────────────────────── */\n\nfunction BlockTypeSelect({ editor }: { editor: Editor }) {\n const value = editor.isActive(\"heading\", { level: 1 }) ? \"h1\"\n : editor.isActive(\"heading\", { level: 2 }) ? \"h2\"\n : editor.isActive(\"heading\", { level: 3 }) ? \"h3\"\n : \"p\";\n\n return (\n <select\n value={value}\n onChange={(e) => {\n const v = e.target.value;\n if (v === \"p\") editor.chain().focus().setParagraph().run();\n else if (v === \"h1\") editor.chain().focus().toggleHeading({ level: 1 }).run();\n else if (v === \"h2\") editor.chain().focus().toggleHeading({ level: 2 }).run();\n else if (v === \"h3\") editor.chain().focus().toggleHeading({ level: 3 }).run();\n }}\n title=\"Block type\"\n aria-label=\"Block type\"\n className={cn(\n \"h-7 px-ds-1.5 text-xs rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-transparent text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)]\",\n \"border-none outline-none\",\n \"focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n <option value=\"p\">Paragraph</option>\n <option value=\"h1\">Heading 1</option>\n <option value=\"h2\">Heading 2</option>\n <option value=\"h3\">Heading 3</option>\n </select>\n );\n}\n\n/* ── Text size increase/decrease ──────────────────────────────────── */\n\nfunction TextSizeControls({ editor }: { editor: Editor }) {\n const current = editor.getAttributes(\"textStyle\").fontSize ?? \"\";\n const idx = TEXT_SIZES.findIndex((s) => s.value === current);\n const currentIdx = idx === -1 ? 1 : idx;\n\n const decrease = () => {\n const next = Math.max(0, currentIdx - 1);\n const v = TEXT_SIZES[next].value;\n if (v) editor.chain().focus().setFontSize(v).run();\n else editor.chain().focus().unsetFontSize().run();\n };\n\n const increase = () => {\n const next = Math.min(TEXT_SIZES.length - 1, currentIdx + 1);\n const v = TEXT_SIZES[next].value;\n if (v) editor.chain().focus().setFontSize(v).run();\n else editor.chain().focus().unsetFontSize().run();\n };\n\n return (\n <ToolGroup>\n <ToolBtn onClick={decrease} disabled={currentIdx <= 0} title={`Decrease text size (${TEXT_SIZES[Math.max(0, currentIdx - 1)]?.label})`}>\n <span className=\"text-2xs font-bold leading-none select-none\">A</span>\n </ToolBtn>\n <ToolBtn onClick={increase} disabled={currentIdx >= TEXT_SIZES.length - 1} title={`Increase text size (${TEXT_SIZES[Math.min(TEXT_SIZES.length - 1, currentIdx + 1)]?.label})`}>\n <span className=\"text-base font-bold leading-none select-none\">A</span>\n </ToolBtn>\n </ToolGroup>\n );\n}\n\n/* ── Color picker popover ─────────────────────────────────────────── */\n\nfunction ColorPicker({\n colors,\n activeColor,\n onSelect,\n title,\n icon,\n}: {\n colors: { label: string; value: string }[];\n activeColor: string;\n onSelect: (color: string) => void;\n title: string;\n icon: React.ReactNode;\n}) {\n const [open, setOpen] = useState(false);\n const isTopLayer = useOverlayLayer(open);\n const ref = useRef<HTMLDivElement>(null);\n\n const close = useCallback(() => setOpen(false), []);\n\n // Sprint 25.7: Escape puts focus back on the toolbar button (the popover renders in place, so Tab already moves\n // in page order); focus leaving the button and panel closes it.\n const closeToButton = useCallback(() => {\n const inside = !!ref.current?.contains(document.activeElement);\n close();\n if (inside) ref.current?.querySelector<HTMLElement>(\"button\")?.focus();\n }, [close]);\n useCloseOnFocusOut(open, ref, ref, close, isTopLayer);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => { if (!ref.current?.contains(e.target as Node)) close(); };\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented || !isTopLayer()) return;\n e.preventDefault();\n closeToButton();\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n return () => { document.removeEventListener(\"mousedown\", onClick); document.removeEventListener(\"keydown\", onKey); };\n }, [open, close, closeToButton, isTopLayer]);\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n title={title}\n className={cn(\n \"flex flex-col items-center justify-center w-7 h-7 rounded-[var(--ds-radius-sm)] transition-colors cursor-pointer\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n open\n ? \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\"\n : \"text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)] hover:text-[var(--ds-text-primary)]\",\n )}\n >\n {icon}\n {activeColor && (\n <span className=\"w-3.5 h-0.5 rounded-[var(--ds-radius-full)] -mt-ds-0.5\" style={{ backgroundColor: activeColor }} />\n )}\n </button>\n\n {open && (\n <div className=\"absolute top-full left-0 mt-ds-1 z-[var(--ds-z-popover)] p-ds-1.5 rounded-[var(--ds-radius-md)] border-[length:var(--ds-border-width)] border-[var(--ds-border-default)] bg-[var(--ds-bg-surface-elevated)] shadow-[var(--ds-shadow-dropdown)] flex gap-ds-1 flex-wrap w-[140px]\">\n {colors.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n title={c.label}\n onClick={() => { onSelect(c.value); close(); }}\n className={cn(\n \"w-6 h-6 rounded-[var(--ds-radius-sm)] border-[2px] transition-all cursor-pointer\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n activeColor === c.value ? `${ACTIVE_RING} scale-110` : \"border-transparent hover:scale-110\",\n )}\n style={{ backgroundColor: c.value || \"var(--ds-text-primary)\" }}\n >\n {!c.value && <span className=\"block w-full h-full rounded-[calc(var(--ds-radius-sm)-2px)] bg-[var(--ds-bg-surface)] relative after:absolute after:inset-0 after:rounded-[inherit] after:bg-gradient-to-br after:from-transparent after:to-[var(--ds-text-muted)] after:opacity-30\" />}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/* ── Link popover ─────────────────────────────────────────────────── */\n\nfunction LinkPopover({ editor }: { editor: Editor }) {\n const [open, setOpen] = useState(false);\n const isTopLayer = useOverlayLayer(open);\n const [url, setUrl] = useState(\"\");\n const ref = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const close = useCallback(() => { setOpen(false); setUrl(\"\"); }, []);\n\n // Sprint 25.7: Escape puts focus back on the toolbar button (the popover renders in place, so Tab already moves\n // in page order); focus leaving the button and panel closes it.\n const closeToButton = useCallback(() => {\n const inside = !!ref.current?.contains(document.activeElement);\n close();\n if (inside) ref.current?.querySelector<HTMLElement>(\"button\")?.focus();\n }, [close]);\n useCloseOnFocusOut(open, ref, ref, close, isTopLayer);\n\n const toggle = useCallback(() => {\n if (editor.isActive(\"link\")) {\n editor.chain().focus().unsetLink().run();\n return;\n }\n const existing = editor.getAttributes(\"link\").href ?? \"\";\n setUrl(existing);\n setOpen((o) => !o);\n }, [editor]);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => { if (!ref.current?.contains(e.target as Node)) close(); };\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented || !isTopLayer()) return;\n e.preventDefault();\n closeToButton();\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n requestAnimationFrame(() => inputRef.current?.focus());\n return () => { document.removeEventListener(\"mousedown\", onClick); document.removeEventListener(\"keydown\", onKey); };\n }, [open, close, closeToButton, isTopLayer]);\n\n const apply = () => {\n if (url) editor.chain().focus().setLink({ href: url }).run();\n close();\n };\n\n return (\n <div ref={ref} className=\"relative\">\n <ToolBtn active={editor.isActive(\"link\")} onClick={toggle} title=\"Link\">\n <Icon name=\"link\" size={16} />\n </ToolBtn>\n\n {open && (\n <div className=\"absolute top-full left-0 mt-ds-1 z-[var(--ds-z-popover)] p-ds-1.5 rounded-[var(--ds-radius-md)] border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)] bg-[var(--ds-bg-surface-elevated)] shadow-[var(--ds-shadow-dropdown)] flex items-center gap-ds-1 w-[240px]\">\n <input\n ref={inputRef}\n type=\"url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Enter\") apply(); }}\n placeholder=\"https://...\"\n className={cn(\n \"flex-1 h-6 px-ds-2 text-xs rounded-[var(--ds-radius-sm)]\",\n \"bg-transparent text-[var(--ds-text-primary)] placeholder:text-[var(--ds-text-muted)]\",\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n FOCUS_RING,\n )}\n />\n <button\n type=\"button\"\n onClick={apply}\n className={cn(\n \"shrink-0 h-6 px-ds-2 text-xs font-medium rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\",\n \"hover:opacity-90 transition-opacity\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n Apply\n </button>\n </div>\n )}\n </div>\n );\n}\n\n/* ── Image popover ────────────────────────────────────────────────── */\n\nfunction ImagePopover({ editor }: { editor: Editor }) {\n const [open, setOpen] = useState(false);\n const isTopLayer = useOverlayLayer(open);\n const [url, setUrl] = useState(\"\");\n const [alt, setAlt] = useState(\"\");\n const ref = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const close = useCallback(() => { setOpen(false); setUrl(\"\"); setAlt(\"\"); }, []);\n\n // Sprint 25.7: Escape puts focus back on the toolbar button (the popover renders in place, so Tab already moves\n // in page order); focus leaving the button and panel closes it.\n const closeToButton = useCallback(() => {\n const inside = !!ref.current?.contains(document.activeElement);\n close();\n if (inside) ref.current?.querySelector<HTMLElement>(\"button\")?.focus();\n }, [close]);\n useCloseOnFocusOut(open, ref, ref, close, isTopLayer);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => { if (!ref.current?.contains(e.target as Node)) close(); };\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented || !isTopLayer()) return;\n e.preventDefault();\n closeToButton();\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n requestAnimationFrame(() => inputRef.current?.focus());\n return () => { document.removeEventListener(\"mousedown\", onClick); document.removeEventListener(\"keydown\", onKey); };\n }, [open, close, closeToButton, isTopLayer]);\n\n const insert = () => {\n if (url) editor.chain().focus().setImage({ src: url, alt: alt || undefined }).run();\n close();\n };\n\n return (\n <div ref={ref} className=\"relative\">\n <ToolBtn onClick={() => setOpen((o) => !o)} title=\"Image\">\n <Icon name=\"image\" size={16} />\n </ToolBtn>\n\n {open && (\n <div className=\"absolute top-full left-0 mt-ds-1 z-[var(--ds-z-popover)] p-ds-1.5 rounded-[var(--ds-radius-md)] border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)] bg-[var(--ds-bg-surface-elevated)] shadow-[var(--ds-shadow-dropdown)] flex flex-col gap-ds-1 w-[240px]\">\n <input\n ref={inputRef}\n type=\"url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"Image URL\"\n className={cn(\n \"h-6 px-ds-2 text-xs rounded-[var(--ds-radius-sm)]\",\n \"bg-transparent text-[var(--ds-text-primary)] placeholder:text-[var(--ds-text-muted)]\",\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n FOCUS_RING,\n )}\n />\n <div className=\"flex items-center gap-ds-1\">\n <input\n type=\"text\"\n value={alt}\n onChange={(e) => setAlt(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Enter\") insert(); }}\n placeholder=\"Alt text (optional)\"\n className={cn(\n \"flex-1 h-6 px-ds-2 text-xs rounded-[var(--ds-radius-sm)]\",\n \"bg-transparent text-[var(--ds-text-primary)] placeholder:text-[var(--ds-text-muted)]\",\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n FOCUS_RING,\n )}\n />\n <button\n type=\"button\"\n onClick={insert}\n className={cn(\n \"shrink-0 h-6 px-ds-2 text-xs font-medium rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\",\n \"hover:opacity-90 transition-opacity\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n Insert\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/* ── Font family select ───────────────────────────────────────────── */\n\nfunction FontFamilySelect({ editor }: { editor: Editor }) {\n const current = editor.getAttributes(\"textStyle\").fontFamily ?? \"\";\n\n return (\n <select\n value={current}\n onChange={(e) => {\n const v = e.target.value;\n if (v) editor.chain().focus().setFontFamily(v).run();\n else editor.chain().focus().unsetFontFamily().run();\n }}\n title=\"Font family\"\n aria-label=\"Font family\"\n className={cn(\n \"h-7 px-ds-1.5 text-xs rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-transparent text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)]\",\n \"border-none outline-none\",\n \"focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n {FONT_FAMILIES.map((f) => (\n <option key={f.label} value={f.value}>{f.label}</option>\n ))}\n </select>\n );\n}\n\n/* ── Shared toolbar helpers ───────────────────────────────────────── */\n\nfunction ToolGroup({ children }: { children: React.ReactNode }) {\n return <div className=\"flex items-center gap-ds-0.5\">{children}</div>;\n}\n\nfunction Divider() {\n return <div className=\"w-px h-5 mx-ds-1 bg-[var(--ds-border-subtle)]\" />;\n}\n\nfunction TableOpBtn({ onClick, label }: { onClick: () => void; label: string }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={label}\n className={cn(\n \"h-6 px-ds-1.5 text-2xs font-medium rounded-[var(--ds-radius-sm)] transition-colors cursor-pointer whitespace-nowrap\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n \"text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)] hover:text-[var(--ds-text-primary)]\",\n )}\n >\n {label}\n </button>\n );\n}\n\nfunction ToolBtn({ active, disabled, onClick, title, children }: { active?: boolean; disabled?: boolean; onClick: () => void; title: string; children: React.ReactNode }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={cn(\n \"flex items-center justify-center w-7 h-7 rounded-[var(--ds-radius-sm)] transition-colors cursor-pointer\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n active\n ? \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\"\n : \"text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)] hover:text-[var(--ds-text-primary)]\",\n disabled && \"opacity-disabled pointer-events-none\",\n )}\n >\n {children}\n </button>\n );\n}\n\n"]}
1
+ {"version":3,"sources":["../../../showcase/src/components/RichTextEditor.tsx"],"names":["TiptapNode"],"mappings":"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","file":"editor.js","sourcesContent":["import { useState, useCallback, useRef, useEffect, useContext, useImperativeHandle, type ComponentType, type Ref } from \"react\";\nimport { useCloseOnFocusOut, useOverlayLayer } from \"../lib/focus\";\nimport { useEditor, EditorContent, createDocument, Extension, Node as TiptapNode, mergeAttributes, type AnyExtension, type Editor } from \"@tiptap/react\";\nimport { Plugin } from \"@tiptap/pm/state\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Image from \"@tiptap/extension-image\";\nimport { Table } from \"@tiptap/extension-table\";\nimport { TableRow } from \"@tiptap/extension-table-row\";\nimport { TableCell } from \"@tiptap/extension-table-cell\";\nimport { TableHeader } from \"@tiptap/extension-table-header\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport CodeBlockLowlight from \"@tiptap/extension-code-block-lowlight\";\nimport { TextStyle, FontSize } from \"@tiptap/extension-text-style\";\nimport Color from \"@tiptap/extension-color\";\nimport Highlight from \"@tiptap/extension-highlight\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport TaskList from \"@tiptap/extension-task-list\";\nimport TaskItem from \"@tiptap/extension-task-item\";\nimport Subscript from \"@tiptap/extension-subscript\";\nimport Superscript from \"@tiptap/extension-superscript\";\nimport FontFamily from \"@tiptap/extension-font-family\";\nimport { all, createLowlight } from \"lowlight\";\nimport { cn, ACTIVE_RING, FOCUS_RING } from \"../lib/utils\";\nimport { Icon } from \"../lib/icons\";\nimport { useBreakpoint } from \"../lib/use-breakpoint\";\nimport { useScrollEdges } from \"../lib/use-scroll-edges\";\nimport { useLatest } from \"../lib/use-latest\";\nimport { FormChangeCtx } from \"../lib/form-context\";\nimport { warnOnce } from \"../lib/dev-warn\";\n\nconst lowlight = createLowlight(all);\n\nexport type ToolbarGroup =\n | \"blockType\"\n | \"fontFamily\"\n | \"textSize\"\n | \"formatting\"\n | \"colors\"\n | \"alignment\"\n | \"lists\"\n | \"blocks\"\n | \"insert\"\n | \"extras\"\n | \"history\";\n\nconst DEFAULT_TOOLBAR: ToolbarGroup[] = [\n \"blockType\", \"fontFamily\", \"textSize\",\n \"formatting\", \"colors\", \"alignment\",\n \"lists\", \"blocks\", \"insert\", \"extras\", \"history\",\n];\n\nconst MINIMAL_TOOLBAR: ToolbarGroup[] = [\n \"formatting\", \"lists\", \"insert\", \"history\",\n];\n\n/** The editor's handle (Sprint 25.12 A16): what a page does to the document on purpose. */\nexport interface RichTextEditorHandle {\n /**\n * Replaces the whole document (a restore, a template). It always applies, even over text typed this session, and it's\n * a change like the user's own: onChange runs.\n */\n setContent: (html: string) => void;\n /** Inserts HTML where the cursor is (or was, when the editor lost focus), then focuses the editor. */\n insertContent: (html: string) => void;\n /** Inserts an image where the cursor is. */\n insertImage: (image: { src: string; alt?: string }) => void;\n focus: () => void;\n getHTML: () => string;\n}\n\n/**\n * @mentions in the editor (Sprint 25.17 A17): what `useMentions` returns, from `gridsmith-ui/editor-mentions`. The type\n * lives here so this entry imports nothing of tiptap's mention packages; they come with the mentions entry.\n */\nexport interface RichTextEditorMentions {\n /** The editor's extension for mentions: a mention is one token, carried in the HTML with the person's id. */\n extension: AnyExtension;\n /** The list of people the editor draws while a mention is typed, anchored at the caret. */\n List: ComponentType<{ editor: Editor }>;\n}\n\nexport interface RichTextEditorProps {\n /**\n * The document, as HTML. The editor follows it (Sprint 25.12 A16): a new value from outside is applied at once, a\n * clear or a reset included, without calling onChange and outside the undo history (Ctrl+Z never takes it back), and\n * the cursor moves with the text around it. Its own output coming back late (an autosave's echo, markup a server\n * sanitised that parses the same) changes nothing. The editor follows a change of value: to put back the value the\n * page already holds (a Discard when the page stores only what was saved), call `handle.setContent`. A page that\n * switches records keys the editor by the record's id, so undo never crosses records.\n */\n content?: string;\n placeholder?: string;\n onChange?: (html: string) => void;\n /** false shows the document read-only, with no toolbar. Follows its prop. */\n editable?: boolean;\n toolbar?: ToolbarGroup[] | \"full\" | \"minimal\";\n className?: string;\n /** The root element. */\n ref?: Ref<HTMLDivElement>;\n /** The editor's handle: replace the document (a restore, a template) or insert at the cursor (an image, a link). */\n handle?: Ref<RichTextEditorHandle>;\n /**\n * The image button hands over to the page (a media library): call `insert` with the chosen image and it goes in at\n * the cursor. Without it, the button asks for an image URL.\n */\n onImageRequest?: (insert: (image: { src: string; alt?: string }) => void) => void;\n /** Accessible name for the editable area. Default \"Rich text editor\". */\n label?: string;\n /**\n * @mentions: `useMentions({ people })` (or `{ search }` for a large team) from `gridsmith-ui/editor-mentions`, passed\n * from the first render (the editor takes its extensions when it's created). Typing \"@\" offers the people; a mention\n * is one token, deleted whole, and onChange's HTML carries it with the person's id\n * (`<span data-type=\"mention\" data-id=\"…\" data-label=\"…\">`), so the page can notify them.\n */\n mentions?: RichTextEditorMentions;\n}\n\ntype Doc = Editor[\"state\"][\"doc\"];\n/**\n * The editor's own outputs the page hasn't caught up with, which can still come back as late echoes: at most this many,\n * in at most this many characters (a large document with pasted images), and only the newest few parsed to compare.\n */\nconst OWN_OUTPUTS = 100;\nconst OWN_OUTPUT_CHARS = 4_000_000;\nconst PARSED_OUTPUTS = 10;\n\n/**\n * A value from outside, applied as the smallest replacement (0.21.0): the cursor maps through it, it isn't an undo\n * step, and it raises no update event, so neither onChange nor the form's mark hears of it.\n */\nfunction applyOutside(editor: Editor, incoming: Doc) {\n const { state } = editor;\n const start = state.doc.content.findDiffStart(incoming.content);\n if (start == null) return;\n let { a: endA, b: endB } = state.doc.content.findDiffEnd(incoming.content) ?? { a: state.doc.content.size, b: incoming.content.size };\n // repeated text around the change makes the ends overlap the start (ProseMirror's own reading of a DOM change)\n const overlap = start - Math.min(endA, endB);\n if (overlap > 0) { endA += overlap; endB += overlap; }\n let tr = state.tr;\n try {\n tr = tr.replace(start, endA, incoming.slice(start, endB));\n } catch {\n tr = state.tr.replaceWith(0, state.doc.content.size, incoming.content);\n }\n editor.view.dispatch(tr.setMeta(\"addToHistory\", false).setMeta(\"preventUpdate\", true));\n}\n\n/**\n * An Escape the editor doesn't use is the page's (Sprint 25.17 A17): ProseMirror prevents every Escape's default, so a\n * Dialog or Drawer around the editor never closed on one while the cursor was in the text. The editor asks its own\n * parts first, as ProseMirror would (a list of people while a mention is typed closes, and keeps the Escape); one no\n * part uses goes on to the page untouched. An Escape during an IME composition stays ProseMirror's.\n */\nconst EscapeToPage = Extension.create({\n name: \"escapeToPage\",\n addProseMirrorPlugins() {\n return [new Plugin({\n props: {\n handleDOMEvents: {\n keydown(view, event) {\n if (event.key !== \"Escape\" || event.isComposing) return false;\n if (view.someProp(\"handleKeyDown\", (f) => f(view, event))) event.preventDefault();\n return true;\n },\n },\n },\n })];\n },\n});\n\n/**\n * A stored mention, kept as it is when no `mentions` is passed (Sprint 25.17's review: a second editor, or a read-only\n * view made editable, read `<span data-type=\"mention\">` as text, and its first edit saved the HTML without the person's\n * id). One token, drawn and written as the mentions entry's own node, which takes its place when `mentions` is passed;\n * this one needs none of tiptap's mention packages.\n */\nconst StoredMention = TiptapNode.create({\n name: \"mention\",\n group: \"inline\",\n inline: true,\n atom: true,\n selectable: false,\n addAttributes() {\n return {\n id: { default: null, parseHTML: (el: HTMLElement) => el.getAttribute(\"data-id\"), renderHTML: (a: Record<string, unknown>) => (a.id ? { \"data-id\": a.id } : {}) },\n label: { default: null, parseHTML: (el: HTMLElement) => el.getAttribute(\"data-label\"), renderHTML: (a: Record<string, unknown>) => (a.label ? { \"data-label\": a.label } : {}) },\n mentionSuggestionChar: { default: \"@\", parseHTML: (el: HTMLElement) => el.getAttribute(\"data-mention-suggestion-char\"), renderHTML: (a: Record<string, unknown>) => ({ \"data-mention-suggestion-char\": a.mentionSuggestionChar }) },\n };\n },\n parseHTML() {\n return [{ tag: 'span[data-type=\"mention\"]' }];\n },\n renderHTML({ node, HTMLAttributes }) {\n // the attributes in the mentions entry's own order, so the two editors write the same HTML\n return [\"span\", mergeAttributes({ class: \"rte-mention\", \"data-type\": \"mention\" }, HTMLAttributes), `${node.attrs.mentionSuggestionChar ?? \"@\"}${node.attrs.label ?? node.attrs.id}`];\n },\n renderText({ node }) {\n return `${node.attrs.mentionSuggestionChar ?? \"@\"}${node.attrs.label ?? node.attrs.id}`;\n },\n});\n\nexport function RichTextEditor({\n content = \"\",\n placeholder = \"Start writing...\",\n onChange,\n editable = true,\n toolbar = \"full\",\n className,\n ref, handle, onImageRequest, label = \"Rich text editor\", mentions }: RichTextEditorProps) {\n const resolvedToolbar = toolbar === \"full\" ? DEFAULT_TOOLBAR : toolbar === \"minimal\" ? MINIMAL_TOOLBAR : toolbar;\n // A15: an edit is a change to the form the editor sits in (never a value the page sets)\n const reportChange = useLatest(useContext(FormChangeCtx));\n // The editor's own outputs the page hasn't caught up with, newest last: a value coming back that matches one is a late\n // echo, not a change. Once the page holds the newest, none of them can come back (0.21.0: an older one that matched\n // a clear or a reset swallowed it). Each is parsed only if a value needs comparing with it.\n const ownOutputs = useRef<Array<{ html: string; doc?: Doc }>>([]);\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n codeBlock: false,\n link: { openOnClick: false, HTMLAttributes: { class: \"rte-link\" } },\n }),\n Image.configure({ inline: false, allowBase64: true }),\n CodeBlockLowlight.configure({ lowlight }),\n Table.configure({ resizable: false }),\n TableRow,\n TableCell,\n TableHeader,\n Placeholder.configure({ placeholder }),\n TextStyle,\n FontSize,\n Color,\n Highlight.configure({ multicolor: true }),\n TextAlign.configure({ types: [\"heading\", \"paragraph\"] }),\n TaskList,\n TaskItem.configure({ nested: true }),\n Subscript,\n Superscript,\n FontFamily,\n EscapeToPage,\n mentions ? mentions.extension : StoredMention,\n ],\n content,\n editable,\n // Setting attributes replaces tiptap's defaults, so restore role=\"textbox\" alongside the name. With mentions,\n // typing \"@\" offers a list, which the editable area says (aria-autocomplete).\n editorProps: { attributes: { role: \"textbox\", \"aria-label\": label, \"aria-multiline\": \"true\", ...(mentions ? { \"aria-autocomplete\": \"list\" } : {}) } },\n onUpdate: ({ editor: e }) => {\n const html = e.getHTML();\n const outputs = ownOutputs.current;\n outputs.push({ html });\n let chars = outputs.reduce((n, o) => n + o.html.length, 0);\n while (outputs.length > 1 && (outputs.length > OWN_OUTPUTS || chars > OWN_OUTPUT_CHARS)) chars -= outputs.shift()!.html.length;\n reportChange.current?.();\n onChange?.(html);\n },\n });\n\n // the editor took its extensions when created: mentions that come or change later aren't in it\n const [firstMentions] = useState(mentions);\n useEffect(() => {\n if (mentions !== firstMentions) warnOnce(\"RichTextEditor\", \"`mentions` changed after the editor was created, so the editor still has the first. Pass `useMentions(…)`'s result from the first render; its people can change.\");\n }, [mentions, firstMentions]);\n\n // Following `content` (A16, R28-43): applied with no update event (so no onChange and no form mark), outside the undo\n // history, the cursor mapped through it (applyOutside). What counts as the same is decided like for like: a value\n // equal to the editor's own output, now or one the page hasn't caught up with, as text, else both sides parsed through\n // the editor's schema — never a parsed value against the live document, since parsing drops a paragraph's trailing\n // space the user just typed. Nothing is applied during an IME composition; a value that came during one is checked\n // again when it ends.\n const contentRef = useLatest(content);\n const outsideWaiting = useRef(false);\n const follow = useCallback((ed: Editor) => {\n if (ed.isDestroyed) return;\n const html = contentRef.current;\n const current = ed.getHTML();\n const outputs = ownOutputs.current;\n // the page holds what the editor shows: every output it could send back is older, and none will come now\n if (html === current) { outputs.length = 0; return; }\n // a late echo: nothing to apply, and the outputs before it are older still\n const echoed = outputs.map((o) => o.html).lastIndexOf(html);\n if (echoed !== -1) { outputs.splice(0, echoed); return; }\n const parse = (h: string): Doc => createDocument(h, ed.schema, {}, { errorOnInvalidContent: false });\n let incoming: Doc;\n try {\n incoming = parse(html);\n if (incoming.eq(parse(current))) { outputs.length = 0; return; }\n for (let i = outputs.length - 1; i >= Math.max(0, outputs.length - PARSED_OUTPUTS); i--) {\n const own = outputs[i];\n own.doc ??= parse(own.html);\n if (own.doc.eq(incoming)) { outputs.splice(0, i); return; }\n }\n } catch {\n return;\n }\n if (ed.view.composing) {\n outsideWaiting.current = true;\n return;\n }\n outputs.length = 0;\n applyOutside(ed, incoming);\n }, [contentRef]);\n\n useEffect(() => {\n if (editor) follow(editor);\n }, [editor, content, follow]);\n\n useEffect(() => {\n if (!editor) return;\n const dom = editor.view.dom;\n const onEnd = () => {\n if (!outsideWaiting.current) return;\n outsideWaiting.current = false;\n // ProseMirror reads the composition's last input after the event\n setTimeout(() => follow(editor));\n };\n dom.addEventListener(\"compositionend\", onEnd);\n return () => dom.removeEventListener(\"compositionend\", onEnd);\n }, [editor, follow]);\n\n // `editable` follows its prop (tiptap freezes it at creation); no update event, so no onChange\n useEffect(() => {\n if (editor && !editor.isDestroyed && editor.isEditable !== editable) editor.setEditable(editable, false);\n }, [editor, editable]);\n\n useImperativeHandle(handle, () => ({\n setContent: (html) => { if (editor && !editor.isDestroyed) editor.commands.setContent(html); },\n insertContent: (html) => { editor?.chain().focus().insertContent(html).run(); },\n insertImage: ({ src, alt }) => { editor?.chain().focus().setImage({ src, alt: alt || undefined }).run(); },\n focus: () => { editor?.commands.focus(); },\n getHTML: () => editor?.getHTML() ?? \"\",\n }), [editor]);\n\n if (!editor) return null;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col rounded-[var(--ds-radius-md)] overflow-hidden\",\n // Sprint 25.14 A20: a field's edge, at 3:1 like every other control's\n \"border-[length:var(--ds-border-width)] border-[var(--ds-input-border)]\",\n \"bg-[var(--ds-bg-surface)]\",\n className,\n )}\n >\n {editable && <Toolbar editor={editor} groups={resolvedToolbar} onImageRequest={onImageRequest} />}\n\n <EditorContent\n editor={editor}\n className={cn(\n \"rte-content\",\n \"flex-1 overflow-y-auto px-ds-4 py-ds-3\",\n \"text-sm text-[var(--ds-text-primary)]\",\n \"focus-within:outline-none\",\n )}\n />\n {firstMentions && <firstMentions.List editor={editor} />}\n </div>\n );\n}\n\n/* ── Toolbar ──────────────────────────────────────────────────────── */\n\nconst TEXT_COLORS = [\n { label: \"Default\", value: \"\" },\n { label: \"Red\", value: \"#ef4444\" },\n { label: \"Orange\", value: \"#f97316\" },\n { label: \"Yellow\", value: \"#eab308\" },\n { label: \"Green\", value: \"#22c55e\" },\n { label: \"Blue\", value: \"#3b82f6\" },\n { label: \"Purple\", value: \"#a855f7\" },\n { label: \"Pink\", value: \"#ec4899\" },\n];\n\nconst HIGHLIGHT_COLORS = [\n { label: \"None\", value: \"\" },\n { label: \"Yellow\", value: \"#fef08a\" },\n { label: \"Green\", value: \"#bbf7d0\" },\n { label: \"Blue\", value: \"#bfdbfe\" },\n { label: \"Pink\", value: \"#fbcfe8\" },\n { label: \"Orange\", value: \"#fed7aa\" },\n { label: \"Purple\", value: \"#e9d5ff\" },\n];\n\nconst FONT_FAMILIES = [\n { label: \"Default\", value: \"\" },\n { label: \"Sans\", value: \"var(--ds-font-sans)\" },\n { label: \"Mono\", value: \"var(--ds-font-mono)\" },\n { label: \"Display\", value: \"var(--ds-font-display)\" },\n { label: \"Serif\", value: \"Georgia, serif\" },\n];\n\nconst TEXT_SIZES = [\n { label: \"Small\", value: \"0.85em\" },\n { label: \"Normal\", value: \"\" },\n { label: \"Large\", value: \"1.2em\" },\n { label: \"Huge\", value: \"1.5em\" },\n];\n\nfunction Toolbar({ editor, groups, onImageRequest }: { editor: Editor; groups: ToolbarGroup[]; onImageRequest?: RichTextEditorProps[\"onImageRequest\"] }) {\n const [, forceUpdate] = useState(0);\n const isMobile = useBreakpoint(\"sm\");\n\n useEffect(() => {\n const handler = () => forceUpdate((n) => n + 1);\n editor.on(\"selectionUpdate\", handler);\n editor.on(\"transaction\", handler);\n return () => {\n editor.off(\"selectionUpdate\", handler);\n editor.off(\"transaction\", handler);\n };\n }, [editor]);\n\n const inTable = editor.isActive(\"table\");\n const has = (g: ToolbarGroup) => groups.includes(g);\n // Sprint 25.14 A22: on a phone the toolbars scroll sideways with no scrollbar, so their edges fade where more waits,\n // as the Tabs strip and the Table do\n const { ref: toolbarRef, measure: measureToolbar, fadeProps: toolbarFade } = useScrollEdges<HTMLDivElement>({ enabled: isMobile });\n const { ref: tableBarRef, measure: measureTableBar, fadeProps: tableBarFade } = useScrollEdges<HTMLDivElement>({ enabled: isMobile && inTable });\n\n const groupElements: React.ReactNode[] = [];\n\n if (has(\"blockType\")) groupElements.push(<BlockTypeSelect key=\"blockType\" editor={editor} />);\n if (has(\"fontFamily\")) groupElements.push(<FontFamilySelect key=\"fontFamily\" editor={editor} />);\n if (has(\"textSize\")) groupElements.push(<TextSizeControls key=\"textSize\" editor={editor} />);\n\n if (has(\"formatting\")) {\n groupElements.push(\n <ToolGroup key=\"formatting\">\n <ToolBtn active={editor.isActive(\"bold\")} onClick={() => editor.chain().focus().toggleBold().run()} title=\"Bold (Ctrl+B)\">\n <Icon name=\"bold\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"italic\")} onClick={() => editor.chain().focus().toggleItalic().run()} title=\"Italic (Ctrl+I)\">\n <Icon name=\"italic\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"underline\")} onClick={() => editor.chain().focus().toggleUnderline().run()} title=\"Underline (Ctrl+U)\">\n <Icon name=\"underline\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"strike\")} onClick={() => editor.chain().focus().toggleStrike().run()} title=\"Strikethrough\">\n <Icon name=\"strikethrough\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"colors\")) {\n groupElements.push(\n <ToolGroup key=\"colors\">\n <ColorPicker\n colors={TEXT_COLORS}\n activeColor={editor.getAttributes(\"textStyle\").color ?? \"\"}\n onSelect={(c) => c ? editor.chain().focus().setColor(c).run() : editor.chain().focus().unsetColor().run()}\n title=\"Text color\"\n icon={<Icon name=\"type\" size={16} />}\n />\n <ColorPicker\n colors={HIGHLIGHT_COLORS}\n activeColor={editor.getAttributes(\"highlight\").color ?? \"\"}\n onSelect={(c) => c ? editor.chain().focus().toggleHighlight({ color: c }).run() : editor.chain().focus().unsetHighlight().run()}\n title=\"Highlight\"\n icon={<Icon name=\"highlight\" size={16} />}\n />\n </ToolGroup>\n );\n }\n\n if (has(\"alignment\")) {\n groupElements.push(\n <ToolGroup key=\"alignment\">\n <ToolBtn active={editor.isActive({ textAlign: \"left\" })} onClick={() => editor.chain().focus().setTextAlign(\"left\").run()} title=\"Align left\">\n <Icon name=\"align-left\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive({ textAlign: \"center\" })} onClick={() => editor.chain().focus().setTextAlign(\"center\").run()} title=\"Align center\">\n <Icon name=\"align-center\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive({ textAlign: \"right\" })} onClick={() => editor.chain().focus().setTextAlign(\"right\").run()} title=\"Align right\">\n <Icon name=\"align-right\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"lists\")) {\n groupElements.push(\n <ToolGroup key=\"lists\">\n <ToolBtn active={editor.isActive(\"bulletList\")} onClick={() => editor.chain().focus().toggleBulletList().run()} title=\"Bullet list\">\n <Icon name=\"list\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"orderedList\")} onClick={() => editor.chain().focus().toggleOrderedList().run()} title=\"Ordered list\">\n <Icon name=\"list-ordered\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"taskList\")} onClick={() => editor.chain().focus().toggleTaskList().run()} title=\"Task list\">\n <Icon name=\"list-checks\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"blocks\")) {\n groupElements.push(\n <ToolGroup key=\"blocks\">\n <ToolBtn active={editor.isActive(\"blockquote\")} onClick={() => editor.chain().focus().toggleBlockquote().run()} title=\"Blockquote\">\n <Icon name=\"quote\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"codeBlock\")} onClick={() => editor.chain().focus().toggleCodeBlock().run()} title=\"Code block\">\n <Icon name=\"code\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"insert\")) {\n groupElements.push(\n <ToolGroup key=\"insert\">\n <LinkPopover editor={editor} />\n {onImageRequest ? (\n // the page's media library is the one way in; its choice goes in at the cursor\n <ToolBtn onClick={() => onImageRequest((image) => { editor.chain().focus().setImage({ src: image.src, alt: image.alt || undefined }).run(); })} title=\"Image\">\n <Icon name=\"image\" size={16} />\n </ToolBtn>\n ) : (\n <ImagePopover editor={editor} />\n )}\n <ToolBtn onClick={() => editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run()} disabled={inTable} title=\"Insert table\">\n <Icon name=\"table\" size={16} />\n </ToolBtn>\n <ToolBtn onClick={() => editor.chain().focus().setHorizontalRule().run()} title=\"Horizontal rule\">\n <Icon name=\"minus\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"extras\")) {\n groupElements.push(\n <ToolGroup key=\"extras\">\n <ToolBtn active={editor.isActive(\"code\")} onClick={() => editor.chain().focus().toggleCode().run()} title=\"Inline code\">\n <Icon name=\"code\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"superscript\")} onClick={() => editor.chain().focus().toggleSuperscript().run()} title=\"Superscript\">\n <Icon name=\"superscript\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"subscript\")} onClick={() => editor.chain().focus().toggleSubscript().run()} title=\"Subscript\">\n <Icon name=\"subscript\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"history\")) {\n groupElements.push(\n <ToolGroup key=\"history\">\n <ToolBtn onClick={() => editor.chain().focus().undo().run()} disabled={!editor.can().undo()} title=\"Undo (Ctrl+Z)\">\n <Icon name=\"undo\" size={16} />\n </ToolBtn>\n <ToolBtn onClick={() => editor.chain().focus().redo().run()} disabled={!editor.can().redo()} title=\"Redo (Ctrl+Shift+Z)\">\n <Icon name=\"redo\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n const withDividers = groupElements.reduce<React.ReactNode[]>((acc, el, i) => {\n if (i > 0) acc.push(<Divider key={`d-${i}`} />);\n acc.push(el);\n return acc;\n }, []);\n\n return (\n <div className=\"border-b-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)] bg-[var(--ds-bg-muted)]\">\n <div\n ref={toolbarRef}\n onScroll={measureToolbar}\n {...toolbarFade}\n className={cn(\n \"flex items-center gap-ds-0.5 px-ds-2 py-ds-1\",\n isMobile ? \"overflow-x-auto flex-nowrap gs-scrollbar-none\" : \"flex-wrap\",\n )}\n >\n {withDividers}\n </div>\n\n {inTable && (\n <div ref={tableBarRef} onScroll={measureTableBar} {...tableBarFade} className={cn(\n \"flex items-center gap-ds-0.5 px-ds-2 py-ds-1 border-t-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n isMobile && \"overflow-x-auto flex-nowrap gs-scrollbar-none\",\n )}>\n <span className=\"text-2xs text-[var(--ds-text-muted)] uppercase tracking-wider mr-ds-1 shrink-0\">Table</span>\n <TableOpBtn onClick={() => editor.chain().focus().addRowAfter().run()} label=\"+ Row\" />\n <TableOpBtn onClick={() => editor.chain().focus().addColumnAfter().run()} label=\"+ Col\" />\n <Divider />\n <TableOpBtn onClick={() => editor.chain().focus().deleteRow().run()} label=\"− Row\" />\n <TableOpBtn onClick={() => editor.chain().focus().deleteColumn().run()} label=\"− Col\" />\n <Divider />\n <TableOpBtn onClick={() => editor.chain().focus().mergeCells().run()} label=\"Merge\" />\n <TableOpBtn onClick={() => editor.chain().focus().splitCell().run()} label=\"Split\" />\n <Divider />\n <ToolBtn onClick={() => editor.chain().focus().deleteTable().run()} title=\"Delete table\"><Icon name=\"trash\" size={14} /></ToolBtn>\n </div>\n )}\n </div>\n );\n}\n\n/* ── Block type select (paragraph / headings) ─────────────────────── */\n\nfunction BlockTypeSelect({ editor }: { editor: Editor }) {\n const value = editor.isActive(\"heading\", { level: 1 }) ? \"h1\"\n : editor.isActive(\"heading\", { level: 2 }) ? \"h2\"\n : editor.isActive(\"heading\", { level: 3 }) ? \"h3\"\n : \"p\";\n\n return (\n <select\n value={value}\n onChange={(e) => {\n const v = e.target.value;\n if (v === \"p\") editor.chain().focus().setParagraph().run();\n else if (v === \"h1\") editor.chain().focus().toggleHeading({ level: 1 }).run();\n else if (v === \"h2\") editor.chain().focus().toggleHeading({ level: 2 }).run();\n else if (v === \"h3\") editor.chain().focus().toggleHeading({ level: 3 }).run();\n }}\n title=\"Block type\"\n aria-label=\"Block type\"\n className={cn(\n \"h-7 px-ds-1.5 text-xs rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-transparent text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)]\",\n \"border-none outline-none\",\n \"focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n <option value=\"p\">Paragraph</option>\n <option value=\"h1\">Heading 1</option>\n <option value=\"h2\">Heading 2</option>\n <option value=\"h3\">Heading 3</option>\n </select>\n );\n}\n\n/* ── Text size increase/decrease ──────────────────────────────────── */\n\nfunction TextSizeControls({ editor }: { editor: Editor }) {\n const current = editor.getAttributes(\"textStyle\").fontSize ?? \"\";\n const idx = TEXT_SIZES.findIndex((s) => s.value === current);\n const currentIdx = idx === -1 ? 1 : idx;\n\n const decrease = () => {\n const next = Math.max(0, currentIdx - 1);\n const v = TEXT_SIZES[next].value;\n if (v) editor.chain().focus().setFontSize(v).run();\n else editor.chain().focus().unsetFontSize().run();\n };\n\n const increase = () => {\n const next = Math.min(TEXT_SIZES.length - 1, currentIdx + 1);\n const v = TEXT_SIZES[next].value;\n if (v) editor.chain().focus().setFontSize(v).run();\n else editor.chain().focus().unsetFontSize().run();\n };\n\n return (\n <ToolGroup>\n <ToolBtn onClick={decrease} disabled={currentIdx <= 0} title={`Decrease text size (${TEXT_SIZES[Math.max(0, currentIdx - 1)]?.label})`}>\n <span className=\"text-2xs font-bold leading-none select-none\">A</span>\n </ToolBtn>\n <ToolBtn onClick={increase} disabled={currentIdx >= TEXT_SIZES.length - 1} title={`Increase text size (${TEXT_SIZES[Math.min(TEXT_SIZES.length - 1, currentIdx + 1)]?.label})`}>\n <span className=\"text-base font-bold leading-none select-none\">A</span>\n </ToolBtn>\n </ToolGroup>\n );\n}\n\n/* ── Color picker popover ─────────────────────────────────────────── */\n\nfunction ColorPicker({\n colors,\n activeColor,\n onSelect,\n title,\n icon,\n}: {\n colors: { label: string; value: string }[];\n activeColor: string;\n onSelect: (color: string) => void;\n title: string;\n icon: React.ReactNode;\n}) {\n const [open, setOpen] = useState(false);\n const isTopLayer = useOverlayLayer(open);\n const ref = useRef<HTMLDivElement>(null);\n\n const close = useCallback(() => setOpen(false), []);\n\n // Sprint 25.7: Escape puts focus back on the toolbar button (the popover renders in place, so Tab already moves\n // in page order); focus leaving the button and panel closes it.\n const closeToButton = useCallback(() => {\n const inside = !!ref.current?.contains(document.activeElement);\n close();\n if (inside) ref.current?.querySelector<HTMLElement>(\"button\")?.focus();\n }, [close]);\n useCloseOnFocusOut(open, ref, ref, close, isTopLayer);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => { if (!ref.current?.contains(e.target as Node)) close(); };\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented || !isTopLayer()) return;\n e.preventDefault();\n closeToButton();\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n return () => { document.removeEventListener(\"mousedown\", onClick); document.removeEventListener(\"keydown\", onKey); };\n }, [open, close, closeToButton, isTopLayer]);\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n title={title}\n className={cn(\n \"flex flex-col items-center justify-center w-7 h-7 rounded-[var(--ds-radius-sm)] transition-colors cursor-pointer\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n open\n ? \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\"\n : \"text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)] hover:text-[var(--ds-text-primary)]\",\n )}\n >\n {icon}\n {activeColor && (\n <span className=\"w-3.5 h-0.5 rounded-[var(--ds-radius-full)] -mt-ds-0.5\" style={{ backgroundColor: activeColor }} />\n )}\n </button>\n\n {open && (\n <div className=\"absolute top-full left-0 mt-ds-1 z-[var(--ds-z-popover)] p-ds-1.5 rounded-[var(--ds-radius-md)] border-[length:var(--ds-border-width)] border-[var(--ds-border-default)] bg-[var(--ds-bg-surface-elevated)] shadow-[var(--ds-shadow-dropdown)] flex gap-ds-1 flex-wrap w-[140px]\">\n {colors.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n title={c.label}\n onClick={() => { onSelect(c.value); close(); }}\n className={cn(\n \"w-6 h-6 rounded-[var(--ds-radius-sm)] border-[2px] transition-all cursor-pointer\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n activeColor === c.value ? `${ACTIVE_RING} scale-110` : \"border-transparent hover:scale-110\",\n )}\n style={{ backgroundColor: c.value || \"var(--ds-text-primary)\" }}\n >\n {!c.value && <span className=\"block w-full h-full rounded-[calc(var(--ds-radius-sm)-2px)] bg-[var(--ds-bg-surface)] relative after:absolute after:inset-0 after:rounded-[inherit] after:bg-gradient-to-br after:from-transparent after:to-[var(--ds-text-muted)] after:opacity-30\" />}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/* ── Link popover ─────────────────────────────────────────────────── */\n\nfunction LinkPopover({ editor }: { editor: Editor }) {\n const [open, setOpen] = useState(false);\n const isTopLayer = useOverlayLayer(open);\n const [url, setUrl] = useState(\"\");\n const ref = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const close = useCallback(() => { setOpen(false); setUrl(\"\"); }, []);\n\n // Sprint 25.7: Escape puts focus back on the toolbar button (the popover renders in place, so Tab already moves\n // in page order); focus leaving the button and panel closes it.\n const closeToButton = useCallback(() => {\n const inside = !!ref.current?.contains(document.activeElement);\n close();\n if (inside) ref.current?.querySelector<HTMLElement>(\"button\")?.focus();\n }, [close]);\n useCloseOnFocusOut(open, ref, ref, close, isTopLayer);\n\n const toggle = useCallback(() => {\n if (editor.isActive(\"link\")) {\n editor.chain().focus().unsetLink().run();\n return;\n }\n const existing = editor.getAttributes(\"link\").href ?? \"\";\n setUrl(existing);\n setOpen((o) => !o);\n }, [editor]);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => { if (!ref.current?.contains(e.target as Node)) close(); };\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented || !isTopLayer()) return;\n e.preventDefault();\n closeToButton();\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n requestAnimationFrame(() => inputRef.current?.focus());\n return () => { document.removeEventListener(\"mousedown\", onClick); document.removeEventListener(\"keydown\", onKey); };\n }, [open, close, closeToButton, isTopLayer]);\n\n const apply = () => {\n if (url) editor.chain().focus().setLink({ href: url }).run();\n close();\n };\n\n return (\n <div ref={ref} className=\"relative\">\n <ToolBtn active={editor.isActive(\"link\")} onClick={toggle} title=\"Link\">\n <Icon name=\"link\" size={16} />\n </ToolBtn>\n\n {open && (\n <div className=\"absolute top-full left-0 mt-ds-1 z-[var(--ds-z-popover)] p-ds-1.5 rounded-[var(--ds-radius-md)] border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)] bg-[var(--ds-bg-surface-elevated)] shadow-[var(--ds-shadow-dropdown)] flex items-center gap-ds-1 w-[240px]\">\n <input\n ref={inputRef}\n type=\"url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Enter\") apply(); }}\n placeholder=\"https://...\"\n className={cn(\n \"flex-1 h-6 px-ds-2 text-xs rounded-[var(--ds-radius-sm)]\",\n \"bg-transparent text-[var(--ds-text-primary)] placeholder:text-[var(--ds-text-muted)]\",\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n FOCUS_RING,\n )}\n />\n <button\n type=\"button\"\n onClick={apply}\n className={cn(\n \"shrink-0 h-6 px-ds-2 text-xs font-medium rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\",\n \"hover:opacity-90 transition-opacity\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n Apply\n </button>\n </div>\n )}\n </div>\n );\n}\n\n/* ── Image popover ────────────────────────────────────────────────── */\n\nfunction ImagePopover({ editor }: { editor: Editor }) {\n const [open, setOpen] = useState(false);\n const isTopLayer = useOverlayLayer(open);\n const [url, setUrl] = useState(\"\");\n const [alt, setAlt] = useState(\"\");\n const ref = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const close = useCallback(() => { setOpen(false); setUrl(\"\"); setAlt(\"\"); }, []);\n\n // Sprint 25.7: Escape puts focus back on the toolbar button (the popover renders in place, so Tab already moves\n // in page order); focus leaving the button and panel closes it.\n const closeToButton = useCallback(() => {\n const inside = !!ref.current?.contains(document.activeElement);\n close();\n if (inside) ref.current?.querySelector<HTMLElement>(\"button\")?.focus();\n }, [close]);\n useCloseOnFocusOut(open, ref, ref, close, isTopLayer);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => { if (!ref.current?.contains(e.target as Node)) close(); };\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented || !isTopLayer()) return;\n e.preventDefault();\n closeToButton();\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n requestAnimationFrame(() => inputRef.current?.focus());\n return () => { document.removeEventListener(\"mousedown\", onClick); document.removeEventListener(\"keydown\", onKey); };\n }, [open, close, closeToButton, isTopLayer]);\n\n const insert = () => {\n if (url) editor.chain().focus().setImage({ src: url, alt: alt || undefined }).run();\n close();\n };\n\n return (\n <div ref={ref} className=\"relative\">\n <ToolBtn onClick={() => setOpen((o) => !o)} title=\"Image\">\n <Icon name=\"image\" size={16} />\n </ToolBtn>\n\n {open && (\n <div className=\"absolute top-full left-0 mt-ds-1 z-[var(--ds-z-popover)] p-ds-1.5 rounded-[var(--ds-radius-md)] border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)] bg-[var(--ds-bg-surface-elevated)] shadow-[var(--ds-shadow-dropdown)] flex flex-col gap-ds-1 w-[240px]\">\n <input\n ref={inputRef}\n type=\"url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"Image URL\"\n className={cn(\n \"h-6 px-ds-2 text-xs rounded-[var(--ds-radius-sm)]\",\n \"bg-transparent text-[var(--ds-text-primary)] placeholder:text-[var(--ds-text-muted)]\",\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n FOCUS_RING,\n )}\n />\n <div className=\"flex items-center gap-ds-1\">\n <input\n type=\"text\"\n value={alt}\n onChange={(e) => setAlt(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Enter\") insert(); }}\n placeholder=\"Alt text (optional)\"\n className={cn(\n \"flex-1 h-6 px-ds-2 text-xs rounded-[var(--ds-radius-sm)]\",\n \"bg-transparent text-[var(--ds-text-primary)] placeholder:text-[var(--ds-text-muted)]\",\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n FOCUS_RING,\n )}\n />\n <button\n type=\"button\"\n onClick={insert}\n className={cn(\n \"shrink-0 h-6 px-ds-2 text-xs font-medium rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\",\n \"hover:opacity-90 transition-opacity\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n Insert\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/* ── Font family select ───────────────────────────────────────────── */\n\nfunction FontFamilySelect({ editor }: { editor: Editor }) {\n const current = editor.getAttributes(\"textStyle\").fontFamily ?? \"\";\n\n return (\n <select\n value={current}\n onChange={(e) => {\n const v = e.target.value;\n if (v) editor.chain().focus().setFontFamily(v).run();\n else editor.chain().focus().unsetFontFamily().run();\n }}\n title=\"Font family\"\n aria-label=\"Font family\"\n className={cn(\n \"h-7 px-ds-1.5 text-xs rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-transparent text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)]\",\n \"border-none outline-none\",\n \"focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n {FONT_FAMILIES.map((f) => (\n <option key={f.label} value={f.value}>{f.label}</option>\n ))}\n </select>\n );\n}\n\n/* ── Shared toolbar helpers ───────────────────────────────────────── */\n\nfunction ToolGroup({ children }: { children: React.ReactNode }) {\n return <div className=\"flex items-center gap-ds-0.5\">{children}</div>;\n}\n\nfunction Divider() {\n return <div className=\"w-px h-5 mx-ds-1 bg-[var(--ds-border-subtle)]\" />;\n}\n\nfunction TableOpBtn({ onClick, label }: { onClick: () => void; label: string }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={label}\n className={cn(\n \"h-6 px-ds-1.5 text-2xs font-medium rounded-[var(--ds-radius-sm)] transition-colors cursor-pointer whitespace-nowrap\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n \"text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)] hover:text-[var(--ds-text-primary)]\",\n )}\n >\n {label}\n </button>\n );\n}\n\nfunction ToolBtn({ active, disabled, onClick, title, children }: { active?: boolean; disabled?: boolean; onClick: () => void; title: string; children: React.ReactNode }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={cn(\n \"flex items-center justify-center w-7 h-7 rounded-[var(--ds-radius-sm)] transition-colors cursor-pointer\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n active\n ? \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\"\n : \"text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)] hover:text-[var(--ds-text-primary)]\",\n disabled && \"opacity-disabled pointer-events-none\",\n )}\n >\n {children}\n </button>\n );\n}\n\n"]}
@@ -57,7 +57,16 @@ var CURATED = {
57
57
  "bookmark": "FiBookmark",
58
58
  "download": "FiDownload",
59
59
  "upload": "FiUpload",
60
- "sparkles": "FiStar"
60
+ "sparkles": "FiStar",
61
+ "file": "FiFile",
62
+ "file-text": "FiFileText",
63
+ "eye": "FiEye",
64
+ "eye-off": "FiEyeOff",
65
+ "copy": "FiCopy",
66
+ "external-link": "FiExternalLink",
67
+ "filter": "FiFilter",
68
+ "lock": "FiLock",
69
+ "map-pin": "FiMapPin"
61
70
  };
62
71
  async function peer() {
63
72
  return await import('react-icons/fi');
@@ -73,5 +82,5 @@ async function loadExtended() {
73
82
  }
74
83
 
75
84
  export { loadCurated, loadExtended };
76
- //# sourceMappingURL=feather-2JFSFLXN.js.map
77
- //# sourceMappingURL=feather-2JFSFLXN.js.map
85
+ //# sourceMappingURL=feather-VFWLAILO.js.map
86
+ //# sourceMappingURL=feather-VFWLAILO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../showcase/src/lib/icon-packs/feather.ts"],"names":[],"mappings":"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","file":"feather-VFWLAILO.js","sourcesContent":["import type { IconMap } from './types'\nimport { buildExtendedMap, pickCurated } from './utils'\n\n/**\n * Feather (react-icons) icons.\n *\n * The pack is reached only through the dynamic import in peer() — never a\n * static named import. A static import of an optional peer makes a consumer's\n * production build fail on Vite 8 when the peer is not installed: Vite\n * substitutes an export-less stub and the bundler treats every missing name as\n * fatal (Sprint 22 bench finding 1, 13 Sep 2026; showcase/src/test/\n * vite8-optional-peers-build.test.ts guards it). The curated names are strings\n * for the same reason; icon-completeness.test.tsx proves every one resolves in\n * the installed pack. If the pack is missing, peer() rejects and loadPack in\n * icons.tsx reports which package to install.\n */\nconst CURATED: Record<string, string> = {\n \"home\": \"FiHome\",\n \"folder\": \"FiFolder\",\n \"chart\": \"FiBarChart2\",\n \"settings\": \"FiSettings\",\n \"chevron-right\": \"FiChevronRight\",\n \"close\": \"FiX\",\n \"plus\": \"FiPlus\",\n \"search\": \"FiSearch\",\n \"bell\": \"FiBell\",\n \"user\": \"FiUser\",\n \"check\": \"FiCheck\",\n \"warning\": \"FiAlertTriangle\",\n \"info\": \"FiInfo\",\n \"error\": \"FiAlertCircle\",\n \"clock\": \"FiClock\",\n \"calendar\": \"FiCalendar\",\n \"bold\": \"FiBold\",\n \"italic\": \"FiItalic\",\n \"underline\": \"FiUnderline\",\n \"strikethrough\": \"FiSlash\",\n \"align-left\": \"FiAlignLeft\",\n \"align-center\": \"FiAlignCenter\",\n \"align-right\": \"FiAlignRight\",\n \"list\": \"FiList\",\n \"list-ordered\": \"FiList\",\n \"list-checks\": \"FiCheckSquare\",\n \"link\": \"FiLink\",\n \"image\": \"FiImage\",\n \"table\": \"FiGrid\",\n \"code\": \"FiCode\",\n \"quote\": \"FiMessageSquare\",\n \"minus\": \"FiMinus\",\n \"superscript\": \"FiChevronUp\",\n \"subscript\": \"FiChevronDown\",\n \"highlight\": \"FiEdit2\",\n \"type\": \"FiType\",\n \"chevron-up\": \"FiChevronUp\",\n \"chevron-down\": \"FiChevronDown\",\n \"chevron-left\": \"FiChevronLeft\",\n \"trash\": \"FiTrash2\",\n \"undo\": \"FiRotateCcw\",\n \"redo\": \"FiRotateCw\",\n \"arrow-left\": \"FiArrowLeft\",\n \"grip-vertical\": \"FiMoreVertical\",\n \"mic\": \"FiMic\",\n \"paperclip\": \"FiPaperclip\",\n \"send\": \"FiSend\",\n \"log-out\": \"FiLogOut\",\n \"edit\": \"FiEdit2\",\n \"menu\": \"FiMenu\",\n \"more-horizontal\": \"FiMoreHorizontal\",\n \"star\": \"FiStar\",\n \"bookmark\": \"FiBookmark\",\n \"download\": \"FiDownload\",\n \"upload\": \"FiUpload\",\n \"sparkles\": \"FiStar\",\n \"file\": \"FiFile\",\n \"file-text\": \"FiFileText\",\n \"eye\": \"FiEye\",\n \"eye-off\": \"FiEyeOff\",\n \"copy\": \"FiCopy\",\n \"external-link\": \"FiExternalLink\",\n \"filter\": \"FiFilter\",\n \"lock\": \"FiLock\",\n \"map-pin\": \"FiMapPin\",\n}\n\nasync function peer(): Promise<Record<string, unknown>> {\n return (await import(\"react-icons/fi\")) as unknown as Record<string, unknown>\n}\n\nexport async function loadCurated(): Promise<IconMap> {\n return pickCurated(await peer(), CURATED)\n}\n\nexport async function loadExtended(): Promise<IconMap> {\n const mod = await peer()\n const extended = buildExtendedMap(mod, {}, { stripPrefix: \"Fi\" })\n Object.assign(extended, pickCurated(mod, CURATED))\n return extended\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { pickCurated, buildExtendedMap } from './chunk-NRHIYS5W.js';
2
+ import { forwardRef, createElement } from 'react';
2
3
 
3
- // ../../showcase/src/lib/icon-packs/heroicons.ts
4
4
  var CURATED = {
5
5
  "home": "HomeIcon",
6
6
  "folder": "FolderIcon",
@@ -37,7 +37,6 @@ var CURATED = {
37
37
  "superscript": "H1Icon",
38
38
  "subscript": "H2Icon",
39
39
  "highlight": "PaintBrushIcon",
40
- "type": "LanguageIcon",
41
40
  "chevron-up": "ChevronUpIcon",
42
41
  "chevron-down": "ChevronDownIcon",
43
42
  "chevron-left": "ChevronLeftIcon",
@@ -57,21 +56,37 @@ var CURATED = {
57
56
  "bookmark": "BookmarkIcon",
58
57
  "download": "ArrowDownTrayIcon",
59
58
  "upload": "ArrowUpTrayIcon",
60
- "sparkles": "SparklesIcon"
59
+ "sparkles": "SparklesIcon",
60
+ "file": "DocumentIcon",
61
+ "file-text": "DocumentTextIcon",
62
+ "eye": "EyeIcon",
63
+ "eye-off": "EyeSlashIcon",
64
+ "copy": "DocumentDuplicateIcon",
65
+ "external-link": "ArrowTopRightOnSquareIcon",
66
+ "filter": "FunnelIcon",
67
+ "lock": "LockClosedIcon",
68
+ "map-pin": "MapPinIcon"
61
69
  };
70
+ var TypeGlyph = forwardRef(function TypeGlyph2(props, ref) {
71
+ return createElement(
72
+ "svg",
73
+ { ref, xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, stroke: "currentColor", "aria-hidden": true, "data-slot": "icon", ...props },
74
+ createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.5 7.5v-3h15v3M12 4.5v15M9 19.5h6" })
75
+ );
76
+ });
62
77
  async function peer() {
63
78
  return await import('@heroicons/react/24/outline');
64
79
  }
65
80
  async function loadCurated() {
66
- return pickCurated(await peer(), CURATED);
81
+ return { ...pickCurated(await peer(), CURATED), type: TypeGlyph };
67
82
  }
68
83
  async function loadExtended() {
69
84
  const mod = await peer();
70
85
  const extended = buildExtendedMap(mod, {}, { stripSuffix: "Icon" });
71
- Object.assign(extended, pickCurated(mod, CURATED));
86
+ Object.assign(extended, pickCurated(mod, CURATED), { type: TypeGlyph });
72
87
  return extended;
73
88
  }
74
89
 
75
90
  export { loadCurated, loadExtended };
76
- //# sourceMappingURL=heroicons-4AQ4YBVG.js.map
77
- //# sourceMappingURL=heroicons-4AQ4YBVG.js.map
91
+ //# sourceMappingURL=heroicons-H3Z7DFCF.js.map
92
+ //# sourceMappingURL=heroicons-H3Z7DFCF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../showcase/src/lib/icon-packs/heroicons.ts"],"names":["TypeGlyph"],"mappings":";;;AAiBA,IAAM,OAAA,GAAkC;AAAA,EACtC,MAAA,EAAQ,UAAA;AAAA,EACR,QAAA,EAAU,YAAA;AAAA,EACV,OAAA,EAAS,cAAA;AAAA,EACT,UAAA,EAAY,eAAA;AAAA,EACZ,eAAA,EAAiB,kBAAA;AAAA,EACjB,OAAA,EAAS,WAAA;AAAA,EACT,MAAA,EAAQ,UAAA;AAAA,EACR,QAAA,EAAU,qBAAA;AAAA,EACV,MAAA,EAAQ,UAAA;AAAA,EACR,MAAA,EAAQ,UAAA;AAAA,EACR,OAAA,EAAS,WAAA;AAAA,EACT,SAAA,EAAW,yBAAA;AAAA,EACX,MAAA,EAAQ,uBAAA;AAAA,EACR,OAAA,EAAS,uBAAA;AAAA,EACT,OAAA,EAAS,WAAA;AAAA,EACT,UAAA,EAAY,kBAAA;AAAA,EACZ,MAAA,EAAQ,UAAA;AAAA,EACR,QAAA,EAAU,YAAA;AAAA,EACV,WAAA,EAAa,eAAA;AAAA,EACb,eAAA,EAAiB,mBAAA;AAAA,EACjB,YAAA,EAAc,qBAAA;AAAA,EACd,cAAA,EAAgB,WAAA;AAAA,EAChB,aAAA,EAAe,sBAAA;AAAA,EACf,MAAA,EAAQ,gBAAA;AAAA,EACR,cAAA,EAAgB,kBAAA;AAAA,EAChB,aAAA,EAAe,4BAAA;AAAA,EACf,MAAA,EAAQ,UAAA;AAAA,EACR,OAAA,EAAS,WAAA;AAAA,EACT,OAAA,EAAS,gBAAA;AAAA,EACT,MAAA,EAAQ,iBAAA;AAAA,EACR,OAAA,EAAS,gCAAA;AAAA,EACT,OAAA,EAAS,WAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,WAAA,EAAa,QAAA;AAAA,EACb,WAAA,EAAa,gBAAA;AAAA,EACb,YAAA,EAAc,eAAA;AAAA,EACd,cAAA,EAAgB,iBAAA;AAAA,EAChB,cAAA,EAAgB,iBAAA;AAAA,EAChB,OAAA,EAAS,WAAA;AAAA,EACT,MAAA,EAAQ,oBAAA;AAAA,EACR,MAAA,EAAQ,qBAAA;AAAA,EACR,YAAA,EAAc,eAAA;AAAA,EACd,eAAA,EAAiB,WAAA;AAAA,EACjB,KAAA,EAAO,gBAAA;AAAA,EACP,WAAA,EAAa,eAAA;AAAA,EACb,MAAA,EAAQ,mBAAA;AAAA,EACR,SAAA,EAAW,gCAAA;AAAA,EACX,MAAA,EAAQ,YAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,iBAAA,EAAmB,wBAAA;AAAA,EACnB,MAAA,EAAQ,UAAA;AAAA,EACR,UAAA,EAAY,cAAA;AAAA,EACZ,UAAA,EAAY,mBAAA;AAAA,EACZ,QAAA,EAAU,iBAAA;AAAA,EACV,UAAA,EAAY,cAAA;AAAA,EACZ,MAAA,EAAQ,cAAA;AAAA,EACR,WAAA,EAAa,kBAAA;AAAA,EACb,KAAA,EAAO,SAAA;AAAA,EACP,SAAA,EAAW,cAAA;AAAA,EACX,MAAA,EAAQ,uBAAA;AAAA,EACR,eAAA,EAAiB,2BAAA;AAAA,EACjB,QAAA,EAAU,YAAA;AAAA,EACV,MAAA,EAAQ,gBAAA;AAAA,EACR,SAAA,EAAW;AACb,CAAA;AAOA,IAAM,SAAA,GAAY,UAAA,CAAmD,SAASA,UAAAA,CAAU,OAAO,GAAA,EAAK;AAClG,EAAA,OAAO,aAAA;AAAA,IAAc,KAAA;AAAA,IAAO,EAAE,GAAA,EAAK,KAAA,EAAO,4BAAA,EAA8B,IAAA,EAAM,QAAQ,OAAA,EAAS,WAAA,EAAa,WAAA,EAAa,GAAA,EAAK,QAAQ,cAAA,EAAgB,aAAA,EAAe,MAAM,WAAA,EAAa,MAAA,EAAQ,GAAG,KAAA,EAAM;AAAA,IACvM,aAAA,CAAc,QAAQ,EAAE,aAAA,EAAe,SAAS,cAAA,EAAgB,OAAA,EAAS,CAAA,EAAG,qCAAA,EAAuC;AAAA,GAAC;AACxH,CAAC,CAAA;AAED,eAAe,IAAA,GAAyC;AACtD,EAAA,OAAQ,MAAM,OAAO,6BAA6B,CAAA;AACpD;AAEA,eAAsB,WAAA,GAAgC;AACpD,EAAA,OAAO,EAAE,GAAG,WAAA,CAAY,MAAM,MAAK,EAAG,OAAO,CAAA,EAAG,IAAA,EAAM,SAAA,EAAU;AAClE;AAEA,eAAsB,YAAA,GAAiC;AACrD,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,EAAK;AACvB,EAAA,MAAM,QAAA,GAAW,iBAAiB,GAAA,EAAK,IAAI,EAAE,WAAA,EAAa,QAAQ,CAAA;AAClE,EAAA,MAAA,CAAO,MAAA,CAAO,UAAU,WAAA,CAAY,GAAA,EAAK,OAAO,CAAA,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA;AACtE,EAAA,OAAO,QAAA;AACT","file":"heroicons-H3Z7DFCF.js","sourcesContent":["import { createElement, forwardRef } from 'react'\nimport type { IconMap } from './types'\nimport { buildExtendedMap, pickCurated } from './utils'\n\n/**\n * Heroicons icons.\n *\n * The pack is reached only through the dynamic import in peer() — never a\n * static named import. A static import of an optional peer makes a consumer's\n * production build fail on Vite 8 when the peer is not installed: Vite\n * substitutes an export-less stub and the bundler treats every missing name as\n * fatal (Sprint 22 bench finding 1, 13 Sep 2026; showcase/src/test/\n * vite8-optional-peers-build.test.ts guards it). The curated names are strings\n * for the same reason; icon-completeness.test.tsx proves every one resolves in\n * the installed pack. If the pack is missing, peer() rejects and loadPack in\n * icons.tsx reports which package to install.\n */\nconst CURATED: Record<string, string> = {\n \"home\": \"HomeIcon\",\n \"folder\": \"FolderIcon\",\n \"chart\": \"ChartBarIcon\",\n \"settings\": \"Cog6ToothIcon\",\n \"chevron-right\": \"ChevronRightIcon\",\n \"close\": \"XMarkIcon\",\n \"plus\": \"PlusIcon\",\n \"search\": \"MagnifyingGlassIcon\",\n \"bell\": \"BellIcon\",\n \"user\": \"UserIcon\",\n \"check\": \"CheckIcon\",\n \"warning\": \"ExclamationTriangleIcon\",\n \"info\": \"InformationCircleIcon\",\n \"error\": \"ExclamationCircleIcon\",\n \"clock\": \"ClockIcon\",\n \"calendar\": \"CalendarDaysIcon\",\n \"bold\": \"BoldIcon\",\n \"italic\": \"ItalicIcon\",\n \"underline\": \"UnderlineIcon\",\n \"strikethrough\": \"StrikethroughIcon\",\n \"align-left\": \"Bars3BottomLeftIcon\",\n \"align-center\": \"Bars3Icon\",\n \"align-right\": \"Bars3BottomRightIcon\",\n \"list\": \"ListBulletIcon\",\n \"list-ordered\": \"NumberedListIcon\",\n \"list-checks\": \"ClipboardDocumentCheckIcon\",\n \"link\": \"LinkIcon\",\n \"image\": \"PhotoIcon\",\n \"table\": \"TableCellsIcon\",\n \"code\": \"CodeBracketIcon\",\n \"quote\": \"ChatBubbleBottomCenterTextIcon\",\n \"minus\": \"MinusIcon\",\n \"superscript\": \"H1Icon\",\n \"subscript\": \"H2Icon\",\n \"highlight\": \"PaintBrushIcon\",\n \"chevron-up\": \"ChevronUpIcon\",\n \"chevron-down\": \"ChevronDownIcon\",\n \"chevron-left\": \"ChevronLeftIcon\",\n \"trash\": \"TrashIcon\",\n \"undo\": \"ArrowUturnLeftIcon\",\n \"redo\": \"ArrowUturnRightIcon\",\n \"arrow-left\": \"ArrowLeftIcon\",\n \"grip-vertical\": \"Bars2Icon\",\n \"mic\": \"MicrophoneIcon\",\n \"paperclip\": \"PaperClipIcon\",\n \"send\": \"PaperAirplaneIcon\",\n \"log-out\": \"ArrowRightStartOnRectangleIcon\",\n \"edit\": \"PencilIcon\",\n \"menu\": \"Bars3Icon\",\n \"more-horizontal\": \"EllipsisHorizontalIcon\",\n \"star\": \"StarIcon\",\n \"bookmark\": \"BookmarkIcon\",\n \"download\": \"ArrowDownTrayIcon\",\n \"upload\": \"ArrowUpTrayIcon\",\n \"sparkles\": \"SparklesIcon\",\n \"file\": \"DocumentIcon\",\n \"file-text\": \"DocumentTextIcon\",\n \"eye\": \"EyeIcon\",\n \"eye-off\": \"EyeSlashIcon\",\n \"copy\": \"DocumentDuplicateIcon\",\n \"external-link\": \"ArrowTopRightOnSquareIcon\",\n \"filter\": \"FunnelIcon\",\n \"lock\": \"LockClosedIcon\",\n \"map-pin\": \"MapPinIcon\",\n}\n\n/**\n * Heroicons draws no letter T, and its LanguageIcon (文A, translate) meant the wrong thing beside a document (round 28,\n * R28-35). So `type` is a T drawn in the pack's own outline style: a 24 px box, a 1.5 stroke that the theme's weight\n * overrides, round ends.\n */\nconst TypeGlyph = forwardRef<SVGSVGElement, Record<string, unknown>>(function TypeGlyph(props, ref) {\n return createElement('svg', { ref, xmlns: 'http://www.w3.org/2000/svg', fill: 'none', viewBox: '0 0 24 24', strokeWidth: 1.5, stroke: 'currentColor', 'aria-hidden': true, 'data-slot': 'icon', ...props },\n createElement('path', { strokeLinecap: 'round', strokeLinejoin: 'round', d: 'M4.5 7.5v-3h15v3M12 4.5v15M9 19.5h6' }))\n})\n\nasync function peer(): Promise<Record<string, unknown>> {\n return (await import(\"@heroicons/react/24/outline\")) as unknown as Record<string, unknown>\n}\n\nexport async function loadCurated(): Promise<IconMap> {\n return { ...pickCurated(await peer(), CURATED), type: TypeGlyph }\n}\n\nexport async function loadExtended(): Promise<IconMap> {\n const mod = await peer()\n const extended = buildExtendedMap(mod, {}, { stripSuffix: \"Icon\" })\n Object.assign(extended, pickCurated(mod, CURATED), { type: TypeGlyph })\n return extended\n}\n"]}
package/dist/icons.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ReactNode } from 'react';
2
+ import { ReactNode, ReactElement } from 'react';
3
3
 
4
4
  /**
5
5
  * Runtime list of curated icon names. The CuratedIconName type derives from
@@ -7,7 +7,7 @@ import { ReactNode } from 'react';
7
7
  * Every name must have an alias (or auto-kebab match) in ALL five packs —
8
8
  * icon-completeness.test.tsx enforces this.
9
9
  */
10
- declare const CURATED_ICON_NAMES: readonly ["home", "folder", "chart", "settings", "chevron-right", "close", "plus", "search", "bell", "user", "check", "warning", "info", "error", "clock", "calendar", "bold", "italic", "underline", "strikethrough", "align-left", "align-center", "align-right", "list", "list-ordered", "list-checks", "link", "image", "table", "code", "quote", "minus", "superscript", "subscript", "highlight", "type", "chevron-up", "chevron-down", "chevron-left", "trash", "undo", "redo", "arrow-left", "grip-vertical", "mic", "paperclip", "send", "log-out", "edit", "menu", "more-horizontal", "star", "bookmark", "download", "upload", "sparkles"];
10
+ declare const CURATED_ICON_NAMES: readonly ["home", "folder", "chart", "settings", "chevron-right", "close", "plus", "search", "bell", "user", "check", "warning", "info", "error", "clock", "calendar", "bold", "italic", "underline", "strikethrough", "align-left", "align-center", "align-right", "list", "list-ordered", "list-checks", "link", "image", "table", "code", "quote", "minus", "superscript", "subscript", "highlight", "type", "chevron-up", "chevron-down", "chevron-left", "trash", "undo", "redo", "arrow-left", "grip-vertical", "mic", "paperclip", "send", "log-out", "edit", "menu", "more-horizontal", "star", "bookmark", "download", "upload", "sparkles", "file", "file-text", "eye", "eye-off", "copy", "external-link", "filter", "lock", "map-pin"];
11
11
  type CuratedIconName = (typeof CURATED_ICON_NAMES)[number];
12
12
  /**
13
13
  * Curated names provide autocomplete and work identically across all 5 packs.
@@ -29,10 +29,17 @@ declare function IconProvider({ pack, weight, children }: {
29
29
  * preloadPack('lucide')
30
30
  */
31
31
  declare function preloadPack(pack: IconPack): void;
32
- declare function Icon({ name, size, className }: {
32
+ declare function Icon({ name, size, className, from }: {
33
33
  name: IconName;
34
34
  size?: number;
35
35
  className?: string;
36
+ from?: string;
36
37
  }): react_jsx_runtime.JSX.Element | null;
38
+ /**
39
+ * What an icon slot takes (Sprint 25.17 A26): an icon name, drawn as the theme's icon at the slot's size, or an element,
40
+ * drawn as given. `IconName` accepts any string, so text type-checks: in development a name the theme's pack lacks warns,
41
+ * naming the slot, and draws nothing; the engine flags a literal that is no icon name (gs:icon-slot-not-an-icon).
42
+ */
43
+ type IconSlot = IconName | ReactElement | false | null | undefined;
37
44
 
38
- export { Icon, type IconName, type IconPack, IconProvider, preloadPack };
45
+ export { Icon, type IconName, type IconPack, IconProvider, type IconSlot, preloadPack };
package/dist/icons.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Icon, IconProvider, preloadPack } from './chunk-4LDYR7QP.js';
1
+ export { Icon, IconProvider, preloadPack } from './chunk-HXVXJUGV.js';
2
2
  //# sourceMappingURL=icons.js.map
3
3
  //# sourceMappingURL=icons.js.map