@mieweb/ui 0.11.0-dev.44 → 0.11.0-dev.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ag-grid.cjs +2 -2
- package/dist/ag-grid.js +1 -1
- package/dist/{chunk-AHYDJN4H.cjs → chunk-2XHPPOXY.cjs} +32 -32
- package/dist/{chunk-AHYDJN4H.cjs.map → chunk-2XHPPOXY.cjs.map} +1 -1
- package/dist/{chunk-3IKIRGHI.cjs → chunk-3H6BQV2D.cjs} +6 -6
- package/dist/{chunk-3IKIRGHI.cjs.map → chunk-3H6BQV2D.cjs.map} +1 -1
- package/dist/{chunk-IIV5GNSK.cjs → chunk-3PT4B4JT.cjs} +4 -4
- package/dist/{chunk-IIV5GNSK.cjs.map → chunk-3PT4B4JT.cjs.map} +1 -1
- package/dist/{chunk-GLG6UE2H.cjs → chunk-3SEQVGLH.cjs} +4 -4
- package/dist/{chunk-GLG6UE2H.cjs.map → chunk-3SEQVGLH.cjs.map} +1 -1
- package/dist/{chunk-JUY2JLFL.js → chunk-3XDU7XIC.js} +3 -3
- package/dist/{chunk-JUY2JLFL.js.map → chunk-3XDU7XIC.js.map} +1 -1
- package/dist/{chunk-LQ22CY7X.js → chunk-46ZUORUE.js} +5 -5
- package/dist/{chunk-LQ22CY7X.js.map → chunk-46ZUORUE.js.map} +1 -1
- package/dist/{chunk-CKECOCYJ.js → chunk-4IOIDS2Z.js} +3 -3
- package/dist/{chunk-CKECOCYJ.js.map → chunk-4IOIDS2Z.js.map} +1 -1
- package/dist/{chunk-F7SZSOB3.js → chunk-6PCA5H47.js} +3 -3
- package/dist/{chunk-F7SZSOB3.js.map → chunk-6PCA5H47.js.map} +1 -1
- package/dist/{chunk-ULEX7OOJ.js → chunk-6Y6W5DUY.js} +4 -4
- package/dist/{chunk-ULEX7OOJ.js.map → chunk-6Y6W5DUY.js.map} +1 -1
- package/dist/{chunk-S7AMZ4RD.cjs → chunk-7K6SW4VB.cjs} +4 -4
- package/dist/{chunk-S7AMZ4RD.cjs.map → chunk-7K6SW4VB.cjs.map} +1 -1
- package/dist/{chunk-KY67AMQ5.cjs → chunk-7MF3O3BU.cjs} +4 -4
- package/dist/{chunk-KY67AMQ5.cjs.map → chunk-7MF3O3BU.cjs.map} +1 -1
- package/dist/{chunk-Z3WMDVMR.cjs → chunk-7QNBPB7F.cjs} +9 -5
- package/dist/chunk-7QNBPB7F.cjs.map +1 -0
- package/dist/{chunk-YFWDS6MX.js → chunk-AB24H2RM.js} +3 -3
- package/dist/{chunk-YFWDS6MX.js.map → chunk-AB24H2RM.js.map} +1 -1
- package/dist/{chunk-DIIXY6EB.js → chunk-AQBZEN43.js} +5 -5
- package/dist/{chunk-DIIXY6EB.js.map → chunk-AQBZEN43.js.map} +1 -1
- package/dist/{chunk-2W73UQ3T.js → chunk-BPYI7BDC.js} +3 -3
- package/dist/{chunk-2W73UQ3T.js.map → chunk-BPYI7BDC.js.map} +1 -1
- package/dist/{chunk-7U7SONM5.js → chunk-CVCUQ2MZ.js} +3 -3
- package/dist/{chunk-7U7SONM5.js.map → chunk-CVCUQ2MZ.js.map} +1 -1
- package/dist/{chunk-PWXDRFJL.cjs → chunk-DHEOWRIE.cjs} +6 -6
- package/dist/{chunk-PWXDRFJL.cjs.map → chunk-DHEOWRIE.cjs.map} +1 -1
- package/dist/{chunk-OYUIEJPN.js → chunk-GTRYDFMT.js} +38 -10
- package/dist/chunk-GTRYDFMT.js.map +1 -0
- package/dist/{chunk-2FZYZ4HT.cjs → chunk-HDSYYQYM.cjs} +4 -4
- package/dist/{chunk-2FZYZ4HT.cjs.map → chunk-HDSYYQYM.cjs.map} +1 -1
- package/dist/{chunk-HH7PWD5I.cjs → chunk-HOE2U27V.cjs} +21 -21
- package/dist/{chunk-HH7PWD5I.cjs.map → chunk-HOE2U27V.cjs.map} +1 -1
- package/dist/{chunk-JCIQIR5V.js → chunk-IGUDEWIW.js} +4 -4
- package/dist/{chunk-JCIQIR5V.js.map → chunk-IGUDEWIW.js.map} +1 -1
- package/dist/{chunk-2KK4WZ7Y.cjs → chunk-IKHK4GTF.cjs} +4 -4
- package/dist/{chunk-2KK4WZ7Y.cjs.map → chunk-IKHK4GTF.cjs.map} +1 -1
- package/dist/{chunk-YVKBXNPK.js → chunk-JBNQ2L3K.js} +10 -6
- package/dist/chunk-JBNQ2L3K.js.map +1 -0
- package/dist/{chunk-GU6TPVXF.cjs → chunk-JK2IWOI7.cjs} +6 -6
- package/dist/{chunk-GU6TPVXF.cjs.map → chunk-JK2IWOI7.cjs.map} +1 -1
- package/dist/{chunk-TZKBW4GA.cjs → chunk-K76UNS22.cjs} +6 -6
- package/dist/{chunk-TZKBW4GA.cjs.map → chunk-K76UNS22.cjs.map} +1 -1
- package/dist/{chunk-DAAJ3B2T.js → chunk-KP72MDFB.js} +4 -4
- package/dist/{chunk-DAAJ3B2T.js.map → chunk-KP72MDFB.js.map} +1 -1
- package/dist/{chunk-MLCIINXT.js → chunk-LBUXS6FJ.js} +4 -4
- package/dist/{chunk-MLCIINXT.js.map → chunk-LBUXS6FJ.js.map} +1 -1
- package/dist/{chunk-GG3IK5TL.cjs → chunk-MQK2D6I6.cjs} +9 -9
- package/dist/{chunk-GG3IK5TL.cjs.map → chunk-MQK2D6I6.cjs.map} +1 -1
- package/dist/{chunk-IPHJQ6CF.js → chunk-MQSGJB2B.js} +5 -5
- package/dist/{chunk-IPHJQ6CF.js.map → chunk-MQSGJB2B.js.map} +1 -1
- package/dist/{chunk-2GBVJHWN.cjs → chunk-NH5JOZLG.cjs} +13 -13
- package/dist/{chunk-2GBVJHWN.cjs.map → chunk-NH5JOZLG.cjs.map} +1 -1
- package/dist/{chunk-NWU634SO.cjs → chunk-O2EAHOXM.cjs} +4 -4
- package/dist/{chunk-NWU634SO.cjs.map → chunk-O2EAHOXM.cjs.map} +1 -1
- package/dist/{chunk-JUYBJLPI.cjs → chunk-O7Y56J4R.cjs} +4 -4
- package/dist/{chunk-JUYBJLPI.cjs.map → chunk-O7Y56J4R.cjs.map} +1 -1
- package/dist/{chunk-EAAVFTKI.cjs → chunk-OJ2NCQ2R.cjs} +14 -14
- package/dist/{chunk-EAAVFTKI.cjs.map → chunk-OJ2NCQ2R.cjs.map} +1 -1
- package/dist/{chunk-GLRKXJCR.js → chunk-OX32ITWC.js} +3 -3
- package/dist/{chunk-GLRKXJCR.js.map → chunk-OX32ITWC.js.map} +1 -1
- package/dist/{chunk-L4APW65W.cjs → chunk-PJ4XEBMU.cjs} +4 -4
- package/dist/{chunk-L4APW65W.cjs.map → chunk-PJ4XEBMU.cjs.map} +1 -1
- package/dist/{chunk-OZKJYLN6.js → chunk-PSCSU63K.js} +3 -3
- package/dist/{chunk-OZKJYLN6.js.map → chunk-PSCSU63K.js.map} +1 -1
- package/dist/{chunk-EI4JU5JF.js → chunk-RKM4VGAN.js} +3 -3
- package/dist/{chunk-EI4JU5JF.js.map → chunk-RKM4VGAN.js.map} +1 -1
- package/dist/{chunk-ME7EVT6F.js → chunk-RYGVILUR.js} +3 -3
- package/dist/{chunk-ME7EVT6F.js.map → chunk-RYGVILUR.js.map} +1 -1
- package/dist/{chunk-EGPDT7SM.js → chunk-S7NJV335.js} +3 -3
- package/dist/{chunk-EGPDT7SM.js.map → chunk-S7NJV335.js.map} +1 -1
- package/dist/{chunk-AHT2HRHC.cjs → chunk-TNRANQVI.cjs} +16 -16
- package/dist/{chunk-AHT2HRHC.cjs.map → chunk-TNRANQVI.cjs.map} +1 -1
- package/dist/{chunk-TERHGQ73.cjs → chunk-U7XWWU5H.cjs} +5 -5
- package/dist/{chunk-TERHGQ73.cjs.map → chunk-U7XWWU5H.cjs.map} +1 -1
- package/dist/{chunk-G35LXI2A.js → chunk-UIFN2LYT.js} +3 -3
- package/dist/{chunk-G35LXI2A.js.map → chunk-UIFN2LYT.js.map} +1 -1
- package/dist/{chunk-L3CAWGBU.js → chunk-UQAWXY6R.js} +3 -3
- package/dist/{chunk-L3CAWGBU.js.map → chunk-UQAWXY6R.js.map} +1 -1
- package/dist/{chunk-ZULFKL3C.js → chunk-VOPRL4RF.js} +7 -7
- package/dist/{chunk-ZULFKL3C.js.map → chunk-VOPRL4RF.js.map} +1 -1
- package/dist/{chunk-KB2PLV5Q.js → chunk-VQGRMCVT.js} +4 -4
- package/dist/{chunk-KB2PLV5Q.js.map → chunk-VQGRMCVT.js.map} +1 -1
- package/dist/{chunk-MD55WRGN.cjs → chunk-X6THHGTZ.cjs} +37 -37
- package/dist/{chunk-MD55WRGN.cjs.map → chunk-X6THHGTZ.cjs.map} +1 -1
- package/dist/{chunk-Q6QLGCL7.cjs → chunk-XCCH5KHW.cjs} +9 -9
- package/dist/{chunk-Q6QLGCL7.cjs.map → chunk-XCCH5KHW.cjs.map} +1 -1
- package/dist/{chunk-KQXD6BFO.cjs → chunk-XM3D4KAF.cjs} +9 -9
- package/dist/{chunk-KQXD6BFO.cjs.map → chunk-XM3D4KAF.cjs.map} +1 -1
- package/dist/{chunk-PINIBEIU.cjs → chunk-XRXOGMMG.cjs} +39 -11
- package/dist/chunk-XRXOGMMG.cjs.map +1 -0
- package/dist/{chunk-XPWFIDZM.cjs → chunk-XU3X2AUL.cjs} +4 -4
- package/dist/{chunk-XPWFIDZM.cjs.map → chunk-XU3X2AUL.cjs.map} +1 -1
- package/dist/{chunk-3A4N5E6P.js → chunk-XZ65FX6T.js} +3 -3
- package/dist/{chunk-3A4N5E6P.js.map → chunk-XZ65FX6T.js.map} +1 -1
- package/dist/{chunk-CRR7AE5D.js → chunk-Z6I4XFPC.js} +3 -3
- package/dist/{chunk-CRR7AE5D.js.map → chunk-Z6I4XFPC.js.map} +1 -1
- package/dist/{chunk-LTCHD3K5.cjs → chunk-Z7ZOSENN.cjs} +5 -5
- package/dist/{chunk-LTCHD3K5.cjs.map → chunk-Z7ZOSENN.cjs.map} +1 -1
- package/dist/{chunk-NZUQL42A.cjs → chunk-ZDA6FEKA.cjs} +5 -5
- package/dist/{chunk-NZUQL42A.cjs.map → chunk-ZDA6FEKA.cjs.map} +1 -1
- package/dist/{chunk-UY2EZYIC.js → chunk-ZSBG6C3P.js} +3 -3
- package/dist/{chunk-UY2EZYIC.js.map → chunk-ZSBG6C3P.js.map} +1 -1
- package/dist/{chunk-KAQNYX7B.js → chunk-ZVRJVUFX.js} +3 -3
- package/dist/{chunk-KAQNYX7B.js.map → chunk-ZVRJVUFX.js.map} +1 -1
- package/dist/components/AudioPlayer/index.cjs +7 -7
- package/dist/components/AudioPlayer/index.js +2 -2
- package/dist/components/BoardView/index.cjs +5 -5
- package/dist/components/BoardView/index.js +2 -2
- package/dist/components/CollabStatus/index.cjs +5 -5
- package/dist/components/CollabStatus/index.js +2 -2
- package/dist/components/Dropdown/index.cjs +9 -9
- package/dist/components/Dropdown/index.d.cts +6 -1
- package/dist/components/Dropdown/index.d.ts +6 -1
- package/dist/components/Dropdown/index.js +2 -2
- package/dist/components/EmailEditor/index.cjs +16 -16
- package/dist/components/EmailEditor/index.js +7 -7
- package/dist/components/MediaEditor/index.cjs +10 -10
- package/dist/components/MediaEditor/index.js +5 -5
- package/dist/components/MediaFeed/index.cjs +6 -6
- package/dist/components/MediaFeed/index.js +5 -5
- package/dist/components/MediaPlayer/index.cjs +8 -8
- package/dist/components/MediaPlayer/index.js +4 -4
- package/dist/components/MegaMenu/index.cjs +5 -5
- package/dist/components/MegaMenu/index.js +2 -2
- package/dist/components/RecordHeader/index.cjs +5 -5
- package/dist/components/RecordHeader/index.js +3 -3
- package/dist/components/RecordLayout/index.cjs +5 -5
- package/dist/components/RecordLayout/index.js +3 -3
- package/dist/components/RichTextEditor/index.cjs +6 -6
- package/dist/components/RichTextEditor/index.js +3 -3
- package/dist/components/Slider/index.cjs +6 -6
- package/dist/components/Slider/index.js +2 -2
- package/dist/components/SliderCalculator/index.cjs +5 -5
- package/dist/components/SliderCalculator/index.js +3 -3
- package/dist/components/SuperChat/index.cjs +23 -23
- package/dist/components/SuperChat/index.js +8 -8
- package/dist/components/SuperChat/plugins/index.cjs +5 -5
- package/dist/components/SuperChat/plugins/index.js +4 -4
- package/dist/components/Tabs/index.cjs +8 -8
- package/dist/components/Tabs/index.js +2 -2
- package/dist/components/Textarea/index.cjs +8 -8
- package/dist/components/Textarea/index.js +5 -5
- package/dist/components/ThemeProvider/index.cjs +9 -9
- package/dist/components/ThemeProvider/index.js +3 -3
- package/dist/components/Tooltip/index.cjs +3 -3
- package/dist/components/Tooltip/index.js +2 -2
- package/dist/components/ViewSet/index.cjs +5 -5
- package/dist/components/ViewSet/index.js +4 -4
- package/dist/components/ViewSwitcher/index.cjs +4 -4
- package/dist/components/ViewSwitcher/index.js +2 -2
- package/dist/deck.cjs +3 -3
- package/dist/deck.js +1 -1
- package/dist/esheet.cjs +107 -107
- package/dist/esheet.js +10 -10
- package/dist/hooks/index.cjs +5 -5
- package/dist/hooks/index.js +1 -1
- package/dist/index.cjs +284 -284
- package/dist/index.d.cts +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +40 -40
- package/dist/kerebron.cjs +6 -6
- package/dist/kerebron.js +4 -4
- package/dist/{model-5PB6KNYH.cjs → model-2TISYEYF.cjs} +20 -20
- package/dist/{model-5PB6KNYH.cjs.map → model-2TISYEYF.cjs.map} +1 -1
- package/dist/{model-OGWTZEXR.js → model-BCS5BUK3.js} +6 -6
- package/dist/{model-OGWTZEXR.js.map → model-BCS5BUK3.js.map} +1 -1
- package/dist/org-chart.cjs +2 -2
- package/dist/org-chart.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-OYUIEJPN.js.map +0 -1
- package/dist/chunk-PINIBEIU.cjs.map +0 -1
- package/dist/chunk-YVKBXNPK.js.map +0 -1
- package/dist/chunk-Z3WMDVMR.cjs.map +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { RichEditor } from './chunk-NIE3WBJH.js';
|
|
2
|
-
import { processDictation, MacroLibrary } from './chunk-
|
|
2
|
+
import { processDictation, MacroLibrary } from './chunk-XZ65FX6T.js';
|
|
3
3
|
import { useMessages } from './chunk-5YOT4DVH.js';
|
|
4
|
-
import { Dropdown, DropdownItem, DropdownSeparator, DropdownSubmenu, DropdownLabel } from './chunk-
|
|
4
|
+
import { Dropdown, DropdownItem, DropdownSeparator, DropdownSubmenu, DropdownLabel } from './chunk-GTRYDFMT.js';
|
|
5
5
|
import { useMediaQuery } from './chunk-HTZ27DGZ.js';
|
|
6
6
|
import { usePrefersReducedMotion } from './chunk-XDU65GLW.js';
|
|
7
|
-
import { useDirection } from './chunk-
|
|
7
|
+
import { useDirection } from './chunk-JBNQ2L3K.js';
|
|
8
8
|
import { Button } from './chunk-WX2XB6FP.js';
|
|
9
9
|
import { AnimatedPresence, Animated } from './chunk-F4N67NAF.js';
|
|
10
10
|
import { cn } from './chunk-TQONQSJO.js';
|
|
@@ -1180,5 +1180,5 @@ var TextAreaRichKerebron = React2.forwardRef(
|
|
|
1180
1180
|
TextAreaRichKerebron.displayName = "TextAreaRichKerebron";
|
|
1181
1181
|
|
|
1182
1182
|
export { CodeEditor, TextAreaRichKerebron };
|
|
1183
|
-
//# sourceMappingURL=chunk-
|
|
1184
|
-
//# sourceMappingURL=chunk-
|
|
1183
|
+
//# sourceMappingURL=chunk-MQSGJB2B.js.map
|
|
1184
|
+
//# sourceMappingURL=chunk-MQSGJB2B.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/RichEditor/CodeEditor.tsx","../src/components/TextAreaRich/speech.ts","../src/components/TextAreaRich/TextAreaRichKerebron.tsx"],"names":["view","toolbar","value","jsx","Fragment"],"mappings":"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","file":"chunk-IPHJQ6CF.js","sourcesContent":["import React, { useEffect, useRef } from 'react';\n\nimport { CoreEditor } from '@kerebron/editor';\nimport { CodeEditorKit } from '@kerebron/editor-kits/CodeEditorKit';\nimport { createAssetLoad } from '@kerebron/wasm/web';\n\nexport interface CodeEditorProps {\n /** Initial source code to load into the editor. */\n value?: string;\n /** Called with the editor's contents whenever they change. */\n onChange?: (value: string) => void;\n /** Language/grammar to use for syntax highlighting. Defaults to `typescript`. */\n lang?: string;\n}\n\nconst CodeEditor: React.FC<CodeEditorProps> = ({\n value = '',\n onChange,\n lang = 'typescript',\n}) => {\n const editorRef = useRef<HTMLDivElement>(null);\n const editorInstance = useRef<CoreEditor | null>(null);\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n useEffect(() => {\n const root = editorRef.current;\n if (!root) return;\n\n const applySelectLabel = () => {\n root.querySelectorAll('select.codejar-select').forEach((element) => {\n if (!element.getAttribute('aria-label')) {\n element.setAttribute('aria-label', 'Code editor language');\n }\n });\n };\n\n applySelectLabel();\n const observer = new MutationObserver(() => applySelectLabel());\n observer.observe(root, { childList: true, subtree: true });\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (!editorRef.current) return;\n\n // Initialize the editor\n const editor = CoreEditor.create({\n element: editorRef.current,\n uri: 'file:///untitled.ts',\n assetLoad: createAssetLoad('/kerebron-wasm'),\n editorKits: [new CodeEditorKit(lang)],\n });\n\n editorInstance.current = editor;\n\n // Surface edits to callers.\n const onTransaction = async () => {\n if (!editorInstance.current) return;\n\n try {\n const buffer = await editorInstance.current.saveDocument('text/plain');\n onChangeRef.current?.(new globalThis.TextDecoder().decode(buffer));\n } catch (err) {\n console.error('Failed to read code:', err);\n }\n };\n\n editor.addEventListener('transaction', onTransaction);\n\n // Seed initial content on mount.\n if (value) {\n editor\n .loadDocumentText('text/plain', value)\n .catch((err) => console.error('Failed to load code:', err));\n }\n\n // Cleanup on unmount\n return () => {\n editor.removeEventListener('transaction', onTransaction);\n editor.destroy();\n };\n // Initial `value`/`lang` are intentionally only applied on mount.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <div>\n <div>\n <div ref={editorRef} className=\"kb-component\" />\n </div>\n </div>\n );\n};\n\nCodeEditor.displayName = 'CodeEditor';\n\nexport { CodeEditor };\n","/**\n * Minimal Web Speech API surface used for dictation. Mirrors the private\n * typings in `RichTextEditor` (the legacy engine keeps its own copy until it\n * is retired) — lib.dom omits these because browser support is uneven.\n */\nexport interface SpeechRecognitionResultLike {\n isFinal: boolean;\n 0: { transcript: string };\n}\nexport interface SpeechRecognitionEventLike {\n resultIndex: number;\n results: ArrayLike<SpeechRecognitionResultLike>;\n}\nexport interface SpeechRecognitionErrorEventLike {\n error: string;\n}\nexport interface 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}\nexport type SpeechRecognitionCtor = new () => SpeechRecognitionLike;\ninterface SpeechWindow {\n SpeechRecognition?: SpeechRecognitionCtor;\n webkitSpeechRecognition?: SpeechRecognitionCtor;\n}\n\n/** The browser's SpeechRecognition constructor, when dictation is available. */\nexport function getSpeechRecognition(): SpeechRecognitionCtor | undefined {\n if (typeof window === 'undefined') return undefined;\n const w = window as unknown as SpeechWindow;\n return w.SpeechRecognition || w.webkitSpeechRecognition;\n}\n","import * as React from 'react';\nimport { Plugin, TextSelection } from 'prosemirror-state';\nimport type { Transaction } from 'prosemirror-state';\nimport type { Node as PMNode } from 'prosemirror-model';\nimport type { EditorView } from 'prosemirror-view';\nimport { Extension, type CoreEditor, type EditorKit } from '@kerebron/editor';\nimport { MenuItem } from '@kerebron/extension-menu';\nimport { Plus } from 'lucide-react';\n\nimport { cn } from '../../utils/cn';\nimport { useMessages } from '../../utils/messages';\nimport { Button } from '../Button';\nimport {\n Dropdown,\n DropdownItem,\n DropdownLabel,\n DropdownSeparator,\n DropdownSubmenu,\n} from '../Dropdown';\nimport { MacroLibrary, type Macro } from '../MacroLibrary';\nimport { Animated, AnimatedPresence } from '../../motion';\nimport { useDirection } from '../../hooks/useDirection';\nimport { useMediaQuery } from '../../hooks/useMediaQuery';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\nimport {\n RichEditor,\n type RichEditorHandle,\n type MenuElement,\n type ModifyMenu,\n} from '../RichEditor';\nimport {\n processDictation,\n type RichTextEditorBlockMenuLabels,\n type RichTextVariable,\n} from '../RichTextEditor';\nimport type { TextAreaRichProps } from './TextAreaRich';\nimport { getSpeechRecognition, type SpeechRecognitionLike } from './speech';\n\n/**\n * Kerebron-backed TextAreaRich surface: ProseMirror underneath, the stock\n * Kerebron toolbar (hidden until requested), the block gutter menu, docked\n * macro panel, `.shortcut` expansion and dictation — same `TextAreaRichProps`\n * contract (`value`/`onChange` carry HTML) as the legacy surface, but\n * strictly controlled like a native input: an edit that `onChange` does not\n * echo back into `value` reverts (see {@link RichEditorProps.strictValue}).\n *\n * Exported as `TextAreaRich` from `@mieweb/ui/kerebron`, and the engine\n * behind the main bundle's `Textarea` — which is why the `@kerebron/*`\n * runtime peers are required: hosts install them and load\n * `@mieweb/ui/kerebron.css`. (Only the Yjs collab peers remain optional.)\n */\n\n/** Carries our keydown behaviors (macro shortcuts, Ctrl+/) into the editor. */\nclass TextAreaRichExtension extends Extension {\n name = 'textAreaRichShortcuts';\n constructor(\n private readonly onKeyDown: (\n view: EditorView,\n event: KeyboardEvent\n ) => boolean\n ) {\n super({});\n }\n override getProseMirrorPlugins(): Plugin[] {\n return [new Plugin({ props: { handleKeyDown: this.onKeyDown } })];\n }\n}\n\n/**\n * `CoreEditor.view` is typed `EditorView | DummyEditorView` (the dummy exists\n * only until `create()` returns, which is before `onReady` ever fires), so\n * every ready-time consumer can treat it as the real view.\n */\nconst viewOf = (editor: CoreEditor) => editor.view as EditorView;\n\n/**\n * CSS properties whose numeric values are valid without a `px` unit —\n * React's full unitless list, so `editorStyle` keeps the React.CSSProperties\n * contract (`{ flex: 1 }` must not become `flex: 1px`).\n */\nconst UNITLESS_STYLE_PROPS = new Set([\n 'animationIterationCount',\n 'aspectRatio',\n 'borderImageOutset',\n 'borderImageSlice',\n 'borderImageWidth',\n 'boxFlex',\n 'boxFlexGroup',\n 'boxOrdinalGroup',\n 'columnCount',\n 'columns',\n 'flex',\n 'flexGrow',\n 'flexPositive',\n 'flexShrink',\n 'flexNegative',\n 'flexOrder',\n 'fontWeight',\n 'gridArea',\n 'gridRow',\n 'gridRowEnd',\n 'gridRowSpan',\n 'gridRowStart',\n 'gridColumn',\n 'gridColumnEnd',\n 'gridColumnSpan',\n 'gridColumnStart',\n 'lineClamp',\n 'lineHeight',\n 'opacity',\n 'order',\n 'orphans',\n 'tabSize',\n 'widows',\n 'zIndex',\n 'zoom',\n // SVG-related\n 'fillOpacity',\n 'floodOpacity',\n 'stopOpacity',\n 'strokeDasharray',\n 'strokeDashoffset',\n 'strokeMiterlimit',\n 'strokeOpacity',\n 'strokeWidth',\n]);\n\n/**\n * Replace `[from, to]` (defaults: the current selection) with plain text,\n * mapping `\\n` to hard breaks, and put the caret after the insertion.\n */\nfunction insertPlainText(\n view: EditorView,\n text: string,\n from = view.state.selection.from,\n to = view.state.selection.to\n) {\n const { schema, selection, storedMarks } = view.state;\n // Typing at this caret would inherit the active marks (pending toggles\n // or the formatting at the position); composed insertions — dictation,\n // macros, shortcut phrases — must match instead of stripping them.\n const marks =\n (from === selection.from && to === selection.to ? storedMarks : null) ??\n view.state.doc.resolve(from).marks();\n const br = schema.nodes.br ?? schema.nodes.hard_break;\n const lines = text.replace(/\\r\\n?/g, '\\n').split('\\n');\n const nodes: PMNode[] = [];\n lines.forEach((line, index) => {\n if (index > 0) {\n if (br) nodes.push(br.create(null, null, marks));\n else if (line) nodes.push(schema.text(' ', marks));\n }\n if (line) nodes.push(schema.text(line, marks));\n });\n let tr = view.state.tr.replaceWith(from, to, nodes);\n const end = Math.min(\n from + nodes.reduce((size, node) => size + node.nodeSize, 0),\n tr.doc.content.size\n );\n tr = tr.setSelection(TextSelection.near(tr.doc.resolve(end)));\n view.dispatch(tr.scrollIntoView());\n}\n\n/** One empty textblock — the ProseMirror notion of \"nothing typed yet\". */\nfunction docIsEmpty(view: EditorView) {\n const { doc } = view.state;\n return (\n doc.childCount === 1 &&\n !!doc.firstChild &&\n doc.firstChild.isTextblock &&\n doc.firstChild.content.size === 0\n );\n}\n\n/** Gutter menu rows → Kerebron command names. */\nconst BLOCK_FORMAT_ITEMS: Array<{\n key: keyof RichTextEditorBlockMenuLabels;\n label: string;\n command: string;\n}> = [\n { key: 'text', label: 'Text', command: 'setParagraph' },\n { key: 'heading1', label: 'Heading 1', command: 'setHeading1' },\n { key: 'heading2', label: 'Heading 2', command: 'setHeading2' },\n { key: 'heading3', label: 'Heading 3', command: 'setHeading3' },\n { key: 'bulletList', label: 'Bullet list', command: 'toggleBulletList' },\n { key: 'numberedList', label: 'Numbered list', command: 'toggleOrderedList' },\n { key: 'quote', label: 'Quote', command: 'toggleBlockquote' },\n];\n\nconst TextAreaRichKerebron = React.forwardRef<\n HTMLDivElement,\n TextAreaRichProps\n>(\n (\n {\n value = '',\n onChange,\n placeholder,\n className,\n enableDictation = true,\n onDictationError,\n disabled = false,\n macros,\n defaultMacrosOpen = false,\n macrosOnFocus = false,\n compactMacros = false,\n onMacroInsert,\n macroLabels,\n onCreateMacro,\n variableGroups,\n toolbar,\n defaultToolbar = 'hidden',\n onToolbarChange,\n blockMenuLabels,\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 inert = disabled || readOnly;\n\n const wrapperRef = React.useRef<HTMLDivElement>(null);\n const gutterWrapperRef = React.useRef<HTMLDivElement>(null);\n const editorHandleRef = React.useRef<RichEditorHandle>(null);\n const editorRef = React.useRef<CoreEditor | null>(null);\n const [ready, setReady] = React.useState(false);\n // Hosts reach the editable region through the ref (focus, `dir`,\n // ARIA attributes), as with the legacy surface's contenteditable; the\n // wrapper only stands in until the editor mounts.\n React.useImperativeHandle(\n ref,\n () =>\n ready && editorRef.current\n ? (viewOf(editorRef.current).dom as HTMLDivElement)\n : wrapperRef.current!,\n [ready]\n );\n\n const [macrosOpen, setMacrosOpen] = React.useState(\n defaultMacrosOpen && !macrosOnFocus\n );\n const [uncontrolledToolbar, setUncontrolledToolbar] =\n React.useState(defaultToolbar);\n const toolbarVisible = (toolbar ?? uncontrolledToolbar) === 'visible';\n const [isListening, setIsListening] = React.useState(false);\n const [speechSupported, setSpeechSupported] = React.useState(false);\n const [isEmpty, setIsEmpty] = React.useState(true);\n // Offset of the editable below the (optional) toolbar, inside the wrapper.\n const [editorTop, setEditorTop] = React.useState(0);\n const [blockMenuOpen, setBlockMenuOpen] = React.useState(false);\n const [gutterTop, setGutterTop] = React.useState(4);\n const [variablesOpen, setVariablesOpen] = React.useState(false);\n // The toolbar's Variables button rect (relative to the gutter wrapper):\n // the searchable Dropdown anchors a React trigger exactly over it.\n const [variablesAnchor, setVariablesAnchor] = React.useState<{\n top: number;\n left: number;\n width: number;\n height: number;\n } | null>(null);\n\n const recognitionRef = React.useRef<SpeechRecognitionLike | null>(null);\n const isListeningRef = React.useRef(false);\n const shouldRestartRef = React.useRef(false);\n // Invalidates dictation starts still awaiting microphone permission.\n const dictationSessionRef = React.useRef(0);\n const hoverBlockRef = React.useRef<HTMLElement | null>(null);\n const blockTargetPosRef = React.useRef<number | null>(null);\n const firstBlockItemRef = React.useRef<HTMLButtonElement>(null);\n const macroPanelId = React.useId();\n\n const macroSidePanel = useMediaQuery('(min-width: 768px)');\n const prefersReducedMotion = usePrefersReducedMotion();\n // The field's inherited direction (not the document's): a local\n // dir=\"rtl\" subtree docks the panel at inline-end = left, so the motion\n // preset must slide it in from the same side.\n const direction = useDirection(wrapperRef);\n\n const hasMacros = Boolean(macros);\n const hasMacroEntries = Boolean(\n macros?.some((group) => group.macros.length > 0)\n );\n const hasVariables = Boolean(variableGroups && variableGroups.length > 0);\n // The gutter `+` stays discoverable on hover even while a focus-docked\n // field rests as a one-line input.\n const gutterActive = !inert;\n\n // Mount-time closures (the toolbar and keydown plugin are built once)\n // read the latest props/state through refs.\n const macrosRef = React.useRef(macros);\n macrosRef.current = macros;\n const hasMacrosRef = React.useRef(hasMacros);\n hasMacrosRef.current = hasMacros;\n const hasVariablesRef = React.useRef(hasVariables);\n hasVariablesRef.current = hasVariables;\n const variablesOpenRef = React.useRef(variablesOpen);\n variablesOpenRef.current = variablesOpen;\n const onMacroInsertRef = React.useRef(onMacroInsert);\n onMacroInsertRef.current = onMacroInsert;\n const onChangeRef = React.useRef(onChange);\n onChangeRef.current = onChange;\n const inertRef = React.useRef(inert);\n inertRef.current = inert;\n const macrosOpenRef = React.useRef(macrosOpen);\n macrosOpenRef.current = macrosOpen;\n const toolbarVisibleRef = React.useRef(toolbarVisible);\n toolbarVisibleRef.current = toolbarVisible;\n const dictationAvailableRef = React.useRef(false);\n dictationAvailableRef.current = enableDictation && speechSupported;\n const onDictationErrorRef = React.useRef(onDictationError);\n onDictationErrorRef.current = onDictationError;\n // Dictation labels have no prop route (macro labels do), so the host's\n // MessagesProvider is the translation path — like RichTextEditor's.\n const m = useMessages();\n\n const reportError = (message: string) => {\n if (onDictationErrorRef.current) onDictationErrorRef.current(message);\n else if (typeof console !== 'undefined') console.warn(message);\n };\n\n const setToolbarVisibility = (next: 'visible' | 'hidden') => {\n if (toolbar === undefined) setUncontrolledToolbar(next);\n onToolbarChange?.(next);\n };\n\n const focusEditor = () => editorHandleRef.current?.focus();\n\n /** The live ProseMirror view, once the editor is mounted. */\n const currentView = () =>\n editorRef.current ? viewOf(editorRef.current) : null;\n\n // RichEditor publishes edits asynchronously, but a host that takes over\n // macro insertion (`onMacroInsert` returning true) composes from its last\n // published value — so a token-removal edit must reach `onChange` before\n // the hook runs. These waiters bridge that gap.\n const changeWaitersRef = React.useRef<(() => void)[]>([]);\n // The doc as of the last `onChange` emission — when the live doc is ahead\n // of this, a publish is still in flight.\n const publishedDocRef = React.useRef<unknown>(null);\n const handleChange = (next: string) => {\n publishedDocRef.current = currentView()?.state.doc ?? null;\n onChangeRef.current?.(next);\n const waiters = changeWaitersRef.current;\n changeWaitersRef.current = [];\n for (const resolve of waiters) resolve();\n };\n /** Resolves after the next `onChange` emission (or a short fallback). */\n const afterNextChange = () =>\n new Promise<void>((resolve) => {\n const timer = setTimeout(resolve, 250);\n changeWaitersRef.current.push(() => {\n clearTimeout(timer);\n resolve();\n });\n });\n\n // --- Macro insertion ---\n\n const insertMacro = (macro: Macro) => {\n if (inertRef.current) return;\n if (!onMacroInsertRef.current) {\n const view = currentView();\n if (!view) return;\n view.focus();\n insertPlainText(view, macro.content);\n return;\n }\n // A host hook composes from the last *published* value — let any\n // in-flight publish land first, so a pick right after typing doesn't\n // overwrite the unpublished keystrokes.\n const view = currentView();\n const pending = view && view.state.doc !== publishedDocRef.current;\n const invoke = () => {\n if (inertRef.current) return; // went inert (or unmounted) waiting\n const liveView = currentView();\n if (!liveView) return;\n // Focus before composing: a pick must return the caret to the\n // editable even when a host hook handles the insertion itself\n // (mobile keyboards would otherwise dismiss between picks).\n liveView.focus();\n if (onMacroInsertRef.current?.(macro) === true) return;\n insertPlainText(liveView, macro.content);\n };\n if (pending) void afterNextChange().then(invoke);\n else invoke();\n };\n\n /** Typed `.shortcut` + space → macro expansion (space consumed). */\n const expandTypedShortcut = (view: EditorView): boolean => {\n const groups = macrosRef.current;\n if (!groups) return false;\n const { selection } = view.state;\n if (!selection.empty) return false;\n const { $from } = selection;\n // Leaf nodes (hard breaks) read as a newline: still one character, so\n // the position math below holds, and `\\S+` cannot run across a soft\n // line break — `.c` typed after Shift+Enter still expands.\n const textBefore = $from.parent.textBetween(\n 0,\n $from.parentOffset,\n undefined,\n '\\n'\n );\n const match = /(\\S+)$/.exec(textBefore);\n if (!match) return false;\n const lowered = match[1].toLowerCase();\n const macro = groups\n .flatMap((group) => group.macros)\n .find((candidate) => candidate.shortcut?.toLowerCase() === lowered);\n if (!macro) return false;\n\n const from = $from.pos - match[1].length;\n // Without a host hook the whole expansion is one synchronous\n // transaction (token replaced by content — one undo step, no race).\n if (!onMacroInsertRef.current) {\n insertPlainText(view, macro.content, from, $from.pos);\n return true;\n }\n // A host hook composes from the last *published* value, so the token\n // removal must reach `onChange` first. While that publish is pending,\n // further edits (or a moved caret) must not misplace the insertion:\n // map the deletion point through every transaction and give up if it\n // is deleted out from under us.\n const editor = editorRef.current;\n view.dispatch(view.state.tr.delete(from, $from.pos));\n if (!editor) return true;\n let insertAt = from;\n let targetValid = true;\n const trackInsertionPoint = (event: Event) => {\n const tr = (\n event as globalThis.CustomEvent<{ transaction?: Transaction }>\n ).detail?.transaction;\n if (!tr) return;\n const mapped = tr.mapping.mapResult(insertAt);\n if (mapped.deleted) targetValid = false;\n insertAt = mapped.pos;\n };\n editor.addEventListener('transaction', trackInsertionPoint);\n void afterNextChange().then(() => {\n editor.removeEventListener('transaction', trackInsertionPoint);\n // The field may have gone disabled/readOnly (or remounted) while\n // the token-removal publish was pending — `editable: false` does\n // not block programmatic dispatch, so recheck before composing.\n if (inertRef.current || editorRef.current !== editor) return;\n if (onMacroInsertRef.current?.(macro) === true) return;\n if (!targetValid) return;\n const liveView = viewOf(editor);\n liveView.focus();\n const at = Math.min(insertAt, liveView.state.doc.content.size);\n insertPlainText(liveView, macro.content, at, at);\n });\n return true;\n };\n\n // --- Variables menu ---\n\n /**\n * Insert the variable token at the caret as one ProseMirror transaction\n * (native undo step). The view keeps its selection state while focus\n * sits in the menu, so refocusing restores the caret by itself.\n */\n const insertVariable = (variable: RichTextVariable) => {\n if (inertRef.current) return;\n const view = currentView();\n if (!view) return;\n view.focus();\n insertPlainText(view, variable.insertValue ?? variable.value);\n };\n\n /** Close path: hand focus back to the editor when it sits in the menu. */\n const handleVariablesOpenChange = (open: boolean) => {\n if (\n !open &&\n document.activeElement?.closest('[data-slot=\"dropdown-menu\"]')\n ) {\n currentView()?.focus();\n }\n setVariablesOpen(open);\n };\n\n /** Anchor the menu at the (visible) toolbar Variables button and open. */\n const openVariablesMenu = () => {\n if (inertRef.current) return;\n const root = wrapperRef.current;\n const frame = gutterWrapperRef.current;\n if (!root || !frame) return;\n const visible = (candidate: HTMLElement) =>\n candidate.getBoundingClientRect().width > 0;\n // When the button sits in the overflow popup, the popup has already\n // closed (0×0) by the time its forwarded mousedown lands here — fall\n // back to the overflow toggle (where the user just clicked), then the\n // toolbar itself (unmeasured, e.g. jsdom, included: `run` can only\n // fire from a rendered toolbar).\n const anchor =\n Array.from(\n root.querySelectorAll<HTMLElement>('.tar-menu-variables')\n ).find(visible) ??\n Array.from(\n root.querySelectorAll<HTMLElement>('.kb-custom-menu__overflow-toggle')\n ).find(visible) ??\n root.querySelector<HTMLElement>('.kb-custom-menu');\n if (!anchor) return;\n const rect = anchor.getBoundingClientRect();\n const frameRect = frame.getBoundingClientRect();\n setVariablesAnchor({\n top: rect.top - frameRect.top,\n left: rect.left - frameRect.left,\n width: rect.width,\n height: rect.height,\n });\n setVariablesOpen(true);\n };\n\n const toggleVariablesMenu = () => {\n if (variablesOpenRef.current) handleVariablesOpenChange(false);\n else openVariablesMenu();\n };\n\n // --- Block gutter menu ---\n\n const resetGutter = () => {\n hoverBlockRef.current = null;\n setGutterTop(editorTop + 4);\n };\n\n const handleGutterMouseMove = (event: React.MouseEvent) => {\n if (blockMenuOpen) return;\n const view = currentView();\n const wrapper = gutterWrapperRef.current;\n if (!view || !wrapper) return;\n let target: HTMLElement | null = null;\n let top: number | null = null;\n for (const child of Array.from(view.dom.children)) {\n const rect = child.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) continue;\n if (rect.top <= event.clientY) {\n target = child as HTMLElement;\n top = rect.top;\n }\n }\n if (!target || top === null) {\n resetGutter();\n return;\n }\n hoverBlockRef.current = target;\n const wrapperTop = wrapper.getBoundingClientRect().top;\n const next = Math.max(Math.round(top - wrapperTop), editorTop + 4);\n setGutterTop((current) => (current === next ? current : next));\n };\n\n /** Dropdown open/close driven by the gutter trigger (mouse path). */\n const handleBlockMenuOpenChange = (open: boolean) => {\n const view = currentView();\n if (open) {\n const block = hoverBlockRef.current;\n blockTargetPosRef.current =\n view && block && view.dom.contains(block)\n ? view.posAtDOM(block, 0)\n : null;\n } else if (view && document.activeElement?.closest('[role=\"menu\"]')) {\n // Escape: focus sits on a menu item about to unmount — hand it back\n // to the editor so typing resumes.\n view.focus();\n }\n setBlockMenuOpen(open);\n };\n\n /** Ctrl/Cmd+/ — open the menu targeting the caret's block. */\n const openBlockMenuAtCaret = () => {\n const view = currentView();\n const wrapper = gutterWrapperRef.current;\n if (view && wrapper) {\n const { from } = view.state.selection;\n blockTargetPosRef.current = from;\n try {\n const coords = view.coordsAtPos(from);\n const wrapperTop = wrapper.getBoundingClientRect().top;\n setGutterTop(\n Math.max(Math.round(coords.top - wrapperTop), editorTop + 4)\n );\n } catch {\n // Position lookup can fail mid-update; the menu still opens.\n }\n }\n setBlockMenuOpen(true);\n };\n\n /** Put the selection at the menu's captured target block. */\n const applyBlockTarget = (view: EditorView) => {\n const pos = blockTargetPosRef.current;\n if (pos === null) return;\n const clamped = Math.min(pos, view.state.doc.content.size);\n view.dispatch(\n view.state.tr.setSelection(\n TextSelection.near(view.state.doc.resolve(clamped))\n )\n );\n };\n\n const applyBlockFormat = (command: string) => {\n const editor = editorRef.current;\n if (inert || !editor) return;\n setBlockMenuOpen(false);\n const view = viewOf(editor);\n view.focus();\n applyBlockTarget(view);\n (editor.run as Record<string, undefined | (() => boolean)>)[command]?.();\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 // --- Dictation ---\n\n const toggleDictation = React.useRef(async () => {\n const SpeechRecognition = getSpeechRecognition();\n if (!SpeechRecognition) return;\n\n // Stop anything live — or still pending between `start()` and\n // `onstart`, when nothing is listening yet.\n if (isListeningRef.current || recognitionRef.current) {\n stopDictation();\n return;\n }\n\n const session = ++dictationSessionRef.current;\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 or unmounted — while awaiting\n // microphone permission; do not start an unstoppable, read-only or\n // orphaned session.\n if (session !== dictationSessionRef.current) return;\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 // A stop issued between `start()` and this callback already tore the\n // session down — do not arm an unstoppable restart loop.\n if (session !== dictationSessionRef.current) {\n try {\n recognition.stop();\n } catch {\n // Already stopped.\n }\n return;\n }\n setIsListening(true);\n isListeningRef.current = true;\n shouldRestartRef.current = true;\n };\n\n recognition.onresult = (event) => {\n // Results landing after Stop retired this session (or after a\n // restart swapped recognitions) must not focus the editor or\n // insert text.\n if (\n session !== dictationSessionRef.current ||\n recognitionRef.current !== recognition\n ) {\n return;\n }\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 const view = currentView();\n if (finalTranscript && view) {\n view.focus();\n insertPlainText(view, processDictation(finalTranscript) + ' ');\n }\n };\n\n recognition.onerror = (event) => {\n // A retired session's failures must not clear the live session's\n // listening state.\n if (\n session !== dictationSessionRef.current ||\n recognitionRef.current !== recognition\n ) {\n return;\n }\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 // The listening refs are shared across sessions: a stop + restart\n // inside this callback's window would read the NEW session's flags\n // and resurrect this retired recognition beside it. Only the\n // recognition still owning the session may restart — checked both\n // here and again after the delay.\n if (\n session === dictationSessionRef.current &&\n shouldRestartRef.current &&\n isListeningRef.current &&\n !inertRef.current\n ) {\n setTimeout(() => {\n if (\n session === dictationSessionRef.current &&\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 if (recognitionRef.current === recognition)\n recognitionRef.current = null;\n setIsListening(false);\n }\n }\n }, 100);\n } else {\n // Ended for good — release the ref so the next toggle starts a\n // fresh session instead of \"stopping\" a dead one. A retired\n // session must not touch the live one's listening state.\n if (recognitionRef.current === recognition)\n recognitionRef.current = null;\n if (session === dictationSessionRef.current) setIsListening(false);\n }\n };\n\n recognitionRef.current = recognition;\n try {\n recognition.start();\n } catch {\n recognitionRef.current = null;\n reportError('Failed to start speech recognition. Please try again.');\n }\n }).current;\n\n const stopDictation = React.useCallback(() => {\n // Invalidate any start still awaiting microphone permission — or a\n // recognition whose `onstart` hasn't fired yet — and tear down\n // unconditionally: `isListeningRef` is false in that pending window,\n // so an early-return would leave the recognition to arm itself with\n // no Stop control visible.\n dictationSessionRef.current += 1;\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n const recognition = recognitionRef.current;\n recognitionRef.current = null;\n try {\n recognition?.stop();\n } catch {\n // Stopping before `onstart` can throw; the session bump above\n // already keeps it from arming.\n }\n setIsListening(false);\n }, []);\n\n React.useEffect(() => {\n setSpeechSupported(Boolean(getSpeechRecognition()));\n }, []);\n\n // Hiding the toolbar hides the Stop control; never leave an orphaned\n // session running. Same when the editor turns disabled/readOnly or the\n // dictation feature itself is switched off (which hides the button).\n React.useEffect(() => {\n if (!toolbarVisible || inert || !enableDictation) stopDictation();\n }, [toolbarVisible, inert, enableDictation, stopDictation]);\n\n // Hiding the toolbar hides the Variables anchor button; never leave the\n // menu floating over nothing (same when disabled/readOnly, or when\n // variableGroups empties — otherwise restoring the groups would reopen\n // the menu at its stale anchor without user activation).\n React.useEffect(() => {\n if (!toolbarVisible || inert || !hasVariables) setVariablesOpen(false);\n }, [toolbarVisible, inert, hasVariables]);\n\n // A resize can reflow the toolbar (buttons moving into or out of the\n // overflow popup), leaving the overlay anchored to stale coordinates\n // over some other control. The menu is transient — close it rather\n // than track the moving button. Observe the TOOLBAR, not the whole\n // field: opening the menu moves focus into the portaled panel, which\n // drops the field's :hover/:focus-within gutter padding and can rewrap\n // the text — editable-height churn must not dismiss the menu. Close\n // through the open-change handler so focus returns to the editor when\n // it was sitting inside the menu.\n React.useEffect(() => {\n if (!variablesOpen) return;\n const toolbar =\n wrapperRef.current?.querySelector<HTMLElement>('.kb-custom-menu');\n if (!toolbar || typeof ResizeObserver === 'undefined') return;\n let initial = true; // observe() always fires once immediately\n const observer = new ResizeObserver(() => {\n if (initial) {\n initial = false;\n return;\n }\n handleVariablesOpenChangeRef.current(false);\n });\n observer.observe(toolbar);\n return () => observer.disconnect();\n }, [variablesOpen]);\n\n // End-of-life cleanup.\n React.useEffect(() => stopDictation, [stopDictation]);\n\n // --- Kerebron toolbar additions (built once, read state through refs) ---\n\n const openBlockMenuAtCaretRef = React.useRef(openBlockMenuAtCaret);\n openBlockMenuAtCaretRef.current = openBlockMenuAtCaret;\n const expandTypedShortcutRef = React.useRef(expandTypedShortcut);\n expandTypedShortcutRef.current = expandTypedShortcut;\n const toggleVariablesMenuRef = React.useRef(toggleVariablesMenu);\n toggleVariablesMenuRef.current = toggleVariablesMenu;\n const handleVariablesOpenChangeRef = React.useRef(\n handleVariablesOpenChange\n );\n handleVariablesOpenChangeRef.current = handleVariablesOpenChange;\n\n const [menuAddon] = React.useState(() => {\n // Icon-only (filled Material-style paths, like Kerebron's stock\n // items): text labels clip to an empty square in the 32px overflow\n // grid and force the popup onto extra rows.\n const macrosItem = new MenuItem({\n icon: {\n width: 24,\n height: 24,\n // Material Symbols \"text snippet\" (Apache-2.0)\n path: 'M20.41 8.41l-4.83-4.83c-.37-.37-.88-.58-1.41-.58H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V9.83c0-.53-.21-1.04-.59-1.42zM7 7h7v2H7V7zm10 10H7v-2h10v2zm0-4H7v-2h10v2z',\n },\n title: macroLabels?.showMacros ?? 'Show macros',\n class: 'tar-menu-macros',\n select: () => hasMacrosRef.current,\n enable: () => !inertRef.current,\n active: () => macrosOpenRef.current,\n run: () => {\n setMacrosOpen((open) => !open);\n return true;\n },\n });\n const dictateItem = new MenuItem({\n icon: {\n width: 24,\n height: 24,\n // Material Symbols \"mic\" (Apache-2.0)\n path: 'M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z',\n },\n title: m('Start dictation'),\n class: 'tar-menu-dictate',\n select: () => dictationAvailableRef.current,\n enable: () => !inertRef.current,\n active: () => isListeningRef.current,\n run: () => {\n void toggleDictation();\n return true;\n },\n });\n const variablesItem = new MenuItem({\n icon: {\n width: 24,\n height: 24,\n // Material Symbols \"data object\" (Apache-2.0)\n path: 'M4 7v2c0 .55-.45 1-1 1H2v4h1c.55 0 1 .45 1 1v2c0 1.65 1.35 3 3 3h3v-2H7c-.55 0-1-.45-1-1v-2c0-1.3-.84-2.42-2-2.83v-.34C5.16 11.42 6 10.3 6 9V7c0-.55.45-1 1-1h3V4H7C5.35 4 4 5.35 4 7zm17 3c-.55 0-1-.45-1-1V7c0-1.65-1.35-3-3-3h-3v2h3c.55 0 1 .45 1 1v2c0 1.3.84 2.42 2 2.83v.34c-1.16.41-2 1.53-2 2.83v2c0 .55-.45 1-1 1h-3v2h3c1.65 0 3-1.35 3-3v-2c0-.55.45-1 1-1h1v-4h-1z',\n },\n title: m('Insert variable'),\n class: 'tar-menu-variables',\n select: () => hasVariablesRef.current,\n enable: () => !inertRef.current,\n active: () => variablesOpenRef.current,\n run: () => {\n toggleVariablesMenuRef.current();\n return true;\n },\n });\n const modifyMenu: ModifyMenu = (menus: MenuElement[][]) => [\n ...menus,\n // The patched MenuItem types `render().dom` as nullable, which no\n // longer satisfies MenuElement; our items always render a button.\n [variablesItem, macrosItem, dictateItem] as unknown as MenuElement[],\n ];\n const kit: EditorKit = {\n getExtensions: () => [\n new TextAreaRichExtension((view, event) => {\n if (inertRef.current) return false;\n if (\n event.key === '/' &&\n (event.ctrlKey || event.metaKey) &&\n !event.altKey\n ) {\n openBlockMenuAtCaretRef.current();\n return true;\n }\n if (\n event.key !== ' ' ||\n event.isComposing ||\n event.ctrlKey ||\n event.metaKey ||\n event.altKey\n ) {\n return false;\n }\n return expandTypedShortcutRef.current(view);\n }),\n ],\n };\n return { modifyMenu, kits: [kit] };\n });\n\n // The toolbar only repaints items on document/selection changes, so\n // React-side state (panel open, dictation) is synced into our injected\n // buttons directly. Kerebron's overflow popup builds FRESH buttons each\n // time it opens — construction-time labels and no aria-pressed — so a\n // childList observer re-syncs every rendered copy on arrival.\n React.useEffect(() => {\n const root = wrapperRef.current;\n if (!root || !ready) return;\n const sync = () => {\n // Disabled/readOnly must neutralize the stock toolbar too — its\n // buttons dispatch regardless of the view's `editable` prop. `inert`\n // blocks both pointer and keyboard access.\n for (const toolbar of root.querySelectorAll<HTMLElement>(\n '.kb-custom-menu, .kb-custom-menu__overflow-menu'\n )) {\n toolbar.inert = inert;\n }\n // The menu plugin re-runs item `update` callbacks only on document/\n // selection changes, so a button rendered while disabled/readOnly\n // keeps its disabled state when the field becomes editable without a\n // transaction — reconcile it here for every rendered copy.\n for (const macrosButton of root.querySelectorAll<HTMLElement>(\n '.tar-menu-macros'\n )) {\n macrosButton.style.display = hasMacros ? '' : 'none';\n macrosButton.classList.toggle('kb-menu__button--disabled', inert);\n macrosButton.setAttribute('aria-disabled', String(inert));\n macrosButton.classList.toggle('kb-menu__button--active', macrosOpen);\n macrosButton.setAttribute('aria-pressed', String(macrosOpen));\n const title = macrosOpen\n ? (macroLabels?.hideMacros ?? 'Hide macros')\n : (macroLabels?.showMacros ?? 'Show macros');\n macrosButton.setAttribute('title', title);\n macrosButton.setAttribute('aria-label', title);\n }\n for (const dictateButton of root.querySelectorAll<HTMLElement>(\n '.tar-menu-dictate'\n )) {\n dictateButton.style.display =\n enableDictation && speechSupported ? '' : 'none';\n dictateButton.classList.toggle('kb-menu__button--disabled', inert);\n dictateButton.setAttribute('aria-disabled', String(inert));\n dictateButton.classList.toggle(\n 'kb-menu__button--active',\n isListening\n );\n dictateButton.setAttribute('aria-pressed', String(isListening));\n const title = isListening\n ? m('Stop dictation')\n : m('Start dictation');\n dictateButton.setAttribute('title', title);\n dictateButton.setAttribute('aria-label', title);\n }\n for (const variablesButton of root.querySelectorAll<HTMLElement>(\n '.tar-menu-variables'\n )) {\n variablesButton.style.display = hasVariables ? '' : 'none';\n variablesButton.classList.toggle('kb-menu__button--disabled', inert);\n variablesButton.setAttribute('aria-disabled', String(inert));\n variablesButton.classList.toggle(\n 'kb-menu__button--active',\n variablesOpen\n );\n variablesButton.setAttribute('aria-haspopup', 'menu');\n variablesButton.setAttribute('aria-expanded', String(variablesOpen));\n const title = m('Insert variable');\n variablesButton.setAttribute('title', title);\n variablesButton.setAttribute('aria-label', title);\n }\n };\n sync();\n // Attribute writes don't retrigger a childList-only observer, so the\n // re-sync cannot loop.\n const observer = new MutationObserver((mutations) => {\n if (mutations.some((mutation) => mutation.addedNodes.length > 0)) {\n sync();\n }\n });\n observer.observe(root, { childList: true, subtree: true });\n return () => observer.disconnect();\n }, [\n ready,\n inert,\n hasMacros,\n macrosOpen,\n macroLabels,\n hasVariables,\n variablesOpen,\n enableDictation,\n speechSupported,\n isListening,\n toolbarVisible,\n m,\n ]);\n\n // --- Editor wiring ---\n\n const handleReady = (editor: CoreEditor) => {\n editorRef.current = editor;\n // The initial load publishes nothing; the loaded doc is the baseline.\n publishedDocRef.current = viewOf(editor).state.doc;\n setIsEmpty(docIsEmpty(viewOf(editor)));\n editor.addEventListener('transaction', () => {\n if (editorRef.current !== editor) return;\n setIsEmpty(docIsEmpty(viewOf(editor)));\n });\n setReady(true);\n };\n\n // The editable region's identity: ARIA naming, validation state and the\n // host-given id all live on the ProseMirror surface, like the legacy\n // contenteditable. setProps merges, so this never clobbers editability.\n React.useEffect(() => {\n const view = currentView();\n if (!view || !ready) return;\n view.setProps({\n attributes: {\n role: 'textbox',\n 'aria-multiline': 'true',\n ...(id ? { id } : {}),\n ...((ariaLabel ?? placeholder)\n ? { 'aria-label': (ariaLabel ?? placeholder) as string }\n : {}),\n ...(ariaLabelledBy ? { 'aria-labelledby': ariaLabelledBy } : {}),\n ...(ariaDescribedBy ? { 'aria-describedby': ariaDescribedBy } : {}),\n ...(ariaInvalid ? { 'aria-invalid': String(ariaInvalid) } : {}),\n // Booleanish: the string \"false\" must not read as required.\n ...(ariaRequired !== undefined\n ? { 'aria-required': String(ariaRequired) }\n : {}),\n ...(readOnly ? { 'aria-readonly': 'true' } : {}),\n ...(disabled ? { 'aria-disabled': 'true' } : {}),\n // Read-only keeps keyboard focus and text selection available;\n // ProseMirror drops natural tabbability once `editable` is false.\n tabindex: disabled ? '-1' : '0',\n // setProps replaces the create-time attributes, so the base\n // kb-editor class must be restated alongside any custom class.\n class: editorClassName ? `kb-editor ${editorClassName}` : 'kb-editor',\n },\n });\n }, [\n ready,\n id,\n ariaLabel,\n placeholder,\n ariaLabelledBy,\n ariaDescribedBy,\n ariaInvalid,\n ariaRequired,\n readOnly,\n disabled,\n editorClassName,\n ]);\n\n // Read-only keeps the region focusable/selectable but blocks edits —\n // enforced by RichEditor's own `readOnly` prop from creation (so the\n // surface is locked even while the initial document load is in flight).\n\n const appliedEditorStyle = React.useRef<\n Array<[HTMLElement['style'], string]>\n >([]);\n React.useEffect(() => {\n const view = currentView();\n const wrapper = wrapperRef.current;\n if (!view || !wrapper || !ready) return;\n // React style contract: camelCase keys, numbers in px (unless the\n // property is unitless — and custom properties pass through as\n // authored, never gaining a unit), and removed keys actually un-apply.\n const editableStyle = (view.dom as HTMLElement).style;\n for (const [style, property] of appliedEditorStyle.current) {\n style.removeProperty(property);\n }\n appliedEditorStyle.current = [];\n if (!editorStyle) return;\n for (const [key, raw] of Object.entries(editorStyle)) {\n if (raw === null || raw === undefined) continue;\n const isCustomProperty = key.startsWith('--');\n const property = isCustomProperty\n ? key\n : key.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`);\n const value =\n typeof raw === 'number' &&\n !isCustomProperty &&\n !UNITLESS_STYLE_PROPS.has(key)\n ? `${raw}px`\n : String(raw);\n // Custom properties land on the wrapper so they inherit to the\n // editable (whose kerebron.css metrics read them) AND the overlaid\n // placeholder; everything else styles the editable directly.\n const style = isCustomProperty ? wrapper.style : editableStyle;\n style.setProperty(property, value);\n appliedEditorStyle.current.push([style, property]);\n }\n }, [ready, editorStyle]);\n\n // The editable sits below the (optional) toolbar inside the gutter\n // wrapper; everything anchored beside it (placeholder, gutter +, docked\n // macro panel) offsets by the toolbar's live height.\n React.useEffect(() => {\n const view = currentView();\n const wrapper = gutterWrapperRef.current;\n if (!view || !wrapper || !ready) return;\n const measure = () => {\n const top = Math.max(\n Math.round(\n view.dom.getBoundingClientRect().top -\n wrapper.getBoundingClientRect().top\n ),\n 0\n );\n setEditorTop((current) => (current === top ? current : top));\n // A hovered block may have been deleted since; a detached node must\n // not pin the gutter button to its old offset. A still-connected one\n // moved with the toolbar's height change, so follow it — leaving the\n // stale offset would park the + button under the new toolbar.\n const hovered = hoverBlockRef.current;\n if (hovered?.isConnected) {\n const next = Math.max(\n Math.round(\n hovered.getBoundingClientRect().top -\n wrapper.getBoundingClientRect().top\n ),\n top + 4\n );\n setGutterTop((current) => (current === next ? current : next));\n } else {\n hoverBlockRef.current = null;\n setGutterTop(top + 4);\n }\n };\n measure();\n // Re-measure when the toolbar wraps to more/fewer rows.\n const observer = new ResizeObserver(measure);\n observer.observe(wrapper);\n return () => observer.disconnect();\n }, [ready, toolbarVisible]);\n\n return (\n <div\n ref={wrapperRef}\n data-slot=\"textarea-rich\"\n data-toolbar={toolbarVisible ? 'visible' : 'hidden'}\n data-inert={inert ? '' : undefined}\n data-macros-open={hasMacros && macrosOpen ? '' : undefined}\n data-compact-macros={compactMacros ? '' : undefined}\n data-gutter={gutterActive ? '' : undefined}\n data-block-menu={blockMenuOpen ? '' : undefined}\n className={cn(\n 'border-input rounded-lg border',\n 'transition-colors duration-200',\n 'focus-within:ring-ring focus-within:border-transparent focus-within:ring-2',\n 'flex flex-col',\n disabled && 'bg-muted/20',\n className\n )}\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 >\n <div className=\"relative flex min-h-0 flex-1 flex-col\">\n <div\n ref={gutterWrapperRef}\n data-slot=\"textarea-rich-body\"\n className={cn('relative flex-1', 'group/tar-body')}\n onMouseMove={gutterActive ? handleGutterMouseMove : undefined}\n >\n {gutterActive && (\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=\"textarea-rich-block-gutter\"\n className=\"absolute start-1 z-10\"\n style={{ top: gutterTop }}\n // Keep the editor focused through gutter interaction (see\n // the legacy surface for the full iOS rationale).\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 'opacity-0 transition-opacity',\n 'group-hover/tar-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 {BLOCK_FORMAT_ITEMS.map((item, index) => (\n <DropdownItem\n key={item.key}\n ref={index === 0 ? firstBlockItemRef : undefined}\n onClick={() => applyBlockFormat(item.command)}\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 disabled={!hasMacroEntries}\n >\n {blockMenuOpen &&\n macros.flatMap((group) => [\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 key={`m:${JSON.stringify([group.id, macro.id])}`}\n className=\"[&>[data-slot=dropdown-item-label]]:min-w-0 [&>[data-slot=dropdown-item-label]]:flex-1\"\n onClick={() => {\n setBlockMenuOpen(false);\n const view = currentView();\n if (view) {\n view.focus();\n // Insertion lands at the menu's target\n // block, mirroring the panel flow.\n applyBlockTarget(view);\n }\n insertMacro(macro);\n }}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n {macro.shortcut && (\n <span\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 setMacrosOpen(true);\n focusEditor();\n }}\n >\n {blockMenuLabels?.showMacroLibrary ??\n 'Show macro library'}\n </DropdownItem>\n <DropdownSeparator />\n </>\n )}\n <DropdownItem\n onClick={() => {\n setBlockMenuOpen(false);\n setToolbarVisibility(\n toolbarVisible ? 'hidden' : 'visible'\n );\n focusEditor();\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 end-0 z-[1]',\n 'truncate px-3 py-[7px]',\n 'transition-[padding] duration-200 motion-reduce:transition-none',\n // Mirrors the editable's sliding gutter indent (permanent\n // on touch devices, where the + trigger is always visible).\n gutterActive &&\n 'group-focus-within/tar-body:ps-10 group-hover/tar-body:ps-10 [@media(hover:none)]:ps-10',\n gutterActive && blockMenuOpen && 'ps-10',\n hasMacros && macrosOpen && 'md:me-72',\n editorClassName\n )}\n style={{\n top: editorTop,\n // Match the editable's metrics by construction: the same\n // variables (inherited from the wrapper) with the same\n // kerebron.css fallbacks that size the .kb-editor rule.\n fontSize: 'var(--textarea-rich-font-size, 1rem)',\n lineHeight: 'var(--textarea-rich-line-height, 1.5rem)',\n }}\n >\n {placeholder}\n </div>\n )}\n <RichEditor\n ref={editorHandleRef}\n value={value}\n onChange={handleChange}\n valueType=\"text/html\"\n strictValue\n modifyMenu={menuAddon.modifyMenu}\n editorKits={menuAddon.kits}\n onReady={handleReady}\n disabled={disabled}\n readOnly={readOnly}\n />\n {hasVariables && variablesOpen && variablesAnchor && (\n // Invisible React anchor laid exactly over the toolbar's\n // Variables button: the Dropdown positions off it, and the\n // trigger span swallows a toggle-off click before it can\n // reach the Kerebron button (whose `run` would reopen).\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions -- mousedown here only guards editor focus (preventDefault); the a11y contract lives on the real toolbar button underneath.\n <div\n data-slot=\"textarea-rich-variables-anchor\"\n className=\"absolute z-10\"\n style={variablesAnchor}\n // Keep the editor focused when the anchor itself is pressed\n // (see the block gutter above for the iOS rationale). The\n // portaled menu's React events bubble through here too —\n // those keep their defaults (caret placement and drag\n // selection in the search input need them).\n onMouseDown={(event) => {\n if (event.currentTarget.contains(event.target as Node)) {\n event.preventDefault();\n }\n }}\n >\n <Dropdown\n open={variablesOpen}\n onOpenChange={handleVariablesOpenChange}\n placement=\"bottom-start\"\n width={240}\n searchable\n searchPlaceholder={m('Search variables…')}\n searchAriaLabel={m('Search template variables')}\n searchEmptyState={m('No matching variables')}\n trigger={\n // Explicit size: the Dropdown's inline-flex anchor\n // container sizes to this span, matching the button.\n <span\n aria-hidden=\"true\"\n className=\"block\"\n style={{\n width: variablesAnchor.width,\n height: variablesAnchor.height,\n }}\n />\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={() => {\n handleVariablesOpenChange(false);\n insertVariable(variable);\n }}\n >\n {variable.label}\n </DropdownItem>\n ))}\n </React.Fragment>\n ))}\n </Dropdown>\n </div>\n )}\n </div>\n\n {hasMacros && (\n <AnimatedPresence>\n {macrosOpen && (\n <Animated\n key=\"macro-panel\"\n preset={macroSidePanel ? 'menu' : 'collapse'}\n enabled={macroSidePanel || !prefersReducedMotion}\n mode=\"presence\"\n custom={direction === 'rtl' ? 'left' : 'right'}\n fallbackClassName=\"animate-fade-in\"\n className=\"border-border flex max-h-72 flex-col overflow-hidden border-t md:absolute md:end-0 md:bottom-0 md:max-h-none md:w-72 md:overflow-visible md:border-s md:border-t-0\"\n // Docked below the toolbar (top only applies when the\n // panel goes absolute at md:).\n style={{ top: editorTop }}\n >\n <MacroLibrary\n id={macroPanelId}\n groups={macros!}\n onSelect={insertMacro}\n targetLabel={ariaLabel ?? placeholder}\n onClose={\n macrosOnFocus\n ? undefined\n : () => {\n setMacrosOpen(false);\n focusEditor();\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\nTextAreaRichKerebron.displayName = 'TextAreaRichKerebron';\n\nexport { TextAreaRichKerebron };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/RichEditor/CodeEditor.tsx","../src/components/TextAreaRich/speech.ts","../src/components/TextAreaRich/TextAreaRichKerebron.tsx"],"names":["view","toolbar","value","jsx","Fragment"],"mappings":"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","file":"chunk-MQSGJB2B.js","sourcesContent":["import React, { useEffect, useRef } from 'react';\n\nimport { CoreEditor } from '@kerebron/editor';\nimport { CodeEditorKit } from '@kerebron/editor-kits/CodeEditorKit';\nimport { createAssetLoad } from '@kerebron/wasm/web';\n\nexport interface CodeEditorProps {\n /** Initial source code to load into the editor. */\n value?: string;\n /** Called with the editor's contents whenever they change. */\n onChange?: (value: string) => void;\n /** Language/grammar to use for syntax highlighting. Defaults to `typescript`. */\n lang?: string;\n}\n\nconst CodeEditor: React.FC<CodeEditorProps> = ({\n value = '',\n onChange,\n lang = 'typescript',\n}) => {\n const editorRef = useRef<HTMLDivElement>(null);\n const editorInstance = useRef<CoreEditor | null>(null);\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n useEffect(() => {\n const root = editorRef.current;\n if (!root) return;\n\n const applySelectLabel = () => {\n root.querySelectorAll('select.codejar-select').forEach((element) => {\n if (!element.getAttribute('aria-label')) {\n element.setAttribute('aria-label', 'Code editor language');\n }\n });\n };\n\n applySelectLabel();\n const observer = new MutationObserver(() => applySelectLabel());\n observer.observe(root, { childList: true, subtree: true });\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (!editorRef.current) return;\n\n // Initialize the editor\n const editor = CoreEditor.create({\n element: editorRef.current,\n uri: 'file:///untitled.ts',\n assetLoad: createAssetLoad('/kerebron-wasm'),\n editorKits: [new CodeEditorKit(lang)],\n });\n\n editorInstance.current = editor;\n\n // Surface edits to callers.\n const onTransaction = async () => {\n if (!editorInstance.current) return;\n\n try {\n const buffer = await editorInstance.current.saveDocument('text/plain');\n onChangeRef.current?.(new globalThis.TextDecoder().decode(buffer));\n } catch (err) {\n console.error('Failed to read code:', err);\n }\n };\n\n editor.addEventListener('transaction', onTransaction);\n\n // Seed initial content on mount.\n if (value) {\n editor\n .loadDocumentText('text/plain', value)\n .catch((err) => console.error('Failed to load code:', err));\n }\n\n // Cleanup on unmount\n return () => {\n editor.removeEventListener('transaction', onTransaction);\n editor.destroy();\n };\n // Initial `value`/`lang` are intentionally only applied on mount.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <div>\n <div>\n <div ref={editorRef} className=\"kb-component\" />\n </div>\n </div>\n );\n};\n\nCodeEditor.displayName = 'CodeEditor';\n\nexport { CodeEditor };\n","/**\n * Minimal Web Speech API surface used for dictation. Mirrors the private\n * typings in `RichTextEditor` (the legacy engine keeps its own copy until it\n * is retired) — lib.dom omits these because browser support is uneven.\n */\nexport interface SpeechRecognitionResultLike {\n isFinal: boolean;\n 0: { transcript: string };\n}\nexport interface SpeechRecognitionEventLike {\n resultIndex: number;\n results: ArrayLike<SpeechRecognitionResultLike>;\n}\nexport interface SpeechRecognitionErrorEventLike {\n error: string;\n}\nexport interface 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}\nexport type SpeechRecognitionCtor = new () => SpeechRecognitionLike;\ninterface SpeechWindow {\n SpeechRecognition?: SpeechRecognitionCtor;\n webkitSpeechRecognition?: SpeechRecognitionCtor;\n}\n\n/** The browser's SpeechRecognition constructor, when dictation is available. */\nexport function getSpeechRecognition(): SpeechRecognitionCtor | undefined {\n if (typeof window === 'undefined') return undefined;\n const w = window as unknown as SpeechWindow;\n return w.SpeechRecognition || w.webkitSpeechRecognition;\n}\n","import * as React from 'react';\nimport { Plugin, TextSelection } from 'prosemirror-state';\nimport type { Transaction } from 'prosemirror-state';\nimport type { Node as PMNode } from 'prosemirror-model';\nimport type { EditorView } from 'prosemirror-view';\nimport { Extension, type CoreEditor, type EditorKit } from '@kerebron/editor';\nimport { MenuItem } from '@kerebron/extension-menu';\nimport { Plus } from 'lucide-react';\n\nimport { cn } from '../../utils/cn';\nimport { useMessages } from '../../utils/messages';\nimport { Button } from '../Button';\nimport {\n Dropdown,\n DropdownItem,\n DropdownLabel,\n DropdownSeparator,\n DropdownSubmenu,\n} from '../Dropdown';\nimport { MacroLibrary, type Macro } from '../MacroLibrary';\nimport { Animated, AnimatedPresence } from '../../motion';\nimport { useDirection } from '../../hooks/useDirection';\nimport { useMediaQuery } from '../../hooks/useMediaQuery';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\nimport {\n RichEditor,\n type RichEditorHandle,\n type MenuElement,\n type ModifyMenu,\n} from '../RichEditor';\nimport {\n processDictation,\n type RichTextEditorBlockMenuLabels,\n type RichTextVariable,\n} from '../RichTextEditor';\nimport type { TextAreaRichProps } from './TextAreaRich';\nimport { getSpeechRecognition, type SpeechRecognitionLike } from './speech';\n\n/**\n * Kerebron-backed TextAreaRich surface: ProseMirror underneath, the stock\n * Kerebron toolbar (hidden until requested), the block gutter menu, docked\n * macro panel, `.shortcut` expansion and dictation — same `TextAreaRichProps`\n * contract (`value`/`onChange` carry HTML) as the legacy surface, but\n * strictly controlled like a native input: an edit that `onChange` does not\n * echo back into `value` reverts (see {@link RichEditorProps.strictValue}).\n *\n * Exported as `TextAreaRich` from `@mieweb/ui/kerebron`, and the engine\n * behind the main bundle's `Textarea` — which is why the `@kerebron/*`\n * runtime peers are required: hosts install them and load\n * `@mieweb/ui/kerebron.css`. (Only the Yjs collab peers remain optional.)\n */\n\n/** Carries our keydown behaviors (macro shortcuts, Ctrl+/) into the editor. */\nclass TextAreaRichExtension extends Extension {\n name = 'textAreaRichShortcuts';\n constructor(\n private readonly onKeyDown: (\n view: EditorView,\n event: KeyboardEvent\n ) => boolean\n ) {\n super({});\n }\n override getProseMirrorPlugins(): Plugin[] {\n return [new Plugin({ props: { handleKeyDown: this.onKeyDown } })];\n }\n}\n\n/**\n * `CoreEditor.view` is typed `EditorView | DummyEditorView` (the dummy exists\n * only until `create()` returns, which is before `onReady` ever fires), so\n * every ready-time consumer can treat it as the real view.\n */\nconst viewOf = (editor: CoreEditor) => editor.view as EditorView;\n\n/**\n * CSS properties whose numeric values are valid without a `px` unit —\n * React's full unitless list, so `editorStyle` keeps the React.CSSProperties\n * contract (`{ flex: 1 }` must not become `flex: 1px`).\n */\nconst UNITLESS_STYLE_PROPS = new Set([\n 'animationIterationCount',\n 'aspectRatio',\n 'borderImageOutset',\n 'borderImageSlice',\n 'borderImageWidth',\n 'boxFlex',\n 'boxFlexGroup',\n 'boxOrdinalGroup',\n 'columnCount',\n 'columns',\n 'flex',\n 'flexGrow',\n 'flexPositive',\n 'flexShrink',\n 'flexNegative',\n 'flexOrder',\n 'fontWeight',\n 'gridArea',\n 'gridRow',\n 'gridRowEnd',\n 'gridRowSpan',\n 'gridRowStart',\n 'gridColumn',\n 'gridColumnEnd',\n 'gridColumnSpan',\n 'gridColumnStart',\n 'lineClamp',\n 'lineHeight',\n 'opacity',\n 'order',\n 'orphans',\n 'tabSize',\n 'widows',\n 'zIndex',\n 'zoom',\n // SVG-related\n 'fillOpacity',\n 'floodOpacity',\n 'stopOpacity',\n 'strokeDasharray',\n 'strokeDashoffset',\n 'strokeMiterlimit',\n 'strokeOpacity',\n 'strokeWidth',\n]);\n\n/**\n * Replace `[from, to]` (defaults: the current selection) with plain text,\n * mapping `\\n` to hard breaks, and put the caret after the insertion.\n */\nfunction insertPlainText(\n view: EditorView,\n text: string,\n from = view.state.selection.from,\n to = view.state.selection.to\n) {\n const { schema, selection, storedMarks } = view.state;\n // Typing at this caret would inherit the active marks (pending toggles\n // or the formatting at the position); composed insertions — dictation,\n // macros, shortcut phrases — must match instead of stripping them.\n const marks =\n (from === selection.from && to === selection.to ? storedMarks : null) ??\n view.state.doc.resolve(from).marks();\n const br = schema.nodes.br ?? schema.nodes.hard_break;\n const lines = text.replace(/\\r\\n?/g, '\\n').split('\\n');\n const nodes: PMNode[] = [];\n lines.forEach((line, index) => {\n if (index > 0) {\n if (br) nodes.push(br.create(null, null, marks));\n else if (line) nodes.push(schema.text(' ', marks));\n }\n if (line) nodes.push(schema.text(line, marks));\n });\n let tr = view.state.tr.replaceWith(from, to, nodes);\n const end = Math.min(\n from + nodes.reduce((size, node) => size + node.nodeSize, 0),\n tr.doc.content.size\n );\n tr = tr.setSelection(TextSelection.near(tr.doc.resolve(end)));\n view.dispatch(tr.scrollIntoView());\n}\n\n/** One empty textblock — the ProseMirror notion of \"nothing typed yet\". */\nfunction docIsEmpty(view: EditorView) {\n const { doc } = view.state;\n return (\n doc.childCount === 1 &&\n !!doc.firstChild &&\n doc.firstChild.isTextblock &&\n doc.firstChild.content.size === 0\n );\n}\n\n/** Gutter menu rows → Kerebron command names. */\nconst BLOCK_FORMAT_ITEMS: Array<{\n key: keyof RichTextEditorBlockMenuLabels;\n label: string;\n command: string;\n}> = [\n { key: 'text', label: 'Text', command: 'setParagraph' },\n { key: 'heading1', label: 'Heading 1', command: 'setHeading1' },\n { key: 'heading2', label: 'Heading 2', command: 'setHeading2' },\n { key: 'heading3', label: 'Heading 3', command: 'setHeading3' },\n { key: 'bulletList', label: 'Bullet list', command: 'toggleBulletList' },\n { key: 'numberedList', label: 'Numbered list', command: 'toggleOrderedList' },\n { key: 'quote', label: 'Quote', command: 'toggleBlockquote' },\n];\n\nconst TextAreaRichKerebron = React.forwardRef<\n HTMLDivElement,\n TextAreaRichProps\n>(\n (\n {\n value = '',\n onChange,\n placeholder,\n className,\n enableDictation = true,\n onDictationError,\n disabled = false,\n macros,\n defaultMacrosOpen = false,\n macrosOnFocus = false,\n compactMacros = false,\n onMacroInsert,\n macroLabels,\n onCreateMacro,\n variableGroups,\n toolbar,\n defaultToolbar = 'hidden',\n onToolbarChange,\n blockMenuLabels,\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 inert = disabled || readOnly;\n\n const wrapperRef = React.useRef<HTMLDivElement>(null);\n const gutterWrapperRef = React.useRef<HTMLDivElement>(null);\n const editorHandleRef = React.useRef<RichEditorHandle>(null);\n const editorRef = React.useRef<CoreEditor | null>(null);\n const [ready, setReady] = React.useState(false);\n // Hosts reach the editable region through the ref (focus, `dir`,\n // ARIA attributes), as with the legacy surface's contenteditable; the\n // wrapper only stands in until the editor mounts.\n React.useImperativeHandle(\n ref,\n () =>\n ready && editorRef.current\n ? (viewOf(editorRef.current).dom as HTMLDivElement)\n : wrapperRef.current!,\n [ready]\n );\n\n const [macrosOpen, setMacrosOpen] = React.useState(\n defaultMacrosOpen && !macrosOnFocus\n );\n const [uncontrolledToolbar, setUncontrolledToolbar] =\n React.useState(defaultToolbar);\n const toolbarVisible = (toolbar ?? uncontrolledToolbar) === 'visible';\n const [isListening, setIsListening] = React.useState(false);\n const [speechSupported, setSpeechSupported] = React.useState(false);\n const [isEmpty, setIsEmpty] = React.useState(true);\n // Offset of the editable below the (optional) toolbar, inside the wrapper.\n const [editorTop, setEditorTop] = React.useState(0);\n const [blockMenuOpen, setBlockMenuOpen] = React.useState(false);\n const [gutterTop, setGutterTop] = React.useState(4);\n const [variablesOpen, setVariablesOpen] = React.useState(false);\n // The toolbar's Variables button rect (relative to the gutter wrapper):\n // the searchable Dropdown anchors a React trigger exactly over it.\n const [variablesAnchor, setVariablesAnchor] = React.useState<{\n top: number;\n left: number;\n width: number;\n height: number;\n } | null>(null);\n\n const recognitionRef = React.useRef<SpeechRecognitionLike | null>(null);\n const isListeningRef = React.useRef(false);\n const shouldRestartRef = React.useRef(false);\n // Invalidates dictation starts still awaiting microphone permission.\n const dictationSessionRef = React.useRef(0);\n const hoverBlockRef = React.useRef<HTMLElement | null>(null);\n const blockTargetPosRef = React.useRef<number | null>(null);\n const firstBlockItemRef = React.useRef<HTMLButtonElement>(null);\n const macroPanelId = React.useId();\n\n const macroSidePanel = useMediaQuery('(min-width: 768px)');\n const prefersReducedMotion = usePrefersReducedMotion();\n // The field's inherited direction (not the document's): a local\n // dir=\"rtl\" subtree docks the panel at inline-end = left, so the motion\n // preset must slide it in from the same side.\n const direction = useDirection(wrapperRef);\n\n const hasMacros = Boolean(macros);\n const hasMacroEntries = Boolean(\n macros?.some((group) => group.macros.length > 0)\n );\n const hasVariables = Boolean(variableGroups && variableGroups.length > 0);\n // The gutter `+` stays discoverable on hover even while a focus-docked\n // field rests as a one-line input.\n const gutterActive = !inert;\n\n // Mount-time closures (the toolbar and keydown plugin are built once)\n // read the latest props/state through refs.\n const macrosRef = React.useRef(macros);\n macrosRef.current = macros;\n const hasMacrosRef = React.useRef(hasMacros);\n hasMacrosRef.current = hasMacros;\n const hasVariablesRef = React.useRef(hasVariables);\n hasVariablesRef.current = hasVariables;\n const variablesOpenRef = React.useRef(variablesOpen);\n variablesOpenRef.current = variablesOpen;\n const onMacroInsertRef = React.useRef(onMacroInsert);\n onMacroInsertRef.current = onMacroInsert;\n const onChangeRef = React.useRef(onChange);\n onChangeRef.current = onChange;\n const inertRef = React.useRef(inert);\n inertRef.current = inert;\n const macrosOpenRef = React.useRef(macrosOpen);\n macrosOpenRef.current = macrosOpen;\n const toolbarVisibleRef = React.useRef(toolbarVisible);\n toolbarVisibleRef.current = toolbarVisible;\n const dictationAvailableRef = React.useRef(false);\n dictationAvailableRef.current = enableDictation && speechSupported;\n const onDictationErrorRef = React.useRef(onDictationError);\n onDictationErrorRef.current = onDictationError;\n // Dictation labels have no prop route (macro labels do), so the host's\n // MessagesProvider is the translation path — like RichTextEditor's.\n const m = useMessages();\n\n const reportError = (message: string) => {\n if (onDictationErrorRef.current) onDictationErrorRef.current(message);\n else if (typeof console !== 'undefined') console.warn(message);\n };\n\n const setToolbarVisibility = (next: 'visible' | 'hidden') => {\n if (toolbar === undefined) setUncontrolledToolbar(next);\n onToolbarChange?.(next);\n };\n\n const focusEditor = () => editorHandleRef.current?.focus();\n\n /** The live ProseMirror view, once the editor is mounted. */\n const currentView = () =>\n editorRef.current ? viewOf(editorRef.current) : null;\n\n // RichEditor publishes edits asynchronously, but a host that takes over\n // macro insertion (`onMacroInsert` returning true) composes from its last\n // published value — so a token-removal edit must reach `onChange` before\n // the hook runs. These waiters bridge that gap.\n const changeWaitersRef = React.useRef<(() => void)[]>([]);\n // The doc as of the last `onChange` emission — when the live doc is ahead\n // of this, a publish is still in flight.\n const publishedDocRef = React.useRef<unknown>(null);\n const handleChange = (next: string) => {\n publishedDocRef.current = currentView()?.state.doc ?? null;\n onChangeRef.current?.(next);\n const waiters = changeWaitersRef.current;\n changeWaitersRef.current = [];\n for (const resolve of waiters) resolve();\n };\n /** Resolves after the next `onChange` emission (or a short fallback). */\n const afterNextChange = () =>\n new Promise<void>((resolve) => {\n const timer = setTimeout(resolve, 250);\n changeWaitersRef.current.push(() => {\n clearTimeout(timer);\n resolve();\n });\n });\n\n // --- Macro insertion ---\n\n const insertMacro = (macro: Macro) => {\n if (inertRef.current) return;\n if (!onMacroInsertRef.current) {\n const view = currentView();\n if (!view) return;\n view.focus();\n insertPlainText(view, macro.content);\n return;\n }\n // A host hook composes from the last *published* value — let any\n // in-flight publish land first, so a pick right after typing doesn't\n // overwrite the unpublished keystrokes.\n const view = currentView();\n const pending = view && view.state.doc !== publishedDocRef.current;\n const invoke = () => {\n if (inertRef.current) return; // went inert (or unmounted) waiting\n const liveView = currentView();\n if (!liveView) return;\n // Focus before composing: a pick must return the caret to the\n // editable even when a host hook handles the insertion itself\n // (mobile keyboards would otherwise dismiss between picks).\n liveView.focus();\n if (onMacroInsertRef.current?.(macro) === true) return;\n insertPlainText(liveView, macro.content);\n };\n if (pending) void afterNextChange().then(invoke);\n else invoke();\n };\n\n /** Typed `.shortcut` + space → macro expansion (space consumed). */\n const expandTypedShortcut = (view: EditorView): boolean => {\n const groups = macrosRef.current;\n if (!groups) return false;\n const { selection } = view.state;\n if (!selection.empty) return false;\n const { $from } = selection;\n // Leaf nodes (hard breaks) read as a newline: still one character, so\n // the position math below holds, and `\\S+` cannot run across a soft\n // line break — `.c` typed after Shift+Enter still expands.\n const textBefore = $from.parent.textBetween(\n 0,\n $from.parentOffset,\n undefined,\n '\\n'\n );\n const match = /(\\S+)$/.exec(textBefore);\n if (!match) return false;\n const lowered = match[1].toLowerCase();\n const macro = groups\n .flatMap((group) => group.macros)\n .find((candidate) => candidate.shortcut?.toLowerCase() === lowered);\n if (!macro) return false;\n\n const from = $from.pos - match[1].length;\n // Without a host hook the whole expansion is one synchronous\n // transaction (token replaced by content — one undo step, no race).\n if (!onMacroInsertRef.current) {\n insertPlainText(view, macro.content, from, $from.pos);\n return true;\n }\n // A host hook composes from the last *published* value, so the token\n // removal must reach `onChange` first. While that publish is pending,\n // further edits (or a moved caret) must not misplace the insertion:\n // map the deletion point through every transaction and give up if it\n // is deleted out from under us.\n const editor = editorRef.current;\n view.dispatch(view.state.tr.delete(from, $from.pos));\n if (!editor) return true;\n let insertAt = from;\n let targetValid = true;\n const trackInsertionPoint = (event: Event) => {\n const tr = (\n event as globalThis.CustomEvent<{ transaction?: Transaction }>\n ).detail?.transaction;\n if (!tr) return;\n const mapped = tr.mapping.mapResult(insertAt);\n if (mapped.deleted) targetValid = false;\n insertAt = mapped.pos;\n };\n editor.addEventListener('transaction', trackInsertionPoint);\n void afterNextChange().then(() => {\n editor.removeEventListener('transaction', trackInsertionPoint);\n // The field may have gone disabled/readOnly (or remounted) while\n // the token-removal publish was pending — `editable: false` does\n // not block programmatic dispatch, so recheck before composing.\n if (inertRef.current || editorRef.current !== editor) return;\n if (onMacroInsertRef.current?.(macro) === true) return;\n if (!targetValid) return;\n const liveView = viewOf(editor);\n liveView.focus();\n const at = Math.min(insertAt, liveView.state.doc.content.size);\n insertPlainText(liveView, macro.content, at, at);\n });\n return true;\n };\n\n // --- Variables menu ---\n\n /**\n * Insert the variable token at the caret as one ProseMirror transaction\n * (native undo step). The view keeps its selection state while focus\n * sits in the menu, so refocusing restores the caret by itself.\n */\n const insertVariable = (variable: RichTextVariable) => {\n if (inertRef.current) return;\n const view = currentView();\n if (!view) return;\n view.focus();\n insertPlainText(view, variable.insertValue ?? variable.value);\n };\n\n /** Close path: hand focus back to the editor when it sits in the menu. */\n const handleVariablesOpenChange = (open: boolean) => {\n if (\n !open &&\n document.activeElement?.closest('[data-slot=\"dropdown-menu\"]')\n ) {\n currentView()?.focus();\n }\n setVariablesOpen(open);\n };\n\n /** Anchor the menu at the (visible) toolbar Variables button and open. */\n const openVariablesMenu = () => {\n if (inertRef.current) return;\n const root = wrapperRef.current;\n const frame = gutterWrapperRef.current;\n if (!root || !frame) return;\n const visible = (candidate: HTMLElement) =>\n candidate.getBoundingClientRect().width > 0;\n // When the button sits in the overflow popup, the popup has already\n // closed (0×0) by the time its forwarded mousedown lands here — fall\n // back to the overflow toggle (where the user just clicked), then the\n // toolbar itself (unmeasured, e.g. jsdom, included: `run` can only\n // fire from a rendered toolbar).\n const anchor =\n Array.from(\n root.querySelectorAll<HTMLElement>('.tar-menu-variables')\n ).find(visible) ??\n Array.from(\n root.querySelectorAll<HTMLElement>('.kb-custom-menu__overflow-toggle')\n ).find(visible) ??\n root.querySelector<HTMLElement>('.kb-custom-menu');\n if (!anchor) return;\n const rect = anchor.getBoundingClientRect();\n const frameRect = frame.getBoundingClientRect();\n setVariablesAnchor({\n top: rect.top - frameRect.top,\n left: rect.left - frameRect.left,\n width: rect.width,\n height: rect.height,\n });\n setVariablesOpen(true);\n };\n\n const toggleVariablesMenu = () => {\n if (variablesOpenRef.current) handleVariablesOpenChange(false);\n else openVariablesMenu();\n };\n\n // --- Block gutter menu ---\n\n const resetGutter = () => {\n hoverBlockRef.current = null;\n setGutterTop(editorTop + 4);\n };\n\n const handleGutterMouseMove = (event: React.MouseEvent) => {\n if (blockMenuOpen) return;\n const view = currentView();\n const wrapper = gutterWrapperRef.current;\n if (!view || !wrapper) return;\n let target: HTMLElement | null = null;\n let top: number | null = null;\n for (const child of Array.from(view.dom.children)) {\n const rect = child.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) continue;\n if (rect.top <= event.clientY) {\n target = child as HTMLElement;\n top = rect.top;\n }\n }\n if (!target || top === null) {\n resetGutter();\n return;\n }\n hoverBlockRef.current = target;\n const wrapperTop = wrapper.getBoundingClientRect().top;\n const next = Math.max(Math.round(top - wrapperTop), editorTop + 4);\n setGutterTop((current) => (current === next ? current : next));\n };\n\n /** Dropdown open/close driven by the gutter trigger (mouse path). */\n const handleBlockMenuOpenChange = (open: boolean) => {\n const view = currentView();\n if (open) {\n const block = hoverBlockRef.current;\n blockTargetPosRef.current =\n view && block && view.dom.contains(block)\n ? view.posAtDOM(block, 0)\n : null;\n } else if (view && document.activeElement?.closest('[role=\"menu\"]')) {\n // Escape: focus sits on a menu item about to unmount — hand it back\n // to the editor so typing resumes.\n view.focus();\n }\n setBlockMenuOpen(open);\n };\n\n /** Ctrl/Cmd+/ — open the menu targeting the caret's block. */\n const openBlockMenuAtCaret = () => {\n const view = currentView();\n const wrapper = gutterWrapperRef.current;\n if (view && wrapper) {\n const { from } = view.state.selection;\n blockTargetPosRef.current = from;\n try {\n const coords = view.coordsAtPos(from);\n const wrapperTop = wrapper.getBoundingClientRect().top;\n setGutterTop(\n Math.max(Math.round(coords.top - wrapperTop), editorTop + 4)\n );\n } catch {\n // Position lookup can fail mid-update; the menu still opens.\n }\n }\n setBlockMenuOpen(true);\n };\n\n /** Put the selection at the menu's captured target block. */\n const applyBlockTarget = (view: EditorView) => {\n const pos = blockTargetPosRef.current;\n if (pos === null) return;\n const clamped = Math.min(pos, view.state.doc.content.size);\n view.dispatch(\n view.state.tr.setSelection(\n TextSelection.near(view.state.doc.resolve(clamped))\n )\n );\n };\n\n const applyBlockFormat = (command: string) => {\n const editor = editorRef.current;\n if (inert || !editor) return;\n setBlockMenuOpen(false);\n const view = viewOf(editor);\n view.focus();\n applyBlockTarget(view);\n (editor.run as Record<string, undefined | (() => boolean)>)[command]?.();\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 // --- Dictation ---\n\n const toggleDictation = React.useRef(async () => {\n const SpeechRecognition = getSpeechRecognition();\n if (!SpeechRecognition) return;\n\n // Stop anything live — or still pending between `start()` and\n // `onstart`, when nothing is listening yet.\n if (isListeningRef.current || recognitionRef.current) {\n stopDictation();\n return;\n }\n\n const session = ++dictationSessionRef.current;\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 or unmounted — while awaiting\n // microphone permission; do not start an unstoppable, read-only or\n // orphaned session.\n if (session !== dictationSessionRef.current) return;\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 // A stop issued between `start()` and this callback already tore the\n // session down — do not arm an unstoppable restart loop.\n if (session !== dictationSessionRef.current) {\n try {\n recognition.stop();\n } catch {\n // Already stopped.\n }\n return;\n }\n setIsListening(true);\n isListeningRef.current = true;\n shouldRestartRef.current = true;\n };\n\n recognition.onresult = (event) => {\n // Results landing after Stop retired this session (or after a\n // restart swapped recognitions) must not focus the editor or\n // insert text.\n if (\n session !== dictationSessionRef.current ||\n recognitionRef.current !== recognition\n ) {\n return;\n }\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 const view = currentView();\n if (finalTranscript && view) {\n view.focus();\n insertPlainText(view, processDictation(finalTranscript) + ' ');\n }\n };\n\n recognition.onerror = (event) => {\n // A retired session's failures must not clear the live session's\n // listening state.\n if (\n session !== dictationSessionRef.current ||\n recognitionRef.current !== recognition\n ) {\n return;\n }\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 // The listening refs are shared across sessions: a stop + restart\n // inside this callback's window would read the NEW session's flags\n // and resurrect this retired recognition beside it. Only the\n // recognition still owning the session may restart — checked both\n // here and again after the delay.\n if (\n session === dictationSessionRef.current &&\n shouldRestartRef.current &&\n isListeningRef.current &&\n !inertRef.current\n ) {\n setTimeout(() => {\n if (\n session === dictationSessionRef.current &&\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 if (recognitionRef.current === recognition)\n recognitionRef.current = null;\n setIsListening(false);\n }\n }\n }, 100);\n } else {\n // Ended for good — release the ref so the next toggle starts a\n // fresh session instead of \"stopping\" a dead one. A retired\n // session must not touch the live one's listening state.\n if (recognitionRef.current === recognition)\n recognitionRef.current = null;\n if (session === dictationSessionRef.current) setIsListening(false);\n }\n };\n\n recognitionRef.current = recognition;\n try {\n recognition.start();\n } catch {\n recognitionRef.current = null;\n reportError('Failed to start speech recognition. Please try again.');\n }\n }).current;\n\n const stopDictation = React.useCallback(() => {\n // Invalidate any start still awaiting microphone permission — or a\n // recognition whose `onstart` hasn't fired yet — and tear down\n // unconditionally: `isListeningRef` is false in that pending window,\n // so an early-return would leave the recognition to arm itself with\n // no Stop control visible.\n dictationSessionRef.current += 1;\n shouldRestartRef.current = false;\n isListeningRef.current = false;\n const recognition = recognitionRef.current;\n recognitionRef.current = null;\n try {\n recognition?.stop();\n } catch {\n // Stopping before `onstart` can throw; the session bump above\n // already keeps it from arming.\n }\n setIsListening(false);\n }, []);\n\n React.useEffect(() => {\n setSpeechSupported(Boolean(getSpeechRecognition()));\n }, []);\n\n // Hiding the toolbar hides the Stop control; never leave an orphaned\n // session running. Same when the editor turns disabled/readOnly or the\n // dictation feature itself is switched off (which hides the button).\n React.useEffect(() => {\n if (!toolbarVisible || inert || !enableDictation) stopDictation();\n }, [toolbarVisible, inert, enableDictation, stopDictation]);\n\n // Hiding the toolbar hides the Variables anchor button; never leave the\n // menu floating over nothing (same when disabled/readOnly, or when\n // variableGroups empties — otherwise restoring the groups would reopen\n // the menu at its stale anchor without user activation).\n React.useEffect(() => {\n if (!toolbarVisible || inert || !hasVariables) setVariablesOpen(false);\n }, [toolbarVisible, inert, hasVariables]);\n\n // A resize can reflow the toolbar (buttons moving into or out of the\n // overflow popup), leaving the overlay anchored to stale coordinates\n // over some other control. The menu is transient — close it rather\n // than track the moving button. Observe the TOOLBAR, not the whole\n // field: opening the menu moves focus into the portaled panel, which\n // drops the field's :hover/:focus-within gutter padding and can rewrap\n // the text — editable-height churn must not dismiss the menu. Close\n // through the open-change handler so focus returns to the editor when\n // it was sitting inside the menu.\n React.useEffect(() => {\n if (!variablesOpen) return;\n const toolbar =\n wrapperRef.current?.querySelector<HTMLElement>('.kb-custom-menu');\n if (!toolbar || typeof ResizeObserver === 'undefined') return;\n let initial = true; // observe() always fires once immediately\n const observer = new ResizeObserver(() => {\n if (initial) {\n initial = false;\n return;\n }\n handleVariablesOpenChangeRef.current(false);\n });\n observer.observe(toolbar);\n return () => observer.disconnect();\n }, [variablesOpen]);\n\n // End-of-life cleanup.\n React.useEffect(() => stopDictation, [stopDictation]);\n\n // --- Kerebron toolbar additions (built once, read state through refs) ---\n\n const openBlockMenuAtCaretRef = React.useRef(openBlockMenuAtCaret);\n openBlockMenuAtCaretRef.current = openBlockMenuAtCaret;\n const expandTypedShortcutRef = React.useRef(expandTypedShortcut);\n expandTypedShortcutRef.current = expandTypedShortcut;\n const toggleVariablesMenuRef = React.useRef(toggleVariablesMenu);\n toggleVariablesMenuRef.current = toggleVariablesMenu;\n const handleVariablesOpenChangeRef = React.useRef(\n handleVariablesOpenChange\n );\n handleVariablesOpenChangeRef.current = handleVariablesOpenChange;\n\n const [menuAddon] = React.useState(() => {\n // Icon-only (filled Material-style paths, like Kerebron's stock\n // items): text labels clip to an empty square in the 32px overflow\n // grid and force the popup onto extra rows.\n const macrosItem = new MenuItem({\n icon: {\n width: 24,\n height: 24,\n // Material Symbols \"text snippet\" (Apache-2.0)\n path: 'M20.41 8.41l-4.83-4.83c-.37-.37-.88-.58-1.41-.58H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V9.83c0-.53-.21-1.04-.59-1.42zM7 7h7v2H7V7zm10 10H7v-2h10v2zm0-4H7v-2h10v2z',\n },\n title: macroLabels?.showMacros ?? 'Show macros',\n class: 'tar-menu-macros',\n select: () => hasMacrosRef.current,\n enable: () => !inertRef.current,\n active: () => macrosOpenRef.current,\n run: () => {\n setMacrosOpen((open) => !open);\n return true;\n },\n });\n const dictateItem = new MenuItem({\n icon: {\n width: 24,\n height: 24,\n // Material Symbols \"mic\" (Apache-2.0)\n path: 'M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z',\n },\n title: m('Start dictation'),\n class: 'tar-menu-dictate',\n select: () => dictationAvailableRef.current,\n enable: () => !inertRef.current,\n active: () => isListeningRef.current,\n run: () => {\n void toggleDictation();\n return true;\n },\n });\n const variablesItem = new MenuItem({\n icon: {\n width: 24,\n height: 24,\n // Material Symbols \"data object\" (Apache-2.0)\n path: 'M4 7v2c0 .55-.45 1-1 1H2v4h1c.55 0 1 .45 1 1v2c0 1.65 1.35 3 3 3h3v-2H7c-.55 0-1-.45-1-1v-2c0-1.3-.84-2.42-2-2.83v-.34C5.16 11.42 6 10.3 6 9V7c0-.55.45-1 1-1h3V4H7C5.35 4 4 5.35 4 7zm17 3c-.55 0-1-.45-1-1V7c0-1.65-1.35-3-3-3h-3v2h3c.55 0 1 .45 1 1v2c0 1.3.84 2.42 2 2.83v.34c-1.16.41-2 1.53-2 2.83v2c0 .55-.45 1-1 1h-3v2h3c1.65 0 3-1.35 3-3v-2c0-.55.45-1 1-1h1v-4h-1z',\n },\n title: m('Insert variable'),\n class: 'tar-menu-variables',\n select: () => hasVariablesRef.current,\n enable: () => !inertRef.current,\n active: () => variablesOpenRef.current,\n run: () => {\n toggleVariablesMenuRef.current();\n return true;\n },\n });\n const modifyMenu: ModifyMenu = (menus: MenuElement[][]) => [\n ...menus,\n // The patched MenuItem types `render().dom` as nullable, which no\n // longer satisfies MenuElement; our items always render a button.\n [variablesItem, macrosItem, dictateItem] as unknown as MenuElement[],\n ];\n const kit: EditorKit = {\n getExtensions: () => [\n new TextAreaRichExtension((view, event) => {\n if (inertRef.current) return false;\n if (\n event.key === '/' &&\n (event.ctrlKey || event.metaKey) &&\n !event.altKey\n ) {\n openBlockMenuAtCaretRef.current();\n return true;\n }\n if (\n event.key !== ' ' ||\n event.isComposing ||\n event.ctrlKey ||\n event.metaKey ||\n event.altKey\n ) {\n return false;\n }\n return expandTypedShortcutRef.current(view);\n }),\n ],\n };\n return { modifyMenu, kits: [kit] };\n });\n\n // The toolbar only repaints items on document/selection changes, so\n // React-side state (panel open, dictation) is synced into our injected\n // buttons directly. Kerebron's overflow popup builds FRESH buttons each\n // time it opens — construction-time labels and no aria-pressed — so a\n // childList observer re-syncs every rendered copy on arrival.\n React.useEffect(() => {\n const root = wrapperRef.current;\n if (!root || !ready) return;\n const sync = () => {\n // Disabled/readOnly must neutralize the stock toolbar too — its\n // buttons dispatch regardless of the view's `editable` prop. `inert`\n // blocks both pointer and keyboard access.\n for (const toolbar of root.querySelectorAll<HTMLElement>(\n '.kb-custom-menu, .kb-custom-menu__overflow-menu'\n )) {\n toolbar.inert = inert;\n }\n // The menu plugin re-runs item `update` callbacks only on document/\n // selection changes, so a button rendered while disabled/readOnly\n // keeps its disabled state when the field becomes editable without a\n // transaction — reconcile it here for every rendered copy.\n for (const macrosButton of root.querySelectorAll<HTMLElement>(\n '.tar-menu-macros'\n )) {\n macrosButton.style.display = hasMacros ? '' : 'none';\n macrosButton.classList.toggle('kb-menu__button--disabled', inert);\n macrosButton.setAttribute('aria-disabled', String(inert));\n macrosButton.classList.toggle('kb-menu__button--active', macrosOpen);\n macrosButton.setAttribute('aria-pressed', String(macrosOpen));\n const title = macrosOpen\n ? (macroLabels?.hideMacros ?? 'Hide macros')\n : (macroLabels?.showMacros ?? 'Show macros');\n macrosButton.setAttribute('title', title);\n macrosButton.setAttribute('aria-label', title);\n }\n for (const dictateButton of root.querySelectorAll<HTMLElement>(\n '.tar-menu-dictate'\n )) {\n dictateButton.style.display =\n enableDictation && speechSupported ? '' : 'none';\n dictateButton.classList.toggle('kb-menu__button--disabled', inert);\n dictateButton.setAttribute('aria-disabled', String(inert));\n dictateButton.classList.toggle(\n 'kb-menu__button--active',\n isListening\n );\n dictateButton.setAttribute('aria-pressed', String(isListening));\n const title = isListening\n ? m('Stop dictation')\n : m('Start dictation');\n dictateButton.setAttribute('title', title);\n dictateButton.setAttribute('aria-label', title);\n }\n for (const variablesButton of root.querySelectorAll<HTMLElement>(\n '.tar-menu-variables'\n )) {\n variablesButton.style.display = hasVariables ? '' : 'none';\n variablesButton.classList.toggle('kb-menu__button--disabled', inert);\n variablesButton.setAttribute('aria-disabled', String(inert));\n variablesButton.classList.toggle(\n 'kb-menu__button--active',\n variablesOpen\n );\n variablesButton.setAttribute('aria-haspopup', 'menu');\n variablesButton.setAttribute('aria-expanded', String(variablesOpen));\n const title = m('Insert variable');\n variablesButton.setAttribute('title', title);\n variablesButton.setAttribute('aria-label', title);\n }\n };\n sync();\n // Attribute writes don't retrigger a childList-only observer, so the\n // re-sync cannot loop.\n const observer = new MutationObserver((mutations) => {\n if (mutations.some((mutation) => mutation.addedNodes.length > 0)) {\n sync();\n }\n });\n observer.observe(root, { childList: true, subtree: true });\n return () => observer.disconnect();\n }, [\n ready,\n inert,\n hasMacros,\n macrosOpen,\n macroLabels,\n hasVariables,\n variablesOpen,\n enableDictation,\n speechSupported,\n isListening,\n toolbarVisible,\n m,\n ]);\n\n // --- Editor wiring ---\n\n const handleReady = (editor: CoreEditor) => {\n editorRef.current = editor;\n // The initial load publishes nothing; the loaded doc is the baseline.\n publishedDocRef.current = viewOf(editor).state.doc;\n setIsEmpty(docIsEmpty(viewOf(editor)));\n editor.addEventListener('transaction', () => {\n if (editorRef.current !== editor) return;\n setIsEmpty(docIsEmpty(viewOf(editor)));\n });\n setReady(true);\n };\n\n // The editable region's identity: ARIA naming, validation state and the\n // host-given id all live on the ProseMirror surface, like the legacy\n // contenteditable. setProps merges, so this never clobbers editability.\n React.useEffect(() => {\n const view = currentView();\n if (!view || !ready) return;\n view.setProps({\n attributes: {\n role: 'textbox',\n 'aria-multiline': 'true',\n ...(id ? { id } : {}),\n ...((ariaLabel ?? placeholder)\n ? { 'aria-label': (ariaLabel ?? placeholder) as string }\n : {}),\n ...(ariaLabelledBy ? { 'aria-labelledby': ariaLabelledBy } : {}),\n ...(ariaDescribedBy ? { 'aria-describedby': ariaDescribedBy } : {}),\n ...(ariaInvalid ? { 'aria-invalid': String(ariaInvalid) } : {}),\n // Booleanish: the string \"false\" must not read as required.\n ...(ariaRequired !== undefined\n ? { 'aria-required': String(ariaRequired) }\n : {}),\n ...(readOnly ? { 'aria-readonly': 'true' } : {}),\n ...(disabled ? { 'aria-disabled': 'true' } : {}),\n // Read-only keeps keyboard focus and text selection available;\n // ProseMirror drops natural tabbability once `editable` is false.\n tabindex: disabled ? '-1' : '0',\n // setProps replaces the create-time attributes, so the base\n // kb-editor class must be restated alongside any custom class.\n class: editorClassName ? `kb-editor ${editorClassName}` : 'kb-editor',\n },\n });\n }, [\n ready,\n id,\n ariaLabel,\n placeholder,\n ariaLabelledBy,\n ariaDescribedBy,\n ariaInvalid,\n ariaRequired,\n readOnly,\n disabled,\n editorClassName,\n ]);\n\n // Read-only keeps the region focusable/selectable but blocks edits —\n // enforced by RichEditor's own `readOnly` prop from creation (so the\n // surface is locked even while the initial document load is in flight).\n\n const appliedEditorStyle = React.useRef<\n Array<[HTMLElement['style'], string]>\n >([]);\n React.useEffect(() => {\n const view = currentView();\n const wrapper = wrapperRef.current;\n if (!view || !wrapper || !ready) return;\n // React style contract: camelCase keys, numbers in px (unless the\n // property is unitless — and custom properties pass through as\n // authored, never gaining a unit), and removed keys actually un-apply.\n const editableStyle = (view.dom as HTMLElement).style;\n for (const [style, property] of appliedEditorStyle.current) {\n style.removeProperty(property);\n }\n appliedEditorStyle.current = [];\n if (!editorStyle) return;\n for (const [key, raw] of Object.entries(editorStyle)) {\n if (raw === null || raw === undefined) continue;\n const isCustomProperty = key.startsWith('--');\n const property = isCustomProperty\n ? key\n : key.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`);\n const value =\n typeof raw === 'number' &&\n !isCustomProperty &&\n !UNITLESS_STYLE_PROPS.has(key)\n ? `${raw}px`\n : String(raw);\n // Custom properties land on the wrapper so they inherit to the\n // editable (whose kerebron.css metrics read them) AND the overlaid\n // placeholder; everything else styles the editable directly.\n const style = isCustomProperty ? wrapper.style : editableStyle;\n style.setProperty(property, value);\n appliedEditorStyle.current.push([style, property]);\n }\n }, [ready, editorStyle]);\n\n // The editable sits below the (optional) toolbar inside the gutter\n // wrapper; everything anchored beside it (placeholder, gutter +, docked\n // macro panel) offsets by the toolbar's live height.\n React.useEffect(() => {\n const view = currentView();\n const wrapper = gutterWrapperRef.current;\n if (!view || !wrapper || !ready) return;\n const measure = () => {\n const top = Math.max(\n Math.round(\n view.dom.getBoundingClientRect().top -\n wrapper.getBoundingClientRect().top\n ),\n 0\n );\n setEditorTop((current) => (current === top ? current : top));\n // A hovered block may have been deleted since; a detached node must\n // not pin the gutter button to its old offset. A still-connected one\n // moved with the toolbar's height change, so follow it — leaving the\n // stale offset would park the + button under the new toolbar.\n const hovered = hoverBlockRef.current;\n if (hovered?.isConnected) {\n const next = Math.max(\n Math.round(\n hovered.getBoundingClientRect().top -\n wrapper.getBoundingClientRect().top\n ),\n top + 4\n );\n setGutterTop((current) => (current === next ? current : next));\n } else {\n hoverBlockRef.current = null;\n setGutterTop(top + 4);\n }\n };\n measure();\n // Re-measure when the toolbar wraps to more/fewer rows.\n const observer = new ResizeObserver(measure);\n observer.observe(wrapper);\n return () => observer.disconnect();\n }, [ready, toolbarVisible]);\n\n return (\n <div\n ref={wrapperRef}\n data-slot=\"textarea-rich\"\n data-toolbar={toolbarVisible ? 'visible' : 'hidden'}\n data-inert={inert ? '' : undefined}\n data-macros-open={hasMacros && macrosOpen ? '' : undefined}\n data-compact-macros={compactMacros ? '' : undefined}\n data-gutter={gutterActive ? '' : undefined}\n data-block-menu={blockMenuOpen ? '' : undefined}\n className={cn(\n 'border-input rounded-lg border',\n 'transition-colors duration-200',\n 'focus-within:ring-ring focus-within:border-transparent focus-within:ring-2',\n 'flex flex-col',\n disabled && 'bg-muted/20',\n className\n )}\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 >\n <div className=\"relative flex min-h-0 flex-1 flex-col\">\n <div\n ref={gutterWrapperRef}\n data-slot=\"textarea-rich-body\"\n className={cn('relative flex-1', 'group/tar-body')}\n onMouseMove={gutterActive ? handleGutterMouseMove : undefined}\n >\n {gutterActive && (\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=\"textarea-rich-block-gutter\"\n className=\"absolute start-1 z-10\"\n style={{ top: gutterTop }}\n // Keep the editor focused through gutter interaction (see\n // the legacy surface for the full iOS rationale).\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 'opacity-0 transition-opacity',\n 'group-hover/tar-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 {BLOCK_FORMAT_ITEMS.map((item, index) => (\n <DropdownItem\n key={item.key}\n ref={index === 0 ? firstBlockItemRef : undefined}\n onClick={() => applyBlockFormat(item.command)}\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 disabled={!hasMacroEntries}\n >\n {blockMenuOpen &&\n macros.flatMap((group) => [\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 key={`m:${JSON.stringify([group.id, macro.id])}`}\n className=\"[&>[data-slot=dropdown-item-label]]:min-w-0 [&>[data-slot=dropdown-item-label]]:flex-1\"\n onClick={() => {\n setBlockMenuOpen(false);\n const view = currentView();\n if (view) {\n view.focus();\n // Insertion lands at the menu's target\n // block, mirroring the panel flow.\n applyBlockTarget(view);\n }\n insertMacro(macro);\n }}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n {macro.shortcut && (\n <span\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 setMacrosOpen(true);\n focusEditor();\n }}\n >\n {blockMenuLabels?.showMacroLibrary ??\n 'Show macro library'}\n </DropdownItem>\n <DropdownSeparator />\n </>\n )}\n <DropdownItem\n onClick={() => {\n setBlockMenuOpen(false);\n setToolbarVisibility(\n toolbarVisible ? 'hidden' : 'visible'\n );\n focusEditor();\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 end-0 z-[1]',\n 'truncate px-3 py-[7px]',\n 'transition-[padding] duration-200 motion-reduce:transition-none',\n // Mirrors the editable's sliding gutter indent (permanent\n // on touch devices, where the + trigger is always visible).\n gutterActive &&\n 'group-focus-within/tar-body:ps-10 group-hover/tar-body:ps-10 [@media(hover:none)]:ps-10',\n gutterActive && blockMenuOpen && 'ps-10',\n hasMacros && macrosOpen && 'md:me-72',\n editorClassName\n )}\n style={{\n top: editorTop,\n // Match the editable's metrics by construction: the same\n // variables (inherited from the wrapper) with the same\n // kerebron.css fallbacks that size the .kb-editor rule.\n fontSize: 'var(--textarea-rich-font-size, 1rem)',\n lineHeight: 'var(--textarea-rich-line-height, 1.5rem)',\n }}\n >\n {placeholder}\n </div>\n )}\n <RichEditor\n ref={editorHandleRef}\n value={value}\n onChange={handleChange}\n valueType=\"text/html\"\n strictValue\n modifyMenu={menuAddon.modifyMenu}\n editorKits={menuAddon.kits}\n onReady={handleReady}\n disabled={disabled}\n readOnly={readOnly}\n />\n {hasVariables && variablesOpen && variablesAnchor && (\n // Invisible React anchor laid exactly over the toolbar's\n // Variables button: the Dropdown positions off it, and the\n // trigger span swallows a toggle-off click before it can\n // reach the Kerebron button (whose `run` would reopen).\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions -- mousedown here only guards editor focus (preventDefault); the a11y contract lives on the real toolbar button underneath.\n <div\n data-slot=\"textarea-rich-variables-anchor\"\n className=\"absolute z-10\"\n style={variablesAnchor}\n // Keep the editor focused when the anchor itself is pressed\n // (see the block gutter above for the iOS rationale). The\n // portaled menu's React events bubble through here too —\n // those keep their defaults (caret placement and drag\n // selection in the search input need them).\n onMouseDown={(event) => {\n if (event.currentTarget.contains(event.target as Node)) {\n event.preventDefault();\n }\n }}\n >\n <Dropdown\n open={variablesOpen}\n onOpenChange={handleVariablesOpenChange}\n placement=\"bottom-start\"\n width={240}\n searchable\n searchPlaceholder={m('Search variables…')}\n searchAriaLabel={m('Search template variables')}\n searchEmptyState={m('No matching variables')}\n trigger={\n // Explicit size: the Dropdown's inline-flex anchor\n // container sizes to this span, matching the button.\n <span\n aria-hidden=\"true\"\n className=\"block\"\n style={{\n width: variablesAnchor.width,\n height: variablesAnchor.height,\n }}\n />\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={() => {\n handleVariablesOpenChange(false);\n insertVariable(variable);\n }}\n >\n {variable.label}\n </DropdownItem>\n ))}\n </React.Fragment>\n ))}\n </Dropdown>\n </div>\n )}\n </div>\n\n {hasMacros && (\n <AnimatedPresence>\n {macrosOpen && (\n <Animated\n key=\"macro-panel\"\n preset={macroSidePanel ? 'menu' : 'collapse'}\n enabled={macroSidePanel || !prefersReducedMotion}\n mode=\"presence\"\n custom={direction === 'rtl' ? 'left' : 'right'}\n fallbackClassName=\"animate-fade-in\"\n className=\"border-border flex max-h-72 flex-col overflow-hidden border-t md:absolute md:end-0 md:bottom-0 md:max-h-none md:w-72 md:overflow-visible md:border-s md:border-t-0\"\n // Docked below the toolbar (top only applies when the\n // panel goes absolute at md:).\n style={{ top: editorTop }}\n >\n <MacroLibrary\n id={macroPanelId}\n groups={macros!}\n onSelect={insertMacro}\n targetLabel={ariaLabel ?? placeholder}\n onClose={\n macrosOnFocus\n ? undefined\n : () => {\n setMacrosOpen(false);\n focusEditor();\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\nTextAreaRichKerebron.displayName = 'TextAreaRichKerebron';\n\nexport { TextAreaRichKerebron };\n"]}
|