@drghaliasri/butex 3.2.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/ButexEditor.tsx","../src/editor/factory.ts","../src/editor/atomicCommands.ts","../src/editor/atomicCommandsOperators.ts","../src/editor/digits.ts","../src/editor/render.ts","../src/editor/caretOrder.ts","../src/editor/traversal.ts","../src/editor/selection.ts","../src/editor/clipboard.ts","../src/editor/history.ts","../src/editor/state.ts","../src/editor/display/base.ts","../src/editor/display/delimiter.ts","../src/editor/display/frac.ts","../src/editor/display/sqrt.ts","../src/editor/display/env.ts","../src/diwani-font.ts","../src/editor/display/atomicCommand.ts","../src/editor/display/atomicCommandsOperators.ts","../src/editor/display/scripts.ts","../src/editor/display/index.ts","../src/editor/styles.ts","../src/editor/runtime.ts","../src/mathjax/svgPatcher.ts","../src/mathjax/renderIsland.ts","../src/react/widgetChromeCss.ts"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport {\n createEditorRuntime,\n atomicCommandsByCategory,\n atomicOperatorCommandsByCategory,\n injectBuTeXEditorStyles,\n isSpacingCommandSpec,\n renderArabicLatexFromSession,\n renderChainArabic,\n renderChainEnglish,\n renderEnglishLatexFromSession,\n setRenderError,\n shouldMirrorOperatorDisplay,\n type EditorRuntimeApi,\n} from '../editor/index.js';\nimport type { CharacterFontId, DigitFormId, EditorSession, EditorSide, EnvColumnAlignment, MatrixEnvStyle } from '../editor/types.js';\nimport type { AtomicCommandSpec, SpacingCommandSpec } from '../editor/atomicCommands.js';\nimport type { AtomicOperatorCommandSpec } from '../editor/atomicCommandsOperators.js';\nimport { patchBuTeXSvgMathAfterLayout, renderBuTeXMathIsland, type BuTeXMathOutput } from '../mathjax/renderIsland.js';\nimport { injectWidgetChromeCss } from './widgetChromeCss.js';\n\ndeclare global {\n interface Window {\n MathJax?: {\n typesetPromise?: (nodes: HTMLElement[]) => Promise<void>;\n typesetClear?: (nodes: HTMLElement[]) => void;\n tex2chtml?: (input: string, options?: { display?: boolean }) => HTMLElement;\n tex2chtmlPromise?: (input: string, options?: { display?: boolean }) => Promise<HTMLElement>;\n startup?: {\n promise?: Promise<void>;\n document?: { updateDocument?: () => void };\n };\n };\n }\n}\n\nexport type ButexEditorProps = {\n className?: string;\n /** Developer panels: LaTeX dump, passive chain preview, debug log. */\n debug?: boolean;\n initialSession?: EditorSession;\n onSessionChange?: (session: EditorSession) => void;\n};\n\nexport type ButexEditorHandle = {\n getRuntime: () => EditorRuntimeApi | null;\n};\n\nconst DIGIT_FORM_OPTIONS: Array<{ id: DigitFormId; label: string; title: string }> = [\n { id: 'western', label: '456', title: 'أرقام غربية' },\n { id: 'arabicIndic', label: '٤٥٦', title: 'أرقام عربية هندية' },\n { id: 'persianIndic', label: '۴۵۶', title: 'أرقام فارسية هندية' },\n];\nconst CHARACTER_FONT_OPTIONS: Array<{ id: CharacterFontId; label: string; title: string }> = [\n { id: 'default', label: 'س', title: 'الخط الافتراضي' },\n { id: 'takween', label: 'تك', title: 'خط تكوين' },\n { id: 'diwani', label: 'ديو', title: 'خط ديواني' },\n { id: 'diwaniOutline', label: 'ظل', title: 'خط ديواني مظلل' },\n];\nconst FUNCTION_COMMANDS = atomicCommandsByCategory('function');\nconst LIMITS_SERIES_COMMANDS = atomicCommandsByCategory('limits_series');\nconst FUNCTION2_COMMANDS = atomicCommandsByCategory('function2');\nconst GROUP_COMMANDS = atomicCommandsByCategory('groups');\nconst SPACING_COMMANDS = atomicCommandsByCategory('spacing').filter(isSpacingCommandSpec);\nconst OPERATOR_COMMANDS = atomicOperatorCommandsByCategory('operators1');\nconst OPERATOR2_COMMANDS = atomicOperatorCommandsByCategory('operators2');\nconst OPERATOR3_COMMANDS = atomicOperatorCommandsByCategory('operators3');\nconst DOT_COMMANDS = atomicOperatorCommandsByCategory('dots');\nconst INTEGRAL_COMMANDS = atomicOperatorCommandsByCategory('integrals');\nconst MATRIX_STYLES: Array<{ id: MatrixEnvStyle; label: string; title: string }> = [\n { id: 'matrix', label: '□', title: 'مصفوفة بلا أقواس' },\n { id: 'pmatrix', label: '(□)', title: 'مصفوفة بين قوسين' },\n { id: 'bmatrix', label: '[□]', title: 'مصفوفة بين معقوفين' },\n { id: 'Bmatrix', label: '{□}', title: 'مصفوفة بين حاصرتين' },\n { id: 'vmatrix', label: '|□|', title: 'مصفوفة بين خطين' },\n { id: 'Vmatrix', label: '||□||', title: 'مصفوفة بين خطين مزدوجين' },\n];\ntype EnvPaletteMode = 'matrix' | 'array' | 'aligned';\nconst ARRAY_ALIGNMENTS: Array<{ id: EnvColumnAlignment; label: string; title: string }> = [\n { id: 'l', label: 'يسار', title: 'محاذاة العمود إلى اليسار' },\n { id: 'c', label: 'وسط', title: 'محاذاة العمود في الوسط' },\n { id: 'r', label: 'يمين', title: 'محاذاة العمود إلى اليمين' },\n];\n\nfunction matrixSizeLabel(rows: number, columns: number): string {\n return `${String(rows)} صف × ${String(columns)} عمود`;\n}\n\nfunction clampMatrixSize(value: number): number {\n return Math.max(1, Math.min(12, Math.trunc(value)));\n}\n\nfunction digitFormLabel(digitForm: DigitFormId): string {\n return DIGIT_FORM_OPTIONS.find((option) => option.id === digitForm)?.label ?? '456';\n}\n\nfunction characterFontOption(fontId: CharacterFontId): { id: CharacterFontId; label: string; title: string } {\n return CHARACTER_FONT_OPTIONS.find((option) => option.id === fontId) ?? CHARACTER_FONT_OPTIONS[0];\n}\n\nfunction spacingArrow(spec: SpacingCommandSpec, side: EditorSide): string {\n const pointsWithFlow = spec.spacing.direction === 'positive';\n if (pointsWithFlow) {\n return side === 'arabic' ? '←' : '→';\n }\n return side === 'arabic' ? '→' : '←';\n}\n\nfunction renderArabicCommandLabel(command: AtomicCommandSpec): ReactNode {\n if (command.id !== 'ln') {\n return command.arabicLabel;\n }\n return (\n <span className=\"function-command-label-with-sub\" aria-hidden=\"true\">\n <span className=\"function-command-label-with-sub__base\">{command.arabicLabel}</span>\n <span className=\"function-command-label-with-sub__sub\">هـ</span>\n </span>\n );\n}\n\nfunction renderOperatorCommandLabel(command: AtomicOperatorCommandSpec): ReactNode {\n if (!command.svg_path) {\n return command.Label;\n }\n return (\n <span\n className=\"operator-command-svg-label\"\n aria-hidden=\"true\"\n style={{\n mask: `url(\"${command.svg_path}\") center / contain no-repeat`,\n WebkitMask: `url(\"${command.svg_path}\") center / contain no-repeat`,\n }}\n />\n );\n}\n\nfunction renderOperatorMenuButtonLabel(command: AtomicOperatorCommandSpec | undefined, fallback: string): ReactNode {\n if (!command) {\n return fallback;\n }\n return (\n <span className={shouldMirrorOperatorDisplay(command) ? 'operator-command-label operator-command-label--mirror' : 'operator-command-label'}>\n {renderOperatorCommandLabel(command)}\n </span>\n );\n}\n\nfunction passiveTreeText(session: EditorSession): string {\n const passive = session.activeSide === 'arabic' ? session.englishTree : session.arabicTree;\n const title =\n session.activeSide === 'arabic'\n ? 'السلسلة غير النشطة (إنجليزي)'\n : 'السلسلة غير النشطة (عربي)';\n const latex =\n session.activeSide === 'arabic'\n ? renderChainEnglish(passive)\n : renderChainArabic(passive);\n return `${title}\\n\\n${latex || 'فارغ'}`;\n}\n\nexport const ButexEditor = forwardRef<ButexEditorHandle, ButexEditorProps>(\n function ButexEditor({ className, debug = false, initialSession, onSessionChange }, ref) {\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const surfaceRef = useRef<HTMLDivElement | null>(null);\n const mathOutputRef = useRef<HTMLDivElement | null>(null);\n const renderErrorRef = useRef<HTMLDivElement | null>(null);\n const latexLinesRef = useRef<HTMLDivElement | null>(null);\n const passivePreviewRef = useRef<HTMLDivElement | null>(null);\n const debugLogRef = useRef<HTMLDivElement | null>(null);\n\n const undoBtnRef = useRef<HTMLButtonElement | null>(null);\n const redoBtnRef = useRef<HTMLButtonElement | null>(null);\n const copyBtnRef = useRef<HTMLButtonElement | null>(null);\n const cutBtnRef = useRef<HTMLButtonElement | null>(null);\n const splitTypingBtnRef = useRef<HTMLButtonElement | null>(null);\n const characterFontBtnRef = useRef<HTMLButtonElement | null>(null);\n const digitFormBtnRef = useRef<HTMLButtonElement | null>(null);\n\n const runtimeRef = useRef<EditorRuntimeApi | null>(null);\n const debugRef = useRef(debug);\n debugRef.current = debug;\n\n const onSessionChangeRef = useRef(onSessionChange);\n onSessionChangeRef.current = onSessionChange;\n\n const debugBodyHiddenRef = useRef(false);\n const [debugBodyHidden, setDebugBodyHidden] = useState(false);\n debugBodyHiddenRef.current = debugBodyHidden;\n const [digitMenuOpen, setDigitMenuOpen] = useState(false);\n const [characterFontMenuOpen, setCharacterFontMenuOpen] = useState(false);\n const [delimiterMenuOpen, setDelimiterMenuOpen] = useState(false);\n const [matrixMenuOpen, setMatrixMenuOpen] = useState(false);\n const [spacingMenuOpen, setSpacingMenuOpen] = useState(false);\n const [functionMenuOpen, setFunctionMenuOpen] = useState(false);\n const [limitsSeriesMenuOpen, setLimitsSeriesMenuOpen] = useState(false);\n const [function2MenuOpen, setFunction2MenuOpen] = useState(false);\n const [groupMenuOpen, setGroupMenuOpen] = useState(false);\n const [operatorMenuOpen, setOperatorMenuOpen] = useState(false);\n const [operator2MenuOpen, setOperator2MenuOpen] = useState(false);\n const [operator3MenuOpen, setOperator3MenuOpen] = useState(false);\n const [dotMenuOpen, setDotMenuOpen] = useState(false);\n const [integralMenuOpen, setIntegralMenuOpen] = useState(false);\n const [selectedDigitForm, setSelectedDigitForm] = useState<DigitFormId>('western');\n const [selectedCharacterFont, setSelectedCharacterFont] = useState<CharacterFontId>('default');\n const [activeEditorSide, setActiveEditorSide] = useState<EditorSide>('arabic');\n const [envPaletteMode, setEnvPaletteMode] = useState<EnvPaletteMode>('matrix');\n const [matrixStyle, setMatrixStyle] = useState<MatrixEnvStyle>('pmatrix');\n const [matrixRows, setMatrixRows] = useState(2);\n const [matrixColumns, setMatrixColumns] = useState(2);\n const [matrixHover, setMatrixHover] = useState<{ rows: number; columns: number } | null>(null);\n const [arrayAlignmentColumn, setArrayAlignmentColumn] = useState(1);\n\n useImperativeHandle(ref, () => ({\n getRuntime: () => runtimeRef.current,\n }));\n\n const updatePreview = useCallback(async (session: EditorSession) => {\n const mathOutputEl = mathOutputRef.current;\n const renderErrorEl = renderErrorRef.current;\n const latexLinesEl = latexLinesRef.current;\n const passivePreviewEl = passivePreviewRef.current;\n const debugLogEl = debugLogRef.current;\n\n const english = renderEnglishLatexFromSession(session);\n const arabic = renderArabicLatexFromSession(session);\n const activeLatex = session.activeSide === 'arabic' ? arabic : english;\n\n if (debugRef.current && latexLinesEl) {\n latexLinesEl.textContent = `LaTeX إنجليزي:\\n${english || 'فارغ'}\\n\\nLaTeX عربي:\\n${arabic || 'فارغ'}`;\n }\n if (debugRef.current && passivePreviewEl) {\n passivePreviewEl.textContent = passiveTreeText(session);\n passivePreviewEl.classList.toggle('passive--ltr', session.activeSide === 'arabic');\n }\n if (debugRef.current && debugLogEl) {\n const lines = session.debugLog.map((entry) => JSON.stringify(entry));\n debugLogEl.textContent = lines.join('\\n');\n debugLogEl.hidden = debugBodyHiddenRef.current;\n }\n\n if (!renderErrorEl) {\n return;\n }\n\n try {\n if (typeof window !== 'undefined' && mathOutputEl) {\n const mj = (window as { MathJax?: { tex2svg?: unknown; tex2svgPromise?: unknown } }).MathJax;\n const previewOutput: BuTeXMathOutput =\n mj?.tex2svg != null || mj?.tex2svgPromise != null ? 'svg' : 'chtml';\n const node = await renderBuTeXMathIsland(activeLatex || '\\\\, ', { display: true, output: previewOutput });\n mathOutputEl.replaceChildren(node);\n if (previewOutput === 'svg') {\n patchBuTeXSvgMathAfterLayout(mathOutputEl);\n }\n }\n renderErrorEl.hidden = true;\n renderErrorEl.textContent = '';\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n renderErrorEl.hidden = false;\n renderErrorEl.textContent = `خطأ MathJax: ${message}`;\n if (runtimeRef.current) {\n runtimeRef.current.setSession(setRenderError(runtimeRef.current.getSession(), message));\n }\n }\n }, []);\n\n const updatePreviewRef = useRef(updatePreview);\n updatePreviewRef.current = updatePreview;\n\n useEffect(() => {\n injectWidgetChromeCss();\n injectBuTeXEditorStyles(typeof document !== 'undefined' ? document : undefined);\n\n const surfaceEl = surfaceRef.current;\n if (!surfaceEl) {\n return;\n }\n\n const runtime = createEditorRuntime({\n surfaceEl,\n initialSession,\n buttonElements: {\n undoBtn: undoBtnRef.current,\n redoBtn: redoBtnRef.current,\n copyBtn: copyBtnRef.current,\n cutBtn: cutBtnRef.current,\n splitTypingBtn: splitTypingBtnRef.current,\n digitFormBtn: digitFormBtnRef.current,\n },\n outsidePointerIgnoreSelectors: ['.butex-widget .toolbar', '#btn-copy', '#btn-cut', '#btn-paste'],\n onSessionChange: (session) => {\n setSelectedDigitForm(session.currentDigitForm ?? 'western');\n setSelectedCharacterFont(session.currentCharacterFont ?? 'default');\n setActiveEditorSide(session.activeSide);\n onSessionChangeRef.current?.(session);\n void updatePreviewRef.current(session).catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n const el = renderErrorRef.current;\n if (el) {\n el.hidden = false;\n el.textContent = `خطأ في المعاينة: ${message}`;\n }\n });\n },\n });\n runtimeRef.current = runtime;\n\n if (typeof window !== 'undefined' && window.MathJax?.startup?.promise) {\n window.MathJax.startup.promise\n .then(() => {\n runtime.render();\n })\n .catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n if (runtimeRef.current) {\n runtimeRef.current.setSession(setRenderError(runtimeRef.current.getSession(), message));\n }\n runtime.render();\n });\n } else {\n runtime.render();\n }\n\n surfaceEl.focus();\n\n return () => {\n runtime.destroy();\n runtimeRef.current = null;\n };\n }, []);\n\n function focusSurface(): void {\n surfaceRef.current?.focus();\n }\n\n function insertSelectedEnvironment(rows: number, columns: number): void {\n if (envPaletteMode === 'array') {\n runtimeRef.current?.insertArrayEnv(rows, columns);\n } else if (envPaletteMode === 'aligned') {\n runtimeRef.current?.insertAlignedEnv(rows, columns);\n } else {\n runtimeRef.current?.insertMatrixEnv(matrixStyle, rows, columns);\n }\n }\n\n return (\n <div\n ref={wrapperRef}\n className={`butex-widget ${className ?? ''}`.trim()}\n dir=\"rtl\"\n lang=\"ar\"\n >\n <div className=\"butex-widget-layout\">\n <section className=\"panel\">\n <div className=\"toolbar\">\n <div className=\"toolbar-group toolbar-history\" role=\"group\" aria-label=\"تراجع وإعادة\">\n <button ref={undoBtnRef} id=\"btn-undo\" type=\"button\" className=\"icon-btn\" title=\"تراجع\" aria-label=\"تراجع\">\n ↷\n </button>\n <button ref={redoBtnRef} id=\"btn-redo\" type=\"button\" className=\"icon-btn\" title=\"إعادة\" aria-label=\"إعادة\">\n ↶\n </button>\n </div>\n <div className=\"toolbar-group toolbar-clipboard\" role=\"group\" aria-label=\"الحافظة\">\n <button ref={copyBtnRef} id=\"btn-copy\" type=\"button\" className=\"icon-btn\" title=\"نسخ\" aria-label=\"نسخ\" disabled>\n ⧉\n </button>\n <button ref={cutBtnRef} id=\"btn-cut\" type=\"button\" className=\"icon-btn\" title=\"قص\" aria-label=\"قص\" disabled>\n ✂\n </button>\n <button\n id=\"btn-paste\"\n type=\"button\"\n className=\"icon-btn\"\n title=\"لصق\"\n aria-label=\"لصق\"\n onClick={() => {\n void runtimeRef.current?.performPaste().then(() => {\n focusSurface();\n });\n }}\n >\n ⎘\n </button>\n </div>\n <div className=\"toolbar-group toolbar-settings\" role=\"group\" aria-label=\"إعدادات المحرر\">\n <button className=\"icon-btn accent\" type=\"button\" title=\"تبديل عربي / إنجليزي\" aria-label=\"تبديل عربي / إنجليزي\" onClick={() => runtimeRef.current?.toggleSide()}>\n ⇄\n </button>\n </div>\n <div className=\"toolbar-group toolbar-structures\" role=\"group\" aria-label=\"البنى\">\n <div\n className=\"delimiter-command-menu\"\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setDelimiterMenuOpen(false);\n }\n }}\n >\n <button\n className=\"icon-btn delimiter-command-btn\"\n type=\"button\"\n title=\"إدراج محددات\"\n aria-label=\"إدراج محددات\"\n aria-haspopup=\"listbox\"\n aria-expanded={delimiterMenuOpen}\n onClick={() => setDelimiterMenuOpen((open) => !open)}\n >\n ()\n </button>\n <div className=\"delimiter-command-options\" role=\"listbox\" aria-label=\"إدراج محددات\" hidden={!delimiterMenuOpen}>\n <button\n className=\"delimiter-command-option\"\n data-delim=\"paren\"\n type=\"button\"\n role=\"option\"\n title=\"إدراج قوسين\"\n aria-label=\"إدراج قوسين\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertDelimiterByKind('paren');\n setDelimiterMenuOpen(false);\n focusSurface();\n }}\n >\n ()\n </button>\n <button\n className=\"delimiter-command-option\"\n data-delim=\"bracket\"\n type=\"button\"\n role=\"option\"\n title=\"إدراج معقوفين\"\n aria-label=\"إدراج معقوفين\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertDelimiterByKind('bracket');\n setDelimiterMenuOpen(false);\n focusSurface();\n }}\n >\n []\n </button>\n <button\n className=\"delimiter-command-option\"\n data-delim=\"brace\"\n type=\"button\"\n role=\"option\"\n title=\"إدراج حاصرتين\"\n aria-label=\"إدراج حاصرتين\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertDelimiterByKind('brace');\n setDelimiterMenuOpen(false);\n focusSurface();\n }}\n >\n {'{}'}\n </button>\n </div>\n </div>\n <button id=\"insert-frac\" className=\"icon-btn frac-icon-btn\" type=\"button\" title=\"إدراج كسر\" aria-label=\"إدراج كسر\" onClick={() => { runtimeRef.current?.insertFraction(); focusSurface(); }}>\n <span className=\"toolbar-frac-icon\" aria-hidden=\"true\"><span>أ</span><span>ب</span></span>\n </button>\n <button id=\"insert-sqrt\" className=\"icon-btn\" type=\"button\" title=\"إدراج جذر\" aria-label=\"إدراج جذر\" onClick={() => { runtimeRef.current?.insertSqrt(); focusSurface(); }}>\n <span className=\"toolbar-sqrt-icon\" aria-hidden=\"true\">√</span>\n </button>\n </div>\n <div className=\"toolbar-group toolbar-environments\" role=\"group\" aria-label=\"البيئات\">\n <div\n className=\"matrix-command-menu\"\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setMatrixMenuOpen(false);\n }\n }}\n >\n <button\n className=\"icon-btn matrix-command-btn\"\n type=\"button\"\n title=\"إدراج بيئة شبكية\"\n aria-label=\"إدراج بيئة شبكية\"\n aria-haspopup=\"dialog\"\n aria-expanded={matrixMenuOpen}\n onClick={() => setMatrixMenuOpen((open) => !open)}\n >\n <span className=\"toolbar-matrix-icon\" aria-hidden=\"true\"><span /><span /><span /><span /></span>\n </button>\n <div className=\"matrix-command-popover\" role=\"dialog\" aria-label=\"إدراج بيئة شبكية\" hidden={!matrixMenuOpen}>\n <div className=\"matrix-style-options\" role=\"listbox\" aria-label=\"نوع البيئة\">\n {[\n { id: 'matrix' as const, label: 'مصفوفة' },\n { id: 'array' as const, label: 'جدول' },\n { id: 'aligned' as const, label: 'محاذاة' },\n ].map((option) => (\n <button\n key={option.id}\n type=\"button\"\n role=\"option\"\n aria-selected={envPaletteMode === option.id}\n className=\"matrix-style-option\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n setEnvPaletteMode(option.id);\n if (option.id === 'aligned') {\n setMatrixColumns(2);\n }\n }}\n >\n {option.label}\n </button>\n ))}\n </div>\n {envPaletteMode === 'matrix' ? (\n <div className=\"matrix-style-options\" role=\"listbox\" aria-label=\"نوع المصفوفة\">\n {MATRIX_STYLES.map((style) => (\n <button\n key={style.id}\n type=\"button\"\n role=\"option\"\n aria-selected={matrixStyle === style.id}\n className=\"matrix-style-option\"\n title={style.title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n setMatrixStyle(style.id);\n }}\n >\n {style.label}\n </button>\n ))}\n </div>\n ) : null}\n <div className=\"matrix-size-readout\">\n {matrixHover ? matrixSizeLabel(matrixHover.rows, matrixHover.columns) : matrixSizeLabel(matrixRows, matrixColumns)}\n </div>\n <div className=\"matrix-grid-picker\" aria-label=\"اختيار حجم البيئة\">\n {Array.from({ length: 8 }, (_, rowIndex) =>\n Array.from({ length: 8 }, (_, columnIndex) => {\n const rows = rowIndex + 1;\n const columns = columnIndex + 1;\n const activeRows = matrixHover?.rows ?? matrixRows;\n const activeColumns = matrixHover?.columns ?? matrixColumns;\n return (\n <button\n key={`${rows}-${columns}`}\n type=\"button\"\n className={rows <= activeRows && columns <= activeColumns ? 'matrix-grid-cell active' : 'matrix-grid-cell'}\n title={matrixSizeLabel(rows, columns)}\n aria-label={matrixSizeLabel(rows, columns)}\n onMouseEnter={() => setMatrixHover({ rows, columns })}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n setMatrixRows(rows);\n setMatrixColumns(columns);\n insertSelectedEnvironment(rows, columns);\n setMatrixMenuOpen(false);\n setMatrixHover(null);\n focusSurface();\n }}\n />\n );\n }),\n )}\n </div>\n <div className=\"matrix-custom-size\">\n <label>\n صف\n <input\n type=\"number\"\n min={1}\n max={12}\n value={matrixRows}\n onChange={(event) => setMatrixRows(clampMatrixSize(Number(event.currentTarget.value) || 1))}\n />\n </label>\n <label>\n عمود\n <input\n type=\"number\"\n min={1}\n max={12}\n value={matrixColumns}\n onChange={(event) => setMatrixColumns(clampMatrixSize(Number(event.currentTarget.value) || 1))}\n />\n </label>\n <button\n type=\"button\"\n className=\"matrix-insert-custom\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n const rows = clampMatrixSize(matrixRows);\n const columns = clampMatrixSize(matrixColumns);\n insertSelectedEnvironment(rows, columns);\n setMatrixMenuOpen(false);\n setMatrixHover(null);\n focusSurface();\n }}\n >\n إدراج\n </button>\n </div>\n <div className=\"matrix-edit-actions\" aria-label=\"تعديل البيئة المحددة\">\n {envPaletteMode === 'matrix' ? (\n <button type=\"button\" title=\"تطبيق النمط على المصفوفة المحددة\" onMouseDown={(event) => event.preventDefault()} onClick={() => runtimeRef.current?.setMatrixEnvStyle(matrixStyle)}>\n تطبيق النمط\n </button>\n ) : null}\n {envPaletteMode === 'array' ? (\n <>\n <label>\n عمود\n <input\n type=\"number\"\n min={1}\n max={12}\n value={arrayAlignmentColumn}\n onChange={(event) => setArrayAlignmentColumn(clampMatrixSize(Number(event.currentTarget.value) || 1))}\n />\n </label>\n {ARRAY_ALIGNMENTS.map((alignment) => (\n <button\n key={alignment.id}\n type=\"button\"\n title={alignment.title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => runtimeRef.current?.setArrayColumnAlignment(arrayAlignmentColumn - 1, alignment.id)}\n >\n {alignment.label}\n </button>\n ))}\n </>\n ) : null}\n <button type=\"button\" title=\"إضافة صف\" onMouseDown={(event) => event.preventDefault()} onClick={() => runtimeRef.current?.addMatrixRow()}>\n +صف\n </button>\n <button type=\"button\" title=\"حذف صف\" onMouseDown={(event) => event.preventDefault()} onClick={() => runtimeRef.current?.removeMatrixRow()}>\n -صف\n </button>\n <button type=\"button\" title=\"إضافة عمود\" onMouseDown={(event) => event.preventDefault()} onClick={() => runtimeRef.current?.addMatrixColumn()}>\n +عمود\n </button>\n <button type=\"button\" title=\"حذف عمود\" onMouseDown={(event) => event.preventDefault()} onClick={() => runtimeRef.current?.removeMatrixColumn()}>\n -عمود\n </button>\n </div>\n </div>\n </div>\n </div>\n <div className=\"toolbar-group toolbar-settings\" role=\"group\" aria-label=\"الفراغات\">\n <div\n className={`spacing-command-menu spacing-command-menu--${activeEditorSide}`}\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setSpacingMenuOpen(false);\n }\n }}\n >\n <button\n className=\"icon-btn spacing-command-btn\"\n type=\"button\"\n title=\"إدراج فراغ\"\n aria-label=\"إدراج فراغ\"\n aria-haspopup=\"listbox\"\n aria-expanded={spacingMenuOpen}\n onClick={() => setSpacingMenuOpen((open) => !open)}\n >\n <span className=\"spacing-command-glyph spacing-command-glyph--positive spacing-command-glyph--level-2\" aria-hidden=\"true\">\n <span className=\"spacing-command-glyph__bar\" />\n <span className=\"spacing-command-glyph__arrow\">{activeEditorSide === 'arabic' ? '←' : '→'}</span>\n </span>\n </button>\n <div className=\"spacing-command-options\" role=\"listbox\" aria-label=\"إدراج فراغ\" hidden={!spacingMenuOpen}>\n {SPACING_COMMANDS.map((command) => (\n <button\n key={command.id}\n type=\"button\"\n role=\"option\"\n className={`spacing-command-option spacing-command-option--${command.spacing.direction}`}\n title={command.title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertAtomicCommand(command.id);\n setSpacingMenuOpen(false);\n focusSurface();\n }}\n >\n <span className={`spacing-command-glyph spacing-command-glyph--${command.spacing.direction} spacing-command-glyph--level-${String(command.spacing.level)}`} aria-hidden=\"true\">\n {command.spacing.direction === 'negative' ? <span className=\"spacing-command-glyph__arrow\">{spacingArrow(command, activeEditorSide)}</span> : null}\n <span className=\"spacing-command-glyph__bar\" />\n {command.spacing.direction === 'positive' ? <span className=\"spacing-command-glyph__arrow\">{spacingArrow(command, activeEditorSide)}</span> : null}\n </span>\n <span className=\"spacing-command-option__name\">{command.title}</span>\n </button>\n ))}\n </div>\n </div>\n </div>\n <div className=\"toolbar-group toolbar-functions\" role=\"group\" aria-label=\"الدوال\">\n <div\n className=\"function-command-menu\"\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setFunctionMenuOpen(false);\n }\n }}\n >\n <button\n className=\"icon-btn function-command-btn\"\n type=\"button\"\n title=\"إدراج دالة\"\n aria-label=\"إدراج دالة\"\n aria-haspopup=\"listbox\"\n aria-expanded={functionMenuOpen}\n onClick={() => setFunctionMenuOpen((open) => !open)}\n >\n {FUNCTION_COMMANDS[0]?.arabicLabel ?? 'د'}\n </button>\n <div className=\"function-command-options\" role=\"listbox\" aria-label=\"إدراج دالة\" hidden={!functionMenuOpen}>\n {FUNCTION_COMMANDS.map((command) => (\n <button\n key={command.id}\n className=\"function-command-option\"\n type=\"button\"\n role=\"option\"\n title={command.title}\n aria-label={command.title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertAtomicCommand(command.id);\n setFunctionMenuOpen(false);\n focusSurface();\n }}\n >\n {command.arabicLabel}\n </button>\n ))}\n </div>\n </div>\n <div\n className=\"function-command-menu function-command-menu--limits-series\"\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setLimitsSeriesMenuOpen(false);\n }\n }}\n >\n <button\n className=\"icon-btn function-command-btn\"\n type=\"button\"\n title=\"إدراج حدود ومتسلسلات\"\n aria-label=\"إدراج حدود ومتسلسلات\"\n aria-haspopup=\"listbox\"\n aria-expanded={limitsSeriesMenuOpen}\n onClick={() => setLimitsSeriesMenuOpen((open) => !open)}\n >\n {LIMITS_SERIES_COMMANDS[0]?.arabicLabel ?? 'حد'}\n </button>\n <div className=\"function-command-options\" role=\"listbox\" aria-label=\"إدراج حدود ومتسلسلات\" hidden={!limitsSeriesMenuOpen}>\n {LIMITS_SERIES_COMMANDS.map((command) => (\n <button\n key={command.id}\n className=\"function-command-option\"\n type=\"button\"\n role=\"option\"\n title={command.title}\n aria-label={command.title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertAtomicCommand(command.id);\n setLimitsSeriesMenuOpen(false);\n focusSurface();\n }}\n >\n {command.arabicLabel}\n </button>\n ))}\n </div>\n </div>\n <div\n className=\"function-command-menu function-command-menu--function2\"\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setFunction2MenuOpen(false);\n }\n }}\n >\n <button\n className=\"icon-btn function-command-btn\"\n type=\"button\"\n title=\"إدراج دوال إضافية\"\n aria-label=\"إدراج دوال إضافية\"\n aria-haspopup=\"listbox\"\n aria-expanded={function2MenuOpen}\n onClick={() => setFunction2MenuOpen((open) => !open)}\n >\n {FUNCTION2_COMMANDS[0]?.arabicLabel ?? 'د'}\n </button>\n <div className=\"function-command-options\" role=\"listbox\" aria-label=\"إدراج دوال إضافية\" hidden={!function2MenuOpen}>\n {FUNCTION2_COMMANDS.map((command) => (\n <button\n key={command.id}\n className=\"function-command-option\"\n type=\"button\"\n role=\"option\"\n title={command.title}\n aria-label={command.title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertAtomicCommand(command.id);\n setFunction2MenuOpen(false);\n focusSurface();\n }}\n >\n {renderArabicCommandLabel(command)}\n </button>\n ))}\n </div>\n </div>\n <div\n className=\"function-command-menu function-command-menu--groups\"\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setGroupMenuOpen(false);\n }\n }}\n >\n <button\n className=\"icon-btn function-command-btn\"\n type=\"button\"\n title=\"إدراج مجموعات أعداد\"\n aria-label=\"إدراج مجموعات أعداد\"\n aria-haspopup=\"listbox\"\n aria-expanded={groupMenuOpen}\n onClick={() => setGroupMenuOpen((open) => !open)}\n >\n {GROUP_COMMANDS[0]?.arabicLabel ?? 'م'}\n </button>\n <div className=\"function-command-options\" role=\"listbox\" aria-label=\"إدراج مجموعات أعداد\" hidden={!groupMenuOpen}>\n {GROUP_COMMANDS.map((command) => (\n <button\n key={command.id}\n className=\"function-command-option\"\n type=\"button\"\n role=\"option\"\n title={command.title}\n aria-label={command.title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertAtomicCommand(command.id);\n setGroupMenuOpen(false);\n focusSurface();\n }}\n >\n {command.arabicLabel}\n </button>\n ))}\n </div>\n </div>\n </div>\n <div className=\"toolbar-group toolbar-operators\" role=\"group\" aria-label=\"العمليات\">\n <div\n className=\"function-command-menu operator-command-menu\"\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setOperatorMenuOpen(false);\n }\n }}\n >\n <button\n className=\"icon-btn function-command-btn operator-command-btn\"\n type=\"button\"\n title=\"إدراج رمز عملية\"\n aria-label=\"إدراج رمز عملية\"\n aria-haspopup=\"listbox\"\n aria-expanded={operatorMenuOpen}\n onClick={() => setOperatorMenuOpen((open) => !open)}\n >\n {renderOperatorMenuButtonLabel(OPERATOR_COMMANDS[0], '∗')}\n </button>\n <div className=\"function-command-options operator-command-options\" role=\"listbox\" aria-label=\"إدراج رمز عملية\" hidden={!operatorMenuOpen}>\n {OPERATOR_COMMANDS.map((command) => (\n <button\n key={command.id}\n className=\"function-command-option operator-command-option\"\n type=\"button\"\n role=\"option\"\n title={command.title}\n aria-label={command.title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertAtomicOperatorCommand(command.id);\n setOperatorMenuOpen(false);\n focusSurface();\n }}\n >\n <span className={shouldMirrorOperatorDisplay(command) ? 'operator-command-label operator-command-label--mirror' : 'operator-command-label'}>\n {renderOperatorCommandLabel(command)}\n </span>\n </button>\n ))}\n </div>\n </div>\n <div\n className=\"function-command-menu operator-command-menu\"\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setOperator2MenuOpen(false);\n }\n }}\n >\n <button\n className=\"icon-btn function-command-btn operator-command-btn\"\n type=\"button\"\n title=\"إدراج رموز علاقات ومجموعات\"\n aria-label=\"إدراج رموز علاقات ومجموعات\"\n aria-haspopup=\"listbox\"\n aria-expanded={operator2MenuOpen}\n onClick={() => setOperator2MenuOpen((open) => !open)}\n >\n ∩\n </button>\n <div className=\"function-command-options operator-command-options\" role=\"listbox\" aria-label=\"إدراج رموز علاقات ومجموعات\" hidden={!operator2MenuOpen}>\n {OPERATOR2_COMMANDS.map((command) => (\n <button\n key={command.id}\n className=\"function-command-option operator-command-option\"\n type=\"button\"\n role=\"option\"\n title={command.title}\n aria-label={command.title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertAtomicOperatorCommand(command.id);\n setOperator2MenuOpen(false);\n focusSurface();\n }}\n >\n <span className={shouldMirrorOperatorDisplay(command) ? 'operator-command-label operator-command-label--mirror' : 'operator-command-label'}>\n {renderOperatorCommandLabel(command)}\n </span>\n </button>\n ))}\n </div>\n </div>\n <div\n className=\"function-command-menu operator-command-menu\"\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setOperator3MenuOpen(false);\n }\n }}\n >\n <button\n className=\"icon-btn function-command-btn operator-command-btn\"\n type=\"button\"\n title=\"إدراج أسهم\"\n aria-label=\"إدراج أسهم\"\n aria-haspopup=\"listbox\"\n aria-expanded={operator3MenuOpen}\n onClick={() => setOperator3MenuOpen((open) => !open)}\n >\n {renderOperatorMenuButtonLabel(OPERATOR3_COMMANDS[0], '⇒')}\n </button>\n <div className=\"function-command-options operator-command-options\" role=\"listbox\" aria-label=\"إدراج أسهم\" hidden={!operator3MenuOpen}>\n {OPERATOR3_COMMANDS.map((command) => (\n <button\n key={command.id}\n className=\"function-command-option operator-command-option\"\n type=\"button\"\n role=\"option\"\n title={command.title}\n aria-label={command.title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertAtomicOperatorCommand(command.id);\n setOperator3MenuOpen(false);\n focusSurface();\n }}\n >\n <span className={shouldMirrorOperatorDisplay(command) ? 'operator-command-label operator-command-label--mirror' : 'operator-command-label'}>\n {renderOperatorCommandLabel(command)}\n </span>\n </button>\n ))}\n </div>\n </div>\n <div\n className=\"function-command-menu operator-command-menu\"\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setDotMenuOpen(false);\n }\n }}\n >\n <button\n className=\"icon-btn function-command-btn operator-command-btn\"\n type=\"button\"\n title=\"إدراج نقاط\"\n aria-label=\"إدراج نقاط\"\n aria-haspopup=\"listbox\"\n aria-expanded={dotMenuOpen}\n onClick={() => setDotMenuOpen((open) => !open)}\n >\n {renderOperatorMenuButtonLabel(DOT_COMMANDS[0], '…')}\n </button>\n <div className=\"function-command-options operator-command-options\" role=\"listbox\" aria-label=\"إدراج نقاط\" hidden={!dotMenuOpen}>\n {DOT_COMMANDS.map((command) => (\n <button\n key={command.id}\n className=\"function-command-option operator-command-option\"\n type=\"button\"\n role=\"option\"\n title={command.title}\n aria-label={command.title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertAtomicOperatorCommand(command.id);\n setDotMenuOpen(false);\n focusSurface();\n }}\n >\n <span className={shouldMirrorOperatorDisplay(command) ? 'operator-command-label operator-command-label--mirror' : 'operator-command-label'}>\n {renderOperatorCommandLabel(command)}\n </span>\n </button>\n ))}\n </div>\n </div>\n <div\n className=\"function-command-menu operator-command-menu\"\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setIntegralMenuOpen(false);\n }\n }}\n >\n <button\n className=\"icon-btn function-command-btn operator-command-btn\"\n type=\"button\"\n title=\"إدراج تكاملات\"\n aria-label=\"إدراج تكاملات\"\n aria-haspopup=\"listbox\"\n aria-expanded={integralMenuOpen}\n onClick={() => setIntegralMenuOpen((open) => !open)}\n >\n {renderOperatorMenuButtonLabel(INTEGRAL_COMMANDS[0], '∫')}\n </button>\n <div className=\"function-command-options operator-command-options\" role=\"listbox\" aria-label=\"إدراج تكاملات\" hidden={!integralMenuOpen}>\n {INTEGRAL_COMMANDS.map((command) => (\n <button\n key={command.id}\n className=\"function-command-option operator-command-option\"\n type=\"button\"\n role=\"option\"\n title={command.title}\n aria-label={command.title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertAtomicOperatorCommand(command.id);\n setIntegralMenuOpen(false);\n focusSurface();\n }}\n >\n <span className={shouldMirrorOperatorDisplay(command) ? 'operator-command-label operator-command-label--mirror' : 'operator-command-label'}>\n {renderOperatorCommandLabel(command)}\n </span>\n </button>\n ))}\n </div>\n </div>\n </div>\n <div className=\"toolbar-group toolbar-scripts\" role=\"group\" aria-label=\"الأس والسفلي\">\n <button className=\"icon-btn script-icon-btn\" type=\"button\" title=\"إضافة أس\" aria-label=\"إضافة أس\" onClick={() => runtimeRef.current?.addSup()}>\n <span className=\"toolbar-script-icon toolbar-script-icon--sup\" aria-hidden=\"true\"><span>ن</span><span>س</span></span>\n </button>\n <button className=\"icon-btn script-icon-btn\" type=\"button\" title=\"إضافة سفلي\" aria-label=\"إضافة سفلي\" onClick={() => runtimeRef.current?.addSub()}>\n <span className=\"toolbar-script-icon toolbar-script-icon--sub\" aria-hidden=\"true\"><span>ن</span><span>س</span></span>\n </button>\n <button className=\"icon-btn script-icon-btn remove-script-btn\" type=\"button\" title=\"إزالة الأس\" aria-label=\"إزالة الأس\" onClick={() => runtimeRef.current?.removeSup()}>\n <span className=\"toolbar-remove-script-icon toolbar-remove-script-icon--sup\" aria-hidden=\"true\"><span>ن</span><span>×</span></span>\n </button>\n <button className=\"icon-btn script-icon-btn remove-script-btn\" type=\"button\" title=\"إزالة السفلي\" aria-label=\"إزالة السفلي\" onClick={() => runtimeRef.current?.removeSub()}>\n <span className=\"toolbar-remove-script-icon toolbar-remove-script-icon--sub\" aria-hidden=\"true\"><span>ن</span><span>×</span></span>\n </button>\n </div>\n <div className=\"toolbar-group toolbar-settings\" role=\"group\" aria-label=\"أنماط الإدخال\">\n <button className=\"icon-btn delete-node-btn\" type=\"button\" title=\"حذف البنية المحددة\" aria-label=\"حذف البنية المحددة\" onClick={() => runtimeRef.current?.deleteStructure()}>\n ×\n </button>\n <button ref={splitTypingBtnRef} id=\"toggle-split-leaf-typing\" className=\"icon-btn ligature-btn\" type=\"button\" title=\"تبديل دمج الحروف\" aria-label=\"تبديل دمج الحروف\" onClick={() => runtimeRef.current?.toggleSplitLeafTyping()}>\n سصع\n </button>\n <div\n className=\"character-font-menu\"\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setCharacterFontMenuOpen(false);\n }\n }}\n >\n <button\n ref={characterFontBtnRef}\n id=\"select-character-font\"\n className={`icon-btn font-mode-btn font-mode-btn--${selectedCharacterFont}`}\n type=\"button\"\n title={characterFontOption(selectedCharacterFont).title}\n aria-label=\"اختيار خط الكتابة\"\n aria-haspopup=\"listbox\"\n aria-expanded={characterFontMenuOpen}\n onClick={() => setCharacterFontMenuOpen((open) => !open)}\n >\n {characterFontOption(selectedCharacterFont).label}\n </button>\n <div className=\"character-font-options\" role=\"listbox\" aria-label=\"اختيار خط الكتابة\" hidden={!characterFontMenuOpen}>\n {CHARACTER_FONT_OPTIONS.map((option) => (\n <button\n key={option.id}\n type=\"button\"\n role=\"option\"\n aria-selected={selectedCharacterFont === option.id}\n className={`character-font-option character-font-option--${option.id}`}\n title={option.title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.setCurrentCharacterFont(option.id);\n setSelectedCharacterFont(option.id);\n setCharacterFontMenuOpen(false);\n focusSurface();\n }}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n <div\n className=\"digit-form-menu\"\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setDigitMenuOpen(false);\n }\n }}\n >\n <button\n ref={digitFormBtnRef}\n id=\"select-digit-form\"\n className=\"icon-btn digit-form-btn\"\n type=\"button\"\n title=\"اختيار شكل الأرقام\"\n aria-label=\"اختيار شكل الأرقام\"\n aria-haspopup=\"listbox\"\n aria-expanded={digitMenuOpen}\n onClick={() => setDigitMenuOpen((open) => !open)}\n >\n {digitFormLabel(selectedDigitForm)}\n </button>\n <div className=\"digit-form-options\" role=\"listbox\" aria-label=\"اختيار شكل الأرقام\" hidden={!digitMenuOpen}>\n {DIGIT_FORM_OPTIONS.map((option) => (\n <button\n key={option.id}\n type=\"button\"\n role=\"option\"\n aria-selected={selectedDigitForm === option.id}\n className=\"digit-form-option\"\n title={option.title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.setCurrentDigitForm(option.id);\n setSelectedDigitForm(option.id);\n setDigitMenuOpen(false);\n focusSurface();\n }}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n </div>\n </div>\n <div\n ref={surfaceRef}\n id=\"butex-editor-surface\"\n className=\"surface surface--arabic\"\n tabIndex={0}\n aria-label=\"محرر المعادلات\"\n />\n <div ref={renderErrorRef} className=\"error\" hidden />\n </section>\n\n <section className=\"panel panel-preview\" aria-label=\"معاينة الرسم\">\n <div ref={mathOutputRef} className=\"preview-box\" />\n </section>\n\n {debug ? (\n <section className=\"panel\">\n <div className=\"dev-strip\">\n <span className=\"dev-badge\">تطوير</span>\n <div ref={latexLinesRef} className=\"ascii\" />\n <div ref={passivePreviewRef} className=\"passive-preview-text\" />\n </div>\n <div style={{ marginTop: 12 }}>\n <div className=\"debug-head\">\n <button\n type=\"button\"\n onClick={() => {\n setDebugBodyHidden((v) => {\n const next = !v;\n debugBodyHiddenRef.current = next;\n queueMicrotask(() => {\n const s = runtimeRef.current?.getSession();\n if (s) {\n void updatePreviewRef.current(s);\n }\n });\n return next;\n });\n }}\n >\n {debugBodyHidden ? 'إظهار سجل التصحيح' : 'إخفاء سجل التصحيح'}\n </button>\n <button\n type=\"button\"\n onClick={async () => {\n const payload = runtimeRef.current?.getSession().debugLog.map((e) => JSON.stringify(e)).join('\\n') ?? '';\n try {\n await navigator.clipboard.writeText(payload);\n } catch {\n /* ignore */\n }\n }}\n >\n نسخ سجل التصحيح\n </button>\n </div>\n <div ref={debugLogRef} className=\"debug-log\" />\n </div>\n </section>\n ) : null}\n </div>\n </div>\n );\n }\n);\n\nButexEditor.displayName = 'ButexEditor';\n","import type { EditorChain, EditorNode, EditorSession, EditorSide, EnvColumnAlignment, GridEnvName, MatrixEnvStyle } from './types.js';\nimport type { AtomicCommandId } from './atomicCommands.js';\nimport type { AtomicOperatorCommandId } from './atomicCommandsOperators.js';\n\nlet nextId = 1;\n\nfunction makeId(prefix: string): string {\n const id = `${prefix}_${String(nextId)}`;\n nextId += 1;\n return id;\n}\n\nexport function createEditorChain(nodes: EditorNode[] = []): EditorChain {\n return {\n id: makeId('chain'),\n nodes,\n };\n}\n\nexport function createEditorNode(kind: EditorNode['kind'], expr: string): EditorNode {\n return {\n id: makeId('node'),\n kind,\n expr,\n characterFont: undefined,\n superscript: null,\n subscript: null,\n leftDelimExpr: '',\n rightDelimExpr: '',\n innerExpr: null,\n numerator: null,\n denominator: null,\n radicand: null,\n rootIndex: null,\n envName: null,\n matrixStyle: null,\n matrixRows: null,\n columnAlignments: null,\n };\n}\n\nexport function createDelimiterNode(leftDelimExpr: string, rightDelimExpr: string): EditorNode {\n return {\n ...createEditorNode('delimiter', ''),\n leftDelimExpr,\n rightDelimExpr,\n innerExpr: createEditorChain(),\n };\n}\n\nexport function createFracNode(): EditorNode {\n return {\n ...createEditorNode('frac', ''),\n numerator: createEditorChain(),\n denominator: createEditorChain(),\n };\n}\n\nexport function createSqrtNode(): EditorNode {\n return {\n ...createEditorNode('sqrt', ''),\n radicand: createEditorChain(),\n rootIndex: createEditorChain(),\n };\n}\n\nexport function createMatrixEnvNode(style: MatrixEnvStyle, rows: number, columns: number): EditorNode {\n return createGridEnvNode(style, rows, columns);\n}\n\nexport function createGridEnvNode(\n envName: GridEnvName,\n rows: number,\n columns: number,\n columnAlignments?: EnvColumnAlignment[],\n): EditorNode {\n const safeRows = Math.max(1, Math.min(12, Math.trunc(rows)));\n const safeColumns = Math.max(1, Math.min(12, Math.trunc(columns)));\n const matrixStyles = new Set<GridEnvName>(['matrix', 'pmatrix', 'bmatrix', 'Bmatrix', 'vmatrix', 'Vmatrix']);\n const isMatrix = matrixStyles.has(envName) && envName !== 'array' && envName !== 'aligned';\n return {\n ...createEditorNode('env', ''),\n envName,\n matrixStyle: isMatrix ? (envName as MatrixEnvStyle) : null,\n matrixRows: Array.from({ length: safeRows }, () =>\n Array.from({ length: safeColumns }, () => createEditorChain()),\n ),\n columnAlignments: envName === 'array'\n ? Array.from({ length: safeColumns }, (_, index) => columnAlignments?.[index] ?? 'c')\n : null,\n };\n}\n\nexport function createAtomicCommandNode(commandId: AtomicCommandId): EditorNode {\n return createEditorNode('atomicCommand', commandId);\n}\n\nexport function createAtomicOperatorCommandNode(commandId: AtomicOperatorCommandId): EditorNode {\n return createEditorNode('atomicOperatorCommand', commandId);\n}\n\nexport function cloneEditorSession(session: EditorSession): EditorSession {\n return {\n englishTree: structuredClone(session.englishTree),\n arabicTree: structuredClone(session.arabicTree),\n activeSide: session.activeSide,\n splitLeafTyping: session.splitLeafTyping,\n forceSplitNextLeaf: session.forceSplitNextLeaf,\n arabicReverseNumberTyping: session.arabicReverseNumberTyping,\n currentCharacterFont: session.currentCharacterFont ?? 'default',\n currentDigitForm: session.currentDigitForm ?? 'western',\n caret: { ...session.caret },\n selection: session.selection ? { ...session.selection } : null,\n selectedNodeId: session.selectedNodeId,\n selectedStructureNodeId: session.selectedStructureNodeId,\n sync: structuredClone(session.sync),\n debugLog: session.debugLog.slice(),\n };\n}\n\nfunction collectNodeIds(chain: EditorChain, ids: string[]): void {\n for (const node of chain.nodes) {\n ids.push(node.id);\n if (node.superscript) {\n collectNodeIds(node.superscript, ids);\n }\n if (node.subscript) {\n collectNodeIds(node.subscript, ids);\n }\n if (node.innerExpr) {\n collectNodeIds(node.innerExpr, ids);\n }\n if (node.numerator) {\n collectNodeIds(node.numerator, ids);\n }\n if (node.denominator) {\n collectNodeIds(node.denominator, ids);\n }\n if (node.rootIndex) {\n collectNodeIds(node.rootIndex, ids);\n }\n if (node.radicand) {\n collectNodeIds(node.radicand, ids);\n }\n if (node.matrixRows) {\n for (const row of node.matrixRows) {\n for (const cell of row) {\n collectNodeIds(cell, ids);\n }\n }\n }\n }\n}\n\nexport function buildInitialSyncMap(englishTree: EditorChain, arabicTree: EditorChain): EditorSession['sync'] {\n const englishIds: string[] = [];\n const arabicIds: string[] = [];\n collectNodeIds(englishTree, englishIds);\n collectNodeIds(arabicTree, arabicIds);\n\n const all = new Set<string>([...englishIds, ...arabicIds]);\n const sync: EditorSession['sync'] = {};\n for (const nodeId of all) {\n sync[nodeId] = { expr: 'synced' };\n }\n return sync;\n}\n\nexport function createEditorSession(englishTree: EditorChain, arabicTree: EditorChain, activeSide: EditorSide = 'arabic'): EditorSession {\n return {\n englishTree,\n arabicTree,\n activeSide,\n splitLeafTyping: false,\n forceSplitNextLeaf: false,\n arabicReverseNumberTyping: true,\n currentCharacterFont: 'default',\n currentDigitForm: 'western',\n caret: {\n chainId: englishTree.id,\n index: 0,\n },\n selection: null,\n selectedNodeId: null,\n selectedStructureNodeId: null,\n sync: buildInitialSyncMap(englishTree, arabicTree),\n debugLog: [],\n };\n}\n","export const ATOMIC_COMMANDS = {\n ///////////////////////// Functions ////////////////////////////////\n\n //////////////// Trigonometric Functions \n cos: {\n id: 'cos',\n category: 'function',\n englishTex: '\\\\cos',\n arabicTex: '\\\\arcos',\n arabicLabel: 'جتا',\n title: 'جيب التمام',\n },\n sin: {\n id: 'sin',\n category: 'function',\n englishTex: '\\\\sin',\n arabicTex: '\\\\arsin',\n arabicLabel: 'جا',\n title: 'جيب',\n },\n tan: {\n id: 'tan',\n category: 'function',\n englishTex: '\\\\tan',\n arabicTex: '\\\\artan',\n arabicLabel: 'ظا',\n title: 'ظل',\n },\n cot: {\n id: 'cot',\n category: 'function',\n englishTex: '\\\\cot',\n arabicTex: '\\\\arcot',\n arabicLabel: 'ظتا',\n title: 'ظل تمام',\n },\n sec: {\n id: 'sec',\n category: 'function',\n englishTex: '\\\\sec',\n arabicTex: '\\\\arsec',\n arabicLabel: 'قا',\n title: 'قاطع',\n },\n csc: {\n id: 'csc',\n category: 'function',\n englishTex: '\\\\csc',\n arabicTex: '\\\\arcsc',\n arabicLabel: 'قتا',\n title: 'قاطع تمام',\n },\n\n\n /////////////////// Arc Trigonometric Functions \n arccos: {\n id: 'arccos',\n category: 'function',\n englishTex: '\\\\arccos',\n arabicTex: '\\\\aracos',\n arabicLabel: 'قجتا',\n title: 'قاطع جيب التمام',\n },\n arcsin: {\n id: 'arcsin',\n category: 'function',\n englishTex: '\\\\arcsin',\n arabicTex: '\\\\arasin',\n arabicLabel: 'قجا',\n title: 'قاطع جيب',\n },\n arctan: {\n id: 'arctan',\n category: 'function',\n englishTex: '\\\\arctan',\n arabicTex: '\\\\aratan',\n arabicLabel: 'قظا',\n title: 'قاطع ظل',\n },\n arccot: {\n id: 'arccot',\n category: 'function',\n englishTex: '\\\\arccot',\n arabicTex: '\\\\aracot',\n arabicLabel: 'قظتا',\n title: 'قاطع ظل التمام',\n },\n arcsec: {\n id: 'arcsec',\n category: 'function',\n englishTex: '\\\\arcsec',\n arabicTex: '\\\\arasec',\n arabicLabel: 'ققا',\n title: 'قاطع القاطع',\n },\n arccsc: {\n id: 'arccsc',\n category: 'function',\n englishTex: '\\\\arccsc',\n arabicTex: '\\\\aracsc',\n arabicLabel: 'ققتا',\n title: 'قاطع القاطع التمام',\n },\n\n ///////////////// Hyperbolic Functions \n cosh: {\n id: 'cosh',\n category: 'function',\n englishTex: '\\\\cosh',\n arabicTex: '\\\\arcosh',\n arabicLabel: 'جتزا',\n title: 'جيب التمام الزائد',\n },\n sinh: {\n id: 'sinh',\n category: 'function',\n englishTex: '\\\\sinh',\n arabicTex: '\\\\arsinh',\n arabicLabel: 'جزا',\n title: 'جيب الزائد',\n },\n tanh: {\n id: 'tanh',\n category: 'function',\n englishTex: '\\\\tanh',\n arabicTex: '\\\\artanh',\n arabicLabel: 'ظزا',\n title: 'ظل الزائد',\n },\n coth: {\n id: 'coth',\n category: 'function',\n englishTex: '\\\\coth',\n arabicTex: '\\\\arcoth',\n arabicLabel: 'ظتزا',\n title: 'ظل تمام الزائد',\n },\n\n ////// These function somehow doesnt exist in LaTeX and therefore MathJax, skip for now. no problem.\n // sech: {\n // id: 'sech',\n // category: 'function',\n // englishTex: '\\\\sech',\n // arabicTex: '\\\\arsech',\n // arabicLabel: 'قزا',\n // title: 'قاطع الزائد',\n // },\n // csch: {\n // id: 'csch',\n // category: 'function',\n // englishTex: '\\\\csch',\n // arabicTex: '\\\\arcsch',\n // arabicLabel: 'قتزا',\n // title: 'قاطع تمام الزائد',\n // },\n\n\n ///////////////// arc Hyperbolic Functions \n ///// Not on MathJax, skip for now, it is okay.\n\n\n\n ////////////////////// Limits & Series ////////////////////////////////\n sum: {\n id: 'sum',\n category: 'limits_series',\n englishTex: '\\\\sum',\n arabicTex: '\\\\arsum',\n arabicLabel: 'مجـــ',\n title: 'مجموع',\n },\n prod: {\n id: 'prod',\n category: 'limits_series',\n englishTex: '\\\\prod',\n arabicTex: '\\\\arprod',\n arabicLabel: 'جـــد',\n title: 'جداء',\n },\n lim: {\n id: 'lim',\n category: 'limits_series',\n englishTex: '\\\\lim',\n arabicTex: '\\\\arlim',\n arabicLabel: 'نـــــها',\n title: 'حد',\n },\n max: {\n id: 'max',\n category: 'limits_series',\n englishTex: '\\\\max',\n arabicTex: '\\\\armax',\n arabicLabel: 'أكبر',\n title: 'أكبر',\n },\n min: {\n id: 'min',\n category: 'limits_series',\n englishTex: '\\\\min',\n arabicTex: '\\\\armin',\n arabicLabel: 'أصغر',\n title: 'أصغر',\n },\n sup: {\n id: 'sup',\n category: 'limits_series',\n englishTex: '\\\\sup',\n arabicTex: '\\\\arsup',\n arabicLabel: 'أعلى',\n title: 'أعلى',\n },\n inf: {\n id: 'inf',\n category: 'limits_series',\n englishTex: '\\\\inf',\n arabicTex: '\\\\arinf',\n arabicLabel: 'أدنى',\n title: 'أدنى',\n },\n\n ////////////////////// Logarithmic and Exponential and Determinant Functions ////////////////////////////////\n pi: {\n id: 'pi',\n category: 'function2',\n englishTex: '\\\\pi',\n arabicTex: '\\\\arpi',\n arabicLabel: 'ط',\n title: 'نسبة الدائرة',\n },\n exp: {\n id: 'exp',\n category: 'function2',\n englishTex: '\\\\exp',\n arabicTex: '\\\\arexp',\n arabicLabel: 'هـ',\n title: 'أسية',\n },\n ln: {\n id: 'ln',\n category: 'function2',\n englishTex: '\\\\ln',\n arabicTex: '\\\\arln',\n arabicRenderTex: '\\\\prescript{}{\\\\arexp}{\\\\arlog}',\n arabicLabel: 'لو',\n title: 'لوغاريتم طبيعي',\n },\n log: {\n id: 'log',\n category: 'function2',\n englishTex: '\\\\log',\n arabicTex: '\\\\arlog',\n arabicLabel: 'لو',\n title: 'لوغاريتم',\n },\n det: {\n id: 'det',\n category: 'function2',\n englishTex: '\\\\det',\n arabicTex: '\\\\ardet',\n arabicLabel: 'محدد',\n title: 'محدد',\n },\n\n ////////////////////// Groups /////////////////////////////////\n N: {\n id: 'N',\n category: 'groups',\n englishTex: '\\\\mathbb{N}',\n arabicTex: '\\\\arabN',\n arabicLabel: 'ط',\n title: 'أعداد طبيعية',\n },\n Z: {\n id: 'Z',\n category: 'groups',\n englishTex: '\\\\mathbb{Z}',\n arabicTex: '\\\\arabZ',\n arabicLabel: 'ص',\n title: 'أعداد صحيحة',\n },\n Q: {\n id: 'Q',\n category: 'groups',\n englishTex: '\\\\mathbb{Q}',\n arabicTex: '\\\\arabQ',\n arabicLabel: 'ن',\n title: 'أعداد نسبية',\n },\n R: {\n id: 'R',\n category: 'groups',\n englishTex: '\\\\mathbb{R}',\n arabicTex: '\\\\arabR',\n arabicLabel: 'ح',\n title: 'أعداد حقيقية',\n },\n C: {\n id: 'C',\n category: 'groups',\n englishTex: '\\\\mathbb{C}',\n arabicTex: '\\\\arabC',\n arabicLabel: 'ع',\n title: 'أعداد عُقدية',\n },\n H: {\n id: 'H',\n category: 'groups',\n englishTex: '\\\\mathbb{H}',\n arabicTex: '\\\\arabH',\n arabicLabel: 'ر',\n title: 'أعداد رباعية',\n },\n\n ////////////////////// Operations ////////////////////////////\n\n\n ////////////////////// Spacing ////////////////////////////////\n negThinSpace: {\n id: 'negThinSpace',\n category: 'spacing',\n englishTex: '\\\\!',\n arabicTex: '\\\\!',\n arabicLabel: '',\n title: 'فراغ سالب رفيع',\n spacing: { direction: 'negative', level: 1 },\n },\n mediumSpace: {\n id: 'mediumSpace',\n category: 'spacing',\n englishTex: '\\\\:',\n arabicTex: '\\\\:',\n arabicLabel: '',\n title: 'فراغ متوسط',\n spacing: { direction: 'positive', level: 1 },\n },\n thickSpace: {\n id: 'thickSpace',\n category: 'spacing',\n englishTex: '\\\\;',\n arabicTex: '\\\\;',\n arabicLabel: '',\n title: 'فراغ عريض',\n spacing: { direction: 'positive', level: 2 },\n },\n quadSpace: {\n id: 'quadSpace',\n category: 'spacing',\n englishTex: '\\\\quad',\n arabicTex: '\\\\quad',\n arabicLabel: '',\n title: 'فراغ كبير',\n spacing: { direction: 'positive', level: 3 },\n },\n qquadSpace: {\n id: 'qquadSpace',\n category: 'spacing',\n englishTex: '\\\\qquad',\n arabicTex: '\\\\qquad',\n arabicLabel: '',\n title: 'فراغ كبير جدا',\n spacing: { direction: 'positive', level: 4 },\n },\n} as const;\n\nexport type AtomicCommandId = keyof typeof ATOMIC_COMMANDS;\nexport type AtomicCommandCategory = 'function' | 'function2' | 'limits_series' | 'groups' | 'spacing';\nexport type SpacingDirection = 'positive' | 'negative';\n\nexport type AtomicCommandSpec = (typeof ATOMIC_COMMANDS)[AtomicCommandId] & {\n arabicRenderTex?: string;\n};\nexport type SpacingCommandSpec = AtomicCommandSpec & {\n category: 'spacing';\n spacing: {\n direction: SpacingDirection;\n level: 1 | 2 | 3 | 4;\n };\n};\n\nexport function atomicCommandsByCategory(category: AtomicCommandCategory): AtomicCommandSpec[] {\n return Object.values(ATOMIC_COMMANDS).filter((command) => command.category === category);\n}\n\nexport function isSpacingCommandSpec(spec: AtomicCommandSpec | null): spec is SpacingCommandSpec {\n return spec?.category === 'spacing';\n}\n\nexport function atomicCommandSpec(id: string): AtomicCommandSpec | null {\n return Object.prototype.hasOwnProperty.call(ATOMIC_COMMANDS, id)\n ? ATOMIC_COMMANDS[id as AtomicCommandId]\n : null;\n}\n","export const ATOMIC_OPERATOR_COMMANDS = {\n inf: {\n id: 'inf',\n category: 'operators1',\n Tex: '\\\\infty',\n mirror: true,\n Label: '∞',\n title: 'اللانهاية',\n svg_path: null,\n },\n times: {\n id: 'times',\n category: 'operators1',\n Tex: '\\\\times',\n mirror: false,\n Label: '×',\n title: 'ضرب',\n svg_path: null,\n },\n div: {\n id: 'div',\n category: 'operators1',\n Tex: '\\\\div',\n mirror: false,\n Label: '÷',\n title: 'قسمة',\n svg_path: null,\n },\n pm: {\n id: 'pm',\n category: 'operators1',\n Tex: '\\\\pm',\n mirror: false,\n Label: '±',\n title: 'زائد أو ناقص',\n svg_path: null,\n },\n mp: {\n id: 'mp',\n category: 'operators1',\n Tex: '\\\\mp',\n mirror: false,\n Label: '∓',\n title: 'ناقص أو زائد',\n svg_path: null,\n },\n neq: {\n id: 'neq',\n category: 'operators1',\n Tex: '\\\\neq',\n mirror: false,\n Label: '≠',\n title: 'لا يساوي',\n svg_path: null,\n },\n approx: {\n id: 'approx',\n category: 'operators1',\n Tex: '\\\\approx',\n mirror: false,\n Label: '≈',\n title: 'تقريبا يساوي',\n svg_path: null,\n },\n sim: {\n id: 'sim',\n category: 'operators1',\n Tex: '\\\\sim',\n mirror: false,\n Label: '∼',\n title: 'مشابه',\n svg_path: null,\n },\n mid: {\n id: 'mid',\n category: 'operators1',\n Tex: '\\\\mid',\n mirror: false,\n Label: '∣',\n title: 'يقسم',\n svg_path: null,\n },\n leq: {\n id: 'leq',\n category: 'operators1',\n Tex: '\\\\leq',\n mirror: true,\n Label: '≤',\n title: 'أصغر من أو يساوي',\n svg_path: null,\n },\n geq: {\n id: 'geq',\n category: 'operators1',\n Tex: '\\\\geq',\n mirror: true,\n Label: '≥',\n title: 'أكبر من أو يساوي',\n svg_path: null,\n },\n\n ///// Operators 2\n propto: {\n id: 'propto',\n category: 'operators2',\n Tex: '\\\\propto',\n mirror: true,\n Label: '∝',\n title: 'يتناسب مع',\n svg_path: null,\n },\n in: {\n id: 'in',\n category: 'operators2',\n Tex: '\\\\in',\n mirror: true,\n Label: '∈',\n title: 'ينتمي إلى',\n svg_path: null,\n },\n notin: {\n id: 'notin',\n category: 'operators2',\n Tex: '\\\\notin',\n mirror: false,\n Label: '∉',\n title: 'لا ينتمي إلى',\n svg_path: null,\n },\n subset: {\n id: 'subset',\n category: 'operators2',\n Tex: '\\\\subset',\n mirror: true,\n Label: '⊂',\n title: 'مجموعة جزئية من',\n svg_path: null,\n },\n supset: {\n id: 'supset',\n category: 'operators2',\n Tex: '\\\\supset',\n mirror: true,\n Label: '⊃',\n title: 'مجموعة شاملة لـ',\n svg_path: null,\n },\n subseteq: {\n id: 'subseteq',\n category: 'operators2',\n Tex: '\\\\subseteq',\n mirror: true,\n Label: '⊆',\n title: 'مجموعة جزئية أو تساوي',\n svg_path: null,\n },\n supseteq: {\n id: 'supseteq',\n category: 'operators2',\n Tex: '\\\\supseteq',\n mirror: true,\n Label: '⊇',\n title: 'مجموعة شاملة أو تساوي',\n svg_path: null,\n },\n cap: {\n id: 'cap',\n category: 'operators2',\n Tex: '\\\\cap',\n mirror: false,\n Label: '∩',\n title: 'تقاطع',\n svg_path: null,\n },\n cup: {\n id: 'cup',\n category: 'operators2',\n Tex: '\\\\cup',\n mirror: false,\n Label: '∪',\n title: 'اتحاد',\n svg_path: null,\n },\n emptyset: {\n id: 'emptyset',\n category: 'operators2',\n Tex: '\\\\emptyset',\n mirror: false,\n Label: '∅',\n title: 'المجموعة الخالية',\n svg_path: null,\n },\n nsubseteq: {\n id: 'nsubseteq',\n category: 'operators2',\n Tex: '\\\\nsubseteq',\n mirror: true,\n Label: '⊈',\n title: 'ليست مجموعة جزئية أو تساوي',\n svg_path: null,\n },\n nsupseteq: {\n id: 'nsupseteq',\n category: 'operators2',\n Tex: '\\\\nsupseteq',\n mirror: true,\n Label: '⊉',\n title: 'ليست مجموعة شاملة أو تساوي',\n svg_path: null,\n },\n\n ///// Dots\n ldots: {\n id: 'ldots',\n category: 'dots',\n Tex: '\\\\ldots',\n mirror: false,\n Label: '…',\n title: 'نقاط أفقية',\n svg_path: null,\n },\n cdot: {\n id: 'cdot',\n category: 'dots',\n Tex: '\\\\cdot',\n mirror: false,\n Label: '·',\n title: 'نقطة ضرب',\n svg_path: null,\n },\n cdots: {\n id: 'cdots',\n category: 'dots',\n Tex: '\\\\cdots',\n mirror: false,\n Label: '⋯',\n title: 'نقاط وسطية أفقية',\n svg_path: null,\n },\n vdots: {\n id: 'vdots',\n category: 'dots',\n Tex: '\\\\vdots',\n mirror: false,\n Label: '⋮',\n title: 'نقاط عمودية',\n svg_path: null,\n },\n ddots: {\n id: 'ddots',\n category: 'dots',\n Tex: '\\\\ddots',\n mirror: true,\n displayMirror: false,\n Label: '⋱',\n title: 'نقاط قطرية',\n svg_path: null,\n },\n\n /// Operators 3\n leftrightarrowDouble: {\n id: 'leftrightarrowDouble',\n category: 'operators3',\n Tex: '\\\\Leftrightarrow',\n mirror: false,\n Label: '⇔',\n title: 'يكافئ',\n svg_path: null,\n },\n rightleftharpoons: {\n id: 'rightleftharpoons',\n category: 'operators3',\n Tex: '\\\\rightleftharpoons',\n mirror: true,\n Label: '⇌',\n title: 'اتزان',\n svg_path: null,\n },\n leftarrow: {\n id: 'leftarrow',\n category: 'operators3',\n Tex: '\\\\leftarrow',\n mirror: true,\n Label: '←',\n title: 'سهم إلى اليسار',\n svg_path: null,\n },\n rightarrow: {\n id: 'rightarrow',\n category: 'operators3',\n Tex: '\\\\rightarrow',\n mirror: true,\n Label: '→',\n title: 'سهم إلى اليمين',\n svg_path: null,\n },\n leftarrowDouble: {\n id: 'leftarrowDouble',\n category: 'operators3',\n Tex: '\\\\Leftarrow',\n mirror: true,\n Label: '⇐',\n title: 'سهم مزدوج إلى اليسار',\n svg_path: null,\n },\n rightarrowDouble: {\n id: 'rightarrowDouble',\n category: 'operators3',\n Tex: '\\\\Rightarrow',\n mirror: true,\n Label: '⇒',\n title: 'سهم مزدوج إلى اليمين',\n svg_path: null,\n },\n leftharpoonup: {\n id: 'leftharpoonup',\n category: 'operators3',\n Tex: '\\\\leftharpoonup',\n mirror: true,\n Label: '↼',\n title: 'سهم خطافي علوي إلى اليسار',\n svg_path: null,\n },\n rightharpoonup: {\n id: 'rightharpoonup',\n category: 'operators3',\n Tex: '\\\\rightharpoonup',\n mirror: true,\n Label: '⇀',\n title: 'سهم خطافي علوي إلى اليمين',\n svg_path: null,\n },\n leftharpoondown: {\n id: 'leftharpoondown',\n category: 'operators3',\n Tex: '\\\\leftharpoondown',\n mirror: true,\n Label: '↽',\n title: 'سهم خطافي سفلي إلى اليسار',\n svg_path: null,\n },\n rightharpoondown: {\n id: 'rightharpoondown',\n category: 'operators3',\n Tex: '\\\\rightharpoondown',\n mirror: true,\n Label: '⇁',\n title: 'سهم خطافي سفلي إلى اليمين',\n svg_path: null,\n },\n\n // Integrals\n int: {\n id: 'int',\n category: 'integrals',\n Tex: '\\\\int',\n mirror: true,\n Label: '∫',\n title: 'تكامل',\n svg_path: null,\n },\n iint: {\n id: 'iint',\n category: 'integrals',\n Tex: '\\\\iint',\n mirror: true,\n Label: '∬',\n title: 'تكامل مزدوج',\n svg_path: null,\n },\n iiint: {\n id: 'iiint',\n category: 'integrals',\n Tex: '\\\\iiint',\n mirror: true,\n Label: '∭',\n title: 'تكامل ثلاثي',\n svg_path: null,\n },\n iiiint: {\n id: 'iiiint',\n category: 'integrals',\n Tex: '\\\\iiiint',\n mirror: true,\n Label: '⨌',\n title: 'تكامل رباعي',\n svg_path: null,\n },\n oint: {\n id: 'oint',\n category: 'integrals',\n Tex: '\\\\oint',\n mirror: true,\n Label: '∮',\n title: 'تكامل مغلق',\n svg_path: null,\n },\n oiint: {\n id: 'oiint',\n category: 'integrals',\n Tex: '\\\\oiint',\n mirror: true,\n Label: '∯',\n title: 'تكامل سطحي مغلق',\n svg_path: null,\n },\n oiiint: {\n id: 'oiiint',\n category: 'integrals',\n Tex: '\\\\oiiint',\n mirror: true,\n Label: '∰',\n title: 'تكامل حجمي مغلق',\n svg_path: null,\n },\n} as const;\n\nexport type AtomicOperatorCommandId = keyof typeof ATOMIC_OPERATOR_COMMANDS;\n\nexport type AtomicOperatorCommandCategory =\n | 'operators1'\n | 'operators2'\n | 'operators3'\n | 'dots'\n | 'integrals';\n\nexport type AtomicOperatorCommandSpec =\n (typeof ATOMIC_OPERATOR_COMMANDS)[AtomicOperatorCommandId] & {\n displayMirror?: boolean;\n };\n\nexport function shouldMirrorOperatorDisplay(\n command: AtomicOperatorCommandSpec | null | undefined,\n): boolean {\n return command?.displayMirror ?? command?.mirror ?? false;\n}\n\nconst MIRRORED_OPERATOR_TEX = Object.values(ATOMIC_OPERATOR_COMMANDS)\n .filter((command) => command.mirror)\n .map((command) => command.Tex)\n .sort((a, b) => b.length - a.length);\n\nfunction matchingMirroredOperator(tex: string, index: number): string | null {\n for (const operatorTex of MIRRORED_OPERATOR_TEX) {\n if (!tex.startsWith(operatorTex, index)) {\n continue;\n }\n const next = tex[index + operatorTex.length];\n if (next != null && /[A-Za-z]/.test(next)) {\n continue;\n }\n return operatorTex;\n }\n return null;\n}\n\nfunction findMatchingBrace(tex: string, openIndex: number): number {\n let depth = 0;\n for (let index = openIndex; index < tex.length; index += 1) {\n const char = tex[index];\n if (char === '\\\\') {\n index += 1;\n continue;\n }\n if (char === '{') {\n depth += 1;\n } else if (char === '}') {\n depth -= 1;\n if (depth === 0) {\n return index;\n }\n }\n }\n return -1;\n}\n\nexport function mirrorBuTeXOperatorsInTex(tex: string): string {\n let result = '';\n let index = 0;\n\n while (index < tex.length) {\n if (tex.startsWith('\\\\butexmirror{', index)) {\n const end = findMatchingBrace(tex, index + '\\\\butexmirror'.length);\n if (end !== -1) {\n result += tex.slice(index, end + 1);\n index = end + 1;\n continue;\n }\n }\n\n const operatorTex = matchingMirroredOperator(tex, index);\n if (operatorTex) {\n result += `\\\\butexmirror{${operatorTex}}`;\n index += operatorTex.length;\n continue;\n }\n\n result += tex[index];\n index += 1;\n }\n\n return result;\n}\n\nexport function atomicOperatorCommandsByCategory(\n category: AtomicOperatorCommandCategory,\n): AtomicOperatorCommandSpec[] {\n return Object.values(ATOMIC_OPERATOR_COMMANDS).filter(\n (command) => command.category === category,\n );\n}\n\nexport function atomicOperatorCommandSpec(\n id: string,\n): AtomicOperatorCommandSpec | null {\n return Object.prototype.hasOwnProperty.call(ATOMIC_OPERATOR_COMMANDS, id)\n ? ATOMIC_OPERATOR_COMMANDS[id as AtomicOperatorCommandId]\n : null;\n}\n","import type { DigitFormId } from './types.js';\n\nconst WESTERN = '0123456789';\nconst ARABIC_INDIC = '٠١٢٣٤٥٦٧٨٩';\nconst PERSIAN_INDIC = '۰۱۲۳۴۵۶۷۸۹';\n\nconst digitSets: Record<DigitFormId, string> = {\n western: WESTERN,\n arabicIndic: ARABIC_INDIC,\n persianIndic: PERSIAN_INDIC,\n};\n\nfunction digitValue(char: string): number {\n const western = WESTERN.indexOf(char);\n if (western >= 0) {\n return western;\n }\n const arabicIndic = ARABIC_INDIC.indexOf(char);\n if (arabicIndic >= 0) {\n return arabicIndic;\n }\n return PERSIAN_INDIC.indexOf(char);\n}\n\nexport function formatDigits(value: string, digitForm: DigitFormId = 'western'): string {\n const target = digitSets[digitForm];\n return Array.from(value, (char) => {\n const value = digitValue(char);\n return value >= 0 ? target[value] : char;\n }).join('');\n}\n","import type { DigitFormId, EditorChain, EditorNode, EditorSession, EnvColumnAlignment } from './types.js';\nimport { atomicCommandSpec } from './atomicCommands.js';\nimport { atomicOperatorCommandSpec } from './atomicCommandsOperators.js';\nimport { formatDigits } from './digits.js';\n\ntype RenderOptions = {\n digitForm?: DigitFormId;\n};\n\nfunction selectedDigitForm(options?: RenderOptions): DigitFormId {\n return options?.digitForm ?? 'western';\n}\n\nfunction latinScripts(node: EditorNode, options?: RenderOptions): string {\n let scripts = '';\n if (node.superscript) {\n scripts += `^{${renderChainEnglish(node.superscript, options)}}`;\n }\n if (node.subscript) {\n scripts += `_{${renderChainEnglish(node.subscript, options)}}`;\n }\n return scripts;\n}\n\nfunction optionalRootIndexEnglish(node: EditorNode, options?: RenderOptions): string {\n if (!node.rootIndex) {\n return '';\n }\n const rendered = renderChainEnglish(node.rootIndex, options);\n return rendered === '' ? '' : `[${rendered}]`;\n}\n\nfunction optionalRootIndexArabic(node: EditorNode, options?: RenderOptions): string {\n if (!node.rootIndex) {\n return '';\n }\n const rendered = renderChainArabic(node.rootIndex, options);\n return rendered === '' ? '' : `[${rendered}]`;\n}\n\nfunction arabicScripts(node: EditorNode, content: string, options?: RenderOptions): string {\n const sup = node.superscript ? renderChainArabic(node.superscript, options) : '';\n const sub = node.subscript ? renderChainArabic(node.subscript, options) : '';\n if (sup !== '' || sub !== '') {\n return `\\\\prescript{${sup}}{${sub}}{${content}}`;\n }\n return content;\n}\n\nfunction renderMatrixRowsEnglish(node: EditorNode, options?: RenderOptions): string {\n if (!node.matrixRows) {\n return '';\n }\n const envName = node.envName ?? node.matrixStyle;\n if (!envName) {\n return '';\n }\n const rows = node.matrixRows.map((row) => row.map((cell) => renderChainEnglish(cell, options)).join(' & '));\n if (envName === 'array') {\n const spec = (node.columnAlignments ?? []).slice(0, node.matrixRows[0]?.length ?? 0).join('');\n return `\\\\begin{array}{${spec || 'c'}}${rows.join(' \\\\\\\\\\n')}\\\\end{array}`;\n }\n return `\\\\begin{${envName}}${rows.join(' \\\\\\\\\\n')}\\\\end{${envName}}`;\n}\n\nfunction reverseAlignmentForArabic(alignment: EnvColumnAlignment): EnvColumnAlignment {\n if (alignment === 'l') {\n return 'r';\n }\n if (alignment === 'r') {\n return 'l';\n }\n return 'c';\n}\n\nfunction renderMatrixRowsArabic(node: EditorNode, options?: RenderOptions): string {\n if (!node.matrixRows) {\n return '';\n }\n const envName = node.envName ?? node.matrixStyle;\n if (!envName) {\n return '';\n }\n const rows = node.matrixRows.map((row) =>\n row\n .slice()\n .reverse()\n .map((cell) => renderChainArabic(cell, options))\n .join(' & '),\n );\n if (envName === 'array') {\n const spec = (node.columnAlignments ?? [])\n .slice(0, node.matrixRows[0]?.length ?? 0)\n .reverse()\n .map(reverseAlignmentForArabic)\n .join('');\n return `\\\\begin{array}{${spec || 'c'}}${rows.join(' \\\\\\\\\\n')}\\\\end{array}`;\n }\n return `\\\\begin{${envName}}${rows.join(' \\\\\\\\\\n')}\\\\end{${envName}}`;\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/\\\\/g, '\\\\textbackslash{}').replace(/[{}]/g, '\\\\$&');\n}\n\nfunction renderCharContent(node: EditorNode, options?: RenderOptions): string {\n const expr = formatDigits(node.expr, selectedDigitForm(options));\n const font = node.characterFont ?? 'default';\n if (font === 'takween') {\n return `\\\\butextakween{${escapeText(expr)}}`;\n }\n if (font === 'diwani') {\n return `\\\\butexdiwani{${escapeText(expr)}}`;\n }\n if (font === 'diwaniOutline') {\n return `\\\\butexdiwanioutline{${escapeText(expr)}}`;\n }\n return expr;\n}\n\nfunction renderNodeEnglish(node: EditorNode, options?: RenderOptions): string {\n if (node.kind === 'delimiter' && node.innerExpr) {\n return `${node.leftDelimExpr}${renderChainEnglish(node.innerExpr, options)}${node.rightDelimExpr}${latinScripts(node, options)}`;\n }\n if (node.kind === 'frac' && node.numerator && node.denominator) {\n const body = `\\\\frac{${renderChainEnglish(node.numerator, options)}}{${renderChainEnglish(node.denominator, options)}}`;\n return `${body}${latinScripts(node, options)}`;\n }\n if (node.kind === 'sqrt' && node.radicand) {\n const body = `\\\\sqrt${optionalRootIndexEnglish(node, options)}{${renderChainEnglish(node.radicand, options)}}`;\n return `${body}${latinScripts(node, options)}`;\n }\n if (node.kind === 'env') {\n return `${renderMatrixRowsEnglish(node, options)}${latinScripts(node, options)}`;\n }\n if (node.kind === 'atomicCommand') {\n const body = atomicCommandSpec(node.expr)?.englishTex ?? node.expr;\n return `${body}${latinScripts(node, options)}`;\n }\n if (node.kind === 'atomicOperatorCommand') {\n const body = atomicOperatorCommandSpec(node.expr)?.Tex ?? node.expr;\n return `${body}${latinScripts(node, options)}`;\n }\n if (node.kind === 'char') {\n return `${renderCharContent(node, options)}${latinScripts(node, options)}`;\n }\n return `${formatDigits(node.expr, selectedDigitForm(options))}${latinScripts(node, options)}`;\n}\n\nfunction renderNodeArabic(node: EditorNode, options?: RenderOptions): string {\n if (node.kind === 'delimiter' && node.innerExpr) {\n const content = `${node.leftDelimExpr}${renderChainArabic(node.innerExpr, options)}${node.rightDelimExpr}`;\n return arabicScripts(node, content, options);\n }\n if (node.kind === 'frac' && node.numerator && node.denominator) {\n const content = `\\\\frac{${renderChainArabic(node.numerator, options)}}{${renderChainArabic(node.denominator, options)}}`;\n return arabicScripts(node, content, options);\n }\n if (node.kind === 'sqrt' && node.radicand) {\n const content = `\\\\arabsqrt${optionalRootIndexArabic(node, options)}{${renderChainArabic(node.radicand, options)}}`;\n return arabicScripts(node, content, options);\n }\n if (node.kind === 'env') {\n return arabicScripts(node, renderMatrixRowsArabic(node, options), options);\n }\n if (node.kind === 'atomicCommand') {\n const spec = atomicCommandSpec(node.expr);\n const content = spec?.arabicRenderTex ?? spec?.arabicTex ?? node.expr;\n return arabicScripts(node, content, options);\n }\n if (node.kind === 'atomicOperatorCommand') {\n const spec = atomicOperatorCommandSpec(node.expr);\n const tex = spec?.Tex ?? node.expr;\n const content = spec?.mirror ? `\\\\butexmirror{${tex}}` : tex;\n return arabicScripts(node, content, options);\n }\n if (node.kind === 'char') {\n const expr = formatDigits(node.expr, selectedDigitForm(options));\n const content = renderCharContent(node, options);\n return arabicScripts(node, (node.characterFont ?? 'default') === 'default'\n ? `\\\\text{${escapeText(expr)}}`\n : content, options);\n }\n return arabicScripts(node, formatDigits(node.expr, selectedDigitForm(options)), options);\n}\n\nexport function renderChainEnglish(chain: EditorChain, options?: RenderOptions): string {\n return chain.nodes.map((node) => renderNodeEnglish(node, options)).join(' ');\n}\n\nexport function renderChainArabic(chain: EditorChain, options?: RenderOptions): string {\n return chain.nodes\n .slice()\n .reverse()\n .map((node) => renderNodeArabic(node, options))\n .join(' ');\n}\n\nexport function renderEnglishLatexFromSession(session: EditorSession): string {\n return renderChainEnglish(session.englishTree, { digitForm: session.currentDigitForm ?? 'western' });\n}\n\nexport function renderArabicLatexFromSession(session: EditorSession): string {\n return renderChainArabic(session.arabicTree, { digitForm: session.currentDigitForm ?? 'western' });\n}\n","import type { EditorCaret, EditorChain, EditorNode } from './types.js';\n\n/**\n * Depth-first preorder of all caret slots: for each chain, slot 0, then each node's\n * nested chains (inner → superscript → subscript), then slot after that node, etc.\n * Horizontal moves step through this order without skipping positions.\n */\nexport function collectCaretPositions(chain: EditorChain): EditorCaret[] {\n const out: EditorCaret[] = [];\n\n function walkNode(node: EditorNode): void {\n if (node.innerExpr) {\n walkChain(node.innerExpr);\n }\n if (node.numerator) {\n walkChain(node.numerator);\n }\n if (node.denominator) {\n walkChain(node.denominator);\n }\n if (node.rootIndex) {\n walkChain(node.rootIndex);\n }\n if (node.radicand) {\n walkChain(node.radicand);\n }\n if (node.matrixRows) {\n for (const row of node.matrixRows) {\n for (const cell of row) {\n walkChain(cell);\n }\n }\n }\n if (node.superscript) {\n walkChain(node.superscript);\n }\n if (node.subscript) {\n walkChain(node.subscript);\n }\n }\n\n function walkChain(c: EditorChain): void {\n out.push({ chainId: c.id, index: 0 });\n for (let i = 0; i < c.nodes.length; i += 1) {\n walkNode(c.nodes[i]);\n out.push({ chainId: c.id, index: i + 1 });\n }\n }\n\n walkChain(chain);\n return out;\n}\n\nexport function caretStep(root: EditorChain, caret: EditorCaret, delta: -1 | 1): EditorCaret {\n const positions = collectCaretPositions(root);\n const idx = positions.findIndex((p) => p.chainId === caret.chainId && p.index === caret.index);\n if (idx < 0) {\n return caret;\n }\n const nextIdx = idx + delta;\n if (nextIdx < 0) {\n return positions[0]!;\n }\n if (nextIdx >= positions.length) {\n return positions[positions.length - 1]!;\n }\n return positions[nextIdx]!;\n}\n","import type { EditorChain, EditorNode, EditorSide } from './types.js';\n\nexport type ParentRelationKind =\n | 'root'\n | 'superscript'\n | 'subscript'\n | 'inner'\n | 'numerator'\n | 'denominator'\n | 'radicand'\n | 'rootIndex'\n | 'matrixCell';\n\nexport type ParentRelation = {\n kind: ParentRelationKind;\n ownerNodeId: string | null;\n ownerChainId: string | null;\n rowIndex?: number;\n columnIndex?: number;\n};\n\nexport type LocatedChain = {\n chain: EditorChain;\n relation: ParentRelation;\n};\n\nexport type LocatedNode = {\n node: EditorNode;\n chain: EditorChain;\n index: number;\n};\n\nexport function findChainById(root: EditorChain, chainId: string): LocatedChain | null {\n if (root.id === chainId) {\n return {\n chain: root,\n relation: { kind: 'root', ownerNodeId: null, ownerChainId: null },\n };\n }\n\n for (const node of root.nodes) {\n if (node.superscript) {\n if (node.superscript.id === chainId) {\n return {\n chain: node.superscript,\n relation: { kind: 'superscript', ownerNodeId: node.id, ownerChainId: root.id },\n };\n }\n const nested = findChainById(node.superscript, chainId);\n if (nested) {\n return nested;\n }\n }\n\n if (node.subscript) {\n if (node.subscript.id === chainId) {\n return {\n chain: node.subscript,\n relation: { kind: 'subscript', ownerNodeId: node.id, ownerChainId: root.id },\n };\n }\n const nested = findChainById(node.subscript, chainId);\n if (nested) {\n return nested;\n }\n }\n\n if (node.innerExpr) {\n if (node.innerExpr.id === chainId) {\n return {\n chain: node.innerExpr,\n relation: { kind: 'inner', ownerNodeId: node.id, ownerChainId: root.id },\n };\n }\n const nested = findChainById(node.innerExpr, chainId);\n if (nested) {\n return nested;\n }\n }\n\n if (node.numerator) {\n if (node.numerator.id === chainId) {\n return {\n chain: node.numerator,\n relation: { kind: 'numerator', ownerNodeId: node.id, ownerChainId: root.id },\n };\n }\n const nested = findChainById(node.numerator, chainId);\n if (nested) {\n return nested;\n }\n }\n\n if (node.denominator) {\n if (node.denominator.id === chainId) {\n return {\n chain: node.denominator,\n relation: { kind: 'denominator', ownerNodeId: node.id, ownerChainId: root.id },\n };\n }\n const nested = findChainById(node.denominator, chainId);\n if (nested) {\n return nested;\n }\n }\n\n if (node.rootIndex) {\n if (node.rootIndex.id === chainId) {\n return {\n chain: node.rootIndex,\n relation: { kind: 'rootIndex', ownerNodeId: node.id, ownerChainId: root.id },\n };\n }\n const nested = findChainById(node.rootIndex, chainId);\n if (nested) {\n return nested;\n }\n }\n\n if (node.radicand) {\n if (node.radicand.id === chainId) {\n return {\n chain: node.radicand,\n relation: { kind: 'radicand', ownerNodeId: node.id, ownerChainId: root.id },\n };\n }\n const nested = findChainById(node.radicand, chainId);\n if (nested) {\n return nested;\n }\n }\n\n if (node.matrixRows) {\n for (let rowIndex = 0; rowIndex < node.matrixRows.length; rowIndex += 1) {\n const row = node.matrixRows[rowIndex];\n for (let columnIndex = 0; columnIndex < row.length; columnIndex += 1) {\n const cell = row[columnIndex];\n if (cell.id === chainId) {\n return {\n chain: cell,\n relation: { kind: 'matrixCell', ownerNodeId: node.id, ownerChainId: root.id, rowIndex, columnIndex },\n };\n }\n const nested = findChainById(cell, chainId);\n if (nested) {\n return nested;\n }\n }\n }\n }\n }\n\n return null;\n}\n\nexport function findNodeById(root: EditorChain, nodeId: string): LocatedNode | null {\n for (let i = 0; i < root.nodes.length; i += 1) {\n const node = root.nodes[i];\n if (node.id === nodeId) {\n return {\n node,\n chain: root,\n index: i,\n };\n }\n if (node.superscript) {\n const nested = findNodeById(node.superscript, nodeId);\n if (nested) {\n return nested;\n }\n }\n if (node.subscript) {\n const nested = findNodeById(node.subscript, nodeId);\n if (nested) {\n return nested;\n }\n }\n if (node.innerExpr) {\n const nested = findNodeById(node.innerExpr, nodeId);\n if (nested) {\n return nested;\n }\n }\n if (node.numerator) {\n const nested = findNodeById(node.numerator, nodeId);\n if (nested) {\n return nested;\n }\n }\n if (node.denominator) {\n const nested = findNodeById(node.denominator, nodeId);\n if (nested) {\n return nested;\n }\n }\n if (node.rootIndex) {\n const nested = findNodeById(node.rootIndex, nodeId);\n if (nested) {\n return nested;\n }\n }\n if (node.radicand) {\n const nested = findNodeById(node.radicand, nodeId);\n if (nested) {\n return nested;\n }\n }\n if (node.matrixRows) {\n for (const row of node.matrixRows) {\n for (const cell of row) {\n const nested = findNodeById(cell, nodeId);\n if (nested) {\n return nested;\n }\n }\n }\n }\n }\n return null;\n}\n\nexport function activeTreeKey(side: EditorSide): 'englishTree' | 'arabicTree' {\n return side === 'english' ? 'englishTree' : 'arabicTree';\n}\n\nexport function passiveTreeKey(side: EditorSide): 'englishTree' | 'arabicTree' {\n return side === 'english' ? 'arabicTree' : 'englishTree';\n}\n","import { cloneEditorSession } from './factory.js';\nimport { activeTreeKey, findChainById } from './traversal.js';\nimport type { EditorChain, EditorNode, EditorSelectionRange, EditorSession } from './types.js';\n\n/**\n * Single source of truth for child chains of a node.\n * Future node kinds (commands, env, math objects) extend this helper and\n * everything downstream (caret traversal mirroring, copy/paste, selection)\n * keeps working. Today's children: innerExpr / numerator / denominator / rootIndex / radicand / matrix cells / superscript / subscript.\n */\nexport function nodeChildChains(node: EditorNode): EditorChain[] {\n const chains: EditorChain[] = [];\n if (node.innerExpr) {\n chains.push(node.innerExpr);\n }\n if (node.numerator) {\n chains.push(node.numerator);\n }\n if (node.denominator) {\n chains.push(node.denominator);\n }\n if (node.rootIndex) {\n chains.push(node.rootIndex);\n }\n if (node.radicand) {\n chains.push(node.radicand);\n }\n if (node.matrixRows) {\n for (const row of node.matrixRows) {\n chains.push(...row);\n }\n }\n if (node.superscript) {\n chains.push(node.superscript);\n }\n if (node.subscript) {\n chains.push(node.subscript);\n }\n return chains;\n}\n\n/** Lower/higher slot indices regardless of anchor/focus order. */\nexport function normalizeSelection(sel: EditorSelectionRange): { start: number; end: number } {\n const start = Math.min(sel.anchorIndex, sel.focusIndex);\n const end = Math.max(sel.anchorIndex, sel.focusIndex);\n return { start, end };\n}\n\n/** A selection is active only when it actually spans at least one node. */\nexport function isSelectionActive(sel: EditorSelectionRange | null): boolean {\n if (!sel) {\n return false;\n }\n return sel.anchorIndex !== sel.focusIndex;\n}\n\nexport function clearSelection(session: EditorSession): EditorSession {\n if (session.selection === null) {\n return session;\n }\n const next = cloneEditorSession(session);\n next.selection = null;\n return next;\n}\n\n/**\n * Extend the selection by one slot inside the same chain.\n * Initializes from the current caret when no selection exists.\n * Clamps focus to [0, chain.nodes.length]; collapses selection when it shrinks\n * back to its anchor.\n */\nexport function extendSelectionByStep(session: EditorSession, delta: -1 | 1): EditorSession {\n const next = cloneEditorSession(session);\n const tree = next[activeTreeKey(next.activeSide)];\n const located = findChainById(tree, next.caret.chainId);\n if (!located) {\n return session;\n }\n const chainLen = located.chain.nodes.length;\n\n if (next.selection === null || next.selection.chainId !== next.caret.chainId) {\n next.selection = {\n chainId: next.caret.chainId,\n anchorIndex: next.caret.index,\n focusIndex: next.caret.index,\n };\n }\n\n const targetFocus = Math.max(0, Math.min(chainLen, next.selection.focusIndex + delta));\n if (targetFocus === next.selection.focusIndex) {\n return session;\n }\n next.selection.focusIndex = targetFocus;\n next.caret = { chainId: next.selection.chainId, index: targetFocus };\n\n if (next.selection.anchorIndex === next.selection.focusIndex) {\n next.selection = null;\n }\n return next;\n}\n\n/**\n * Mouse-driven selection setter.\n * - role 'anchor': starts a fresh selection at slotIndex (collapsed).\n * - role 'focus': updates focus on the existing selection. Cross-chain\n * focus moves are ignored (drag stays inside one chain).\n */\nexport function setSelectionFromMouse(\n session: EditorSession,\n chainId: string,\n slotIndex: number,\n role: 'anchor' | 'focus',\n): EditorSession {\n const next = cloneEditorSession(session);\n const tree = next[activeTreeKey(next.activeSide)];\n const located = findChainById(tree, chainId);\n if (!located) {\n return session;\n }\n const clamped = Math.max(0, Math.min(located.chain.nodes.length, slotIndex));\n\n if (role === 'anchor') {\n next.selection = {\n chainId,\n anchorIndex: clamped,\n focusIndex: clamped,\n };\n next.caret = { chainId, index: clamped };\n next.selectedStructureNodeId = null;\n return next;\n }\n\n if (next.selection === null || next.selection.chainId !== chainId) {\n return session;\n }\n if (next.selection.focusIndex === clamped) {\n return session;\n }\n next.selection.focusIndex = clamped;\n next.caret = { chainId, index: clamped };\n if (next.selection.anchorIndex === next.selection.focusIndex) {\n next.selection = null;\n }\n return next;\n}\n\n/** Ids of whole nodes covered by the current selection in the active tree. */\nexport function coveredNodeIds(session: EditorSession): string[] {\n if (!isSelectionActive(session.selection)) {\n return [];\n }\n const sel = session.selection!;\n const tree = session[activeTreeKey(session.activeSide)];\n const located = findChainById(tree, sel.chainId);\n if (!located) {\n return [];\n }\n const { start, end } = normalizeSelection(sel);\n const lo = Math.max(0, Math.min(located.chain.nodes.length, start));\n const hi = Math.max(0, Math.min(located.chain.nodes.length, end));\n return located.chain.nodes.slice(lo, hi).map((n) => n.id);\n}\n","import { renderChainArabic, renderChainEnglish } from './render.js';\nimport { nodeChildChains } from './selection.js';\nimport { activeTreeKey, findChainById, findNodeById } from './traversal.js';\nimport type { EditorChain, EditorNode, EditorSession, EditorSide } from './types.js';\n\n/** MIME used for the structured BuTeX clipboard fragment. */\nexport const BUTEX_FRAGMENT_MIME = 'application/x-butex-fragment+json';\n\nexport type EditorFragment = {\n version: 1;\n source: 'butex-editor';\n english: EditorNode[];\n arabic: EditorNode[];\n};\n\n/** Same incrementing counter behavior as src/editor/factory.ts (private to clipboard reuse path). */\nlet fragmentNextId = 1;\n\nfunction freshId(prefix: string): string {\n const id = `${prefix}_paste_${String(fragmentNextId)}`;\n fragmentNextId += 1;\n return id;\n}\n\n/**\n * Build a fragment from the active selection by deep-cloning the covered nodes\n * from BOTH english and arabic trees (mirrored by node id at matching index).\n * Returns null when the selection is collapsed or invalid.\n */\nexport function serializeSelection(session: EditorSession): EditorFragment | null {\n const sel = session.selection;\n if (!sel || sel.anchorIndex === sel.focusIndex) {\n return null;\n }\n const start = Math.min(sel.anchorIndex, sel.focusIndex);\n const end = Math.max(sel.anchorIndex, sel.focusIndex);\n\n const activeKey = activeTreeKey(session.activeSide);\n const passiveKey = activeKey === 'englishTree' ? 'arabicTree' : 'englishTree';\n const activeLocated = findChainById(session[activeKey], sel.chainId);\n if (!activeLocated) {\n return null;\n }\n const lo = Math.max(0, Math.min(activeLocated.chain.nodes.length, start));\n const hi = Math.max(0, Math.min(activeLocated.chain.nodes.length, end));\n if (hi <= lo) {\n return null;\n }\n\n const passiveTree = session[passiveKey];\n const englishOut: EditorNode[] = [];\n const arabicOut: EditorNode[] = [];\n for (let i = lo; i < hi; i += 1) {\n const activeNode = activeLocated.chain.nodes[i];\n const passiveLocated = findNodeById(passiveTree, activeNode.id);\n if (!passiveLocated) {\n return null;\n }\n if (activeKey === 'englishTree') {\n englishOut.push(structuredClone(activeNode));\n arabicOut.push(structuredClone(passiveLocated.node));\n } else {\n englishOut.push(structuredClone(passiveLocated.node));\n arabicOut.push(structuredClone(activeNode));\n }\n }\n\n return { version: 1, source: 'butex-editor', english: englishOut, arabic: arabicOut };\n}\n\n/**\n * Re-id every node and nested chain in both sides of the fragment so they no\n * longer collide with the live tree. Keeps the EN/AR mirror invariant\n * (matching ids index-by-index, including in nested child chains).\n */\nexport function regenerateFragmentIds(fragment: EditorFragment): EditorFragment {\n const out: EditorFragment = {\n version: 1,\n source: 'butex-editor',\n english: fragment.english.map((n) => structuredClone(n)),\n arabic: fragment.arabic.map((n) => structuredClone(n)),\n };\n if (out.english.length !== out.arabic.length) {\n return out;\n }\n for (let i = 0; i < out.english.length; i += 1) {\n rebuildIdsMirrored(out.english[i], out.arabic[i]);\n }\n return out;\n}\n\nfunction rebuildIdsMirrored(eng: EditorNode, ar: EditorNode): void {\n const newId = freshId('node');\n eng.id = newId;\n ar.id = newId;\n\n const engChains = nodeChildChains(eng);\n const arChains = nodeChildChains(ar);\n for (let c = 0; c < engChains.length && c < arChains.length; c += 1) {\n const newChainId = freshId('chain');\n engChains[c].id = newChainId;\n arChains[c].id = newChainId;\n const engNodes = engChains[c].nodes;\n const arNodes = arChains[c].nodes;\n for (let j = 0; j < engNodes.length && j < arNodes.length; j += 1) {\n rebuildIdsMirrored(engNodes[j], arNodes[j]);\n }\n }\n}\n\n/** Best-effort parse of a clipboard payload. Returns null when shape is wrong. */\nexport function deserializeFragment(payload: string): EditorFragment | null {\n if (!payload) {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(payload);\n } catch {\n return null;\n }\n if (!parsed || typeof parsed !== 'object') {\n return null;\n }\n const obj = parsed as Partial<EditorFragment>;\n if (obj.version !== 1 || obj.source !== 'butex-editor') {\n return null;\n }\n if (!Array.isArray(obj.english) || !Array.isArray(obj.arabic)) {\n return null;\n }\n if (obj.english.length !== obj.arabic.length) {\n return null;\n }\n return { version: 1, source: 'butex-editor', english: obj.english, arabic: obj.arabic };\n}\n\n/** Plain-text rendering of the fragment for cross-app clipboard fallback. */\nexport function fragmentToPlainText(fragment: EditorFragment, side: EditorSide): string {\n const fakeChain: EditorChain = {\n id: 'fragment',\n nodes: side === 'arabic' ? fragment.arabic : fragment.english,\n };\n return side === 'arabic' ? renderChainArabic(fakeChain) : renderChainEnglish(fakeChain);\n}\n","import { cloneEditorSession } from './factory.js';\nimport type { EditorSession } from './types.js';\n\n/** Maximum number of editable states kept in the past stack (oldest drops first). */\nexport const DEFAULT_UNDO_HISTORY_MAX_DEPTH = 100;\n\nexport type UndoRedoStacks = {\n past: EditorSession[];\n future: EditorSession[];\n maxDepth: number;\n};\n\nexport function createUndoRedoStacks(maxDepth: number = DEFAULT_UNDO_HISTORY_MAX_DEPTH): UndoRedoStacks {\n return { past: [], future: [], maxDepth };\n}\n\n/**\n * Records the session **before** a user edit so it can be restored later.\n * Clears the redo branch (standard editor semantics).\n */\nexport function pushUndoRedoSnapshot(stacks: UndoRedoStacks, sessionBeforeEdit: EditorSession): void {\n stacks.past.push(cloneEditorSession(sessionBeforeEdit));\n if (stacks.past.length > stacks.maxDepth) {\n stacks.past.splice(0, stacks.past.length - stacks.maxDepth);\n }\n stacks.future = [];\n}\n\n/** Restore the previous editable state, or null if there is nothing to undo. */\nexport function restoreUndo(stacks: UndoRedoStacks, sessionNow: EditorSession): EditorSession | null {\n if (stacks.past.length === 0) {\n return null;\n }\n stacks.future.push(cloneEditorSession(sessionNow));\n return stacks.past.pop() ?? null;\n}\n\n/** Restore the next state after an undo, or null if there is nothing to redo. */\nexport function restoreRedo(stacks: UndoRedoStacks, sessionNow: EditorSession): EditorSession | null {\n if (stacks.future.length === 0) {\n return null;\n }\n stacks.past.push(cloneEditorSession(sessionNow));\n return stacks.future.pop() ?? null;\n}\n\nexport function undoRedoCanUndo(stacks: UndoRedoStacks): boolean {\n return stacks.past.length > 0;\n}\n\nexport function undoRedoCanRedo(stacks: UndoRedoStacks): boolean {\n return stacks.future.length > 0;\n}\n","import { caretStep } from './caretOrder.js';\nimport {\n type EditorFragment,\n regenerateFragmentIds,\n serializeSelection,\n} from './clipboard.js';\nimport {\n cloneEditorSession,\n createDelimiterNode,\n createEditorChain,\n createEditorNode,\n createFracNode,\n createSqrtNode,\n createGridEnvNode,\n createAtomicCommandNode,\n createAtomicOperatorCommandNode,\n} from './factory.js';\nimport { renderArabicLatexFromSession, renderEnglishLatexFromSession } from './render.js';\nimport { coveredNodeIds, isSelectionActive, nodeChildChains } from './selection.js';\nimport { activeTreeKey, findChainById, findNodeById, passiveTreeKey } from './traversal.js';\nimport type {\n CharacterFontId,\n DigitFormId,\n EditorChain,\n EditorDebugEntry,\n EditorNode,\n EditorSession,\n EditorSide,\n EnvColumnAlignment,\n GridEnvName,\n MatrixEnvStyle,\n} from './types.js';\nimport type { AtomicCommandId } from './atomicCommands.js';\nimport type { AtomicOperatorCommandId } from './atomicCommandsOperators.js';\n\nfunction ensureSyncEntry(session: EditorSession, nodeId: string): void {\n if (!session.sync[nodeId]) {\n session.sync[nodeId] = { expr: 'synced' };\n }\n}\n\nfunction markExprSync(session: EditorSession, nodeId: string): void {\n const english = findNodeById(session.englishTree, nodeId);\n const arabic = findNodeById(session.arabicTree, nodeId);\n ensureSyncEntry(session, nodeId);\n if (!english || !arabic) {\n session.sync[nodeId].expr = 'diverged';\n return;\n }\n session.sync[nodeId].expr = english.node.expr === arabic.node.expr ? 'synced' : 'diverged';\n}\n\n/** Keep highlighted node aligned with caret (keyboard + programmatic caret moves). */\nexport function syncSelectionToCaret(session: EditorSession): void {\n const activeKey = activeTreeKey(session.activeSide);\n const tree = session[activeKey];\n const { chainId, index } = session.caret;\n const located = findChainById(tree, chainId);\n if (!located) {\n session.selectedNodeId = null;\n return;\n }\n if (index > 0) {\n session.selectedNodeId = located.chain.nodes[index - 1].id;\n return;\n }\n if (located.relation.kind === 'superscript' || located.relation.kind === 'subscript') {\n session.selectedNodeId = located.relation.ownerNodeId;\n return;\n }\n if (\n located.relation.kind === 'inner' ||\n located.relation.kind === 'numerator' ||\n located.relation.kind === 'denominator' ||\n located.relation.kind === 'radicand' ||\n located.relation.kind === 'rootIndex' ||\n located.relation.kind === 'matrixCell'\n ) {\n session.selectedNodeId = located.relation.ownerNodeId;\n return;\n }\n session.selectedNodeId = null;\n}\n\nfunction appendDebug(session: EditorSession, command: string, note: string): void {\n const entry: EditorDebugEntry = {\n timestamp: new Date().toISOString(),\n command,\n activeSide: session.activeSide,\n englishLatex: renderEnglishLatexFromSession(session),\n arabicLatex: renderArabicLatexFromSession(session),\n renderOk: true,\n renderError: null,\n note,\n };\n const nextLog = session.debugLog.concat(entry);\n session.debugLog = nextLog.slice(-120);\n}\n\nfunction insertMirroredNode(session: EditorSession, chainId: string, index: number, englishNode: EditorNode, arabicNode: EditorNode): void {\n const englishLocated = findChainById(session.englishTree, chainId);\n const arabicLocated = findChainById(session.arabicTree, chainId);\n if (!englishLocated || !arabicLocated) {\n return;\n }\n const safeIndex = Math.max(0, Math.min(index, englishLocated.chain.nodes.length));\n englishLocated.chain.nodes.splice(safeIndex, 0, englishNode);\n arabicLocated.chain.nodes.splice(safeIndex, 0, arabicNode);\n ensureSyncEntry(session, englishNode.id);\n markExprSync(session, englishNode.id);\n}\n\nfunction syncMatrixCellChainIds(englishNode: EditorNode, arabicNode: EditorNode): void {\n const englishRows = englishNode.matrixRows ?? [];\n const arabicRows = arabicNode.matrixRows ?? [];\n const rowLimit = Math.min(englishRows.length, arabicRows.length);\n for (let rowIndex = 0; rowIndex < rowLimit; rowIndex += 1) {\n const englishRow = englishRows[rowIndex];\n const arabicRow = arabicRows[rowIndex];\n const columnLimit = Math.min(englishRow.length, arabicRow.length);\n for (let columnIndex = 0; columnIndex < columnLimit; columnIndex += 1) {\n arabicRow[columnIndex].id = englishRow[columnIndex].id;\n }\n }\n}\n\nfunction createMatrixRow(columnCount: number): EditorChain[] {\n return Array.from({ length: columnCount }, () => createEditorChain());\n}\n\nfunction findSelectedMatrixPair(session: EditorSession): { english: EditorNode; arabic: EditorNode } | null {\n const targetNodeId = session.selectedStructureNodeId ?? session.selectedNodeId;\n if (!targetNodeId) {\n return null;\n }\n const englishLocated = findNodeById(session.englishTree, targetNodeId);\n const arabicLocated = findNodeById(session.arabicTree, targetNodeId);\n if (!englishLocated || !arabicLocated) {\n return null;\n }\n if (englishLocated.node.kind !== 'env' || arabicLocated.node.kind !== 'env') {\n return null;\n }\n return { english: englishLocated.node, arabic: arabicLocated.node };\n}\n\nfunction normalizeArrayAlignments(node: EditorNode): void {\n if ((node.envName ?? node.matrixStyle) !== 'array' || !node.matrixRows) {\n return;\n }\n const columnCount = Math.max(1, node.matrixRows[0]?.length ?? 1);\n const current = node.columnAlignments ?? [];\n node.columnAlignments = Array.from({ length: columnCount }, (_, index) => current[index] ?? 'c');\n}\n\nfunction removeMirroredNodeById(session: EditorSession, nodeId: string): boolean {\n const englishLocated = findNodeById(session.englishTree, nodeId);\n const arabicLocated = findNodeById(session.arabicTree, nodeId);\n if (!englishLocated || !arabicLocated) {\n return false;\n }\n englishLocated.chain.nodes.splice(englishLocated.index, 1);\n arabicLocated.chain.nodes.splice(arabicLocated.index, 1);\n delete session.sync[nodeId];\n return true;\n}\n\n/**\n * Mutates `next` to remove every node covered by its current selection (mirrored\n * across EN/AR), parks the caret at selection.start, and clears the selection.\n * Returns true when something was removed.\n */\nfunction applyDeleteSelectionRange(next: EditorSession): boolean {\n if (!isSelectionActive(next.selection)) {\n next.selection = null;\n return false;\n }\n const ids = coveredNodeIds(next);\n if (ids.length === 0) {\n next.selection = null;\n return false;\n }\n const sel = next.selection;\n if (!sel) {\n return false;\n }\n const start = Math.min(sel.anchorIndex, sel.focusIndex);\n const chainId = sel.chainId;\n for (const id of ids) {\n removeMirroredNodeById(next, id);\n }\n next.caret = { chainId, index: start };\n next.selection = null;\n next.selectedStructureNodeId = null;\n return true;\n}\n\n/** Recursively ensure sync entries for an inserted mirrored subtree (top + nested). */\nfunction syncSubtreeRecursive(session: EditorSession, eng: EditorNode, ar: EditorNode): void {\n ensureSyncEntry(session, eng.id);\n markExprSync(session, eng.id);\n const engChains = nodeChildChains(eng);\n const arChains = nodeChildChains(ar);\n const limit = Math.min(engChains.length, arChains.length);\n for (let c = 0; c < limit; c += 1) {\n const ec = engChains[c];\n const ac = arChains[c];\n const innerLimit = Math.min(ec.nodes.length, ac.nodes.length);\n for (let j = 0; j < innerLimit; j += 1) {\n syncSubtreeRecursive(session, ec.nodes[j], ac.nodes[j]);\n }\n }\n}\n\nexport function switchSide(session: EditorSession): EditorSession {\n const next = cloneEditorSession(session);\n next.activeSide = next.activeSide === 'english' ? 'arabic' : 'english';\n next.selection = null;\n appendDebug(next, 'switchSide', `active=${next.activeSide}`);\n return next;\n}\n\nexport function setSplitLeafTyping(session: EditorSession, enabled: boolean): EditorSession {\n const next = cloneEditorSession(session);\n next.splitLeafTyping = enabled;\n appendDebug(next, 'setSplitLeafTyping', enabled ? 'on' : 'off');\n return next;\n}\n\nexport function setArabicReverseNumberTyping(session: EditorSession, enabled: boolean): EditorSession {\n const next = cloneEditorSession(session);\n next.arabicReverseNumberTyping = enabled;\n appendDebug(next, 'setArabicReverseNumberTyping', enabled ? 'on' : 'off');\n return next;\n}\n\nexport function setCaret(session: EditorSession, chainId: string, index: number): EditorSession {\n const next = cloneEditorSession(session);\n const activeKey = activeTreeKey(next.activeSide);\n const located = findChainById(next[activeKey], chainId);\n if (!located) {\n return session;\n }\n next.caret = {\n chainId,\n index: Math.max(0, Math.min(index, located.chain.nodes.length)),\n };\n next.selection = null;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n return next;\n}\n\nexport function moveCaret(session: EditorSession, delta: -1 | 1): EditorSession {\n const next = cloneEditorSession(session);\n const activeKey = activeTreeKey(next.activeSide);\n const tree = next[activeKey];\n const located = findChainById(tree, next.caret.chainId);\n if (!located) {\n return session;\n }\n next.caret = caretStep(tree, next.caret, delta);\n next.selection = null;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaret', `delta=${String(delta)} dfs`);\n return next;\n}\n\nexport function horizontalCaretDelta(session: EditorSession, direction: 'left' | 'right'): -1 | 1 {\n const activeKey = activeTreeKey(session.activeSide);\n const tree = session[activeKey];\n const located = findChainById(tree, session.caret.chainId);\n const inMatrixCell = located?.relation.kind === 'matrixCell';\n const canMoveInsideCell =\n inMatrixCell &&\n session.activeSide === 'arabic' &&\n ((direction === 'left' && session.caret.index < located.chain.nodes.length) ||\n (direction === 'right' && session.caret.index > 0));\n if (session.activeSide === 'arabic' && (!inMatrixCell || canMoveInsideCell)) {\n return direction === 'left' ? 1 : -1;\n }\n return direction === 'left' ? -1 : 1;\n}\n\nexport function moveCaretHorizontal(session: EditorSession, direction: 'left' | 'right'): EditorSession {\n const activeKey = activeTreeKey(session.activeSide);\n const tree = session[activeKey];\n const located = findChainById(tree, session.caret.chainId);\n if (!located || located.relation.kind !== 'matrixCell') {\n return moveCaret(session, horizontalCaretDelta(session, direction));\n }\n\n const textDelta = session.activeSide === 'arabic'\n ? direction === 'left' ? 1 : -1\n : direction === 'left' ? -1 : 1;\n const nextIndex = session.caret.index + textDelta;\n if (nextIndex >= 0 && nextIndex <= located.chain.nodes.length) {\n return moveCaret(session, textDelta);\n }\n\n const ownerLocated =\n located.relation.ownerNodeId !== null ? findNodeById(tree, located.relation.ownerNodeId) : null;\n const ownerNode = ownerLocated?.node ?? null;\n if (!ownerLocated || !ownerNode?.matrixRows) {\n return session;\n }\n\n const rowIndex = located.relation.rowIndex ?? 0;\n const columnIndex = located.relation.columnIndex ?? 0;\n const row = ownerNode.matrixRows[rowIndex];\n if (!row) {\n return session;\n }\n\n const toVisualIndex = (column: number, columnCount: number): number =>\n session.activeSide === 'arabic' ? columnCount - 1 - column : column;\n const fromVisualIndex = (visualColumn: number, columnCount: number): number =>\n session.activeSide === 'arabic' ? columnCount - 1 - visualColumn : visualColumn;\n const entryIndex = (cell: EditorChain): number => {\n if (session.activeSide === 'arabic') {\n return direction === 'left' ? 0 : cell.nodes.length;\n }\n return direction === 'left' ? cell.nodes.length : 0;\n };\n\n const visualDelta = direction === 'left' ? -1 : 1;\n const currentVisualIndex = toVisualIndex(columnIndex, row.length);\n let targetRowIndex = rowIndex;\n let targetVisualIndex = currentVisualIndex + visualDelta;\n\n if (targetVisualIndex < 0 || targetVisualIndex >= row.length) {\n if (direction === 'left') {\n if (session.activeSide === 'arabic') {\n targetRowIndex = rowIndex + 1;\n const targetRow = ownerNode.matrixRows[targetRowIndex];\n if (targetRow) {\n targetVisualIndex = targetRow.length - 1;\n }\n } else {\n targetRowIndex = rowIndex - 1;\n const targetRow = ownerNode.matrixRows[targetRowIndex];\n if (targetRow) {\n targetVisualIndex = targetRow.length - 1;\n }\n }\n } else if (session.activeSide === 'arabic') {\n targetRowIndex = rowIndex - 1;\n targetVisualIndex = 0;\n } else {\n targetRowIndex = rowIndex + 1;\n targetVisualIndex = 0;\n }\n }\n\n const targetRow = ownerNode.matrixRows[targetRowIndex];\n if (targetRow && targetVisualIndex >= 0 && targetVisualIndex < targetRow.length) {\n const targetColumnIndex = fromVisualIndex(targetVisualIndex, targetRow.length);\n const targetCell = targetRow[targetColumnIndex];\n if (targetCell) {\n const next = cloneEditorSession(session);\n next.caret = { chainId: targetCell.id, index: entryIndex(targetCell) };\n next.selection = null;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretHorizontal', `matrix-${direction}`);\n return next;\n }\n }\n\n const next = cloneEditorSession(session);\n const exitsAfter =\n (session.activeSide === 'english' && direction === 'right') ||\n (session.activeSide === 'arabic' && direction === 'left');\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: exitsAfter ? ownerLocated.index + 1 : ownerLocated.index,\n };\n next.selection = null;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretHorizontal', `matrix-${direction}-exit`);\n return next;\n}\n\nexport function moveCaretVertical(session: EditorSession, direction: 'up' | 'down'): EditorSession {\n const next = cloneEditorSession(session);\n next.selection = null;\n const activeKey = activeTreeKey(next.activeSide);\n const tree = next[activeKey];\n const located = findChainById(tree, next.caret.chainId);\n if (!located) {\n return session;\n }\n\n const ownerLocated =\n located.relation.ownerNodeId !== null ? findNodeById(tree, located.relation.ownerNodeId) : null;\n const ownerNode = ownerLocated?.node ?? null;\n\n if (located.relation.kind === 'numerator' && ownerLocated && ownerNode && ownerNode.denominator) {\n if (direction === 'down') {\n next.caret = {\n chainId: ownerNode.denominator.id,\n index: ownerNode.denominator.nodes.length,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'frac-num->den');\n return next;\n }\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'frac-num-up-exit');\n return next;\n }\n\n if (located.relation.kind === 'denominator' && ownerLocated && ownerNode && ownerNode.numerator) {\n if (direction === 'up') {\n next.caret = {\n chainId: ownerNode.numerator.id,\n index: ownerNode.numerator.nodes.length,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'frac-den->num');\n return next;\n }\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index + 1,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'frac-den-down-exit');\n return next;\n }\n\n if (located.relation.kind === 'rootIndex' && ownerLocated && ownerNode && ownerNode.radicand) {\n if (direction === 'down') {\n next.caret = {\n chainId: ownerNode.radicand.id,\n index: ownerNode.radicand.nodes.length,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sqrt-root->radicand');\n return next;\n }\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sqrt-root-up-exit');\n return next;\n }\n\n if (located.relation.kind === 'radicand' && ownerLocated && ownerNode && ownerNode.rootIndex) {\n if (direction === 'up') {\n next.caret = {\n chainId: ownerNode.rootIndex.id,\n index: ownerNode.rootIndex.nodes.length,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sqrt-radicand->root');\n return next;\n }\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index + 1,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sqrt-radicand-down-exit');\n return next;\n }\n\n if (located.relation.kind === 'matrixCell' && ownerLocated && ownerNode?.matrixRows) {\n const rowIndex = located.relation.rowIndex ?? 0;\n const columnIndex = located.relation.columnIndex ?? 0;\n const nextRowIndex = direction === 'up' ? rowIndex - 1 : rowIndex + 1;\n if (nextRowIndex >= 0 && nextRowIndex < ownerNode.matrixRows.length) {\n const nextRow = ownerNode.matrixRows[nextRowIndex];\n const nextCell = nextRow[Math.min(columnIndex, nextRow.length - 1)];\n if (nextCell) {\n next.caret = {\n chainId: nextCell.id,\n index: nextCell.nodes.length,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'matrix-cell');\n return next;\n }\n }\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: direction === 'up' ? ownerLocated.index : ownerLocated.index + 1,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', `matrix-${direction}-exit`);\n return next;\n }\n\n if (located.relation.kind === 'superscript' && ownerLocated && ownerNode) {\n if (direction === 'down') {\n if (ownerNode.subscript) {\n next.caret = {\n chainId: ownerNode.subscript.id,\n index: ownerNode.subscript.nodes.length,\n };\n } else {\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index + 1,\n };\n }\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sup->down');\n return next;\n }\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sup->up-exit');\n return next;\n }\n\n if (located.relation.kind === 'subscript' && ownerLocated && ownerNode) {\n if (direction === 'up') {\n if (ownerNode.superscript) {\n next.caret = {\n chainId: ownerNode.superscript.id,\n index: ownerNode.superscript.nodes.length,\n };\n } else {\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index,\n };\n }\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sub->up');\n return next;\n }\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index + 1,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sub->down-exit');\n return next;\n }\n\n if (located.relation.kind !== 'root' && located.relation.kind !== 'inner') {\n return session;\n }\n\n const caretIdx = next.caret.index;\n if (caretIdx <= 0) {\n return session;\n }\n const nodeBeforeCaret = located.chain.nodes[caretIdx - 1];\n if (!nodeBeforeCaret) {\n return session;\n }\n\n const targetChain =\n direction === 'up'\n ? nodeBeforeCaret.superscript ?? nodeBeforeCaret.subscript\n : nodeBeforeCaret.subscript ?? nodeBeforeCaret.superscript;\n\n if (!targetChain) {\n return session;\n }\n next.caret = {\n chainId: targetChain.id,\n index: targetChain.nodes.length,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', `base->script:${direction}`);\n return next;\n}\n\nfunction insertLeaf(session: EditorSession, kind: 'char' | 'number' | 'operator', expr: string): EditorSession {\n const next = cloneEditorSession(session);\n const englishNode = createEditorNode(kind, expr);\n const arabicNode = createEditorNode(kind, expr);\n if (kind === 'char' && (next.currentCharacterFont ?? 'default') !== 'default') {\n englishNode.characterFont = next.currentCharacterFont;\n arabicNode.characterFont = next.currentCharacterFont;\n }\n arabicNode.id = englishNode.id;\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n next.caret.index += 1;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertLeaf', `${kind}:${expr}`);\n return next;\n}\n\n/** When Arabic active and flag on, number fragments prepend on both mirrored exprs (same printed string on EN/AR). */\nfunction shouldReverseArabicNumber(session: EditorSession): boolean {\n return session.activeSide === 'arabic' && session.arabicReverseNumberTyping;\n}\n\nfunction characterFontOf(node: EditorNode): CharacterFontId {\n return node.kind === 'char' ? node.characterFont ?? 'default' : 'default';\n}\n\n/** When split mode is off: merge into adjacent same-kind leaf (append after node at index-1, else prepend node at index). */\nfunction tryMergeLeafTyping(session: EditorSession, kind: 'char' | 'number', fragment: string): boolean {\n const engLocated = findChainById(session.englishTree, session.caret.chainId);\n if (!engLocated) {\n return false;\n }\n const nodes = engLocated.chain.nodes;\n const i = session.caret.index;\n let targetId: string | null = null;\n let prepend = false;\n if (i > 0) {\n const prev = nodes[i - 1];\n if (prev.kind === kind && (kind !== 'char' || characterFontOf(prev) === (session.currentCharacterFont ?? 'default'))) {\n targetId = prev.id;\n prepend = false;\n }\n }\n if (!targetId && i < nodes.length) {\n const fwd = nodes[i];\n if (fwd.kind === kind && (kind !== 'char' || characterFontOf(fwd) === (session.currentCharacterFont ?? 'default'))) {\n targetId = fwd.id;\n prepend = true;\n }\n }\n if (!targetId) {\n return false;\n }\n const englishHit = findNodeById(session.englishTree, targetId);\n const arabicHit = findNodeById(session.arabicTree, targetId);\n if (!englishHit || !arabicHit) {\n return false;\n }\n const prependBoth = kind === 'number' && shouldReverseArabicNumber(session) ? true : prepend;\n if (prependBoth) {\n englishHit.node.expr = `${fragment}${englishHit.node.expr}`;\n arabicHit.node.expr = `${fragment}${arabicHit.node.expr}`;\n } else {\n englishHit.node.expr = `${englishHit.node.expr}${fragment}`;\n arabicHit.node.expr = `${arabicHit.node.expr}${fragment}`;\n }\n markExprSync(session, targetId);\n return true;\n}\n\n/**\n * Replace any active selection with a freshly-cleared range, then return a base\n * session ready for the actual insert. Mutating helper so reducers stay short.\n */\nfunction replaceSelectionFirst(session: EditorSession): EditorSession {\n if (!isSelectionActive(session.selection)) {\n return session;\n }\n const next = cloneEditorSession(session);\n applyDeleteSelectionRange(next);\n syncSelectionToCaret(next);\n return next;\n}\n\n/** Returns true when the node before the caret is a pure-digit number leaf (no existing dot). */\nfunction precedingIsExtendableNumber(session: EditorSession): boolean {\n const located = findChainById(session.englishTree, session.caret.chainId);\n if (!located || session.caret.index <= 0) {\n return false;\n }\n const prev = located.chain.nodes[session.caret.index - 1];\n if (!prev || prev.kind !== 'number') {\n return false;\n }\n if (prev.expr.includes('.')) {\n return false;\n }\n return /^\\d+$/.test(prev.expr);\n}\n\n/** One-shot: forces the next insertChar/insertNumber to start a new leaf instead of merging. No-op in split mode. */\nexport function breakLeafTyping(session: EditorSession): EditorSession {\n if (session.splitLeafTyping) {\n return session;\n }\n const next = cloneEditorSession(session);\n next.forceSplitNextLeaf = true;\n appendDebug(next, 'breakLeafTyping', 'split-next');\n return next;\n}\n\nexport function setCurrentCharacterFont(session: EditorSession, fontId: CharacterFontId): EditorSession {\n const next = cloneEditorSession(session);\n next.currentCharacterFont = fontId;\n appendDebug(next, 'setCurrentCharacterFont', fontId);\n return next;\n}\n\nexport function toggleTakweenCharacterFont(session: EditorSession): EditorSession {\n return setCurrentCharacterFont(session, (session.currentCharacterFont ?? 'default') === 'takween' ? 'default' : 'takween');\n}\n\nexport function setCurrentDigitForm(session: EditorSession, digitForm: DigitFormId): EditorSession {\n const next = cloneEditorSession(session);\n next.currentDigitForm = digitForm;\n appendDebug(next, 'setCurrentDigitForm', digitForm);\n return next;\n}\n\nexport function insertChar(session: EditorSession, expr: string): EditorSession {\n const base = replaceSelectionFirst(session);\n if (!base.splitLeafTyping && !base.forceSplitNextLeaf) {\n const next = cloneEditorSession(base);\n if (tryMergeLeafTyping(next, 'char', expr)) {\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'mergeLeaf', `char:${expr}`);\n return next;\n }\n }\n const inserted = insertLeaf(base, 'char', expr);\n inserted.forceSplitNextLeaf = false;\n return inserted;\n}\n\nexport function insertNumber(session: EditorSession, expr: string): EditorSession {\n const base = replaceSelectionFirst(session);\n if (!base.splitLeafTyping && !base.forceSplitNextLeaf) {\n const next = cloneEditorSession(base);\n if (tryMergeLeafTyping(next, 'number', expr)) {\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'mergeLeaf', `number:${expr}`);\n return next;\n }\n }\n const inserted = insertLeaf(base, 'number', expr);\n inserted.forceSplitNextLeaf = false;\n return inserted;\n}\n\nexport function insertOperator(session: EditorSession, expr: string): EditorSession {\n if (expr === '.' && !session.splitLeafTyping && precedingIsExtendableNumber(session)) {\n return insertNumber(session, '.');\n }\n const base = replaceSelectionFirst(session);\n return insertLeaf(base, 'operator', expr);\n}\n\nexport function insertAtomicCommand(session: EditorSession, commandId: AtomicCommandId): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const englishNode = createAtomicCommandNode(commandId);\n const arabicNode = createAtomicCommandNode(commandId);\n arabicNode.id = englishNode.id;\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n next.caret.index += 1;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertAtomicCommand', commandId);\n return next;\n}\n\nexport function insertAtomicOperatorCommand(session: EditorSession, commandId: AtomicOperatorCommandId): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const englishNode = createAtomicOperatorCommandNode(commandId);\n const arabicNode = createAtomicOperatorCommandNode(commandId);\n arabicNode.id = englishNode.id;\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n next.caret.index += 1;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertAtomicOperatorCommand', commandId);\n return next;\n}\n\nexport function insertDelimiterPair(session: EditorSession, leftDelimExpr: string, rightDelimExpr: string): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const englishNode = createDelimiterNode(leftDelimExpr, rightDelimExpr);\n const arabicNode = createDelimiterNode(leftDelimExpr, rightDelimExpr);\n arabicNode.id = englishNode.id;\n if (arabicNode.innerExpr && englishNode.innerExpr) {\n arabicNode.innerExpr.id = englishNode.innerExpr.id;\n }\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n next.caret = {\n chainId: englishNode.innerExpr ? englishNode.innerExpr.id : next.caret.chainId,\n index: 0,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertDelimiterPair', `${leftDelimExpr}${rightDelimExpr}`);\n return next;\n}\n\nexport function insertFraction(session: EditorSession): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const englishNode = createFracNode();\n const arabicNode = createFracNode();\n arabicNode.id = englishNode.id;\n if (arabicNode.numerator && englishNode.numerator) {\n arabicNode.numerator.id = englishNode.numerator.id;\n }\n if (arabicNode.denominator && englishNode.denominator) {\n arabicNode.denominator.id = englishNode.denominator.id;\n }\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n next.caret = {\n chainId: englishNode.numerator ? englishNode.numerator.id : next.caret.chainId,\n index: 0,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertFraction', '');\n return next;\n}\n\nexport function insertSqrt(session: EditorSession): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const englishNode = createSqrtNode();\n const arabicNode = createSqrtNode();\n arabicNode.id = englishNode.id;\n if (arabicNode.radicand && englishNode.radicand) {\n arabicNode.radicand.id = englishNode.radicand.id;\n }\n if (arabicNode.rootIndex && englishNode.rootIndex) {\n arabicNode.rootIndex.id = englishNode.rootIndex.id;\n }\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n next.caret = {\n chainId: englishNode.radicand ? englishNode.radicand.id : next.caret.chainId,\n index: 0,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertSqrt', '');\n return next;\n}\n\nexport function insertMatrixEnv(\n session: EditorSession,\n style: MatrixEnvStyle,\n rows: number,\n columns: number,\n): EditorSession {\n return insertGridEnv(session, style, rows, columns);\n}\n\nexport function insertArrayEnv(\n session: EditorSession,\n rows: number,\n columns: number,\n columnAlignments?: EnvColumnAlignment[],\n): EditorSession {\n return insertGridEnv(session, 'array', rows, columns, columnAlignments);\n}\n\nexport function insertAlignedEnv(\n session: EditorSession,\n rows: number,\n columns: number,\n): EditorSession {\n return insertGridEnv(session, 'aligned', rows, columns);\n}\n\nfunction insertGridEnv(\n session: EditorSession,\n envName: GridEnvName,\n rows: number,\n columns: number,\n columnAlignments?: EnvColumnAlignment[],\n): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const englishNode = createGridEnvNode(envName, rows, columns, columnAlignments);\n const arabicNode = createGridEnvNode(envName, rows, columns, columnAlignments);\n arabicNode.id = englishNode.id;\n syncMatrixCellChainIds(englishNode, arabicNode);\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n next.caret = {\n chainId: englishNode.matrixRows?.[0]?.[0]?.id ?? next.caret.chainId,\n index: 0,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertGridEnv', `${envName}:${String(rows)}x${String(columns)}`);\n return next;\n}\n\nexport function setMatrixEnvStyle(session: EditorSession, style: MatrixEnvStyle): EditorSession {\n const next = cloneEditorSession(session);\n const pair = findSelectedMatrixPair(next);\n if (!pair) {\n return session;\n }\n pair.english.envName = style;\n pair.arabic.envName = style;\n pair.english.matrixStyle = style;\n pair.arabic.matrixStyle = style;\n pair.english.columnAlignments = null;\n pair.arabic.columnAlignments = null;\n appendDebug(next, 'setMatrixEnvStyle', style);\n return next;\n}\n\nexport function setArrayColumnAlignment(\n session: EditorSession,\n columnIndex: number,\n alignment: EnvColumnAlignment,\n): EditorSession {\n const next = cloneEditorSession(session);\n const pair = findSelectedMatrixPair(next);\n if (!pair || (pair.english.envName ?? pair.english.matrixStyle) !== 'array') {\n return session;\n }\n normalizeArrayAlignments(pair.english);\n normalizeArrayAlignments(pair.arabic);\n const columnCount = pair.english.columnAlignments?.length ?? 0;\n const safeIndex = Math.max(0, Math.min(columnIndex, Math.max(0, columnCount - 1)));\n if (pair.english.columnAlignments && pair.arabic.columnAlignments && columnCount > 0) {\n pair.english.columnAlignments[safeIndex] = alignment;\n pair.arabic.columnAlignments[safeIndex] = alignment;\n }\n appendDebug(next, 'setArrayColumnAlignment', `${String(safeIndex)}:${alignment}`);\n return next;\n}\n\nexport function addMatrixRow(session: EditorSession): EditorSession {\n const next = cloneEditorSession(session);\n const pair = findSelectedMatrixPair(next);\n if (!pair || !pair.english.matrixRows || !pair.arabic.matrixRows || pair.english.matrixRows.length >= 12) {\n return session;\n }\n const columnCount = Math.max(1, pair.english.matrixRows[0]?.length ?? 1);\n const englishRow = createMatrixRow(columnCount);\n const arabicRow = createMatrixRow(columnCount);\n for (let i = 0; i < columnCount; i += 1) {\n arabicRow[i].id = englishRow[i].id;\n }\n pair.english.matrixRows.push(englishRow);\n pair.arabic.matrixRows.push(arabicRow);\n normalizeArrayAlignments(pair.english);\n normalizeArrayAlignments(pair.arabic);\n appendDebug(next, 'addMatrixRow', pair.english.id);\n return next;\n}\n\nexport function removeMatrixRow(session: EditorSession): EditorSession {\n const next = cloneEditorSession(session);\n const pair = findSelectedMatrixPair(next);\n if (!pair || !pair.english.matrixRows || !pair.arabic.matrixRows || pair.english.matrixRows.length <= 1) {\n return session;\n }\n pair.english.matrixRows.pop();\n pair.arabic.matrixRows.pop();\n normalizeArrayAlignments(pair.english);\n normalizeArrayAlignments(pair.arabic);\n appendDebug(next, 'removeMatrixRow', pair.english.id);\n return next;\n}\n\nexport function addMatrixColumn(session: EditorSession): EditorSession {\n const next = cloneEditorSession(session);\n const pair = findSelectedMatrixPair(next);\n if (!pair || !pair.english.matrixRows || !pair.arabic.matrixRows) {\n return session;\n }\n const columnCount = pair.english.matrixRows[0]?.length ?? 0;\n if (columnCount >= 12) {\n return session;\n }\n for (let rowIndex = 0; rowIndex < pair.english.matrixRows.length; rowIndex += 1) {\n const englishCell = createEditorChain();\n const arabicCell = createEditorChain();\n arabicCell.id = englishCell.id;\n pair.english.matrixRows[rowIndex].push(englishCell);\n pair.arabic.matrixRows[rowIndex].push(arabicCell);\n }\n normalizeArrayAlignments(pair.english);\n normalizeArrayAlignments(pair.arabic);\n appendDebug(next, 'addMatrixColumn', pair.english.id);\n return next;\n}\n\nexport function removeMatrixColumn(session: EditorSession): EditorSession {\n const next = cloneEditorSession(session);\n const pair = findSelectedMatrixPair(next);\n if (!pair || !pair.english.matrixRows || !pair.arabic.matrixRows) {\n return session;\n }\n const columnCount = pair.english.matrixRows[0]?.length ?? 0;\n if (columnCount <= 1) {\n return session;\n }\n for (let rowIndex = 0; rowIndex < pair.english.matrixRows.length; rowIndex += 1) {\n pair.english.matrixRows[rowIndex].pop();\n pair.arabic.matrixRows[rowIndex].pop();\n }\n normalizeArrayAlignments(pair.english);\n normalizeArrayAlignments(pair.arabic);\n appendDebug(next, 'removeMatrixColumn', pair.english.id);\n return next;\n}\n\nfunction addScript(session: EditorSession, type: 'superscript' | 'subscript'): EditorSession {\n const targetNodeId = session.selectedNodeId;\n if (!targetNodeId) {\n return session;\n }\n const next = cloneEditorSession(session);\n const englishLocated = findNodeById(next.englishTree, targetNodeId);\n const arabicLocated = findNodeById(next.arabicTree, targetNodeId);\n if (!englishLocated || !arabicLocated) {\n return session;\n }\n const englishNode = englishLocated.node;\n const arabicNode = arabicLocated.node;\n if (!englishNode[type]) {\n englishNode[type] = createEditorChain();\n }\n if (!arabicNode[type]) {\n arabicNode[type] = createEditorChain();\n }\n if (englishNode[type] && arabicNode[type]) {\n arabicNode[type].id = englishNode[type].id;\n next.caret = {\n chainId: englishNode[type].id,\n index: englishNode[type].nodes.length,\n };\n }\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, `add${type === 'superscript' ? 'Sup' : 'Sub'}`, targetNodeId);\n return next;\n}\n\nfunction removeScript(session: EditorSession, type: 'superscript' | 'subscript'): EditorSession {\n const targetNodeId = session.selectedNodeId;\n if (!targetNodeId) {\n return session;\n }\n const next = cloneEditorSession(session);\n const englishLocated = findNodeById(next.englishTree, targetNodeId);\n const arabicLocated = findNodeById(next.arabicTree, targetNodeId);\n if (!englishLocated || !arabicLocated) {\n return session;\n }\n englishLocated.node[type] = null;\n arabicLocated.node[type] = null;\n next.caret = {\n chainId: englishLocated.chain.id,\n index: englishLocated.index + 1,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, `remove${type === 'superscript' ? 'Sup' : 'Sub'}`, targetNodeId);\n return next;\n}\n\nexport function addSup(session: EditorSession): EditorSession {\n return addScript(session, 'superscript');\n}\n\nexport function addSub(session: EditorSession): EditorSession {\n return addScript(session, 'subscript');\n}\n\nexport function removeSup(session: EditorSession): EditorSession {\n return removeScript(session, 'superscript');\n}\n\nexport function removeSub(session: EditorSession): EditorSession {\n return removeScript(session, 'subscript');\n}\n\nexport function selectNode(session: EditorSession, nodeId: string | null): EditorSession {\n const next = cloneEditorSession(session);\n next.selectedNodeId = nodeId;\n next.selectedStructureNodeId = null;\n return next;\n}\n\nexport function deleteStructure(session: EditorSession): EditorSession {\n const targetNodeId = session.selectedStructureNodeId ?? session.selectedNodeId;\n if (!targetNodeId) {\n return session;\n }\n const next = cloneEditorSession(session);\n const activeKey = activeTreeKey(next.activeSide);\n const located = findNodeById(next[activeKey], targetNodeId);\n if (!located) {\n return session;\n }\n const removed = removeMirroredNodeById(next, targetNodeId);\n if (!removed) {\n return session;\n }\n next.caret = {\n chainId: located.chain.id,\n index: located.index,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'deleteStructure', targetNodeId);\n return next;\n}\n\nexport function deleteBackward(session: EditorSession): EditorSession {\n if (isSelectionActive(session.selection)) {\n const next = cloneEditorSession(session);\n applyDeleteSelectionRange(next);\n syncSelectionToCaret(next);\n appendDebug(next, 'deleteBackward', 'deleted range');\n return next;\n }\n const next = cloneEditorSession(session);\n const activeKey = activeTreeKey(next.activeSide);\n const located = findChainById(next[activeKey], next.caret.chainId);\n if (!located) {\n return session;\n }\n if (next.caret.index <= 0) {\n return session;\n }\n const previousNode = located.chain.nodes[next.caret.index - 1];\n if (!previousNode) {\n return session;\n }\n if (\n (previousNode.kind === 'delimiter' || previousNode.kind === 'frac' || previousNode.kind === 'sqrt' || previousNode.kind === 'env') &&\n next.selectedStructureNodeId !== previousNode.id\n ) {\n next.selectedStructureNodeId = previousNode.id;\n next.selectedNodeId = previousNode.id;\n appendDebug(next, 'deleteBackward', 'selected structure');\n return next;\n }\n if (\n !next.splitLeafTyping &&\n (previousNode.kind === 'char' || previousNode.kind === 'number') &&\n previousNode.expr.length > 1\n ) {\n const id = previousNode.id;\n const englishHit = findNodeById(next.englishTree, id);\n const arabicHit = findNodeById(next.arabicTree, id);\n if (englishHit && arabicHit) {\n if (previousNode.kind === 'number' && shouldReverseArabicNumber(next)) {\n englishHit.node.expr = englishHit.node.expr.slice(1);\n arabicHit.node.expr = arabicHit.node.expr.slice(1);\n } else {\n englishHit.node.expr = englishHit.node.expr.slice(0, -1);\n arabicHit.node.expr = arabicHit.node.expr.slice(0, -1);\n }\n markExprSync(next, id);\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'deleteBackward', 'trimmed leaf');\n return next;\n }\n }\n const removed = removeMirroredNodeById(next, previousNode.id);\n if (!removed) {\n return session;\n }\n next.caret.index = Math.max(0, next.caret.index - 1);\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'deleteBackward', 'removed node');\n return next;\n}\n\nexport function deleteForward(session: EditorSession): EditorSession {\n if (isSelectionActive(session.selection)) {\n const next = cloneEditorSession(session);\n applyDeleteSelectionRange(next);\n syncSelectionToCaret(next);\n appendDebug(next, 'deleteForward', 'deleted range');\n return next;\n }\n const next = cloneEditorSession(session);\n const activeKey = activeTreeKey(next.activeSide);\n const located = findChainById(next[activeKey], next.caret.chainId);\n if (!located) {\n return session;\n }\n if (next.caret.index >= located.chain.nodes.length) {\n return session;\n }\n const node = located.chain.nodes[next.caret.index];\n if (!node) {\n return session;\n }\n if (!next.splitLeafTyping && (node.kind === 'char' || node.kind === 'number') && node.expr.length > 1) {\n const englishHit = findNodeById(next.englishTree, node.id);\n const arabicHit = findNodeById(next.arabicTree, node.id);\n if (englishHit && arabicHit) {\n if (node.kind === 'number' && shouldReverseArabicNumber(next)) {\n englishHit.node.expr = englishHit.node.expr.slice(0, -1);\n arabicHit.node.expr = arabicHit.node.expr.slice(0, -1);\n } else {\n englishHit.node.expr = englishHit.node.expr.slice(1);\n arabicHit.node.expr = arabicHit.node.expr.slice(1);\n }\n markExprSync(next, node.id);\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'deleteForward', 'trimmed leaf');\n return next;\n }\n }\n const removed = removeMirroredNodeById(next, node.id);\n if (!removed) {\n return session;\n }\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'deleteForward', 'removed node');\n return next;\n}\n\nexport function setExpr(session: EditorSession, nodeId: string, expr: string): EditorSession {\n const next = cloneEditorSession(session);\n const activeKey = activeTreeKey(next.activeSide);\n const passiveKey = passiveTreeKey(next.activeSide);\n const activeNode = findNodeById(next[activeKey], nodeId);\n const passiveNode = findNodeById(next[passiveKey], nodeId);\n if (!activeNode || !passiveNode) {\n return session;\n }\n activeNode.node.expr = expr;\n markExprSync(next, nodeId);\n appendDebug(next, 'setExpr', nodeId);\n return next;\n}\n\nexport function createStarterSession(): EditorSession {\n const englishRoot = createEditorChain([createEditorNode('char', 'x')]);\n const arabicRoot = createEditorChain([createEditorNode('char', 'س')]);\n arabicRoot.id = englishRoot.id;\n arabicRoot.nodes[0].id = englishRoot.nodes[0].id;\n const session: EditorSession = {\n englishTree: englishRoot,\n arabicTree: arabicRoot,\n activeSide: 'arabic',\n splitLeafTyping: false,\n forceSplitNextLeaf: false,\n arabicReverseNumberTyping: true,\n currentCharacterFont: 'default',\n currentDigitForm: 'western',\n caret: {\n chainId: englishRoot.id,\n index: 1,\n },\n selection: null,\n selectedNodeId: englishRoot.nodes[0].id,\n selectedStructureNodeId: null,\n sync: {\n [englishRoot.nodes[0].id]: { expr: 'diverged' },\n },\n debugLog: [],\n };\n appendDebug(session, 'createStarterSession', 'initialized');\n return session;\n}\n\nexport function syncStateSummary(session: EditorSession): string {\n const diverged = Object.values(session.sync).filter((entry) => entry.expr === 'diverged').length;\n if (diverged === 0) {\n return 'متزامن';\n }\n return `يوجد ${String(diverged)} عناصر مختلفة`;\n}\n\nexport function setRenderError(session: EditorSession, message: string | null): EditorSession {\n const next = cloneEditorSession(session);\n if (next.debugLog.length === 0) {\n appendDebug(next, 'render', 'init');\n }\n const last = next.debugLog[next.debugLog.length - 1];\n next.debugLog[next.debugLog.length - 1] = {\n ...last,\n renderOk: message === null,\n renderError: message,\n };\n return next;\n}\n\nexport function activeSideLabel(side: EditorSide): string {\n return side === 'arabic' ? 'العربية' : 'الإنجليزية';\n}\n\nconst PASTE_OPERATORS = new Set(['+', '-', '*', '/', '=', '<', '>', '.']);\n\n/** Read-only: build a fragment from the active selection (or null when collapsed). */\nexport function copySelection(session: EditorSession): EditorFragment | null {\n return serializeSelection(session);\n}\n\n/** Cut: removes the selection and returns both the cleaned session and the fragment. */\nexport function cutSelection(\n session: EditorSession,\n): { session: EditorSession; fragment: EditorFragment | null } {\n const fragment = serializeSelection(session);\n if (!fragment) {\n return { session, fragment: null };\n }\n const next = cloneEditorSession(session);\n applyDeleteSelectionRange(next);\n syncSelectionToCaret(next);\n appendDebug(next, 'cutSelection', `count=${String(fragment.english.length)}`);\n return { session: next, fragment };\n}\n\n/**\n * Insert a structured fragment at the caret in the active chain. The fragment\n * is re-id'd so it can't collide with the live tree, mirrored EN/AR ids are\n * preserved, and sync entries are populated for every nested node.\n */\nexport function pasteFragment(session: EditorSession, fragment: EditorFragment): EditorSession {\n if (!fragment || !fragment.english.length || !fragment.arabic.length) {\n return session;\n }\n const next = cloneEditorSession(session);\n applyDeleteSelectionRange(next);\n\n const fresh = regenerateFragmentIds(fragment);\n const limit = Math.min(fresh.english.length, fresh.arabic.length);\n for (let i = 0; i < limit; i += 1) {\n const eng = fresh.english[i];\n const ar = fresh.arabic[i];\n insertMirroredNode(next, next.caret.chainId, next.caret.index, eng, ar);\n syncSubtreeRecursive(next, eng, ar);\n next.caret = { chainId: next.caret.chainId, index: next.caret.index + 1 };\n }\n next.selection = null;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'pasteFragment', `count=${String(limit)}`);\n return next;\n}\n\n/**\n * Plain-text fallback paste. Each character is dispatched through the existing\n * typing path so split/merge mode and selection-replace behave the same as\n * keyboard input. Whitespace is silently skipped in this MVP.\n */\nexport function pasteText(session: EditorSession, text: string): EditorSession {\n if (!text) {\n return session;\n }\n let s = session;\n let i = 0;\n while (i < text.length) {\n const ch = text[i]!;\n if (ch === '\\n' || ch === '\\r' || ch === '\\t' || ch === ' ') {\n if (!s.splitLeafTyping) {\n s = breakLeafTyping(s);\n }\n i += 1;\n continue;\n }\n if (/^[0-9]$/.test(ch)) {\n let j = i + 1;\n let sawDot = false;\n while (j < text.length) {\n const c = text[j]!;\n if (/^[0-9]$/.test(c)) {\n j += 1;\n continue;\n }\n if (c === '.' && !sawDot && j + 1 < text.length && /^[0-9]$/.test(text[j + 1]!)) {\n sawDot = true;\n j += 1;\n continue;\n }\n break;\n }\n s = insertNumber(s, text.slice(i, j));\n i = j;\n continue;\n }\n if (PASTE_OPERATORS.has(ch)) {\n s = insertOperator(s, ch);\n i += 1;\n continue;\n }\n s = insertChar(s, ch);\n i += 1;\n }\n return s;\n}\n","import type { EditorNode } from '../types.js';\nimport type { DigitFormId } from '../types.js';\nimport { formatDigits } from '../digits.js';\n\nexport function buildBaseNodeBody(node: EditorNode, digitForm: DigitFormId = 'western'): HTMLElement {\n const value = document.createElement('span');\n value.className = 'node-value';\n if (node.kind === 'char' && node.characterFont === 'takween') {\n value.classList.add('node-value--takween');\n } else if (node.kind === 'char' && node.characterFont === 'diwani') {\n value.classList.add('node-value--diwani');\n } else if (node.kind === 'char' && node.characterFont === 'diwaniOutline') {\n value.classList.add('node-value--diwani-outline');\n }\n value.textContent = node.expr === '' ? '□' : formatDigits(node.expr, digitForm);\n return value;\n}\n","import type { EditorChain, EditorNode } from '../types.js';\n\ntype BuildChain = (chain: EditorChain) => HTMLElement;\n\nexport const DELIMITER_CSS = `\n.delim-pair {\n display: inline-flex;\n align-items: stretch;\n min-height: 1.85em;\n}\n\n.delim-inner {\n display: inline-flex;\n align-items: center;\n}\n\n.delim {\n display: inline-flex;\n align-self: stretch;\n align-items: center;\n justify-content: center;\n color: var(--butex-delim-color, #475569);\n padding: 0 1px;\n min-height: 100%;\n}\n\n.delim-glyph {\n display: inline-flex;\n align-items: center;\n line-height: 1;\n font-size: clamp(20px, 1.08em + 0.8vh, 36px);\n transform: translateY(-20%) scaleY(var(--butex-delim-scale, 1));\n transform-origin: center;\n}\n`.trim();\n\nconst DELIMITER_BASE_HEIGHT_PX = 18;\nconst DELIMITER_MAX_SCALE = 4.8;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction applyDelimiterScale(pair: HTMLElement, inner: HTMLElement): void {\n const innerHeight = Math.max(inner.getBoundingClientRect().height, DELIMITER_BASE_HEIGHT_PX);\n const scale = clamp((innerHeight / DELIMITER_BASE_HEIGHT_PX) * 1.18, 1.18, DELIMITER_MAX_SCALE);\n pair.style.setProperty('--butex-delim-scale', scale.toFixed(3));\n}\n\nfunction visibleDelimiter(expr: string): string {\n return expr\n .replace('\\\\left', '')\n .replace('\\\\right', '')\n .replace('\\\\{', '{')\n .replace('\\\\}', '}');\n}\n\nexport function buildDelimiterNodeBody(node: EditorNode, buildChain: BuildChain): HTMLElement {\n const pair = document.createElement('span');\n pair.className = 'delim-pair';\n\n const left = document.createElement('span');\n left.className = 'delim delim--left';\n const leftGlyph = document.createElement('span');\n leftGlyph.className = 'delim-glyph';\n leftGlyph.textContent = visibleDelimiter(node.leftDelimExpr);\n left.appendChild(leftGlyph);\n pair.appendChild(left);\n\n const inner = document.createElement('span');\n inner.className = 'delim-inner';\n if (node.innerExpr) {\n inner.appendChild(buildChain(node.innerExpr));\n }\n pair.appendChild(inner);\n\n const right = document.createElement('span');\n right.className = 'delim delim--right';\n const rightGlyph = document.createElement('span');\n rightGlyph.className = 'delim-glyph';\n rightGlyph.textContent = visibleDelimiter(node.rightDelimExpr);\n right.appendChild(rightGlyph);\n pair.appendChild(right);\n\n applyDelimiterScale(pair, inner);\n requestAnimationFrame(() => applyDelimiterScale(pair, inner));\n\n return pair;\n}\n","import type { EditorChain, EditorNode } from '../types.js';\n\ntype BuildChain = (chain: EditorChain) => HTMLElement;\n\nexport const FRAC_CSS = `\n.frac {\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n justify-content: center;\n vertical-align: middle;\n margin: 0 3px;\n min-width: 1.5em;\n}\n\n.frac-num,\n.frac-den {\n display: inline-flex;\n justify-content: center;\n align-items: center;\n min-height: 1.1em;\n padding: 0 4px;\n}\n\n.frac-bar {\n align-self: stretch;\n height: 1px;\n background: var(--butex-frac-bar, currentColor);\n opacity: 0.88;\n}\n`.trim();\n\nexport function buildFracNodeBody(node: EditorNode, buildChain: BuildChain): HTMLElement {\n const wrap = document.createElement('span');\n wrap.className = 'frac';\n\n const num = document.createElement('span');\n num.className = 'frac-num';\n if (node.numerator) {\n num.appendChild(buildChain(node.numerator));\n }\n\n const bar = document.createElement('span');\n bar.className = 'frac-bar';\n bar.setAttribute('aria-hidden', 'true');\n\n const den = document.createElement('span');\n den.className = 'frac-den';\n if (node.denominator) {\n den.appendChild(buildChain(node.denominator));\n }\n\n wrap.appendChild(num);\n wrap.appendChild(bar);\n wrap.appendChild(den);\n\n return wrap;\n}\n","import type { EditorChain, EditorNode, EditorSide } from '../types.js';\n\ntype BuildChain = (chain: EditorChain) => HTMLElement;\n\nexport const SQRT_CSS = `\n.sqrt {\n display: inline-flex;\n align-items: stretch;\n position: relative;\n vertical-align: middle;\n margin: 0 2px;\n min-height: 2.1em;\n direction: ltr;\n --butex-sqrt-scale: 1;\n}\n\n.sqrt.sqrt--english .sqrt-root {\n order: 1;\n}\n\n.sqrt.sqrt--english .sqrt-sign {\n order: 2;\n}\n\n.sqrt.sqrt--english .sqrt-radicand {\n order: 3;\n}\n\n.sqrt.sqrt--arabic .sqrt-radicand {\n order: 1;\n}\n\n.sqrt.sqrt--arabic .sqrt-sign {\n order: 2;\n}\n\n.sqrt.sqrt--arabic .sqrt-root {\n order: 3;\n}\n\n.sqrt.sqrt--arabic .sqrt-root,\n.sqrt.sqrt--arabic .sqrt-radicand {\n direction: rtl;\n}\n\n.sqrt-root {\n align-self: flex-start;\n min-width: 0.9em;\n min-height: 1em;\n margin-inline-end: -0.18em;\n transform: translate(0.16em, 0.02em);\n font-size: 0.64em;\n line-height: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: relative;\n z-index: 1;\n}\n\n.sqrt.sqrt--arabic .sqrt-root {\n margin-inline-start: -0.22em;\n margin-inline-end: 0;\n transform: translate(-0.16em, 0.02em);\n}\n\n.sqrt-root .chain {\n min-height: auto;\n}\n\n.sqrt-sign {\n display: inline-flex;\n align-items: flex-end;\n justify-content: center;\n align-self: stretch;\n line-height: 0.78;\n font-size: 2em;\n color: var(--butex-sqrt-color, currentColor);\n transform: scaleY(var(--butex-sqrt-scale));\n transform-origin: center bottom;\n margin-inline-end: -0.24em;\n min-height: 100%;\n position: relative;\n z-index: 1;\n}\n\n.sqrt.sqrt--arabic .sqrt-sign {\n transform: scaleX(-1) scaleY(var(--butex-sqrt-scale));\n margin-inline-start: -0.24em;\n margin-inline-end: 0;\n}\n\n.sqrt-radicand {\n display: inline-flex;\n align-items: center;\n min-width: 1.35em;\n min-height: 1.35em;\n padding: 0.06em 0.24em 0;\n border-top: 2px solid var(--butex-sqrt-bar, currentColor);\n transform: translateY(-0.08em);\n position: relative;\n}\n\n.sqrt-radicand .chain {\n min-height: auto;\n}\n`.trim();\n\nconst SQRT_BASE_HEIGHT_PX = 32;\nconst SQRT_MAX_SCALE = 3.8;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction applySqrtScale(wrap: HTMLElement, radicand: HTMLElement): void {\n const radicandHeight = Math.max(radicand.getBoundingClientRect().height, SQRT_BASE_HEIGHT_PX);\n const scale = clamp(radicandHeight / SQRT_BASE_HEIGHT_PX, 1, SQRT_MAX_SCALE);\n wrap.style.setProperty('--butex-sqrt-scale', scale.toFixed(3));\n}\n\nexport function buildSqrtNodeBody(node: EditorNode, buildChain: BuildChain, side: EditorSide): HTMLElement {\n const wrap = document.createElement('span');\n wrap.className = `sqrt sqrt--${side}`;\n\n const root = document.createElement('span');\n root.className = 'sqrt-root';\n if (node.rootIndex) {\n root.appendChild(buildChain(node.rootIndex));\n }\n\n const sign = document.createElement('span');\n sign.className = 'sqrt-sign';\n sign.setAttribute('aria-hidden', 'true');\n sign.textContent = '\\u221a';\n\n const radicand = document.createElement('span');\n radicand.className = 'sqrt-radicand';\n if (node.radicand) {\n radicand.appendChild(buildChain(node.radicand));\n }\n\n wrap.appendChild(root);\n wrap.appendChild(sign);\n wrap.appendChild(radicand);\n\n applySqrtScale(wrap, radicand);\n requestAnimationFrame(() => applySqrtScale(wrap, radicand));\n\n return wrap;\n}\n","import type { EditorChain, EditorNode, EditorSide, MatrixEnvStyle } from '../types.js';\n\ntype BuildChain = (chain: EditorChain) => HTMLElement;\n\nconst WRAPPERS: Record<MatrixEnvStyle, { left: string; right: string }> = {\n matrix: { left: '', right: '' },\n pmatrix: { left: '(', right: ')' },\n bmatrix: { left: '[', right: ']' },\n Bmatrix: { left: '{', right: '}' },\n vmatrix: { left: '|', right: '|' },\n Vmatrix: { left: '||', right: '||' },\n};\n\nexport const MATRIX_ENV_CSS = `\n.matrix-env {\n display: inline-flex;\n align-items: stretch;\n vertical-align: middle;\n margin: 0 3px;\n --butex-matrix-delim-scale: 1.25;\n}\n\n.matrix-env__wrapper {\n display: inline-flex;\n align-self: stretch;\n align-items: center;\n justify-content: center;\n min-width: 0.42em;\n padding: 0 2px;\n color: var(--butex-delim-color, currentColor);\n font-family: ui-serif, \"Cambria Math\", \"Times New Roman\", serif;\n font-size: clamp(22px, 1.35em + 0.8vh, 42px);\n line-height: 1;\n transform: scaleY(var(--butex-matrix-delim-scale));\n transform-origin: center;\n}\n\n.matrix-env__grid {\n display: inline-grid;\n direction: ltr;\n gap: 2px 5px;\n align-items: center;\n justify-items: center;\n padding: 2px 3px;\n}\n\n.matrix-env__cell {\n min-width: 1.35em;\n min-height: 1.45em;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 5px;\n border: 1px dashed rgba(148, 163, 184, 0.48);\n padding: 1px 3px;\n}\n\n.matrix-env__cell .chain {\n min-height: auto;\n}\n\n.matrix-env--arabic .matrix-env__cell {\n direction: rtl;\n}\n\n.matrix-env--english .matrix-env__cell {\n direction: ltr;\n}\n`.trim();\n\nconst MATRIX_DELIMITER_BASE_HEIGHT_PX = 20;\nconst MATRIX_DELIMITER_MAX_SCALE = 5.2;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction applyMatrixDelimiterScale(wrap: HTMLElement, grid: HTMLElement): void {\n const gridHeight = Math.max(grid.getBoundingClientRect().height, MATRIX_DELIMITER_BASE_HEIGHT_PX);\n const scale = clamp((gridHeight / MATRIX_DELIMITER_BASE_HEIGHT_PX) * 1.22, 1.25, MATRIX_DELIMITER_MAX_SCALE);\n wrap.style.setProperty('--butex-matrix-delim-scale', scale.toFixed(3));\n}\n\nexport function buildMatrixEnvNodeBody(node: EditorNode, buildChain: BuildChain, side: EditorSide): HTMLElement {\n const wrap = document.createElement('span');\n wrap.className = `matrix-env matrix-env--${side}`;\n\n const style = node.envName ?? node.matrixStyle ?? 'matrix';\n const glyphs = style === 'array' || style === 'aligned' ? undefined : WRAPPERS[style];\n\n const left = document.createElement('span');\n left.className = 'matrix-env__wrapper matrix-env__wrapper--left';\n left.textContent = glyphs?.left ?? '';\n\n const grid = document.createElement('span');\n grid.className = 'matrix-env__grid';\n\n const rows = node.matrixRows ?? [];\n const columnCount = Math.max(1, ...rows.map((row) => row.length));\n grid.style.gridTemplateColumns = `repeat(${String(columnCount)}, minmax(1.35em, auto))`;\n\n const displayRows = side === 'arabic' ? rows.map((row) => row.slice().reverse()) : rows;\n for (const row of displayRows) {\n for (const cellChain of row) {\n const cell = document.createElement('span');\n cell.className = 'matrix-env__cell';\n cell.dir = side === 'arabic' ? 'rtl' : 'ltr';\n cell.appendChild(buildChain(cellChain));\n grid.appendChild(cell);\n }\n }\n\n const right = document.createElement('span');\n right.className = 'matrix-env__wrapper matrix-env__wrapper--right';\n right.textContent = glyphs?.right ?? '';\n\n wrap.appendChild(left);\n wrap.appendChild(grid);\n wrap.appendChild(right);\n\n applyMatrixDelimiterScale(wrap, grid);\n requestAnimationFrame(() => applyMatrixDelimiterScale(wrap, grid));\n\n return wrap;\n}\n","import diwaniLetterUrl from './fonts/Diwani Letter Regular.ttf';\nimport diwaniOutlineUrl from './fonts/DWNOUTSH.TTF';\nimport takweenUrl from './fonts/Takween.otf';\n\n\nexport const BUTEX_DIWANI_FONT_FAMILY = 'Diwani Letter';\nexport const BUTEX_DIWANI_OUTLINE_FONT_FAMILY = 'BuTeX Diwani Outline';\nexport const BUTEX_TAKWEEN_FONT_FAMILY = 'BuTeX Takween';\n\nexport const BUTEX_DIWANI_FONT_STACK = `\"${BUTEX_DIWANI_FONT_FAMILY}\", Amiri, \"Segoe UI\", Tahoma, sans-serif`;\nexport const BUTEX_DIWANI_OUTLINE_FONT_STACK = `\"${BUTEX_DIWANI_OUTLINE_FONT_FAMILY}\", \"${BUTEX_DIWANI_FONT_FAMILY}\", Amiri, \"Segoe UI\", Tahoma, sans-serif`;\nexport const BUTEX_TAKWEEN_FONT_STACK = `\"${BUTEX_TAKWEEN_FONT_FAMILY}\", Amiri, \"Segoe UI\", Tahoma, sans-serif`;\n\nexport const BUTEX_DIWANI_FONT_FACE_CSS = `\n@font-face {\n font-family: \"${BUTEX_DIWANI_FONT_FAMILY}\";\n src: url(\"${diwaniLetterUrl}\") format(\"truetype\");\n font-weight: 400;\n font-style: normal;\n font-display: swap;\n}\n`.trim();\n\nexport const BUTEX_TAKWEEN_FONT_FACE_CSS = `\n@font-face {\n font-family: \"${BUTEX_TAKWEEN_FONT_FAMILY}\";\n src: url(\"${takweenUrl}\") format(\"opentype\");\n font-weight: 400;\n font-style: normal;\n font-display: swap;\n}\n`.trim();\n\nexport const BUTEX_DIWANI_OUTLINE_FONT_FACE_CSS = `\n@font-face {\n font-family: \"${BUTEX_DIWANI_OUTLINE_FONT_FAMILY}\";\n src: url(\"${diwaniOutlineUrl}\") format(\"truetype\");\n font-weight: 400;\n font-style: normal;\n font-display: swap;\n}\n`.trim();\n\nexport const BUTEX_FONT_FACE_CSS = `\n${BUTEX_DIWANI_FONT_FACE_CSS}\n\n${BUTEX_DIWANI_OUTLINE_FONT_FACE_CSS}\n\n${BUTEX_TAKWEEN_FONT_FACE_CSS}\n`.trim();\n","import { atomicCommandSpec, isSpacingCommandSpec, type AtomicCommandSpec, type SpacingCommandSpec } from '../atomicCommands.js';\nimport { BUTEX_DIWANI_FONT_STACK, BUTEX_DIWANI_OUTLINE_FONT_STACK } from '../../diwani-font.js';\nimport type { EditorNode, EditorSide } from '../types.js';\n\nexport const ATOMIC_COMMAND_CSS = `\n/* Shared atomic-command display */\n.atomic-command {\n display: inline-flex;\n align-items: center;\n font-weight: 600;\n line-height: 1;\n}\n\n/* Function-style commands: sin/cos/tan families. */\n.atomic-command--arabic {\n font-family: ${BUTEX_DIWANI_FONT_STACK};\n font-size: 1.15em;\n direction: rtl;\n}\n\n.atomic-command--diwani-outline {\n font-family: ${BUTEX_DIWANI_OUTLINE_FONT_STACK};\n}\n\n.atomic-command--english {\n font-family: \"Cambria Math\", \"Times New Roman\", serif;\n font-size: 0.96em;\n}\n\n.atomic-command-label-with-sub {\n position: relative;\n display: inline-block;\n padding-inline-end: 0.45em;\n padding-block-end: 0.22em;\n line-height: 1;\n}\n\n.atomic-command-label-with-sub__sub {\n position: absolute;\n inset-inline-end: 0;\n inset-block-end: 0;\n font-size: 0.62em;\n line-height: 1;\n}\n\n/* Spacing commands: tiny selectable marker, real spacing remains in LaTeX preview. */\n.atomic-spacing {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 3px;\n min-width: 3px;\n height: 1em;\n color: var(--butex-accent, currentColor);\n opacity: 0.62;\n}\n\n.atomic-spacing__marker {\n display: inline-block;\n width: 3px;\n height: 0.85em;\n border-radius: 999px;\n background: currentColor;\n}\n\n.atomic-spacing--negative {\n color: var(--butex-danger, #dc2626);\n}\n`.trim();\n\nfunction spacingArrowForSide(spec: SpacingCommandSpec, side: EditorSide): string {\n const pointsWithFlow = spec.spacing.direction === 'positive';\n if (pointsWithFlow) {\n return side === 'arabic' ? '\\u2190' : '\\u2192';\n }\n return side === 'arabic' ? '\\u2192' : '\\u2190';\n}\n\nexport function spacingTooltipForSide(spec: SpacingCommandSpec, side: EditorSide): string {\n return `${spec.title} ${spacingArrowForSide(spec, side).repeat(spec.spacing.level)}`;\n}\n\nfunction buildFunctionAtomicCommandBody(node: EditorNode, side: EditorSide, spec: AtomicCommandSpec | null): HTMLElement {\n const value = document.createElement('span');\n value.className = `atomic-command atomic-command--${side}`;\n if (side === 'arabic' && spec?.category === 'groups') {\n value.classList.add('atomic-command--diwani-outline');\n }\n if (side === 'arabic' && node.expr === 'ln') {\n const label = document.createElement('span');\n label.className = 'atomic-command-label-with-sub';\n const base = document.createElement('span');\n base.className = 'atomic-command-label-with-sub__base';\n base.textContent = spec?.arabicLabel ?? node.expr;\n const sub = document.createElement('span');\n sub.className = 'atomic-command-label-with-sub__sub';\n sub.textContent = 'هـ';\n label.append(base, sub);\n value.appendChild(label);\n return value;\n }\n value.textContent = side === 'arabic' ? spec?.arabicLabel ?? node.expr : spec?.englishTex.replace('\\\\', '') ?? node.expr;\n return value;\n}\n\nfunction buildSpacingAtomicCommandBody(spec: SpacingCommandSpec, side: EditorSide): HTMLElement {\n const value = document.createElement('span');\n value.className = `atomic-spacing atomic-spacing--${spec.spacing.direction} atomic-spacing--level-${String(spec.spacing.level)}`;\n value.title = spacingTooltipForSide(spec, side);\n const marker = document.createElement('span');\n marker.className = 'atomic-spacing__marker';\n value.appendChild(marker);\n return value;\n}\n\nexport function buildAtomicCommandNodeBody(node: EditorNode, side: EditorSide): HTMLElement {\n const spec = atomicCommandSpec(node.expr);\n if (isSpacingCommandSpec(spec)) {\n return buildSpacingAtomicCommandBody(spec, side);\n }\n return buildFunctionAtomicCommandBody(node, side, spec);\n}\n","import { atomicOperatorCommandSpec, shouldMirrorOperatorDisplay, type AtomicOperatorCommandSpec } from '../atomicCommandsOperators.js';\nimport type { EditorNode, EditorSide } from '../types.js';\n\nexport const ATOMIC_OPERATOR_COMMAND_CSS = `\n.atomic-operator-command {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 0.9em;\n font-family: \"Cambria Math\", \"Times New Roman\", serif;\n font-size: 1.05em;\n font-weight: 600;\n line-height: 1;\n}\n\n.atomic-operator-command--mirrored {\n transform: scaleX(-1);\n}\n\n.atomic-operator-command__svg {\n width: 1em;\n height: 1em;\n background: currentColor;\n}\n`.trim();\n\nfunction buildOperatorLabel(spec: AtomicOperatorCommandSpec): HTMLElement {\n const value = document.createElement('span');\n value.className = 'atomic-operator-command__label';\n value.textContent = spec.Label;\n return value;\n}\n\nexport function buildAtomicOperatorCommandNodeBody(node: EditorNode, side: EditorSide): HTMLElement {\n const spec = atomicOperatorCommandSpec(node.expr);\n const value = document.createElement('span');\n value.className = 'atomic-operator-command';\n value.title = spec?.title ?? node.expr;\n if (side === 'arabic' && shouldMirrorOperatorDisplay(spec)) {\n value.classList.add('atomic-operator-command--mirrored');\n }\n\n if (spec?.svg_path) {\n const icon = document.createElement('span');\n icon.className = 'atomic-operator-command__svg';\n icon.style.mask = `url(\"${spec.svg_path}\") center / contain no-repeat`;\n icon.style.webkitMask = `url(\"${spec.svg_path}\") center / contain no-repeat`;\n value.appendChild(icon);\n return value;\n }\n\n if (spec) {\n value.appendChild(buildOperatorLabel(spec));\n } else {\n const label = document.createElement('span');\n label.className = 'atomic-operator-command__label';\n label.textContent = node.expr;\n value.appendChild(label);\n }\n return value;\n}\n","import type { EditorChain, EditorNode } from '../types.js';\n\ntype BuildChain = (chain: EditorChain) => HTMLElement;\n\nexport function buildNodeScripts(node: EditorNode, buildChain: BuildChain): HTMLElement | null {\n const hasScripts = Boolean(node.superscript) || Boolean(node.subscript);\n if (!hasScripts) {\n return null;\n }\n\n const scripts = document.createElement('span');\n scripts.className = 'scripts';\n if (node.superscript && node.subscript) {\n scripts.classList.add('scripts--both');\n } else if (node.superscript) {\n scripts.classList.add('scripts--sup-only');\n } else {\n scripts.classList.add('scripts--sub-only');\n }\n\n if (node.superscript) {\n const supBox = document.createElement('span');\n supBox.className = 'script-box script-box--sup';\n supBox.appendChild(buildChain(node.superscript));\n scripts.appendChild(supBox);\n }\n if (node.subscript) {\n const subBox = document.createElement('span');\n subBox.className = 'script-box script-box--sub';\n subBox.appendChild(buildChain(node.subscript));\n scripts.appendChild(subBox);\n }\n\n return scripts;\n}\n","import { buildBaseNodeBody } from './base.js';\nimport { buildDelimiterNodeBody } from './delimiter.js';\nimport { buildFracNodeBody } from './frac.js';\nimport { buildSqrtNodeBody } from './sqrt.js';\nimport { buildMatrixEnvNodeBody } from './env.js';\nimport { buildAtomicCommandNodeBody } from './atomicCommand.js';\nimport { buildAtomicOperatorCommandNodeBody } from './atomicCommandsOperators.js';\nimport { buildNodeScripts } from './scripts.js';\nimport type { DigitFormId, EditorChain, EditorNode, EditorSide } from '../types.js';\n\ntype BuildChain = (chain: EditorChain) => HTMLElement;\n\nexport function buildNodeBody(node: EditorNode, buildChain: BuildChain, side: EditorSide, digitForm: DigitFormId = 'western'): HTMLElement {\n if (node.kind === 'delimiter') {\n return buildDelimiterNodeBody(node, buildChain);\n }\n if (node.kind === 'frac') {\n return buildFracNodeBody(node, buildChain);\n }\n if (node.kind === 'sqrt') {\n return buildSqrtNodeBody(node, buildChain, side);\n }\n if (node.kind === 'env') {\n return buildMatrixEnvNodeBody(node, buildChain, side);\n }\n if (node.kind === 'atomicCommand') {\n return buildAtomicCommandNodeBody(node, side);\n }\n if (node.kind === 'atomicOperatorCommand') {\n return buildAtomicOperatorCommandNodeBody(node, side);\n }\n return buildBaseNodeBody(node, digitForm);\n}\n\nexport { buildNodeScripts };\nexport { DELIMITER_CSS } from './delimiter.js';\nexport { FRAC_CSS } from './frac.js';\nexport { SQRT_CSS } from './sqrt.js';\nexport { MATRIX_ENV_CSS } from './env.js';\nexport { ATOMIC_COMMAND_CSS } from './atomicCommand.js';\nexport { ATOMIC_OPERATOR_COMMAND_CSS } from './atomicCommandsOperators.js';\n","import { DELIMITER_CSS } from './display/delimiter.js';\nimport { FRAC_CSS } from './display/frac.js';\nimport { SQRT_CSS } from './display/sqrt.js';\nimport { MATRIX_ENV_CSS } from './display/env.js';\nimport { ATOMIC_COMMAND_CSS } from './display/atomicCommand.js';\nimport { ATOMIC_OPERATOR_COMMAND_CSS } from './display/atomicCommandsOperators.js';\nimport {\n BUTEX_DIWANI_FONT_STACK,\n BUTEX_DIWANI_OUTLINE_FONT_STACK,\n BUTEX_FONT_FACE_CSS,\n BUTEX_TAKWEEN_FONT_STACK,\n} from '../diwani-font.js';\n\nexport const BUTEX_EDITOR_CSS = `\n${BUTEX_FONT_FACE_CSS}\n\n.surface {\n border: 1px solid var(--butex-border, #e2e8f0);\n border-radius: 12px;\n min-height: 100px;\n padding: 8px 10px;\n background: var(--butex-surface-bg, linear-gradient(180deg, #ffffff 0%, #fafbfc 100%));\n color: var(--butex-surface-fg, #0f172a);\n outline: none;\n cursor: text;\n transition: box-shadow 0.15s ease, border-color 0.15s ease;\n}\n\n.surface:focus {\n border-color: var(--butex-focus-border, rgba(13, 148, 136, 0.45));\n box-shadow: 0 0 0 3px var(--butex-focus-shadow, rgba(13, 148, 136, 0.12));\n}\n\n.surface.surface--arabic {\n direction: rtl;\n}\n\n.surface.surface--english {\n direction: ltr;\n}\n\n.node-value--takween {\n font-family: ${BUTEX_TAKWEEN_FONT_STACK};\n}\n\n.node-value--diwani {\n font-family: ${BUTEX_DIWANI_FONT_STACK};\n}\n\n.node-value--diwani-outline {\n font-family: ${BUTEX_DIWANI_OUTLINE_FONT_STACK};\n}\n\n.chain {\n display: inline-flex;\n align-items: center;\n gap: 0;\n min-height: 28px;\n flex-wrap: wrap;\n row-gap: 2px;\n}\n\n.slot {\n width: 5px;\n min-height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n border-radius: 3px;\n}\n\n.slot:hover {\n background: var(--butex-slot-hover, rgba(13, 148, 136, 0.08));\n}\n\n.slot.range-highlight {\n background: var(--butex-selection-bg, rgba(13, 148, 136, 0.34));\n width: 11px;\n min-height: 42px;\n border: 2px solid var(--butex-selection-border, rgba(15, 118, 110, 0.9));\n position: relative;\n z-index: 1;\n}\n\n.caret {\n display: inline-block;\n width: 2px;\n height: 20px;\n background: var(--butex-caret, #0f172a);\n border-radius: 1px;\n animation: butex-editor-blink 1s step-end infinite;\n}\n\n@keyframes butex-editor-blink {\n 50% { opacity: 0; }\n}\n\n.node {\n display: inline-flex;\n align-items: stretch;\n gap: 3px;\n border-radius: 8px;\n padding: 2px 4px;\n cursor: pointer;\n border: 1px solid transparent;\n user-select: none;\n}\n\n.node.node--atomic-spacing {\n padding-inline: 0;\n margin-inline: -2px;\n border-color: transparent;\n}\n\n.node:hover {\n border-color: var(--butex-border, #e2e8f0);\n background: var(--butex-node-hover, rgba(148, 163, 184, 0.08));\n}\n\n.node.selected {\n background: var(--butex-node-selected-bg, rgba(13, 148, 136, 0.14));\n border-color: var(--butex-node-selected-border, rgba(13, 148, 136, 0.45));\n}\n\n.node.range-highlight {\n background: var(--butex-selection-bg, rgba(13, 148, 136, 0.34));\n border-color: var(--butex-selection-border, rgba(15, 118, 110, 0.9));\n box-shadow: inset 0 0 0 3px var(--butex-selection-border, rgba(15, 118, 110, 0.9)),\n 0 0 0 1px var(--butex-selection-border, rgba(15, 118, 110, 0.9));\n position: relative;\n z-index: 2;\n}\n\n.chain .slot.range-highlight + .node.range-highlight,\n.chain .node.range-highlight + .slot.range-highlight {\n margin-inline: -1px;\n}\n\n.node-body {\n display: inline-flex;\n align-items: stretch;\n gap: 0;\n min-height: 1.6em;\n}\n\n.node-value {\n font-size: 16px;\n font-weight: 500;\n line-height: 1.25;\n display: inline-flex;\n align-items: center;\n}\n\n.scripts {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n justify-content: space-between;\n align-items: center;\n padding: 1px 0;\n min-width: 0.75em;\n}\n\n.scripts.scripts--sup-only {\n justify-content: flex-start;\n padding-bottom: 2px;\n}\n\n.scripts.scripts--sub-only {\n justify-content: flex-end;\n padding-top: 2px;\n}\n\n.script-box {\n min-height: 12px;\n min-width: 10px;\n border-radius: 4px;\n border: 1px dashed var(--butex-script-border, #cbd5e1);\n padding: 0 2px;\n font-size: 0.68em;\n line-height: 1.15;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: var(--butex-script-bg, rgba(248, 250, 252, 0.95));\n color: var(--butex-script-color, #475569);\n}\n\n.script-box .chain {\n min-height: auto;\n}\n\n${DELIMITER_CSS}\n\n${FRAC_CSS}\n\n${SQRT_CSS}\n\n${MATRIX_ENV_CSS}\n\n${ATOMIC_COMMAND_CSS}\n\n${ATOMIC_OPERATOR_COMMAND_CSS}\n`.trim();\n\n/**\n * Injects BuTeX editor surface styles into `document.head` if not already present.\n * Browser-only; no-op if `document` is undefined (Node).\n */\nexport function injectBuTeXEditorStyles(doc?: Document): void {\n const d = doc ?? (typeof document !== 'undefined' ? document : undefined);\n if (!d) {\n return;\n }\n const id = 'butex-editor-styles';\n const existing = d.getElementById(id);\n if (existing) {\n existing.textContent = BUTEX_EDITOR_CSS;\n return;\n }\n const style = d.createElement('style');\n style.id = id;\n style.textContent = BUTEX_EDITOR_CSS;\n d.head.appendChild(style);\n}\n","import { buildNodeBody, buildNodeScripts } from './display/index.js';\nimport { spacingTooltipForSide } from './display/atomicCommand.js';\nimport { BUTEX_FRAGMENT_MIME, deserializeFragment, fragmentToPlainText } from './clipboard.js';\nimport { activeTreeKey } from './traversal.js';\nimport { createUndoRedoStacks, pushUndoRedoSnapshot, restoreRedo, restoreUndo, undoRedoCanRedo, undoRedoCanUndo } from './history.js';\nimport {\n activeSideLabel,\n addSub,\n addSup,\n breakLeafTyping,\n copySelection,\n createStarterSession,\n cutSelection,\n deleteBackward,\n deleteForward,\n deleteStructure,\n insertAlignedEnv,\n insertArrayEnv,\n insertChar,\n insertDelimiterPair,\n insertFraction,\n insertMatrixEnv,\n insertSqrt,\n insertAtomicCommand,\n insertAtomicOperatorCommand,\n insertNumber,\n insertOperator,\n horizontalCaretDelta,\n moveCaretHorizontal,\n moveCaretVertical,\n pasteFragment,\n pasteText,\n removeSub,\n removeSup,\n addMatrixColumn,\n addMatrixRow,\n removeMatrixColumn,\n removeMatrixRow,\n selectNode,\n setArrayColumnAlignment,\n setCaret,\n setMatrixEnvStyle,\n setSplitLeafTyping,\n setArabicReverseNumberTyping,\n setCurrentCharacterFont,\n setCurrentDigitForm,\n toggleTakweenCharacterFont,\n switchSide,\n syncStateSummary,\n} from './state.js';\nimport { clearSelection, extendSelectionByStep, setSelectionFromMouse } from './selection.js';\nimport type { CharacterFontId, DigitFormId, EditorChain, EditorNode, EditorSession, EnvColumnAlignment, MatrixEnvStyle } from './types.js';\nimport { atomicCommandSpec, isSpacingCommandSpec, type AtomicCommandId } from './atomicCommands.js';\nimport type { AtomicOperatorCommandId } from './atomicCommandsOperators.js';\n\ntype SessionUpdater = (session: EditorSession) => EditorSession;\n\ntype RuntimeButtonElements = {\n undoBtn?: HTMLButtonElement | null;\n redoBtn?: HTMLButtonElement | null;\n copyBtn?: HTMLButtonElement | null;\n cutBtn?: HTMLButtonElement | null;\n splitTypingBtn?: HTMLButtonElement | null;\n characterFontBtn?: HTMLButtonElement | null;\n digitFormBtn?: HTMLButtonElement | null;\n};\n\nexport type EditorRuntimeOptions = {\n surfaceEl: HTMLElement;\n initialSession?: EditorSession;\n buttonElements?: RuntimeButtonElements;\n outsidePointerIgnoreSelectors?: string[];\n onSessionChange?: (session: EditorSession) => void;\n};\n\nexport type EditorRuntimeApi = {\n render: () => void;\n destroy: () => void;\n getSession: () => EditorSession;\n setSession: (next: EditorSession) => void;\n performUndo: () => void;\n performRedo: () => void;\n performCopy: () => Promise<void>;\n performCut: () => Promise<void>;\n performPaste: () => Promise<void>;\n toggleSide: () => void;\n toggleSplitLeafTyping: () => void;\n toggleArabicReverseNumberTyping: () => void;\n toggleTakweenCharacterFont: () => void;\n setCurrentCharacterFont: (fontId: CharacterFontId) => void;\n setCurrentDigitForm: (digitForm: DigitFormId) => void;\n insertDelimiterByKind: (kind: 'paren' | 'bracket' | 'brace') => void;\n insertFraction: () => void;\n insertMatrixEnv: (style: MatrixEnvStyle, rows: number, columns: number) => void;\n insertArrayEnv: (rows: number, columns: number) => void;\n insertAlignedEnv: (rows: number, columns: number) => void;\n insertSqrt: () => void;\n insertAtomicCommand: (commandId: AtomicCommandId) => void;\n insertAtomicOperatorCommand: (commandId: AtomicOperatorCommandId) => void;\n addSup: () => void;\n addSub: () => void;\n removeSup: () => void;\n removeSub: () => void;\n setMatrixEnvStyle: (style: MatrixEnvStyle) => void;\n setArrayColumnAlignment: (columnIndex: number, alignment: EnvColumnAlignment) => void;\n addMatrixRow: () => void;\n removeMatrixRow: () => void;\n addMatrixColumn: () => void;\n removeMatrixColumn: () => void;\n deleteStructure: () => void;\n};\n\nexport function createEditorRuntime(options: EditorRuntimeOptions): EditorRuntimeApi {\n const { surfaceEl } = options;\n const buttonElements = options.buttonElements ?? {};\n const outsidePointerIgnoreSelectors = options.outsidePointerIgnoreSelectors ?? [];\n let session = options.initialSession ?? createStarterSession();\n const undoRedo = createUndoRedoStacks();\n let lastInternalFragment: unknown = null;\n let initialKeyboardFocusPending = true;\n let dragSelecting = false;\n let dragChainId: string | null = null;\n let dragChanged = false;\n\n function notifySessionChange(): void {\n options.onSessionChange?.(session);\n }\n\n function isOperator(char: string): boolean {\n return ['+', '-', '*', '/', '=', '<', '>', '.'].includes(char);\n }\n\n function isSlotInSelection(chainId: string, index: number): boolean {\n const sel = session.selection;\n if (!sel || sel.chainId !== chainId || sel.anchorIndex === sel.focusIndex) {\n return false;\n }\n const start = Math.min(sel.anchorIndex, sel.focusIndex);\n const end = Math.max(sel.anchorIndex, sel.focusIndex);\n return index >= start && index <= end;\n }\n\n function isNodeInSelection(chainId: string, index: number): boolean {\n const sel = session.selection;\n if (!sel || sel.chainId !== chainId || sel.anchorIndex === sel.focusIndex) {\n return false;\n }\n const start = Math.min(sel.anchorIndex, sel.focusIndex);\n const end = Math.max(sel.anchorIndex, sel.focusIndex);\n return index >= start && index < end;\n }\n\n function refreshUndoRedoButtons(): void {\n if (buttonElements.undoBtn) {\n buttonElements.undoBtn.disabled = !undoRedoCanUndo(undoRedo);\n const arabicEquation = session.activeSide === 'arabic';\n const undoArrow = arabicEquation ? '\\u21B7' : '\\u21B6';\n const vs = '\\uFE0E';\n buttonElements.undoBtn.textContent = `${undoArrow}${vs}`;\n buttonElements.undoBtn.title = 'تراجع';\n buttonElements.undoBtn.setAttribute('aria-label', 'تراجع');\n }\n if (buttonElements.redoBtn) {\n buttonElements.redoBtn.disabled = !undoRedoCanRedo(undoRedo);\n const arabicEquation = session.activeSide === 'arabic';\n const redoArrow = arabicEquation ? '\\u21B6' : '\\u21B7';\n const vs = '\\uFE0E';\n buttonElements.redoBtn.textContent = `${redoArrow}${vs}`;\n buttonElements.redoBtn.title = 'إعادة';\n buttonElements.redoBtn.setAttribute('aria-label', 'إعادة');\n }\n }\n\n function refreshClipboardButtons(): void {\n const hasSelection = Boolean(\n session.selection && session.selection.anchorIndex !== session.selection.focusIndex,\n );\n if (buttonElements.copyBtn) {\n buttonElements.copyBtn.disabled = !hasSelection;\n }\n if (buttonElements.cutBtn) {\n buttonElements.cutBtn.disabled = !hasSelection;\n }\n }\n\n function refreshSplitTypingButton(): void {\n if (!buttonElements.splitTypingBtn) {\n return;\n }\n const mergeOn = !session.splitLeafTyping;\n buttonElements.splitTypingBtn.textContent = mergeOn ? 'سصع' : 'س ص ع';\n buttonElements.splitTypingBtn.title = mergeOn ? 'تعطيل دمج الحروف' : 'تفعيل دمج الحروف';\n buttonElements.splitTypingBtn.setAttribute('aria-label', mergeOn ? 'تعطيل دمج الحروف' : 'تفعيل دمج الحروف');\n buttonElements.splitTypingBtn.setAttribute('aria-pressed', mergeOn ? 'true' : 'false');\n buttonElements.splitTypingBtn.classList.toggle('accent', mergeOn);\n }\n\n function refreshCharacterFontButton(): void {\n if (!buttonElements.characterFontBtn) {\n return;\n }\n const takweenOn = (session.currentCharacterFont ?? 'default') === 'takween';\n buttonElements.characterFontBtn.textContent = 'تك';\n buttonElements.characterFontBtn.title = takweenOn ? 'الكتابة بالخط الافتراضي' : 'الكتابة بخط تكوين';\n buttonElements.characterFontBtn.setAttribute('aria-label', takweenOn ? 'الكتابة بالخط الافتراضي' : 'الكتابة بخط تكوين');\n buttonElements.characterFontBtn.setAttribute('aria-pressed', takweenOn ? 'true' : 'false');\n buttonElements.characterFontBtn.classList.toggle('accent', takweenOn);\n }\n\n function refreshDigitFormSelect(): void {\n if (!buttonElements.digitFormBtn) {\n return;\n }\n const digitForm = session.currentDigitForm ?? 'western';\n const label = digitForm === 'arabicIndic' ? '٤٥٦' : digitForm === 'persianIndic' ? '۴۵۶' : '456';\n buttonElements.digitFormBtn.textContent = label;\n buttonElements.digitFormBtn.title = 'اختيار شكل الأرقام';\n buttonElements.digitFormBtn.setAttribute('aria-label', 'اختيار شكل الأرقام');\n buttonElements.digitFormBtn.dataset.digitForm = digitForm;\n }\n\n function applyStructural(updater: SessionUpdater): void {\n pushUndoRedoSnapshot(undoRedo, session);\n session = updater(session);\n render();\n }\n\n function applyTransient(updater: SessionUpdater): void {\n session = updater(session);\n render();\n }\n\n async function writeFragmentToClipboard(fragment: unknown): Promise<void> {\n lastInternalFragment = fragment;\n const json = JSON.stringify(fragment);\n const text = fragmentToPlainText(fragment as never, session.activeSide);\n try {\n if (typeof ClipboardItem !== 'undefined' && navigator.clipboard && navigator.clipboard.write) {\n const item = new ClipboardItem({\n [BUTEX_FRAGMENT_MIME]: new Blob([json], { type: BUTEX_FRAGMENT_MIME }),\n 'text/plain': new Blob([text], { type: 'text/plain' }),\n });\n await navigator.clipboard.write([item]);\n return;\n }\n } catch {\n /* fall through to text-only */\n }\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n /* clipboard not available; lastInternalFragment still allows in-app paste */\n }\n }\n\n async function readClipboardForPaste(): Promise<{ kind: 'fragment'; fragment: unknown } | { kind: 'text'; text: string } | null> {\n try {\n if (navigator.clipboard && navigator.clipboard.read) {\n const items = await navigator.clipboard.read();\n for (const item of items) {\n if (item.types.includes(BUTEX_FRAGMENT_MIME)) {\n const blob = await item.getType(BUTEX_FRAGMENT_MIME);\n const raw = await blob.text();\n const frag = deserializeFragment(raw);\n if (frag) {\n return { kind: 'fragment', fragment: frag };\n }\n }\n }\n }\n } catch {\n /* fall through */\n }\n if (lastInternalFragment) {\n return { kind: 'fragment', fragment: lastInternalFragment };\n }\n try {\n const text = await navigator.clipboard.readText();\n if (text) {\n const frag = deserializeFragment(text);\n if (frag) {\n return { kind: 'fragment', fragment: frag };\n }\n return { kind: 'text', text };\n }\n } catch {\n /* nothing available */\n }\n return null;\n }\n\n function clearSelectionAndNodeHighlights(): void {\n applyTransient((prev) => selectNode(clearSelection(prev), null));\n }\n\n function selectAllInActiveRoot(prev: EditorSession): EditorSession {\n const activeTree = prev[activeTreeKey(prev.activeSide)];\n if (activeTree.nodes.length === 0) {\n return setCaret(prev, activeTree.id, 0);\n }\n const anchored = setSelectionFromMouse(prev, activeTree.id, 0, 'anchor');\n return setSelectionFromMouse(anchored, activeTree.id, activeTree.nodes.length, 'focus');\n }\n\n function startDragSelection(chainId: string, slotIndex: number): void {\n dragSelecting = true;\n dragChainId = chainId;\n dragChanged = false;\n applyTransient((prev) => setSelectionFromMouse(prev, chainId, slotIndex, 'anchor'));\n }\n\n function updateDragFocus(chainId: string, slotIndex: number): void {\n if (!dragSelecting || chainId !== dragChainId) {\n return;\n }\n dragChanged = true;\n applyTransient((prev) => setSelectionFromMouse(prev, chainId, slotIndex, 'focus'));\n }\n\n function endDragSelection(): void {\n dragSelecting = false;\n dragChainId = null;\n }\n\n function resolveRootSlotFromX(clientX: number): { chainId: string; slotIndex: number } {\n const activeTree = session[activeTreeKey(session.activeSide)];\n const rootSlots = Array.from(surfaceEl.querySelectorAll('.slot')).filter(\n (slot) => slot instanceof HTMLElement && slot.dataset.chainId === activeTree.id,\n );\n let nearest: { chainId: string; slotIndex: number } | null = null;\n let nearestDistance = Number.POSITIVE_INFINITY;\n for (const slot of rootSlots) {\n if (!(slot instanceof HTMLElement) || !slot.dataset.index) {\n continue;\n }\n const rect = slot.getBoundingClientRect();\n const center = rect.left + rect.width / 2;\n const distance = Math.abs(clientX - center);\n if (distance < nearestDistance) {\n nearestDistance = distance;\n nearest = {\n chainId: activeTree.id,\n slotIndex: Number(slot.dataset.index),\n };\n }\n }\n if (nearest) {\n return nearest;\n }\n return {\n chainId: activeTree.id,\n slotIndex: activeTree.nodes.length,\n };\n }\n\n function resolveSelectionSlotFromPoint(clientX: number, clientY: number): { chainId: string; slotIndex: number } | null {\n const hit = document.elementFromPoint(clientX, clientY);\n if (!hit) {\n return null;\n }\n const slot = hit.closest('.slot');\n if (slot && slot instanceof HTMLElement && slot.dataset.chainId && slot.dataset.index) {\n return {\n chainId: slot.dataset.chainId,\n slotIndex: Number(slot.dataset.index),\n };\n }\n const node = hit.closest('.node');\n if (node && node instanceof HTMLElement && node.dataset.chainId && node.dataset.nodeIndex) {\n const nodeIndex = Number(node.dataset.nodeIndex);\n const rect = node.getBoundingClientRect();\n const afterNode = clientX >= rect.left + rect.width / 2;\n return {\n chainId: node.dataset.chainId,\n slotIndex: afterNode ? nodeIndex + 1 : nodeIndex,\n };\n }\n if (!surfaceEl.contains(hit)) {\n return null;\n }\n return resolveRootSlotFromX(clientX);\n }\n\n function updateDragFocusFromPoint(clientX: number, clientY: number): void {\n if (!dragSelecting) {\n return;\n }\n const resolved = resolveSelectionSlotFromPoint(clientX, clientY);\n if (!resolved) {\n return;\n }\n updateDragFocus(resolved.chainId, resolved.slotIndex);\n }\n\n function renderSlot(chainId: string, index: number): HTMLElement {\n const slot = document.createElement('span');\n slot.className = 'slot';\n slot.dataset.chainId = chainId;\n slot.dataset.index = String(index);\n if (isSlotInSelection(chainId, index)) {\n slot.classList.add('range-highlight');\n }\n slot.addEventListener('mousedown', (event) => {\n if (event.button !== 0) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n startDragSelection(chainId, index);\n surfaceEl.focus();\n });\n slot.addEventListener('click', (event) => {\n if (dragChanged) {\n event.preventDefault();\n event.stopPropagation();\n dragChanged = false;\n return;\n }\n applyTransient((prev) => setCaret(prev, chainId, index));\n surfaceEl.focus();\n });\n if (session.caret.chainId === chainId && session.caret.index === index) {\n const caret = document.createElement('span');\n caret.className = 'caret';\n slot.appendChild(caret);\n }\n return slot;\n }\n\n function buildNode(node: EditorNode, chainId: string, indexInChain: number): HTMLElement {\n const nodeEl = document.createElement('span');\n nodeEl.className = 'node';\n nodeEl.dataset.chainId = chainId;\n nodeEl.dataset.nodeIndex = String(indexInChain);\n const atomicSpec = node.kind === 'atomicCommand' ? atomicCommandSpec(node.expr) : null;\n if (isSpacingCommandSpec(atomicSpec)) {\n nodeEl.classList.add('node--atomic-spacing');\n nodeEl.title = spacingTooltipForSide(atomicSpec, session.activeSide);\n }\n if (session.selectedNodeId === node.id || session.selectedStructureNodeId === node.id) {\n nodeEl.classList.add('selected');\n }\n if (isNodeInSelection(chainId, indexInChain)) {\n nodeEl.classList.add('range-highlight');\n }\n nodeEl.addEventListener('mousedown', (event) => {\n if (event.button !== 0) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n startDragSelection(chainId, indexInChain);\n surfaceEl.focus();\n });\n nodeEl.addEventListener('click', (event) => {\n if (dragChanged) {\n event.preventDefault();\n event.stopPropagation();\n dragChanged = false;\n return;\n }\n event.stopPropagation();\n applyTransient((prev) => selectNode(prev, node.id));\n surfaceEl.focus();\n });\n\n const body = document.createElement('span');\n body.className = 'node-body';\n body.appendChild(buildNodeBody(node, buildChain, session.activeSide, session.currentDigitForm ?? 'western'));\n nodeEl.appendChild(body);\n\n const scripts = buildNodeScripts(node, buildChain);\n if (scripts) {\n nodeEl.appendChild(scripts);\n }\n return nodeEl;\n }\n\n function buildChain(chain: EditorChain): HTMLElement {\n const chainEl = document.createElement('span');\n chainEl.className = 'chain';\n for (let i = 0; i <= chain.nodes.length; i += 1) {\n chainEl.appendChild(renderSlot(chain.id, i));\n if (i < chain.nodes.length) {\n chainEl.appendChild(buildNode(chain.nodes[i], chain.id, i));\n }\n }\n return chainEl;\n }\n\n function render(): void {\n refreshSplitTypingButton();\n refreshCharacterFontButton();\n refreshDigitFormSelect();\n refreshUndoRedoButtons();\n refreshClipboardButtons();\n surfaceEl.classList.remove('surface--arabic', 'surface--english');\n surfaceEl.classList.add(session.activeSide === 'english' ? 'surface--english' : 'surface--arabic');\n surfaceEl.innerHTML = '';\n const activeTree = session[activeTreeKey(session.activeSide)];\n surfaceEl.appendChild(buildChain(activeTree));\n if (initialKeyboardFocusPending) {\n requestAnimationFrame(() => surfaceEl.focus());\n initialKeyboardFocusPending = false;\n }\n notifySessionChange();\n }\n\n async function performCopy(): Promise<void> {\n const fragment = copySelection(session);\n if (!fragment) {\n return;\n }\n await writeFragmentToClipboard(fragment);\n }\n\n async function performCut(): Promise<void> {\n const fragment = copySelection(session);\n if (!fragment) {\n return;\n }\n applyStructural((prev) => cutSelection(prev).session);\n await writeFragmentToClipboard(fragment);\n }\n\n async function performPaste(): Promise<void> {\n const payload = await readClipboardForPaste();\n if (!payload) {\n return;\n }\n if (payload.kind === 'fragment') {\n applyStructural((prev) => pasteFragment(prev, payload.fragment as never));\n return;\n }\n applyStructural((prev) => pasteText(prev, payload.text));\n }\n\n function performUndo(): void {\n const restored = restoreUndo(undoRedo, session);\n if (!restored) {\n return;\n }\n session = restored;\n render();\n surfaceEl.focus();\n }\n\n function performRedo(): void {\n const restored = restoreRedo(undoRedo, session);\n if (!restored) {\n return;\n }\n session = restored;\n render();\n surfaceEl.focus();\n }\n\n function onKeyDown(event: KeyboardEvent): void {\n const shortcutMod = event.ctrlKey || event.metaKey;\n const keyLower = typeof event.key === 'string' ? event.key.toLowerCase() : '';\n if (shortcutMod && !event.altKey && keyLower === 'z') {\n event.preventDefault();\n if (event.shiftKey) {\n performRedo();\n } else {\n performUndo();\n }\n return;\n }\n if (shortcutMod && !event.altKey && !event.shiftKey && keyLower === 'y') {\n event.preventDefault();\n performRedo();\n return;\n }\n if (shortcutMod && !event.altKey && !event.shiftKey && keyLower === 'c') {\n event.preventDefault();\n void performCopy();\n return;\n }\n if (shortcutMod && !event.altKey && !event.shiftKey && keyLower === 'x') {\n event.preventDefault();\n void performCut();\n return;\n }\n if (shortcutMod && !event.altKey && !event.shiftKey && keyLower === 'v') {\n event.preventDefault();\n void performPaste();\n return;\n }\n if (shortcutMod && !event.altKey && !event.shiftKey && keyLower === 'a') {\n event.preventDefault();\n applyTransient((prev) => selectAllInActiveRoot(prev));\n return;\n }\n\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n if (event.shiftKey) {\n applyTransient((prev) => extendSelectionByStep(prev, horizontalCaretDelta(prev, 'left')));\n } else {\n applyTransient((prev) => moveCaretHorizontal(prev, 'left'));\n }\n return;\n }\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n if (event.shiftKey) {\n applyTransient((prev) => extendSelectionByStep(prev, horizontalCaretDelta(prev, 'right')));\n } else {\n applyTransient((prev) => moveCaretHorizontal(prev, 'right'));\n }\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n applyTransient((prev) => moveCaretVertical(prev, 'up'));\n return;\n }\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n applyTransient((prev) => moveCaretVertical(prev, 'down'));\n return;\n }\n if (event.key === 'Backspace') {\n event.preventDefault();\n applyStructural((prev) => deleteBackward(prev));\n return;\n }\n if (event.key === 'Delete') {\n event.preventDefault();\n applyStructural((prev) => deleteForward(prev));\n return;\n }\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n const char = event.key;\n if (char === ' ') {\n if (!session.splitLeafTyping) {\n applyStructural((prev) => breakLeafTyping(prev));\n }\n return;\n }\n if (/^[0-9]$/.test(char)) {\n applyStructural((prev) => insertNumber(prev, char));\n return;\n }\n if (isOperator(char)) {\n applyStructural((prev) => insertOperator(prev, char));\n return;\n }\n applyStructural((prev) => insertChar(prev, char));\n }\n }\n\n function isShortcutOnlyEvent(event: KeyboardEvent): boolean {\n if (!(event.ctrlKey || event.metaKey) || event.altKey) {\n return false;\n }\n const keyLower = typeof event.key === 'string' ? event.key.toLowerCase() : '';\n return (\n keyLower === 'c' ||\n keyLower === 'x' ||\n keyLower === 'v' ||\n keyLower === 'z' ||\n keyLower === 'y' ||\n keyLower === 'a'\n );\n }\n\n function shouldIgnoreDocumentShortcutTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n if (target.isContentEditable) {\n return true;\n }\n const tag = target.tagName.toLowerCase();\n return tag === 'input' || tag === 'textarea' || tag === 'select';\n }\n\n function onDocumentKeyDown(event: KeyboardEvent): void {\n if (event.defaultPrevented) {\n return;\n }\n if (!isShortcutOnlyEvent(event)) {\n return;\n }\n if (shouldIgnoreDocumentShortcutTarget(event.target)) {\n return;\n }\n onKeyDown(event);\n }\n\n function onDocumentMouseMove(event: MouseEvent): void {\n if (!dragSelecting) {\n return;\n }\n if ((event.buttons & 1) !== 1) {\n endDragSelection();\n return;\n }\n updateDragFocusFromPoint(event.clientX, event.clientY);\n }\n\n function onSurfaceMouseDown(event: MouseEvent): void {\n if (event.button !== 0) {\n return;\n }\n const resolved = resolveSelectionSlotFromPoint(event.clientX, event.clientY);\n if (!resolved) {\n return;\n }\n event.preventDefault();\n startDragSelection(resolved.chainId, resolved.slotIndex);\n surfaceEl.focus();\n }\n\n function onSurfaceClick(event: MouseEvent): void {\n if (dragChanged) {\n event.preventDefault();\n dragChanged = false;\n return;\n }\n if (event.target instanceof HTMLElement && event.target.closest('.slot, .node')) {\n return;\n }\n const resolved = resolveSelectionSlotFromPoint(event.clientX, event.clientY);\n if (resolved) {\n applyTransient((prev) => setCaret(prev, resolved.chainId, resolved.slotIndex));\n } else {\n clearSelectionAndNodeHighlights();\n }\n surfaceEl.focus();\n }\n\n function onDocumentPointerDown(event: PointerEvent): void {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n if (surfaceEl.contains(target)) {\n return;\n }\n if (outsidePointerIgnoreSelectors.some((selector) => target.closest(selector))) {\n return;\n }\n clearSelectionAndNodeHighlights();\n }\n\n surfaceEl.addEventListener('keydown', onKeyDown);\n document.addEventListener('keydown', onDocumentKeyDown);\n document.addEventListener('mouseup', endDragSelection);\n document.addEventListener('mouseleave', endDragSelection);\n document.addEventListener('mousemove', onDocumentMouseMove);\n surfaceEl.addEventListener('mousedown', onSurfaceMouseDown);\n surfaceEl.addEventListener('click', onSurfaceClick);\n document.addEventListener('pointerdown', onDocumentPointerDown);\n\n const api: EditorRuntimeApi = {\n render,\n destroy: () => {\n surfaceEl.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('keydown', onDocumentKeyDown);\n document.removeEventListener('mouseup', endDragSelection);\n document.removeEventListener('mouseleave', endDragSelection);\n document.removeEventListener('mousemove', onDocumentMouseMove);\n surfaceEl.removeEventListener('mousedown', onSurfaceMouseDown);\n surfaceEl.removeEventListener('click', onSurfaceClick);\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n },\n getSession: () => session,\n setSession: (next) => {\n session = next;\n render();\n },\n performUndo,\n performRedo,\n performCopy,\n performCut,\n performPaste,\n toggleSide: () => {\n applyTransient((prev) => switchSide(prev));\n surfaceEl.focus();\n },\n toggleSplitLeafTyping: () => {\n applyStructural((prev) => setSplitLeafTyping(prev, !prev.splitLeafTyping));\n surfaceEl.focus();\n },\n toggleArabicReverseNumberTyping: () => {\n applyStructural((prev) => setArabicReverseNumberTyping(prev, !prev.arabicReverseNumberTyping));\n surfaceEl.focus();\n },\n toggleTakweenCharacterFont: () => {\n applyTransient((prev) => toggleTakweenCharacterFont(prev));\n surfaceEl.focus();\n },\n setCurrentCharacterFont: (fontId) => {\n applyTransient((prev) => setCurrentCharacterFont(prev, fontId));\n surfaceEl.focus();\n },\n setCurrentDigitForm: (digitForm) => {\n applyStructural((prev) => setCurrentDigitForm(prev, digitForm));\n surfaceEl.focus();\n },\n insertDelimiterByKind: (kind) => {\n if (kind === 'paren') {\n applyStructural((prev) => insertDelimiterPair(prev, '\\\\left(', '\\\\right)'));\n } else if (kind === 'bracket') {\n applyStructural((prev) => insertDelimiterPair(prev, '\\\\left[', '\\\\right]'));\n } else {\n applyStructural((prev) => insertDelimiterPair(prev, '\\\\left\\\\{', '\\\\right\\\\}'));\n }\n surfaceEl.focus();\n },\n insertFraction: () => {\n applyStructural((prev) => insertFraction(prev));\n surfaceEl.focus();\n },\n insertMatrixEnv: (style, rows, columns) => {\n applyStructural((prev) => insertMatrixEnv(prev, style, rows, columns));\n surfaceEl.focus();\n },\n insertArrayEnv: (rows, columns) => {\n applyStructural((prev) => insertArrayEnv(prev, rows, columns));\n surfaceEl.focus();\n },\n insertAlignedEnv: (rows, columns) => {\n applyStructural((prev) => insertAlignedEnv(prev, rows, columns));\n surfaceEl.focus();\n },\n insertSqrt: () => {\n applyStructural((prev) => insertSqrt(prev));\n surfaceEl.focus();\n },\n insertAtomicCommand: (commandId) => {\n applyStructural((prev) => insertAtomicCommand(prev, commandId));\n surfaceEl.focus();\n },\n insertAtomicOperatorCommand: (commandId) => {\n applyStructural((prev) => insertAtomicOperatorCommand(prev, commandId));\n surfaceEl.focus();\n },\n addSup: () => {\n applyStructural((prev) => addSup(prev));\n surfaceEl.focus();\n },\n addSub: () => {\n applyStructural((prev) => addSub(prev));\n surfaceEl.focus();\n },\n removeSup: () => {\n applyStructural((prev) => removeSup(prev));\n surfaceEl.focus();\n },\n removeSub: () => {\n applyStructural((prev) => removeSub(prev));\n surfaceEl.focus();\n },\n setMatrixEnvStyle: (style) => {\n applyStructural((prev) => setMatrixEnvStyle(prev, style));\n },\n setArrayColumnAlignment: (columnIndex, alignment) => {\n applyStructural((prev) => setArrayColumnAlignment(prev, columnIndex, alignment));\n },\n addMatrixRow: () => {\n applyStructural((prev) => addMatrixRow(prev));\n },\n removeMatrixRow: () => {\n applyStructural((prev) => removeMatrixRow(prev));\n },\n addMatrixColumn: () => {\n applyStructural((prev) => addMatrixColumn(prev));\n },\n removeMatrixColumn: () => {\n applyStructural((prev) => removeMatrixColumn(prev));\n },\n deleteStructure: () => {\n applyStructural((prev) => deleteStructure(prev));\n surfaceEl.focus();\n },\n };\n\n render();\n return api;\n}\n\nexport function runtimeStatusText(session: EditorSession): { activeSide: string; sync: string } {\n return {\n activeSide: `الجانب النشط: ${activeSideLabel(session.activeSide)}`,\n sync: `حالة المزامنة: ${syncStateSummary(session)}`,\n };\n}\n","const SVG_ARABSQRT_SELECTOR = 'mjx-container[jax=\"SVG\"] svg .mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]';\nconst ARABSQRT_SELECTOR = '.mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]';\nconst PATCHED_ATTR = 'data-butex-svg-arabsqrt';\nconst ROOT_INDEX_SCALE = 0.72;\nconst ROOT_INDEX_GAP_FACTOR = 0.08;\nconst ROOT_INDEX_MIN_GAP = 2;\nconst ROOT_INDEX_Y_RAISE = 18;\nconst ROOT_INDEX_LEFT_SHIFT = 360;\nconst VIEWBOX_PADDING = 20;\n\ntype SvgBox = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\ntype SvgPlacement = SvgBox & {\n visualX: number;\n visualY: number;\n translateX: number;\n translateY: number;\n};\n\nfunction closestArabSqrtRoot(element: Element): Element | null {\n return element.closest('.mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]');\n}\n\nfunction rootDepth(root: Element): number {\n let depth = 0;\n let parent = root.parentElement;\n while (parent) {\n if (parent.matches('.mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]')) {\n depth += 1;\n }\n parent = parent.parentElement;\n }\n return depth;\n}\n\nfunction directSvgElementChildren(element: Element): Element[] {\n return Array.from(element.children).filter((child) => child instanceof SVGElement);\n}\n\nfunction boxFor(element: Element): SvgBox | null {\n if (!(element instanceof SVGGraphicsElement) || typeof element.getBBox !== 'function') {\n return null;\n }\n try {\n const box = element.getBBox();\n return {\n x: box.x,\n y: box.y,\n width: box.width,\n height: box.height,\n };\n } catch {\n return null;\n }\n}\n\nfunction placementFor(element: Element): SvgPlacement | null {\n const box = boxFor(element);\n if (!box) {\n return null;\n }\n const [translateX, translateY] = readTranslate(element);\n return {\n ...box,\n translateX,\n translateY,\n visualX: box.x + translateX,\n visualY: box.y + translateY,\n };\n}\n\nfunction readTranslate(element: Element): [number, number] {\n const transform = element.getAttribute('transform') ?? '';\n const match = transform.match(/translate\\(\\s*([-+.\\d]+)(?:[,\\s]+([-+.\\d]+))?\\s*\\)/);\n if (!match) {\n return [0, 0];\n }\n return [Number(match[1]) || 0, Number(match[2]) || 0];\n}\n\nfunction setTranslate(element: Element, x: number, y: number): void {\n replaceTransform(element, `translate(${roundSvg(x)},${roundSvg(y)})`);\n}\n\nfunction setMirroredTranslate(element: Element, x: number, y: number, width: number): void {\n replaceTransform(element, `translate(${roundSvg(x + width)},${roundSvg(y)}) scale(-1,1)`);\n}\n\nfunction setRootIndexTranslate(element: Element, x: number, y: number): void {\n const current = element.getAttribute('transform') ?? '';\n const rest = current\n .replace(/translate\\(\\s*[-+.\\d]+(?:[,\\s]+[-+.\\d]+)?\\s*\\)/g, '')\n .replace(/matrix\\([^)]*\\)/g, '')\n .replace(/scale\\([^)]*\\)/g, '')\n .trim();\n const transform = `translate(${roundSvg(x)},${roundSvg(y)}) scale(${ROOT_INDEX_SCALE})`;\n element.setAttribute('transform', rest ? `${transform} ${rest}` : transform);\n}\n\nfunction setRootIndexVisualX(element: Element, placement: SvgPlacement, visualX: number): void {\n const x = visualX - placement.x * ROOT_INDEX_SCALE;\n setRootIndexTranslate(element, x, placement.translateY + ROOT_INDEX_Y_RAISE);\n}\n\nfunction replaceTransform(element: Element, transform: string): void {\n const current = element.getAttribute('transform') ?? '';\n const rest = current\n .replace(/translate\\(\\s*[-+.\\d]+(?:[,\\s]+[-+.\\d]+)?\\s*\\)/g, '')\n .replace(/matrix\\([^)]*\\)/g, '')\n .replace(/scale\\(\\s*-1(?:[,\\s]+1)?\\s*\\)/g, '')\n .trim();\n element.setAttribute('transform', rest ? `${transform} ${rest}` : transform);\n}\n\nfunction roundSvg(value: number): string {\n return Number.isFinite(value) ? value.toFixed(2).replace(/\\.?0+$/, '') : '0';\n}\n\nfunction findRootNode(root: Element): Element | null {\n const candidates = Array.from(root.querySelectorAll('[data-mml-node=\"msqrt\"], [data-mml-node=\"mroot\"]'));\n return candidates.find((candidate) => closestArabSqrtRoot(candidate) === root) ?? null;\n}\n\nfunction findSurd(rootNode: Element): Element | null {\n return directSvgElementChildren(rootNode).find((child) => child.getAttribute('data-mml-node') === 'mo') ?? null;\n}\n\nfunction findRootIndex(rootNode: Element): Element | null {\n const marked = rootNode.querySelector('[data-butex-arabsqrt-part=\"index\"]');\n if (marked?.parentElement === rootNode) {\n return marked;\n }\n if (marked?.parentElement?.parentElement === rootNode) {\n return marked.parentElement;\n }\n return directSvgElementChildren(rootNode).find((child) => {\n return child.classList.contains('mjx-rtl-root-index') || child.querySelector('.mjx-rtl-root-index') != null;\n }) ?? null;\n}\n\nfunction findBase(rootNode: Element, surd: Element | null, rootIndex: Element | null): Element | null {\n const marked = rootNode.querySelector('[data-butex-arabsqrt-part=\"base\"]');\n if (marked?.parentElement === rootNode) {\n return marked;\n }\n if (marked?.parentElement?.parentElement === rootNode) {\n return marked.parentElement;\n }\n return directSvgElementChildren(rootNode).find((child) => {\n if (child === surd || child === rootIndex || child.tagName.toLowerCase() === 'rect') {\n return false;\n }\n return child.querySelector('.mjx-rtl-unmirror:not(.mjx-rtl-root-index)') != null;\n }) ?? null;\n}\n\nfunction findOverbar(rootNode: Element): SVGRectElement | null {\n const directRects = directSvgElementChildren(rootNode).filter((child) => child.tagName.toLowerCase() === 'rect');\n return (directRects[directRects.length - 1] as SVGRectElement | undefined) ?? null;\n}\n\nfunction visualExtent(parts: Array<Element | null>): { left: number; right: number } | null {\n const placements = parts\n .filter((part): part is Element => part != null)\n .map((part) => placementFor(part))\n .filter((placement): placement is SvgPlacement => placement != null && placement.width > 0);\n if (!placements.length) {\n return null;\n }\n return placements.reduce(\n (extent, placement) => {\n return {\n left: Math.min(extent.left, placement.visualX),\n right: Math.max(extent.right, placement.visualX + placement.width),\n };\n },\n { left: Infinity, right: -Infinity }\n );\n}\n\nfunction mirroredVisualX(placement: SvgPlacement, extent: { left: number; right: number }): number {\n return extent.left + extent.right - (placement.visualX + placement.width);\n}\n\nfunction moveToVisualX(element: Element, placement: SvgPlacement, visualX: number): void {\n setTranslate(element, placement.translateX + visualX - placement.visualX, placement.translateY);\n}\n\nfunction mirrorToVisualX(element: Element, placement: SvgPlacement, visualX: number): void {\n const translateX = visualX + placement.x + placement.width;\n setMirroredTranslate(element, translateX - placement.width, placement.translateY, placement.width);\n}\n\nfunction findSvg(element: Element): SVGSVGElement | null {\n const svg = element.closest('svg');\n return svg instanceof SVGSVGElement ? svg : null;\n}\n\nfunction parseViewBox(svg: SVGSVGElement): [number, number, number, number] | null {\n const viewBox = svg.getAttribute('viewBox');\n if (!viewBox) {\n return null;\n }\n const values = viewBox.trim().split(/[\\s,]+/).map(Number);\n if (values.length !== 4 || values.some((value) => !Number.isFinite(value))) {\n return null;\n }\n return values as [number, number, number, number];\n}\n\nfunction parseEx(value: string | null): number | null {\n const match = value?.match(/^([-+.\\d]+)ex$/);\n if (!match) {\n return null;\n }\n const n = Number(match[1]);\n return Number.isFinite(n) ? n : null;\n}\n\nfunction expandSvgViewBox(root: Element, contentLeft: number, contentRight: number): void {\n const svg = findSvg(root);\n if (!svg) {\n return;\n }\n const box = parseViewBox(svg);\n if (!box) {\n return;\n }\n const [minX, minY, width, height] = box;\n const oldRight = minX + width;\n const nextLeft = Math.min(minX, contentLeft - VIEWBOX_PADDING);\n const nextRight = Math.max(oldRight, contentRight + VIEWBOX_PADDING);\n const nextWidth = nextRight - nextLeft;\n if (nextLeft === minX && nextWidth === width) {\n return;\n }\n svg.setAttribute('viewBox', [roundSvg(nextLeft), roundSvg(minY), roundSvg(nextWidth), roundSvg(height)].join(' '));\n\n const widthEx = parseEx(svg.getAttribute('width'));\n if (widthEx && width > 0) {\n svg.setAttribute('width', `${roundSvg(widthEx * (nextWidth / width))}ex`);\n }\n}\n\nfunction patchArabSqrtRoot(root: Element): void {\n if (root.getAttribute(PATCHED_ATTR) === 'patched') {\n return;\n }\n\n const rootNode = findRootNode(root);\n if (!rootNode) {\n return;\n }\n\n const surd = findSurd(rootNode);\n const rootIndex = findRootIndex(rootNode);\n const base = findBase(rootNode, surd, rootIndex);\n const overbar = findOverbar(rootNode);\n if (!surd || !base || !overbar) {\n return;\n }\n\n const surdPlacement = placementFor(surd);\n const basePlacement = placementFor(base);\n const indexPlacement = rootIndex ? placementFor(rootIndex) : null;\n if (!surdPlacement || !basePlacement || !surdPlacement.width || !basePlacement.width) {\n return;\n }\n\n const extent = visualExtent([surd, base, overbar]);\n if (!extent) {\n return;\n }\n\n let targetBaseX = mirroredVisualX(basePlacement, extent);\n let targetSurdX = mirroredVisualX(surdPlacement, extent);\n let targetOverbarX: number | null = null;\n\n const overbarBox = boxFor(overbar);\n if (overbarBox) {\n targetOverbarX = mirroredVisualX({ ...overbarBox, translateX: 0, translateY: 0, visualX: overbarBox.x, visualY: overbarBox.y }, extent);\n }\n\n let targetIndexX: number | null = null;\n let indexVisualWidth = 0;\n if (rootIndex && indexPlacement) {\n const indexGap = Math.max(surdPlacement.width * ROOT_INDEX_GAP_FACTOR, ROOT_INDEX_MIN_GAP);\n indexVisualWidth = indexPlacement.width * ROOT_INDEX_SCALE;\n targetIndexX = targetSurdX + surdPlacement.width + indexGap - ROOT_INDEX_LEFT_SHIFT;\n\n const bodyRight = Math.max(\n targetSurdX + surdPlacement.width,\n targetBaseX + basePlacement.width,\n targetOverbarX == null || !overbarBox ? -Infinity : targetOverbarX + overbarBox.width\n );\n const bodyShift = Math.max(0, targetIndexX + indexVisualWidth - bodyRight);\n if (bodyShift) {\n targetBaseX -= bodyShift;\n targetSurdX -= bodyShift;\n targetIndexX -= bodyShift;\n if (targetOverbarX != null) {\n targetOverbarX -= bodyShift;\n }\n }\n }\n\n moveToVisualX(base, basePlacement, targetBaseX);\n mirrorToVisualX(surd, surdPlacement, targetSurdX);\n\n if (overbarBox && targetOverbarX != null) {\n overbar.setAttribute('x', roundSvg(targetOverbarX));\n overbar.setAttribute('width', roundSvg(overbarBox.width));\n }\n\n if (rootIndex && indexPlacement && targetIndexX != null) {\n setRootIndexVisualX(rootIndex, indexPlacement, targetIndexX);\n }\n\n const contentLeft = Math.min(\n targetSurdX,\n targetBaseX,\n targetOverbarX ?? targetBaseX,\n targetIndexX ?? targetBaseX\n );\n const contentRight = Math.max(\n targetSurdX + surdPlacement.width,\n targetBaseX + basePlacement.width,\n targetOverbarX == null || !overbarBox ? targetBaseX + basePlacement.width : targetOverbarX + overbarBox.width,\n targetIndexX == null ? targetBaseX + basePlacement.width : targetIndexX + indexVisualWidth\n );\n expandSvgViewBox(root, contentLeft, contentRight);\n\n root.setAttribute(PATCHED_ATTR, 'patched');\n rootNode.setAttribute(PATCHED_ATTR, 'patched');\n}\n\nexport function patchBuTeXSvgMath(root: ParentNode): void {\n if (typeof root.querySelectorAll !== 'function') {\n return;\n }\n let roots = Array.from(root.querySelectorAll(SVG_ARABSQRT_SELECTOR));\n if (!roots.length) {\n roots = Array.from(root.querySelectorAll(ARABSQRT_SELECTOR)).filter((candidate) => {\n return candidate.closest('mjx-container[jax=\"SVG\"]') != null;\n });\n }\n roots\n .sort((a, b) => rootDepth(b) - rootDepth(a))\n .forEach((arabSqrtRoot) => patchArabSqrtRoot(arabSqrtRoot));\n}\n","import { patchBuTeXSvgMath } from './svgPatcher.js';\nimport { mirrorBuTeXOperatorsInTex } from '../editor/atomicCommandsOperators.js';\n\nexport { patchBuTeXSvgMath } from './svgPatcher.js';\n\nexport type BuTeXMathOutput = 'chtml' | 'svg';\n\nexport type RenderBuTeXMathIslandOptions = {\n display?: boolean;\n mirrorOperators?: boolean;\n output?: BuTeXMathOutput;\n};\n\ntype MathJaxRenderApi = {\n typesetPromise?: (nodes: HTMLElement[]) => Promise<void>;\n typesetClear?: (nodes: HTMLElement[]) => void;\n tex2chtml?: (input: string, options?: { display?: boolean }) => HTMLElement;\n tex2chtmlPromise?: (input: string, options?: { display?: boolean }) => Promise<HTMLElement>;\n tex2svg?: (input: string, options?: { display?: boolean }) => HTMLElement;\n tex2svgPromise?: (input: string, options?: { display?: boolean }) => Promise<HTMLElement>;\n startup?: {\n promise?: Promise<void>;\n document?: { updateDocument?: () => void };\n };\n};\n\nexport type RenderBuTeXMathTypesetOptions = {\n display?: boolean;\n mirrorOperators?: boolean;\n};\n\nexport function patchBuTeXSvgMathAfterLayout(root: ParentNode): void {\n const run = () => patchBuTeXSvgMath(root);\n const raf =\n typeof globalThis !== 'undefined'\n ? (globalThis as { requestAnimationFrame?: (callback: FrameRequestCallback) => number }).requestAnimationFrame\n : undefined;\n\n if (typeof raf === 'function') {\n raf(run);\n return;\n }\n\n if (typeof queueMicrotask === 'function') {\n queueMicrotask(run);\n return;\n }\n\n run();\n}\n\nfunction mathJaxApi(): MathJaxRenderApi | undefined {\n if (typeof globalThis === 'undefined') {\n return undefined;\n }\n return (globalThis as { MathJax?: MathJaxRenderApi }).MathJax;\n}\n\n/** Convert delimited source text to `\\(...\\)` / `\\[...\\]` form. */\nexport function normalizePreviewMathForMathJax(tex: string): string {\n if (tex.startsWith('$$') && tex.endsWith('$$')) {\n return `\\\\[${tex.slice(2, -2)}\\\\]`;\n }\n if (tex.startsWith('$') && tex.endsWith('$')) {\n return `\\\\(${tex.slice(1, -1)}\\\\)`;\n }\n return tex;\n}\n\n/** Normalize delimited TeX for direct MathJax island conversion. */\nexport function normalizeBuTeXMathInput(\n tex: string,\n output: BuTeXMathOutput = 'chtml',\n): { tex: string; display: boolean } {\n const inline = (inner: string) => ({\n tex: output === 'chtml' ? `\\\\displaystyle ${inner}` : inner,\n display: false,\n });\n\n if (tex.startsWith('$$') && tex.endsWith('$$')) {\n return { tex: tex.slice(2, -2), display: true };\n }\n if (tex.startsWith('$') && tex.endsWith('$')) {\n return inline(tex.slice(1, -1));\n }\n if (tex.startsWith('\\\\[') && tex.endsWith('\\\\]')) {\n return { tex: tex.slice(2, -2), display: true };\n }\n if (tex.startsWith('\\\\(') && tex.endsWith('\\\\)')) {\n return inline(tex.slice(2, -2));\n }\n return tex.startsWith('\\\\begin{') ? { tex, display: true } : inline(tex);\n}\n\nasync function renderWithOutput(\n mathJax: MathJaxRenderApi,\n tex: string,\n display: boolean,\n output: BuTeXMathOutput,\n): Promise<HTMLElement> {\n if (output === 'svg') {\n const node = mathJax.tex2svg?.(tex, { display }) ?? (await mathJax.tex2svgPromise?.(tex, { display }));\n if (!node) {\n throw new Error('BuTeX: tex2svg is not available. Load mathjax/tex-svg.js.');\n }\n patchBuTeXSvgMath(node);\n return node;\n }\n\n const node = mathJax.tex2chtml?.(tex, { display }) ?? (await mathJax.tex2chtmlPromise?.(tex, { display }));\n if (!node) {\n throw new Error('BuTeX: tex2chtml is not available. Load mathjax/tex-chtml.js.');\n }\n return node;\n}\n\nexport async function renderBuTeXMathIsland(\n tex: string,\n options: RenderBuTeXMathIslandOptions = {},\n): Promise<HTMLElement> {\n const output = options.output ?? 'chtml';\n const mathJax = mathJaxApi();\n if (!mathJax) {\n throw new Error('BuTeX: MathJax is not loaded.');\n }\n\n await (mathJax.startup?.promise ?? Promise.resolve());\n const normalized = normalizeBuTeXMathInput(tex, output);\n const display = options.display ?? normalized.display;\n const renderTex = options.mirrorOperators\n ? mirrorBuTeXOperatorsInTex(normalized.tex)\n : normalized.tex;\n const node = await renderWithOutput(mathJax, renderTex, display, output);\n mathJax.startup?.document?.updateDocument?.();\n return node;\n}\n\nexport async function mountBuTeXMathIsland(\n host: HTMLElement,\n tex: string,\n options: RenderBuTeXMathIslandOptions = {},\n): Promise<void> {\n try {\n const node = await renderBuTeXMathIsland(tex, options);\n host.replaceChildren(node);\n if ((options.output ?? 'chtml') === 'svg') {\n patchBuTeXSvgMathAfterLayout(host);\n }\n } catch {\n host.replaceChildren(document.createTextNode(tex));\n }\n}\n\n/**\n * Render via MathJax's document typesetter (`typesetPromise`).\n * Use for equation-editor preview of raw AST TeX (display `\\[...\\]` by default).\n */\nexport async function mountBuTeXMathTypeset(\n host: HTMLElement,\n tex: string,\n options: RenderBuTeXMathTypesetOptions = {},\n): Promise<void> {\n const mathJax = mathJaxApi();\n await (mathJax?.startup?.promise ?? Promise.resolve());\n const body = tex || '\\\\, ';\n const renderBody = options.mirrorOperators\n ? mirrorBuTeXOperatorsInTex(body)\n : body;\n const display = options.display ?? true;\n mathJax?.typesetClear?.([host]);\n host.innerHTML = display ? `\\\\[ ${renderBody} \\\\]` : `\\\\( ${renderBody} \\\\)`;\n if (!mathJax?.typesetPromise) {\n return;\n }\n await mathJax.typesetPromise([host]);\n patchBuTeXSvgMath(host);\n}\n\n/** @deprecated Use normalizeBuTeXMathInput instead. */\nexport function mathJaxInputFromPreviewTex(tex: string): { tex: string; display: boolean } {\n return normalizeBuTeXMathInput(tex, 'chtml');\n}\n","/**\n * BuTeX widget + equation surface: one `--butex-*` namespace on `.butex-widget`.\n * Chrome: `--butex-accent`, `--butex-panel`, `--butex-border`, `--butex-toolbar-hover-*`, …\n * Surface: `--butex-surface-bg`, `--butex-surface-fg`, `--butex-focus-*`, `--butex-slot-hover`, `--butex-selection-*`,\n * `--butex-node-*`, `--butex-script-*`, `--butex-delim-color`, `--butex-frac-bar`, `--butex-caret`.\n * Preview strip: `--butex-preview-bg`, `--butex-preview-fg` (MathJax may still apply its own rules).\n * Dev panels (`debug`): `--butex-dev-bg`, `--butex-dev-border`, `--butex-dev-badge`, `--butex-dev-badge-fg`,\n * `--butex-dev-inset-bg`, `--butex-dev-inset-border`, `--butex-dev-inset-fg`.\n */\nimport {\n BUTEX_DIWANI_FONT_STACK,\n BUTEX_DIWANI_OUTLINE_FONT_STACK,\n BUTEX_TAKWEEN_FONT_STACK,\n} from '../diwani-font.js';\n\nexport const WIDGET_CHROME_CSS = `\n.butex-widget {\n --butex-bg: #f1f5f9;\n --butex-fg: #0f172a;\n --butex-muted: #64748b;\n --butex-accent: #0d9488;\n --butex-accent-hover: #0f766e;\n --butex-toolbar-hover-bg: rgba(13, 148, 136, 0.08);\n --butex-toolbar-hover-border: var(--butex-accent);\n --butex-danger: #dc2626;\n --butex-danger-bg: rgba(220, 38, 38, 0.1);\n --butex-danger-border: rgba(220, 38, 38, 0.48);\n --butex-on-accent: #ffffff;\n --butex-border: #e2e8f0;\n --butex-panel: #ffffff;\n --butex-preview-bg: #ffffff;\n --butex-preview-fg: #0f172a;\n --butex-error: #b91c1c;\n --butex-error-bg: #fef2f2;\n --butex-error-border: #fecaca;\n --butex-shadow-md: 0 4px 14px rgba(15, 23, 42, 0.08);\n --butex-dev-bg: #fffbeb;\n --butex-dev-border: #fcd34d;\n --butex-dev-badge: #b45309;\n --butex-dev-badge-fg: #ffffff;\n --butex-dev-muted: #92400e;\n --butex-dev-inset-bg: #ffffff;\n --butex-dev-inset-border: rgba(180, 83, 9, 0.28);\n --butex-dev-inset-fg: var(--butex-fg);\n --butex-surface-bg: linear-gradient(180deg, #ffffff 0%, #fafbfc 100%);\n --butex-surface-fg: #0f172a;\n --butex-focus-border: rgba(13, 148, 136, 0.45);\n --butex-focus-shadow: rgba(13, 148, 136, 0.12);\n --butex-slot-hover: rgba(13, 148, 136, 0.08);\n --butex-selection-bg: rgba(13, 148, 136, 0.34);\n --butex-selection-border: rgba(15, 118, 110, 0.9);\n --butex-caret: #0f172a;\n --butex-node-hover: rgba(148, 163, 184, 0.08);\n --butex-node-selected-bg: rgba(13, 148, 136, 0.14);\n --butex-node-selected-border: rgba(13, 148, 136, 0.45);\n --butex-script-border: #cbd5e1;\n --butex-script-bg: rgba(248, 250, 252, 0.95);\n --butex-script-color: #475569;\n --butex-delim-color: #475569;\n --butex-frac-bar: currentColor;\n font-family: ui-sans-serif, system-ui, \"Segoe UI\", Tahoma, Arial, sans-serif;\n color: var(--butex-fg);\n line-height: 1.45;\n}\n\n.butex-widget .butex-widget-layout {\n display: flex;\n flex-direction: column;\n gap: 8px;\n max-width: 920px;\n margin: 0 auto;\n}\n\n.butex-widget .panel {\n background: var(--butex-panel);\n border: 1px solid var(--butex-border);\n border-radius: 14px;\n padding: 12px 14px;\n box-shadow: var(--butex-shadow-md);\n}\n\n/* Preview / render strip: no heading; slightly tighter padding, same card style as editor. */\n.butex-widget .panel.panel-preview {\n padding: 10px 12px;\n}\n\n.butex-widget .toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 8px;\n align-items: center;\n align-content: flex-start;\n}\n\n.butex-widget .toolbar button {\n border: 1px solid var(--butex-border);\n border-radius: 9px;\n background: var(--butex-panel);\n color: var(--butex-fg);\n min-width: 30px;\n height: 30px;\n padding: 0 7px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n line-height: 1;\n transition: transform 0.14s ease, border-color 0.14s ease, background 0.14s ease, color 0.14s ease;\n}\n\n.butex-widget .toolbar button:hover {\n border-color: var(--butex-toolbar-hover-border);\n background: var(--butex-toolbar-hover-bg);\n transform: translateY(-1px);\n}\n\n.butex-widget .toolbar button:disabled {\n opacity: 0.42;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.butex-widget .toolbar-sqrt-icon {\n display: inline-block;\n transform: scaleX(-1);\n font-size: 16px;\n line-height: 1;\n}\n\n.butex-widget .delimiter-command-menu {\n position: relative;\n display: inline-flex;\n}\n\n.butex-widget .delimiter-command-btn {\n min-width: 38px;\n font-family: ui-serif, \"Cambria Math\", \"Times New Roman\", serif;\n}\n\n.butex-widget .delimiter-command-btn::after {\n content: \"\";\n width: 0;\n height: 0;\n margin-inline-start: 3px;\n border-inline: 3px solid transparent;\n border-block-start: 4px solid currentColor;\n opacity: 0.72;\n}\n\n.butex-widget .delimiter-command-btn[aria-expanded=\"true\"] {\n border-color: var(--butex-toolbar-hover-border);\n background: var(--butex-toolbar-hover-bg);\n box-shadow: 0 0 0 3px var(--butex-focus-shadow);\n}\n\n.butex-widget .delimiter-command-options {\n position: absolute;\n z-index: 10;\n top: calc(100% + 5px);\n right: 0;\n left: auto;\n display: grid;\n grid-template-columns: repeat(3, 38px);\n grid-auto-rows: 38px;\n gap: 5px;\n padding: 6px;\n border: 1px solid var(--butex-border);\n border-radius: 9px;\n background: var(--butex-panel);\n color: var(--butex-fg);\n box-shadow: var(--butex-shadow-md);\n}\n\n.butex-widget .delimiter-command-options[hidden] {\n display: none;\n}\n\n.butex-widget .toolbar .delimiter-command-option {\n width: 38px;\n height: 38px;\n min-width: 0;\n padding: 0;\n border-color: transparent;\n border-radius: 8px;\n background: transparent;\n font-family: ui-serif, \"Cambria Math\", \"Times New Roman\", serif;\n}\n\n.butex-widget .toolbar .delimiter-command-option:hover {\n border-color: var(--butex-toolbar-hover-border);\n background: var(--butex-toolbar-hover-bg);\n transform: translateY(-1px);\n}\n\n.butex-widget .toolbar-frac-icon {\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n justify-content: center;\n min-width: 14px;\n font-size: 10px;\n line-height: 1;\n}\n\n.butex-widget .toolbar-frac-icon span:first-child {\n border-bottom: 1px solid currentColor;\n padding-bottom: 1px;\n}\n\n.butex-widget .toolbar-frac-icon span:last-child {\n padding-top: 1px;\n}\n\n.butex-widget .matrix-command-menu {\n position: relative;\n display: inline-flex;\n}\n\n.butex-widget .matrix-command-btn::after {\n content: \"\";\n width: 0;\n height: 0;\n margin-inline-start: 3px;\n border-inline: 3px solid transparent;\n border-block-start: 4px solid currentColor;\n opacity: 0.72;\n}\n\n.butex-widget .toolbar-matrix-icon {\n width: 14px;\n height: 14px;\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 2px;\n}\n\n.butex-widget .toolbar-matrix-icon span {\n border: 1px solid currentColor;\n border-radius: 2px;\n}\n\n.butex-widget .matrix-command-popover {\n position: absolute;\n z-index: 12;\n top: calc(100% + 5px);\n right: 0;\n width: 252px;\n padding: 8px;\n border: 1px solid var(--butex-border);\n border-radius: 9px;\n background: var(--butex-panel);\n color: var(--butex-fg);\n box-shadow: var(--butex-shadow-md);\n}\n\n.butex-widget .matrix-command-popover[hidden] {\n display: none;\n}\n\n.butex-widget .matrix-style-options,\n.butex-widget .matrix-edit-actions,\n.butex-widget .matrix-custom-size {\n display: flex;\n gap: 5px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.butex-widget .toolbar .matrix-style-option,\n.butex-widget .toolbar .matrix-edit-actions button,\n.butex-widget .toolbar .matrix-insert-custom {\n height: 26px;\n min-width: 30px;\n padding: 0 6px;\n border-radius: 7px;\n}\n\n.butex-widget .toolbar .matrix-style-option[aria-selected=\"true\"] {\n border-color: var(--butex-toolbar-hover-border);\n background: var(--butex-toolbar-hover-bg);\n}\n\n.butex-widget .matrix-size-readout {\n margin: 7px 0 5px;\n font-size: 12px;\n color: var(--butex-muted);\n text-align: center;\n direction: ltr;\n}\n\n.butex-widget .matrix-grid-picker {\n display: grid;\n grid-template-columns: repeat(8, 16px);\n grid-auto-rows: 16px;\n gap: 3px;\n justify-content: center;\n margin-bottom: 7px;\n}\n\n.butex-widget .toolbar .matrix-grid-cell {\n width: 16px;\n height: 16px;\n min-width: 0;\n padding: 0;\n border-radius: 3px;\n border-color: var(--butex-border);\n}\n\n.butex-widget .toolbar .matrix-grid-cell.active {\n border-color: var(--butex-toolbar-hover-border);\n background: var(--butex-toolbar-hover-bg);\n}\n\n.butex-widget .matrix-custom-size {\n justify-content: center;\n margin-bottom: 7px;\n}\n\n.butex-widget .matrix-custom-size label {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n font-size: 11px;\n color: var(--butex-muted);\n}\n\n.butex-widget .matrix-custom-size input {\n width: 42px;\n height: 24px;\n border: 1px solid var(--butex-border);\n border-radius: 6px;\n padding: 0 4px;\n direction: ltr;\n}\n\n.butex-widget .matrix-edit-actions {\n justify-content: center;\n border-top: 1px solid var(--butex-border);\n padding-top: 7px;\n}\n\n.butex-widget .script-icon-btn {\n min-width: 32px;\n font-family: ui-serif, \"Cambria Math\", \"Times New Roman\", serif;\n font-size: 14px;\n}\n\n.butex-widget .character-font-menu {\n position: relative;\n display: inline-flex;\n}\n\n.butex-widget .font-mode-btn {\n min-width: 42px;\n font-size: 15px;\n direction: rtl;\n}\n\n.butex-widget .font-mode-btn::after {\n content: \"\";\n width: 0;\n height: 0;\n margin-inline-start: 3px;\n border-inline: 3px solid transparent;\n border-block-start: 4px solid currentColor;\n opacity: 0.72;\n}\n\n.butex-widget .font-mode-btn[aria-expanded=\"true\"] {\n border-color: var(--butex-toolbar-hover-border);\n background: var(--butex-toolbar-hover-bg);\n box-shadow: 0 0 0 3px var(--butex-focus-shadow);\n}\n\n.butex-widget .font-mode-btn--takween,\n.butex-widget .character-font-option--takween {\n font-family: ${BUTEX_TAKWEEN_FONT_STACK};\n}\n\n.butex-widget .font-mode-btn--diwani,\n.butex-widget .character-font-option--diwani {\n font-family: ${BUTEX_DIWANI_FONT_STACK};\n}\n\n.butex-widget .font-mode-btn--diwaniOutline,\n.butex-widget .character-font-option--diwaniOutline {\n font-family: ${BUTEX_DIWANI_OUTLINE_FONT_STACK};\n}\n\n.butex-widget .character-font-options {\n position: absolute;\n z-index: 10;\n top: calc(100% + 5px);\n right: 0;\n left: auto;\n display: grid;\n min-width: 92px;\n padding: 4px;\n border: 1px solid var(--butex-border);\n border-radius: 9px;\n background: var(--butex-panel);\n color: var(--butex-fg);\n box-shadow: var(--butex-shadow-md);\n}\n\n.butex-widget .character-font-options[hidden] {\n display: none;\n}\n\n.butex-widget .toolbar .character-font-option {\n width: 100%;\n height: 30px;\n min-width: 0;\n justify-content: center;\n border-color: transparent;\n border-radius: 7px;\n background: transparent;\n direction: rtl;\n font-size: 14px;\n}\n\n.butex-widget .toolbar .character-font-option:hover {\n border-color: transparent;\n background: var(--butex-toolbar-hover-bg);\n transform: none;\n}\n\n.butex-widget .toolbar .character-font-option[aria-selected=\"true\"] {\n background: linear-gradient(180deg, var(--butex-accent) 0%, var(--butex-accent-hover) 100%);\n color: var(--butex-on-accent);\n}\n\n.butex-widget .toolbar-script-icon {\n width: 22px;\n height: 18px;\n display: inline-block;\n position: relative;\n direction: rtl;\n}\n\n.butex-widget .toolbar-script-icon span {\n position: absolute;\n line-height: 1;\n}\n\n.butex-widget .toolbar-script-icon span:last-child {\n right: 3px;\n top: 5px;\n font-size: 15px;\n}\n\n.butex-widget .toolbar-script-icon span:first-child {\n left: 2px;\n font-size: 10px;\n}\n\n.butex-widget .toolbar-script-icon--sup span:first-child {\n top: 0;\n}\n\n.butex-widget .toolbar-script-icon--sub span:first-child {\n bottom: 0;\n}\n\n.butex-widget .toolbar-remove-script-icon {\n width: 22px;\n height: 18px;\n display: inline-block;\n position: relative;\n direction: rtl;\n}\n\n.butex-widget .toolbar-remove-script-icon span {\n position: absolute;\n line-height: 1;\n}\n\n.butex-widget .toolbar-remove-script-icon span:first-child {\n left: 3px;\n font-size: 10px;\n}\n\n.butex-widget .toolbar-remove-script-icon span:last-child {\n right: 3px;\n top: 4px;\n font-size: 14px;\n}\n\n.butex-widget .toolbar-remove-script-icon--sup span:first-child {\n top: 0;\n}\n\n.butex-widget .toolbar-remove-script-icon--sub span:first-child {\n bottom: 0;\n}\n\n.butex-widget .ligature-btn {\n min-width: 52px;\n font-size: 13px;\n letter-spacing: 0;\n}\n\n.butex-widget .function-command-menu {\n position: relative;\n display: inline-flex;\n}\n\n.butex-widget .function-command-btn {\n min-width: 38px;\n font-family: ${BUTEX_DIWANI_FONT_STACK};\n font-size: 15px;\n direction: rtl;\n}\n\n.butex-widget .function-command-menu--groups .function-command-btn,\n.butex-widget .function-command-menu--groups .function-command-option {\n font-family: ${BUTEX_DIWANI_OUTLINE_FONT_STACK};\n}\n\n.butex-widget .function-command-btn::after {\n content: \"\";\n width: 0;\n height: 0;\n margin-inline-start: 2px;\n border-inline: 3px solid transparent;\n border-block-start: 4px solid currentColor;\n opacity: 0.72;\n}\n\n.butex-widget .function-command-btn[aria-expanded=\"true\"] {\n border-color: var(--butex-toolbar-hover-border);\n background: var(--butex-toolbar-hover-bg);\n box-shadow: 0 0 0 3px var(--butex-focus-shadow);\n}\n\n.butex-widget .function-command-options {\n position: absolute;\n z-index: 10;\n top: calc(100% + 5px);\n right: 0;\n left: auto;\n display: grid;\n grid-template-columns: repeat(auto-fill, 38px);\n grid-auto-rows: 38px;\n gap: 5px;\n width: 134px;\n max-width: min(240px, calc(100vw - 24px));\n padding: 6px;\n border: 1px solid var(--butex-border);\n border-radius: 9px;\n background: var(--butex-panel);\n color: var(--butex-fg);\n box-shadow: var(--butex-shadow-md);\n}\n\n.butex-widget .function-command-options[hidden] {\n display: none;\n}\n\n.butex-widget .toolbar .function-command-option {\n width: 38px;\n height: 38px;\n min-width: 0;\n padding: 0;\n border-color: transparent;\n border-radius: 8px;\n background: transparent;\n font-family: ${BUTEX_DIWANI_FONT_STACK};\n font-size: 15px;\n direction: rtl;\n}\n\n.butex-widget .toolbar .function-command-option:hover {\n border-color: var(--butex-toolbar-hover-border);\n background: var(--butex-toolbar-hover-bg);\n transform: translateY(-1px);\n}\n\n.butex-widget .function-command-label-with-sub {\n position: relative;\n display: inline-block;\n padding-inline-end: 0.45em;\n padding-block-end: 0.22em;\n line-height: 1;\n}\n\n.butex-widget .function-command-label-with-sub__sub {\n position: absolute;\n inset-inline-end: 0;\n inset-block-end: 0;\n font-size: 0.62em;\n line-height: 1;\n}\n\n.butex-widget .operator-command-btn,\n.butex-widget .toolbar .operator-command-option {\n font-family: \"Cambria Math\", \"Times New Roman\", serif;\n}\n\n.butex-widget .operator-command-label {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n line-height: 1;\n}\n\n.butex-widget .operator-command-label--mirror {\n transform: scaleX(-1);\n}\n\n.butex-widget .operator-command-svg-label {\n display: inline-block;\n width: 1em;\n height: 1em;\n background: currentColor;\n}\n\n.butex-widget .spacing-command-menu {\n position: relative;\n display: inline-flex;\n}\n\n.butex-widget .spacing-command-btn {\n min-width: 38px;\n}\n\n.butex-widget .spacing-command-btn[aria-expanded=\"true\"] {\n border-color: var(--butex-toolbar-hover-border);\n background: var(--butex-toolbar-hover-bg);\n box-shadow: 0 0 0 3px var(--butex-focus-shadow);\n}\n\n.butex-widget .spacing-command-options {\n position: absolute;\n z-index: 10;\n top: calc(100% + 5px);\n right: 0;\n left: auto;\n display: grid;\n gap: 3px;\n min-width: 178px;\n padding: 5px;\n border: 1px solid var(--butex-border);\n border-radius: 9px;\n background: var(--butex-panel);\n color: var(--butex-fg);\n box-shadow: var(--butex-shadow-md);\n}\n\n.butex-widget .spacing-command-options[hidden] {\n display: none;\n}\n\n.butex-widget .toolbar .spacing-command-option {\n width: 100%;\n height: 30px;\n min-width: 0;\n justify-content: space-between;\n gap: 8px;\n border-color: transparent;\n border-radius: 7px;\n background: transparent;\n padding-inline: 7px;\n}\n\n.butex-widget .toolbar .spacing-command-option:hover {\n border-color: transparent;\n background: var(--butex-toolbar-hover-bg);\n transform: none;\n}\n\n.butex-widget .spacing-command-option__name {\n color: var(--butex-muted);\n font-size: 11px;\n font-weight: 700;\n line-height: 1;\n}\n\n.butex-widget .spacing-command-glyph {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 2px;\n color: var(--butex-accent);\n direction: ltr;\n}\n\n.butex-widget .spacing-command-glyph--negative {\n color: var(--butex-danger);\n}\n\n.butex-widget .spacing-command-glyph__bar {\n display: inline-block;\n height: 3px;\n border-radius: 999px;\n background: currentColor;\n box-shadow: 0 0 0 1px var(--butex-toolbar-hover-bg);\n}\n\n.butex-widget .spacing-command-glyph__arrow {\n font-size: 12px;\n line-height: 1;\n opacity: 0.86;\n}\n\n.butex-widget .spacing-command-glyph--level-1 .spacing-command-glyph__bar {\n width: 12px;\n}\n\n.butex-widget .spacing-command-glyph--level-2 .spacing-command-glyph__bar {\n width: 18px;\n}\n\n.butex-widget .spacing-command-glyph--level-3 .spacing-command-glyph__bar {\n width: 32px;\n}\n\n.butex-widget .spacing-command-glyph--level-4 .spacing-command-glyph__bar {\n width: 48px;\n}\n\n.butex-widget .digit-form-menu {\n position: relative;\n display: inline-flex;\n}\n\n.butex-widget .digit-form-btn {\n min-width: 58px;\n gap: 5px;\n direction: ltr;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n}\n\n.butex-widget .digit-form-btn::after {\n content: \"\";\n width: 0;\n height: 0;\n border-inline: 4px solid transparent;\n border-block-start: 5px solid currentColor;\n opacity: 0.72;\n}\n\n.butex-widget .digit-form-btn[aria-expanded=\"true\"] {\n border-color: var(--butex-toolbar-hover-border);\n background: var(--butex-toolbar-hover-bg);\n box-shadow: 0 0 0 3px var(--butex-focus-shadow);\n}\n\n.butex-widget .digit-form-options {\n position: absolute;\n z-index: 10;\n top: calc(100% + 5px);\n right: 0;\n left: auto;\n display: grid;\n min-width: 74px;\n padding: 4px;\n border: 1px solid var(--butex-border);\n border-radius: 9px;\n background: var(--butex-panel);\n color: var(--butex-fg);\n box-shadow: var(--butex-shadow-md);\n}\n\n.butex-widget .digit-form-options[hidden] {\n display: none;\n}\n\n.butex-widget .toolbar .digit-form-option {\n width: 100%;\n height: 28px;\n min-width: 0;\n justify-content: center;\n border-color: transparent;\n border-radius: 7px;\n background: transparent;\n direction: ltr;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n}\n\n.butex-widget .toolbar .digit-form-option:hover {\n border-color: transparent;\n background: var(--butex-toolbar-hover-bg);\n transform: none;\n}\n\n.butex-widget .toolbar .digit-form-option[aria-selected=\"true\"] {\n background: linear-gradient(180deg, var(--butex-accent) 0%, var(--butex-accent-hover) 100%);\n color: var(--butex-on-accent);\n}\n\n.butex-widget .delete-node-btn,\n.butex-widget .remove-script-btn {\n color: var(--butex-danger);\n}\n\n.butex-widget .delete-node-btn:hover,\n.butex-widget .remove-script-btn:hover {\n border-color: var(--butex-danger-border);\n background: var(--butex-danger-bg);\n color: var(--butex-danger);\n}\n\n.butex-widget .delete-node-btn:hover {\n transform: translateY(-1px) rotate(-8deg) scale(1.06);\n}\n\n.butex-widget .toolbar-group {\n display: inline-flex;\n flex-wrap: wrap;\n gap: 4px;\n align-items: center;\n padding: 4px;\n border: 1px solid var(--butex-border);\n border-radius: 10px;\n background: rgba(248, 250, 252, 0.72);\n}\n\n.butex-widget .toolbar-functions,\n.butex-widget .toolbar-operators {\n padding-inline: 5px;\n}\n\n.butex-widget .toolbar .accent {\n background: linear-gradient(180deg, var(--butex-accent) 0%, var(--butex-accent-hover) 100%);\n color: var(--butex-on-accent);\n border-color: transparent;\n}\n\n.butex-widget .preview-box {\n border: 1px solid var(--butex-border);\n border-radius: 12px;\n padding: 10px 12px;\n background: var(--butex-preview-bg);\n color: var(--butex-preview-fg);\n min-height: 48px;\n}\n\n.butex-widget .error {\n margin-top: 8px;\n border: 1px solid var(--butex-error-border);\n background: var(--butex-error-bg);\n color: var(--butex-error);\n padding: 8px 12px;\n border-radius: 10px;\n font-size: 12px;\n}\n\n.butex-widget .dev-strip {\n margin-top: 10px;\n padding: 12px 14px;\n border-radius: 12px;\n border: 1px dashed var(--butex-dev-border);\n background: var(--butex-dev-bg);\n}\n\n.butex-widget .dev-badge {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 700;\n background: var(--butex-dev-badge);\n color: var(--butex-dev-badge-fg);\n}\n\n.butex-widget .ascii {\n direction: ltr;\n text-align: left;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n white-space: pre-wrap;\n word-break: break-word;\n margin-top: 8px;\n border: 1px solid var(--butex-dev-inset-border);\n background: var(--butex-dev-inset-bg);\n color: var(--butex-dev-inset-fg);\n border-radius: 8px;\n padding: 8px 10px;\n}\n\n.butex-widget .passive-preview-text {\n direction: rtl;\n text-align: right;\n font-size: 12px;\n margin-top: 8px;\n padding: 8px 10px;\n border-radius: 8px;\n border: 1px solid var(--butex-dev-inset-border);\n background: var(--butex-dev-inset-bg);\n color: var(--butex-dev-inset-fg);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.butex-widget .passive-preview-text.passive--ltr {\n direction: ltr;\n text-align: left;\n}\n\n.butex-widget .debug-head {\n display: flex;\n gap: 8px;\n align-items: center;\n margin-bottom: 8px;\n flex-wrap: wrap;\n}\n\n.butex-widget .debug-log {\n max-height: 220px;\n overflow: auto;\n border: 1px solid var(--butex-dev-inset-border);\n border-radius: 8px;\n padding: 8px 10px;\n font-size: 11px;\n white-space: pre-wrap;\n direction: ltr;\n text-align: left;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n background: var(--butex-dev-inset-bg);\n color: var(--butex-dev-inset-fg);\n}\n`.trim();\n\nconst CHROME_STYLE_ID = 'butex-widget-chrome-css';\n\nexport function injectWidgetChromeCss(doc?: Document): void {\n const d = doc ?? (typeof document !== 'undefined' ? document : undefined);\n if (!d || d.getElementById(CHROME_STYLE_ID)) {\n return;\n }\n const style = d.createElement('style');\n style.id = CHROME_STYLE_ID;\n style.textContent = WIDGET_CHROME_CSS;\n d.head.appendChild(style);\n}\n"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBA4WhB,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKxB,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKvB,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBA2H/B,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAOvB,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAmD/B,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["value","targetRow","next","clamp","clamp","node","ButexEditor","selectedDigitForm","_"]}