@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-document/ButexDocumentEditor.tsx","../src/ast/commands/index.ts","../src/ast/arabic_ast.ts","../src/document/mathObject.ts","../src/document/mathSpans.ts","../src/document/fromJson.ts","../src/editor/atomicCommands.ts","../src/editor/atomicCommandsOperators.ts","../src/editor/factory.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/document/mathEditorAdapter.ts","../src/document/render.ts","../src/document/editing.ts","../src/mathjax/svgPatcher.ts","../src/mathjax/renderIsland.ts","../src/react/ButexEditor.tsx","../src/react/widgetChromeCss.ts","../src/react-document/documentWidgetCss.ts"],"sourcesContent":["import { memo, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport {\n addDocumentBlock,\n addListItem,\n addNestedListBlock,\n addTableColumn,\n addTableRow,\n buildDocumentPreview,\n createEmptyDocument,\n documentInlineText,\n fromDocumentJson,\n insertMathSpanFromEditor,\n mathNodeFromEditorSession,\n mathSourceFromEditorSession,\n moveDocumentBlock,\n removeDocumentBlock,\n removeListItem,\n removeTableColumn,\n removeTableRow,\n replaceMathSpanFromEditor,\n renderDocumentLatex,\n updateImageBlock,\n updateListItemValue,\n updateRawBlockValue,\n updateTableCell,\n updateTableColumns,\n updateTextBlockValue,\n type DocumentBlockNode,\n type DocumentInline,\n type DocumentInlineTarget,\n type DocumentJson,\n type DocumentMathTarget,\n type DocumentNode,\n type DocumentPreview,\n type ImageBlockNode,\n type ListBlockNode,\n type MathInline,\n type NewDocumentBlockKind,\n type TableBlockNode,\n type TextBlockNode,\n} from '../document/index.js';\nimport { mathObjectToEditorSession } from '../document/mathEditorAdapter.js';\nimport { createEditorChain, createEditorSession, type EditorSession } from '../editor/index.js';\nimport { mountBuTeXMathIsland, normalizeBuTeXMathInput } from '../mathjax/renderIsland.js';\nimport { ButexEditor } from '../react/ButexEditor.js';\nimport { injectBuTeXDocumentStyles } from './documentWidgetCss.js';\n\nexport type ButexDocumentEditorProps = {\n initialDocument?: DocumentJson | DocumentNode;\n className?: string;\n debug?: boolean;\n onDocumentChange?: (document: DocumentNode) => void;\n onLatexChange?: (latex: string) => void;\n};\n\nexport type DocumentInitialState = {\n document: DocumentNode;\n error: string | null;\n};\n\ntype SelectedMath = {\n kind: 'edit';\n target: DocumentMathTarget;\n inline: MathInline;\n session: EditorSession | null;\n reason: string | null;\n} | {\n kind: 'insert';\n target: DocumentInlineTarget;\n insertAt: number;\n session: EditorSession;\n reason: string | null;\n};\n\ntype ButexDocumentPreviewPanelProps = {\n preview: DocumentPreview;\n previewOpen: boolean;\n onPreviewMathError: (message: string | null) => void;\n};\n\n/**\n * Render strategy: `mountBuTeXMathIsland` per math island (CHTML default).\n *\n * `MathJax.typesetPromise([previewEl])` cannot be used incrementally on the same\n * root — after the first call MathJax's internal queue stays parked on an\n * unsettled promise and every later call silently renders nothing. Per-island\n * `tex2chtml` has no queue and fits a \"many islands, frequent edits\" preview.\n *\n * The panel is its own memoized subtree so unrelated parent state (drawer open,\n * selection, etc.) does not reconcile this host div and strip MathJax output.\n */\nconst ButexDocumentPreviewPanel = memo(function ButexDocumentPreviewPanel({\n preview,\n previewOpen,\n onPreviewMathError,\n}: ButexDocumentPreviewPanelProps) {\n const previewRef = useRef<HTMLDivElement | null>(null);\n const renderVersionRef = useRef(0);\n\n useLayoutEffect(() => {\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n renderVersionRef.current += 1;\n const renderVersion = renderVersionRef.current;\n\n function runRenderOrRetry(attempt = 0): void {\n const previewEl = previewRef.current;\n const mathJax = typeof window !== 'undefined' ? (window as { MathJax?: { tex2chtml?: unknown } }).MathJax : undefined;\n if (cancelled || !previewEl || !previewOpen) {\n return;\n }\n\n if (!mathJax?.tex2chtml) {\n if (preview.mathIslands.length === 0) {\n previewEl.innerHTML = preview.html;\n onPreviewMathError(null);\n return;\n }\n if (attempt < 150) {\n timer = setTimeout(() => runRenderOrRetry(attempt + 1), 100);\n } else {\n onPreviewMathError('تعذر رسم المعادلات: لم يتم تحميل MathJax بعد.');\n }\n return;\n }\n\n void (async () => {\n if (cancelled || renderVersion !== renderVersionRef.current) {\n return;\n }\n const el = previewRef.current;\n if (!el) {\n return;\n }\n try {\n el.innerHTML = preview.html;\n let processed = 0;\n for (const island of preview.mathIslands) {\n if (cancelled || renderVersion !== renderVersionRef.current) {\n return;\n }\n const target = el.querySelector<HTMLElement>(`[data-math-id=\"${island.id}\"]`);\n if (!target) {\n processed += 1;\n continue;\n }\n await mountBuTeXMathIsland(target, island.tex, { output: 'chtml' });\n processed += 1;\n }\n if (processed !== preview.mathIslands.length) {\n throw new Error('بعض المعادلات لم يتم معالجتها أثناء الرسم.');\n }\n // #region agent log\n if (preview.mathIslands.length > 0) {\n const islandStats = preview.mathIslands.map((island) => {\n const islandEl = el.querySelector<HTMLElement>(`[data-math-id=\"${island.id}\"]`);\n const mjx = islandEl?.querySelector<HTMLElement>('mjx-container');\n const mirror = islandEl?.querySelector<HTMLElement>('.mjx-rtl-mirror');\n const unmirror = islandEl?.querySelector<HTMLElement>('.mjx-rtl-unmirror');\n const sqrt = islandEl?.querySelector<HTMLElement>('mjx-sqrt, mjx-root');\n const parent = islandEl?.parentElement;\n const islandStyle = islandEl ? getComputedStyle(islandEl) : null;\n const mjxStyle = mjx ? getComputedStyle(mjx) : null;\n const mirrorStyle = mirror ? getComputedStyle(mirror) : null;\n const rect = (node: Element | null | undefined) => {\n const box = node?.getBoundingClientRect();\n return box ? { x: box.x, y: box.y, w: box.width, h: box.height } : null;\n };\n return {\n id: island.id,\n texHead: island.tex.slice(0, 60),\n inputHead: normalizeBuTeXMathInput(island.tex).tex.slice(0, 80),\n childCount: islandEl?.childNodes.length ?? 0,\n mjxCount: islandEl?.querySelectorAll('mjx-container').length ?? 0,\n textLen: islandEl?.textContent?.length ?? 0,\n parentTag: parent?.tagName,\n parentLineHeight: parent ? getComputedStyle(parent).lineHeight : null,\n islandDisplay: islandStyle?.display,\n islandLineHeight: islandStyle?.lineHeight,\n islandOverflow: islandStyle?.overflow,\n mjxDisplay: mjxStyle?.display,\n mjxLineHeight: mjxStyle?.lineHeight,\n mjxOverflow: mjxStyle?.overflow,\n mirrorTransform: mirrorStyle?.transform,\n islandRect: rect(islandEl),\n mjxRect: rect(mjx),\n mirrorRect: rect(mirror),\n unmirrorRect: rect(unmirror),\n sqrtRect: rect(sqrt),\n };\n });\n fetch('http://127.0.0.1:7743/ingest/3453f16d-172e-4a4e-990c-ed6ca27e6bb1', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '14d392' },\n body: JSON.stringify({\n sessionId: '14d392',\n hypothesisId: 'Gghost',\n location: 'ButexDocumentPreviewPanel',\n message: 'island render stats',\n data: { renderVersion, latestRenderVersion: renderVersionRef.current, islandCount: preview.mathIslands.length, islands: islandStats },\n timestamp: Date.now(),\n }),\n }).catch(() => {});\n }\n // #endregion\n if (!cancelled) {\n onPreviewMathError(null);\n }\n } catch (err) {\n if (!cancelled) {\n const message = err instanceof Error ? err.message : String(err);\n onPreviewMathError(`تعذر رسم المعادلات: ${message}`);\n }\n }\n })();\n }\n\n runRenderOrRetry();\n\n return () => {\n cancelled = true;\n if (timer) {\n clearTimeout(timer);\n }\n };\n }, [preview, previewOpen, onPreviewMathError]);\n\n return <div ref={previewRef} className=\"butex-document-widget__preview\" />;\n});\n\nconst BLOCK_CHOICES: Array<{ kind: NewDocumentBlockKind; label: string }> = [\n { kind: 'section', label: 'قسم' },\n { kind: 'subsection', label: 'فرع' },\n { kind: 'subsubsection', label: 'فرع صغير' },\n { kind: 'paragraph', label: 'فقرة' },\n { kind: 'itemize', label: 'قائمة' },\n { kind: 'enumerate', label: 'ترقيم' },\n { kind: 'table', label: 'جدول' },\n { kind: 'image', label: 'صورة' },\n { kind: 'raw', label: 'خام' },\n];\n\nfunction isDocumentNode(value: unknown): value is DocumentNode {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { nodeType?: unknown }).nodeType === 'DocumentObject' &&\n Array.isArray((value as { blocks?: unknown }).blocks)\n );\n}\n\nexport function resolveInitialDocument(initialDocument: DocumentJson | DocumentNode | undefined): DocumentInitialState {\n if (!initialDocument) {\n return { document: createEmptyDocument(), error: null };\n }\n\n if (isDocumentNode(initialDocument)) {\n return { document: initialDocument, error: null };\n }\n\n try {\n return { document: fromDocumentJson(initialDocument), error: null };\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n return {\n document: createEmptyDocument(),\n error: `تعذر تحميل المستند: ${detail}`,\n };\n }\n}\n\nfunction previewOrEmpty(document: DocumentNode): DocumentPreview {\n if (document.blocks.length === 0) {\n return { html: '<p class=\"butex-document-widget__placeholder\">المستند فارغ</p>', mathIslands: [] };\n }\n return buildDocumentPreview(document);\n}\n\nfunction textCommandLabel(command: TextBlockNode['command']): string {\n if (command === '\\\\section') {\n return 'قسم';\n }\n if (command === '\\\\subsection') {\n return 'فرع';\n }\n if (command === '\\\\subsubsection') {\n return 'فرع صغير';\n }\n return 'فقرة';\n}\n\nfunction textFromInlines(inlines: DocumentInline[]): string {\n return documentInlineText(inlines);\n}\n\nfunction optionsToText(options: Record<string, string>): string {\n return Object.entries(options).map(([key, value]) => `${key}=${value}`).join(', ');\n}\n\nfunction optionsFromText(value: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const part of value.split(',')) {\n const trimmed = part.trim();\n if (!trimmed) {\n continue;\n }\n const [key, ...rest] = trimmed.split('=');\n const cleanKey = key?.trim();\n if (cleanKey) {\n result[cleanKey] = rest.join('=').trim();\n }\n }\n return result;\n}\n\nfunction createEmptyEquationSession(): EditorSession {\n const english = createEditorChain();\n const arabic = createEditorChain();\n arabic.id = english.id;\n return createEditorSession(english, arabic, 'english');\n}\n\nfunction targetKey(target: DocumentInlineTarget): string {\n if (target.scope === 'block') {\n return `block:${String(target.blockIndex)}`;\n }\n if (target.scope === 'listItem') {\n return `list:${String(target.blockIndex)}:${String(target.itemIndex)}`;\n }\n return `cell:${String(target.blockIndex)}:${String(target.rowIndex)}:${String(target.columnIndex)}`;\n}\n\nexport function ButexDocumentEditor({\n initialDocument,\n className,\n debug = false,\n onDocumentChange,\n onLatexChange,\n}: ButexDocumentEditorProps) {\n const initialState = useMemo(() => resolveInitialDocument(initialDocument), [initialDocument]);\n const [documentNode, setDocumentNode] = useState<DocumentNode>(initialState.document);\n const [error, setError] = useState<string | null>(initialState.error);\n const [editorOpen, setEditorOpen] = useState(true);\n const [previewOpen, setPreviewOpen] = useState(true);\n const [devOpen, setDevOpen] = useState(debug);\n const [debugLog, setDebugLog] = useState<string[]>([]);\n const [selectedMath, setSelectedMath] = useState<SelectedMath | null>(null);\n const [previewMathError, setPreviewMathError] = useState<string | null>(null);\n const [fieldCarets, setFieldCarets] = useState<Record<string, number>>({});\n // ButexEditor maintains its own internal session; we mirror the latest one here\n // so `saveSelectedMath` can convert what the user actually typed, not the empty\n // session we passed in as `initialSession`.\n const latestEquationSessionRef = useRef<EditorSession | null>(null);\n\n useEffect(() => {\n injectBuTeXDocumentStyles();\n }, []);\n\n useEffect(() => {\n const next = resolveInitialDocument(initialDocument);\n setDocumentNode(next.document);\n setError(next.error);\n setDebugLog([]);\n setSelectedMath(null);\n }, [initialDocument]);\n\n const latex = renderDocumentLatex(documentNode);\n const preview = useMemo(() => previewOrEmpty(documentNode), [documentNode]);\n\n useEffect(() => {\n onDocumentChange?.(documentNode);\n }, [documentNode, onDocumentChange]);\n\n useEffect(() => {\n onLatexChange?.(latex);\n }, [latex, onLatexChange]);\n\n useEffect(() => {\n if (debug) {\n setDevOpen(true);\n }\n }, [debug]);\n\n function updateDocument(next: DocumentNode, note: string): void {\n setDocumentNode(next);\n setDebugLog((entries) => [`${new Date().toISOString()} ${note}`, ...entries].slice(0, 30));\n // #region agent log\n if (note === 'updateTextBlock' || note === 'updateListItem' || note === 'updateTableCell' || note === 'saveMathSpan' || note === 'insertMathSpan') {\n const nextPreview = buildDocumentPreview(next);\n fetch('http://127.0.0.1:7743/ingest/3453f16d-172e-4a4e-990c-ed6ca27e6bb1', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '14d392' },\n body: JSON.stringify({\n sessionId: '14d392',\n hypothesisId: 'Hedit',\n location: 'ButexDocumentEditor.updateDocument',\n message: 'document mutation',\n data: {\n note,\n islandCount: nextPreview.mathIslands.length,\n texHeads: nextPreview.mathIslands.map((island) => island.tex.slice(0, 80)),\n },\n timestamp: Date.now(),\n }),\n }).catch(() => {});\n }\n // #endregion\n }\n\n function toggleEditorPanel(): void {\n setEditorOpen((open) => {\n if (open && !previewOpen) {\n setPreviewOpen(true);\n }\n return !open;\n });\n }\n\n function togglePreviewPanel(): void {\n setPreviewOpen((open) => {\n if (open && !editorOpen) {\n setEditorOpen(true);\n }\n return !open;\n });\n }\n\n function rememberCaret(target: DocumentInlineTarget, element: HTMLTextAreaElement | HTMLInputElement): void {\n setFieldCarets((current) => ({ ...current, [targetKey(target)]: element.selectionStart ?? element.value.length }));\n }\n\n function openNewMath(target: DocumentInlineTarget, fallbackLength: number): void {\n const insertAt = fieldCarets[targetKey(target)] ?? fallbackLength;\n const session = createEmptyEquationSession();\n latestEquationSessionRef.current = session;\n setSelectedMath({ kind: 'insert', target, insertAt, session, reason: null });\n }\n\n function openMath(target: DocumentMathTarget, inline: MathInline): void {\n if (!inline.math) {\n latestEquationSessionRef.current = null;\n setSelectedMath({ kind: 'edit', target, inline, session: null, reason: 'هذه المعادلة محفوظة كنص خام فقط حاليا' });\n return;\n }\n const converted = mathObjectToEditorSession(inline.math);\n if (!converted.editable) {\n latestEquationSessionRef.current = null;\n setSelectedMath({ kind: 'edit', target, inline, session: null, reason: converted.reason });\n return;\n }\n latestEquationSessionRef.current = converted.session;\n setSelectedMath({ kind: 'edit', target, inline, session: converted.session, reason: null });\n }\n\n function saveSelectedMath(): void {\n if (!selectedMath || !selectedMath.session) {\n return;\n }\n const sessionToSave = latestEquationSessionRef.current ?? selectedMath.session;\n const mathMode = selectedMath.kind === 'edit' ? selectedMath.inline.math?.mathMode ?? '$' : '$';\n const closing = selectedMath.kind === 'edit' ? selectedMath.inline.math?.closing ?? '$' : '$';\n const converted = mathNodeFromEditorSession(sessionToSave, mathMode, closing);\n if (!converted.ok) {\n setSelectedMath({ ...selectedMath, reason: converted.reason });\n return;\n }\n const source = mathSourceFromEditorSession(sessionToSave, mathMode, closing);\n if (selectedMath.kind === 'edit') {\n updateDocument(replaceMathSpanFromEditor(documentNode, selectedMath.target, converted.math, source), 'saveMathSpan');\n } else {\n updateDocument(\n insertMathSpanFromEditor(documentNode, selectedMath.target, selectedMath.insertAt, converted.math, source),\n 'insertMathSpan',\n );\n }\n latestEquationSessionRef.current = null;\n setSelectedMath(null);\n }\n\n function renderMathChips(inlines: DocumentInline[], targetForSpan: (spanIndex: number) => DocumentMathTarget) {\n let spanIndex = 0;\n return inlines\n .filter((inline): inline is MathInline => inline.kind === 'math')\n .map((inline) => {\n const current = spanIndex;\n spanIndex += 1;\n return (\n <button\n key={`${inline.source}-${String(current)}`}\n type=\"button\"\n className=\"butex-document-widget__math-chip\"\n title={inline.math ? 'تحرير المعادلة' : 'معادلة خام محفوظة'}\n onClick={() => openMath(targetForSpan(current), inline)}\n >\n {inline.source}\n </button>\n );\n });\n }\n\n function renderTextBlock(block: TextBlockNode, blockIndex: number) {\n const target: DocumentInlineTarget = { scope: 'block', blockIndex };\n return (\n <label className=\"butex-document-widget__field\">\n <span>{textCommandLabel(block.command)}</span>\n <textarea\n value={block.value}\n onClick={(event) => rememberCaret(target, event.currentTarget)}\n onKeyUp={(event) => rememberCaret(target, event.currentTarget)}\n onSelect={(event) => rememberCaret(target, event.currentTarget)}\n onChange={(event) => updateDocument(updateTextBlockValue(documentNode, blockIndex, event.currentTarget.value), 'updateTextBlock')}\n />\n <span className=\"butex-document-widget__row-actions\">\n <button type=\"button\" onClick={() => openNewMath(target, block.value.length)}>إدراج معادلة</button>\n </span>\n <span className=\"butex-document-widget__chips\">\n {renderMathChips(block.inlines, (spanIndex) => ({ scope: 'block', blockIndex, spanIndex }))}\n </span>\n </label>\n );\n }\n\n function renderListBlock(block: ListBlockNode, blockIndex: number) {\n return (\n <div className=\"butex-document-widget__list-editor\">\n <div className=\"butex-document-widget__row-actions\">\n <button type=\"button\" onClick={() => updateDocument(addListItem(documentNode, blockIndex), 'addListItem')}>إضافة عنصر</button>\n </div>\n {block.items.map((item, itemIndex) => (\n <div className=\"butex-document-widget__list-item\" key={itemIndex}>\n <label className=\"butex-document-widget__field\">\n <span>{block.command === '\\\\begin{enumerate}' ? `عنصر ${String(itemIndex + 1)}` : 'عنصر'}</span>\n <textarea\n value={item.value}\n onClick={(event) => rememberCaret({ scope: 'listItem', blockIndex, itemIndex }, event.currentTarget)}\n onKeyUp={(event) => rememberCaret({ scope: 'listItem', blockIndex, itemIndex }, event.currentTarget)}\n onSelect={(event) => rememberCaret({ scope: 'listItem', blockIndex, itemIndex }, event.currentTarget)}\n onChange={(event) =>\n updateDocument(updateListItemValue(documentNode, blockIndex, itemIndex, event.currentTarget.value), 'updateListItem')\n }\n />\n <span className=\"butex-document-widget__row-actions\">\n <button\n type=\"button\"\n onClick={() => openNewMath({ scope: 'listItem', blockIndex, itemIndex }, item.value.length)}\n >\n إدراج معادلة\n </button>\n </span>\n <span className=\"butex-document-widget__chips\">\n {renderMathChips(item.inlines, (spanIndex) => ({ scope: 'listItem', blockIndex, itemIndex, spanIndex }))}\n </span>\n </label>\n <div className=\"butex-document-widget__row-actions\">\n <button type=\"button\" onClick={() => updateDocument(removeListItem(documentNode, blockIndex, itemIndex), 'removeListItem')}>حذف العنصر</button>\n <button type=\"button\" onClick={() => updateDocument(addNestedListBlock(documentNode, blockIndex, itemIndex, 'itemize'), 'addNestedList')}>قائمة فرعية</button>\n <button type=\"button\" onClick={() => updateDocument(addNestedListBlock(documentNode, blockIndex, itemIndex, 'enumerate'), 'addNestedEnumerate')}>ترقيم فرعي</button>\n </div>\n {item.blocks.length > 0 ? (\n <div className=\"butex-document-widget__nested\">\n {item.blocks.map((child, childIndex) => (\n <div key={childIndex} className=\"butex-document-widget__nested-block\">\n {child.kind === 'list' ? `${child.command === '\\\\begin{enumerate}' ? 'ترقيم فرعي' : 'قائمة فرعية'} (${String(child.items.length)} عناصر)` : 'بنية فرعية'}\n </div>\n ))}\n </div>\n ) : null}\n </div>\n ))}\n </div>\n );\n }\n\n function renderTableBlock(block: TableBlockNode, blockIndex: number) {\n return (\n <div className=\"butex-document-widget__table-editor\">\n <label className=\"butex-document-widget__field butex-document-widget__field--short\">\n <span>الأعمدة</span>\n <input\n value={block.columns}\n onChange={(event) => updateDocument(updateTableColumns(documentNode, blockIndex, event.currentTarget.value), 'updateTableColumns')}\n />\n </label>\n <div className=\"butex-document-widget__row-actions\">\n <button type=\"button\" onClick={() => updateDocument(addTableRow(documentNode, blockIndex), 'addTableRow')}>إضافة صف</button>\n <button type=\"button\" onClick={() => updateDocument(removeTableRow(documentNode, blockIndex), 'removeTableRow')}>حذف صف</button>\n <button type=\"button\" onClick={() => updateDocument(addTableColumn(documentNode, blockIndex), 'addTableColumn')}>إضافة عمود</button>\n <button type=\"button\" onClick={() => updateDocument(removeTableColumn(documentNode, blockIndex), 'removeTableColumn')}>حذف عمود</button>\n </div>\n <div className=\"butex-document-widget__table-grid\">\n {block.rows.map((row, rowIndex) => (\n <div className=\"butex-document-widget__table-row\" key={rowIndex}>\n {row.map((cell, columnIndex) => (\n <label className=\"butex-document-widget__table-cell\" key={`${rowIndex}-${columnIndex}`}>\n <input\n value={textFromInlines(cell)}\n onClick={(event) => rememberCaret({ scope: 'tableCell', blockIndex, rowIndex, columnIndex }, event.currentTarget)}\n onKeyUp={(event) => rememberCaret({ scope: 'tableCell', blockIndex, rowIndex, columnIndex }, event.currentTarget)}\n onSelect={(event) => rememberCaret({ scope: 'tableCell', blockIndex, rowIndex, columnIndex }, event.currentTarget)}\n onChange={(event) =>\n updateDocument(updateTableCell(documentNode, blockIndex, rowIndex, columnIndex, event.currentTarget.value), 'updateTableCell')\n }\n />\n <span className=\"butex-document-widget__row-actions\">\n <button\n type=\"button\"\n onClick={() =>\n openNewMath(\n { scope: 'tableCell', blockIndex, rowIndex, columnIndex },\n textFromInlines(cell).length,\n )\n }\n >\n إدراج معادلة\n </button>\n </span>\n <span className=\"butex-document-widget__chips\">\n {renderMathChips(cell, (spanIndex) => ({ scope: 'tableCell', blockIndex, rowIndex, columnIndex, spanIndex }))}\n </span>\n </label>\n ))}\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n function renderImageBlock(block: ImageBlockNode, blockIndex: number) {\n return (\n <div className=\"butex-document-widget__image-editor\">\n <label className=\"butex-document-widget__field\">\n <span>مسار الصورة</span>\n <input\n value={block.value}\n onChange={(event) => updateDocument(updateImageBlock(documentNode, blockIndex, event.currentTarget.value, block.options), 'updateImage')}\n />\n </label>\n <label className=\"butex-document-widget__field\">\n <span>الخيارات</span>\n <input\n value={optionsToText(block.options)}\n onChange={(event) => updateDocument(updateImageBlock(documentNode, blockIndex, block.value, optionsFromText(event.currentTarget.value)), 'updateImageOptions')}\n />\n </label>\n </div>\n );\n }\n\n function renderBlockBody(block: DocumentBlockNode, blockIndex: number) {\n if (block.kind === 'textBlock') {\n return renderTextBlock(block, blockIndex);\n }\n if (block.kind === 'list') {\n return renderListBlock(block, blockIndex);\n }\n if (block.kind === 'table') {\n return renderTableBlock(block, blockIndex);\n }\n if (block.kind === 'image') {\n return renderImageBlock(block, blockIndex);\n }\n return (\n <label className=\"butex-document-widget__field\">\n <span>خام</span>\n <textarea\n value={block.value}\n onChange={(event) => updateDocument(updateRawBlockValue(documentNode, blockIndex, event.currentTarget.value), 'updateRaw')}\n />\n </label>\n );\n }\n\n return (\n <div className={`butex-document-widget ${className ?? ''}`.trim()} dir=\"rtl\" lang=\"ar\">\n <div className=\"butex-document-widget__shell\">\n <div className=\"butex-document-widget__toolbar\" role=\"toolbar\" aria-label=\"أدوات المستند\">\n {BLOCK_CHOICES.map((choice) => (\n <button key={choice.kind} type=\"button\" onClick={() => updateDocument(addDocumentBlock(documentNode, choice.kind), `addBlock:${choice.kind}`)}>\n {choice.label}\n </button>\n ))}\n <button type=\"button\" aria-pressed={editorOpen} onClick={toggleEditorPanel}>\n {editorOpen ? 'إخفاء التحرير' : 'إظهار التحرير'}\n </button>\n <button type=\"button\" aria-pressed={previewOpen} onClick={togglePreviewPanel}>\n {previewOpen ? 'إخفاء المعاينة' : 'إظهار المعاينة'}\n </button>\n <button type=\"button\" aria-pressed={devOpen} onClick={() => setDevOpen((open) => !open)}>\n {devOpen ? 'إخفاء التطوير' : 'إظهار التطوير'}\n </button>\n </div>\n\n {error ? <p className=\"butex-document-widget__error\">{error}</p> : null}\n\n <div className={`butex-document-widget__layout butex-document-widget__layout--editor-${editorOpen ? 'open' : 'closed'} butex-document-widget__layout--preview-${previewOpen ? 'open' : 'closed'}`}>\n <section\n className=\"butex-document-widget__panel butex-document-widget__editor-panel\"\n aria-label=\"تحرير المستند\"\n aria-hidden={!editorOpen}\n >\n {documentNode.blocks.length === 0 ? <p className=\"butex-document-widget__placeholder\">أضف بنية للبدء</p> : null}\n {documentNode.blocks.map((block, blockIndex) => (\n <article className=\"butex-document-widget__block\" key={blockIndex}>\n <div className=\"butex-document-widget__block-head\">\n <strong>{block.kind === 'textBlock' ? textCommandLabel(block.command) : block.kind === 'list' ? 'قائمة' : block.kind === 'table' ? 'جدول' : block.kind === 'image' ? 'صورة' : 'خام'}</strong>\n <span className=\"butex-document-widget__row-actions\">\n <button type=\"button\" onClick={() => updateDocument(moveDocumentBlock(documentNode, blockIndex, -1), 'moveBlockUp')}>↑</button>\n <button type=\"button\" onClick={() => updateDocument(moveDocumentBlock(documentNode, blockIndex, 1), 'moveBlockDown')}>↓</button>\n <button type=\"button\" onClick={() => updateDocument(removeDocumentBlock(documentNode, blockIndex), 'removeBlock')}>حذف</button>\n </span>\n </div>\n {renderBlockBody(block, blockIndex)}\n </article>\n ))}\n </section>\n\n <section\n className=\"butex-document-widget__panel butex-document-widget__preview-panel\"\n aria-label=\"معاينة المستند\"\n aria-hidden={!previewOpen}\n >\n <ButexDocumentPreviewPanel preview={preview} previewOpen={previewOpen} onPreviewMathError={setPreviewMathError} />\n {previewMathError ? <p className=\"butex-document-widget__preview-error\">{previewMathError}</p> : null}\n </section>\n </div>\n\n {devOpen ? (\n <section className=\"butex-document-widget__dev\" aria-label=\"لوحة التطوير\">\n <div>\n <strong>LaTeX</strong>\n <pre>{latex}</pre>\n </div>\n <div>\n <strong>HTML</strong>\n <pre>{preview.html}</pre>\n </div>\n <div>\n <strong>AST</strong>\n <pre>{JSON.stringify(documentNode, null, 2)}</pre>\n </div>\n <div>\n <strong>السجل</strong>\n <pre>{debugLog.join('\\n')}</pre>\n </div>\n </section>\n ) : null}\n\n {selectedMath ? (\n <aside className=\"butex-document-widget__drawer\" aria-label=\"تحرير المعادلة\">\n <div className=\"butex-document-widget__drawer-head\">\n <strong>تحرير المعادلة</strong>\n <button type=\"button\" onClick={() => setSelectedMath(null)}>إغلاق</button>\n </div>\n {selectedMath.reason || !selectedMath.session ? (\n <p className=\"butex-document-widget__error\">{selectedMath.reason ?? 'تعذر فتح المعادلة'}</p>\n ) : (\n <>\n <ButexEditor\n key={selectedMath.kind === 'edit' ? selectedMath.inline.source : `insert-${targetKey(selectedMath.target)}-${String(selectedMath.insertAt)}`}\n initialSession={selectedMath.session}\n onSessionChange={(session) => {\n latestEquationSessionRef.current = session;\n }}\n />\n <div className=\"butex-document-widget__row-actions\">\n <button type=\"button\" onClick={saveSelectedMath}>حفظ المعادلة</button>\n </div>\n </>\n )}\n </aside>\n ) : null}\n </div>\n </div>\n );\n}\n\nButexDocumentEditor.displayName = 'ButexDocumentEditor';\n","import type { ChainNode } from '../arabic_ast.js';\n\ntype CommandRenderContext = {\n name: string;\n optionalArgs: ChainNode[];\n mandatoryArgs: ChainNode[];\n renderChain: (chain: ChainNode) => string;\n};\n\nexport function renderCommandCore(context: CommandRenderContext): string {\n const optional = context.optionalArgs.map((arg) => `[${context.renderChain(arg)}]`).join('');\n const mandatory = context.mandatoryArgs.map((arg) => `{${context.renderChain(arg)}}`).join('');\n return context.name + optional + mandatory;\n}\n","import { renderCommandCore } from './commands/index.js';\n\nexport type ArabicNodeJson = {\n node_type: string;\n expr?: string;\n name?: string;\n superscript?: ChainJson | null;\n subscript?: ChainJson | null;\n left_delim_expr?: string;\n right_delim_expr?: string;\n inner_expr?: ChainJson;\n optional_args?: ChainJson[];\n mandatory_args?: ChainJson[];\n opening?: string;\n closing?: string;\n lines?: ChainJson[];\n};\n\nexport type ChainJson = {\n node_type: 'ChainClass';\n chain: ArabicNodeJson[];\n};\n\nexport class State {\n // Empty for now, like the Python State placeholder used by BaseNode.\n}\n\nexport class BaseAstNode {\n state: State;\n superscript: ChainNode | null;\n subscript: ChainNode | null;\n nodeType: string;\n\n constructor(state: State | null = null) {\n if (state === null) {\n state = new State();\n }\n\n this.state = state;\n this.superscript = null;\n this.subscript = null;\n this.nodeType = this.constructor.name;\n }\n\n latex(): string {\n throw new Error('NotImplementedError');\n }\n\n arabicLatex(): string {\n throw new Error('NotImplementedError');\n }\n\n toArabicLatex(): string {\n return this.arabicLatex();\n }\n\n /** Latin-style scripts: `^{...}` and `_{...}` for english_json rendering. */\n latexScripts(): string {\n let s = '';\n\n if (this.superscript !== null) {\n s += '^{' + this.superscript.latex() + '}';\n }\n\n if (this.subscript !== null) {\n s += '_{' + this.subscript.latex() + '}';\n }\n\n return s;\n }\n\n /**\n * Arabic scripts use \\\\prescript{sup}{sub}{content} (matches reference Python output).\n * Call with rendered strings for sup/sub chains (may be empty strings).\n */\n arabicLatexScripts(sup: string, sub: string, content: string): string {\n if (sup !== '' || sub !== '') {\n return '\\\\prescript{' + sup + '}{' + sub + '}{' + content + '}';\n }\n return content;\n }\n}\n\nexport class ChainNode {\n chain: BaseAstNode[];\n\n constructor(chain: BaseAstNode[] = []) {\n this.chain = chain;\n }\n\n latex(): string {\n return this.chain.map((node) => node.latex()).join(' ');\n }\n toEnglishLatex(): string {\n return this.chain.map((node) => node.latex()).join(' ');\n }\n /** RTL: reverse order relative to Latin chain (see test/ref_tests.txt). */\n arabicLatex(): string {\n const reversed = this.chain.slice().reverse();\n return reversed.map((node) => node.arabicLatex()).join(' ');\n }\n\n toArabicLatex(): string {\n return this.arabicLatex();\n }\n}\n\nexport class NumberNode extends BaseAstNode {\n expr: string;\n\n constructor(expr: string, state: State | null = null) {\n super(state);\n this.nodeType = 'NumberObject';\n this.expr = expr;\n }\n\n latex(): string {\n return this.expr + this.latexScripts();\n }\n\n arabicLatex(): string {\n const sup = this.superscript !== null ? this.superscript.arabicLatex() : '';\n const sub = this.subscript !== null ? this.subscript.arabicLatex() : '';\n return this.arabicLatexScripts(sup, sub, this.expr);\n }\n}\n\nexport class CharNode extends BaseAstNode {\n expr: string;\n\n constructor(expr: string, state: State | null = null) {\n super(state);\n this.nodeType = 'CharObject';\n this.expr = expr;\n }\n\n latex(): string {\n return this.expr + this.latexScripts();\n }\n\n arabicLatex(): string {\n const sup = this.superscript !== null ? this.superscript.arabicLatex() : '';\n const sub = this.subscript !== null ? this.subscript.arabicLatex() : '';\n return this.arabicLatexScripts(sup, sub, this.expr);\n }\n}\n\n/**\n * Operator leaf: value comes from JSON as-is (English or Arabic side already chosen by the service).\n * Scripts are not appended (Python parity).\n */\nexport class OperatorNode extends BaseAstNode {\n expr: string;\n\n constructor(expr: string, state: State | null = null) {\n super(state);\n this.nodeType = 'OperatorObject';\n this.expr = expr;\n }\n\n latex(): string {\n return this.expr;\n }\n\n arabicLatex(): string {\n return this.expr;\n }\n}\n\nexport class DelimiterNode extends BaseAstNode {\n leftDelimExpr: string;\n innerExpr: ChainNode;\n rightDelimExpr: string;\n\n constructor(leftDelimExpr: string, innerExpr: ChainNode, rightDelimExpr: string, state: State | null = null) {\n super(state);\n this.nodeType = 'DelimiterObject';\n this.leftDelimExpr = leftDelimExpr;\n this.innerExpr = innerExpr;\n this.rightDelimExpr = rightDelimExpr;\n }\n\n latex(): string {\n return this.leftDelimExpr + this.innerExpr.latex() + this.rightDelimExpr + this.latexScripts();\n }\n\n arabicLatex(): string {\n const sup = this.superscript !== null ? this.superscript.arabicLatex() : '';\n const sub = this.subscript !== null ? this.subscript.arabicLatex() : '';\n const content = this.leftDelimExpr + this.innerExpr.arabicLatex() + this.rightDelimExpr;\n return this.arabicLatexScripts(sup, sub, content);\n }\n}\n\nexport class CommandNode extends BaseAstNode {\n name: string;\n optionalArgs: ChainNode[];\n mandatoryArgs: ChainNode[];\n\n constructor(\n name: string,\n optionalArgs: ChainNode[] = [],\n mandatoryArgs: ChainNode[] = [],\n state: State | null = null\n ) {\n super(state);\n this.nodeType = 'CommandObject';\n this.name = name;\n this.optionalArgs = optionalArgs;\n this.mandatoryArgs = mandatoryArgs;\n }\n\n latex(): string {\n const content = renderCommandCore({\n name: this.name,\n optionalArgs: this.optionalArgs,\n mandatoryArgs: this.mandatoryArgs,\n renderChain: (chain) => chain.latex(),\n });\n return content + this.latexScripts();\n }\n\n arabicLatex(): string {\n const sup = this.superscript !== null ? this.superscript.arabicLatex() : '';\n const sub = this.subscript !== null ? this.subscript.arabicLatex() : '';\n const arabicName = this.name === '\\\\sqrt' ? '\\\\arabsqrt' : this.name;\n const content = renderCommandCore({\n name: arabicName,\n optionalArgs: this.optionalArgs,\n mandatoryArgs: this.mandatoryArgs,\n renderChain: (chain) => chain.arabicLatex(),\n });\n return this.arabicLatexScripts(sup, sub, content);\n }\n}\n\nexport class EnvNode extends BaseAstNode {\n opening: string;\n lines: ChainNode[];\n closing: string;\n\n constructor(opening: string, lines: ChainNode[] = [], closing: string, state: State | null = null) {\n super(state);\n this.nodeType = 'EnvObject';\n this.opening = opening;\n this.lines = lines;\n this.closing = closing;\n }\n\n latex(): string {\n if (this.lines.length === 0) {\n return this.opening + this.closing + this.latexScripts();\n }\n\n const formattedLines = this.lines.map((line) => ` ${line.latex()}`);\n const content = formattedLines.join(' \\\\\\\\' + '\\n');\n return `${this.opening}\\n${content}\\n${this.closing}` + this.latexScripts();\n }\n\n arabicLatex(): string {\n const sup = this.superscript !== null ? this.superscript.arabicLatex() : '';\n const sub = this.subscript !== null ? this.subscript.arabicLatex() : '';\n\n if (this.lines.length === 0) {\n return this.arabicLatexScripts(sup, sub, this.opening + this.closing);\n }\n\n const formattedLines = this.lines.map((line) => ` ${line.arabicLatex()}`);\n const content = formattedLines.join(' \\\\\\\\' + '\\n');\n const fullContent = `${this.opening}\\n${content}\\n${this.closing}`;\n return this.arabicLatexScripts(sup, sub, fullContent);\n }\n}\n\ntype ParseMode = 'english' | 'arabic';\n\nfunction parseScripts(node: BaseAstNode, json: ArabicNodeJson, mode: ParseMode): void {\n if (json.superscript) {\n node.superscript = parseChain(json.superscript, mode);\n }\n\n if (json.subscript) {\n node.subscript = parseChain(json.subscript, mode);\n }\n}\n\nfunction parseNode(json: ArabicNodeJson, mode: ParseMode): BaseAstNode {\n if (json.node_type === 'DelimiterObject') {\n const node = parseDelimiter(json, mode);\n parseScripts(node, json, mode);\n return node;\n }\n\n if (json.node_type === 'OperatorObject') {\n if (typeof json.expr !== 'string') {\n throw new Error('OperatorObject requires string expr');\n }\n const node = new OperatorNode(json.expr);\n parseScripts(node, json, mode);\n return node;\n }\n\n if (json.node_type === 'CommandObject') {\n const node = parseCommand(json, mode);\n parseScripts(node, json, mode);\n return node;\n }\n\n if (json.node_type === 'EnvObject') {\n const node = parseEnv(json, mode);\n parseScripts(node, json, mode);\n return node;\n }\n\n if (typeof json.expr !== 'string') {\n throw new Error(`${json.node_type} requires string expr`);\n }\n\n let node: BaseAstNode;\n\n if (json.node_type === 'NumberObject') {\n node = new NumberNode(json.expr);\n } else if (json.node_type === 'CharObject') {\n node = new CharNode(json.expr);\n } else {\n throw new Error(`Unsupported node_type: ${json.node_type}`);\n }\n\n parseScripts(node, json, mode);\n return node;\n}\n\nfunction parseDelimiter(json: ArabicNodeJson, mode: ParseMode): DelimiterNode {\n if (typeof json.left_delim_expr !== 'string') {\n throw new Error('DelimiterObject requires string left_delim_expr');\n }\n\n if (!json.inner_expr || json.inner_expr.node_type !== 'ChainClass') {\n throw new Error('DelimiterObject requires ChainClass inner_expr');\n }\n\n if (typeof json.right_delim_expr !== 'string') {\n throw new Error('DelimiterObject requires string right_delim_expr');\n }\n\n const innerExpr = parseChain(json.inner_expr, mode);\n return new DelimiterNode(json.left_delim_expr, innerExpr, json.right_delim_expr);\n}\n\nfunction parseCommand(json: ArabicNodeJson, mode: ParseMode): CommandNode {\n if (typeof json.name !== 'string') {\n throw new Error('CommandObject requires string name');\n }\n\n const optionalJson = Array.isArray(json.optional_args) ? json.optional_args : [];\n const mandatoryJson = Array.isArray(json.mandatory_args) ? json.mandatory_args : [];\n const optionalArgs = optionalJson.map((arg) => parseChain(arg, mode));\n const mandatoryArgs = mandatoryJson.map((arg) => parseChain(arg, mode));\n\n return new CommandNode(json.name, optionalArgs, mandatoryArgs);\n}\n\nfunction parseEnv(json: ArabicNodeJson, mode: ParseMode): EnvNode {\n if (typeof json.opening !== 'string') {\n throw new Error('EnvObject requires string opening');\n }\n\n if (typeof json.closing !== 'string') {\n throw new Error('EnvObject requires string closing');\n }\n\n if (!Array.isArray(json.lines)) {\n throw new Error('EnvObject requires lines array');\n }\n\n const lines = json.lines.map((line) => parseChain(line, mode));\n return new EnvNode(json.opening, lines, json.closing);\n}\n\nfunction parseChain(json: ChainJson, mode: ParseMode): ChainNode {\n if (json.node_type !== 'ChainClass') {\n throw new Error(`Expected ChainClass, got: ${json.node_type}`);\n }\n\n const nodes = json.chain.map((childJson) => parseNode(childJson, mode));\n return new ChainNode(nodes);\n}\n\n/** Import AST from Python english_dict JSON (Latin expr fields). */\nexport function fromEnglishJson(json: ChainJson | ArabicNodeJson): ChainNode | BaseAstNode {\n if (json.node_type === 'ChainClass') {\n return parseChain(json as ChainJson, 'english');\n }\n return parseNode(json, 'english');\n}\n\n/** Import AST from Python arabic_dict JSON (Arabic expr fields). Same shape as English; values differ. */\nexport function fromArabicJson(json: ChainJson | ArabicNodeJson): ChainNode | BaseAstNode {\n if (json.node_type === 'ChainClass') {\n return parseChain(json as ChainJson, 'arabic');\n }\n return parseNode(json, 'arabic');\n}\n","import { ChainNode, fromArabicJson, fromEnglishJson } from '../ast/arabic_ast.js';\nimport type { DocumentParseMode, MathNode, MathObjectJson } from './types.js';\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isMathObjectJson(value: unknown): value is MathObjectJson {\n return isObject(value) && value.node_type === 'MathObject';\n}\n\nfunction assertChainNode(value: unknown): ChainNode {\n if (!(value instanceof ChainNode)) {\n throw new Error('MathObject lines must parse to ChainNode');\n }\n return value;\n}\n\nexport function fromMathObjectJson(json: unknown, mode: DocumentParseMode = 'english'): MathNode {\n if (!isMathObjectJson(json)) {\n throw new Error('MathObject requires node_type \"MathObject\"');\n }\n\n if (typeof json.math_mode !== 'string') {\n throw new Error('MathObject requires string math_mode');\n }\n\n if (typeof json.closing !== 'string') {\n throw new Error('MathObject requires string closing');\n }\n\n if (!Array.isArray(json.lines) || json.lines.length === 0) {\n throw new Error('MathObject requires non-empty lines array');\n }\n\n const parseChain = mode === 'arabic' ? fromArabicJson : fromEnglishJson;\n const lines = json.lines.map((line) => assertChainNode(parseChain(line)));\n\n return {\n nodeType: 'MathObject',\n mathMode: json.math_mode,\n lines,\n closing: json.closing,\n };\n}\n\nexport function renderMathNodeLatex(math: MathNode): string {\n const lines = math.lines.map((line) => line.arabicLatex());\n\n if (math.mathMode === '$' || math.mathMode === '\\\\(') {\n return math.mathMode + lines.join(' ') + math.closing;\n }\n\n if (math.mathMode === '$$' || math.mathMode === '\\\\[') {\n if (lines.length === 1) {\n return math.mathMode + '\\n' + lines[0] + '\\n' + math.closing;\n }\n return math.mathMode + '\\n' + lines.map((line) => ` ${line}`).join(' \\\\\\\\\\n') + '\\n' + math.closing;\n }\n\n if (lines.length === 1) {\n return `${math.mathMode}\\n ${lines[0]}\\n${math.closing}`;\n }\n\n return `${math.mathMode}\\n${lines.map((line) => ` ${line}`).join(' \\\\\\\\\\n')}\\n${math.closing}`;\n}\n\nexport function isDisplayMathNode(math: MathNode): boolean {\n return math.mathMode === '$$' || math.mathMode === '\\\\[' || math.mathMode.startsWith('\\\\begin{');\n}\n","import { fromMathObjectJson } from './mathObject.js';\nimport type { DetectedMathSpan, DocumentInline, DocumentParseMode, MathObjectJson } from './types.js';\n\nconst MATH_ENVIRONMENTS = new Set([\n 'equation',\n 'equation*',\n 'align',\n 'align*',\n 'aligned',\n 'gather',\n 'gather*',\n 'multline',\n 'multline*',\n]);\n\nfunction isEscaped(value: string, index: number): boolean {\n let slashCount = 0;\n let i = index - 1;\n while (i >= 0 && value[i] === '\\\\') {\n slashCount += 1;\n i -= 1;\n }\n return slashCount % 2 === 1;\n}\n\nfunction findClosingDollar(value: string, start: number): number {\n let i = start;\n while (i < value.length) {\n if (value[i] === '$' && !isEscaped(value, i)) {\n return i;\n }\n i += 1;\n }\n return -1;\n}\n\nfunction findClosingToken(value: string, token: string, start: number): number {\n const index = value.indexOf(token, start);\n return index < 0 ? -1 : index;\n}\n\nfunction environmentSpan(value: string, start: number): DetectedMathSpan | null {\n const match = /^\\\\begin\\{([A-Za-z*]+)\\}/.exec(value.slice(start));\n if (!match) {\n return null;\n }\n\n const envName = match[1] ?? '';\n if (!MATH_ENVIRONMENTS.has(envName)) {\n return null;\n }\n\n const opening = match[0] ?? '';\n const closing = `\\\\end{${envName}}`;\n const closingStart = value.indexOf(closing, start + opening.length);\n if (closingStart < 0) {\n return null;\n }\n\n const end = closingStart + closing.length;\n return {\n start,\n end,\n source: value.slice(start, end),\n mathMode: opening,\n closing,\n };\n}\n\nexport function detectMathSpans(value: string): DetectedMathSpan[] {\n const spans: DetectedMathSpan[] = [];\n let i = 0;\n\n while (i < value.length) {\n if (value.startsWith('\\\\begin{', i)) {\n const span = environmentSpan(value, i);\n if (span) {\n spans.push(span);\n i = span.end;\n continue;\n }\n }\n\n if (value.startsWith('\\\\(', i)) {\n const close = findClosingToken(value, '\\\\)', i + 2);\n if (close >= 0) {\n const end = close + 2;\n spans.push({ start: i, end, source: value.slice(i, end), mathMode: '\\\\(', closing: '\\\\)' });\n i = end;\n continue;\n }\n }\n\n if (value.startsWith('\\\\[', i)) {\n const close = findClosingToken(value, '\\\\]', i + 2);\n if (close >= 0) {\n const end = close + 2;\n spans.push({ start: i, end, source: value.slice(i, end), mathMode: '\\\\[', closing: '\\\\]' });\n i = end;\n continue;\n }\n }\n\n if (value.startsWith('$$', i) && !isEscaped(value, i)) {\n const close = value.indexOf('$$', i + 2);\n if (close >= 0) {\n const end = close + 2;\n spans.push({ start: i, end, source: value.slice(i, end), mathMode: '$$', closing: '$$' });\n i = end;\n continue;\n }\n }\n\n if (value[i] === '$' && !isEscaped(value, i)) {\n const close = findClosingDollar(value, i + 1);\n if (close >= 0) {\n const end = close + 1;\n spans.push({ start: i, end, source: value.slice(i, end), mathMode: '$', closing: '$' });\n i = end;\n continue;\n }\n }\n\n i += 1;\n }\n\n return spans;\n}\n\nexport function buildInlines(\n value: string,\n mathObjects: MathObjectJson[] = [],\n mode: DocumentParseMode = 'english'\n): DocumentInline[] {\n const spans = detectMathSpans(value);\n\n if (mathObjects.length > 0 && mathObjects.length !== spans.length) {\n throw new Error(`math_objects count mismatch: detected ${String(spans.length)}, got ${String(mathObjects.length)}`);\n }\n\n const inlines: DocumentInline[] = [];\n let index = 0;\n\n spans.forEach((span, spanIndex) => {\n if (span.start > index) {\n inlines.push({ kind: 'text', text: value.slice(index, span.start) });\n }\n\n const mathJson = mathObjects[spanIndex];\n if (mathJson) {\n if (mathJson.math_mode !== span.mathMode || mathJson.closing !== span.closing) {\n throw new Error('math_objects order mismatch');\n }\n inlines.push({ kind: 'math', source: span.source, math: fromMathObjectJson(mathJson, mode) });\n } else {\n inlines.push({ kind: 'math', source: span.source, math: null });\n }\n\n index = span.end;\n });\n\n if (index < value.length) {\n inlines.push({ kind: 'text', text: value.slice(index) });\n }\n\n if (inlines.length === 0) {\n inlines.push({ kind: 'text', text: value });\n }\n\n return inlines;\n}\n","import { buildInlines } from './mathSpans.js';\nimport { detectMathSpans } from './mathSpans.js';\nimport type {\n DocumentBlockJson,\n DocumentBlockNode,\n DocumentCommand,\n DocumentListItemJson,\n DocumentNode,\n DocumentParseMode,\n ImageBlockNode,\n ListBlockNode,\n ListItemNode,\n RawBlockNode,\n TableBlockNode,\n TextBlockNode,\n} from './types.js';\n\nconst TEXT_COMMANDS = new Set(['\\\\section', '\\\\subsection', '\\\\subsubsection', '\\\\paragraph']);\nconst LIST_COMMANDS = new Set(['\\\\begin{itemize}', '\\\\begin{enumerate}']);\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isRecordOfStrings(value: unknown): value is Record<string, string> {\n if (!isObject(value)) {\n return false;\n }\n return Object.values(value).every((entry) => typeof entry === 'string');\n}\n\nfunction requireString(value: unknown, message: string): string {\n if (typeof value !== 'string') {\n throw new Error(message);\n }\n return value;\n}\n\nfunction asBlockJson(value: unknown): DocumentBlockJson {\n if (!isObject(value)) {\n throw new Error('Document block must be an object');\n }\n if (typeof value.command !== 'string') {\n throw new Error('Document block requires string command');\n }\n return value as DocumentBlockJson;\n}\n\nfunction parseTextBlock(json: DocumentBlockJson, mode: DocumentParseMode): TextBlockNode {\n const value = requireString(json.value, `${json.command} requires string value`);\n return {\n kind: 'textBlock',\n command: json.command as TextBlockNode['command'],\n value,\n inlines: buildInlines(value, json.math_objects ?? [], mode),\n };\n}\n\nfunction closingForList(command: '\\\\begin{itemize}' | '\\\\begin{enumerate}'): '\\\\end{itemize}' | '\\\\end{enumerate}' {\n return command === '\\\\begin{itemize}' ? '\\\\end{itemize}' : '\\\\end{enumerate}';\n}\n\nfunction parseListItem(json: DocumentListItemJson, mode: DocumentParseMode): ListItemNode {\n const value = requireString(json.value, 'Document list item requires string value');\n const blocksJson = Array.isArray(json.blocks) ? json.blocks : [];\n return {\n value,\n inlines: buildInlines(value, json.math_objects ?? [], mode),\n blocks: blocksJson.map((block) => parseBlock(asBlockJson(block), mode)),\n };\n}\n\nfunction parseListBlock(json: DocumentBlockJson, mode: DocumentParseMode): ListBlockNode {\n if (!Array.isArray(json.items)) {\n throw new Error(`${json.command} requires items array`);\n }\n const command = json.command as ListBlockNode['command'];\n const expectedClosing = closingForList(command);\n const closing = json.closing === undefined ? expectedClosing : requireString(json.closing, `${json.command} requires string closing`);\n if (closing !== expectedClosing) {\n throw new Error(`${json.command} closing must be ${expectedClosing}`);\n }\n return {\n kind: 'list',\n command,\n closing,\n items: json.items.map((item) => parseListItem(item, mode)),\n };\n}\n\nfunction parseTableBlock(json: DocumentBlockJson, mode: DocumentParseMode): TableBlockNode {\n if (!Array.isArray(json.rows)) {\n throw new Error('\\\\begin{tabular} requires rows array');\n }\n\n const mathObjects = json.math_objects ?? [];\n let mathObjectIndex = 0;\n const rows = json.rows.map((row) => {\n if (!Array.isArray(row)) {\n throw new Error('\\\\begin{tabular} rows must be arrays');\n }\n return row.map((cell) => {\n const value = requireString(cell, '\\\\begin{tabular} cells must be strings');\n const spanCount = detectMathSpans(value).length;\n const cellMathObjects = mathObjects.slice(mathObjectIndex, mathObjectIndex + spanCount);\n mathObjectIndex += spanCount;\n return buildInlines(value, cellMathObjects, mode);\n });\n });\n\n if (mathObjects.length > 0 && mathObjects.length !== mathObjectIndex) {\n throw new Error(`math_objects count mismatch: detected ${String(mathObjectIndex)}, got ${String(mathObjects.length)}`);\n }\n\n return {\n kind: 'table',\n command: '\\\\begin{tabular}',\n closing: '\\\\end{tabular}',\n columns: typeof json.columns === 'string' ? json.columns : '',\n rows,\n };\n}\n\nfunction parseImageBlock(json: DocumentBlockJson): ImageBlockNode {\n return {\n kind: 'image',\n command: '\\\\includegraphics',\n value: requireString(json.value, '\\\\includegraphics requires string value'),\n options: isRecordOfStrings(json.options) ? json.options : {},\n };\n}\n\nfunction parseRawBlock(json: DocumentBlockJson): RawBlockNode {\n return {\n kind: 'raw',\n command: '\\\\raw',\n value: typeof json.value === 'string' ? json.value : '',\n };\n}\n\nfunction parseBlock(json: DocumentBlockJson, mode: DocumentParseMode): DocumentBlockNode {\n if (TEXT_COMMANDS.has(json.command)) {\n return parseTextBlock(json, mode);\n }\n\n if (LIST_COMMANDS.has(json.command)) {\n return parseListBlock(json, mode);\n }\n\n if (json.command === '\\\\begin{tabular}') {\n return parseTableBlock(json, mode);\n }\n\n if (json.command === '\\\\includegraphics') {\n return parseImageBlock(json);\n }\n\n if (json.command === '\\\\raw') {\n return parseRawBlock(json);\n }\n\n return {\n kind: 'raw',\n command: '\\\\raw',\n value: typeof json.value === 'string' ? json.value : json.command,\n };\n}\n\nexport function fromDocumentJson(json: unknown, mode: DocumentParseMode = 'english'): DocumentNode {\n if (!isObject(json) || json.node_type !== 'DocumentObject') {\n throw new Error('DocumentObject requires node_type \"DocumentObject\"');\n }\n\n if (!Array.isArray(json.blocks)) {\n throw new Error('DocumentObject requires blocks array');\n }\n\n return {\n nodeType: 'DocumentObject',\n blocks: json.blocks.map((block) => parseBlock(asBlockJson(block), mode)),\n };\n}\n\nexport function createEmptyDocument(): DocumentNode {\n return {\n nodeType: 'DocumentObject',\n blocks: [],\n };\n}\n\nexport function createTextBlock(command: TextBlockNode['command'], value = ''): TextBlockNode {\n return {\n kind: 'textBlock',\n command,\n value,\n inlines: buildInlines(value),\n };\n}\n\nexport function createRawBlock(value = ''): RawBlockNode {\n return {\n kind: 'raw',\n command: '\\\\raw',\n value,\n };\n}\n\nexport function createListBlock(command: ListBlockNode['command'], items: string[] = []): ListBlockNode {\n return {\n kind: 'list',\n command,\n closing: closingForList(command),\n items: items.map((value) => ({ value, inlines: buildInlines(value), blocks: [] })),\n };\n}\n\nexport function createTableBlock(rows: string[][] = [], columns = ''): TableBlockNode {\n return {\n kind: 'table',\n command: '\\\\begin{tabular}',\n closing: '\\\\end{tabular}',\n columns,\n rows: rows.map((row) => row.map((cell) => buildInlines(cell))),\n };\n}\n\nexport function createImageBlock(value = '', options: Record<string, string> = {}): ImageBlockNode {\n return {\n kind: 'image',\n command: '\\\\includegraphics',\n value,\n options,\n };\n}\n\nexport function isSupportedDocumentCommand(command: string): command is DocumentCommand {\n return (\n TEXT_COMMANDS.has(command) ||\n LIST_COMMANDS.has(command) ||\n command === '\\\\begin{tabular}' ||\n command === '\\\\includegraphics' ||\n command === '\\\\raw'\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 { 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","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","import {\n BaseAstNode,\n ChainNode,\n CharNode,\n CommandNode,\n DelimiterNode,\n EnvNode,\n NumberNode,\n OperatorNode,\n} from '../ast/arabic_ast.js';\nimport {\n ATOMIC_COMMANDS,\n atomicCommandSpec,\n type AtomicCommandId,\n} from '../editor/atomicCommands.js';\nimport {\n ATOMIC_OPERATOR_COMMANDS,\n atomicOperatorCommandSpec,\n type AtomicOperatorCommandId,\n} from '../editor/atomicCommandsOperators.js';\nimport {\n buildInitialSyncMap,\n cloneEditorSession,\n createDelimiterNode,\n createEditorChain,\n createEditorNode,\n createEditorSession,\n createFracNode,\n createGridEnvNode,\n createSqrtNode,\n renderArabicLatexFromSession,\n} from '../editor/index.js';\nimport type {\n EditorChain,\n EditorNode,\n EditorSession,\n EnvColumnAlignment,\n GridEnvName,\n MatrixEnvStyle,\n} from '../editor/index.js';\nimport type { MathNode } from './types.js';\n\nexport type MathEditorAdapterResult =\n | { editable: true; session: EditorSession }\n | { editable: false; reason: string };\n\ntype NodeAdapterResult =\n | { editable: true; node: EditorNode }\n | { editable: false; reason: string };\n\ntype UnsupportedAdapterResult = { editable: false; reason: string };\n\nexport type MathNodeFromEditorResult =\n | { ok: true; math: MathNode }\n | { ok: false; reason: string };\n\nfunction commandIdForTex(tex: string): AtomicCommandId | null {\n for (const spec of Object.values(ATOMIC_COMMANDS)) {\n const renderTex = (spec as { arabicRenderTex?: string }).arabicRenderTex;\n if (spec.englishTex === tex || spec.arabicTex === tex || renderTex === tex) {\n return spec.id as AtomicCommandId;\n }\n }\n return null;\n}\n\nfunction operatorCommandIdForTex(tex: string): AtomicOperatorCommandId | null {\n for (const spec of Object.values(ATOMIC_OPERATOR_COMMANDS)) {\n if (spec.Tex === tex) {\n return spec.id as AtomicOperatorCommandId;\n }\n }\n return null;\n}\n\nfunction cloneChainWithFreshIds(chain: EditorChain): EditorChain {\n return structuredClone(chain);\n}\n\nfunction attachScripts(astNode: { superscript: ChainNode | null; subscript: ChainNode | null }, editorNode: EditorNode): UnsupportedAdapterResult | null {\n if (astNode.superscript) {\n const sup = chainToEditorChain(astNode.superscript);\n if (!sup.editable) {\n return sup;\n }\n editorNode.superscript = sup.chain;\n }\n if (astNode.subscript) {\n const sub = chainToEditorChain(astNode.subscript);\n if (!sub.editable) {\n return sub;\n }\n editorNode.subscript = sub.chain;\n }\n return null;\n}\n\ntype ChainAdapterResult =\n | { editable: true; chain: EditorChain }\n | { editable: false; reason: string };\n\nconst MATRIX_ENV_NAMES = new Set<GridEnvName>(['matrix', 'pmatrix', 'bmatrix', 'Bmatrix', 'vmatrix', 'Vmatrix']);\n\nfunction isGridEnvName(value: string): value is GridEnvName {\n return MATRIX_ENV_NAMES.has(value as GridEnvName) || value === 'array' || value === 'aligned';\n}\n\nfunction isMatrixEnvName(value: GridEnvName): value is MatrixEnvStyle {\n return MATRIX_ENV_NAMES.has(value);\n}\n\nfunction parseEnvOpening(opening: string): { envName: GridEnvName; alignments?: EnvColumnAlignment[] } | null {\n const match = /^\\\\begin\\{([^}]+)\\}(?:\\{([lcr]+)\\})?$/.exec(opening);\n if (!match) {\n return null;\n }\n\n const envName = match[1] ?? '';\n if (!isGridEnvName(envName)) {\n return null;\n }\n\n if (envName === 'array') {\n const spec = match[2] ?? 'c';\n return {\n envName,\n alignments: spec.split('').map((alignment) => alignment as EnvColumnAlignment),\n };\n }\n\n return { envName };\n}\n\nfunction splitEnvLine(line: ChainNode): ChainNode[] {\n const cells: ChainNode[] = [];\n let current: BaseAstNode[] = [];\n for (const node of line.chain) {\n if (node instanceof OperatorNode && node.expr === '&') {\n cells.push(new ChainNode(current));\n current = [];\n } else {\n current.push(node);\n }\n }\n cells.push(new ChainNode(current));\n return cells;\n}\n\nfunction envToEditorNode(node: EnvNode): NodeAdapterResult {\n const parsed = parseEnvOpening(node.opening);\n if (!parsed) {\n return { editable: false, reason: `بيئة رياضية غير مدعومة حاليا: ${node.opening}` };\n }\n\n const expectedClosing = `\\\\end{${parsed.envName}}`;\n if (node.closing !== expectedClosing) {\n return { editable: false, reason: `إغلاق بيئة رياضية غير مدعوم حاليا: ${node.closing}` };\n }\n\n const rowCells = node.lines.map(splitEnvLine);\n const rows = Math.max(1, rowCells.length);\n const columns = Math.max(1, ...rowCells.map((row) => row.length));\n const env = createGridEnvNode(parsed.envName, rows, columns, parsed.alignments);\n\n for (let rowIndex = 0; rowIndex < rows; rowIndex += 1) {\n const row = rowCells[rowIndex] ?? [];\n for (let columnIndex = 0; columnIndex < columns; columnIndex += 1) {\n const cell = chainToEditorChain(row[columnIndex] ?? new ChainNode());\n if (!cell.editable) {\n return cell;\n }\n env.matrixRows![rowIndex]![columnIndex] = cell.chain;\n }\n }\n\n if (parsed.envName === 'array') {\n env.columnAlignments = Array.from(\n { length: columns },\n (_, index) => parsed.alignments?.[index] ?? 'c',\n );\n }\n if (isMatrixEnvName(parsed.envName)) {\n env.matrixStyle = parsed.envName;\n }\n\n const scripts = attachScripts(node, env);\n return scripts ?? { editable: true, node: env };\n}\n\nfunction commandToEditorNode(node: CommandNode): NodeAdapterResult {\n if (node.name === '\\\\frac' && node.mandatoryArgs.length >= 2) {\n const frac = createFracNode();\n const numerator = chainToEditorChain(node.mandatoryArgs[0]!);\n const denominator = chainToEditorChain(node.mandatoryArgs[1]!);\n if (!numerator.editable) {\n return numerator;\n }\n if (!denominator.editable) {\n return denominator;\n }\n frac.numerator = numerator.chain;\n frac.denominator = denominator.chain;\n const scripts = attachScripts(node, frac);\n if (scripts) {\n return scripts;\n }\n return { editable: true, node: frac };\n }\n\n if ((node.name === '\\\\sqrt' || node.name === '\\\\arabsqrt') && node.mandatoryArgs.length >= 1) {\n const sqrt = createSqrtNode();\n const radicand = chainToEditorChain(node.mandatoryArgs[0]!);\n if (!radicand.editable) {\n return radicand;\n }\n sqrt.radicand = radicand.chain;\n if (node.optionalArgs[0]) {\n const rootIndex = chainToEditorChain(node.optionalArgs[0]);\n if (!rootIndex.editable) {\n return rootIndex;\n }\n sqrt.rootIndex = rootIndex.chain;\n }\n const scripts = attachScripts(node, sqrt);\n if (scripts) {\n return scripts;\n }\n return { editable: true, node: sqrt };\n }\n\n const atomicId = commandIdForTex(node.name);\n if (atomicId && node.optionalArgs.length === 0 && node.mandatoryArgs.length === 0) {\n const atomic = createEditorNode('atomicCommand', atomicId);\n const scripts = attachScripts(node, atomic);\n if (scripts) {\n return scripts;\n }\n return { editable: true, node: atomic };\n }\n\n const operatorId = operatorCommandIdForTex(node.name);\n if (operatorId && node.optionalArgs.length === 0 && node.mandatoryArgs.length === 0) {\n const atomicOperator = createEditorNode('atomicOperatorCommand', operatorId);\n const scripts = attachScripts(node, atomicOperator);\n if (scripts) {\n return scripts;\n }\n return { editable: true, node: atomicOperator };\n }\n\n return { editable: false, reason: `أمر رياضي غير مدعوم حاليا: ${node.name}` };\n}\n\nfunction astNodeToEditorNode(node: ChainNode['chain'][number]): NodeAdapterResult {\n if (node instanceof CharNode) {\n const editorNode = createEditorNode('char', node.expr);\n const scripts = attachScripts(node, editorNode);\n return scripts ?? { editable: true, node: editorNode };\n }\n if (node instanceof NumberNode) {\n const editorNode = createEditorNode('number', node.expr);\n const scripts = attachScripts(node, editorNode);\n return scripts ?? { editable: true, node: editorNode };\n }\n if (node instanceof OperatorNode) {\n return { editable: true, node: createEditorNode('operator', node.expr) };\n }\n if (node instanceof DelimiterNode) {\n const editorNode = createDelimiterNode(node.leftDelimExpr, node.rightDelimExpr);\n const inner = chainToEditorChain(node.innerExpr);\n if (!inner.editable) {\n return inner;\n }\n editorNode.innerExpr = inner.chain;\n const scripts = attachScripts(node, editorNode);\n return scripts ?? { editable: true, node: editorNode };\n }\n if (node instanceof CommandNode) {\n return commandToEditorNode(node);\n }\n if (node instanceof EnvNode) {\n return envToEditorNode(node);\n }\n return { editable: false, reason: `عقدة رياضية غير مدعومة حاليا: ${node.nodeType}` };\n}\n\nfunction chainToEditorChain(chain: ChainNode): ChainAdapterResult {\n const nodes: EditorNode[] = [];\n for (const astNode of chain.chain) {\n const converted = astNodeToEditorNode(astNode);\n if (!converted.editable) {\n return converted;\n }\n nodes.push(converted.node);\n }\n return { editable: true, chain: createEditorChain(nodes) };\n}\n\nexport function mathObjectToEditorSession(math: MathNode): MathEditorAdapterResult {\n if (math.lines.length !== 1) {\n return { editable: false, reason: 'تحرير المعادلات متعددة الأسطر داخل المستند غير مدعوم بعد' };\n }\n\n const english = chainToEditorChain(math.lines[0]!);\n if (!english.editable) {\n return english;\n }\n\n const arabic = cloneChainWithFreshIds(english.chain);\n const session = createEditorSession(english.chain, arabic, 'english');\n session.sync = buildInitialSyncMap(session.englishTree, session.arabicTree);\n return { editable: true, session: cloneEditorSession(session) };\n}\n\ntype AstNodeResult =\n | { ok: true; node: BaseAstNode }\n | { ok: false; reason: string };\n\ntype AstChainResult =\n | { ok: true; chain: ChainNode }\n | { ok: false; reason: string };\n\nfunction attachAstScripts(editorNode: EditorNode, astNode: BaseAstNode): AstNodeResult | null {\n if (editorNode.superscript) {\n const sup = editorChainToAstChain(editorNode.superscript);\n if (!sup.ok) {\n return sup;\n }\n astNode.superscript = sup.chain;\n }\n if (editorNode.subscript) {\n const sub = editorChainToAstChain(editorNode.subscript);\n if (!sub.ok) {\n return sub;\n }\n astNode.subscript = sub.chain;\n }\n return null;\n}\n\nfunction editorEnvOpening(node: EditorNode): { opening: string; closing: string } | null {\n const envName = node.envName ?? node.matrixStyle;\n if (!envName) {\n return null;\n }\n if (envName === 'array') {\n const spec = (node.columnAlignments ?? []).slice(0, node.matrixRows?.[0]?.length ?? 0).join('') || 'c';\n return { opening: `\\\\begin{array}{${spec}}`, closing: '\\\\end{array}' };\n }\n return { opening: `\\\\begin{${envName}}`, closing: `\\\\end{${envName}}` };\n}\n\nfunction editorEnvToAstNode(node: EditorNode): AstNodeResult {\n const wrapper = editorEnvOpening(node);\n if (!wrapper || !node.matrixRows) {\n return { ok: false, reason: 'بيئة رياضية غير مدعومة حاليا' };\n }\n const lines: ChainNode[] = [];\n for (const row of node.matrixRows) {\n const lineNodes: BaseAstNode[] = [];\n for (let columnIndex = 0; columnIndex < row.length; columnIndex += 1) {\n if (columnIndex > 0) {\n lineNodes.push(new OperatorNode('&'));\n }\n const cell = editorChainToAstChain(row[columnIndex]!);\n if (!cell.ok) {\n return cell;\n }\n lineNodes.push(...cell.chain.chain);\n }\n lines.push(new ChainNode(lineNodes));\n }\n const env = new EnvNode(wrapper.opening, lines, wrapper.closing);\n const scripts = attachAstScripts(node, env);\n return scripts ?? { ok: true, node: env };\n}\n\nfunction editorNodeToAstNode(node: EditorNode): AstNodeResult {\n let astNode: BaseAstNode;\n\n if (node.kind === 'char') {\n astNode = new CharNode(node.expr);\n } else if (node.kind === 'number') {\n astNode = new NumberNode(node.expr);\n } else if (node.kind === 'operator') {\n astNode = new OperatorNode(node.expr);\n } else if (node.kind === 'delimiter' && node.innerExpr) {\n const inner = editorChainToAstChain(node.innerExpr);\n if (!inner.ok) {\n return inner;\n }\n astNode = new DelimiterNode(node.leftDelimExpr, inner.chain, node.rightDelimExpr);\n } else if (node.kind === 'frac' && node.numerator && node.denominator) {\n const numerator = editorChainToAstChain(node.numerator);\n const denominator = editorChainToAstChain(node.denominator);\n if (!numerator.ok) {\n return numerator;\n }\n if (!denominator.ok) {\n return denominator;\n }\n astNode = new CommandNode('\\\\frac', [], [numerator.chain, denominator.chain]);\n } else if (node.kind === 'sqrt' && node.radicand) {\n const radicand = editorChainToAstChain(node.radicand);\n if (!radicand.ok) {\n return radicand;\n }\n const optionalArgs: ChainNode[] = [];\n if (node.rootIndex && node.rootIndex.nodes.length > 0) {\n const rootIndex = editorChainToAstChain(node.rootIndex);\n if (!rootIndex.ok) {\n return rootIndex;\n }\n optionalArgs.push(rootIndex.chain);\n }\n astNode = new CommandNode('\\\\sqrt', optionalArgs, [radicand.chain]);\n } else if (node.kind === 'atomicCommand') {\n const tex = atomicCommandSpec(node.expr)?.englishTex;\n if (!tex) {\n return { ok: false, reason: `أمر رياضي غير مدعوم حاليا: ${node.expr}` };\n }\n astNode = new CommandNode(tex);\n } else if (node.kind === 'atomicOperatorCommand') {\n const tex = atomicOperatorCommandSpec(node.expr)?.Tex;\n if (!tex) {\n return { ok: false, reason: `رمز رياضي غير مدعوم حاليا: ${node.expr}` };\n }\n astNode = new CommandNode(tex);\n } else if (node.kind === 'env') {\n return editorEnvToAstNode(node);\n } else {\n return { ok: false, reason: `عقدة رياضية غير مدعومة حاليا: ${node.kind}` };\n }\n\n const scripts = attachAstScripts(node, astNode);\n return scripts ?? { ok: true, node: astNode };\n}\n\nfunction editorChainToAstChain(chain: EditorChain): AstChainResult {\n const nodes: BaseAstNode[] = [];\n for (const editorNode of chain.nodes) {\n const converted = editorNodeToAstNode(editorNode);\n if (!converted.ok) {\n return converted;\n }\n nodes.push(converted.node);\n }\n return { ok: true, chain: new ChainNode(nodes) };\n}\n\nexport function mathNodeFromEditorSession(\n session: EditorSession,\n mathMode = '$',\n closing = '$',\n): MathNodeFromEditorResult {\n const converted = editorChainToAstChain(session.englishTree);\n if (!converted.ok) {\n return converted;\n }\n return {\n ok: true,\n math: {\n nodeType: 'MathObject',\n mathMode,\n lines: [converted.chain],\n closing,\n },\n };\n}\n\n/** Delimited Arabic TeX for document text/preview — matches `<ButexEditor />` arabic output. */\nexport function mathSourceFromEditorSession(\n session: EditorSession,\n mathMode = '$',\n closing = '$',\n): string {\n const inner = renderArabicLatexFromSession(session);\n if (mathMode === '$' || mathMode === '\\\\(') {\n return mathMode + inner + closing;\n }\n if (mathMode === '$$' || mathMode === '\\\\[') {\n if (!inner.includes('\\n')) {\n return `${mathMode}\\n${inner}\\n${closing}`;\n }\n return `${mathMode}\\n${inner.split('\\n').map((line) => ` ${line}`).join(' \\\\\\\\\\n')}\\n${closing}`;\n }\n return `${mathMode}\\n ${inner}\\n${closing}`;\n}\n\nexport function mathSourceWithReplacement(source: string, replacementInnerLatex: string): string {\n if (source.startsWith('$$') && source.endsWith('$$')) {\n return `$$${replacementInnerLatex}$$`;\n }\n if (source.startsWith('$') && source.endsWith('$')) {\n return `$${replacementInnerLatex}$`;\n }\n if (source.startsWith('\\\\(') && source.endsWith('\\\\)')) {\n return `\\\\(${replacementInnerLatex}\\\\)`;\n }\n if (source.startsWith('\\\\[') && source.endsWith('\\\\]')) {\n return `\\\\[${replacementInnerLatex}\\\\]`;\n }\n const begin = /^\\\\begin\\{([A-Za-z*]+)\\}/.exec(source);\n if (begin) {\n const opening = begin[0] ?? '';\n const closing = `\\\\end{${begin[1] ?? ''}}`;\n if (source.endsWith(closing)) {\n return `${opening}${replacementInnerLatex}${closing}`;\n }\n }\n return replacementInnerLatex;\n}\n","import { isDisplayMathNode, renderMathNodeLatex } from './mathObject.js';\nimport type {\n DocumentBlockNode,\n DocumentInline,\n DocumentNode,\n DocumentPreview,\n DocumentPreviewMathIsland,\n ImageBlockNode,\n ListBlockNode,\n TableBlockNode,\n TextBlockNode,\n} from './types.js';\n\nfunction renderInlineLatex(inline: DocumentInline): string {\n if (inline.kind === 'text') {\n return inline.text;\n }\n return inline.math ? renderMathNodeLatex(inline.math) : inline.source;\n}\n\nfunction renderInlinesLatex(inlines: DocumentInline[]): string {\n return inlines.map((inline) => renderInlineLatex(inline)).join('');\n}\n\nfunction renderTextBlockLatex(block: TextBlockNode): string {\n return `${block.command}{${renderInlinesLatex(block.inlines)}}`;\n}\n\nfunction indent(value: string): string {\n return value\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n}\n\nfunction renderListBlockLatex(block: ListBlockNode): string {\n const items = block.items\n .map((item) => {\n const nested = item.blocks.map((child) => '\\n' + indent(renderBlockLatex(child))).join('');\n return ` \\\\item ${renderInlinesLatex(item.inlines)}${nested}`;\n })\n .join('\\n');\n return `${block.command}\\n${items}\\n${block.closing}`;\n}\n\nfunction renderTableBlockLatex(block: TableBlockNode): string {\n const rows = block.rows\n .map((row) => ` ${row.map((cell) => renderInlinesLatex(cell)).join(' & ')}`)\n .join(' \\\\\\\\\\n');\n return `${block.command}{${block.columns}}\\n${rows}\\n${block.closing}`;\n}\n\nfunction renderImageOptions(block: ImageBlockNode): string {\n const entries = Object.entries(block.options);\n if (entries.length === 0) {\n return '';\n }\n return `[${entries.map(([key, value]) => `${key}=${value}`).join(',')}]`;\n}\n\nfunction renderBlockLatex(block: DocumentBlockNode): string {\n if (block.kind === 'textBlock') {\n return renderTextBlockLatex(block);\n }\n if (block.kind === 'list') {\n return renderListBlockLatex(block);\n }\n if (block.kind === 'table') {\n return renderTableBlockLatex(block);\n }\n if (block.kind === 'image') {\n return `${block.command}${renderImageOptions(block)}{${block.value}}`;\n }\n return block.value;\n}\n\nexport function renderDocumentLatex(document: DocumentNode): string {\n return document.blocks.map((block) => renderBlockLatex(block)).join('\\n\\n');\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;');\n}\n\nfunction renderPreviewInlines(\n inlines: DocumentInline[],\n islands: DocumentPreviewMathIsland[]\n): string {\n return inlines\n .map((inline) => {\n if (inline.kind === 'text') {\n return escapeHtml(inline.text);\n }\n\n const tex = inline.math ? renderMathNodeLatex(inline.math) : inline.source;\n const id = `math-${String(islands.length)}`;\n const display = inline.math\n ? isDisplayMathNode(inline.math)\n : inline.source.startsWith('$$') || inline.source.startsWith('\\\\[') || inline.source.startsWith('\\\\begin{');\n islands.push({ id, tex, display });\n return `<span class=\"butex-document-math-island\" data-math-id=\"${id}\" data-math-display=\"${display ? 'true' : 'false'}\">${escapeHtml(tex)}</span>`;\n })\n .join('');\n}\n\nfunction renderPreviewBlock(block: DocumentBlockNode, islands: DocumentPreviewMathIsland[]): string {\n if (block.kind === 'textBlock') {\n const tagByCommand: Record<TextBlockNode['command'], string> = {\n '\\\\section': 'h1',\n '\\\\subsection': 'h2',\n '\\\\subsubsection': 'h3',\n '\\\\paragraph': 'p',\n };\n const tag = tagByCommand[block.command];\n return `<${tag}>${renderPreviewInlines(block.inlines, islands)}</${tag}>`;\n }\n\n if (block.kind === 'list') {\n const tag = block.command === '\\\\begin{enumerate}' ? 'ol' : 'ul';\n const items = block.items\n .map((item) => {\n const nested = item.blocks.map((child) => renderPreviewBlock(child, islands)).join('');\n return `<li>${renderPreviewInlines(item.inlines, islands)}${nested}</li>`;\n })\n .join('');\n return `<${tag}>${items}</${tag}>`;\n }\n\n if (block.kind === 'table') {\n const rows = block.rows\n .map((row) => `<tr>${row.map((cell) => `<td>${renderPreviewInlines(cell, islands)}</td>`).join('')}</tr>`)\n .join('');\n return `<table><tbody>${rows}</tbody></table>`;\n }\n\n if (block.kind === 'image') {\n return `<img src=\"${escapeHtml(block.value)}\" alt=\"\" />`;\n }\n\n return `<pre>${escapeHtml(block.value)}</pre>`;\n}\n\nexport function buildDocumentPreview(document: DocumentNode): DocumentPreview {\n const mathIslands: DocumentPreviewMathIsland[] = [];\n const html = document.blocks.map((block) => renderPreviewBlock(block, mathIslands)).join('\\n');\n return { html, mathIslands };\n}\n","import { buildInlines } from './mathSpans.js';\nimport type {\n DocumentBlockNode,\n DocumentInline,\n DocumentNode,\n ImageBlockNode,\n ListBlockNode,\n ListItemNode,\n MathNode,\n RawBlockNode,\n TableBlockNode,\n TextBlockNode,\n} from './types.js';\nimport { renderMathNodeLatex } from './mathObject.js';\n\nexport type NewDocumentBlockKind =\n | 'section'\n | 'subsection'\n | 'subsubsection'\n | 'paragraph'\n | 'itemize'\n | 'enumerate'\n | 'table'\n | 'image'\n | 'raw';\n\nexport type DocumentMathTarget =\n | { scope: 'block'; blockIndex: number; spanIndex: number }\n | { scope: 'listItem'; blockIndex: number; itemIndex: number; spanIndex: number }\n | { scope: 'tableCell'; blockIndex: number; rowIndex: number; columnIndex: number; spanIndex: number };\n\nexport type DocumentInlineTarget =\n | { scope: 'block'; blockIndex: number }\n | { scope: 'listItem'; blockIndex: number; itemIndex: number }\n | { scope: 'tableCell'; blockIndex: number; rowIndex: number; columnIndex: number };\n\nfunction cloneDocument(document: DocumentNode): DocumentNode {\n return {\n nodeType: 'DocumentObject',\n blocks: document.blocks.map(cloneBlock),\n };\n}\n\nfunction cloneInlines(inlines: DocumentInline[]): DocumentInline[] {\n return inlines.map((inline) =>\n inline.kind === 'text'\n ? { kind: 'text', text: inline.text }\n : { kind: 'math', source: inline.source, math: inline.math },\n );\n}\n\nfunction cloneListItem(item: ListItemNode): ListItemNode {\n return {\n value: item.value,\n inlines: cloneInlines(item.inlines),\n blocks: item.blocks.map(cloneBlock),\n };\n}\n\nfunction cloneBlock(block: DocumentBlockNode): DocumentBlockNode {\n if (block.kind === 'textBlock') {\n return { ...block, inlines: cloneInlines(block.inlines) };\n }\n if (block.kind === 'list') {\n return { ...block, items: block.items.map(cloneListItem) };\n }\n if (block.kind === 'table') {\n return {\n ...block,\n rows: block.rows.map((row) => row.map((cell) => cloneInlines(cell))),\n };\n }\n if (block.kind === 'image') {\n return { ...block, options: { ...block.options } };\n }\n return { ...block };\n}\n\nfunction inlinesToValue(inlines: DocumentInline[]): string {\n return inlines.map((inline) => (inline.kind === 'text' ? inline.text : inline.source)).join('');\n}\n\nfunction textBlock(command: TextBlockNode['command'], value = ''): TextBlockNode {\n return { kind: 'textBlock', command, value, inlines: buildInlines(value) };\n}\n\nfunction listBlock(command: ListBlockNode['command']): ListBlockNode {\n return {\n kind: 'list',\n command,\n closing: command === '\\\\begin{itemize}' ? '\\\\end{itemize}' : '\\\\end{enumerate}',\n items: [{ value: '', inlines: buildInlines(''), blocks: [] }],\n };\n}\n\nfunction tableBlock(): TableBlockNode {\n return {\n kind: 'table',\n command: '\\\\begin{tabular}',\n closing: '\\\\end{tabular}',\n columns: 'cc',\n rows: [\n [buildInlines(''), buildInlines('')],\n [buildInlines(''), buildInlines('')],\n ],\n };\n}\n\nfunction imageBlock(): ImageBlockNode {\n return { kind: 'image', command: '\\\\includegraphics', value: '', options: {} };\n}\n\nfunction rawBlock(): RawBlockNode {\n return { kind: 'raw', command: '\\\\raw', value: '' };\n}\n\nexport function createDocumentBlock(kind: NewDocumentBlockKind): DocumentBlockNode {\n if (kind === 'section') {\n return textBlock('\\\\section');\n }\n if (kind === 'subsection') {\n return textBlock('\\\\subsection');\n }\n if (kind === 'subsubsection') {\n return textBlock('\\\\subsubsection');\n }\n if (kind === 'paragraph') {\n return textBlock('\\\\paragraph');\n }\n if (kind === 'itemize') {\n return listBlock('\\\\begin{itemize}');\n }\n if (kind === 'enumerate') {\n return listBlock('\\\\begin{enumerate}');\n }\n if (kind === 'table') {\n return tableBlock();\n }\n if (kind === 'image') {\n return imageBlock();\n }\n return rawBlock();\n}\n\nexport function addDocumentBlock(document: DocumentNode, kind: NewDocumentBlockKind): DocumentNode {\n const next = cloneDocument(document);\n next.blocks.push(createDocumentBlock(kind));\n return next;\n}\n\nexport function removeDocumentBlock(document: DocumentNode, blockIndex: number): DocumentNode {\n const next = cloneDocument(document);\n next.blocks.splice(blockIndex, 1);\n return next;\n}\n\nexport function moveDocumentBlock(document: DocumentNode, blockIndex: number, direction: -1 | 1): DocumentNode {\n const next = cloneDocument(document);\n const targetIndex = blockIndex + direction;\n if (blockIndex < 0 || targetIndex < 0 || blockIndex >= next.blocks.length || targetIndex >= next.blocks.length) {\n return document;\n }\n const [block] = next.blocks.splice(blockIndex, 1);\n if (!block) {\n return document;\n }\n next.blocks.splice(targetIndex, 0, block);\n return next;\n}\n\nexport function updateTextBlockValue(document: DocumentNode, blockIndex: number, value: string): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'textBlock') {\n return document;\n }\n block.value = value;\n block.inlines = buildInlines(value);\n return next;\n}\n\nexport function updateRawBlockValue(document: DocumentNode, blockIndex: number, value: string): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'raw') {\n return document;\n }\n block.value = value;\n return next;\n}\n\nexport function updateImageBlock(document: DocumentNode, blockIndex: number, value: string, options: Record<string, string>): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'image') {\n return document;\n }\n block.value = value;\n block.options = options;\n return next;\n}\n\nexport function updateListItemValue(document: DocumentNode, blockIndex: number, itemIndex: number, value: string): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'list' || !block.items[itemIndex]) {\n return document;\n }\n block.items[itemIndex].value = value;\n block.items[itemIndex].inlines = buildInlines(value);\n return next;\n}\n\nexport function addListItem(document: DocumentNode, blockIndex: number): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'list') {\n return document;\n }\n block.items.push({ value: '', inlines: buildInlines(''), blocks: [] });\n return next;\n}\n\nexport function removeListItem(document: DocumentNode, blockIndex: number, itemIndex: number): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'list' || block.items.length <= 1) {\n return document;\n }\n block.items.splice(itemIndex, 1);\n return next;\n}\n\nexport function addNestedListBlock(\n document: DocumentNode,\n blockIndex: number,\n itemIndex: number,\n kind: 'itemize' | 'enumerate',\n): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n const item = block?.kind === 'list' ? block.items[itemIndex] : null;\n if (!item) {\n return document;\n }\n item.blocks.push(createDocumentBlock(kind));\n return next;\n}\n\nexport function updateTableCell(document: DocumentNode, blockIndex: number, rowIndex: number, columnIndex: number, value: string): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'table' || !block.rows[rowIndex] || !block.rows[rowIndex][columnIndex]) {\n return document;\n }\n block.rows[rowIndex][columnIndex] = buildInlines(value);\n return next;\n}\n\nexport function updateTableColumns(document: DocumentNode, blockIndex: number, columns: string): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'table') {\n return document;\n }\n block.columns = columns;\n return next;\n}\n\nexport function addTableRow(document: DocumentNode, blockIndex: number): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'table') {\n return document;\n }\n const columns = Math.max(1, block.rows[0]?.length ?? 1);\n block.rows.push(Array.from({ length: columns }, () => buildInlines('')));\n return next;\n}\n\nexport function removeTableRow(document: DocumentNode, blockIndex: number): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'table' || block.rows.length <= 1) {\n return document;\n }\n block.rows.pop();\n return next;\n}\n\nexport function addTableColumn(document: DocumentNode, blockIndex: number): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'table') {\n return document;\n }\n for (const row of block.rows) {\n row.push(buildInlines(''));\n }\n block.columns += 'c';\n return next;\n}\n\nexport function removeTableColumn(document: DocumentNode, blockIndex: number): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[blockIndex];\n if (!block || block.kind !== 'table' || (block.rows[0]?.length ?? 0) <= 1) {\n return document;\n }\n for (const row of block.rows) {\n row.pop();\n }\n block.columns = block.columns.slice(0, -1);\n return next;\n}\n\nfunction mathInlineFromMathNode(math: MathNode): DocumentInline {\n return { kind: 'math', source: renderMathNodeLatex(math), math };\n}\n\nfunction replaceInlinesMath(inlines: DocumentInline[], spanIndex: number, source: string, math: MathNode | null = null): DocumentInline[] {\n let mathIndex = 0;\n return inlines.map((inline) => {\n if (inline.kind !== 'math') {\n return inline;\n }\n if (mathIndex === spanIndex) {\n mathIndex += 1;\n return { kind: 'math', source, math };\n }\n mathIndex += 1;\n return inline;\n });\n}\n\nfunction replaceMathSpan(document: DocumentNode, target: DocumentMathTarget, source: string, math: MathNode | null): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[target.blockIndex];\n if (!block) {\n return document;\n }\n\n if (target.scope === 'block' && block.kind === 'textBlock') {\n block.inlines = replaceInlinesMath(block.inlines, target.spanIndex, source, math);\n block.value = inlinesToValue(block.inlines);\n return next;\n }\n\n if (target.scope === 'listItem' && block.kind === 'list') {\n const item: ListItemNode | undefined = block.items[target.itemIndex];\n if (!item) {\n return document;\n }\n item.inlines = replaceInlinesMath(item.inlines, target.spanIndex, source, math);\n item.value = inlinesToValue(item.inlines);\n return next;\n }\n\n if (target.scope === 'tableCell' && block.kind === 'table') {\n const cell = block.rows[target.rowIndex]?.[target.columnIndex];\n if (!cell) {\n return document;\n }\n block.rows[target.rowIndex]![target.columnIndex] = replaceInlinesMath(cell, target.spanIndex, source, math);\n return next;\n }\n\n return document;\n}\n\nexport function replaceMathSpanSource(document: DocumentNode, target: DocumentMathTarget, source: string): DocumentNode {\n return replaceMathSpan(document, target, source, null);\n}\n\nexport function replaceMathSpanFromEditor(\n document: DocumentNode,\n target: DocumentMathTarget,\n math: MathNode,\n source?: string,\n): DocumentNode {\n return replaceMathSpan(document, target, source ?? renderMathNodeLatex(math), math);\n}\n\nfunction insertInlineAt(inlines: DocumentInline[], index: number, inline: DocumentInline): DocumentInline[] {\n const value = inlinesToValue(inlines);\n const safeIndex = Math.max(0, Math.min(index, value.length));\n const before = value.slice(0, safeIndex);\n const after = value.slice(safeIndex);\n const next: DocumentInline[] = [];\n if (before) {\n next.push(...buildInlines(before));\n }\n next.push(inline);\n if (after) {\n next.push(...buildInlines(after));\n }\n return next;\n}\n\nexport function insertMathSpanFromEditor(\n document: DocumentNode,\n target: DocumentInlineTarget,\n insertAt: number,\n math: MathNode,\n source?: string,\n): DocumentNode {\n const next = cloneDocument(document);\n const block = next.blocks[target.blockIndex];\n if (!block) {\n return document;\n }\n const inline: DocumentInline = source\n ? { kind: 'math', source, math }\n : mathInlineFromMathNode(math);\n\n if (target.scope === 'block' && block.kind === 'textBlock') {\n block.inlines = insertInlineAt(block.inlines, insertAt, inline);\n block.value = inlinesToValue(block.inlines);\n return next;\n }\n\n if (target.scope === 'listItem' && block.kind === 'list') {\n const item = block.items[target.itemIndex];\n if (!item) {\n return document;\n }\n item.inlines = insertInlineAt(item.inlines, insertAt, inline);\n item.value = inlinesToValue(item.inlines);\n return next;\n }\n\n if (target.scope === 'tableCell' && block.kind === 'table') {\n const cell = block.rows[target.rowIndex]?.[target.columnIndex];\n if (!cell) {\n return document;\n }\n block.rows[target.rowIndex]![target.columnIndex] = insertInlineAt(cell, insertAt, inline);\n return next;\n }\n\n return document;\n}\n\nexport function documentInlineText(inlines: DocumentInline[]): string {\n return inlinesToValue(inlines);\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","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","/**\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","export const DOCUMENT_WIDGET_CSS = `\n.butex-document-widget {\n --butex-document-bg: var(--butex-bg, #f8fafc);\n --butex-document-fg: var(--butex-fg, #0f172a);\n --butex-document-muted: var(--butex-muted, #64748b);\n --butex-document-panel: var(--butex-panel, #ffffff);\n --butex-document-border: var(--butex-border, #e2e8f0);\n --butex-document-accent: var(--butex-accent, #0d9488);\n --butex-document-accent-hover: var(--butex-accent-hover, #0f766e);\n --butex-document-accent-bg: var(--butex-toolbar-hover-bg, rgba(13, 148, 136, 0.08));\n --butex-document-focus-shadow: var(--butex-focus-shadow, rgba(13, 148, 136, 0.16));\n --butex-document-danger: var(--butex-danger, #dc2626);\n --butex-document-error: var(--butex-error, #b91c1c);\n --butex-document-error-bg: var(--butex-error-bg, #fef2f2);\n --butex-document-shadow: var(--butex-shadow-md, 0 4px 14px rgba(15, 23, 42, 0.08));\n --butex-document-preview-bg: var(--butex-preview-bg, #ffffff);\n --butex-document-preview-fg: var(--butex-preview-fg, var(--butex-document-fg));\n --butex-document-preview-font: \"Amiri\", \"Noto Serif Arabic\", Georgia, \"Times New Roman\", serif;\n --butex-document-drawer-bg: var(--butex-document-panel);\n --butex-document-input-bg: #ffffff;\n --butex-document-input-border: var(--butex-document-border);\n --butex-document-table-border: var(--butex-document-border);\n --butex-document-raw-bg: #f8fafc;\n --butex-document-math-bg: var(--butex-document-accent-bg);\n --butex-document-math-border: rgba(13, 148, 136, 0.35);\n --butex-document-dev-bg: var(--butex-dev-bg, #fffbeb);\n --butex-document-dev-border: var(--butex-dev-border, #fcd34d);\n --butex-document-dev-code-bg: var(--butex-dev-inset-bg, #ffffff);\n --butex-document-dev-code-fg: var(--butex-dev-inset-fg, var(--butex-document-fg));\n box-sizing: border-box;\n color: var(--butex-document-fg);\n direction: rtl;\n font-family: ui-sans-serif, system-ui, \"Segoe UI\", Tahoma, Arial, sans-serif;\n line-height: 1.45;\n}\n\n.butex-document-widget *,\n.butex-document-widget *::before,\n.butex-document-widget *::after {\n box-sizing: inherit;\n}\n\n.butex-document-widget__shell {\n display: grid;\n gap: 12px;\n}\n\n.butex-document-widget__toolbar,\n.butex-document-widget__panel {\n border: 1px solid var(--butex-document-border);\n border-radius: 10px;\n background: var(--butex-document-panel);\n box-shadow: var(--butex-document-shadow);\n}\n\n.butex-document-widget__toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 8px;\n}\n\n.butex-document-widget button {\n border: 1px solid var(--butex-document-border);\n border-radius: 8px;\n background: var(--butex-document-panel);\n color: var(--butex-document-fg);\n cursor: pointer;\n min-height: 32px;\n padding: 0 10px;\n transition: border-color 0.14s ease, background 0.14s ease, box-shadow 0.14s ease, color 0.14s ease;\n}\n\n.butex-document-widget button[aria-pressed=\"true\"],\n.butex-document-widget button:hover {\n border-color: var(--butex-document-accent);\n background: var(--butex-document-accent-bg);\n}\n\n.butex-document-widget button:focus-visible,\n.butex-document-widget input:focus-visible,\n.butex-document-widget textarea:focus-visible {\n border-color: var(--butex-document-accent);\n box-shadow: 0 0 0 3px var(--butex-document-focus-shadow);\n outline: none;\n}\n\n.butex-document-widget button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.butex-document-widget__panel {\n padding: 16px;\n}\n\n.butex-document-widget__layout {\n align-items: start;\n display: grid;\n gap: 12px;\n grid-template-columns: minmax(0, 1fr) minmax(280px, 0.9fr);\n transition: grid-template-columns 0.22s ease;\n}\n\n.butex-document-widget__layout--editor-open.butex-document-widget__layout--preview-open {\n grid-template-columns: minmax(0, 1fr) minmax(280px, 0.9fr);\n}\n\n.butex-document-widget__layout--editor-open.butex-document-widget__layout--preview-closed {\n grid-template-columns: minmax(0, 1fr) minmax(0, 0fr);\n}\n\n.butex-document-widget__layout--editor-closed.butex-document-widget__layout--preview-open {\n grid-template-columns: minmax(0, 0fr) minmax(0, 1fr);\n}\n\n.butex-document-widget__layout--editor-closed.butex-document-widget__layout--preview-closed {\n grid-template-columns: minmax(0, 1fr) minmax(0, 0fr);\n}\n\n.butex-document-widget__layout--preview-open {\n grid-template-columns: minmax(0, 1fr) minmax(280px, 0.9fr);\n}\n\n.butex-document-widget__layout--preview-closed {\n grid-template-columns: minmax(0, 1fr) minmax(0, 0fr);\n}\n\n.butex-document-widget__editor-panel,\n.butex-document-widget__preview-panel {\n min-width: 0;\n opacity: 1;\n overflow-x: hidden;\n overflow-y: auto;\n transform: translateX(0);\n transition:\n opacity 0.18s ease,\n transform 0.22s ease,\n padding 0.22s ease,\n border-width 0.22s ease,\n box-shadow 0.22s ease;\n}\n\n.butex-document-widget__layout--editor-closed .butex-document-widget__editor-panel {\n border-width: 0;\n box-shadow: none;\n opacity: 0;\n padding-inline: 0;\n pointer-events: none;\n transform: translateX(10px);\n visibility: hidden;\n}\n\n.butex-document-widget__layout--preview-closed .butex-document-widget__preview-panel {\n border-width: 0;\n box-shadow: none;\n opacity: 0;\n padding-inline: 0;\n pointer-events: none;\n transform: translateX(-10px);\n visibility: hidden;\n}\n\n.butex-document-widget__block {\n border: 1px solid var(--butex-document-border);\n border-radius: 9px;\n background: var(--butex-document-panel);\n display: grid;\n gap: 10px;\n margin-bottom: 12px;\n padding: 10px;\n}\n\n.butex-document-widget__block-head,\n.butex-document-widget__row-actions,\n.butex-document-widget__drawer-head {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n justify-content: space-between;\n}\n\n.butex-document-widget__row-actions {\n justify-content: flex-start;\n}\n\n.butex-document-widget__field {\n display: grid;\n gap: 6px;\n}\n\n.butex-document-widget__field--short {\n max-width: 220px;\n}\n\n.butex-document-widget input,\n.butex-document-widget textarea {\n background: var(--butex-document-input-bg);\n border: 1px solid var(--butex-document-input-border);\n border-radius: 8px;\n color: var(--butex-document-fg);\n font: inherit;\n min-height: 34px;\n padding: 7px 9px;\n}\n\n.butex-document-widget textarea {\n min-height: 72px;\n resize: vertical;\n}\n\n.butex-document-widget__chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.butex-document-widget .butex-document-widget__math-chip {\n background: var(--butex-document-math-bg);\n border-color: var(--butex-document-math-border);\n direction: ltr;\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n min-height: 28px;\n unicode-bidi: isolate;\n}\n\n.butex-document-widget__list-editor,\n.butex-document-widget__image-editor {\n display: grid;\n gap: 10px;\n}\n\n.butex-document-widget__list-item {\n border-inline-start: 3px solid var(--butex-document-border);\n display: grid;\n gap: 8px;\n padding-inline-start: 10px;\n}\n\n.butex-document-widget__nested {\n display: grid;\n gap: 6px;\n}\n\n.butex-document-widget__nested-block {\n border: 1px dashed var(--butex-document-border);\n border-radius: 8px;\n color: var(--butex-document-muted);\n background: var(--butex-document-bg);\n padding: 8px;\n}\n\n.butex-document-widget__table-editor {\n display: grid;\n gap: 10px;\n}\n\n.butex-document-widget__table-grid {\n display: grid;\n gap: 6px;\n overflow-x: auto;\n}\n\n.butex-document-widget__table-row {\n display: flex;\n gap: 6px;\n}\n\n.butex-document-widget__table-cell {\n display: grid;\n gap: 4px;\n min-width: 120px;\n}\n\n.butex-document-widget__placeholder,\n.butex-document-widget__error {\n margin: 0;\n color: var(--butex-document-muted);\n}\n\n.butex-document-widget__error {\n border: 1px solid var(--butex-document-error);\n border-radius: 8px;\n background: var(--butex-document-error-bg);\n color: var(--butex-document-error);\n padding: 10px;\n}\n\n.butex-document-widget__preview {\n background: var(--butex-document-preview-bg);\n color: var(--butex-document-preview-fg);\n direction: rtl;\n font-family: var(--butex-document-preview-font);\n font-size: 1.08rem;\n line-height: 1.9;\n}\n\n.butex-document-widget__preview h1,\n.butex-document-widget__preview h2,\n.butex-document-widget__preview h3,\n.butex-document-widget__preview p,\n.butex-document-widget__preview li,\n.butex-document-widget__preview td {\n overflow: visible;\n}\n\n.butex-document-widget__preview h1,\n.butex-document-widget__preview h2,\n.butex-document-widget__preview h3,\n.butex-document-widget__preview p {\n margin: 0 0 12px;\n}\n\n.butex-document-widget__preview ul,\n.butex-document-widget__preview ol {\n margin: 0 0 12px;\n padding-inline-start: 24px;\n}\n\n.butex-document-widget__preview img {\n display: block;\n height: auto;\n max-width: 100%;\n}\n\n.butex-document-widget__preview table {\n border-collapse: collapse;\n margin: 12px 0;\n width: 100%;\n}\n\n.butex-document-widget__preview td {\n border: 1px solid var(--butex-document-table-border);\n padding: 6px 8px;\n}\n\n.butex-document-widget .butex-document-math-island {\n direction: ltr;\n display: inline-block;\n line-height: normal;\n margin: 0 2px;\n overflow: visible;\n padding: 0;\n unicode-bidi: isolate;\n vertical-align: middle;\n}\n\n.butex-document-widget .butex-document-math-island mjx-container {\n display: inline-block !important;\n line-height: normal;\n margin: 0;\n overflow: visible;\n vertical-align: middle;\n}\n\n.butex-document-widget .butex-document-math-island[data-math-display=\"true\"] {\n display: block;\n margin: 10px 0;\n overflow: visible;\n text-align: center;\n}\n\n.butex-document-widget .butex-document-math-island[data-math-display=\"true\"] mjx-container {\n display: block !important;\n margin-inline: auto;\n}\n\n.butex-document-widget__preview-error {\n border: 1px solid var(--butex-document-error);\n border-radius: 8px;\n background: var(--butex-document-error-bg);\n color: var(--butex-document-error);\n margin: 12px 0 0;\n padding: 8px 10px;\n}\n\n.butex-document-widget__dev {\n border: 1px solid var(--butex-document-dev-border);\n border-radius: 10px;\n background: var(--butex-document-dev-bg);\n box-shadow: var(--butex-document-shadow);\n display: grid;\n gap: 10px;\n padding: 12px;\n}\n\n.butex-document-widget__dev pre {\n border: 1px solid var(--butex-document-dev-border);\n border-radius: 8px;\n background: var(--butex-document-dev-code-bg);\n color: var(--butex-document-dev-code-fg);\n direction: ltr;\n margin: 0;\n max-height: 220px;\n overflow: auto;\n padding: 10px;\n text-align: left;\n white-space: pre-wrap;\n}\n\n.butex-document-widget__drawer {\n background: var(--butex-document-drawer-bg);\n border-inline-start: 1px solid var(--butex-document-border);\n bottom: 0;\n box-shadow: -8px 0 22px rgba(15, 23, 42, 0.12);\n display: grid;\n gap: 12px;\n max-width: min(680px, 94vw);\n overflow: auto;\n padding: 14px;\n position: fixed;\n right: 0;\n top: 0;\n width: 640px;\n z-index: 30;\n}\n\n@media (max-width: 900px) {\n .butex-document-widget__layout {\n grid-template-columns: 1fr;\n }\n\n .butex-document-widget__layout--preview-closed .butex-document-widget__preview-panel {\n display: none;\n }\n\n .butex-document-widget__layout--editor-closed .butex-document-widget__editor-panel {\n display: none;\n }\n\n .butex-document-widget__drawer {\n border-inline-start: 0;\n left: 0;\n max-width: none;\n width: 100%;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .butex-document-widget__layout,\n .butex-document-widget__editor-panel,\n .butex-document-widget__preview-panel {\n transition: none;\n }\n}\n`;\n\nexport function injectBuTeXDocumentStyles(doc?: Document): void {\n const d = doc ?? (typeof document !== 'undefined' ? document : undefined);\n if (!d) {\n return;\n }\n\n const id = 'butex-document-widget-styles';\n if (d.getElementById(id)) {\n return;\n }\n\n const style = d.createElement('style');\n style.id = id;\n style.textContent = DOCUMENT_WIDGET_CSS;\n d.head.appendChild(style);\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AAA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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["useEffect","useRef","useState","node","parseChain","isObject","value","targetRow","next","clamp","clamp","document","document","document","node","ButexEditor","selectedDigitForm","_","Fragment","jsx","jsxs","ButexDocumentPreviewPanel","useRef","document","useState","useEffect"]}