@mieweb/ui 0.11.0-dev.32 → 0.11.0-dev.34

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 (108) hide show
  1. package/dist/{chunk-PJN4HM2X.cjs → chunk-3O3Q3DX7.cjs} +21 -21
  2. package/dist/{chunk-PJN4HM2X.cjs.map → chunk-3O3Q3DX7.cjs.map} +1 -1
  3. package/dist/{chunk-M42FTWY2.cjs → chunk-46RYJYN2.cjs} +6 -6
  4. package/dist/{chunk-M42FTWY2.cjs.map → chunk-46RYJYN2.cjs.map} +1 -1
  5. package/dist/{chunk-JMAZ2GKT.js → chunk-4GSFVD5V.js} +3 -3
  6. package/dist/{chunk-JMAZ2GKT.js.map → chunk-4GSFVD5V.js.map} +1 -1
  7. package/dist/{chunk-2R3ILG4Y.cjs → chunk-4M2KE4O5.cjs} +7 -7
  8. package/dist/{chunk-2R3ILG4Y.cjs.map → chunk-4M2KE4O5.cjs.map} +1 -1
  9. package/dist/{chunk-L52HKEUD.js → chunk-4SUEBKTY.js} +3 -3
  10. package/dist/{chunk-L52HKEUD.js.map → chunk-4SUEBKTY.js.map} +1 -1
  11. package/dist/{chunk-SCYLVQWA.cjs → chunk-6O6EYKOG.cjs} +130 -874
  12. package/dist/chunk-6O6EYKOG.cjs.map +1 -0
  13. package/dist/{chunk-INMDLVUB.cjs → chunk-6UYMO3PF.cjs} +7 -2
  14. package/dist/chunk-6UYMO3PF.cjs.map +1 -0
  15. package/dist/{chunk-2Z2GFDRS.cjs → chunk-DXNVQQYN.cjs} +4 -4
  16. package/dist/{chunk-2Z2GFDRS.cjs.map → chunk-DXNVQQYN.cjs.map} +1 -1
  17. package/dist/{chunk-JN2CL7MK.js → chunk-EWPNM6OO.js} +25 -5
  18. package/dist/chunk-EWPNM6OO.js.map +1 -0
  19. package/dist/{chunk-JQAGNAY2.js → chunk-EX7Q5545.js} +4 -4
  20. package/dist/{chunk-JQAGNAY2.js.map → chunk-EX7Q5545.js.map} +1 -1
  21. package/dist/{chunk-YG7BR76Y.js → chunk-GMNF4E7B.js} +3 -42
  22. package/dist/chunk-GMNF4E7B.js.map +1 -0
  23. package/dist/chunk-HTZ27DGZ.js +46 -0
  24. package/dist/chunk-HTZ27DGZ.js.map +1 -0
  25. package/dist/{chunk-SNAMNKFH.js → chunk-JEXEFWEM.js} +7 -2
  26. package/dist/chunk-JEXEFWEM.js.map +1 -0
  27. package/dist/{chunk-KIVEYQGA.cjs → chunk-MSX2P5JE.cjs} +2 -48
  28. package/dist/chunk-MSX2P5JE.cjs.map +1 -0
  29. package/dist/{chunk-VV2U36T6.cjs → chunk-MZR634HI.cjs} +9 -9
  30. package/dist/{chunk-VV2U36T6.cjs.map → chunk-MZR634HI.cjs.map} +1 -1
  31. package/dist/{chunk-JCO62XMU.cjs → chunk-NCPDUJKJ.cjs} +43 -26
  32. package/dist/chunk-NCPDUJKJ.cjs.map +1 -0
  33. package/dist/{chunk-DG3CXR24.js → chunk-NW6D6AFL.js} +80 -819
  34. package/dist/chunk-NW6D6AFL.js.map +1 -0
  35. package/dist/{chunk-BP4LXRC6.cjs → chunk-PGJLW2NO.cjs} +7 -7
  36. package/dist/{chunk-BP4LXRC6.cjs.map → chunk-PGJLW2NO.cjs.map} +1 -1
  37. package/dist/chunk-PHYQSCP6.cjs +54 -0
  38. package/dist/chunk-PHYQSCP6.cjs.map +1 -0
  39. package/dist/{chunk-ZFJJMDV3.js → chunk-RTADGBBN.js} +3 -3
  40. package/dist/{chunk-ZFJJMDV3.js.map → chunk-RTADGBBN.js.map} +1 -1
  41. package/dist/{chunk-FQUSSPXX.cjs → chunk-S2CJ57BX.cjs} +25 -5
  42. package/dist/chunk-S2CJ57BX.cjs.map +1 -0
  43. package/dist/{chunk-KSQQBFDQ.js → chunk-SPGP252Q.js} +43 -26
  44. package/dist/chunk-SPGP252Q.js.map +1 -0
  45. package/dist/{chunk-67SD6VPF.cjs → chunk-SVC7NPQ6.cjs} +6 -6
  46. package/dist/{chunk-67SD6VPF.cjs.map → chunk-SVC7NPQ6.cjs.map} +1 -1
  47. package/dist/{chunk-TWQSMUE6.js → chunk-VMEVLBI3.js} +46 -38
  48. package/dist/chunk-VMEVLBI3.js.map +1 -0
  49. package/dist/{chunk-QNJEDBIN.js → chunk-X5HLVACK.js} +4 -4
  50. package/dist/{chunk-QNJEDBIN.js.map → chunk-X5HLVACK.js.map} +1 -1
  51. package/dist/{chunk-LC3JL2HB.cjs → chunk-XEHD2HA5.cjs} +46 -38
  52. package/dist/chunk-XEHD2HA5.cjs.map +1 -0
  53. package/dist/{chunk-R3MJKY63.js → chunk-YGSPIDE4.js} +3 -3
  54. package/dist/{chunk-R3MJKY63.js.map → chunk-YGSPIDE4.js.map} +1 -1
  55. package/dist/{chunk-7LKTIZLR.js → chunk-YR45POH2.js} +3 -3
  56. package/dist/{chunk-7LKTIZLR.js.map → chunk-YR45POH2.js.map} +1 -1
  57. package/dist/components/AlertDialog/index.cjs +6 -6
  58. package/dist/components/AlertDialog/index.js +2 -2
  59. package/dist/components/EmailEditor/index.cjs +14 -12
  60. package/dist/components/EmailEditor/index.js +5 -3
  61. package/dist/components/KeyboardShortcutsOverlay/index.cjs +4 -4
  62. package/dist/components/KeyboardShortcutsOverlay/index.js +2 -2
  63. package/dist/components/MediaEditor/index.cjs +7 -7
  64. package/dist/components/MediaEditor/index.js +2 -2
  65. package/dist/components/MediaFeed/index.cjs +3 -3
  66. package/dist/components/MediaFeed/index.js +2 -2
  67. package/dist/components/Modal/index.cjs +9 -9
  68. package/dist/components/Modal/index.js +1 -1
  69. package/dist/components/RichTextEditor/index.cjs +6 -4
  70. package/dist/components/RichTextEditor/index.js +3 -1
  71. package/dist/components/SuperChat/index.cjs +3 -3
  72. package/dist/components/SuperChat/index.js +2 -2
  73. package/dist/components/Textarea/index.cjs +7 -5
  74. package/dist/components/Textarea/index.js +4 -2
  75. package/dist/esheet.cjs +1119 -1393
  76. package/dist/esheet.cjs.map +1 -1
  77. package/dist/esheet.d.cts +211 -4
  78. package/dist/esheet.d.ts +211 -4
  79. package/dist/esheet.js +946 -1239
  80. package/dist/esheet.js.map +1 -1
  81. package/dist/hooks/index.cjs +41 -40
  82. package/dist/hooks/index.js +2 -1
  83. package/dist/index.cjs +1058 -285
  84. package/dist/index.cjs.map +1 -1
  85. package/dist/index.d.cts +6 -2
  86. package/dist/index.d.ts +6 -2
  87. package/dist/index.js +809 -20
  88. package/dist/index.js.map +1 -1
  89. package/dist/{model-NPW2JMHZ.cjs → model-EFXX5JZN.cjs} +18 -18
  90. package/dist/{model-NPW2JMHZ.cjs.map → model-EFXX5JZN.cjs.map} +1 -1
  91. package/dist/{model-SG5H3TCJ.js → model-TAARSYDY.js} +4 -4
  92. package/dist/{model-SG5H3TCJ.js.map → model-TAARSYDY.js.map} +1 -1
  93. package/dist/styles.css +1 -1
  94. package/dist/tailwind-preset.cjs +4 -4
  95. package/dist/tailwind-preset.js +1 -1
  96. package/package.json +1 -1
  97. package/dist/chunk-DG3CXR24.js.map +0 -1
  98. package/dist/chunk-FQUSSPXX.cjs.map +0 -1
  99. package/dist/chunk-INMDLVUB.cjs.map +0 -1
  100. package/dist/chunk-JCO62XMU.cjs.map +0 -1
  101. package/dist/chunk-JN2CL7MK.js.map +0 -1
  102. package/dist/chunk-KIVEYQGA.cjs.map +0 -1
  103. package/dist/chunk-KSQQBFDQ.js.map +0 -1
  104. package/dist/chunk-LC3JL2HB.cjs.map +0 -1
  105. package/dist/chunk-SCYLVQWA.cjs.map +0 -1
  106. package/dist/chunk-SNAMNKFH.js.map +0 -1
  107. package/dist/chunk-TWQSMUE6.js.map +0 -1
  108. package/dist/chunk-YG7BR76Y.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/MacroLibrary/MacroLibrary.tsx","../src/components/RichTextEditor/processDictation.ts","../src/components/RichTextEditor/RichTextEditor.tsx"],"names":["React","MacroLibrary","value","jsxs","jsx","Fragment","BookOpen","Plus"],"mappings":"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","file":"chunk-EWPNM6OO.js","sourcesContent":["import * as React from 'react';\nimport {\n SearchIcon,\n HistoryIcon,\n BookOpenIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n CloseIcon,\n PlusIcon,\n} from '../Icons';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { Input } from '../Input';\n\nexport interface Macro {\n /** Stable identifier. */\n id: string;\n /** Human-readable name shown in the list. */\n label: string;\n /** Plain text inserted into the editor. `\\n` is preserved. */\n content: string;\n /** Optional shortcut identifier shown as a badge (e.g. `.b`). */\n shortcut?: string;\n /** Extra search terms that are not displayed. */\n keywords?: string[];\n}\n\nexport interface MacroGroup {\n /** Stable identifier. */\n id: string;\n /** Group heading (e.g. \"Default library\"). */\n label: string;\n /**\n * `previous` renders the group visually distinct from library macros\n * (history icon, muted header) so prior values are never mistaken for\n * predefined content. Defaults to `library`.\n */\n kind?: 'library' | 'previous';\n /** Macros belonging to the group. */\n macros: Macro[];\n}\n\nexport interface MacroLibraryProps {\n /** Grouped macros supplied by the application. */\n groups: MacroGroup[];\n /** Called with the chosen macro. The caller performs the insertion. */\n onSelect: (macro: Macro) => void;\n /** Id for the panel root (e.g. the target of a toggle's aria-controls). */\n id?: string;\n /**\n * Name of the insertion target shown in the header (e.g. the editor's\n * label), rendered as \"Insert into <target>\".\n */\n targetLabel?: string;\n /** When provided, renders a close button and enables Escape-to-close. */\n onClose?: () => void;\n /** When provided, renders a \"Save as macro\" action in the footer. */\n onCreateMacro?: () => void;\n /** Autofocus the search input on mount. Defaults to false. */\n autoFocusSearch?: boolean;\n /**\n * Minimal chrome for short, space-constrained lists: hides the header,\n * the search input, and library group headings so the panel is just the\n * macro rows. Previous-value groups keep their heading so prior answers\n * stay visually distinct. Escape-to-close still works when `onClose` is\n * provided. Defaults to false.\n */\n compact?: boolean;\n /** Additional class for the panel root. */\n className?: string;\n /** Overridable labels for i18n. */\n labels?: Partial<typeof DEFAULT_LABELS>;\n}\n\nconst DEFAULT_LABELS = {\n insertInto: 'Insert into',\n macros: 'Macros',\n searchPlaceholder: 'Search macros…',\n searchLabel: 'Search macros',\n close: 'Close macros',\n createMacro: 'Save as macro',\n empty: 'No macros available',\n emptyHint: 'The application has not provided a macro list.',\n noResults: 'No macros match',\n clearSearch: 'Clear search',\n showMore: 'Show {count} more',\n};\n\n/** Rows shown per group before the \"show more\" expander. */\nconst PREVIEW_COUNT = 4;\n\n/** Case-insensitive match across label, shortcut, keywords and content. */\nfunction matchesQuery(macro: Macro, query: string): boolean {\n const q = query.toLowerCase();\n return (\n macro.label.toLowerCase().includes(q) ||\n (macro.shortcut ?? '').toLowerCase().includes(q) ||\n (macro.keywords ?? []).some((k) => k.toLowerCase().includes(q)) ||\n macro.content.toLowerCase().includes(q)\n );\n}\n\n/** Query is a prefix of the macro's shortcut identifier. */\nfunction isShortcutHit(macro: Macro, query: string): boolean {\n return (\n query.length > 0 &&\n (macro.shortcut ?? '').toLowerCase().startsWith(query.toLowerCase())\n );\n}\n\n/** Shortcut-prefix matches rank before everything else. */\nfunction rankMacros(macros: Macro[], query: string): Macro[] {\n return [...macros].sort(\n (a, b) => Number(isShortcutHit(b, query)) - Number(isShortcutHit(a, query))\n );\n}\n\n/**\n * Keep the editor focused while picking with a pointer: cancelling mousedown's\n * default stops the button from stealing focus (on touch the compatibility\n * mousedown would otherwise blur the editor and dismiss the keyboard), so a\n * focus-docked panel stays open across multiple picks. Keyboard roving focus\n * is unaffected.\n */\nfunction preservePointerFocus(event: React.MouseEvent) {\n event.preventDefault();\n}\n\n/**\n * Group headings preserve editor focus like macro rows, with one exception:\n * when roving focus is already on a row inside the group, collapsing would\n * unmount that row and strand focus on the body. Letting the heading take\n * pointer focus in that case keeps keyboard navigation anchored in the panel.\n */\nfunction preserveGroupTogglePointerFocus(\n event: React.MouseEvent<HTMLButtonElement>\n) {\n const group = event.currentTarget.closest(\n '[data-slot=\"macro-library-group\"]'\n );\n if (group?.contains(document.activeElement)) return;\n event.preventDefault();\n}\n\n/**\n * A searchable, grouped macro browser designed to dock inside an editor's\n * chrome. Editor-agnostic: selecting a macro calls `onSelect` and the host\n * performs the insertion. Previous-value groups (`kind: 'previous'`) are\n * rendered distinctly from library macros. All rows and controls are real\n * buttons with roving arrow-key focus from the search input.\n */\nexport const MacroLibrary = React.forwardRef<HTMLDivElement, MacroLibraryProps>(\n function MacroLibrary(\n {\n groups,\n onSelect,\n id,\n targetLabel,\n onClose,\n onCreateMacro,\n autoFocusSearch = false,\n compact = false,\n className,\n labels: labelOverrides,\n },\n ref\n ) {\n const labels = { ...DEFAULT_LABELS, ...labelOverrides };\n const [query, setQuery] = React.useState('');\n const [collapsed, setCollapsed] = React.useState<Record<string, boolean>>(\n {}\n );\n const [expanded, setExpanded] = React.useState<Record<string, boolean>>({});\n const listRef = React.useRef<HTMLDivElement>(null);\n const searchRef = React.useRef<HTMLInputElement>(null);\n const panelId = React.useId();\n\n React.useEffect(() => {\n if (autoFocusSearch) searchRef.current?.focus();\n }, [autoFocusSearch]);\n\n const trimmed = query.trim();\n const searching = trimmed.length > 0;\n\n const visibleGroups = groups\n .map((group) => ({\n ...group,\n macros: searching\n ? rankMacros(\n group.macros.filter((m) => matchesQuery(m, trimmed)),\n trimmed\n )\n : group.macros,\n }))\n .filter((group) => group.macros.length > 0)\n // Groups containing shortcut-prefix hits rank first so \".c\" reaches\n // the macro with that shortcut before incidental content matches in\n // earlier groups; the stable sort keeps group context otherwise.\n .sort(\n (a, b) =>\n Number(b.macros.some((m) => isShortcutHit(m, trimmed))) -\n Number(a.macros.some((m) => isShortcutHit(m, trimmed)))\n );\n\n const hasMacros = groups.some((g) => g.macros.length > 0);\n const noResults = hasMacros && searching && visibleGroups.length === 0;\n\n /** Roving focus across visible macro-row buttons. */\n const moveFocus = (delta: 1 | -1) => {\n const rows = Array.from(\n listRef.current?.querySelectorAll<HTMLButtonElement>(\n '[data-macro-row]'\n ) ?? []\n );\n if (rows.length === 0) return;\n const index = rows.findIndex((row) => row === document.activeElement);\n if (index === -1) {\n rows[delta === 1 ? 0 : rows.length - 1].focus();\n return;\n }\n const next = index + delta;\n if (next < 0) {\n searchRef.current?.focus();\n return;\n }\n rows[Math.min(next, rows.length - 1)].focus();\n };\n\n const handlePanelKeyDown = (event: React.KeyboardEvent) => {\n // Escape during IME composition cancels the composition; never close.\n if (event.nativeEvent.isComposing) return;\n if (event.key === 'Escape' && onClose) {\n event.stopPropagation();\n onClose();\n }\n };\n\n const handleSearchKeyDown = (event: React.KeyboardEvent) => {\n // ArrowDown during IME composition navigates conversion candidates.\n if (event.nativeEvent.isComposing) return;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n moveFocus(1);\n }\n };\n\n const handleRowKeyDown = (event: React.KeyboardEvent) => {\n if (event.nativeEvent.isComposing) return;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n moveFocus(1);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n moveFocus(-1);\n }\n };\n\n /** Reveal a group's remaining macros, moving focus to the first one. */\n const expandGroup = (groupId: string) => {\n setExpanded((prev) => ({ ...prev, [groupId]: true }));\n requestAnimationFrame(() => {\n const groupEl = Array.from(\n listRef.current?.querySelectorAll<HTMLElement>(\n '[data-slot=\"macro-library-group\"]'\n ) ?? []\n ).find((el) => el.dataset.groupId === groupId);\n const rows =\n groupEl?.querySelectorAll<HTMLButtonElement>('[data-macro-row]');\n rows?.[PREVIEW_COUNT]?.focus();\n });\n };\n\n return (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- keydown only delegates Escape-to-close from focusable children\n <div\n ref={ref}\n id={id}\n role=\"group\"\n aria-label={\n targetLabel ? `${labels.insertInto} ${targetLabel}` : labels.macros\n }\n data-slot=\"macro-library\"\n className={cn('bg-muted/20 flex min-h-0 flex-col', className)}\n onKeyDown={handlePanelKeyDown}\n >\n {!compact && (\n <div\n data-slot=\"macro-library-header\"\n className=\"border-border flex items-center justify-between gap-2 border-b px-3 py-2\"\n >\n <span className=\"text-muted-foreground min-w-0 truncate text-xs\">\n {targetLabel ? (\n <>\n {labels.insertInto}{' '}\n <span className=\"text-foreground font-semibold\">\n {targetLabel}\n </span>\n </>\n ) : (\n labels.macros\n )}\n </span>\n {onClose && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 shrink-0 p-0\"\n onClick={onClose}\n aria-label={labels.close}\n >\n <CloseIcon className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n </div>\n )}\n\n {hasMacros ? (\n <>\n {!compact && (\n <div className=\"px-3 pt-2\">\n <div className=\"relative\">\n <SearchIcon\n aria-hidden=\"true\"\n className=\"text-muted-foreground pointer-events-none absolute start-2.5 top-1/2 z-10 h-3.5 w-3.5 -translate-y-1/2\"\n />\n <Input\n ref={searchRef}\n label={labels.searchLabel}\n hideLabel\n size=\"sm\"\n type=\"search\"\n placeholder={labels.searchPlaceholder}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={handleSearchKeyDown}\n className=\"ps-8\"\n aria-controls={`${panelId}-list`}\n />\n </div>\n </div>\n )}\n\n {/* Persistent polite region so a failed search is announced. */}\n <div role=\"status\" className=\"sr-only\">\n {noResults ? `${labels.noResults} “${trimmed}”` : ''}\n </div>\n\n <div\n ref={listRef}\n id={`${panelId}-list`}\n data-slot=\"macro-library-list\"\n className=\"min-h-0 flex-1 overflow-y-auto p-1.5\"\n >\n {noResults && (\n <div className=\"text-muted-foreground px-2 py-8 text-center text-sm\">\n <p>\n {labels.noResults} “{trimmed}”\n </p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"mt-2\"\n onClick={() => {\n setQuery('');\n searchRef.current?.focus();\n }}\n >\n {labels.clearSearch}\n </Button>\n </div>\n )}\n\n {visibleGroups.map((group) => {\n const isPrevious = group.kind === 'previous';\n // Strict check: ids like \"constructor\" must not read\n // inherited Object.prototype members as collapsed state.\n const isCollapsed = !searching && collapsed[group.id] === true;\n // Long groups start as a short preview; searching always\n // shows every match.\n const isPreview =\n !searching &&\n expanded[group.id] !== true &&\n group.macros.length > PREVIEW_COUNT;\n const visibleMacros = isPreview\n ? group.macros.slice(0, PREVIEW_COUNT)\n : group.macros;\n const GroupIcon = isPrevious ? HistoryIcon : BookOpenIcon;\n return (\n <div\n key={group.id}\n data-slot=\"macro-library-group\"\n data-group-id={group.id}\n data-kind={group.kind ?? 'library'}\n >\n {/* Compact keeps only previous-value headings: prior\n answers must stay distinct from library content. */}\n {(!compact || isPrevious) && (\n <button\n type=\"button\"\n className={cn(\n 'text-muted-foreground hover:text-foreground flex w-full items-center gap-1.5 rounded px-2 pt-2.5 pb-1 text-start text-[11px] font-semibold tracking-wide uppercase',\n isPrevious && 'text-warning-700 dark:text-warning-400'\n )}\n aria-expanded={!isCollapsed}\n disabled={searching}\n onMouseDown={preserveGroupTogglePointerFocus}\n onClick={() =>\n setCollapsed((prev) => ({\n ...prev,\n [group.id]: prev[group.id] !== true,\n }))\n }\n >\n <GroupIcon aria-hidden=\"true\" className=\"h-3 w-3\" />\n <span className=\"min-w-0 flex-1 truncate\">\n {group.label}\n </span>\n {!searching &&\n (isCollapsed ? (\n <ChevronRightIcon\n aria-hidden=\"true\"\n className=\"h-3 w-3\"\n />\n ) : (\n <ChevronDownIcon\n aria-hidden=\"true\"\n className=\"h-3 w-3\"\n />\n ))}\n </button>\n )}\n\n {!isCollapsed &&\n visibleMacros.map((macro) => (\n <button\n key={macro.id}\n type=\"button\"\n data-macro-row\n data-slot=\"macro-library-item\"\n className=\"focus-visible:ring-ring text-foreground hover:bg-muted/60 hover:text-primary flex w-full cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-start focus-visible:ring-2 focus-visible:outline-none\"\n onMouseDown={preservePointerFocus}\n onClick={() => onSelect(macro)}\n onKeyDown={handleRowKeyDown}\n >\n {macro.shortcut && (\n <span\n // Shortcuts are typed sequences; keep them LTR\n // in RTL locales.\n dir=\"ltr\"\n className={cn(\n 'border-border bg-background text-muted-foreground rounded border px-1 font-mono text-[11px]',\n isPrevious &&\n 'border-warning-300 bg-warning-50 text-warning-800 dark:border-warning-700 dark:bg-warning-950 dark:text-warning-300'\n )}\n >\n {macro.shortcut}\n </span>\n )}\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\">\n {macro.label}\n </span>\n </button>\n ))}\n {!isCollapsed && isPreview && (\n <button\n type=\"button\"\n data-macro-row\n data-slot=\"macro-library-show-more\"\n className=\"focus-visible:ring-ring text-muted-foreground hover:bg-muted/60 hover:text-primary flex w-full cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-start text-xs font-medium focus-visible:ring-2 focus-visible:outline-none\"\n onMouseDown={preservePointerFocus}\n onClick={() => expandGroup(group.id)}\n onKeyDown={handleRowKeyDown}\n >\n <ChevronDownIcon\n aria-hidden=\"true\"\n className=\"h-3 w-3\"\n />\n {labels.showMore.replace(\n '{count}',\n String(group.macros.length - PREVIEW_COUNT)\n )}\n </button>\n )}\n </div>\n );\n })}\n </div>\n </>\n ) : (\n <div className=\"text-muted-foreground flex flex-1 flex-col items-center justify-center gap-1 px-4 py-10 text-center text-sm\">\n <BookOpenIcon aria-hidden=\"true\" className=\"mb-1 h-5 w-5\" />\n <p className=\"text-foreground font-medium\">{labels.empty}</p>\n <p className=\"text-xs\">{labels.emptyHint}</p>\n </div>\n )}\n\n {onCreateMacro && (\n <div\n data-slot=\"macro-library-footer\"\n className=\"border-border border-t px-2 py-1.5\"\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"w-full justify-start gap-1.5\"\n onClick={onCreateMacro}\n >\n <PlusIcon aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n {labels.createMacro}\n </Button>\n </div>\n )}\n </div>\n );\n }\n);\n","/**\n * Converts spoken punctuation words (e.g. \"period\", \"comma\") into the\n * corresponding characters, using lightweight context heuristics so that words\n * like \"time period\" or \"the colon\" are left intact. Pure and side-effect free\n * so it can be unit tested independently of the editor.\n */\nexport function processDictation(text: string): string {\n let result = text;\n\n // \"period\" as a word vs. as punctuation.\n result = result.replace(\n /\\b(the|a|this|that|each|every|same|time|grace|trial|waiting|probationary|pay|billing|accounting)\\s+period\\b/gi,\n '$1 period'\n );\n result = result.replace(\n /\\bperiod\\s+(of|in|for|from|to|during|between|after|before|when|where|is|was|will|has|had)\\b/gi,\n 'period $1'\n );\n result = result.replace(/\\s+period(\\s*$)/gi, '.$1');\n result = result.replace(/\\s+period\\s+(?=[A-Z])/g, '. ');\n\n // \"comma\"\n result = result.replace(/\\bcomma\\s+(separated|delimited)/gi, 'comma $1');\n result = result.replace(/\\s+comma\\b/gi, ',');\n\n // \"colon\"\n result = result.replace(\n /\\b(the|a|my|your|his|her|their|semicolon|ascending|descending|transverse|sigmoid)\\s+colon\\b/gi,\n '$1 colon'\n );\n result = result.replace(\n /\\bcolon\\s+(cancer|surgery|health|polyp|scope|oscopy)/gi,\n 'colon $1'\n );\n result = result.replace(/\\s+colon\\b/gi, ':');\n\n // \"dash\"\n result = result.replace(\n /\\b(yard|meter|hundred|mad|quick|wild)\\s+dash\\b/gi,\n '$1 dash'\n );\n result = result.replace(/\\bdash\\s+(to|for|of)\\b/gi, 'dash $1');\n result = result.replace(/\\s+dash\\b/gi, ' -');\n\n const simplePunctuation: Record<string, string> = {\n ' full stop': '.',\n ' question mark': '?',\n ' exclamation point': '!',\n ' exclamation mark': '!',\n ' semicolon': ';',\n ' semi colon': ';',\n ' hyphen': '-',\n ' open parenthesis': ' (',\n ' close parenthesis': ')',\n ' open bracket': ' [',\n ' close bracket': ']',\n ' open quote': ' \"',\n ' close quote': '\"',\n ' quote': '\"',\n ' apostrophe': \"'\",\n ' new line': '\\n',\n ' newline': '\\n',\n ' new paragraph': '\\n\\n',\n ' tab': '\\t',\n };\n\n for (const [spoken, punctuation] of Object.entries(simplePunctuation)) {\n const regex = new RegExp(spoken, 'gi');\n result = result.replace(regex, punctuation);\n }\n\n // Capitalize after sentence-ending punctuation.\n result = result.replace(\n /([.!?])\\s+([a-z])/g,\n (_match, punct: string, letter: string) =>\n `${punct} ${letter.toUpperCase()}`\n );\n\n return result;\n}\n\n/**\n * Converts `<<field>>` (and the HTML-encoded `&lt;&lt;field&gt;&gt;`) syntax\n * into mustache `{{field}}` syntax. Pure helper operating on an HTML string.\n */\nexport function convertAngleBracketsToMustache(html: string): string {\n return html\n .replace(\n /&lt;&lt;([^&]*)&gt;&gt;/g,\n (_m, field: string) => `{{${field.trim()}}}`\n )\n .replace(/<<([^>]*)>>/g, (_m, field: string) => `{{${field.trim()}}}`);\n}\n\n/**\n * Returns true when an HTML string has no visible text content.\n * Note: This is a visibility check, not a sanitizer. It strips tags to inspect\n * remaining text — do NOT use this for XSS prevention.\n */\nexport { isHtmlEmpty } from '../../utils/html';\n","import { useMessages } from '../../utils/messages';\nimport * as React from 'react';\nimport {\n Bold,\n Italic,\n Underline,\n List,\n ListOrdered,\n AlignLeft,\n AlignCenter,\n AlignRight,\n Braces,\n Replace,\n Mic,\n MicOff,\n BookOpen,\n Plus,\n} from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { Separator } from '../Separator';\nimport { useMediaQuery } from '../../hooks/useMediaQuery';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\nimport {\n MacroLibrary,\n type Macro,\n type MacroGroup,\n type MacroLibraryProps,\n} from '../MacroLibrary';\nimport { Animated, AnimatedPresence } from '../../motion';\nimport {\n Dropdown,\n DropdownItem,\n DropdownLabel,\n DropdownSeparator,\n DropdownSubmenu,\n} from '../Dropdown';\nimport {\n processDictation,\n convertAngleBracketsToMustache,\n isHtmlEmpty,\n} from './processDictation';\n\nexport interface RichTextVariable {\n /** Human-readable label shown in the variable menu. */\n label: string;\n /** The token displayed for the variable (e.g. `{{employee.name}}`). */\n value: string;\n /** Optional text inserted instead of `value` (e.g. an expanded group). */\n insertValue?: string;\n}\n\nexport interface RichTextVariableGroup {\n /** Group heading shown in the variable menu. */\n label: string;\n /** Variables belonging to the group. */\n variables: RichTextVariable[];\n}\n\nexport interface RichTextEditorBlockMenuLabels {\n /** Accessible label for the gutter `+` button. Defaults to \"Block menu\". */\n blockMenu?: string;\n /** \"Text\" (normal paragraph) menu item. */\n text?: string;\n /** \"Heading 1\" menu item. */\n heading1?: string;\n /** \"Heading 2\" menu item. */\n heading2?: string;\n /** \"Heading 3\" menu item. */\n heading3?: string;\n /** \"Bullet list\" menu item. */\n bulletList?: string;\n /** \"Numbered list\" menu item. */\n numberedList?: string;\n /** \"Quote\" menu item. */\n quote?: string;\n /** \"Insert macro\" submenu parent (shown when `macros` is provided). */\n insertMacro?: string;\n /** \"Show macro library\" menu item (shown when `macros` is provided). */\n showMacroLibrary?: string;\n /** Toolbar toggle item while the toolbar is hidden. */\n showToolbar?: string;\n /** Toolbar toggle item while the toolbar is visible. */\n hideToolbar?: string;\n}\n\nexport interface RichTextEditorProps {\n /** Current HTML value of the editor. */\n value: string;\n /** Called with the updated HTML whenever the content changes. */\n onChange: (value: string) => void;\n /** Placeholder shown when the editor is empty. */\n placeholder?: string;\n /** Additional class for the editor wrapper. */\n className?: string;\n /**\n * Variable groups for the \"Insert variable\" menu. When omitted the variable\n * menu and the `<< >>` → `{{ }}` convert button are hidden.\n */\n variableGroups?: RichTextVariableGroup[];\n /** Enable the speech-to-text dictation button. Defaults to true. */\n enableDictation?: boolean;\n /** Called when dictation cannot start (replaces native alerts). */\n onDictationError?: (message: string) => void;\n /** Disable editing and toolbar actions. */\n disabled?: boolean;\n /**\n * Sanitises HTML introduced by paste or drop before it reaches the editable\n * DOM. Without it, pasted markup is inserted as the browser provides it.\n */\n sanitizeHtml?: (html: string) => string;\n /**\n * Grouped macros for the optional macro addon. When omitted the editor is\n * unchanged. When provided, a \"Macros\" toolbar toggle docks a searchable\n * macro panel inside the editor; selecting a macro inserts its content at\n * the retained caret position. Typing a macro shortcut (e.g. `.b`)\n * followed by a space expands it in place, panel open or not.\n */\n macros?: MacroGroup[];\n /** Open the macro panel initially. Defaults to false. */\n defaultMacrosOpen?: boolean;\n /**\n * Focus-driven macro panel: the field rests as a plain input, the panel\n * animates in while focus is anywhere inside the editor frame (editable,\n * toolbar, gutter or the panel itself) and animates away when focus\n * leaves. Overrides `defaultMacrosOpen`; Escape-to-close is disabled since\n * visibility follows focus. Pairs well with `compactMacros`. Defaults to\n * false.\n */\n macrosOnFocus?: boolean;\n /**\n * Dock the macro panel in `MacroLibrary`'s compact mode (no header,\n * search, or library group headings) and shrink the macros-open working\n * space to match — for short lists in dense forms. Defaults to false.\n */\n compactMacros?: boolean;\n /**\n * Called on any explicit macro invocation: a pick from the macro panel or\n * the block gutter flyout, or a typed `.shortcut` expansion. Return `true`\n * to take over the insertion: the editor skips its caret insertion and the\n * host applies the content through its own value update (e.g. appending a\n * coded finding as its own line). For typed shortcuts the editor removes\n * the typed token (and publishes that edit) before consulting the\n * callback, so a host that takes over computes from a token-free value.\n */\n onMacroInsert?: (macro: Macro) => boolean | void;\n /**\n * Overridable labels for the macro addon (i18n). Panel labels are\n * forwarded to the docked `MacroLibrary`; `macros` doubles as the toolbar\n * toggle text, and `showMacros`/`hideMacros` set the toggle's title.\n */\n macroLabels?: MacroLibraryProps['labels'] & {\n /** Toggle title while the panel is closed. Defaults to \"Show macros\". */\n showMacros?: string;\n /** Toggle title while the panel is open. Defaults to \"Hide macros\". */\n hideMacros?: string;\n };\n /** Forwarded to the macro panel's \"Save as macro\" action. */\n onCreateMacro?: () => void;\n /**\n * Controlled toolbar visibility. `'hidden'` removes the toolbar entirely\n * for chromeless surfaces (typed shortcuts keep working; pair with\n * `markdownShortcuts` or `blockMenu` so formatting stays reachable). When\n * omitted the editor manages visibility itself, starting from\n * `defaultToolbar` — existing consumers are unchanged.\n */\n toolbar?: 'visible' | 'hidden';\n /**\n * Initial toolbar visibility when `toolbar` is uncontrolled. Defaults to\n * `'visible'`.\n */\n defaultToolbar?: 'visible' | 'hidden';\n /**\n * Called when the block gutter menu toggles the toolbar (\"Show toolbar\" /\n * \"Hide toolbar\"), so hosts can persist the preference or drive the\n * controlled `toolbar` prop.\n */\n onToolbarChange?: (toolbar: 'visible' | 'hidden') => void;\n /**\n * Notion-style block gutter menu. Hovering a text row reveals a `+`\n * button in the start gutter whose menu applies block formats to that\n * row, opens the macro panel (when `macros` is provided) and toggles the\n * toolbar. Also reachable from the keyboard with Ctrl/Cmd+/ on the\n * caret's block. Defaults to false.\n */\n blockMenu?: boolean;\n /** Overridable labels for the block gutter menu (i18n). */\n blockMenuLabels?: RichTextEditorBlockMenuLabels;\n /**\n * Expand markdown-style block shortcuts typed at the start of a line and\n * followed by a space: `#`/`##`/`###` → headings, `-`/`*` → bullet list,\n * `1.` → numbered list, `>` → block quote. Inline rules (`**bold**`) are\n * not interpreted. Defaults to false.\n */\n markdownShortcuts?: boolean;\n /**\n * Textarea-like surface: removes the wrapper border/radius and starts the\n * editable at a single Input-row height that auto-grows with content\n * (matching `Textarea`'s `md` metrics). The host supplies the chrome —\n * `TextAreaRich` is the packaged pairing. Defaults to false.\n */\n chromeless?: boolean;\n /** Id applied to the editable region (deep links, `aria-labelledby`). */\n id?: string;\n /**\n * Prevent editing and formatting while keeping the region focusable and\n * its text selectable — the contenteditable analogue of a native\n * textarea's `readOnly`. The block gutter menu is hidden.\n */\n readOnly?: boolean;\n /** Extra class for the editable region itself (fonts, whitespace). */\n editorClassName?: string;\n /** Inline style for the editable region (e.g. a row-derived min-height). */\n editorStyle?: React.CSSProperties;\n /** Accessible label for the editable region. */\n 'aria-label'?: string;\n /** Id(s) of element(s) labelling the editable region. */\n 'aria-labelledby'?: string;\n /** Ids of elements describing the editable region (errors, helper text). */\n 'aria-describedby'?: string;\n /** Marks the editable region invalid for assistive technology. */\n 'aria-invalid'?: React.AriaAttributes['aria-invalid'];\n /** Marks the editable region required for assistive technology. */\n 'aria-required'?: React.AriaAttributes['aria-required'];\n}\n\n// --- Minimal Web Speech API typings (absent from the standard DOM lib) ---\ninterface SpeechRecognitionAlternativeLike {\n transcript: string;\n}\ninterface SpeechRecognitionResultLike {\n isFinal: boolean;\n [index: number]: SpeechRecognitionAlternativeLike;\n}\ninterface SpeechRecognitionResultListLike {\n length: number;\n [index: number]: SpeechRecognitionResultLike;\n}\ninterface SpeechRecognitionEventLike {\n resultIndex: number;\n results: SpeechRecognitionResultListLike;\n}\ninterface SpeechRecognitionErrorEventLike {\n error: string;\n}\ninterface SpeechRecognitionLike {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n maxAlternatives: number;\n onstart: (() => void) | null;\n onresult: ((event: SpeechRecognitionEventLike) => void) | null;\n onerror: ((event: SpeechRecognitionErrorEventLike) => void) | null;\n onend: (() => void) | null;\n start: () => void;\n stop: () => void;\n}\ntype SpeechRecognitionCtor = new () => SpeechRecognitionLike;\ninterface SpeechWindow {\n SpeechRecognition?: SpeechRecognitionCtor;\n webkitSpeechRecognition?: SpeechRecognitionCtor;\n}\n\nfunction getSpeechRecognition(): SpeechRecognitionCtor | undefined {\n const w = window as unknown as SpeechWindow;\n return w.SpeechRecognition || w.webkitSpeechRecognition;\n}\n\n/** Elements that end a visible word, equivalent to whitespace. */\nconst BLOCK_BOUNDARY =\n /^(BR|DIV|P|LI|UL|OL|TABLE|TR|TD|TH|H[1-6]|BLOCKQUOTE|PRE|HR)$/;\n\n/**\n * Markdown-style block tokens expanded on space at the start of a line.\n * Values feed `document.execCommand`; block rules only — inline markdown\n * (e.g. `**bold**`) is intentionally not interpreted.\n */\nconst MARKDOWN_BLOCK_RULES: Record<\n string,\n { command: string; value?: string }\n> = {\n '#': { command: 'formatBlock', value: 'h1' },\n '##': { command: 'formatBlock', value: 'h2' },\n '###': { command: 'formatBlock', value: 'h3' },\n '-': { command: 'insertUnorderedList' },\n '*': { command: 'insertUnorderedList' },\n '1.': { command: 'insertOrderedList' },\n '>': { command: 'formatBlock', value: 'blockquote' },\n};\n\n/**\n * Bounding rect of a top-level editor node. Text nodes (a bare first line\n * has no element wrapper) are measured through a Range.\n */\nfunction nodeRect(node: Node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n return (node as HTMLElement).getBoundingClientRect();\n }\n if (node.nodeType === Node.TEXT_NODE && (node.textContent ?? '').length > 0) {\n const range = document.createRange();\n range.selectNodeContents(node);\n return range.getBoundingClientRect();\n }\n return null;\n}\n\n/**\n * Last non-empty text node rendered inside `node`, or 'boundary' when it\n * ends with a line break or block element.\n */\nfunction lastTextWithin(node: Node): Text | 'boundary' | null {\n if (node.nodeType === Node.TEXT_NODE) {\n return (node.textContent ?? '').length > 0 ? (node as Text) : null;\n }\n if (node.nodeType !== Node.ELEMENT_NODE) return null;\n if (BLOCK_BOUNDARY.test((node as HTMLElement).tagName)) return 'boundary';\n for (let child = node.lastChild; child; child = child.previousSibling) {\n const found = lastTextWithin(child);\n if (found) return found;\n }\n return null;\n}\n\n/**\n * Previous visible text node before `node`, looking across adjacent inline\n * elements (e.g. the \".\" in `.<b>c</b>` precedes the \"c\"). Returns null at\n * a block/line-break boundary or the editor root, where a word cannot\n * continue.\n */\nfunction previousVisibleText(node: Node, root: HTMLElement): Text | null {\n let current: Node = node;\n while (current !== root) {\n let sibling: Node | null = current.previousSibling;\n while (sibling) {\n const found = lastTextWithin(sibling);\n if (found === 'boundary') return null;\n if (found) return found;\n sibling = sibling.previousSibling;\n }\n const parent: Node | null = current.parentNode;\n if (!parent) return null;\n if (\n parent !== root &&\n parent.nodeType === Node.ELEMENT_NODE &&\n BLOCK_BOUNDARY.test((parent as HTMLElement).tagName)\n ) {\n return null;\n }\n current = parent;\n }\n return null;\n}\n\n/**\n * A presentational rich-text editor with formatting, template-variable\n * insertion and optional speech-to-text dictation. Content is supplied and\n * surfaced via `value`/`onChange` so it can be wired to any store. The variable\n * menu is data-agnostic — pass `variableGroups` to populate it.\n */\nconst RichTextEditor = React.forwardRef<HTMLDivElement, RichTextEditorProps>(\n (\n {\n value,\n onChange,\n placeholder,\n className,\n variableGroups,\n enableDictation = true,\n onDictationError,\n disabled = false,\n sanitizeHtml,\n macros,\n defaultMacrosOpen = false,\n macrosOnFocus = false,\n compactMacros = false,\n onMacroInsert,\n macroLabels,\n onCreateMacro,\n toolbar,\n defaultToolbar = 'visible',\n onToolbarChange,\n blockMenu = false,\n blockMenuLabels,\n markdownShortcuts = false,\n chromeless = false,\n id,\n readOnly = false,\n editorClassName,\n editorStyle,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n 'aria-required': ariaRequired,\n },\n ref\n ) => {\n const m = useMessages();\n // Shared guard: read-only blocks edits exactly like disabled does, but\n // keeps the region focusable and selectable.\n const inert = disabled || readOnly;\n const editorRef = React.useRef<HTMLDivElement>(null);\n const [isListening, setIsListening] = React.useState(false);\n const [speechSupported, setSpeechSupported] = React.useState(false);\n const recognitionRef = React.useRef<SpeechRecognitionLike | null>(null);\n const isListeningRef = React.useRef(false);\n const shouldRestartRef = React.useRef(false);\n const [macrosOpen, setMacrosOpen] = React.useState(\n defaultMacrosOpen && !macrosOnFocus\n );\n // Last caret/selection inside the editable region, retained while the\n // macro panel has focus so insertion lands where the clinician left off.\n const savedRangeRef = React.useRef<Range | null>(null);\n const macroPanelId = React.useId();\n // The macro panel is an absolute side panel from `md:` up but sits\n // in-flow below the editor on small screens, where it must animate its\n // height so the surrounding layout follows instead of holding full size\n // until the exit finishes and then snapping shut.\n const macroSidePanel = useMediaQuery('(min-width: 768px)');\n const prefersReducedMotion = usePrefersReducedMotion();\n\n const hasVariables = Boolean(variableGroups && variableGroups.length > 0);\n const hasMacros = Boolean(macros);\n // Focus mode at rest: the field is a bare one-line input — no block-menu\n // indent, no gutter `+` on hover — until focus grows it.\n const macrosResting = hasMacros && macrosOnFocus && !macrosOpen;\n const hasMacroEntries = Boolean(\n macros?.some((group) => group.macros.length > 0)\n );\n const isEmpty = isHtmlEmpty(value);\n const [uncontrolledToolbar, setUncontrolledToolbar] =\n React.useState(defaultToolbar);\n const toolbarVisible = (toolbar ?? uncontrolledToolbar) !== 'hidden';\n const setToolbarVisibility = (next: 'visible' | 'hidden') => {\n if (toolbar === undefined) setUncontrolledToolbar(next);\n onToolbarChange?.(next);\n };\n // Mirrored into a ref so async dictation code can read the live value\n // after awaiting microphone permission.\n const toolbarVisibleRef = React.useRef(toolbarVisible);\n // Same for disabled/readOnly: recognition callbacks outlive renders.\n const inertRef = React.useRef(inert);\n\n // --- Block gutter menu state ---\n const [blockMenuOpen, setBlockMenuOpen] = React.useState(false);\n // Offset of the gutter button within the editor body; aligns with the\n // editable region's top padding (p-4 / chromeless py-[7px]) before any\n // row is hovered.\n const [gutterTop, setGutterTop] = React.useState(chromeless ? 7 : 16);\n const gutterWrapperRef = React.useRef<HTMLDivElement>(null);\n // Density styles (condensed-view.css) shrink that padding under the\n // defaults above, which would leave the at-rest trigger hanging below a\n // one-line condensed field — measure it from the live editable.\n const measureRestGutterTop = React.useCallback(() => {\n const fallback = chromeless ? 7 : 16;\n if (!editorRef.current) return fallback;\n const padding = parseFloat(\n getComputedStyle(editorRef.current).paddingTop\n );\n return Number.isNaN(padding) ? fallback : Math.round(padding);\n }, [chromeless]);\n React.useLayoutEffect(() => {\n if (!blockMenu || !editorRef.current) return;\n setGutterTop((current) => {\n const next = measureRestGutterTop();\n return current === next ? current : next;\n });\n }, [blockMenu, measureRestGutterTop]);\n const hoverBlockNodeRef = React.useRef<Node | null>(null);\n /** Park the trigger back at its rest offset and forget the hovered row. */\n const resetGutter = React.useCallback(() => {\n hoverBlockNodeRef.current = null;\n const next = measureRestGutterTop();\n setGutterTop((current) => (current === next ? current : next));\n }, [measureRestGutterTop]);\n /** Content edits can delete the hovered row (or every row) while the\n * trigger still floats at the old offset — below a field that shrank,\n * now that chromeless mode no longer clips the wrapper. */\n const reconcileGutterWithContent = React.useCallback(() => {\n if (!blockMenu || !editorRef.current) return;\n const hovered = hoverBlockNodeRef.current;\n if (\n (hovered && !editorRef.current.contains(hovered)) ||\n !editorRef.current.hasChildNodes()\n ) {\n resetGutter();\n }\n }, [blockMenu, resetGutter]);\n // Where the chosen menu action is applied: the hovered block's start\n // (mouse) or the caret position (Ctrl/Cmd+/), captured at open time.\n const blockTargetRangeRef = React.useRef<Range | null>(null);\n const firstBlockItemRef = React.useRef<HTMLButtonElement>(null);\n\n React.useImperativeHandle(ref, () => editorRef.current as HTMLDivElement);\n\n React.useEffect(() => {\n setSpeechSupported(Boolean(getSpeechRecognition()));\n }, []);\n\n React.useEffect(() => {\n return () => {\n if (recognitionRef.current) {\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n recognitionRef.current.stop();\n }\n };\n }, []);\n\n // Hiding the toolbar removes the Stop control and listening indicator,\n // so a running dictation must not keep inserting text (and restarting\n // through onend) with no way to stop it.\n React.useEffect(() => {\n toolbarVisibleRef.current = toolbarVisible;\n if (toolbarVisible) return;\n if (recognitionRef.current && isListeningRef.current) {\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n recognitionRef.current.stop();\n setIsListening(false);\n }\n }, [toolbarVisible]);\n\n // Turning disabled/readOnly mid-dictation must stop recognition: the\n // Stop button is disabled while inert, and onresult would otherwise keep\n // editing a field the user can no longer change.\n React.useEffect(() => {\n inertRef.current = inert;\n if (!inert) return;\n if (recognitionRef.current && isListeningRef.current) {\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n recognitionRef.current.stop();\n setIsListening(false);\n }\n }, [inert]);\n\n React.useEffect(() => {\n if (editorRef.current && editorRef.current.innerHTML !== value) {\n const hadFocus = document.activeElement === editorRef.current;\n editorRef.current.innerHTML = value;\n if (hadFocus) {\n // The replacement destroyed the nodes holding the caret, which\n // collapses the selection to the top of the document. Park it\n // after the last block instead so typing continues on the next\n // line below the newly applied content (e.g. a host-appended\n // macro line).\n const range = document.createRange();\n range.selectNodeContents(editorRef.current);\n range.collapse(false);\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n savedRangeRef.current = range.cloneRange();\n }\n reconcileGutterWithContent();\n }\n }, [value, reconcileGutterWithContent]);\n\n const updateContent = () => {\n if (editorRef.current) onChange(editorRef.current.innerHTML);\n reconcileGutterWithContent();\n };\n\n // Pasted/dropped HTML otherwise lands in the live DOM unfiltered, where\n // hostile markup (position:fixed overlays, host CSS classes) is active.\n const insertSanitized = (html: string) => {\n if (!sanitizeHtml) return false;\n document.execCommand('insertHTML', false, sanitizeHtml(html));\n updateContent();\n return true;\n };\n const handlePaste = (e: React.ClipboardEvent) => {\n const html = e.clipboardData.getData('text/html');\n if (html && sanitizeHtml) {\n e.preventDefault();\n insertSanitized(html);\n }\n };\n const handleDrop = (e: React.DragEvent) => {\n const html = e.dataTransfer.getData('text/html');\n if (!html || !sanitizeHtml) return;\n e.preventDefault();\n const caret = (\n document as Document & {\n caretRangeFromPoint?: (\n x: number,\n y: number\n ) => ReturnType<Document['createRange']> | null;\n }\n ).caretRangeFromPoint?.(e.clientX, e.clientY);\n if (caret) {\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(caret);\n }\n editorRef.current?.focus();\n insertSanitized(html);\n };\n\n const execCommand = (command: string) => {\n if (inert) return;\n document.execCommand(command, false);\n editorRef.current?.focus();\n updateContent();\n };\n\n const handleConvertToMustache = () => {\n if (inert || !editorRef.current) return;\n editorRef.current.innerHTML = convertAngleBracketsToMustache(\n editorRef.current.innerHTML\n );\n updateContent();\n };\n\n const insertVariable = (variable: RichTextVariable) => {\n if (inert || !editorRef.current) return;\n editorRef.current.focus();\n const textToInsert = variable.insertValue ?? variable.value;\n\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n range.deleteContents();\n if (textToInsert.includes('\\n')) {\n const fragment = document.createDocumentFragment();\n const lines = textToInsert.split('\\n');\n lines.forEach((line, index) => {\n fragment.appendChild(document.createTextNode(line));\n if (index < lines.length - 1) {\n fragment.appendChild(document.createElement('br'));\n }\n });\n range.insertNode(fragment);\n range.collapse(false);\n } else {\n const textNode = document.createTextNode(textToInsert);\n range.insertNode(textNode);\n range.setStartAfter(textNode);\n range.setEndAfter(textNode);\n }\n selection.removeAllRanges();\n selection.addRange(range);\n } else {\n editorRef.current.innerHTML += textToInsert.replace(/\\n/g, '<br>');\n }\n updateContent();\n };\n\n const reportError = (message: string) => {\n if (onDictationError) onDictationError(message);\n else if (typeof console !== 'undefined') console.warn(message);\n };\n\n /** Bookmark the selection whenever it lives inside the editable region. */\n const saveSelection = () => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0 || !editorRef.current)\n return;\n const range = selection.getRangeAt(0);\n if (editorRef.current.contains(range.commonAncestorContainer)) {\n savedRangeRef.current = range.cloneRange();\n }\n };\n\n /** Focus the editor and restore the bookmarked selection if still valid. */\n const focusRestoringSelection = () => {\n if (!editorRef.current) return;\n editorRef.current.focus();\n const saved = savedRangeRef.current;\n const selection = window.getSelection();\n if (\n saved &&\n selection &&\n editorRef.current.contains(saved.commonAncestorContainer)\n ) {\n selection.removeAllRanges();\n selection.addRange(saved);\n }\n };\n\n const insertMacro = (macro: Macro) => {\n if (inert || !editorRef.current) return;\n if (onMacroInsert?.(macro) === true) return;\n focusRestoringSelection();\n insertTextAtSelection(macro.content);\n };\n\n /**\n * Replace the current selection with plain text. execCommand participates\n * in the browser's native undo stack, so an insertion can be reverted\n * with a single undo.\n */\n const insertTextAtSelection = (content: string) => {\n let inserted = false;\n try {\n inserted = document.execCommand('insertText', false, content);\n } catch {\n inserted = false;\n }\n if (!inserted) {\n // Fallback (and jsdom path): manual range insertion. Content is\n // always inserted as text nodes, never parsed as HTML.\n const fragment = document.createDocumentFragment();\n const lines = content.split('\\n');\n lines.forEach((line, index) => {\n fragment.appendChild(document.createTextNode(line));\n if (index < lines.length - 1) {\n fragment.appendChild(document.createElement('br'));\n }\n });\n const sel = window.getSelection();\n if (sel && sel.rangeCount > 0) {\n const range = sel.getRangeAt(0);\n range.deleteContents();\n range.insertNode(fragment);\n range.collapse(false);\n sel.removeAllRanges();\n sel.addRange(range);\n } else if (editorRef.current) {\n editorRef.current.appendChild(fragment);\n }\n }\n saveSelection();\n updateContent();\n };\n\n /**\n * The visible word immediately before the collapsed caret, spanning\n * adjacent inline nodes (`.<b>c</b>` is \".c\"). Returns the token, the\n * range coordinates to replace it, and whether it sits at the start of\n * its line (nothing but a block boundary before it).\n */\n const collectTokenBeforeCaret = () => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0 || !selection.isCollapsed)\n return null;\n const caret = selection.getRangeAt(0);\n const node = caret.startContainer;\n if (\n node.nodeType !== Node.TEXT_NODE ||\n !editorRef.current?.contains(node)\n )\n return null;\n const typed = /(\\S+)$/.exec(\n (node.textContent ?? '').slice(0, caret.startOffset)\n );\n if (!typed) return null;\n let token = typed[1];\n let startNode: Node = node;\n let startOffset = caret.startOffset - typed[1].length;\n while (startOffset === 0) {\n const prev = previousVisibleText(startNode, editorRef.current);\n if (!prev) break;\n const text = prev.textContent ?? '';\n const continued = /(\\S+)$/.exec(text);\n if (!continued) break;\n token = continued[1] + token;\n startNode = prev;\n startOffset = text.length - continued[1].length;\n }\n const atLineStart =\n startOffset === 0 && !previousVisibleText(startNode, editorRef.current);\n return {\n token,\n startNode,\n startOffset,\n caretNode: node,\n caretOffset: caret.startOffset,\n atLineStart,\n selection,\n };\n };\n\n /** Select `collected`'s token so the next editing command replaces it. */\n const selectCollectedToken = (\n collected: NonNullable<ReturnType<typeof collectTokenBeforeCaret>>\n ) => {\n const replaceRange = document.createRange();\n replaceRange.setStart(collected.startNode, collected.startOffset);\n replaceRange.setEnd(collected.caretNode, collected.caretOffset);\n collected.selection.removeAllRanges();\n collected.selection.addRange(replaceRange);\n return replaceRange;\n };\n\n /**\n * Delete the selected range through execCommand so the removal joins\n * the native undo stack, with a manual fallback for jsdom. Leaves a\n * collapsed caret where the selection started.\n */\n const deleteSelectedRange = (replaceRange: Range) => {\n let deleted = false;\n try {\n deleted = document.execCommand('delete', false);\n } catch {\n deleted = false;\n }\n if (!deleted) {\n replaceRange.deleteContents();\n replaceRange.collapse(true);\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(replaceRange);\n }\n };\n\n /**\n * Expand a typed macro shortcut (dot phrase). When the word immediately\n * before the caret matches a macro shortcut and the user presses space,\n * the shortcut is replaced with the macro content in a single undoable\n * edit; the triggering space is consumed.\n */\n const expandTypedShortcut = (\n event: React.KeyboardEvent<HTMLDivElement>\n ) => {\n if (!macros) return;\n const collected = collectTokenBeforeCaret();\n if (!collected) return;\n const lowered = collected.token.toLowerCase();\n const macro = macros\n .flatMap((group) => group.macros)\n .find((candidate) => candidate.shortcut?.toLowerCase() === lowered);\n if (!macro) return;\n\n event.preventDefault();\n if (onMacroInsert) {\n // Remove the typed token and publish that edit first, so a host\n // that takes over the insertion computes from a token-free value.\n deleteSelectedRange(selectCollectedToken(collected));\n saveSelection();\n updateContent();\n if (onMacroInsert(macro) === true) return;\n insertTextAtSelection(macro.content);\n return;\n }\n selectCollectedToken(collected);\n insertTextAtSelection(macro.content);\n };\n\n /**\n * Apply a markdown block rule when the token before the caret starts its\n * line and matches `MARKDOWN_BLOCK_RULES` (`##` + space → heading). The\n * token removal and the block command both run through execCommand so\n * the expansion stays natively undoable. Returns true when handled.\n */\n const applyMarkdownShortcut = (\n event: React.KeyboardEvent<HTMLDivElement>\n ) => {\n const collected = collectTokenBeforeCaret();\n if (!collected || !collected.atLineStart) return false;\n // Own-property check: tokens like \"constructor\" or \"toString\" resolve\n // inherited object members and must not be treated as rules.\n if (!Object.hasOwn(MARKDOWN_BLOCK_RULES, collected.token)) return false;\n const rule = MARKDOWN_BLOCK_RULES[collected.token];\n\n event.preventDefault();\n deleteSelectedRange(selectCollectedToken(collected));\n try {\n document.execCommand(rule.command, false, rule.value);\n } catch {\n // jsdom: no execCommand — the token is still consumed.\n }\n editorRef.current?.focus();\n saveSelection();\n updateContent();\n return true;\n };\n\n /** Space-keydown pipeline: markdown block rules, then macro shortcuts. */\n const handleEditorKeyDown = (\n event: React.KeyboardEvent<HTMLDivElement>\n ) => {\n if (inert) return;\n if (\n blockMenu &&\n event.key === '/' &&\n (event.ctrlKey || event.metaKey) &&\n !event.altKey\n ) {\n event.preventDefault();\n openBlockMenuAtCaret();\n return;\n }\n if (\n event.key !== ' ' ||\n // Space during IME composition selects/converts a candidate; never\n // hijack it for shortcut expansion.\n event.nativeEvent.isComposing ||\n event.ctrlKey ||\n event.metaKey ||\n event.altKey\n )\n return;\n if (markdownShortcuts && applyMarkdownShortcut(event)) return;\n expandTypedShortcut(event);\n };\n\n // --- Block gutter menu ---\n\n /** Track the hovered block and keep the gutter button beside it. */\n const handleGutterMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n // While the menu is open its target must not follow the pointer.\n if (blockMenuOpen || !editorRef.current || !gutterWrapperRef.current)\n return;\n let target: Node | null = null;\n let top: number | null = null;\n // Last top-level node starting above the pointer; first node otherwise.\n for (const child of Array.from(editorRef.current.childNodes)) {\n const rect = nodeRect(child);\n if (!rect) continue;\n // Collapsed whitespace between blocks (formatted HTML) measures 0×0\n // at the origin; its top of 0 always passes the comparison below and\n // would steal the target from the visible row. Zero-width nodes that\n // still have a height (an empty rendered line) remain eligible.\n if (rect.width === 0 && rect.height === 0) continue;\n if (target === null || rect.top <= event.clientY) {\n target = child;\n top = rect.top;\n }\n }\n if (!target || top === null) {\n // Every row is gone (e.g. the controlled value was cleared) — don't\n // leave the trigger floating at the deleted row's offset.\n resetGutter();\n return;\n }\n hoverBlockNodeRef.current = target;\n const wrapperTop = gutterWrapperRef.current.getBoundingClientRect().top;\n const next = Math.max(Math.round(top - wrapperTop), 4);\n setGutterTop((current) => (current === next ? current : next));\n };\n\n /** Collapsed range at the very start of `node`. */\n const rangeAtStartOf = (node: Node) => {\n const range = document.createRange();\n range.setStart(node, 0);\n range.collapse(true);\n return range;\n };\n\n /** Dropdown open/close driven by the gutter trigger (mouse path). */\n const handleBlockMenuOpenChange = (open: boolean) => {\n if (open) {\n const block =\n hoverBlockNodeRef.current ?? editorRef.current?.firstChild ?? null;\n blockTargetRangeRef.current = block ? rangeAtStartOf(block) : null;\n } else if (\n editorRef.current &&\n document.activeElement?.closest('[role=\"menu\"]')\n ) {\n // Escape: focus sits on a menu item about to unmount — without a\n // hand-off it falls to <body> and typing stops editing. Outside\n // clicks have already moved focus, so they skip this branch.\n const editor = editorRef.current;\n editor.focus();\n const target = blockTargetRangeRef.current;\n const selection = window.getSelection();\n if (target && selection && editor.contains(target.startContainer)) {\n selection.removeAllRanges();\n selection.addRange(target);\n saveSelection();\n }\n }\n setBlockMenuOpen(open);\n };\n\n /** Ctrl/Cmd+/ — open the menu targeting the caret's block. */\n const openBlockMenuAtCaret = () => {\n const selection = window.getSelection();\n if (\n selection &&\n selection.rangeCount > 0 &&\n editorRef.current?.contains(selection.getRangeAt(0).startContainer)\n ) {\n const caret = selection.getRangeAt(0);\n blockTargetRangeRef.current = caret.cloneRange();\n // Move the gutter button beside the caret's top-level block so the\n // menu opens where the action will land.\n let node: Node = caret.startContainer;\n while (node.parentNode && node.parentNode !== editorRef.current) {\n node = node.parentNode;\n }\n const rect = nodeRect(node);\n const wrapperRect = gutterWrapperRef.current?.getBoundingClientRect();\n if (rect && wrapperRect) {\n setGutterTop(Math.max(Math.round(rect.top - wrapperRect.top), 4));\n }\n } else {\n blockTargetRangeRef.current = null;\n }\n setBlockMenuOpen(true);\n };\n\n /** Apply a block command from the menu to the captured target range. */\n const applyBlockFormat = (command: string, value?: string) => {\n if (inert || !editorRef.current) return;\n setBlockMenuOpen(false);\n editorRef.current.focus();\n const target = blockTargetRangeRef.current;\n const selection = window.getSelection();\n if (\n target &&\n selection &&\n editorRef.current.contains(target.startContainer)\n ) {\n selection.removeAllRanges();\n selection.addRange(target);\n }\n try {\n document.execCommand(command, false, value);\n } catch {\n // jsdom: no execCommand — nothing to apply.\n }\n saveSelection();\n updateContent();\n };\n\n // Menus move focus to their first item on open (WAI-ARIA menu pattern);\n // required for the Ctrl/Cmd+/ path, where focus is still in the editor.\n React.useEffect(() => {\n if (!blockMenuOpen) return;\n const frame = requestAnimationFrame(() =>\n firstBlockItemRef.current?.focus()\n );\n return () => cancelAnimationFrame(frame);\n }, [blockMenuOpen]);\n\n const toggleDictation = async () => {\n const SpeechRecognition = getSpeechRecognition();\n if (!SpeechRecognition) return;\n\n if (isListening && recognitionRef.current) {\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n recognitionRef.current.stop();\n setIsListening(false);\n return;\n }\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n stream.getTracks().forEach((track) => track.stop());\n } catch {\n reportError(\n 'Microphone access is required for dictation. Please allow microphone access in your browser settings and try again.'\n );\n return;\n }\n\n // The toolbar (and its Stop control) may have been hidden — or the\n // editor made disabled/readOnly — while awaiting microphone\n // permission; do not start an unstoppable or read-only session.\n if (!toolbarVisibleRef.current || inertRef.current) return;\n\n const recognition = new SpeechRecognition();\n recognition.continuous = true;\n recognition.interimResults = true;\n recognition.lang = 'en-US';\n recognition.maxAlternatives = 1;\n\n recognition.onstart = () => {\n setIsListening(true);\n isListeningRef.current = true;\n shouldRestartRef.current = true;\n };\n\n recognition.onresult = (event) => {\n if (inertRef.current) return;\n let finalTranscript = '';\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n if (result.isFinal) finalTranscript += result[0].transcript;\n }\n\n if (finalTranscript && editorRef.current) {\n const processedText = processDictation(finalTranscript);\n editorRef.current.focus();\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n range.deleteContents();\n const textNode = document.createTextNode(processedText + ' ');\n range.insertNode(textNode);\n range.setStartAfter(textNode);\n range.setEndAfter(textNode);\n selection.removeAllRanges();\n selection.addRange(range);\n } else {\n editorRef.current.innerHTML += processedText + ' ';\n }\n updateContent();\n }\n };\n\n recognition.onerror = (event) => {\n if (event.error === 'no-speech' || event.error === 'aborted') return;\n if (event.error === 'not-allowed') {\n reportError(\n 'Microphone access was denied. Please allow microphone access in your browser settings and try again.'\n );\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n setIsListening(false);\n return;\n }\n if (event.error === 'network') return;\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n setIsListening(false);\n };\n\n recognition.onend = () => {\n if (\n shouldRestartRef.current &&\n isListeningRef.current &&\n !inertRef.current\n ) {\n setTimeout(() => {\n if (\n shouldRestartRef.current &&\n isListeningRef.current &&\n !inertRef.current\n ) {\n try {\n recognition.start();\n } catch {\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n setIsListening(false);\n }\n }\n }, 100);\n } else {\n setIsListening(false);\n }\n };\n\n recognitionRef.current = recognition;\n try {\n recognition.start();\n } catch {\n reportError('Failed to start speech recognition. Please try again.');\n }\n };\n\n const iconButtonClass = 'h-8 w-8 p-0';\n\n const blockFormatItems: Array<{\n key: keyof RichTextEditorBlockMenuLabels;\n label: string;\n command: string;\n value?: string;\n }> = [\n { key: 'text', label: 'Text', command: 'formatBlock', value: 'p' },\n {\n key: 'heading1',\n label: 'Heading 1',\n command: 'formatBlock',\n value: 'h1',\n },\n {\n key: 'heading2',\n label: 'Heading 2',\n command: 'formatBlock',\n value: 'h2',\n },\n {\n key: 'heading3',\n label: 'Heading 3',\n command: 'formatBlock',\n value: 'h3',\n },\n {\n key: 'bulletList',\n label: 'Bullet list',\n command: 'insertUnorderedList',\n },\n {\n key: 'numberedList',\n label: 'Numbered list',\n command: 'insertOrderedList',\n },\n {\n key: 'quote',\n label: 'Quote',\n command: 'formatBlock',\n value: 'blockquote',\n },\n ];\n\n return (\n <div\n data-slot=\"rich-text-editor\"\n data-chromeless={chromeless || undefined}\n // Focus-driven macros: open while focus is anywhere inside the frame\n // (focus events bubble in React), close only when it truly leaves —\n // a macro pick or a toolbar click moves focus within and stays open.\n onFocus={\n hasMacros && macrosOnFocus ? () => setMacrosOpen(true) : undefined\n }\n onBlur={\n hasMacros && macrosOnFocus\n ? (event) => {\n const related = event.relatedTarget as HTMLElement | null;\n if (related && event.currentTarget.contains(related)) return;\n // The block gutter's dropdown — and its \"Insert macro\"\n // submenu — mount in portals under document.body (outside\n // this frame); focus moving into our own menu tree is an\n // internal move, not leaving the field. Walk each menu back\n // to its trigger (a submenu's trigger sits in the parent\n // menu's portal) until one lands inside this frame.\n let menu = related?.closest<HTMLElement>('[role=\"menu\"]');\n while (menu && menu.id) {\n const trigger = document.querySelector(\n `[aria-controls=\"${globalThis.CSS.escape(menu.id)}\"]`\n );\n if (!trigger) break;\n if (event.currentTarget.contains(trigger)) return;\n menu = trigger.closest<HTMLElement>('[role=\"menu\"]');\n }\n setMacrosOpen(false);\n }\n : undefined\n }\n className={cn(\n 'bg-background flex flex-col',\n !chromeless && 'border-border overflow-hidden rounded-lg border',\n className\n )}\n >\n {toolbarVisible && (\n <div\n data-slot=\"rich-text-editor-toolbar\"\n className=\"border-border bg-muted/30 sticky top-0 z-10 flex flex-wrap items-center gap-1 border-b p-2\"\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('bold')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label={m('Bold')}\n title={m('Bold')}\n >\n <Bold className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('italic')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label={m('Italic')}\n title={m('Italic')}\n >\n <Italic className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('underline')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label={m('Underline')}\n title={m('Underline')}\n >\n <Underline className=\"h-4 w-4\" />\n </Button>\n\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('insertUnorderedList')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label={m('Bullet list')}\n title={m('Bullet list')}\n >\n <List className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('insertOrderedList')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label={m('Numbered list')}\n title={m('Numbered list')}\n >\n <ListOrdered className=\"h-4 w-4\" />\n </Button>\n\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('justifyLeft')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label={m('Align left')}\n title={m('Align left')}\n >\n <AlignLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('justifyCenter')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label={m('Align center')}\n title={m('Align center')}\n >\n <AlignCenter className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => execCommand('justifyRight')}\n disabled={disabled}\n className={iconButtonClass}\n aria-label={m('Align right')}\n title={m('Align right')}\n >\n <AlignRight className=\"h-4 w-4\" />\n </Button>\n\n {hasVariables && (\n <>\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <Dropdown\n placement=\"bottom-start\"\n width={240}\n searchable\n searchPlaceholder=\"Search variables…\"\n searchAriaLabel=\"Search template variables\"\n disabled={disabled}\n trigger={\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 gap-1 px-2\"\n disabled={disabled}\n title={m('Insert variable')}\n >\n <Braces className=\"h-4 w-4\" />\n <span className=\"ms-1 text-xs\">{m('Variables')}</span>\n </Button>\n }\n >\n {variableGroups!.map((group, groupIndex) => (\n <React.Fragment key={group.label}>\n {groupIndex > 0 && <DropdownSeparator />}\n <DropdownLabel>{group.label}</DropdownLabel>\n {group.variables.map((variable) => (\n <DropdownItem\n key={variable.value}\n onClick={() => insertVariable(variable)}\n >\n {variable.label}\n </DropdownItem>\n ))}\n </React.Fragment>\n ))}\n </Dropdown>\n\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleConvertToMustache}\n disabled={disabled}\n className=\"h-8 gap-1 px-2\"\n title={m('Convert <<field>> to {{field}}')}\n >\n <Replace className=\"h-4 w-4\" />\n <span className=\"ms-1 text-xs\">{m('<< >> to {{ }}')}</span>\n </Button>\n </>\n )}\n\n {enableDictation && (\n <>\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <Button\n type=\"button\"\n variant={isListening ? 'danger' : 'ghost'}\n size=\"sm\"\n onClick={toggleDictation}\n disabled={inert || !speechSupported}\n className={cn(\n 'h-8 gap-1 px-2',\n isListening && 'animate-pulse'\n )}\n title={\n !speechSupported\n ? m('Speech recognition not supported in this browser')\n : isListening\n ? m('Stop dictation')\n : m('Start dictation')\n }\n >\n {isListening ? (\n <MicOff className=\"h-4 w-4\" />\n ) : (\n <Mic className=\"h-4 w-4\" />\n )}\n <span className=\"ms-1 text-xs\">\n {isListening ? m('Stop') : m('Dictate')}\n </span>\n </Button>\n </>\n )}\n\n {hasMacros && (\n <>\n <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setMacrosOpen((open) => !open)}\n disabled={disabled}\n className={cn('h-8 gap-1 px-2', macrosOpen && 'bg-muted')}\n aria-expanded={macrosOpen}\n aria-controls={macrosOpen ? macroPanelId : undefined}\n title={\n macrosOpen\n ? (macroLabels?.hideMacros ?? 'Hide macros')\n : (macroLabels?.showMacros ?? 'Show macros')\n }\n >\n <BookOpen className=\"h-4 w-4\" />\n <span className=\"ms-1 text-xs\">\n {macroLabels?.macros ?? 'Macros'}\n </span>\n </Button>\n </>\n )}\n </div>\n )}\n\n <div className=\"relative flex min-h-0 flex-1 flex-col\">\n <div\n ref={gutterWrapperRef}\n className={cn(\n 'relative flex-1',\n blockMenu && 'group/rte-body',\n hasMacros && macrosOpen && 'md:me-72'\n )}\n onMouseMove={\n blockMenu && !disabled ? handleGutterMouseMove : undefined\n }\n >\n {blockMenu && !inert && !macrosResting && (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions -- mousedown here only guards editor focus (preventDefault); the real controls inside are native buttons.\n <div\n data-slot=\"rich-text-editor-block-gutter\"\n className=\"absolute start-1 z-10\"\n style={{ top: gutterTop }}\n // Keep the editor focused through gutter interaction. iOS\n // taps never focus buttons, so tapping the trigger or a menu\n // item would first blur the editor with a null relatedTarget,\n // collapsing focus-driven hosts and unmounting this gutter —\n // and its menu — before the click can land. Preventing\n // mousedown's focus default leaves the caret and virtual\n // keyboard in place; clicks still fire. The dropdown portals\n // under document.body, but React portal events bubble through\n // the React tree, so this one handler covers the menu too.\n onMouseDown={(event) => event.preventDefault()}\n >\n <Dropdown\n open={blockMenuOpen}\n onOpenChange={handleBlockMenuOpenChange}\n placement=\"bottom-start\"\n trigger={\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n 'h-6 w-6 p-0',\n // Revealed on hover/focus; always visible on touch,\n // which has no hover to reveal it with.\n 'opacity-0 transition-opacity',\n 'group-hover/rte-body:opacity-100',\n 'focus-visible:opacity-100',\n '[@media(hover:none)]:opacity-100',\n blockMenuOpen && 'opacity-100'\n )}\n aria-label={blockMenuLabels?.blockMenu ?? 'Block menu'}\n title={blockMenuLabels?.blockMenu ?? 'Block menu'}\n >\n <Plus className=\"h-4 w-4\" />\n </Button>\n }\n >\n {blockFormatItems.map((item, index) => (\n <DropdownItem\n key={item.key}\n ref={index === 0 ? firstBlockItemRef : undefined}\n onClick={() => applyBlockFormat(item.command, item.value)}\n >\n {blockMenuLabels?.[item.key] ?? item.label}\n </DropdownItem>\n ))}\n <DropdownSeparator />\n {hasMacros && macros && (\n <>\n <DropdownSubmenu\n label={blockMenuLabels?.insertMacro ?? 'Insert macro'}\n // No macros to offer — the panel's empty state (via\n // \"Show macro library\") explains the situation.\n disabled={!hasMacroEntries}\n >\n {/* Children are built per render even while closed\n (the menu JSX lives in the editor's tree), so\n skip the catalog walk until the menu is open. */}\n {blockMenuOpen &&\n macros.flatMap((group) => [\n // Group headings only earn their row when there\n // is more than one group to tell apart.\n ...(macros.length > 1\n ? [\n <DropdownLabel key={`h:${group.id}`}>\n {group.label}\n </DropdownLabel>,\n ]\n : []),\n ...group.macros.map((macro) => (\n <DropdownItem\n // Serialized pair: plain `${a}-${b}` joins\n // collide ('a-b','c' vs 'a','b-c') and can\n // alias a heading key.\n key={`m:${JSON.stringify([group.id, macro.id])}`}\n // The item's label slot is a flex item with\n // min-width:auto, so it refuses to shrink and\n // a long macro name overflows instead of\n // hitting the truncate below. Scoped here\n // rather than changed in DropdownItem, whose\n // other consumers size to content.\n className=\"[&>[data-slot=dropdown-item-label]]:min-w-0 [&>[data-slot=dropdown-item-label]]:flex-1\"\n onClick={() => {\n setBlockMenuOpen(false);\n // Insertion lands at the menu's target\n // block, mirroring the panel flow.\n if (blockTargetRangeRef.current) {\n savedRangeRef.current =\n blockTargetRangeRef.current;\n }\n // The menu unmounts with this pick; hand\n // focus back to the editor (host-handled\n // picks skip insertMacro's own focus) so a\n // focus-driven field can rest on the next\n // click away. Panel picks keep focus on\n // their row for keyboard multi-pick.\n focusRestoringSelection();\n insertMacro(macro);\n }}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n {macro.shortcut && (\n <span\n // Shortcuts are typed sequences; keep\n // them LTR in RTL locales.\n dir=\"ltr\"\n className=\"border-border bg-background text-muted-foreground rounded border px-1 font-mono text-[11px]\"\n >\n {macro.shortcut}\n </span>\n )}\n <span className=\"min-w-0 flex-1 truncate\">\n {macro.label}\n </span>\n </span>\n </DropdownItem>\n )),\n ])}\n </DropdownSubmenu>\n <DropdownItem\n onClick={() => {\n setBlockMenuOpen(false);\n // Macro insertion restores the bookmarked\n // selection; point it at the menu's target block.\n if (blockTargetRangeRef.current) {\n savedRangeRef.current = blockTargetRangeRef.current;\n }\n setMacrosOpen(true);\n // The activated item unmounts with the menu; move\n // focus back AND apply the bookmark to the live\n // selection — a bare focus() would leave the old\n // caret live, and the editor's onBlur (fired when\n // the panel's search field takes focus) would then\n // re-save it over the menu's target.\n focusRestoringSelection();\n }}\n >\n {blockMenuLabels?.showMacroLibrary ??\n 'Show macro library'}\n </DropdownItem>\n {/* The toolbar toggle is editor chrome, not a macro\n action — keep it visually apart. */}\n <DropdownSeparator />\n </>\n )}\n <DropdownItem\n onClick={() => {\n setBlockMenuOpen(false);\n setToolbarVisibility(\n toolbarVisible ? 'hidden' : 'visible'\n );\n // See the macro item: the menu unmounts on close.\n editorRef.current?.focus();\n }}\n >\n {toolbarVisible\n ? (blockMenuLabels?.hideToolbar ?? 'Hide toolbar')\n : (blockMenuLabels?.showToolbar ?? 'Show toolbar')}\n </DropdownItem>\n </Dropdown>\n </div>\n )}\n {isEmpty && placeholder && (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'text-muted-foreground pointer-events-none absolute start-0 top-0',\n // Chromeless hosts drop the wrapper's clipping, so a long\n // placeholder must stay a single ellipsized line (as a\n // native textarea clips its own) instead of wrapping out\n // of the one-row field.\n chromeless ? 'end-0 truncate px-3 py-[7px] text-base' : 'p-4',\n blockMenu && !macrosResting && 'ps-10',\n // Keep the placeholder's font in step with the editable\n // when the host restyles it (e.g. Textarea's `size`).\n editorClassName\n )}\n >\n {placeholder}\n </div>\n )}\n <div\n ref={editorRef}\n id={id}\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-label={ariaLabel ?? placeholder}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid}\n aria-required={ariaRequired}\n aria-readonly={readOnly || undefined}\n // A native disabled control announces its state (and axe\n // exempts it from color-contrast); a contenteditable div\n // must say so explicitly.\n aria-disabled={disabled || undefined}\n contentEditable={!inert}\n // Styling hook: condensed-view.css must not pin the editable\n // to its compact single-line minimum while the macro panel\n // (absolutely stretched over this region) needs the md\n // macros-open working space below.\n data-macros-open={hasMacros && macrosOpen ? '' : undefined}\n tabIndex={disabled ? -1 : 0}\n onInput={updateContent}\n onPaste={handlePaste}\n onDrop={handleDrop}\n onBlur={hasMacros ? saveSelection : undefined}\n onKeyDown={\n hasMacros || markdownShortcuts || blockMenu\n ? handleEditorKeyDown\n : undefined\n }\n onKeyUp={hasMacros ? saveSelection : undefined}\n onMouseUp={hasMacros ? saveSelection : undefined}\n className={cn(\n 'overflow-y-auto focus:outline-none',\n // Chromeless surfaces start one Input row tall (Textarea md\n // metrics: 24px line + 7px padding + the host's 1px borders\n // = h-10) and auto-grow with content.\n chromeless\n ? 'min-h-[38px] px-3 py-[7px] text-base'\n : 'min-h-[250px] p-4',\n 'prose prose-sm max-w-none',\n // Baseline block styles: Tailwind preflight strips heading,\n // list and quote styling, and the `prose` classes above only\n // work when the host installs @tailwindcss/typography —\n // without these, block formats would apply invisibly.\n '[&_h1]:my-3 [&_h1]:text-2xl [&_h1]:font-bold',\n '[&_h2]:my-3 [&_h2]:text-xl [&_h2]:font-bold',\n '[&_h3]:my-2 [&_h3]:text-lg [&_h3]:font-semibold',\n '[&_ul]:my-2 [&_ul]:list-disc [&_ul]:ps-6',\n '[&_ol]:my-2 [&_ol]:list-decimal [&_ol]:ps-6',\n '[&_blockquote]:border-border [&_blockquote]:text-muted-foreground [&_blockquote]:my-2 [&_blockquote]:border-s-4 [&_blockquote]:ps-3',\n blockMenu && !macrosResting && 'ps-10',\n // Tall enough for the docked panel's search plus a few rows\n // without forcing the host form to scroll; the compact panel\n // is just rows, so it needs far less.\n hasMacros &&\n macrosOpen &&\n (compactMacros ? 'md:min-h-[140px]' : 'md:min-h-[250px]'),\n // Focus mode grows the field from one row on focus (and, with\n // the block gutter, indents it) — ease the jump instead of\n // snapping.\n hasMacros &&\n macrosOnFocus &&\n 'transition-[min-height,padding] duration-200 ease-out motion-reduce:transition-none',\n disabled &&\n 'bg-muted/20 cursor-not-allowed text-neutral-700 dark:text-neutral-300',\n editorClassName\n )}\n style={editorStyle}\n suppressContentEditableWarning\n />\n </div>\n\n {hasMacros && (\n <AnimatedPresence>\n {macrosOpen && (\n <Animated\n key=\"macro-panel\"\n // In-flow on mobile: `collapse` animates real height so the\n // field shrinks with the panel. `collapse` is a plain value\n // animation that reduced-motion config does not drop, so\n // honor the preference here (the side panel's `menu` nudge\n // is covered by the provider).\n preset={macroSidePanel ? 'menu' : 'collapse'}\n enabled={macroSidePanel || !prefersReducedMotion}\n mode=\"presence\"\n // The side the panel occupies, resolved to a physical edge\n // so the closed nudge retreats toward the editor.\n custom={\n typeof document !== 'undefined' && document.dir === 'rtl'\n ? 'left'\n : 'right'\n }\n fallbackClassName=\"animate-fade-in\"\n className=\"border-border flex max-h-72 flex-col overflow-hidden border-t md:absolute md:inset-y-0 md:end-0 md:max-h-none md:w-72 md:overflow-visible md:border-s md:border-t-0\"\n >\n <MacroLibrary\n id={macroPanelId}\n groups={macros!}\n onSelect={insertMacro}\n targetLabel={ariaLabel ?? placeholder}\n onClose={\n // Focus mode: visibility follows focus; a close that\n // refocuses the editor would just reopen the panel.\n macrosOnFocus\n ? undefined\n : () => {\n setMacrosOpen(false);\n // Selecting text in the panel moves the document\n // selection; put the caret back where the user\n // left it.\n focusRestoringSelection();\n }\n }\n onCreateMacro={onCreateMacro}\n labels={macroLabels}\n compact={compactMacros}\n className=\"min-h-0 flex-1\"\n />\n </Animated>\n )}\n </AnimatedPresence>\n )}\n </div>\n </div>\n );\n }\n);\n\nRichTextEditor.displayName = 'RichTextEditor';\n\nexport { RichTextEditor };\n"]}
@@ -1,7 +1,7 @@
1
1
  import { Tabs, TabsList, TabsTrigger, TabsContent } from './chunk-ME7EVT6F.js';
2
2
  import { Switch } from './chunk-AQ564XO7.js';
3
- import { Textarea } from './chunk-L52HKEUD.js';
4
- import { RichTextEditor } from './chunk-JN2CL7MK.js';
3
+ import { Textarea } from './chunk-4SUEBKTY.js';
4
+ import { RichTextEditor } from './chunk-EWPNM6OO.js';
5
5
  import { Select } from './chunk-VCI2Y7ST.js';
6
6
  import { Input } from './chunk-3IMM2PM4.js';
7
7
  import { useLiveAnnouncement } from './chunk-HNXLLDPN.js';
@@ -2536,5 +2536,5 @@ var EmailEditor = React3.forwardRef(
2536
2536
  EmailEditor.displayName = "EmailEditor";
2537
2537
 
2538
2538
  export { EMAIL_BLOCK_TYPES, EmailEditor, createDefaultDesignSettings, createEmailBlock, createEmailHtmlSanitizer, createEmptyEmailContentTree, defaultEmailEditorLabels, generateEmailBlockId, renderEmailMjml };
2539
- //# sourceMappingURL=chunk-JQAGNAY2.js.map
2540
- //# sourceMappingURL=chunk-JQAGNAY2.js.map
2539
+ //# sourceMappingURL=chunk-EX7Q5545.js.map
2540
+ //# sourceMappingURL=chunk-EX7Q5545.js.map