@drghaliasri/butex 5.2.0 → 5.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/document2.d.mts +20 -2
- package/dist/document2.d.ts +20 -2
- package/dist/document2.js +113 -18
- package/dist/document2.js.map +1 -1
- package/dist/document2.mjs +106 -18
- package/dist/document2.mjs.map +1 -1
- package/dist/react-document2.js +106 -19
- package/dist/react-document2.js.map +1 -1
- package/dist/react-document2.mjs +106 -19
- package/dist/react-document2.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react-document2/ArticleMetaPanel.tsx","../src/document2/ids.ts","../src/editor/digits.ts","../src/document2/articleMeta.ts","../src/document2/citations.ts","../src/ast/commands/index.ts","../src/ast/arabic_ast.ts","../src/document/mathObject.ts","../src/document2/labels.ts","../src/document2/inlineScanner.ts","../src/document2/importJson.ts","../src/editor/atomicCommands.ts","../src/editor/atomicCommandsOperators.ts","../src/editor/factory.ts","../src/editor/divideOperator.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/derivativeTemplates.ts","../src/editor/uiLocale.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/normalizeCharImport.ts","../src/document/mathEditorAdapter.ts","../src/document2/mathBridge.ts","../src/document2/commands.ts","../src/document2/arabicPreamble.ts","../src/document2/exportLatex.ts","../src/document2/history.ts","../src/document2/blockSelection.ts","../src/document2/previewModel.ts","../src/react-document2/uiMessages.ts","../src/react-document2/ButexDocumentEditor2.tsx","../src/react-document2/InlineField.tsx","../src/react-document2/CiteChip.tsx","../src/react-document2/MathIsland.tsx","../src/mathjax/svgPatcher.ts","../src/mathjax/renderIsland.ts","../src/react-document2/MathChip.tsx","../src/react-document2/RefChip.tsx","../src/uiLocale.ts","../src/react-document2/BlockEditor.tsx","../src/react-document2/CitePickerPopover.tsx","../src/react-document2/DocumentInsertToolbar.tsx","../src/react-document2/TableInsertPopover.tsx","../src/react-document2/DocumentPreview.tsx","../src/react-document2/EquationDrawer.tsx","../src/react/ButexEditor.tsx","../src/react/widgetChromeCss.ts","../src/react-document2/LabelsPanel.tsx","../src/react-document2/ReferencesPanel.tsx","../src/react-document2/RefPickerPopover.tsx","../src/react-document2/editorFocus.ts","../src/react-document2/documentWidgetCss2.ts"],"sourcesContent":["import { useEffect, useId, useRef, useState, type RefObject } from 'react';\nimport {\n BUTEX_BASMALA,\n BUTEX_CLOSING_HAMDALA,\n HIJRI_MONTH_IDS,\n HIJRI_YEAR_MAX,\n HIJRI_YEAR_MIN,\n formatHijriDate,\n hijriMonthLabel,\n type Document2Meta,\n type Document2MetaProp,\n type HijriMonthId,\n} from '../document2/index.js';\nimport { formatDigits } from '../editor/digits.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type ArticleMetaPanelProps = {\n meta: Document2Meta;\n uiLocale?: ButexUiLocale;\n digitForm?: DigitFormId;\n panelRef?: RefObject<HTMLElement | null>;\n onChange: (patch: Document2MetaProp) => void;\n};\n\nconst HIJRI_DAYS = Array.from({ length: 30 }, (_, index) => index + 1);\nconst HIJRI_YEARS = Array.from(\n { length: HIJRI_YEAR_MAX - HIJRI_YEAR_MIN + 1 },\n (_, index) => HIJRI_YEAR_MIN + index,\n);\n\ntype HijriMenuOption = { value: string; label: string };\n\nfunction HijriDateMenu({\n label,\n value,\n options,\n onChange,\n}: {\n label: string;\n value: string;\n options: HijriMenuOption[];\n onChange: (value: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const listId = useId();\n const selected = options.find((option) => option.value === value) ?? options[0];\n\n useEffect(() => {\n if (!open) {\n return;\n }\n const onPointerDown = (event: MouseEvent): void => {\n if (!rootRef.current?.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', onPointerDown);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('mousedown', onPointerDown);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n return (\n <div className=\"butex-document2-widget__hijri-menu\" ref={rootRef}>\n <span className=\"butex-document2-widget__visually-hidden\">{label}</span>\n <button\n type=\"button\"\n className=\"butex-document2-widget__hijri-menu-trigger\"\n aria-label={label}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={listId}\n onClick={() => setOpen((current) => !current)}\n >\n {selected?.label ?? value}\n </button>\n {open ? (\n <ul id={listId} className=\"butex-document2-widget__hijri-menu-list\" role=\"listbox\" aria-label={label}>\n {options.map((option) => {\n const isSelected = option.value === value;\n return (\n <li key={option.value} role=\"presentation\">\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n className=\"butex-document2-widget__hijri-menu-option\"\n onClick={() => {\n onChange(option.value);\n setOpen(false);\n }}\n >\n {option.label}\n </button>\n </li>\n );\n })}\n </ul>\n ) : null}\n </div>\n );\n}\n\nexport function ArticleMetaPanel({\n meta,\n uiLocale = 'ar',\n digitForm = 'arabicIndic',\n panelRef,\n onChange,\n}: ArticleMetaPanelProps) {\n const messages = document2Messages(uiLocale);\n const titleInputRef = useRef<HTMLInputElement>(null);\n const localRef = useRef<HTMLElement>(null);\n const resolvedRef = panelRef ?? localRef;\n const formattedDate = formatHijriDate(meta.date, { locale: uiLocale, digitForm });\n\n return (\n <section\n ref={resolvedRef}\n className=\"butex-document2-widget__article-meta\"\n aria-label={messages.articleMetaTitle}\n >\n <header className=\"butex-document2-widget__article-meta-header\">\n <strong>{messages.articleMetaTitle}</strong>\n <span className=\"butex-document2-widget__article-meta-badge\">{messages.articleMetaBadge}</span>\n </header>\n\n <p className=\"butex-document2-widget__article-meta-fixed\" dir=\"rtl\">\n {BUTEX_BASMALA}\n </p>\n\n <div className=\"butex-document2-widget__article-meta-grid\">\n <label className=\"butex-document2-widget__article-meta-field\">\n <span>{messages.articleTitle}</span>\n <input\n ref={titleInputRef}\n value={meta.title}\n onChange={(event) => {\n const value = event.currentTarget.value;\n onChange({ title: value });\n }}\n />\n </label>\n\n <label className=\"butex-document2-widget__article-meta-field\">\n <span>{messages.articleAuthors}</span>\n <textarea\n rows={2}\n value={meta.authors}\n onChange={(event) => {\n const value = event.currentTarget.value;\n onChange({ authors: value });\n }}\n />\n </label>\n\n <div className=\"butex-document2-widget__article-meta-field\">\n <span>{messages.articleDate}</span>\n <div className=\"butex-document2-widget__article-meta-date\">\n <HijriDateMenu\n label={messages.articleDay}\n value={String(meta.date.day)}\n options={HIJRI_DAYS.map((day) => ({\n value: String(day),\n label: formatDigits(String(day), digitForm),\n }))}\n onChange={(value) => onChange({ date: { day: Number(value) } })}\n />\n <HijriDateMenu\n label={messages.articleMonth}\n value={meta.date.month}\n options={HIJRI_MONTH_IDS.map((month) => ({\n value: month,\n label: hijriMonthLabel(month, uiLocale),\n }))}\n onChange={(value) => onChange({ date: { month: value as HijriMonthId } })}\n />\n <HijriDateMenu\n label={messages.articleYear}\n value={String(meta.date.year)}\n options={HIJRI_YEARS.map((year) => ({\n value: String(year),\n label: formatDigits(String(year), digitForm),\n }))}\n onChange={(value) => onChange({ date: { year: Number(value) } })}\n />\n </div>\n <p className=\"butex-document2-widget__article-meta-date-preview\" dir={uiLocale === 'ar' ? 'rtl' : 'ltr'}>\n {formattedDate}\n </p>\n </div>\n\n <label className=\"butex-document2-widget__article-meta-field\">\n <span>{messages.articleAbstract}</span>\n <textarea\n rows={3}\n value={meta.abstract}\n onChange={(event) => {\n const value = event.currentTarget.value;\n onChange({ abstract: value });\n }}\n />\n </label>\n </div>\n\n <p className=\"butex-document2-widget__article-meta-fixed\" dir=\"rtl\">\n {BUTEX_CLOSING_HAMDALA}\n </p>\n </section>\n );\n}\n\nexport function focusArticleMetaPanel(panel: HTMLElement | null): void {\n if (!panel) {\n return;\n }\n panel.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n const input = panel.querySelector('input');\n if (input instanceof HTMLInputElement) {\n input.focus();\n }\n}\n","let nextId = 1;\n\nexport function document2Id(prefix: string): string {\n const id = `${prefix}_${String(nextId)}`;\n nextId += 1;\n return id;\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 { formatDigits } from '../editor/digits.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport type { Document2HijriDate, Document2Meta, HijriMonthId } from './types.js';\n\nexport const BUTEX_BASMALA =\n 'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ وَالصَّلَاةُ وَالسَّلَامُ عَلَىٰ رَسُولِ اللَّهِ ﷺ';\n\nexport const BUTEX_CLOSING_HAMDALA = 'الْحَمْدُ لِلَّهِ نَفَعَنَا بِعِلْمِهِ';\n\nfunction escapeButexTextArg(text: string): string {\n return text.replace(/\\\\/g, '\\\\textbackslash{}').replace(/[{}]/g, '\\\\$&');\n}\n\n/** Display-math body using BuTeX Diwani (for MathJax preview islands). */\nexport function butexDiwaniDisplayTex(text: string): string {\n return `\\\\butexdiwani{${escapeButexTextArg(text)}}`;\n}\n\n/** Full display equation for XeLaTeX export. */\nexport function butexDiwaniDisplayLatex(text: string): string {\n return `\\\\[\\n${butexDiwaniDisplayTex(text)}\\n\\\\]`;\n}\nexport const HIJRI_YEAR_MIN = 1400;\nexport const HIJRI_YEAR_MAX = 1500;\n\nexport const HIJRI_MONTH_IDS: HijriMonthId[] = [\n 'محرم',\n 'صفر',\n 'ربيع الأول',\n 'ربيع الآخر',\n 'جمادى الأولى',\n 'جمادى الآخرة',\n 'رجب',\n 'شعبان',\n 'رمضان',\n 'شوال',\n 'ذو القعدة',\n 'ذو الحجة',\n];\n\nconst HIJRI_MONTH_LABELS_EN: Record<HijriMonthId, string> = {\n محرم: 'Muharram',\n صفر: 'Safar',\n 'ربيع الأول': 'Rabiʻ I',\n 'ربيع الآخر': 'Rabiʻ II',\n 'جمادى الأولى': 'Jumada I',\n 'جمادى الآخرة': 'Jumada II',\n رجب: 'Rajab',\n شعبان: 'Shaʻban',\n رمضان: 'Ramadan',\n شوال: 'Shawwal',\n 'ذو القعدة': 'Dhul Qaʻdah',\n 'ذو الحجة': 'Dhul Hijjah',\n};\n\n/** Legacy Latin month ids from earlier drafts — accepted on import only. */\nconst LEGACY_LATIN_MONTH: Record<string, HijriMonthId> = {\n muharram: 'محرم',\n safar: 'صفر',\n rabiAwwal: 'ربيع الأول',\n rabiThani: 'ربيع الآخر',\n jumadaAwwal: 'جمادى الأولى',\n jumadaThani: 'جمادى الآخرة',\n rajab: 'رجب',\n shaban: 'شعبان',\n ramadan: 'رمضان',\n shawwal: 'شوال',\n dhulQadah: 'ذو القعدة',\n dhulHijjah: 'ذو الحجة',\n};\n\nexport const DEFAULT_HIJRI_DATE: Document2HijriDate = {\n day: 1,\n month: 'محرم',\n year: 1448,\n};\n\nexport function hijriMonthLabel(month: HijriMonthId, locale: ButexUiLocale = 'ar'): string {\n return locale === 'en' ? HIJRI_MONTH_LABELS_EN[month] : month;\n}\n\nexport function emptyDocument2Meta(): Document2Meta {\n return {\n title: '',\n authors: '',\n date: { ...DEFAULT_HIJRI_DATE },\n abstract: '',\n };\n}\n\nfunction clampInt(value: number, min: number, max: number): number {\n if (!Number.isFinite(value)) {\n return min;\n }\n return Math.min(max, Math.max(min, Math.trunc(value)));\n}\n\nfunction isHijriMonthId(value: unknown): value is HijriMonthId {\n return typeof value === 'string' && (HIJRI_MONTH_IDS as string[]).includes(value);\n}\n\nfunction resolveHijriMonthId(value: unknown): HijriMonthId {\n if (isHijriMonthId(value)) {\n return value;\n }\n if (typeof value === 'string' && value in LEGACY_LATIN_MONTH) {\n return LEGACY_LATIN_MONTH[value]!;\n }\n return DEFAULT_HIJRI_DATE.month;\n}\n\nexport function normalizeDocument2HijriDate(value: unknown): Document2HijriDate {\n if (typeof value !== 'object' || value === null) {\n return { ...DEFAULT_HIJRI_DATE };\n }\n const raw = value as Record<string, unknown>;\n const day = clampInt(typeof raw.day === 'number' ? raw.day : Number(raw.day), 1, 30);\n const year = clampInt(typeof raw.year === 'number' ? raw.year : Number(raw.year), HIJRI_YEAR_MIN, HIJRI_YEAR_MAX);\n const month = resolveHijriMonthId(raw.month);\n return { day, month, year };\n}\n\nexport function normalizeDocument2Meta(value: unknown): Document2Meta {\n if (typeof value !== 'object' || value === null) {\n return emptyDocument2Meta();\n }\n const raw = value as Record<string, unknown>;\n return {\n title: typeof raw.title === 'string' ? raw.title : '',\n authors: typeof raw.authors === 'string' ? raw.authors : '',\n date: normalizeDocument2HijriDate(raw.date),\n abstract: typeof raw.abstract === 'string' ? raw.abstract : '',\n };\n}\n\nexport type Document2MetaProp = Partial<Omit<Document2Meta, 'date'>> & {\n date?: Partial<Document2HijriDate>;\n};\n\n/** Prop fills gaps; JSON wins only when the key is present on the JSON object. */\nexport function mergeDocument2Meta(fromJson: unknown, fromProp?: Document2MetaProp): Document2Meta {\n const fromPropMeta: Document2Meta = {\n title: typeof fromProp?.title === 'string' ? fromProp.title : '',\n authors: typeof fromProp?.authors === 'string' ? fromProp.authors : '',\n abstract: typeof fromProp?.abstract === 'string' ? fromProp.abstract : '',\n date: fromProp?.date\n ? normalizeDocument2HijriDate({ ...DEFAULT_HIJRI_DATE, ...fromProp.date })\n : { ...DEFAULT_HIJRI_DATE },\n };\n if (typeof fromJson !== 'object' || fromJson === null) {\n return fromPropMeta;\n }\n const json = fromJson as Record<string, unknown>;\n return {\n title: 'title' in json && typeof json.title === 'string' ? json.title : fromPropMeta.title,\n authors: 'authors' in json && typeof json.authors === 'string' ? json.authors : fromPropMeta.authors,\n abstract: 'abstract' in json && typeof json.abstract === 'string' ? json.abstract : fromPropMeta.abstract,\n date: 'date' in json ? normalizeDocument2HijriDate(json.date) : fromPropMeta.date,\n };\n}\n\n/** For live Document2Node meta: prop fills empty title/authors/abstract; date patch merges. */\nexport function fillDocument2MetaGaps(current: Document2Meta, fromProp?: Document2MetaProp): Document2Meta {\n if (!fromProp) {\n return cloneDocument2Meta(current);\n }\n return {\n title: current.title.trim().length > 0 ? current.title : typeof fromProp.title === 'string' ? fromProp.title : current.title,\n authors:\n current.authors.trim().length > 0\n ? current.authors\n : typeof fromProp.authors === 'string'\n ? fromProp.authors\n : current.authors,\n abstract:\n current.abstract.trim().length > 0\n ? current.abstract\n : typeof fromProp.abstract === 'string'\n ? fromProp.abstract\n : current.abstract,\n date: fromProp.date\n ? normalizeDocument2HijriDate({ ...current.date, ...fromProp.date })\n : { ...current.date },\n };\n}\n\nexport function document2HasMaketitle(meta: Document2Meta): boolean {\n return meta.title.trim().length > 0 || meta.authors.trim().length > 0;\n}\n\nexport function document2HasAbstract(meta: Document2Meta): boolean {\n return meta.abstract.trim().length > 0;\n}\n\nexport function document2HasTitleStack(meta: Document2Meta): boolean {\n return document2HasMaketitle(meta) || document2HasAbstract(meta);\n}\n\nexport type FormatHijriDateOptions = {\n locale?: ButexUiLocale;\n digitForm?: DigitFormId;\n};\n\nexport function formatHijriDate(date: Document2HijriDate, options: FormatHijriDateOptions | ButexUiLocale = 'ar'): string {\n const opts: FormatHijriDateOptions = typeof options === 'string' ? { locale: options } : options;\n const locale = opts.locale ?? 'ar';\n const digitForm: DigitFormId =\n opts.digitForm ?? (locale === 'en' ? 'western' : 'arabicIndic');\n const month = hijriMonthLabel(date.month, locale);\n const day = formatDigits(String(date.day), digitForm);\n const year = formatDigits(String(date.year), digitForm);\n if (locale === 'en') {\n return `${day} ${month} ${year} AH`;\n }\n return `${day} ${month} ${year}هـ`;\n}\n\nexport function cloneDocument2Meta(meta: Document2Meta): Document2Meta {\n return {\n title: meta.title,\n authors: meta.authors,\n date: { ...meta.date },\n abstract: meta.abstract,\n };\n}\n","import { formatDigits } from '../editor/digits.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { FormatCiteLabelOptions, Reference2, Reference2Json } from './types.js';\nimport { document2Id } from './ids.js';\n\nexport function referenceNumberMap(references: Array<Pick<Reference2, 'key'>>): Map<string, number> {\n const map = new Map<string, number>();\n references.forEach((reference, index) => {\n if (!map.has(reference.key)) {\n map.set(reference.key, index + 1);\n }\n });\n return map;\n}\n\nexport function resolveCiteNumbers(keys: string[], references: Array<Pick<Reference2, 'key'>>): Array<number | null> {\n const map = referenceNumberMap(references);\n return keys.map((key) => map.get(key) ?? null);\n}\n\nexport function formatCiteLabel(\n keys: string[],\n references: Array<Pick<Reference2, 'key'>>,\n options: FormatCiteLabelOptions = {},\n): string {\n const documentDirection = options.documentDirection ?? 'rtl';\n const digitForm: DigitFormId = options.digitForm ?? (documentDirection === 'rtl' ? 'arabicIndic' : 'western');\n const numbers = resolveCiteNumbers(keys, references).map((value) => (value === null ? '?' : String(value)));\n const display = documentDirection === 'rtl' ? [...numbers].reverse() : numbers;\n const separator = documentDirection === 'rtl' ? '،' : ', ';\n const body = display.map((part) => formatDigits(part, digitForm)).join(separator);\n return `[${body}]`;\n}\n\nexport function formatBibliographyNumber(index: number, options: FormatCiteLabelOptions = {}): string {\n const documentDirection = options.documentDirection ?? 'rtl';\n const digitForm: DigitFormId = options.digitForm ?? (documentDirection === 'rtl' ? 'arabicIndic' : 'western');\n return formatDigits(String(index), digitForm);\n}\n\nexport function parseCiteKeys(source: string): string[] {\n const match = /^\\\\cite\\{([^}]*)\\}$/.exec(source.trim());\n if (!match) {\n return [];\n }\n return (match[1] ?? '')\n .split(',')\n .map((key) => key.trim())\n .filter((key) => key.length > 0);\n}\n\nexport function citeTokenLatex(keys: string[]): string {\n return `\\\\cite{${keys.join(',')}}`;\n}\n\nexport function referenceFromJson(json: Reference2Json): Reference2 {\n return {\n id: document2Id('ref'),\n key: json.key,\n authors: typeof json.authors === 'string' ? json.authors : '',\n title: typeof json.title === 'string' ? json.title : '',\n year: typeof json.year === 'string' ? json.year : '',\n url: typeof json.url === 'string' ? json.url : '',\n venue: typeof json.venue === 'string' ? json.venue : '',\n };\n}\n\nexport function createEmptyReference2(partial: Partial<Reference2Json> = {}): Reference2 {\n return referenceFromJson({\n key: partial.key ?? `ref${String(Date.now()).slice(-4)}`,\n authors: partial.authors,\n title: partial.title,\n year: partial.year,\n url: partial.url,\n venue: partial.venue,\n });\n}\n\nexport function bibliographyEntryLatex(reference: Reference2): string {\n const parts = [reference.authors, reference.title, reference.venue, reference.year].filter((part) => part.trim().length > 0);\n const body = parts.join(', ');\n const url = reference.url.trim().length > 0 ? ` \\\\url{${reference.url}}` : '';\n return `\\\\bibitem{${reference.key}} ${body}${url}`.trim();\n}\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 { formatDigits } from '../editor/digits.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type {\n Document2Block,\n Document2Direction,\n Document2Node,\n FormatCiteLabelOptions,\n ImageBlock2,\n InlineField2,\n MathToken2,\n TableBlock2,\n} from './types.js';\n\nexport type Document2LabelKind = 'fig' | 'tab' | 'eq';\n\nexport type Document2LabelEntry = {\n key: string;\n kind: Document2LabelKind;\n caption: string;\n /** Block id for fig/tab, or math token id for eq. */\n ownerId: string;\n number: number;\n};\n\nexport type FloatMetaPatch = {\n centered?: boolean;\n captionEnabled?: boolean;\n caption?: string;\n labelEnabled?: boolean;\n label?: string;\n};\n\nexport function defaultFloatMeta(): {\n centered: true;\n captionEnabled: false;\n caption: '';\n labelEnabled: false;\n label: '';\n} {\n return {\n centered: true,\n captionEnabled: false,\n caption: '',\n labelEnabled: false,\n label: '',\n };\n}\n\nexport function parseFloatMetaFromJson(json: {\n caption?: string;\n label?: string;\n caption_enabled?: boolean;\n label_enabled?: boolean;\n centered?: boolean;\n}): {\n centered: boolean;\n captionEnabled: boolean;\n caption: string;\n labelEnabled: boolean;\n label: string;\n} {\n const caption = typeof json.caption === 'string' ? json.caption : '';\n const label = typeof json.label === 'string' ? json.label : '';\n return {\n centered: json.centered !== false,\n captionEnabled: json.caption_enabled === true || (typeof json.caption_enabled !== 'boolean' && caption.length > 0),\n caption,\n labelEnabled: json.label_enabled === true || (typeof json.label_enabled !== 'boolean' && label.trim().length > 0),\n label,\n };\n}\n\nexport function parseRefKeys(source: string): { keys: string[]; refCommand: 'ref' | 'eqref' } {\n const eqref = /^\\\\eqref\\{([^}]*)\\}$/.exec(source.trim());\n if (eqref) {\n return {\n refCommand: 'eqref',\n keys: (eqref[1] ?? '')\n .split(',')\n .map((key) => key.trim())\n .filter((key) => key.length > 0),\n };\n }\n const ref = /^\\\\ref\\{([^}]*)\\}$/.exec(source.trim());\n if (ref) {\n return {\n refCommand: 'ref',\n keys: (ref[1] ?? '')\n .split(',')\n .map((key) => key.trim())\n .filter((key) => key.length > 0),\n };\n }\n return { keys: [], refCommand: 'ref' };\n}\n\nexport function refTokenLatex(keys: string[], refCommand: 'ref' | 'eqref'): string {\n const command = refCommand === 'eqref' ? '\\\\eqref' : '\\\\ref';\n return `${command}{${keys.join(',')}}`;\n}\n\n/** Collect enabled labels in document order, numbering per kind. */\nexport function collectDocument2Labels(document: Document2Node): Document2LabelEntry[] {\n const entries: Document2LabelEntry[] = [];\n const counters: Record<Document2LabelKind, number> = { fig: 0, tab: 0, eq: 0 };\n\n function pushEqFromField(tokens: MathToken2[] | InlineField2['tokens']): void {\n for (const token of tokens) {\n if (token.kind !== 'math') {\n continue;\n }\n if (token.display && token.labelEnabled && token.label && token.label.trim().length > 0) {\n counters.eq += 1;\n entries.push({\n key: token.label.trim(),\n kind: 'eq',\n caption: '',\n ownerId: token.id,\n number: counters.eq,\n });\n }\n }\n }\n\n function walk(blocks: Document2Block[]): void {\n for (const block of blocks) {\n if (block.kind === 'image' && block.labelEnabled && block.label.trim().length > 0) {\n counters.fig += 1;\n entries.push({\n key: block.label.trim(),\n kind: 'fig',\n caption: block.captionEnabled ? block.caption : '',\n ownerId: block.id,\n number: counters.fig,\n });\n }\n if (block.kind === 'table') {\n if (block.labelEnabled && block.label.trim().length > 0) {\n counters.tab += 1;\n entries.push({\n key: block.label.trim(),\n kind: 'tab',\n caption: block.captionEnabled ? block.caption : '',\n ownerId: block.id,\n number: counters.tab,\n });\n }\n for (const row of block.rows) {\n for (const cell of row) {\n pushEqFromField(cell.tokens);\n }\n }\n }\n if (block.kind === 'textBlock') {\n pushEqFromField(block.field.tokens);\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n pushEqFromField(item.field.tokens);\n walk(item.blocks);\n }\n }\n }\n }\n\n walk(document.blocks);\n return entries;\n}\n\nexport function labelNumberMap(document: Document2Node): Map<string, { kind: Document2LabelKind; number: number }> {\n const map = new Map<string, { kind: Document2LabelKind; number: number }>();\n for (const entry of collectDocument2Labels(document)) {\n if (!map.has(entry.key)) {\n map.set(entry.key, { kind: entry.kind, number: entry.number });\n }\n }\n return map;\n}\n\nexport function formatRefLabel(\n keys: string[],\n document: Document2Node,\n refCommand: 'ref' | 'eqref',\n options: FormatCiteLabelOptions = {},\n): string {\n const documentDirection: Document2Direction = options.documentDirection ?? 'rtl';\n const digitForm: DigitFormId = options.digitForm ?? (documentDirection === 'rtl' ? 'arabicIndic' : 'western');\n const map = labelNumberMap(document);\n const parts = keys.map((key) => {\n const hit = map.get(key);\n if (!hit) {\n return '?';\n }\n return formatDigits(String(hit.number), digitForm);\n });\n const body = parts.join(documentDirection === 'rtl' ? '،' : ', ');\n if (refCommand === 'eqref') {\n return `(${body})`;\n }\n return body;\n}\n\nexport function stripDisplayMathDelimiters(source: string): string {\n const trimmed = source.trim();\n if (trimmed.startsWith('\\\\[') && trimmed.endsWith('\\\\]')) {\n return trimmed.slice(2, -2).trim();\n }\n if (trimmed.startsWith('$$') && trimmed.endsWith('$$')) {\n return trimmed.slice(2, -2).trim();\n }\n if (trimmed.startsWith('\\\\begin{equation}') && trimmed.endsWith('\\\\end{equation}')) {\n return trimmed.slice('\\\\begin{equation}'.length, -'\\\\end{equation}'.length).trim();\n }\n return trimmed;\n}\n\nexport function applyFloatMetaPatch<T extends ImageBlock2 | TableBlock2>(block: T, patch: FloatMetaPatch): void {\n if (typeof patch.centered === 'boolean') {\n block.centered = patch.centered;\n }\n if (typeof patch.captionEnabled === 'boolean') {\n block.captionEnabled = patch.captionEnabled;\n }\n if (typeof patch.caption === 'string') {\n block.caption = patch.caption;\n }\n if (typeof patch.labelEnabled === 'boolean') {\n block.labelEnabled = patch.labelEnabled;\n }\n if (typeof patch.label === 'string') {\n block.label = patch.label;\n }\n}\n","import type { DetectedInlineSpan2, DetectedMathSpan2 } from './types.js';\nimport { parseCiteKeys } from './citations.js';\nimport { parseRefKeys } from './labels.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 environmentSpan(value: string, start: number): DetectedMathSpan2 | 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 { start, end, source: value.slice(start, end), opening, closing, display: true };\n}\n\nfunction citeSpan(value: string, start: number): DetectedInlineSpan2 | null {\n if (!value.startsWith('\\\\cite{', start) || isEscaped(value, start)) {\n return null;\n }\n const openBrace = start + '\\\\cite'.length;\n if (value[openBrace] !== '{') {\n return null;\n }\n let depth = 0;\n for (let i = openBrace; i < value.length; i += 1) {\n const char = value[i];\n if (char === '{' && !isEscaped(value, i)) {\n depth += 1;\n continue;\n }\n if (char === '}' && !isEscaped(value, i)) {\n depth -= 1;\n if (depth === 0) {\n const end = i + 1;\n const source = value.slice(start, end);\n return { kind: 'cite', start, end, source, keys: parseCiteKeys(source) };\n }\n }\n }\n return null;\n}\n\nfunction refSpan(value: string, start: number): DetectedInlineSpan2 | null {\n const eqrefPrefix = '\\\\eqref{';\n const refPrefix = '\\\\ref{';\n let refCommand: 'ref' | 'eqref' = 'ref';\n let prefix = refPrefix;\n if (value.startsWith(eqrefPrefix, start) && !isEscaped(value, start)) {\n refCommand = 'eqref';\n prefix = eqrefPrefix;\n } else if (value.startsWith(refPrefix, start) && !isEscaped(value, start)) {\n refCommand = 'ref';\n prefix = refPrefix;\n } else {\n return null;\n }\n\n const openBrace = start + prefix.length - 1;\n if (value[openBrace] !== '{') {\n return null;\n }\n let depth = 0;\n for (let i = openBrace; i < value.length; i += 1) {\n const char = value[i];\n if (char === '{' && !isEscaped(value, i)) {\n depth += 1;\n continue;\n }\n if (char === '}' && !isEscaped(value, i)) {\n depth -= 1;\n if (depth === 0) {\n const end = i + 1;\n const source = value.slice(start, end);\n const parsed = parseRefKeys(source);\n return { kind: 'ref', start, end, source, keys: parsed.keys, refCommand };\n }\n }\n }\n return null;\n}\n\nfunction mathSpanAt(value: string, i: number): DetectedMathSpan2 | null {\n if (value.startsWith('\\\\begin{', i)) {\n return environmentSpan(value, i);\n }\n\n if (value.startsWith('\\\\(', i)) {\n const close = value.indexOf('\\\\)', i + 2);\n if (close >= 0) {\n const end = close + 2;\n return { start: i, end, source: value.slice(i, end), opening: '\\\\(', closing: '\\\\)', display: false };\n }\n }\n\n if (value.startsWith('\\\\[', i)) {\n const close = value.indexOf('\\\\]', i + 2);\n if (close >= 0) {\n const end = close + 2;\n return { start: i, end, source: value.slice(i, end), opening: '\\\\[', closing: '\\\\]', display: true };\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 return { start: i, end, source: value.slice(i, end), opening: '$$', closing: '$$', display: true };\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 return { start: i, end, source: value.slice(i, end), opening: '$', closing: '$', display: false };\n }\n }\n\n return null;\n}\n\n/** Math-only spans (used for math_objects alignment counts). */\nexport function detectMathSpans2(value: string): DetectedMathSpan2[] {\n return detectInlineSpans2(value)\n .filter((span): span is DetectedInlineSpan2 & { kind: 'math' } => span.kind === 'math')\n .map(({ kind: _kind, ...span }) => span);\n}\n\n/** Left-to-right math + \\\\cite + \\\\ref/\\\\eqref spans without overlap. */\nexport function detectInlineSpans2(value: string): DetectedInlineSpan2[] {\n const spans: DetectedInlineSpan2[] = [];\n let i = 0;\n\n while (i < value.length) {\n const cite = citeSpan(value, i);\n if (cite) {\n spans.push(cite);\n i = cite.end;\n continue;\n }\n\n const ref = refSpan(value, i);\n if (ref) {\n spans.push(ref);\n i = ref.end;\n continue;\n }\n\n const math = mathSpanAt(value, i);\n if (math) {\n spans.push({ kind: 'math', ...math });\n i = math.end;\n continue;\n }\n\n i += 1;\n }\n\n return spans;\n}\n","import { fromMathObjectJson } from '../document/mathObject.js';\nimport { normalizeDocument2Meta, emptyDocument2Meta } from './articleMeta.js';\nimport { referenceFromJson } from './citations.js';\nimport { document2Id } from './ids.js';\nimport { detectInlineSpans2, detectMathSpans2 } from './inlineScanner.js';\nimport { parseFloatMetaFromJson } from './labels.js';\nimport type {\n BibliographyBlock2,\n Document2Block,\n Document2BlockJson,\n Document2Diagnostic,\n Document2ListItemJson,\n Document2Node,\n Document2ParseMode,\n ImageBlock2,\n ImportDocument2Options,\n InlineField2,\n InlineToken2,\n ListBlock2,\n ListItem2,\n MathObject2Json,\n RawBlock2,\n Reference2,\n Reference2Json,\n TableBlock2,\n TextBlock2,\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 requireString(value: unknown, message: string): string {\n if (typeof value !== 'string') {\n throw new Error(message);\n }\n return value;\n}\n\nfunction isRecordOfStrings(value: unknown): value is Record<string, string> {\n return isObject(value) && Object.values(value).every((entry) => typeof entry === 'string');\n}\n\nfunction asBlockJson(value: unknown): Document2BlockJson {\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 Document2BlockJson;\n}\n\nfunction pushDiagnostic(diagnostics: Document2Diagnostic[], options: ImportDocument2Options, path: string, message: string): void {\n if (options.strict) {\n throw new Error(message);\n }\n diagnostics.push({ code: 'math_alignment', message, path });\n}\n\nfunction parseReferences(json: unknown): Reference2[] {\n if (!Array.isArray(json)) {\n return [];\n }\n const references: Reference2[] = [];\n for (const entry of json) {\n if (!isObject(entry) || typeof entry.key !== 'string' || entry.key.trim().length === 0) {\n continue;\n }\n references.push(\n referenceFromJson({\n key: entry.key.trim(),\n authors: typeof entry.authors === 'string' ? entry.authors : undefined,\n title: typeof entry.title === 'string' ? entry.title : undefined,\n year: typeof entry.year === 'string' ? entry.year : undefined,\n url: typeof entry.url === 'string' ? entry.url : undefined,\n venue: typeof entry.venue === 'string' ? entry.venue : undefined,\n } satisfies Reference2Json),\n );\n }\n return references;\n}\n\nexport function createInlineField2(\n value = '',\n mathObjects: MathObject2Json[] = [],\n options: ImportDocument2Options = {},\n path = '$',\n diagnostics: Document2Diagnostic[] = [],\n): InlineField2 {\n const mode: Document2ParseMode = options.mode ?? 'english';\n const spans = detectInlineSpans2(value);\n const mathSpans = spans.filter((span) => span.kind === 'math');\n const tokens: InlineToken2[] = [];\n let index = 0;\n let mathObjectIndex = 0;\n\n if (mathObjects.length > 0 && mathObjects.length !== mathSpans.length) {\n pushDiagnostic(diagnostics, options, path, `math_objects count mismatch: detected ${String(mathSpans.length)}, got ${String(mathObjects.length)}`);\n }\n\n for (const span of spans) {\n if (span.start > index) {\n tokens.push({ id: document2Id('text'), kind: 'text', text: value.slice(index, span.start) });\n }\n\n if (span.kind === 'cite') {\n tokens.push({\n id: document2Id('cite'),\n kind: 'cite',\n keys: span.keys.length > 0 ? span.keys : [],\n });\n index = span.end;\n continue;\n }\n\n if (span.kind === 'ref') {\n tokens.push({\n id: document2Id('ref'),\n kind: 'ref',\n keys: span.keys.length > 0 ? span.keys : [],\n refCommand: span.refCommand,\n });\n index = span.end;\n continue;\n }\n\n const mathJson = mathObjects[mathObjectIndex];\n mathObjectIndex += 1;\n if (mathJson && (mathJson.math_mode !== span.opening || mathJson.closing !== span.closing)) {\n pushDiagnostic(diagnostics, options, path, 'math_objects order mismatch');\n }\n\n if (mathJson && mathJson.math_mode === span.opening && mathJson.closing === span.closing) {\n tokens.push({\n id: document2Id('math'),\n kind: 'math',\n display: span.display,\n opening: span.opening,\n closing: span.closing,\n source: span.source,\n sourceSide: mode,\n math: fromMathObjectJson(mathJson, mode),\n editable: true,\n sourceOwner: 'imported-structured',\n });\n } else {\n tokens.push({\n id: document2Id('math'),\n kind: 'math',\n display: span.display,\n opening: span.opening,\n closing: span.closing,\n source: span.source,\n math: null,\n editable: false,\n reason: 'هذه المعادلة محفوظة كنص خام فقط حاليا',\n sourceOwner: 'raw',\n });\n }\n\n index = span.end;\n }\n\n if (index < value.length || tokens.length === 0) {\n tokens.push({ id: document2Id('text'), kind: 'text', text: value.slice(index) });\n }\n\n return { id: document2Id('field'), tokens };\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 parseTextBlock(json: Document2BlockJson, options: ImportDocument2Options, path: string, diagnostics: Document2Diagnostic[]): TextBlock2 {\n const value = requireString(json.value, `${json.command} requires string value`);\n return {\n id: document2Id('block'),\n kind: 'textBlock',\n command: json.command as TextBlock2['command'],\n field: createInlineField2(value, json.math_objects ?? [], options, `${path}.value`, diagnostics),\n ...(json.centered === true ? { centered: true } : {}),\n };\n}\n\nfunction parseListItem(json: Document2ListItemJson, options: ImportDocument2Options, path: string, diagnostics: Document2Diagnostic[]): ListItem2 {\n const value = requireString(json.value, 'Document list item requires string value');\n const blocksJson = Array.isArray(json.blocks) ? json.blocks : [];\n return {\n id: document2Id('item'),\n field: createInlineField2(value, json.math_objects ?? [], options, `${path}.value`, diagnostics),\n blocks: blocksJson.map((block, index) => parseBlock(asBlockJson(block), options, `${path}.blocks[${String(index)}]`, diagnostics)),\n };\n}\n\nfunction parseListBlock(json: Document2BlockJson, options: ImportDocument2Options, path: string, diagnostics: Document2Diagnostic[]): ListBlock2 {\n if (!Array.isArray(json.items)) {\n throw new Error(`${json.command} requires items array`);\n }\n const command = json.command as ListBlock2['command'];\n const closing = closingForList(command);\n return {\n id: document2Id('block'),\n kind: 'list',\n command,\n closing,\n items: json.items.map((item, index) => parseListItem(item, options, `${path}.items[${String(index)}]`, diagnostics)),\n };\n}\n\nfunction parseTableBlock(json: Document2BlockJson, options: ImportDocument2Options, path: string, diagnostics: Document2Diagnostic[]): TableBlock2 {\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, rowIndex) => {\n if (!Array.isArray(row)) {\n throw new Error('\\\\begin{tabular} rows must be arrays');\n }\n return row.map((cell, columnIndex) => {\n const value = requireString(cell, '\\\\begin{tabular} cells must be strings');\n const spanCount = detectMathSpans2(value).length;\n const cellMathObjects = mathObjects.slice(mathObjectIndex, mathObjectIndex + spanCount);\n mathObjectIndex += spanCount;\n return createInlineField2(value, cellMathObjects, options, `${path}.rows[${String(rowIndex)}][${String(columnIndex)}]`, diagnostics);\n });\n });\n\n if (mathObjects.length > 0 && mathObjects.length !== mathObjectIndex) {\n pushDiagnostic(diagnostics, options, path, `math_objects count mismatch: detected ${String(mathObjectIndex)}, got ${String(mathObjects.length)}`);\n }\n\n return {\n id: document2Id('block'),\n kind: 'table',\n command: '\\\\begin{tabular}',\n closing: '\\\\end{tabular}',\n columns: typeof json.columns === 'string' ? json.columns : '',\n rows,\n ...parseFloatMetaFromJson(json),\n };\n}\n\nfunction parseImageBlock(json: Document2BlockJson): ImageBlock2 {\n const assetId = typeof json.asset_id === 'string' && json.asset_id.length > 0 ? json.asset_id : undefined;\n const value =\n assetId !== undefined\n ? typeof json.value === 'string'\n ? json.value\n : ''\n : requireString(json.value, '\\\\includegraphics requires string value');\n return {\n id: document2Id('block'),\n kind: 'image',\n command: '\\\\includegraphics',\n value,\n ...(assetId !== undefined ? { assetId } : {}),\n options: isRecordOfStrings(json.options) ? json.options : {},\n ...parseFloatMetaFromJson(json),\n };\n}\n\nfunction parseRawBlock(json: Document2BlockJson): RawBlock2 {\n return {\n id: document2Id('block'),\n kind: 'raw',\n command: '\\\\raw',\n value: typeof json.value === 'string' ? json.value : '',\n };\n}\n\nfunction parseBibliographyBlock(): BibliographyBlock2 {\n return {\n id: document2Id('block'),\n kind: 'bibliography',\n command: '\\\\begin{thebibliography}',\n closing: '\\\\end{thebibliography}',\n };\n}\n\nfunction parseBlock(json: Document2BlockJson, options: ImportDocument2Options, path: string, diagnostics: Document2Diagnostic[]): Document2Block {\n if (TEXT_COMMANDS.has(json.command)) {\n return parseTextBlock(json, options, path, diagnostics);\n }\n if (LIST_COMMANDS.has(json.command)) {\n return parseListBlock(json, options, path, diagnostics);\n }\n if (json.command === '\\\\begin{tabular}') {\n return parseTableBlock(json, options, path, diagnostics);\n }\n if (json.command === '\\\\includegraphics') {\n return parseImageBlock(json);\n }\n if (json.command === '\\\\begin{thebibliography}' || json.command === '\\\\bibliography') {\n return parseBibliographyBlock();\n }\n if (json.command === '\\\\raw') {\n return parseRawBlock(json);\n }\n return {\n id: document2Id('block'),\n kind: 'raw',\n command: '\\\\raw',\n value: typeof json.value === 'string' ? json.value : json.command,\n };\n}\n\nexport function fromDocumentJson2(json: unknown, options: ImportDocument2Options = {}): Document2Node {\n if (!isObject(json) || json.node_type !== 'DocumentObject') {\n throw new Error('DocumentObject requires node_type \"DocumentObject\"');\n }\n if (!Array.isArray(json.blocks)) {\n throw new Error('DocumentObject requires blocks array');\n }\n\n const diagnostics: Document2Diagnostic[] = [];\n return {\n nodeType: 'DocumentObject',\n meta: normalizeDocument2Meta(json.meta),\n references: parseReferences(json.references),\n blocks: json.blocks.map((block, index) => parseBlock(asBlockJson(block), options, `$.blocks[${String(index)}]`, diagnostics)),\n diagnostics,\n };\n}\n\nexport function createEmptyDocument2(): Document2Node {\n return {\n nodeType: 'DocumentObject',\n meta: emptyDocument2Meta(),\n references: [],\n blocks: [],\n diagnostics: [],\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 ////////////////////// Derivatives ////////////////////////////////\n ad: {\n id: 'ad',\n category: 'derivative',\n englishTex: '\\\\mathrm{d}',\n englishLabel: 'd',\n arabicTex: '\\\\ad',\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' | 'derivative';\nexport type SpacingDirection = 'positive' | 'negative';\n\nexport type AtomicCommandSpec = (typeof ATOMIC_COMMANDS)[AtomicCommandId] & {\n arabicRenderTex?: string;\n englishLabel?: 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 coloneqq: {\n id: 'coloneqq',\n category: 'operators1',\n Tex: '\\\\coloneqq',\n mirror: true,\n Label: '≔',\n title: 'يعرف بأنه يساوي',\n svg_path: null,\n },\n eqqcolon: {\n id: 'eqqcolon',\n category: 'operators1',\n Tex: '\\\\eqqcolon',\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 implies: {\n id: 'implies',\n category: 'operators3',\n Tex: '\\\\implies',\n mirror: true,\n Label: '⇒',\n title: 'يستلزم',\n svg_path: null,\n },\n impliedby: {\n id: 'impliedby',\n category: 'operators3',\n Tex: '\\\\impliedby',\n mirror: true,\n Label: '⇐',\n title: 'مستلزم من',\n svg_path: null,\n },\n iff: {\n id: 'iff',\n category: 'operators3',\n Tex: '\\\\iff',\n mirror: false,\n Label: '⇔',\n title: 'إذا وفقط إذا',\n svg_path: null,\n },\n Longrightarrow: {\n id: 'Longrightarrow',\n category: 'operators3',\n Tex: '\\\\Longrightarrow',\n mirror: true,\n Label: '⟹',\n title: 'سهم مزدوج طويل إلى اليمين',\n svg_path: null,\n },\n Longleftarrow: {\n id: 'Longleftarrow',\n category: 'operators3',\n Tex: '\\\\Longleftarrow',\n mirror: true,\n Label: '⟸',\n title: 'سهم مزدوج طويل إلى اليسار',\n svg_path: null,\n },\n to: {\n id: 'to',\n category: 'operators3',\n Tex: '\\\\to',\n mirror: true,\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 { EditorSide } from './types.js';\n\n/** LTR divide stroke stored on the English tree (reference OperatorObject `/`). */\nexport const DIVIDE_OPERATOR_EN = '/';\n\n/** RTL divide stroke shown on the Arabic editing surface. */\nexport const DIVIDE_OPERATOR_AR = '\\\\';\n\nexport function isDivideOperatorExpr(expr: string): boolean {\n return expr === DIVIDE_OPERATOR_EN || expr === DIVIDE_OPERATOR_AR;\n}\n\nexport function divideOperatorSurfaceExpr(expr: string, side: EditorSide): string {\n if (!isDivideOperatorExpr(expr)) {\n return expr;\n }\n return side === 'arabic' ? DIVIDE_OPERATOR_AR : DIVIDE_OPERATOR_EN;\n}\n\nexport function renderDivideOperatorLatex(side: EditorSide): string {\n return side === 'arabic' ? '\\\\backslash' : DIVIDE_OPERATOR_EN;\n}\n","import type { DigitFormId, EditorChain, EditorNode, EditorSession, EnvColumnAlignment } from './types.js';\nimport { atomicCommandSpec } from './atomicCommands.js';\nimport { atomicOperatorCommandSpec } from './atomicCommandsOperators.js';\nimport { isDivideOperatorExpr, renderDivideOperatorLatex } from './divideOperator.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 if (node.kind === 'operator' && isDivideOperatorExpr(node.expr)) {\n return `${renderDivideOperatorLatex('english')}${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 if (node.kind === 'operator' && isDivideOperatorExpr(node.expr)) {\n return arabicScripts(node, renderDivideOperatorLatex('arabic'), 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 {\n createAtomicCommandNode,\n createDelimiterNode,\n createEditorChain,\n createEditorNode,\n createFracNode,\n} from './factory.js';\nimport type { EditorChain, EditorNode } from './types.js';\n\nconst ARABIC_VAR = 'س';\nconst ENGLISH_VAR = 'x';\n\nfunction mirroredAd(): { english: EditorNode; arabic: EditorNode } {\n const english = createAtomicCommandNode('ad');\n const arabic = createAtomicCommandNode('ad');\n arabic.id = english.id;\n return { english, arabic };\n}\n\nfunction mirroredVar(): { english: EditorNode; arabic: EditorNode } {\n const english = createEditorNode('char', ENGLISH_VAR);\n const arabic = createEditorNode('char', ARABIC_VAR);\n arabic.id = english.id;\n return { english, arabic };\n}\n\nfunction withMirroredSuperscript2(english: EditorNode, arabic: EditorNode): void {\n const englishSup = createEditorChain([createEditorNode('number', '2')]);\n const arabicSup = createEditorChain([createEditorNode('number', '2')]);\n arabicSup.id = englishSup.id;\n arabicSup.nodes[0].id = englishSup.nodes[0].id;\n english.superscript = englishSup;\n arabic.superscript = arabicSup;\n}\n\nfunction syncChainIds(english: EditorChain, arabic: EditorChain): void {\n arabic.id = english.id;\n const limit = Math.min(english.nodes.length, arabic.nodes.length);\n for (let index = 0; index < limit; index += 1) {\n arabic.nodes[index].id = english.nodes[index].id;\n }\n}\n\nfunction syncFracIds(englishFrac: EditorNode, arabicFrac: EditorNode): void {\n arabicFrac.id = englishFrac.id;\n if (englishFrac.numerator && arabicFrac.numerator) {\n syncChainIds(englishFrac.numerator, arabicFrac.numerator);\n }\n if (englishFrac.denominator && arabicFrac.denominator) {\n syncChainIds(englishFrac.denominator, arabicFrac.denominator);\n }\n}\n\n/** Same [ad, var] chain on both sides so every slot is mirrored and editable. */\nfunction buildAdVarChain(): { english: EditorChain; arabic: EditorChain } {\n const ad = mirroredAd();\n const variable = mirroredVar();\n const english = createEditorChain([ad.english, variable.english]);\n const arabic = createEditorChain([ad.arabic, variable.arabic]);\n syncChainIds(english, arabic);\n return { english, arabic };\n}\n\nfunction mirroredEmptyDelimiter(): { english: EditorNode; arabic: EditorNode } {\n const english = createDelimiterNode('', '');\n const arabic = createDelimiterNode('', '');\n arabic.id = english.id;\n if (english.innerExpr && arabic.innerExpr) {\n syncChainIds(english.innerExpr, arabic.innerExpr);\n }\n return { english, arabic };\n}\n\nfunction setMirroredDelimiterInner(\n english: EditorNode,\n arabic: EditorNode,\n pairs: Array<{ english: EditorNode; arabic: EditorNode }>,\n): void {\n const englishInner = createEditorChain(pairs.map((pair) => pair.english));\n const arabicInner = createEditorChain(pairs.map((pair) => pair.arabic));\n syncChainIds(englishInner, arabicInner);\n english.innerExpr = englishInner;\n arabic.innerExpr = arabicInner;\n}\n\n/** Matches \\\\arabdiff{#1}{#2} with default variable س / x in both numerator and denominator. */\nexport function buildFirstDerivativeFrac(): { english: EditorNode; arabic: EditorNode } {\n const englishFrac = createFracNode();\n const arabicFrac = createFracNode();\n syncFracIds(englishFrac, arabicFrac);\n\n const numerator = buildAdVarChain();\n const denominator = buildAdVarChain();\n englishFrac.numerator = numerator.english;\n englishFrac.denominator = denominator.english;\n arabicFrac.numerator = numerator.arabic;\n arabicFrac.denominator = denominator.arabic;\n\n return { english: englishFrac, arabic: arabicFrac };\n}\n\n/** Matches \\\\arabddiff{#1}{#2} with mirrored structure on EN and AR. */\nexport function buildSecondDerivativeFrac(): { english: EditorNode; arabic: EditorNode } {\n const englishFrac = createFracNode();\n const arabicFrac = createFracNode();\n syncFracIds(englishFrac, arabicFrac);\n\n const numAd = mirroredAd();\n const numVar = mirroredVar();\n withMirroredSuperscript2(numAd.english, numAd.arabic);\n const englishNumerator = createEditorChain([numAd.english, numVar.english]);\n const arabicNumerator = createEditorChain([numAd.arabic, numVar.arabic]);\n syncChainIds(englishNumerator, arabicNumerator);\n englishFrac.numerator = englishNumerator;\n arabicFrac.numerator = arabicNumerator;\n\n const denGroup = mirroredEmptyDelimiter();\n const denInnerAd = mirroredAd();\n const denInnerVar = mirroredVar();\n setMirroredDelimiterInner(denGroup.english, denGroup.arabic, [\n { english: denInnerAd.english, arabic: denInnerAd.arabic },\n { english: denInnerVar.english, arabic: denInnerVar.arabic },\n ]);\n withMirroredSuperscript2(denGroup.english, denGroup.arabic);\n\n englishFrac.denominator = createEditorChain([denGroup.english]);\n arabicFrac.denominator = createEditorChain([denGroup.arabic]);\n syncChainIds(englishFrac.denominator, arabicFrac.denominator);\n\n return { english: englishFrac, arabic: arabicFrac };\n}\n\n/** Caret index on an [ad, var] chain — slot before the variable char. */\nexport const DERIVATIVE_TEMPLATE_VAR_CARET_INDEX = 1;\n\nexport function derivativeTemplateInitialCaret(englishFrac: EditorNode): { chainId: string; index: number } {\n const denominator = englishFrac.denominator;\n if (!denominator) {\n return {\n chainId: englishFrac.numerator?.id ?? '',\n index: DERIVATIVE_TEMPLATE_VAR_CARET_INDEX,\n };\n }\n const loneDelimiter =\n denominator.nodes.length === 1 &&\n denominator.nodes[0]?.kind === 'delimiter' &&\n denominator.nodes[0].innerExpr;\n if (loneDelimiter) {\n return {\n chainId: denominator.nodes[0].innerExpr!.id,\n index: DERIVATIVE_TEMPLATE_VAR_CARET_INDEX,\n };\n }\n return {\n chainId: denominator.id,\n index: DERIVATIVE_TEMPLATE_VAR_CARET_INDEX,\n };\n}\n","import type { AtomicCommandSpec } from './atomicCommands.js';\nimport type { AtomicOperatorCommandSpec } from './atomicCommandsOperators.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\n\nconst ENGLISH_COMMAND_TITLES: Record<string, string> = {\n cos: 'Cosine', sin: 'Sine', tan: 'Tangent', cot: 'Cotangent', sec: 'Secant', csc: 'Cosecant',\n arccos: 'Inverse cosine', arcsin: 'Inverse sine', arctan: 'Inverse tangent', arccot: 'Inverse cotangent',\n arcsec: 'Inverse secant', arccsc: 'Inverse cosecant', cosh: 'Hyperbolic cosine', sinh: 'Hyperbolic sine',\n tanh: 'Hyperbolic tangent', coth: 'Hyperbolic cotangent', sum: 'Sum', prod: 'Product', lim: 'Limit',\n max: 'Maximum', min: 'Minimum', sup: 'Supremum', inf: 'Infimum', pi: 'Pi', exp: 'Exponential',\n ln: 'Natural logarithm', log: 'Logarithm', det: 'Determinant', ad: 'Derivative (d / ad)', N: 'Natural numbers', Z: 'Integers',\n Q: 'Rational numbers', R: 'Real numbers', C: 'Complex numbers', H: 'Quaternions',\n negThinSpace: 'Negative thin space', mediumSpace: 'Medium space', thickSpace: 'Thick space',\n quadSpace: 'Large space', qquadSpace: 'Extra-large space',\n};\n\nconst ENGLISH_OPERATOR_TITLES: Record<string, string> = {\n inf: 'Infinity', times: 'Multiplication', div: 'Division', pm: 'Plus or minus', mp: 'Minus or plus',\n neq: 'Not equal', approx: 'Approximately equal', sim: 'Similar', mid: 'Divides',\n leq: 'Less than or equal', geq: 'Greater than or equal', coloneqq: 'Defined as equal to',\n eqqcolon: 'Equal by definition', propto: 'Proportional to', in: 'Element of', notin: 'Not an element of',\n subset: 'Subset of', supset: 'Superset of', subseteq: 'Subset of or equal', supseteq: 'Superset of or equal',\n cap: 'Intersection', cup: 'Union', emptyset: 'Empty set', nsubseteq: 'Not a subset of or equal',\n nsupseteq: 'Not a superset of or equal', ldots: 'Horizontal dots', cdot: 'Multiplication dot',\n cdots: 'Centered horizontal dots', vdots: 'Vertical dots', ddots: 'Diagonal dots',\n leftrightarrowDouble: 'Equivalent', implies: 'Implies', impliedby: 'Implied by', iff: 'If and only if',\n Longrightarrow: 'Long double arrow right', Longleftarrow: 'Long double arrow left', to: 'Maps to',\n rightleftharpoons: 'Equilibrium', leftarrow: 'Left arrow', rightarrow: 'Right arrow',\n leftarrowDouble: 'Double left arrow', rightarrowDouble: 'Double right arrow',\n leftharpoonup: 'Upper left harpoon', rightharpoonup: 'Upper right harpoon',\n leftharpoondown: 'Lower left harpoon', rightharpoondown: 'Lower right harpoon', int: 'Integral',\n iint: 'Double integral', iiint: 'Triple integral', iiiint: 'Quadruple integral', oint: 'Contour integral',\n oiint: 'Closed surface integral', oiiint: 'Closed volume integral',\n};\n\nexport const EQUATION_EDITOR_MESSAGES = {\n ar: {\n undoRedo: 'تراجع وإعادة', undo: 'تراجع', redo: 'إعادة', clipboard: 'الحافظة', copy: 'نسخ', cut: 'قص', paste: 'لصق',\n editorSettings: 'إعدادات المحرر', toggleSide: 'تبديل عربي / إنجليزي', structures: 'البنى', insertDelimiters: 'إدراج محددات',\n insertParentheses: 'إدراج قوسين', insertBrackets: 'إدراج معقوفين', insertBraces: 'إدراج حاصرتين',\n insertFraction: 'إدراج كسر', insertRoot: 'إدراج جذر', environments: 'البيئات', insertEnvironment: 'إدراج بيئة شبكية',\n environmentType: 'نوع البيئة', matrix: 'مصفوفة', array: 'جدول', aligned: 'محاذاة', matrixType: 'نوع المصفوفة',\n chooseEnvironmentSize: 'اختيار حجم البيئة', rows: 'صفوف', columns: 'أعمدة', row: 'صف', column: 'عمود', insert: 'إدراج',\n editSelectedEnvironment: 'تعديل البيئة المحددة', applySelectedMatrixStyle: 'تطبيق النمط على المصفوفة المحددة',\n applyStyle: 'تطبيق النمط', addRow: 'إضافة صف', removeRow: 'حذف صف', addColumn: 'إضافة عمود', removeColumn: 'حذف عمود',\n spaces: 'الفراغات', insertSpace: 'إدراج فراغ', functions: 'الدوال', insertFunction: 'إدراج دالة',\n insertLimitsSeries: 'إدراج حدود ومتسلسلات', insertAdditionalFunctions: 'إدراج دوال إضافية',\n derivatives: 'الاشتقاق', insertDerivative: 'إدراج علامة اشتقاق',\n insertFirstDerivative: 'إدراج اشتقاق أول', insertSecondDerivative: 'إدراج اشتقاق ثاني',\n insertNumberSets: 'إدراج مجموعات أعداد', operations: 'العمليات', insertOperation: 'إدراج رمز عملية',\n insertRelationsSets: 'إدراج رموز علاقات ومجموعات', insertArrows: 'إدراج أسهم', insertDots: 'إدراج نقاط',\n insertIntegrals: 'إدراج تكاملات', scripts: 'الأس والسفلي', addSuperscript: 'إضافة أس', addSubscript: 'إضافة سفلي',\n removeSuperscript: 'إزالة الأس', removeSubscript: 'إزالة السفلي', inputStyles: 'أنماط الإدخال',\n deleteSelectedStructure: 'حذف البنية المحددة', toggleLetterMerging: 'تبديل دمج الحروف', disableLetterMerging: 'تعطيل دمج الحروف',\n enableLetterMerging: 'تفعيل دمج الحروف', chooseWritingFont: 'اختيار خط الكتابة', chooseDigitForm: 'اختيار شكل الأرقام',\n defaultFont: 'الخط الافتراضي', takweenFont: 'خط تكوين', diwaniFont: 'خط ديواني', diwaniOutlineFont: 'خط ديواني مظلل',\n writeDefaultFont: 'الكتابة بالخط الافتراضي', writeTakweenFont: 'الكتابة بخط تكوين', westernDigits: 'أرقام غربية',\n arabicIndicDigits: 'أرقام عربية هندية', persianIndicDigits: 'أرقام فارسية هندية', equationEditor: 'محرر المعادلات',\n renderPreview: 'معاينة الرسم', development: 'تطوير', showDebugLog: 'إظهار سجل التصحيح', hideDebugLog: 'إخفاء سجل التصحيح',\n copyDebugLog: 'نسخ سجل التصحيح', empty: 'فارغ', englishLatex: 'LaTeX إنجليزي', arabicLatex: 'LaTeX عربي',\n inactiveEnglish: 'السلسلة غير النشطة (إنجليزي)', inactiveArabic: 'السلسلة غير النشطة (عربي)',\n mathJaxError: 'خطأ MathJax', previewError: 'خطأ في المعاينة', activeSide: 'الجانب النشط', syncState: 'حالة المزامنة',\n arabicSide: 'العربية', englishSide: 'الإنجليزية', synced: 'متزامن', differentItems: 'عناصر مختلفة',\n alignLeft: 'يسار', alignCenter: 'وسط', alignRight: 'يمين', alignColumnLeft: 'محاذاة العمود إلى اليسار',\n alignColumnCenter: 'محاذاة العمود في الوسط', alignColumnRight: 'محاذاة العمود إلى اليمين',\n matrixNoDelimiters: 'مصفوفة بلا أقواس', matrixParentheses: 'مصفوفة بين قوسين', matrixBrackets: 'مصفوفة بين معقوفين',\n matrixBraces: 'مصفوفة بين حاصرتين', matrixBars: 'مصفوفة بين خطين', matrixDoubleBars: 'مصفوفة بين خطين مزدوجين',\n },\n en: {\n undoRedo: 'Undo and redo', undo: 'Undo', redo: 'Redo', clipboard: 'Clipboard', copy: 'Copy', cut: 'Cut', paste: 'Paste',\n editorSettings: 'Editor settings', toggleSide: 'Switch Arabic / English equation side', structures: 'Structures',\n insertDelimiters: 'Insert delimiters', insertParentheses: 'Insert parentheses', insertBrackets: 'Insert brackets', insertBraces: 'Insert braces',\n insertFraction: 'Insert fraction', insertRoot: 'Insert root', environments: 'Environments', insertEnvironment: 'Insert grid environment',\n environmentType: 'Environment type', matrix: 'Matrix', array: 'Array', aligned: 'Aligned', matrixType: 'Matrix type',\n chooseEnvironmentSize: 'Choose environment size', rows: 'Rows', columns: 'Columns', row: 'Row', column: 'Column', insert: 'Insert',\n editSelectedEnvironment: 'Edit selected environment', applySelectedMatrixStyle: 'Apply style to selected matrix', applyStyle: 'Apply style',\n addRow: 'Add row', removeRow: 'Remove row', addColumn: 'Add column', removeColumn: 'Remove column', spaces: 'Spacing',\n insertSpace: 'Insert space', functions: 'Functions', insertFunction: 'Insert function', insertLimitsSeries: 'Insert limits and series',\n insertAdditionalFunctions: 'Insert additional functions', derivatives: 'Derivatives', insertDerivative: 'Insert derivative marker',\n insertFirstDerivative: 'Insert first derivative', insertSecondDerivative: 'Insert second derivative',\n insertNumberSets: 'Insert number sets', operations: 'Operators',\n insertOperation: 'Insert operator', insertRelationsSets: 'Insert relation or set symbol', insertArrows: 'Insert arrow',\n insertDots: 'Insert dots', insertIntegrals: 'Insert integral', scripts: 'Superscript and subscript', addSuperscript: 'Add superscript',\n addSubscript: 'Add subscript', removeSuperscript: 'Remove superscript', removeSubscript: 'Remove subscript', inputStyles: 'Input styles',\n deleteSelectedStructure: 'Delete selected structure', toggleLetterMerging: 'Toggle letter merging', disableLetterMerging: 'Disable letter merging',\n enableLetterMerging: 'Enable letter merging', chooseWritingFont: 'Choose writing font', chooseDigitForm: 'Choose digit form',\n defaultFont: 'Default font', takweenFont: 'Takween font', diwaniFont: 'Diwani font', diwaniOutlineFont: 'Outlined Diwani font',\n writeDefaultFont: 'Write with the default font', writeTakweenFont: 'Write with Takween font', westernDigits: 'Western digits',\n arabicIndicDigits: 'Arabic-Indic digits', persianIndicDigits: 'Persian digits', equationEditor: 'Equation editor',\n renderPreview: 'Rendered preview', development: 'Development', showDebugLog: 'Show debug log', hideDebugLog: 'Hide debug log',\n copyDebugLog: 'Copy debug log', empty: 'Empty', englishLatex: 'English LaTeX', arabicLatex: 'Arabic LaTeX',\n inactiveEnglish: 'Inactive chain (English)', inactiveArabic: 'Inactive chain (Arabic)', mathJaxError: 'MathJax error',\n previewError: 'Preview error', activeSide: 'Active side', syncState: 'Sync state', arabicSide: 'Arabic', englishSide: 'English',\n synced: 'Synced', differentItems: 'different items', alignLeft: 'Left', alignCenter: 'Center', alignRight: 'Right',\n alignColumnLeft: 'Align column left', alignColumnCenter: 'Align column center', alignColumnRight: 'Align column right',\n matrixNoDelimiters: 'Matrix without delimiters', matrixParentheses: 'Matrix in parentheses', matrixBrackets: 'Matrix in brackets',\n matrixBraces: 'Matrix in braces', matrixBars: 'Matrix between bars', matrixDoubleBars: 'Matrix between double bars',\n },\n} as const;\n\nexport type EquationEditorMessages = (typeof EQUATION_EDITOR_MESSAGES)['ar'] | (typeof EQUATION_EDITOR_MESSAGES)['en'];\n\nexport function equationEditorMessages(locale: ButexUiLocale): EquationEditorMessages {\n return EQUATION_EDITOR_MESSAGES[locale];\n}\n\nexport function atomicCommandTitle(spec: AtomicCommandSpec, locale: ButexUiLocale): string {\n return locale === 'en' ? ENGLISH_COMMAND_TITLES[spec.id] ?? spec.title : spec.title;\n}\n\nexport function atomicOperatorCommandTitle(spec: AtomicOperatorCommandSpec, locale: ButexUiLocale): string {\n return locale === 'en' ? ENGLISH_OPERATOR_TITLES[spec.id] ?? spec.title : spec.title;\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 { buildFirstDerivativeFrac, buildSecondDerivativeFrac, derivativeTemplateInitialCaret } from './derivativeTemplates.js';\nimport { DIVIDE_OPERATOR_AR, DIVIDE_OPERATOR_EN } from './divideOperator.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 { ButexUiLocale } from '../uiLocale.js';\nimport { equationEditorMessages } from './uiLocale.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 insertDivideOperator(session: EditorSession): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const englishNode = createEditorNode('operator', DIVIDE_OPERATOR_EN);\n const arabicNode = createEditorNode('operator', DIVIDE_OPERATOR_AR);\n arabicNode.id = englishNode.id;\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n markExprSync(next, englishNode.id);\n next.caret.index += 1;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertDivideOperator', '');\n return next;\n}\n\nexport function insertOperator(session: EditorSession, expr: string): EditorSession {\n if (expr === '.' && !session.splitLeafTyping && precedingIsExtendableNumber(session)) {\n return insertNumber(session, '.');\n }\n if (expr === DIVIDE_OPERATOR_EN || expr === DIVIDE_OPERATOR_AR) {\n return insertDivideOperator(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\nfunction insertDerivativeFrac(\n session: EditorSession,\n build: () => { english: EditorNode; arabic: EditorNode },\n debugLabel: string,\n): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const { english, arabic } = build();\n insertMirroredNode(next, next.caret.chainId, next.caret.index, english, arabic);\n syncSubtreeRecursive(next, english, arabic);\n next.caret = derivativeTemplateInitialCaret(english);\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, debugLabel, '');\n return next;\n}\n\nexport function insertFirstDerivative(session: EditorSession): EditorSession {\n return insertDerivativeFrac(session, buildFirstDerivativeFrac, 'insertFirstDerivative');\n}\n\nexport function insertSecondDerivative(session: EditorSession): EditorSession {\n return insertDerivativeFrac(session, buildSecondDerivativeFrac, 'insertSecondDerivative');\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, uiLocale: ButexUiLocale = 'ar'): string {\n const messages = equationEditorMessages(uiLocale);\n const diverged = Object.values(session.sync).filter((entry) => entry.expr === 'diverged').length;\n if (diverged === 0) {\n return messages.synced;\n }\n return uiLocale === 'ar' ? `يوجد ${String(diverged)} ${messages.differentItems}` : `${String(diverged)} ${messages.differentItems}`;\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, uiLocale: ButexUiLocale = 'ar'): string {\n const messages = equationEditorMessages(uiLocale);\n return side === 'arabic' ? messages.arabicSide : messages.englishSide;\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 if (ch === DIVIDE_OPERATOR_AR) {\n s = insertDivideOperator(s);\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, EditorSide } from '../types.js';\nimport { divideOperatorSurfaceExpr } from '../divideOperator.js';\nimport { formatDigits } from '../digits.js';\n\nexport function buildBaseNodeBody(\n node: EditorNode,\n digitForm: DigitFormId = 'western',\n side: EditorSide = 'english',\n): 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 const surfaceExpr = node.kind === 'operator' ? divideOperatorSurfaceExpr(node.expr, side) : node.expr;\n value.textContent = surfaceExpr === '' ? '□' : formatDigits(surfaceExpr, 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';\nimport type { ButexUiLocale } from '../../uiLocale.js';\nimport { atomicCommandTitle } from '../uiLocale.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, uiLocale: ButexUiLocale = 'ar'): string {\n return `${atomicCommandTitle(spec, uiLocale)} ${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'\n ? spec?.arabicLabel ?? node.expr\n : spec?.englishLabel ?? spec?.englishTex.replace(/^\\\\/, '') ?? node.expr;\n return value;\n}\n\nfunction buildSpacingAtomicCommandBody(spec: SpacingCommandSpec, side: EditorSide, uiLocale: ButexUiLocale): 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, uiLocale);\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, uiLocale: ButexUiLocale = 'ar'): HTMLElement {\n const spec = atomicCommandSpec(node.expr);\n if (isSpacingCommandSpec(spec)) {\n return buildSpacingAtomicCommandBody(spec, side, uiLocale);\n }\n return buildFunctionAtomicCommandBody(node, side, spec);\n}\n","import { atomicOperatorCommandSpec, shouldMirrorOperatorDisplay, type AtomicOperatorCommandSpec } from '../atomicCommandsOperators.js';\nimport type { EditorNode, EditorSide } from '../types.js';\nimport type { ButexUiLocale } from '../../uiLocale.js';\nimport { atomicOperatorCommandTitle } from '../uiLocale.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, uiLocale: ButexUiLocale = 'ar'): HTMLElement {\n const spec = atomicOperatorCommandSpec(node.expr);\n const value = document.createElement('span');\n value.className = 'atomic-operator-command';\n value.title = spec ? atomicOperatorCommandTitle(spec, uiLocale) : 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';\nimport type { ButexUiLocale } from '../../uiLocale.js';\n\ntype BuildChain = (chain: EditorChain) => HTMLElement;\n\nexport function buildNodeBody(\n node: EditorNode,\n buildChain: BuildChain,\n side: EditorSide,\n digitForm: DigitFormId = 'western',\n uiLocale: ButexUiLocale = 'ar',\n): 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, uiLocale);\n }\n if (node.kind === 'atomicOperatorCommand') {\n return buildAtomicOperatorCommandNodeBody(node, side, uiLocale);\n }\n return buildBaseNodeBody(node, digitForm, side);\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 insertDivideOperator,\n insertFraction,\n insertFirstDerivative,\n insertSecondDerivative,\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, EditorSide, EnvColumnAlignment, MatrixEnvStyle } from './types.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { atomicCommandSpec, isSpacingCommandSpec, type AtomicCommandId } from './atomicCommands.js';\nimport type { AtomicOperatorCommandId } from './atomicCommandsOperators.js';\nimport { equationEditorMessages } from './uiLocale.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 defaultSide?: EditorSide;\n uiLocale?: ButexUiLocale;\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 setUiLocale: (locale: ButexUiLocale) => 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 insertFirstDerivative: () => void;\n insertSecondDerivative: () => 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 let uiLocale = options.uiLocale ?? 'ar';\n if (options.defaultSide) {\n session = { ...session, activeSide: options.defaultSide };\n }\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 const messages = equationEditorMessages(uiLocale);\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 = messages.undo;\n buttonElements.undoBtn.setAttribute('aria-label', messages.undo);\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 = messages.redo;\n buttonElements.redoBtn.setAttribute('aria-label', messages.redo);\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 const messages = equationEditorMessages(uiLocale);\n buttonElements.splitTypingBtn.textContent = mergeOn ? 'سصع' : 'س ص ع';\n buttonElements.splitTypingBtn.title = mergeOn ? messages.disableLetterMerging : messages.enableLetterMerging;\n buttonElements.splitTypingBtn.setAttribute('aria-label', mergeOn ? messages.disableLetterMerging : messages.enableLetterMerging);\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 const messages = equationEditorMessages(uiLocale);\n buttonElements.characterFontBtn.textContent = 'تك';\n buttonElements.characterFontBtn.title = takweenOn ? messages.writeDefaultFont : messages.writeTakweenFont;\n buttonElements.characterFontBtn.setAttribute('aria-label', takweenOn ? messages.writeDefaultFont : messages.writeTakweenFont);\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 const messages = equationEditorMessages(uiLocale);\n buttonElements.digitFormBtn.title = messages.chooseDigitForm;\n buttonElements.digitFormBtn.setAttribute('aria-label', messages.chooseDigitForm);\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, uiLocale);\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', uiLocale));\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 (char === '\\\\') {\n applyStructural((prev) => insertDivideOperator(prev));\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 setUiLocale: (locale) => {\n if (uiLocale === locale) {\n return;\n }\n uiLocale = locale;\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 insertFirstDerivative: () => {\n applyStructural((prev) => insertFirstDerivative(prev));\n surfaceEl.focus();\n },\n insertSecondDerivative: () => {\n applyStructural((prev) => insertSecondDerivative(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, uiLocale: ButexUiLocale = 'ar'): { activeSide: string; sync: string } {\n const messages = equationEditorMessages(uiLocale);\n return {\n activeSide: `${messages.activeSide}: ${activeSideLabel(session.activeSide, uiLocale)}`,\n sync: `${messages.syncState}: ${syncStateSummary(session, uiLocale)}`,\n };\n}\n","import type { CharacterFontId } from '../editor/types.js';\n\nexport type NormalizedCharImport = {\n expr: string;\n characterFont: CharacterFontId;\n};\n\ntype WrapperSpec = {\n prefix: string;\n font?: CharacterFontId;\n};\n\nconst WRAPPER_SPECS: WrapperSpec[] = [\n { prefix: '\\\\butexdiwanioutline', font: 'diwaniOutline' },\n { prefix: '\\\\diwanioutlineshaded', font: 'diwaniOutline' },\n { prefix: '\\\\butexdiwani', font: 'diwani' },\n { prefix: '\\\\butextakween', font: 'takween' },\n { prefix: '\\\\diwani', font: 'diwani' },\n { prefix: '\\\\takween', font: 'takween' },\n { prefix: '\\\\text' },\n];\n\nfunction readBracedArg(source: string, openBraceIndex: number): { inner: string; end: number } | null {\n if (source[openBraceIndex] !== '{') {\n return null;\n }\n\n let depth = 0;\n for (let index = openBraceIndex; index < source.length; index += 1) {\n const char = source[index];\n if (char === '{') {\n depth += 1;\n } else if (char === '}') {\n depth -= 1;\n if (depth === 0) {\n return { inner: source.slice(openBraceIndex + 1, index), end: index + 1 };\n }\n }\n }\n\n return null;\n}\n\nfunction peelWrapper(source: string): { inner: string; font?: CharacterFontId } | null {\n for (const wrapper of WRAPPER_SPECS) {\n if (!source.startsWith(wrapper.prefix)) {\n continue;\n }\n\n const braced = readBracedArg(source, wrapper.prefix.length);\n if (!braced || braced.end !== source.length) {\n continue;\n }\n\n return { inner: braced.inner, font: wrapper.font };\n }\n\n return null;\n}\n\nexport function normalizeCharImportExpr(expr: string): NormalizedCharImport {\n const original = expr;\n let current = expr;\n let characterFont: CharacterFontId = 'default';\n let changed = false;\n\n while (true) {\n const peeled = peelWrapper(current);\n if (!peeled) {\n break;\n }\n\n current = peeled.inner;\n if (peeled.font) {\n characterFont = peeled.font;\n }\n changed = true;\n }\n\n if (!changed) {\n return { expr: original, characterFont: 'default' };\n }\n\n if (current.includes('\\\\')) {\n return { expr: original, characterFont: 'default' };\n }\n\n return { expr: current, characterFont };\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 CharacterFontId,\n EditorChain,\n EditorNode,\n EditorSession,\n EnvColumnAlignment,\n GridEnvName,\n MatrixEnvStyle,\n} from '../editor/index.js';\nimport { normalizeCharImportExpr } from './normalizeCharImport.js';\nimport type { MathNode } from './types.js';\n\ntype CommandFontPolicy = CharacterFontId | 'infer';\n\nconst COMMAND_FONT_MAP: Record<string, CommandFontPolicy> = {\n '\\\\text': 'infer',\n '\\\\butextakween': 'takween',\n '\\\\takween': 'takween',\n '\\\\butexdiwani': 'diwani',\n '\\\\diwani': 'diwani',\n '\\\\butexdiwanioutline': 'diwaniOutline',\n '\\\\diwanioutlineshaded': 'diwaniOutline',\n};\n\nconst CHAR_FONT_EXPORT_TEX: Record<Exclude<CharacterFontId, 'default'>, string> = {\n takween: '\\\\butextakween',\n diwani: '\\\\butexdiwani',\n diwaniOutline: '\\\\butexdiwanioutline',\n};\n\nfunction charEditorNodeToAstNode(node: EditorNode): BaseAstNode {\n const font = node.characterFont ?? 'default';\n const charNode = new CharNode(node.expr);\n if (font === 'default') {\n return charNode;\n }\n return new CommandNode(CHAR_FONT_EXPORT_TEX[font], [], [new ChainNode([charNode])]);\n}\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 charFromTextLikeCommand(node: CommandNode): NodeAdapterResult | null {\n const commandFont = COMMAND_FONT_MAP[node.name];\n if (commandFont === undefined) {\n return null;\n }\n if (node.optionalArgs.length > 0 || node.mandatoryArgs.length !== 1) {\n return null;\n }\n\n const arg = node.mandatoryArgs[0]!;\n if (arg.chain.length !== 1) {\n return null;\n }\n\n const child = arg.chain[0]!;\n if (child instanceof CommandNode) {\n const nested = charFromTextLikeCommand(child);\n if (!nested?.editable) {\n return null;\n }\n if (commandFont !== 'infer') {\n nested.node.characterFont = commandFont;\n }\n const scripts = attachScripts(node, nested.node);\n return scripts ?? nested;\n }\n\n if (!(child instanceof CharNode)) {\n return null;\n }\n\n const normalized = normalizeCharImportExpr(child.expr);\n const characterFont = commandFont === 'infer' ? normalized.characterFont : commandFont;\n const editorNode = createEditorNode('char', normalized.expr);\n if (characterFont !== 'default') {\n editorNode.characterFont = characterFont;\n }\n const scripts = attachScripts(node, editorNode);\n return scripts ?? { editable: true, node: editorNode };\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 const textLike = charFromTextLikeCommand(node);\n if (textLike) {\n return textLike;\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 normalized = normalizeCharImportExpr(node.expr);\n const editorNode = createEditorNode('char', normalized.expr);\n if (normalized.characterFont !== 'default') {\n editorNode.characterFont = normalized.characterFont;\n }\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 = charEditorNodeToAstNode(node);\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 { mathNodeFromEditorSession, mathObjectToEditorSession } from '../document/mathEditorAdapter.js';\nimport type { MathNode } from '../document/types.js';\nimport {\n buildInitialSyncMap,\n createEditorChain,\n createEditorSession,\n renderArabicLatexFromSession,\n renderEnglishLatexFromSession,\n type EditorSide,\n type EditorSession,\n} from '../editor/index.js';\nimport type { MathToken2 } from './types.js';\n\nexport type Document2MathBridgeResult =\n | { editable: true; session: EditorSession }\n | { editable: false; reason: string };\n\nexport function createEmptyEquationSession(side: EditorSide = 'arabic'): EditorSession {\n const english = createEditorChain();\n const arabic = createEditorChain();\n arabic.id = english.id;\n const session = createEditorSession(english, arabic, side);\n session.sync = buildInitialSyncMap(session.englishTree, session.arabicTree);\n return session;\n}\n\nexport function createEmptyArabicEquationSession(): EditorSession {\n return createEmptyEquationSession('arabic');\n}\n\nexport function mathTokenToEditorSession(math: MathNode | null, side: EditorSide = 'arabic'): Document2MathBridgeResult {\n if (!math) {\n return { editable: false, reason: 'هذه المعادلة محفوظة كنص خام فقط حاليا' };\n }\n const result = mathObjectToEditorSession(math);\n if (!result.editable) {\n return result;\n }\n result.session.activeSide = side;\n result.session.sync = buildInitialSyncMap(result.session.englishTree, result.session.arabicTree);\n return result;\n}\n\nexport function mathTokenToArabicEditorSession(math: MathNode | null): Document2MathBridgeResult {\n return mathTokenToEditorSession(math, 'arabic');\n}\n\nexport function mathSourceFromSession(\n session: EditorSession,\n side: EditorSide,\n opening = '$',\n closing = '$',\n): string {\n const inner = side === 'english'\n ? renderEnglishLatexFromSession(session)\n : renderArabicLatexFromSession(session);\n if (opening === '$' || opening === '\\\\(') {\n return opening + inner + closing;\n }\n if (opening === '$$' || opening === '\\\\[') {\n return `${opening}\\n${inner}\\n${closing}`;\n }\n return `${opening}\\n ${inner}\\n${closing}`;\n}\n\nexport function mathSourceFromArabicSession(session: EditorSession, opening = '$', closing = '$'): string {\n return mathSourceFromSession(session, 'arabic', opening, closing);\n}\n\nexport function mathNodeFromSession(session: EditorSession, opening = '$', closing = '$'): MathNode {\n const converted = mathNodeFromEditorSession(session, opening, closing);\n if (converted.ok) {\n return converted.math;\n }\n return { nodeType: 'MathObject', mathMode: opening, lines: [], closing };\n}\n\nexport function mathNodeFromArabicSession(session: EditorSession, opening = '$', closing = '$'): MathNode {\n return mathNodeFromSession(session, opening, closing);\n}\n\nexport function mathTokenSourceForSide(token: MathToken2, side: EditorSide): string {\n if (!token.math || token.sourceOwner === 'raw') {\n return token.source;\n }\n if (token.sourceSide === side) {\n return token.source;\n }\n const result = mathTokenToEditorSession(token.math, side);\n if (!result.editable) {\n return token.source;\n }\n return mathSourceFromSession(result.session, side, token.opening, token.closing);\n}\n","import { document2Id } from './ids.js';\nimport { cloneDocument2Meta, emptyDocument2Meta, normalizeDocument2HijriDate } from './articleMeta.js';\nimport { createEmptyReference2 } from './citations.js';\nimport { createInlineField2 } from './importJson.js';\nimport { applyFloatMetaPatch, defaultFloatMeta, type FloatMetaPatch } from './labels.js';\nimport { mathNodeFromSession, mathSourceFromSession } from './mathBridge.js';\nimport type {\n BibliographyBlock2,\n CiteToken2,\n Document2Block,\n Document2Node,\n ImageBlock2,\n InlineField2,\n InlineToken2,\n ListBlock2,\n MathToken2,\n Reference2,\n Reference2Json,\n RefToken2,\n TableBlock2,\n TextToken2,\n} from './types.js';\nimport type { Document2MetaProp } from './articleMeta.js';\nimport type { EditorSession, EditorSide } from '../editor/index.js';\n\nfunction cloneToken(token: InlineToken2): InlineToken2 {\n return token.kind === 'text' ? { ...token } : { ...token };\n}\n\nfunction cloneField(field: InlineField2): InlineField2 {\n return { id: field.id, tokens: field.tokens.map(cloneToken) };\n}\n\nfunction cloneBlock(block: Document2Block): Document2Block {\n if (block.kind === 'textBlock') {\n return { ...block, field: cloneField(block.field) };\n }\n if (block.kind === 'list') {\n return {\n ...block,\n items: block.items.map((item) => ({\n ...item,\n field: cloneField(item.field),\n blocks: item.blocks.map(cloneBlock),\n })),\n };\n }\n if (block.kind === 'table') {\n return { ...block, rows: block.rows.map((row) => row.map(cloneField)) };\n }\n if (block.kind === 'image') {\n return { ...block, options: { ...block.options } };\n }\n return { ...block };\n}\n\nfunction cloneDocument(document: Document2Node): Document2Node {\n return {\n nodeType: 'DocumentObject',\n meta: cloneDocument2Meta(document.meta ?? emptyDocument2Meta()),\n references: document.references.map((reference) => ({ ...reference })),\n blocks: document.blocks.map(cloneBlock),\n diagnostics: document.diagnostics.map((diagnostic) => ({ ...diagnostic })),\n };\n}\n\nfunction visitFields(blocks: Document2Block[], visitor: (field: InlineField2) => boolean): boolean {\n for (const block of blocks) {\n if (block.kind === 'textBlock') {\n if (visitor(block.field)) {\n return true;\n }\n } else if (block.kind === 'list') {\n for (const item of block.items) {\n if (visitor(item.field) || visitFields(item.blocks, visitor)) {\n return true;\n }\n }\n } else if (block.kind === 'table') {\n for (const row of block.rows) {\n for (const cell of row) {\n if (visitor(cell)) {\n return true;\n }\n }\n }\n }\n }\n return false;\n}\n\nexport function findFirstInlineField(document: Document2Node): InlineField2 | null {\n let found: InlineField2 | null = null;\n visitFields(document.blocks, (field) => {\n found = field;\n return true;\n });\n return found;\n}\n\nexport function updateTextToken(document: Document2Node, fieldId: string, tokenId: string, text: string): Document2Node {\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n if (field.id !== fieldId) {\n return false;\n }\n const token = field.tokens.find((entry): entry is TextToken2 => entry.id === tokenId && entry.kind === 'text');\n if (!token) {\n return true;\n }\n token.text = text;\n return true;\n });\n return next;\n}\n\nfunction mathTokenFromSession(session: EditorSession, opening = '$', closing = '$', side: EditorSide = 'arabic'): MathToken2 {\n return {\n id: document2Id('math'),\n kind: 'math',\n display: opening === '$$' || opening === '\\\\[' || opening.startsWith('\\\\begin{'),\n opening,\n closing,\n source: mathSourceFromSession(session, side, opening, closing),\n sourceSide: side,\n math: mathNodeFromSession(session, opening, closing),\n editable: true,\n sourceOwner: 'editor',\n };\n}\n\nfunction splitTextForInsertion(token: TextToken2): InlineToken2[] | null {\n const gap = token.text.indexOf(' ');\n if (gap < 0) {\n return null;\n }\n return [\n { id: token.id, kind: 'text', text: token.text.slice(0, gap + 1) },\n { id: document2Id('text'), kind: 'text', text: token.text.slice(gap + 1) },\n ];\n}\n\nexport function cloneDocument2Node(document: Document2Node): Document2Node {\n return cloneDocument(document);\n}\n\nfunction insertBlockAfter(blocks: Document2Block[], afterBlockId: string | null | undefined, block: Document2Block): void {\n if (!afterBlockId) {\n blocks.push(block);\n return;\n }\n const index = blocks.findIndex((entry) => entry.id === afterBlockId);\n if (index < 0) {\n blocks.push(block);\n return;\n }\n blocks.splice(index + 1, 0, block);\n}\n\nexport function insertDocument2BlockAfter(\n document: Document2Node,\n afterBlockId: string | null | undefined,\n block: Document2Block,\n): Document2Node {\n const next = cloneDocument(document);\n insertBlockAfter(next.blocks, afterBlockId, block);\n return next;\n}\n\nexport function moveDocument2BlockById(document: Document2Node, blockId: string, direction: -1 | 1): Document2Node {\n const next = cloneDocument(document);\n const index = next.blocks.findIndex((block) => block.id === blockId);\n const targetIndex = index + direction;\n if (index < 0 || targetIndex < 0 || targetIndex >= next.blocks.length) {\n return document;\n }\n const [block] = next.blocks.splice(index, 1);\n if (!block) {\n return document;\n }\n next.blocks.splice(targetIndex, 0, block);\n return next;\n}\n\nexport function moveDocument2BlockRange(\n document: Document2Node,\n from: number,\n to: number,\n direction: -1 | 1,\n): Document2Node {\n const count = document.blocks.length;\n if (from < 0 || to < 0 || from >= count || to >= count || from > to) {\n return document;\n }\n const insertAt = from + direction;\n if (insertAt < 0 || to + direction >= count) {\n return document;\n }\n const next = cloneDocument(document);\n const slice = next.blocks.splice(from, to - from + 1);\n next.blocks.splice(insertAt, 0, ...slice);\n return next;\n}\n\nexport function removeDocument2BlockRange(document: Document2Node, from: number, to: number): Document2Node {\n const count = document.blocks.length;\n if (from < 0 || to < 0 || from >= count || to >= count || from > to) {\n return document;\n }\n const next = cloneDocument(document);\n next.blocks = [...next.blocks.slice(0, from), ...next.blocks.slice(to + 1)];\n return next;\n}\n\nfunction normalizeFieldTokens(tokens: InlineToken2[]): InlineToken2[] {\n if (tokens.length === 0) {\n return [{ id: document2Id('text'), kind: 'text', text: '' }];\n }\n return tokens;\n}\n\nfunction stitchTextAroundRemovedToken(tokens: InlineToken2[], index: number): InlineToken2[] {\n const before = tokens[index - 1];\n const after = tokens[index + 1];\n if (before?.kind === 'text' && after?.kind === 'text') {\n return [\n ...tokens.slice(0, index - 1),\n { ...before, text: before.text + after.text },\n ...tokens.slice(index + 2),\n ];\n }\n return [...tokens.slice(0, index), ...tokens.slice(index + 1)];\n}\n\nexport function removeMathTokenById(document: Document2Node, tokenId: string): Document2Node {\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n const index = field.tokens.findIndex((token) => token.id === tokenId && token.kind === 'math');\n if (index < 0) {\n return false;\n }\n field.tokens = normalizeFieldTokens(stitchTextAroundRemovedToken(field.tokens, index));\n return true;\n });\n return next;\n}\n\nfunction splitTextTokenAt(token: TextToken2, offset: number): [TextToken2, TextToken2] {\n const safeOffset = Math.max(0, Math.min(offset, token.text.length));\n return [\n { id: token.id, kind: 'text', text: token.text.slice(0, safeOffset) },\n { id: document2Id('text'), kind: 'text', text: token.text.slice(safeOffset) },\n ];\n}\n\nexport function insertMathTokenAtCaret(\n document: Document2Node,\n fieldId: string,\n textTokenId: string | null,\n caretOffset: number,\n session: EditorSession,\n opening = '$',\n closing = '$',\n side: EditorSide = 'arabic',\n): Document2Node {\n const next = cloneDocument(document);\n const mathToken = mathTokenFromSession(session, opening, closing, side);\n visitFields(next.blocks, (field) => {\n if (field.id !== fieldId) {\n return false;\n }\n\n const textIndex = textTokenId\n ? field.tokens.findIndex((token) => token.id === textTokenId && token.kind === 'text')\n : field.tokens.findIndex((token) => token.kind === 'text');\n\n if (textIndex < 0) {\n field.tokens.push(mathToken);\n field.tokens.push({ id: document2Id('text'), kind: 'text', text: '' });\n return true;\n }\n\n const current = field.tokens[textIndex] as TextToken2;\n const [before, after] = splitTextTokenAt(current, caretOffset);\n const parts: InlineToken2[] = [...field.tokens.slice(0, textIndex)];\n if (before.text.length > 0) {\n parts.push(before);\n }\n parts.push(mathToken);\n parts.push(after);\n parts.push(...field.tokens.slice(textIndex + 1));\n field.tokens = normalizeFieldTokens(parts);\n return true;\n });\n return next;\n}\n\nexport function insertMathToken(\n document: Document2Node,\n fieldId: string,\n insertIndex: number,\n session: EditorSession,\n opening = '$',\n closing = '$',\n side: EditorSide = 'arabic',\n): Document2Node {\n const next = cloneDocument(document);\n const mathToken = mathTokenFromSession(session, opening, closing, side);\n visitFields(next.blocks, (field) => {\n if (field.id !== fieldId) {\n return false;\n }\n\n if (field.tokens.length === 1 && field.tokens[0]?.kind === 'text') {\n const split = splitTextForInsertion(field.tokens[0]);\n if (split) {\n field.tokens = [split[0]!, mathToken, split[1]!];\n return true;\n }\n }\n\n const safeIndex = Math.max(0, Math.min(insertIndex, field.tokens.length));\n field.tokens.splice(safeIndex, 0, mathToken);\n return true;\n });\n return next;\n}\n\nexport function replaceMathTokenFromSession(\n document: Document2Node,\n tokenId: string,\n session: EditorSession,\n opening?: string,\n closing?: string,\n side: EditorSide = 'arabic',\n): Document2Node {\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n const index = field.tokens.findIndex((token) => token.id === tokenId && token.kind === 'math');\n if (index < 0) {\n return false;\n }\n const current = field.tokens[index] as MathToken2;\n const open = opening ?? current.opening;\n const close = closing ?? current.closing;\n const replaced = mathTokenFromSession(session, open, close, side);\n replaced.id = current.id;\n if (current.labelEnabled !== undefined) {\n replaced.labelEnabled = current.labelEnabled;\n }\n if (current.label !== undefined) {\n replaced.label = current.label;\n }\n field.tokens[index] = replaced;\n return true;\n });\n return next;\n}\n\nexport function addDocument2TextBlock(\n document: Document2Node,\n command: '\\\\section' | '\\\\subsection' | '\\\\subsubsection' | '\\\\paragraph' = '\\\\paragraph',\n afterBlockId?: string | null,\n): Document2Node {\n const block = {\n id: document2Id('block'),\n kind: 'textBlock' as const,\n command,\n field: createInlineField2(''),\n ...(command === '\\\\paragraph' ? { centered: false } : {}),\n };\n return insertDocument2BlockAfter(document, afterBlockId, block);\n}\n\nexport function updateDocument2TextBlockCentered(\n document: Document2Node,\n blockId: string,\n centered: boolean,\n): Document2Node {\n const next = cloneDocument(document);\n function visit(blocks: Document2Block[]): boolean {\n for (const block of blocks) {\n if (block.id === blockId && block.kind === 'textBlock' && block.command === '\\\\paragraph') {\n block.centered = centered;\n return true;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (visit(item.blocks)) {\n return true;\n }\n }\n }\n }\n return false;\n }\n visit(next.blocks);\n return next;\n}\n\nexport function removeDocument2BlockById(document: Document2Node, blockId: string): Document2Node {\n const next = cloneDocument(document);\n next.blocks = next.blocks.filter((block) => block.id !== blockId);\n return next;\n}\n\nfunction newListBlock(ordered: boolean): ListBlock2 {\n const command: ListBlock2['command'] = ordered ? '\\\\begin{enumerate}' : '\\\\begin{itemize}';\n const closing = ordered ? '\\\\end{enumerate}' : '\\\\end{itemize}';\n return {\n id: document2Id('block'),\n kind: 'list',\n command,\n closing,\n items: [{ id: document2Id('item'), field: createInlineField2(''), blocks: [] }],\n };\n}\n\nexport function addDocument2ListBlock(document: Document2Node, ordered: boolean, afterBlockId?: string | null): Document2Node {\n return insertDocument2BlockAfter(document, afterBlockId, newListBlock(ordered));\n}\n\nexport function addDocument2TableBlock(\n document: Document2Node,\n columns = 'lll',\n rowCount = 3,\n colCount = 3,\n afterBlockId?: string | null,\n): Document2Node {\n const rows = Math.max(1, rowCount);\n const cols = Math.max(1, colCount);\n const tableRows: InlineField2[][] = [];\n for (let r = 0; r < rows; r += 1) {\n const row: InlineField2[] = [];\n for (let c = 0; c < cols; c += 1) {\n row.push(createInlineField2(''));\n }\n tableRows.push(row);\n }\n const block: TableBlock2 = {\n id: document2Id('block'),\n kind: 'table',\n command: '\\\\begin{tabular}',\n closing: '\\\\end{tabular}',\n columns: columns || 'l'.repeat(cols),\n rows: tableRows,\n ...defaultFloatMeta(),\n };\n return insertDocument2BlockAfter(document, afterBlockId, block);\n}\n\nexport function addDocument2ImageBlock(document: Document2Node, src = '', afterBlockId?: string | null): Document2Node {\n const block: ImageBlock2 = {\n id: document2Id('block'),\n kind: 'image',\n command: '\\\\includegraphics',\n value: src,\n options: { width: '0.8\\\\textwidth' },\n ...defaultFloatMeta(),\n };\n return insertDocument2BlockAfter(document, afterBlockId, block);\n}\n\nexport function updateDocument2ImageValue(document: Document2Node, blockId: string, value: string): Document2Node {\n const next = cloneDocument(document);\n function visit(blocks: Document2Block[]): boolean {\n for (const block of blocks) {\n if (block.id === blockId && block.kind === 'image') {\n block.value = value;\n return true;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (visit(item.blocks)) {\n return true;\n }\n }\n }\n }\n return false;\n }\n visit(next.blocks);\n return next;\n}\n\nexport function updateDocument2ImageMeta(document: Document2Node, blockId: string, patch: FloatMetaPatch): Document2Node {\n const next = cloneDocument(document);\n function visit(blocks: Document2Block[]): boolean {\n for (const block of blocks) {\n if (block.id === blockId && block.kind === 'image') {\n applyFloatMetaPatch(block, patch);\n return true;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (visit(item.blocks)) {\n return true;\n }\n }\n }\n }\n return false;\n }\n visit(next.blocks);\n return next;\n}\n\nexport function updateDocument2TableMeta(document: Document2Node, blockId: string, patch: FloatMetaPatch): Document2Node {\n const next = cloneDocument(document);\n function visit(blocks: Document2Block[]): boolean {\n for (const block of blocks) {\n if (block.id === blockId && block.kind === 'table') {\n applyFloatMetaPatch(block, patch);\n return true;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (visit(item.blocks)) {\n return true;\n }\n }\n }\n }\n return false;\n }\n visit(next.blocks);\n return next;\n}\n\nexport function updateMathTokenLabel(\n document: Document2Node,\n tokenId: string,\n patch: { labelEnabled?: boolean; label?: string },\n): Document2Node {\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n const token = field.tokens.find((entry): entry is MathToken2 => entry.id === tokenId && entry.kind === 'math');\n if (!token) {\n return false;\n }\n if (typeof patch.labelEnabled === 'boolean') {\n token.labelEnabled = patch.labelEnabled;\n }\n if (typeof patch.label === 'string') {\n token.label = patch.label;\n }\n return true;\n });\n return next;\n}\n\nfunction refTokenFromKeys(keys: string[], refCommand: 'ref' | 'eqref'): RefToken2 {\n return { id: document2Id('ref'), kind: 'ref', keys: [...keys], refCommand };\n}\n\nexport function insertRefTokenAtCaret(\n document: Document2Node,\n fieldId: string,\n textTokenId: string | null,\n caretOffset: number,\n keys: string[],\n refCommand: 'ref' | 'eqref' = 'ref',\n): Document2Node {\n if (keys.length === 0) {\n return document;\n }\n const next = cloneDocument(document);\n const refToken = refTokenFromKeys(keys, refCommand);\n visitFields(next.blocks, (field) => {\n if (field.id !== fieldId) {\n return false;\n }\n\n const textIndex = textTokenId\n ? field.tokens.findIndex((token) => token.id === textTokenId && token.kind === 'text')\n : field.tokens.findIndex((token) => token.kind === 'text');\n\n if (textIndex < 0) {\n field.tokens.push(refToken);\n field.tokens.push({ id: document2Id('text'), kind: 'text', text: '' });\n return true;\n }\n\n const current = field.tokens[textIndex] as TextToken2;\n const [before, after] = splitTextTokenAt(current, caretOffset);\n const parts: InlineToken2[] = [...field.tokens.slice(0, textIndex)];\n if (before.text.length > 0) {\n parts.push(before);\n }\n parts.push(refToken);\n parts.push(after);\n parts.push(...field.tokens.slice(textIndex + 1));\n field.tokens = normalizeFieldTokens(parts);\n return true;\n });\n return next;\n}\n\nexport function updateRefTokenKeys(\n document: Document2Node,\n tokenId: string,\n keys: string[],\n refCommand?: 'ref' | 'eqref',\n): Document2Node {\n if (keys.length === 0) {\n return document;\n }\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n const token = field.tokens.find((entry): entry is RefToken2 => entry.id === tokenId && entry.kind === 'ref');\n if (!token) {\n return false;\n }\n token.keys = [...keys];\n if (refCommand) {\n token.refCommand = refCommand;\n }\n return true;\n });\n return next;\n}\n\nexport function removeRefTokenById(document: Document2Node, tokenId: string): Document2Node {\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n const index = field.tokens.findIndex((token) => token.id === tokenId && token.kind === 'ref');\n if (index < 0) {\n return false;\n }\n field.tokens = normalizeFieldTokens(stitchTextAroundRemovedToken(field.tokens, index));\n return true;\n });\n return next;\n}\n\nfunction mutateListBlockById(blocks: Document2Block[], listBlockId: string, mutator: (list: ListBlock2) => void): boolean {\n for (const block of blocks) {\n if (block.id === listBlockId && block.kind === 'list') {\n mutator(block);\n return true;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (mutateListBlockById(item.blocks, listBlockId, mutator)) {\n return true;\n }\n }\n }\n }\n return false;\n}\n\nexport function addDocument2ListItem(document: Document2Node, listBlockId: string): Document2Node {\n const next = cloneDocument(document);\n mutateListBlockById(next.blocks, listBlockId, (list) => {\n list.items.push({ id: document2Id('item'), field: createInlineField2(''), blocks: [] });\n });\n return next;\n}\n\nexport function removeDocument2ListItem(document: Document2Node, listBlockId: string, itemId: string): Document2Node {\n const next = cloneDocument(document);\n mutateListBlockById(next.blocks, listBlockId, (list) => {\n if (list.items.length < 2) {\n return;\n }\n const index = list.items.findIndex((item) => item.id === itemId);\n if (index >= 0) {\n list.items.splice(index, 1);\n }\n });\n return next;\n}\n\nfunction citeTokenFromKeys(keys: string[]): CiteToken2 {\n return { id: document2Id('cite'), kind: 'cite', keys: [...keys] };\n}\n\nexport function insertCiteTokenAtCaret(\n document: Document2Node,\n fieldId: string,\n textTokenId: string | null,\n caretOffset: number,\n keys: string[],\n): Document2Node {\n if (keys.length === 0) {\n return document;\n }\n const next = cloneDocument(document);\n const citeToken = citeTokenFromKeys(keys);\n visitFields(next.blocks, (field) => {\n if (field.id !== fieldId) {\n return false;\n }\n\n const textIndex = textTokenId\n ? field.tokens.findIndex((token) => token.id === textTokenId && token.kind === 'text')\n : field.tokens.findIndex((token) => token.kind === 'text');\n\n if (textIndex < 0) {\n field.tokens.push(citeToken);\n field.tokens.push({ id: document2Id('text'), kind: 'text', text: '' });\n return true;\n }\n\n const current = field.tokens[textIndex] as TextToken2;\n const [before, after] = splitTextTokenAt(current, caretOffset);\n const parts: InlineToken2[] = [...field.tokens.slice(0, textIndex)];\n if (before.text.length > 0) {\n parts.push(before);\n }\n parts.push(citeToken);\n parts.push(after);\n parts.push(...field.tokens.slice(textIndex + 1));\n field.tokens = normalizeFieldTokens(parts);\n return true;\n });\n return next;\n}\n\nexport function updateCiteTokenKeys(document: Document2Node, tokenId: string, keys: string[]): Document2Node {\n if (keys.length === 0) {\n return document;\n }\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n const token = field.tokens.find((entry): entry is CiteToken2 => entry.id === tokenId && entry.kind === 'cite');\n if (!token) {\n return false;\n }\n token.keys = [...keys];\n return true;\n });\n return next;\n}\n\nexport function removeCiteTokenById(document: Document2Node, tokenId: string): Document2Node {\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n const index = field.tokens.findIndex((token) => token.id === tokenId && token.kind === 'cite');\n if (index < 0) {\n return false;\n }\n field.tokens = normalizeFieldTokens(stitchTextAroundRemovedToken(field.tokens, index));\n return true;\n });\n return next;\n}\n\nexport function ensureDocument2BibliographyBlock(document: Document2Node, afterBlockId?: string | null): Document2Node {\n if (document.blocks.some((block) => block.kind === 'bibliography')) {\n return document;\n }\n const block: BibliographyBlock2 = {\n id: document2Id('block'),\n kind: 'bibliography',\n command: '\\\\begin{thebibliography}',\n closing: '\\\\end{thebibliography}',\n };\n return insertDocument2BlockAfter(document, afterBlockId ?? null, block);\n}\n\nexport function addDocument2Reference(document: Document2Node, partial: Partial<Reference2Json> = {}): Document2Node {\n const next = cloneDocument(document);\n next.references.push(createEmptyReference2(partial));\n return next;\n}\n\nexport function updateDocument2Reference(document: Document2Node, referenceId: string, patch: Partial<Reference2Json>): Document2Node {\n const next = cloneDocument(document);\n const reference = next.references.find((entry) => entry.id === referenceId);\n if (!reference) {\n return document;\n }\n if (typeof patch.key === 'string' && patch.key.trim().length > 0) {\n reference.key = patch.key.trim();\n }\n if (typeof patch.authors === 'string') {\n reference.authors = patch.authors;\n }\n if (typeof patch.title === 'string') {\n reference.title = patch.title;\n }\n if (typeof patch.year === 'string') {\n reference.year = patch.year;\n }\n if (typeof patch.url === 'string') {\n reference.url = patch.url;\n }\n if (typeof patch.venue === 'string') {\n reference.venue = patch.venue;\n }\n return next;\n}\n\nexport function removeDocument2Reference(document: Document2Node, referenceId: string): Document2Node {\n const next = cloneDocument(document);\n next.references = next.references.filter((reference) => reference.id !== referenceId);\n return next;\n}\n\nexport function moveDocument2Reference(document: Document2Node, referenceId: string, direction: -1 | 1): Document2Node {\n const next = cloneDocument(document);\n const index = next.references.findIndex((reference) => reference.id === referenceId);\n const targetIndex = index + direction;\n if (index < 0 || targetIndex < 0 || targetIndex >= next.references.length) {\n return document;\n }\n const [reference] = next.references.splice(index, 1);\n if (!reference) {\n return document;\n }\n next.references.splice(targetIndex, 0, reference);\n return next;\n}\n\nexport function setDocument2References(document: Document2Node, references: Reference2[]): Document2Node {\n const next = cloneDocument(document);\n next.references = references.map((reference) => ({ ...reference }));\n return next;\n}\n\nexport function updateDocument2Meta(document: Document2Node, patch: Document2MetaProp): Document2Node {\n const next = cloneDocument(document);\n const current = next.meta ?? emptyDocument2Meta();\n next.meta = {\n title: typeof patch.title === 'string' ? patch.title : current.title,\n authors: typeof patch.authors === 'string' ? patch.authors : current.authors,\n abstract: typeof patch.abstract === 'string' ? patch.abstract : current.abstract,\n date: patch.date\n ? normalizeDocument2HijriDate({ ...current.date, ...patch.date })\n : { ...current.date },\n };\n return next;\n}\n","/** Arabic XeLaTeX preamble fragments for full-document export. */\n\nexport type ArabicDigitsMapping = 'arabicdigits' | 'digits';\n\nexport type ArabicXeLatexPreambleOptions = {\n digitsMapping?: ArabicDigitsMapping;\n /** When true, add the article class twocolumn option. Default false. */\n twocolumn?: boolean;\n};\n\nexport function arabicXeLatexPreamblePkg(twocolumn = false): string {\n const classOptions = twocolumn ? '12pt,a4paper,twocolumn' : '12pt,a4paper';\n return (\n `\n\\\\documentclass[${classOptions}]{article}\n` +\n String.raw`\\usepackage{amsmath,amsfonts,amssymb,mathrsfs,tikz,fancyhdr, mathtools}\n\\usepackage{fontspec} % For loading OpenType fonts\n\\usepackage{unicode-math} % For setting the math font\n\\usepackage{polyglossia} % For Arabic support\n\\usepackage{array}\n\\usepackage{cancel}\n\\usepackage{bidi} % For bidirectional text handling\n\\usepackage{multirow}\n\\usepackage{booktabs}\n\\usepackage{graphicx} % For \\reflectbox\n\\usepackage{xcolor}\n\\usepackage{tikz}\n\\usepackage{tcolorbox} % For tcolorbox environment\n\\usepackage{textcomp} % For \\textrightarrow command\n\n\n% visit : https://www.symbolcopy.com/punctuation-symbol.html\n% for inversed punctuation\n\n% save inverted comma for use - copy paste -> ،\n% save back tick for use - copy paste -> ` + '`'\n );\n}\n\nexport function arabicXeLatexPreambleFont(digitsMapping: ArabicDigitsMapping = 'arabicdigits'): string {\n return `\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Toggle between eastern and western digits by changing the Mapping in the below fonts (inside math font as well) between \"arabicdigits\" and \"digits\"\n\\\\setdefaultlanguage[calendar=gregorian]{arabic} % from polyglossia\n\\\\setmainfont[Script=Arabic , Mapping=${digitsMapping}]{Amiri}\n\\\\newfontfamily\\\\diwani[Script=Arabic,Mapping=${digitsMapping}]{Diwani Letter}\n\\\\newfontfamily\\\\diwanioutlineshaded[Script=Arabic,Mapping=${digitsMapping}]{Diwani Outline Shaded}\n\\\\newfontfamily\\\\takween[Script=Arabic,Mapping=${digitsMapping}]{Takween}\n\\\\newfontfamily\\\\boldarabic[Script=Arabic,Mapping=${digitsMapping}]{Amiri Bold}\n\\\\newfontfamily\\\\italicarabic[Script=Arabic,Mapping=${digitsMapping}]{Amiri Italic}\n\n% Explicitly set math font to XITS Math\n% Remove \"Script=Arabic\" to cancel reflected symbols and other RTL symbols\n\\\\setmathfont[Script=Arabic , Mapping=${digitsMapping}]{XITS Math} % Ensure XITS Math is correctly installed and available\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n`;\n}\n\nexport function arabicXeLatexPreambleCmd(): string {\n return String.raw`\n% Run with XeLaTeX compiler\n\\newcommand{\\butextakween}[1]{\\text{\\takween{#1}}}\n\\newcommand{\\butexdiwani}[1]{\\text{\\diwani{#1}}}\n\\newcommand{\\butexdiwanioutline}[1]{\\text{\\diwanioutlineshaded{#1}}}\n\n\\newcommand{\\arabN}{\\text{\\diwanioutlineshaded{ط}}}\n\\newcommand{\\arabZ}{\\text{\\diwanioutlineshaded{ص}}}\n\\newcommand{\\arabQ}{\\text{\\diwanioutlineshaded{ن}}}\n\\newcommand{\\arabR}{\\text{\\diwanioutlineshaded{ح}}}\n\\newcommand{\\arabC}{\\text{\\diwanioutlineshaded{ع}}}\n\\newcommand{\\arabH}{\\text{\\diwanioutlineshaded{ر}}}\n\n\n\\newcommand{\\lowerscript}[1]{\\raisebox{-4pt}{\\scriptsize #1}}\n\\newcommand{\\llowerscript}[1]{\\raisebox{-8pt}{\\scriptsize #1}}\n\\newcommand{\\lllowerscript}[2]{\\raisebox{#2pt}{\\scriptsize #1}}\n\n\\newcommand{\\arabdsub}[3]{\\prescript{}{#1}{\\prescript{}{#2}{#3}}} % arabic double subscript\n\\newcommand{\\arabsub}[2]{\\prescript{}{#1}{#2}} % arabic single subscript\n\n\n\n\\newcommand{\\upperscript}[1]{\\raisebox{8pt}{\\scriptsize #1}}\n\\newcommand{\\uupperscript}[2]{\\raisebox{#2pt}{\\scriptsize #1}}\n\\newcommand{\\vertbar}{\\rule[-1ex]{0.5pt}{2.5ex}}\n\\newcommand{\\horzbar}{\\rule[.5ex]{2.5ex}{0.5pt}}\n\n\\newcommand{\\arabsqrt}[2]{\\reflectbox{\\(\\sqrt[\\reflectbox{\\(#1\\)}]{\\reflectbox{\\(#2\\)}}\\)}}\n\\newcommand{\\arabvec}[1]{\\reflectbox{$\\vec{\\reflectbox{$#1$}}$}}\n\n\\newcommand{\\arabexp}[1]{{}^{#1}\\!\\raisebox{-4.5pt}{\\text{\\diwani{ه}}}}\n\\newcommand{\\arablog}[2]{\\left(\\text{#2}\\right)\\!\\prescript{}{\\text{#1}}{\\text{\\diwani{لو}}}}\n\\newcommand{\\arabnlog}[1]{\\left(\\text{#1}\\right)\\!\\prescript{}{\\text{\\diwani{ه}}}{\\text{\\diwani{لو}}}}\n\n\\newcommand{\\arabcos}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{جتا}}}}\n\\newcommand{\\arabsin}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{جا}}}}\n\\newcommand{\\arabtan}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ظا}}}}\n\\newcommand{\\arabcot}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ظتا}}}}\n\\newcommand{\\arabsec}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قا}}}}\n\\newcommand{\\arabcsc}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قتا}}}}\n\n\\newcommand{\\arabacos}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قجتا}}}}\n\\newcommand{\\arabasin}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قجا}}}}\n\\newcommand{\\arabatan}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قظا}}}}\n\\newcommand{\\arabacot}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قظتا}}}}\n\\newcommand{\\arabasec}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ققا}}}}\n\\newcommand{\\arabacsc}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ققتا}}}}\n\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% summation\n\\newcommand{\\arablim}[2]{\\underset{#2 \\leftarrow #1}{\\text{نـــــها}}}\n\\newcommand{\\arabsum}[2]{\\underset{#1}{\\overset{#2}{\\text{مجـــ}}}}\n\\newcommand{\\arabprod}[2]{\\underset{#1}{\\overset{#2}{\\text{جـــذ}}}}\n\\newcommand{\\arabint}[2]{\\prescript{#2}{#1\\!\\!\\!}\\int}\n\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% we define this command to make it ease for change of notation later\n\\newcommand{\\ad}[0]{\\text{ء}} % \"ad\" for arabic differentiation or derivative (ء\" لإشتقاق\")\n\\newcommand{\\arpi}[0]{\\!\\text{\\diwani{ط}}}\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% differentials\n\n\\newcommand{\\arabdiff}[2]{\\frac{#1\\ad}{#2\\ad}} % arabic differential\n\\newcommand{\\arabddiff}[2]{\\frac{#1{}^{2}\\ad}{{}^{2}#2\\ad}} % arabic second differential\n\n\\newcommand{\\arabode}[2][-5pt]{\\stackrel{\\raisebox{#1}{$\\cdot$}}{\\text{#2}}}\n\\newcommand{\\arabodde}[2][-5pt]{\\stackrel{\\raisebox{#1}{$\\vcenter{\\hbox{$\\cdot\\!\\cdot$}}$}}{\\text{#2}}}\n\\newcommand{\\araboddde}[2][-5pt]{\\stackrel{\\raisebox{#1}{$\\vcenter{\\hbox{$\\cdot\\!\\cdot\\!\\cdot$}}$}}{\\text{#2}}}\n\\newcommand{\\arabpde}[1]{\\prescript{}{#1\\!\\!}{\\nabla}} % arabic partial differential equation (PDE)\n\n\\newcommand{\\arabprime}[0]{\\reflectbox{$\\prime$}\\!} % arabic prime notation\n\\newcommand{\\arabpprime}[0]{\\reflectbox{$\\prime$}\\reflectbox{$\\prime$}\\!} % arabic prime notation\n\\newcommand{\\arabppprime}[0]{\\reflectbox{$\\prime$}\\reflectbox{$\\prime$}\\reflectbox{$\\prime$}\\!} % arabic prime notation\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% probability\n\\newcommand{\\ap}[0]{\\!\\text{\\diwani{حـ}}} % arabic Probability - used a lot so short form\n\\newcommand{\\arabExpct}[0]{\\text{\\diwani{توقـ}}} % arabic Expectation\n\\newcommand{\\arabVar}[0]{\\!\\text{\\diwani{با}}} % arabic Variance\n\\newcommand{\\arabCov}[0]{\\!\\text{\\diwani{ت}}} % arabic Covariance\n\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% custom commands specific to lesson\n\\newcommand{\\lagrange}[2]{\\left(#2\\right)\\!\\prescript{}{#1}{\\text{\\diwani{لا}}}}\n\\newcommand{\\xii}[0]{\\left(\\prescript{}{\\text{يـ}}{\\text{س}}\\right)\\!}\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n\n\\newcommand{\\arsqrt}[2][]{\\reflectbox{\\(\\sqrt[\\reflectbox{\\(#1\\)}]{\\reflectbox{\\(#2\\)}}\\)}}\n\\newcommand{\\arexp}[0]{\\!\\raisebox{-4.5pt}{\\text{\\diwani{ه}}}}\n\\newcommand{\\arlog}[0]{\\!\\!\\text{\\diwani{لو}}}\n\\newcommand{\\arln}[0]{\\!\\!\\prescript{}{\\text{\\diwani{ه}}}{\\text{\\diwani{لو}}}}\n\\newcommand{\\ardet}[0]{\\!\\!\\text{\\diwani{محدد}}}\n\n\\newcommand{\\arsum}[0]{\\text{مجـــ}}\n\\newcommand{\\arprod}[0]{\\text{جـــذ}}\n\n\\newcommand{\\arlim}[0]{\\text{نـــــها}}\n\\newcommand{\\armax}[0]{\\text{أكبر}}\n\\newcommand{\\armin}[0]{\\text{أصغر}}\n\\newcommand{\\arsup}[0]{\\text{أعلى}}\n\\newcommand{\\arinf}[0]{\\text{أدنى}}\n\n\\newcommand{\\arsin}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{جا}}}}\n\\newcommand{\\arcos}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{جتا}}}}\n\\newcommand{\\artan}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ظا}}}}\n\\newcommand{\\arcot}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ظتا}}}}\n\\newcommand{\\arsec}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قا}}}}\n\\newcommand{\\arcsc}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قتا}}}} \n\n\\newcommand{\\arasin}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قجا}}}}\n\\newcommand{\\aracos}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قجتا}}}}\n\\newcommand{\\aratan}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قظا}}}}\n\\newcommand{\\aracot}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قظتا}}}}\n\\newcommand{\\arasec}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ققا}}}}\n\\newcommand{\\aracsc}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ققتا}}}}\n\n\\newcommand{\\arsinh}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{جزا}}}}\n\\newcommand{\\arcosh}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{جتزا}}}}\n\\newcommand{\\artanh}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ظزا}}}}\n\\newcommand{\\arcoth}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ظتزا}}}}\n\\newcommand{\\arsech}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قزا}}}}\n\\newcommand{\\arcsch}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قتزا}}}}\n\n\\newcommand{\\arasinh}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قجزا}}}}\n\\newcommand{\\aracosh}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قجتزا}}}} \n\\newcommand{\\aratanh}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قظزا}}}}\n\\newcommand{\\aracoth}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قظتزا}}}}\n\\newcommand{\\arasech}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ققزا}}}}\n\\newcommand{\\aracsch}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ققتزا}}}}\n\n\\newcommand{\\unit}[1]{\\text{#1}}\n\\newcommand{\\idx}[1]{#1}\n\\newcommand{\\arbinom}[2]{\\left(\\begin{array}{c} #1 \\\\ #2 \\end{array} \\right)}\n`;\n}\n\nexport function getArabicXeLatexPreamble(\n digitsMappingOrOptions: ArabicDigitsMapping | ArabicXeLatexPreambleOptions = 'arabicdigits',\n): string {\n const options: ArabicXeLatexPreambleOptions =\n typeof digitsMappingOrOptions === 'string'\n ? { digitsMapping: digitsMappingOrOptions }\n : digitsMappingOrOptions;\n const digitsMapping = options.digitsMapping ?? 'arabicdigits';\n const twocolumn = options.twocolumn === true;\n return (\n arabicXeLatexPreamblePkg(twocolumn) +\n arabicXeLatexPreambleFont(digitsMapping) +\n arabicXeLatexPreambleCmd()\n );\n}\n","import { renderMathNodeLatex } from '../document/mathObject.js';\nimport {\n getArabicXeLatexPreamble,\n type ArabicDigitsMapping,\n} from './arabicPreamble.js';\nimport {\n BUTEX_BASMALA,\n BUTEX_CLOSING_HAMDALA,\n butexDiwaniDisplayLatex,\n document2HasAbstract,\n document2HasMaketitle,\n emptyDocument2Meta,\n formatHijriDate,\n} from './articleMeta.js';\nimport { bibliographyEntryLatex, citeTokenLatex } from './citations.js';\nimport { refTokenLatex, stripDisplayMathDelimiters } from './labels.js';\nimport type {\n Document2Block,\n Document2Meta,\n Document2Node,\n ImageBlock2,\n InlineField2,\n InlineToken2,\n ListBlock2,\n MathToken2,\n TableBlock2,\n TextBlock2,\n} from './types.js';\n\nexport type Document2LatexOptions = {\n /**\n * When true (default), emit a complete Arabic XeLaTeX file:\n * preamble + \\\\begin{document} + body + \\\\end{document}.\n * Pass false for body-only blocks.\n */\n wrapDocument?: boolean;\n /** Font digit Mapping when wrapping. Default 'arabicdigits'. */\n digitsMapping?: ArabicDigitsMapping;\n /** When true, use article class option twocolumn. Default false. */\n twocolumn?: boolean;\n};\n\nfunction mathBodyLatex(token: MathToken2): string {\n if (!token.math || token.sourceOwner === 'raw' || token.sourceOwner === 'editor') {\n return stripDisplayMathDelimiters(token.source);\n }\n const rendered = renderMathNodeLatex(token.math);\n return stripDisplayMathDelimiters(rendered);\n}\n\nfunction tokenLatex(token: InlineToken2): string {\n if (token.kind === 'text') {\n return token.text;\n }\n if (token.kind === 'cite') {\n return citeTokenLatex(token.keys);\n }\n if (token.kind === 'ref') {\n return refTokenLatex(token.keys, token.refCommand);\n }\n if (token.display && token.labelEnabled && token.label && token.label.trim().length > 0) {\n const body = mathBodyLatex(token);\n return `\\\\begin{equation}\\n${body}\\n\\\\label{${token.label.trim()}}\\n\\\\end{equation}`;\n }\n if (!token.math || token.sourceOwner === 'raw' || token.sourceOwner === 'editor') {\n return token.source;\n }\n return renderMathNodeLatex(token.math);\n}\n\nexport function inlineFieldLatex(field: InlineField2): string {\n return field.tokens.map((token) => tokenLatex(token)).join('');\n}\n\nfunction textBlockLatex(block: TextBlock2): string {\n const body = `${block.command}{${inlineFieldLatex(block.field)}}`;\n if (block.command === '\\\\paragraph' && block.centered) {\n return `\\\\begin{center}\\n${body}\\n\\\\end{center}`;\n }\n return body;\n}\n\nfunction indent(value: string): string {\n return value\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n}\n\nfunction listBlockLatex(block: ListBlock2, references: Document2Node['references']): string {\n const items = block.items\n .map((item) => {\n const nested = item.blocks.map((child) => '\\n' + indent(blockLatex(child, references))).join('');\n return ` \\\\item ${inlineFieldLatex(item.field)}${nested}`;\n })\n .join('\\n');\n return `${block.command}\\n${items}\\n${block.closing}`;\n}\n\nfunction tabularInnerLatex(block: TableBlock2): string {\n const rows = block.rows\n .map((row) => ` ${row.map((cell) => inlineFieldLatex(cell)).join(' & ')}`)\n .join(' \\\\\\\\\\n');\n return `${block.command}{${block.columns}}\\n${rows}\\n${block.closing}`;\n}\n\nfunction floatCaptionLabelLines(block: ImageBlock2 | TableBlock2): string[] {\n const lines: string[] = [];\n if (block.captionEnabled && block.caption.trim().length > 0) {\n lines.push(` \\\\caption{${block.caption.trim()}}`);\n }\n if (block.labelEnabled && block.label.trim().length > 0) {\n lines.push(` \\\\label{${block.label.trim()}}`);\n }\n return lines;\n}\n\nfunction tableBlockLatex(block: TableBlock2): string {\n const lines = ['\\\\begin{table}[htbp]'];\n if (block.centered) {\n lines.push(' \\\\centering');\n }\n lines.push(...floatCaptionLabelLines(block));\n lines.push(indent(tabularInnerLatex(block)));\n lines.push('\\\\end{table}');\n return lines.join('\\n');\n}\n\nfunction imageOptionsLatex(block: ImageBlock2): 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 imageBlockLatex(block: ImageBlock2): string {\n const lines = ['\\\\begin{figure}[htbp]'];\n if (block.centered) {\n lines.push(' \\\\centering');\n }\n lines.push(` ${block.command}${imageOptionsLatex(block)}{${block.value}}`);\n lines.push(...floatCaptionLabelLines(block));\n lines.push('\\\\end{figure}');\n return lines.join('\\n');\n}\n\nfunction blockLatex(block: Document2Block, references: Document2Node['references']): string {\n if (block.kind === 'textBlock') {\n return textBlockLatex(block);\n }\n if (block.kind === 'list') {\n return listBlockLatex(block, references);\n }\n if (block.kind === 'table') {\n return tableBlockLatex(block);\n }\n if (block.kind === 'image') {\n return imageBlockLatex(block);\n }\n if (block.kind === 'bibliography') {\n const width = String(Math.max(references.length, 9));\n const items = references.map((reference) => ` ${bibliographyEntryLatex(reference)}`).join('\\n');\n return `${block.command}{${width}}\\n${items}\\n${block.closing}`;\n }\n return block.value;\n}\n\nfunction authorLatex(authors: string): string {\n return authors\n .split(/\\n+/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(' \\\\\\\\ ');\n}\n\nfunction articleFrontMatterLatex(meta: Document2Meta): string[] {\n const parts: string[] = [butexDiwaniDisplayLatex(BUTEX_BASMALA)];\n if (document2HasMaketitle(meta)) {\n if (meta.title.trim().length > 0) {\n parts.push(`\\\\title{${meta.title.trim()}}`);\n }\n if (meta.authors.trim().length > 0) {\n parts.push(`\\\\author{${authorLatex(meta.authors)}}`);\n }\n parts.push(`\\\\date{${formatHijriDate(meta.date, { locale: 'ar', digitForm: 'arabicIndic' })}}`);\n parts.push('\\\\maketitle');\n }\n if (document2HasAbstract(meta)) {\n parts.push(`\\\\begin{abstract}\\n${meta.abstract.trim()}\\n\\\\end{abstract}`);\n }\n return parts;\n}\n\nexport function document2Latex(\n document: Document2Node,\n options: Document2LatexOptions = {},\n): string {\n const meta = document.meta ?? emptyDocument2Meta();\n const front = articleFrontMatterLatex(meta);\n const bodyBlocks = document.blocks.map((block) => blockLatex(block, document.references));\n const closing = butexDiwaniDisplayLatex(BUTEX_CLOSING_HAMDALA);\n const body = [...front, ...bodyBlocks, closing].filter((part) => part.length > 0).join('\\n\\n');\n const wrapDocument = options.wrapDocument !== false;\n if (!wrapDocument) {\n return body;\n }\n const preamble = getArabicXeLatexPreamble({\n digitsMapping: options.digitsMapping ?? 'arabicdigits',\n twocolumn: options.twocolumn === true,\n });\n return `${preamble}\\n\\\\begin{document}\\n\\n${body}\\n\\n\\\\end{document}\\n`;\n}\n","import type { Document2Node } from './types.js';\nimport { cloneDocument2Node } from './commands.js';\n\nexport const DEFAULT_DOCUMENT2_HISTORY_MAX_DEPTH = 100;\n\nexport type Document2HistoryStacks = {\n past: Document2Node[];\n future: Document2Node[];\n maxDepth: number;\n};\n\nexport function createDocument2History(maxDepth: number = DEFAULT_DOCUMENT2_HISTORY_MAX_DEPTH): Document2HistoryStacks {\n return { past: [], future: [], maxDepth };\n}\n\nexport function pushDocument2Snapshot(stacks: Document2HistoryStacks, documentBeforeEdit: Document2Node): void {\n stacks.past.push(cloneDocument2Node(documentBeforeEdit));\n if (stacks.past.length > stacks.maxDepth) {\n stacks.past.splice(0, stacks.past.length - stacks.maxDepth);\n }\n stacks.future = [];\n}\n\nexport function restoreDocument2Undo(stacks: Document2HistoryStacks, documentNow: Document2Node): Document2Node | null {\n if (stacks.past.length === 0) {\n return null;\n }\n stacks.future.push(cloneDocument2Node(documentNow));\n return stacks.past.pop() ?? null;\n}\n\nexport function restoreDocument2Redo(stacks: Document2HistoryStacks, documentNow: Document2Node): Document2Node | null {\n if (stacks.future.length === 0) {\n return null;\n }\n stacks.past.push(cloneDocument2Node(documentNow));\n return stacks.future.pop() ?? null;\n}\n\nexport function document2HistoryCanUndo(stacks: Document2HistoryStacks): boolean {\n return stacks.past.length > 0;\n}\n\nexport function document2HistoryCanRedo(stacks: Document2HistoryStacks): boolean {\n return stacks.future.length > 0;\n}\n","export type BlockSelectionRange = { from: number; to: number };\n\nexport type BlockSelectionState = {\n selection: BlockSelectionRange | null;\n anchor: number | null;\n};\n\nexport function emptyBlockSelection(): BlockSelectionState {\n return { selection: null, anchor: null };\n}\n\nexport function normalizeBlockSelection(\n selection: BlockSelectionRange | null,\n blockCount: number,\n): BlockSelectionRange | null {\n if (!selection) {\n return null;\n }\n const { from, to } = selection;\n if (\n blockCount <= 0 ||\n from < 0 ||\n to < 0 ||\n from >= blockCount ||\n to >= blockCount ||\n from > to\n ) {\n return null;\n }\n return { from, to };\n}\n\nfunction inRange(selection: BlockSelectionRange, index: number): boolean {\n return index >= selection.from && index <= selection.to;\n}\n\n/** Checkbox click without Shift */\nexport function toggleBlockInSelection(\n state: BlockSelectionState,\n index: number,\n blockCount: number,\n): BlockSelectionState {\n if (index < 0 || index >= blockCount) {\n return state;\n }\n\n const selection = normalizeBlockSelection(state.selection, blockCount);\n if (!selection) {\n return { selection: { from: index, to: index }, anchor: index };\n }\n\n if (inRange(selection, index)) {\n if (selection.from === selection.to) {\n return emptyBlockSelection();\n }\n if (index === selection.from) {\n return { selection: { from: selection.from + 1, to: selection.to }, anchor: state.anchor };\n }\n if (index === selection.to) {\n return { selection: { from: selection.from, to: selection.to - 1 }, anchor: state.anchor };\n }\n return emptyBlockSelection();\n }\n\n if (index === selection.from - 1) {\n return { selection: { from: index, to: selection.to }, anchor: state.anchor ?? index };\n }\n if (index === selection.to + 1) {\n return { selection: { from: selection.from, to: index }, anchor: state.anchor ?? index };\n }\n\n return { selection: { from: index, to: index }, anchor: index };\n}\n\n/** Shift+click on checkbox or header label */\nexport function extendBlockSelectionFromAnchor(\n state: BlockSelectionState,\n index: number,\n blockCount: number,\n): BlockSelectionState {\n if (index < 0 || index >= blockCount) {\n return state;\n }\n\n const anchor = state.anchor ?? index;\n const from = Math.min(anchor, index);\n const to = Math.max(anchor, index);\n return {\n selection: { from, to },\n anchor: state.anchor ?? index,\n };\n}\n\nexport function remapSelectionAfterRangeMove(\n selection: BlockSelectionRange,\n direction: -1 | 1,\n): BlockSelectionRange {\n return { from: selection.from + direction, to: selection.to + direction };\n}\n","import { formatBibliographyNumber, formatCiteLabel } from './citations.js';\nimport {\n BUTEX_BASMALA,\n BUTEX_CLOSING_HAMDALA,\n butexDiwaniDisplayTex,\n document2HasAbstract,\n document2HasMaketitle,\n emptyDocument2Meta,\n formatHijriDate,\n} from './articleMeta.js';\nimport { formatRefLabel, labelNumberMap } from './labels.js';\nimport { mathTokenSourceForSide } from './mathBridge.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { EditorSide } from '../editor/index.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport type {\n Document2Block,\n Document2Direction,\n Document2MathOutput,\n Document2Node,\n Document2Preview,\n InlineField2,\n MathIsland2,\n PreviewBlock2,\n PreviewInline2,\n TextBlock2,\n} from './types.js';\n\nexport type Document2PreviewOptions = {\n documentDirection?: Document2Direction;\n digitForm?: DigitFormId;\n uiLocale?: ButexUiLocale;\n};\n\nfunction mathTex(token: Extract<InlineField2['tokens'][number], { kind: 'math' }>, equationSide: EditorSide): string {\n return mathTokenSourceForSide(token, equationSide);\n}\n\nfunction previewInlines(\n field: InlineField2,\n islands: MathIsland2[],\n output: Document2MathOutput,\n equationSide: EditorSide,\n document: Document2Node,\n previewOptions: Document2PreviewOptions,\n): PreviewInline2[] {\n return field.tokens.map((token) => {\n if (token.kind === 'text') {\n return { kind: 'text', text: token.text };\n }\n if (token.kind === 'cite') {\n return {\n kind: 'cite',\n id: token.id,\n keys: [...token.keys],\n label: formatCiteLabel(token.keys, document.references, {\n documentDirection: previewOptions.documentDirection,\n digitForm: previewOptions.digitForm,\n }),\n };\n }\n if (token.kind === 'ref') {\n return {\n kind: 'ref',\n id: token.id,\n keys: [...token.keys],\n refCommand: token.refCommand,\n label: formatRefLabel(token.keys, document, token.refCommand, {\n documentDirection: previewOptions.documentDirection,\n digitForm: previewOptions.digitForm,\n }),\n };\n }\n const island = {\n id: token.id,\n tex: mathTex(token, equationSide),\n display: token.display,\n output,\n editable: token.editable,\n };\n islands.push(island);\n return { kind: 'math', ...island };\n });\n}\n\nfunction textBlockPreview(\n block: TextBlock2,\n islands: MathIsland2[],\n output: Document2MathOutput,\n equationSide: EditorSide,\n document: Document2Node,\n previewOptions: Document2PreviewOptions,\n): PreviewBlock2 {\n const inlines = previewInlines(block.field, islands, output, equationSide, document, previewOptions);\n if (block.command === '\\\\section') {\n return { kind: 'heading', id: block.id, level: 1, inlines };\n }\n if (block.command === '\\\\subsection') {\n return { kind: 'heading', id: block.id, level: 2, inlines };\n }\n if (block.command === '\\\\subsubsection') {\n return { kind: 'heading', id: block.id, level: 3, inlines };\n }\n return {\n kind: 'paragraph',\n id: block.id,\n inlines,\n ...(block.centered ? { centered: true } : {}),\n };\n}\n\nfunction floatNumberLabel(\n document: Document2Node,\n key: string | undefined,\n previewOptions: Document2PreviewOptions,\n): string | undefined {\n if (!key || key.trim().length === 0) {\n return undefined;\n }\n const hit = labelNumberMap(document).get(key.trim());\n if (!hit || (hit.kind !== 'fig' && hit.kind !== 'tab')) {\n return undefined;\n }\n const locale = previewOptions.uiLocale ?? 'ar';\n const kindWord =\n hit.kind === 'fig'\n ? locale === 'ar'\n ? 'الشكل'\n : 'Figure'\n : locale === 'ar'\n ? 'الجدول'\n : 'Table';\n const digits = formatBibliographyNumber(hit.number, {\n documentDirection: previewOptions.documentDirection,\n digitForm: previewOptions.digitForm,\n });\n return `${kindWord} ${digits}`;\n}\n\nfunction blockPreview(\n block: Document2Block,\n islands: MathIsland2[],\n output: Document2MathOutput,\n equationSide: EditorSide,\n document: Document2Node,\n previewOptions: Document2PreviewOptions,\n): PreviewBlock2 {\n if (block.kind === 'textBlock') {\n return textBlockPreview(block, islands, output, equationSide, document, previewOptions);\n }\n if (block.kind === 'list') {\n return {\n kind: 'list',\n id: block.id,\n ordered: block.command === '\\\\begin{enumerate}',\n items: block.items.map((item) => ({\n id: item.id,\n inlines: previewInlines(item.field, islands, output, equationSide, document, previewOptions),\n blocks: item.blocks.map((child) => blockPreview(child, islands, output, equationSide, document, previewOptions)),\n })),\n };\n }\n if (block.kind === 'table') {\n const label = block.labelEnabled ? block.label.trim() : '';\n return {\n kind: 'table',\n id: block.id,\n rows: block.rows.map((row) => row.map((cell) => previewInlines(cell, islands, output, equationSide, document, previewOptions))),\n ...(block.captionEnabled && block.caption.trim().length > 0 ? { caption: block.caption.trim() } : {}),\n ...(label.length > 0 ? { label, numberLabel: floatNumberLabel(document, label, previewOptions) } : {}),\n };\n }\n if (block.kind === 'image') {\n const label = block.labelEnabled ? block.label.trim() : '';\n return {\n kind: 'image',\n id: block.id,\n src: block.value,\n ...(block.assetId !== undefined ? { assetId: block.assetId } : {}),\n options: block.options,\n ...(block.captionEnabled && block.caption.trim().length > 0 ? { caption: block.caption.trim() } : {}),\n ...(label.length > 0 ? { label, numberLabel: floatNumberLabel(document, label, previewOptions) } : {}),\n };\n }\n if (block.kind === 'bibliography') {\n return {\n kind: 'bibliography',\n id: block.id,\n items: document.references.map((reference, index) => ({\n id: reference.id,\n numberLabel: formatBibliographyNumber(index + 1, {\n documentDirection: previewOptions.documentDirection,\n digitForm: previewOptions.digitForm,\n }),\n key: reference.key,\n authors: reference.authors,\n title: reference.title,\n year: reference.year,\n url: reference.url,\n venue: reference.venue,\n })),\n };\n }\n return { kind: 'omit', id: block.id };\n}\n\nfunction articleChromePreview(\n document: Document2Node,\n uiLocale: ButexUiLocale,\n previewOptions: Document2PreviewOptions,\n): PreviewBlock2[] {\n const meta = document.meta ?? emptyDocument2Meta();\n const blocks: PreviewBlock2[] = [\n { kind: 'basmala', id: 'article-basmala', text: BUTEX_BASMALA, tex: butexDiwaniDisplayTex(BUTEX_BASMALA) },\n ];\n if (document2HasMaketitle(meta)) {\n blocks.push({\n kind: 'titleBlock',\n id: 'article-title',\n ...(meta.title.trim().length > 0 ? { title: meta.title.trim() } : {}),\n ...(meta.authors.trim().length > 0 ? { authors: meta.authors.trim() } : {}),\n date: formatHijriDate(meta.date, {\n locale: uiLocale,\n digitForm: previewOptions.digitForm,\n }),\n });\n }\n if (document2HasAbstract(meta)) {\n blocks.push({ kind: 'abstract', id: 'article-abstract', text: meta.abstract.trim() });\n }\n return blocks;\n}\n\nexport function document2Preview(\n document: Document2Node,\n output: Document2MathOutput = 'svg',\n equationSide: EditorSide = 'arabic',\n previewOptions: Document2PreviewOptions = {},\n): Document2Preview {\n const mathIslands: MathIsland2[] = [];\n const options: Document2PreviewOptions = {\n documentDirection: previewOptions.documentDirection ?? 'rtl',\n digitForm:\n previewOptions.digitForm ??\n (previewOptions.documentDirection === 'ltr' ? 'western' : 'arabicIndic'),\n uiLocale: previewOptions.uiLocale ?? 'ar',\n };\n const body = document.blocks.map((block) => blockPreview(block, mathIslands, output, equationSide, document, options));\n return {\n blocks: [\n ...articleChromePreview(document, options.uiLocale ?? 'ar', options),\n ...body,\n { kind: 'closing', id: 'article-closing', text: BUTEX_CLOSING_HAMDALA, tex: butexDiwaniDisplayTex(BUTEX_CLOSING_HAMDALA) },\n ],\n mathIslands,\n };\n}\n","import type { ButexUiLocale } from '../uiLocale.js';\n\nexport const DOCUMENT2_MESSAGES = {\n ar: {\n undoRedo: 'تراجع وإعادة', undo: 'تراجع', redo: 'إعادة', structure: 'هيكل', content: 'محتوى',\n equations: 'معادلات', citations: 'اقتباسات ومراجع', lists: 'قوائم', figures: 'صور',\n addSection: 'إضافة قسم',\n addSubsection: 'إضافة فرع', addSubsubsection: 'إضافة فرع صغير', addParagraph: 'إضافة فقرة',\n inlineEquation: 'معادلة داخل السطر', displayEquation: 'معادلة معروضة', bulletedList: 'قائمة نقطية',\n numberedList: 'قائمة مرقمة', insertImage: 'إدراج صورة', insertTable: 'إدراج جدول', tableSize: 'حجم الجدول',\n rows: 'صفوف', columns: 'أعمدة', insert: 'إدراج', panels: 'اللوحات', hideEditor: 'إخفاء التحرير', editor: 'تحرير',\n hidePreview: 'إخفاء المعاينة', preview: 'معاينة', collapseBlocks: 'طي الكتل', collapseAll: 'طي الكل', openAll: 'فتح الكل',\n documentEditor: 'تحرير المستند', documentPreview: 'معاينة المستند', importWarnings: 'تنبيهات الاستيراد (وضع التطوير)',\n emptyDocument: 'المستند فارغ', text: 'نص', editEquation: 'تحرير المعادلة', rawEquation: 'معادلة خام',\n deleteEquation: 'حذف المعادلة', equationUnavailable: 'هذه المعادلة غير متاحة للتحرير حاليا', closeEquationDialog: 'إغلاق نافذة المعادلة',\n equationEditorTitle: 'تحرير المعادلة', close: 'إغلاق', equationType: 'نوع المعادلة', inline: 'داخل السطر', displayed: 'معروضة',\n saveEquation: 'حفظ المعادلة', section: 'قسم', subsection: 'فرع', subsubsection: 'فرع صغير', paragraph: 'فقرة',\n list: 'قائمة', table: 'جدول', image: 'صورة', raw: 'خام', bibliography: 'المراجع', openBlock: 'فتح الكتلة', collapseBlock: 'طي الكتلة',\n moveUp: 'نقل لأعلى', moveDown: 'نقل لأسفل', deleteBlock: 'حذف الكتلة', item: 'عنصر', deleteItem: 'حذف العنصر',\n addItem: 'عنصر', imagePath: 'مسار ملف الصورة', imagePathLabel: 'مسار الصورة', loadDocumentError: 'تعذر تحميل المستند',\n emptyImagePath: 'لا يوجد مسار صورة',\n blockSelection: 'تحديد الكتل', selectBlock: 'تحديد الكتلة', selectedBlockCount: 'محددة',\n importOrderMismatch: 'ترتيب أو أنواع المحددات في math_objects لا تطابق ما ورد في النص.',\n importCountMismatch: 'عدم تطابق بين المواضع الرياضية المستخرجة من النص وعدد عناصر math_objects.',\n importWarning: 'تنبيه الاستيراد', path: 'المسار', sectionGlyph: 'ق', subsectionGlyph: 'ف', subsubsectionGlyph: 'ص', paragraphGlyph: 'أبج',\n insertCitation: 'إدراج اقتباس', insertBibliography: 'إدراج قائمة المراجع', manageReferences: 'إدارة المراجع',\n insertInternalRef: 'إدراج مرجع داخلي', manageLabels: 'إدارة التسميات',\n refPickerTitle: 'اختيار تسمية', noLabelsYet: 'لا توجد تسميات بعد. أضف تسمية لشكل أو جدول أو معادلة أولاً.',\n editInternalRef: 'تحرير المرجع الداخلي', deleteInternalRef: 'حذف المرجع الداخلي',\n labelsTitle: 'التسميات والمراجع الداخلية', labelsHelp: 'التسميات للمراجع داخل المستند؛ المراجع الببليوغرافية للاقتباسات من قائمة المراجع.',\n captionToggle: 'تعليق', labelToggle: 'تسمية', centerParagraph: 'توسيط الفقرة', captionPlaceholder: 'نص التعليق',\n figureLabelPlaceholder: 'مفتاح…', tableLabelPlaceholder: 'مفتاح…', equationLabelPlaceholder: 'مفتاح…',\n floatCaption: 'التعليق', floatLabel: 'المفتاح', labelKindFig: 'شكل', labelKindTab: 'جدول', labelKindEq: 'معادلة',\n citePickerTitle: 'اختيار المراجع', noReferencesYet: 'لا توجد مراجع بعد. أضف مرجعاً أولاً.',\n editCitation: 'تحرير الاقتباس', deleteCitation: 'حذف الاقتباس', referencesTitle: 'المراجع', addReference: 'إضافة مرجع',\n deleteReference: 'حذف المرجع', referenceKey: 'المفتاح', referenceAuthors: 'المؤلفون', referenceTitle: 'العنوان',\n referenceYear: 'السنة', referenceVenue: 'المجلة / المؤتمر', referenceUrl: 'الرابط', chooseDigitForm: 'شكل الأرقام',\n westernDigits: 'أرقام غربية', arabicIndicDigits: 'أرقام عربية هندية', persianIndicDigits: 'أرقام فارسية',\n articleMetaTitle: 'عنوان المقال', articleTitle: 'العنوان', articleAuthors: 'المؤلفون',\n articleDate: 'التاريخ الهجري', articleDay: 'اليوم', articleMonth: 'الشهر', articleYear: 'السنة',\n articleAbstract: 'ملخص', articleMetaBadge: 'بيانات المقال',\n },\n en: {\n undoRedo: 'Undo and redo', undo: 'Undo', redo: 'Redo', structure: 'Structure', content: 'Content',\n equations: 'Equations', citations: 'Citations and references', lists: 'Lists', figures: 'Figures',\n addSection: 'Add section',\n addSubsection: 'Add subsection', addSubsubsection: 'Add subsubsection', addParagraph: 'Add paragraph',\n inlineEquation: 'Inline equation', displayEquation: 'Display equation', bulletedList: 'Bulleted list', numberedList: 'Numbered list',\n insertImage: 'Insert image', insertTable: 'Insert table', tableSize: 'Table size', rows: 'Rows', columns: 'Columns', insert: 'Insert',\n panels: 'Panels', hideEditor: 'Hide editor', editor: 'Editor', hidePreview: 'Hide preview', preview: 'Preview',\n collapseBlocks: 'Collapse blocks', collapseAll: 'Collapse all', openAll: 'Open all', documentEditor: 'Document editor',\n documentPreview: 'Document preview', importWarnings: 'Import warnings (development mode)', emptyDocument: 'The document is empty',\n text: 'Text', editEquation: 'Edit equation', rawEquation: 'Raw equation', deleteEquation: 'Delete equation',\n equationUnavailable: 'This equation is not currently available for editing', closeEquationDialog: 'Close equation dialog',\n equationEditorTitle: 'Edit equation', close: 'Close', equationType: 'Equation type', inline: 'Inline', displayed: 'Displayed',\n saveEquation: 'Save equation', section: 'Section', subsection: 'Subsection', subsubsection: 'Subsubsection', paragraph: 'Paragraph',\n list: 'List', table: 'Table', image: 'Image', raw: 'Raw', bibliography: 'Bibliography', openBlock: 'Open block', collapseBlock: 'Collapse block',\n moveUp: 'Move up', moveDown: 'Move down', deleteBlock: 'Delete block', item: 'Item', deleteItem: 'Delete item', addItem: 'Item',\n imagePath: 'File path (\\\\includegraphics)', imagePathLabel: 'Image path', loadDocumentError: 'Could not load document',\n emptyImagePath: 'Empty image path',\n blockSelection: 'Block selection', selectBlock: 'Select block', selectedBlockCount: 'selected',\n importOrderMismatch: 'The math_objects delimiter order or types do not match the document text.',\n importCountMismatch: 'The detected math positions do not match the number of math_objects entries.', importWarning: 'Import warning', path: 'Path',\n sectionGlyph: 'H1', subsectionGlyph: 'H2', subsubsectionGlyph: 'H3', paragraphGlyph: 'P',\n insertCitation: 'Insert citation', insertBibliography: 'Insert bibliography', manageReferences: 'Manage references',\n insertInternalRef: 'Insert internal reference', manageLabels: 'Manage labels',\n refPickerTitle: 'Select label', noLabelsYet: 'No labels yet. Enable a label on a figure, table, or equation first.',\n editInternalRef: 'Edit internal reference', deleteInternalRef: 'Delete internal reference',\n labelsTitle: 'Labels and internal refs', labelsHelp: 'Labels are for in-document refs; bibliography entries are for citations from the reference list.',\n captionToggle: 'Caption', labelToggle: 'Label', centerParagraph: 'Center paragraph', captionPlaceholder: 'Caption text',\n figureLabelPlaceholder: 'fig:…', tableLabelPlaceholder: 'tab:…', equationLabelPlaceholder: 'eq:…',\n floatCaption: 'Caption', floatLabel: 'Key', labelKindFig: 'Figure', labelKindTab: 'Table', labelKindEq: 'Equation',\n citePickerTitle: 'Select references', noReferencesYet: 'No references yet. Add a reference first.',\n editCitation: 'Edit citation', deleteCitation: 'Delete citation', referencesTitle: 'References', addReference: 'Add reference',\n deleteReference: 'Delete reference', referenceKey: 'Key', referenceAuthors: 'Authors', referenceTitle: 'Title',\n referenceYear: 'Year', referenceVenue: 'Journal / conference', referenceUrl: 'URL', chooseDigitForm: 'Digit form',\n westernDigits: 'Western digits', arabicIndicDigits: 'Arabic-Indic digits', persianIndicDigits: 'Persian digits',\n articleMetaTitle: 'Article title', articleTitle: 'Title', articleAuthors: 'Authors',\n articleDate: 'Hijri date', articleDay: 'Day', articleMonth: 'Month', articleYear: 'Year',\n articleAbstract: 'Abstract', articleMetaBadge: 'Article meta',\n },\n} as const;\n\nexport type Document2Messages = (typeof DOCUMENT2_MESSAGES)['ar'] | (typeof DOCUMENT2_MESSAGES)['en'];\n\nexport function document2Messages(locale: ButexUiLocale): Document2Messages {\n return DOCUMENT2_MESSAGES[locale];\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n addDocument2ImageBlock,\n addDocument2ListBlock,\n addDocument2ListItem,\n addDocument2Reference,\n addDocument2TableBlock,\n addDocument2TextBlock,\n collectDocument2Labels,\n createDocument2History,\n createEmptyEquationSession,\n createEmptyDocument2,\n document2HistoryCanRedo,\n document2HistoryCanUndo,\n document2Latex,\n document2Preview,\n emptyBlockSelection,\n ensureDocument2BibliographyBlock,\n extendBlockSelectionFromAnchor,\n fromDocumentJson2,\n insertCiteTokenAtCaret,\n insertMathTokenAtCaret,\n insertRefTokenAtCaret,\n mathTokenToEditorSession,\n moveDocument2BlockRange,\n moveDocument2Reference,\n normalizeBlockSelection,\n pushDocument2Snapshot,\n remapSelectionAfterRangeMove,\n removeCiteTokenById,\n removeDocument2BlockRange,\n removeDocument2ListItem,\n removeDocument2Reference,\n removeMathTokenById,\n removeRefTokenById,\n replaceMathTokenFromSession,\n restoreDocument2Redo,\n restoreDocument2Undo,\n toggleBlockInSelection,\n updateCiteTokenKeys,\n updateDocument2ImageMeta,\n updateDocument2ImageValue,\n updateDocument2Reference,\n updateDocument2TableMeta,\n updateMathTokenLabel,\n updateRefTokenKeys,\n updateTextToken,\n updateDocument2TextBlockCentered,\n updateDocument2Meta,\n emptyDocument2Meta,\n mergeDocument2Meta,\n fillDocument2MetaGaps,\n type CiteToken2,\n type Document2Diagnostic,\n type Document2HistoryStacks,\n type Document2MetaProp,\n type InlineField2,\n type Document2Json,\n type Document2MathOutput,\n type Document2Node,\n type MathToken2,\n type RefToken2,\n} from '../document2/index.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { EditorSession, EditorSide } from '../editor/index.js';\nimport { ArticleMetaPanel, focusArticleMetaPanel } from './ArticleMetaPanel.js';\nimport { BlockEditor } from './BlockEditor.js';\nimport { CitePickerPopover } from './CitePickerPopover.js';\nimport { DocumentInsertToolbar } from './DocumentInsertToolbar.js';\nimport { DocumentPreview } from './DocumentPreview.js';\nimport { EquationDrawer, type EquationMathMode } from './EquationDrawer.js';\nimport { LabelsPanel } from './LabelsPanel.js';\nimport { ReferencesPanel } from './ReferencesPanel.js';\nimport { RefPickerPopover } from './RefPickerPopover.js';\nimport { createEmptyDocument2EditorFocus, resolveInsertAfterBlockId, resolveInsertField, type Document2EditorFocus } from './editorFocus.js';\nimport { injectBuTeXDocument2Styles } from './documentWidgetCss2.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { uiLocaleDirection } from '../uiLocale.js';\nimport { document2Messages, type Document2Messages } from './uiMessages.js';\n\nexport type ButexDocumentEditor2Props = {\n initialDocument?: Document2Json | Document2Node;\n /** Seed article metadata when JSON/node omits fields (JSON wins when present). */\n documentMeta?: Document2MetaProp;\n className?: string;\n debug?: boolean;\n documentDirection?: 'rtl' | 'ltr';\n equationSide?: EditorSide;\n editableEquations?: boolean;\n /** When true, render only the read-only document preview (no toolbar, editor panel, or equation drawer). */\n previewOnly?: boolean;\n uiLocale?: ButexUiLocale;\n mathOutput?: Document2MathOutput;\n /** Digit shaping for citation and bibliography numbers (western / arabicIndic / persianIndic). */\n digitForm?: DigitFormId;\n onDigitFormChange?: (digitForm: DigitFormId) => void;\n /** Host maps assetId / literal value to a browser-loadable image URL (S3, CDN, local). */\n resolveImageUrl?: (ref: { assetId?: string; value: string }) => string;\n onDocumentChange?: (document: Document2Node) => void;\n onLatexChange?: (latex: string) => void;\n};\n\nexport type Document2InitialState = {\n document: Document2Node;\n error: string | null;\n};\n\ntype SelectedMath2 = {\n tokenId: string | null;\n fieldId: string | null;\n insertAt: number;\n textTokenId: string | null;\n mathMode: EquationMathMode;\n session: EditorSession;\n reason: string | null;\n labelEnabled: boolean;\n label: string;\n};\n\ntype SelectedCite2 = {\n tokenId: string | null;\n fieldId: string | null;\n textTokenId: string | null;\n caretOffset: number;\n keys: string[];\n};\n\ntype SelectedRef2 = {\n tokenId: string | null;\n fieldId: string | null;\n textTokenId: string | null;\n caretOffset: number;\n keys: string[];\n refCommand: 'ref' | 'eqref';\n};\n\ntype PendingFocus2 =\n | { kind: 'text'; fieldId: string; textTokenId: string; caretOffset: number }\n | { kind: 'math'; tokenId: string }\n | { kind: 'cite'; tokenId: string }\n | { kind: 'ref'; tokenId: string };\n\nfunction mathDelimiters(mode: EquationMathMode): { opening: string; closing: string } {\n return mode === 'inline' ? { opening: '$', closing: '$' } : { opening: '\\\\[', closing: '\\\\]' };\n}\n\nfunction findInlineFieldById(document: Document2Node, fieldId: string): InlineField2 | null {\n function visit(blocks: Document2Node['blocks']): InlineField2 | null {\n for (const block of blocks) {\n if (block.kind === 'textBlock' && block.field.id === fieldId) {\n return block.field;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (item.field.id === fieldId) {\n return item.field;\n }\n const nested = visit(item.blocks);\n if (nested) {\n return nested;\n }\n }\n }\n if (block.kind === 'table') {\n for (const row of block.rows) {\n for (const cell of row) {\n if (cell.id === fieldId) {\n return cell;\n }\n }\n }\n }\n }\n return null;\n }\n return visit(document.blocks);\n}\n\nfunction findInlineFieldContainingToken(document: Document2Node, tokenId: string): InlineField2 | null {\n function visit(blocks: Document2Node['blocks']): InlineField2 | null {\n for (const block of blocks) {\n if (block.kind === 'textBlock' && block.field.tokens.some((token) => token.id === tokenId)) {\n return block.field;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (item.field.tokens.some((token) => token.id === tokenId)) {\n return item.field;\n }\n const nested = visit(item.blocks);\n if (nested) {\n return nested;\n }\n }\n }\n if (block.kind === 'table') {\n for (const row of block.rows) {\n for (const cell of row) {\n if (cell.tokens.some((token) => token.id === tokenId)) {\n return cell;\n }\n }\n }\n }\n }\n return null;\n }\n return visit(document.blocks);\n}\n\nfunction trailingTextTokenAfterInsertedMath(\n before: Document2Node,\n after: Document2Node,\n fieldId: string,\n textTokenId: string | null,\n caretOffset: number,\n): string | null {\n const afterField = findInlineFieldById(after, fieldId);\n if (!afterField) {\n return null;\n }\n if (!textTokenId) {\n const lastText = [...afterField.tokens].reverse().find((token) => token.kind === 'text');\n return lastText?.id ?? null;\n }\n\n const beforeField = findInlineFieldById(before, fieldId);\n const beforeIndex = beforeField?.tokens.findIndex((token) => token.id === textTokenId) ?? -1;\n const beforeToken = beforeField?.tokens[beforeIndex];\n if (!beforeToken || beforeToken.kind !== 'text') {\n return null;\n }\n\n const safeOffset = Math.max(0, Math.min(caretOffset, beforeToken.text.length));\n const expectedIndex = beforeIndex + (safeOffset > 0 ? 2 : 1);\n const expected = afterField.tokens[expectedIndex];\n if (expected?.kind === 'text') {\n return expected.id;\n }\n const nextText = afterField.tokens.slice(expectedIndex).find((token) => token.kind === 'text');\n return nextText?.id ?? null;\n}\n\nfunction focusAfterDeletedMath(before: Document2Node, after: Document2Node, tokenId: string): PendingFocus2 | null {\n const beforeField = findInlineFieldContainingToken(before, tokenId);\n if (!beforeField) {\n return null;\n }\n const index = beforeField.tokens.findIndex((token) => token.id === tokenId);\n const previous = beforeField.tokens[index - 1];\n const next = beforeField.tokens[index + 1];\n const afterField = findInlineFieldById(after, beforeField.id);\n if (!afterField) {\n return null;\n }\n if (previous?.kind === 'text') {\n return { kind: 'text', fieldId: beforeField.id, textTokenId: previous.id, caretOffset: previous.text.length };\n }\n if (next?.kind === 'text') {\n return { kind: 'text', fieldId: beforeField.id, textTokenId: next.id, caretOffset: 0 };\n }\n const remainingText = afterField.tokens.find((token) => token.kind === 'text');\n return remainingText?.kind === 'text' ? { kind: 'text', fieldId: beforeField.id, textTokenId: remainingText.id, caretOffset: 0 } : null;\n}\n\nfunction blockHasField(block: Document2Node['blocks'][number], fieldId: string): boolean {\n if (block.kind === 'textBlock') {\n return block.field.id === fieldId;\n }\n if (block.kind === 'list') {\n return block.items.some((item) => item.field.id === fieldId || item.blocks.some((child) => blockHasField(child, fieldId)));\n }\n if (block.kind === 'table') {\n return block.rows.some((row) => row.some((cell) => cell.id === fieldId));\n }\n return false;\n}\n\nfunction blockHasToken(block: Document2Node['blocks'][number], tokenId: string): boolean {\n if (block.kind === 'textBlock') {\n return block.field.tokens.some((token) => token.id === tokenId);\n }\n if (block.kind === 'list') {\n return block.items.some(\n (item) => item.field.tokens.some((token) => token.id === tokenId) || item.blocks.some((child) => blockHasToken(child, tokenId)),\n );\n }\n if (block.kind === 'table') {\n return block.rows.some((row) => row.some((cell) => cell.tokens.some((token) => token.id === tokenId)));\n }\n return false;\n}\n\nfunction topLevelBlockIdForField(document: Document2Node, fieldId: string): string | null {\n return document.blocks.find((block) => blockHasField(block, fieldId))?.id ?? null;\n}\n\nfunction topLevelBlockIdForToken(document: Document2Node, tokenId: string): string | null {\n return document.blocks.find((block) => blockHasToken(block, tokenId))?.id ?? null;\n}\n\nfunction formatDocument2Diagnostic(d: Document2Diagnostic, messages: Document2Messages): string {\n if (d.message === 'math_objects order mismatch') {\n return `${messages.importOrderMismatch} ${messages.path}: ${d.path}`;\n }\n const countMismatch = /^math_objects count mismatch: detected (\\d+), got (\\d+)$/.exec(d.message);\n if (countMismatch) {\n const [, detected, got] = countMismatch;\n return `${messages.importCountMismatch} (${detected}/${got}) ${messages.path}: ${d.path}`;\n }\n return `${messages.importWarning}: ${d.message} — ${messages.path}: ${d.path}`;\n}\n\nfunction isDocument2Node(value: unknown): value is Document2Node {\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 Array.isArray((value as { diagnostics?: unknown }).diagnostics)\n );\n}\n\nfunction applyDocumentMetaSeed(document: Document2Node, documentMeta?: Document2MetaProp): Document2Node {\n const current = document.meta ?? emptyDocument2Meta();\n return {\n ...document,\n meta: fillDocument2MetaGaps(current, documentMeta),\n };\n}\n\nexport function resolveInitialDocument2(\n initialDocument: Document2Json | Document2Node | undefined,\n uiLocale: ButexUiLocale = 'ar',\n documentMeta?: Document2MetaProp,\n): Document2InitialState {\n if (!initialDocument) {\n return {\n document: applyDocumentMetaSeed(createEmptyDocument2(), documentMeta),\n error: null,\n };\n }\n if (isDocument2Node(initialDocument)) {\n return { document: applyDocumentMetaSeed(initialDocument, documentMeta), error: null };\n }\n try {\n const imported = fromDocumentJson2(initialDocument);\n return {\n document: {\n ...imported,\n meta: mergeDocument2Meta(initialDocument.meta, documentMeta),\n },\n error: null,\n };\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n return {\n document: applyDocumentMetaSeed(createEmptyDocument2(), documentMeta),\n error: `${document2Messages(uiLocale).loadDocumentError}: ${detail}`,\n };\n }\n}\n\nexport function ButexDocumentEditor2({\n initialDocument,\n documentMeta,\n className,\n debug = false,\n documentDirection = 'rtl',\n equationSide = 'arabic',\n editableEquations = true,\n previewOnly = false,\n uiLocale = 'ar',\n mathOutput = 'svg',\n digitForm: digitFormProp,\n onDigitFormChange,\n resolveImageUrl,\n onDocumentChange,\n onLatexChange,\n}: ButexDocumentEditor2Props) {\n const messages = document2Messages(uiLocale);\n const initialState = useMemo(\n () => resolveInitialDocument2(initialDocument, uiLocale, documentMeta),\n [initialDocument, documentMeta, uiLocale],\n );\n const [documentNode, setDocumentNode] = useState(initialState.document);\n const [error, setError] = useState(initialState.error);\n const [editorOpen, setEditorOpen] = useState(true);\n const [previewOpen, setPreviewOpen] = useState(true);\n const [selectedMath, setSelectedMath] = useState<SelectedMath2 | null>(null);\n const [citePicker, setCitePicker] = useState<SelectedCite2 | null>(null);\n const [referencesOpen, setReferencesOpen] = useState(false);\n const [labelsOpen, setLabelsOpen] = useState(false);\n const [refPicker, setRefPicker] = useState<SelectedRef2 | null>(null);\n const [digitFormState, setDigitFormState] = useState<DigitFormId | null>(null);\n const [editorFocus, setEditorFocus] = useState<Document2EditorFocus>(createEmptyDocument2EditorFocus());\n const [collapsedBlockIds, setCollapsedBlockIds] = useState<Set<string>>(() => new Set());\n const [blockSelectionState, setBlockSelectionState] = useState(emptyBlockSelection);\n const [historyTick, setHistoryTick] = useState(0);\n\n const digitForm: DigitFormId =\n digitFormProp ?? digitFormState ?? (documentDirection === 'rtl' ? 'arabicIndic' : 'western');\n\n const historyRef = useRef<Document2HistoryStacks>(createDocument2History());\n const documentRef = useRef(documentNode);\n const textSnapshotArmedRef = useRef(false);\n const textDebounceRef = useRef<number | null>(null);\n const widgetRef = useRef<HTMLDivElement>(null);\n const articleMetaPanelRef = useRef<HTMLElement | null>(null);\n const pendingFocusRef = useRef<PendingFocus2 | null>(null);\n\n documentRef.current = documentNode;\n const latex = document2Latex(documentNode);\n const documentLabels = useMemo(() => collectDocument2Labels(documentNode), [documentNode]);\n const preview = useMemo(\n () =>\n document2Preview(documentNode, mathOutput, equationSide, {\n documentDirection,\n digitForm,\n uiLocale,\n }),\n [documentNode, documentDirection, digitForm, equationSide, mathOutput, uiLocale],\n );\n const debugEnabled = useMemo(() => {\n if (debug) {\n return true;\n }\n if (typeof window === 'undefined') {\n return false;\n }\n return new URLSearchParams(window.location.search).get('debug') === '1';\n }, [debug]);\n\n const canUndo = useMemo(() => document2HistoryCanUndo(historyRef.current), [historyTick, documentNode]);\n const canRedo = useMemo(() => document2HistoryCanRedo(historyRef.current), [historyTick, documentNode]);\n const blockSelection = normalizeBlockSelection(blockSelectionState.selection, documentNode.blocks.length);\n const selectionCount = blockSelection ? blockSelection.to - blockSelection.from + 1 : 0;\n const canMoveSelectionUp = Boolean(blockSelection && blockSelection.from > 0);\n const canMoveSelectionDown = Boolean(blockSelection && blockSelection.to < documentNode.blocks.length - 1);\n\n function clearBlockSelection(): void {\n setBlockSelectionState(emptyBlockSelection());\n }\n\n function toggleSelectBlock(blockId: string, shiftKey: boolean): void {\n const index = documentRef.current.blocks.findIndex((block) => block.id === blockId);\n if (index < 0) {\n return;\n }\n const blockCount = documentRef.current.blocks.length;\n setBlockSelectionState((current) =>\n shiftKey\n ? extendBlockSelectionFromAnchor(current, index, blockCount)\n : toggleBlockInSelection(current, index, blockCount),\n );\n }\n\n function moveSelectedBlocks(direction: -1 | 1): void {\n const selection = normalizeBlockSelection(blockSelectionState.selection, documentRef.current.blocks.length);\n if (!selection) {\n return;\n }\n const next = moveDocument2BlockRange(documentRef.current, selection.from, selection.to, direction);\n if (next === documentRef.current) {\n return;\n }\n applyDocument(next, 'immediate');\n const remapped = remapSelectionAfterRangeMove(selection, direction);\n setBlockSelectionState({\n selection: normalizeBlockSelection(remapped, next.blocks.length),\n anchor: blockSelectionState.anchor === null ? null : blockSelectionState.anchor + direction,\n });\n }\n\n function deleteSelectedBlocks(): void {\n const selection = normalizeBlockSelection(blockSelectionState.selection, documentRef.current.blocks.length);\n if (!selection) {\n return;\n }\n applyDocument(removeDocument2BlockRange(documentRef.current, selection.from, selection.to), 'immediate');\n clearBlockSelection();\n }\n\n useEffect(() => {\n injectBuTeXDocument2Styles();\n }, []);\n\n useEffect(() => {\n if (!editableEquations || previewOnly) {\n setSelectedMath(null);\n }\n }, [editableEquations, previewOnly]);\n\n useEffect(() => {\n const next = resolveInitialDocument2(initialDocument, uiLocale, documentMeta);\n setDocumentNode(next.document);\n setError(next.error);\n setSelectedMath(null);\n setCollapsedBlockIds(new Set());\n historyRef.current = createDocument2History();\n setHistoryTick((tick) => tick + 1);\n }, [initialDocument, documentMeta, uiLocale]);\n\n useEffect(() => {\n onDocumentChange?.(documentNode);\n }, [documentNode, onDocumentChange]);\n\n useEffect(() => {\n onLatexChange?.(latex);\n }, [latex, onLatexChange]);\n\n useEffect(() => {\n const pending = pendingFocusRef.current;\n const root = widgetRef.current;\n if (!pending || !root) {\n return;\n }\n pendingFocusRef.current = null;\n requestAnimationFrame(() => {\n if (pending.kind === 'math') {\n const mathButton = Array.from(root.querySelectorAll<HTMLButtonElement>('[data-math-token-id]')).find(\n (button) => button.dataset.mathTokenId === pending.tokenId,\n );\n mathButton?.focus();\n return;\n }\n if (pending.kind === 'cite') {\n const citeButton = Array.from(root.querySelectorAll<HTMLButtonElement>('[data-cite-token-id]')).find(\n (button) => button.dataset.citeTokenId === pending.tokenId,\n );\n citeButton?.focus();\n return;\n }\n if (pending.kind === 'ref') {\n const refButton = Array.from(root.querySelectorAll<HTMLButtonElement>('[data-ref-token-id]')).find(\n (button) => button.dataset.refTokenId === pending.tokenId,\n );\n refButton?.focus();\n return;\n }\n const textarea = Array.from(root.querySelectorAll<HTMLTextAreaElement>('textarea[data-field-id][data-text-token-id]')).find(\n (element) => element.dataset.fieldId === pending.fieldId && element.dataset.textTokenId === pending.textTokenId,\n );\n if (!textarea) {\n return;\n }\n const safeOffset = Math.max(0, Math.min(pending.caretOffset, textarea.value.length));\n textarea.focus();\n textarea.setSelectionRange(safeOffset, safeOffset);\n });\n }, [documentNode]);\n\n const bumpHistoryUi = useCallback(() => {\n setHistoryTick((tick) => tick + 1);\n }, []);\n\n const applyDocument = useCallback(\n (next: Document2Node, mode: 'immediate' | 'text' | 'none' = 'immediate') => {\n if (mode === 'immediate') {\n pushDocument2Snapshot(historyRef.current, documentRef.current);\n bumpHistoryUi();\n } else if (mode === 'text') {\n if (!textSnapshotArmedRef.current) {\n pushDocument2Snapshot(historyRef.current, documentRef.current);\n textSnapshotArmedRef.current = true;\n bumpHistoryUi();\n }\n if (textDebounceRef.current !== null) {\n window.clearTimeout(textDebounceRef.current);\n }\n textDebounceRef.current = window.setTimeout(() => {\n textSnapshotArmedRef.current = false;\n }, 400);\n }\n setDocumentNode(next);\n },\n [bumpHistoryUi],\n );\n\n const afterBlockId = useCallback(() => resolveInsertAfterBlockId(documentRef.current, editorFocus), [editorFocus]);\n\n function undoDocument(): void {\n const restored = restoreDocument2Undo(historyRef.current, documentRef.current);\n if (!restored) {\n return;\n }\n textSnapshotArmedRef.current = false;\n clearBlockSelection();\n setDocumentNode(restored);\n bumpHistoryUi();\n }\n\n function redoDocument(): void {\n const restored = restoreDocument2Redo(historyRef.current, documentRef.current);\n if (!restored) {\n return;\n }\n textSnapshotArmedRef.current = false;\n clearBlockSelection();\n setDocumentNode(restored);\n bumpHistoryUi();\n }\n\n function openBlock(blockId: string | null | undefined): void {\n if (!blockId) {\n return;\n }\n setCollapsedBlockIds((current) => {\n if (!current.has(blockId)) {\n return current;\n }\n const next = new Set(current);\n next.delete(blockId);\n return next;\n });\n }\n\n function toggleBlockCollapse(blockId: string): void {\n setCollapsedBlockIds((current) => {\n const next = new Set(current);\n if (next.has(blockId)) {\n next.delete(blockId);\n } else {\n next.add(blockId);\n }\n return next;\n });\n }\n\n function collapseAllBlocks(): void {\n setCollapsedBlockIds(new Set(documentRef.current.blocks.map((block) => block.id)));\n }\n\n function openAllBlocks(): void {\n setCollapsedBlockIds(new Set());\n }\n\n useEffect(() => {\n const root = widgetRef.current;\n if (!root) {\n return;\n }\n const onKeyDown = (event: KeyboardEvent): void => {\n if (!editorOpen) {\n return;\n }\n const mod = event.ctrlKey || event.metaKey;\n if (!mod) {\n return;\n }\n if (event.key.toLowerCase() === 'z' && !event.shiftKey) {\n event.preventDefault();\n undoDocument();\n } else if ((event.key.toLowerCase() === 'z' && event.shiftKey) || event.key.toLowerCase() === 'y') {\n event.preventDefault();\n redoDocument();\n }\n };\n root.addEventListener('keydown', onKeyDown);\n return () => root.removeEventListener('keydown', onKeyDown);\n }, [editorOpen]);\n\n function rememberFieldFocus(blockId: string, fieldId: string, textTokenId: string, caretOffset: number): void {\n openBlock(blockId);\n clearBlockSelection();\n setEditorFocus({ blockId, fieldId, textTokenId, caretOffset });\n }\n\n function rememberMathFocus(blockId: string, fieldId: string): void {\n openBlock(blockId);\n clearBlockSelection();\n setEditorFocus({ blockId, fieldId, textTokenId: null, caretOffset: 0 });\n }\n\n function rememberBlockFocus(blockId: string): void {\n openBlock(blockId);\n setEditorFocus((current) => ({ ...current, blockId }));\n }\n\n function onFieldBlur(): void {\n textSnapshotArmedRef.current = false;\n }\n\n function openNewEquation(mode: EquationMathMode): void {\n if (!editableEquations) {\n return;\n }\n const target = resolveInsertField(documentRef.current, editorFocus);\n if (target?.fieldId) {\n openBlock(topLevelBlockIdForField(documentRef.current, target.fieldId));\n }\n setSelectedMath({\n tokenId: null,\n fieldId: target?.fieldId ?? null,\n textTokenId: target?.textTokenId ?? null,\n insertAt: target?.caretOffset ?? 0,\n mathMode: mode,\n session: createEmptyEquationSession(equationSide),\n reason: null,\n labelEnabled: false,\n label: '',\n });\n }\n\n function openMath(token: MathToken2): void {\n if (!editableEquations) {\n return;\n }\n openBlock(topLevelBlockIdForToken(documentRef.current, token.id));\n const result = mathTokenToEditorSession(token.math, equationSide);\n const mode: EquationMathMode = token.display ? 'display' : 'inline';\n if (!result.editable) {\n setSelectedMath({\n tokenId: token.id,\n fieldId: null,\n insertAt: 0,\n textTokenId: null,\n mathMode: mode,\n session: createEmptyEquationSession(equationSide),\n reason: result.reason,\n labelEnabled: Boolean(token.labelEnabled),\n label: token.label ?? '',\n });\n return;\n }\n setSelectedMath({\n tokenId: token.id,\n fieldId: null,\n insertAt: 0,\n textTokenId: null,\n mathMode: mode,\n session: result.session,\n reason: null,\n labelEnabled: Boolean(token.labelEnabled),\n label: token.label ?? '',\n });\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 saveEquation(session: EditorSession): void {\n if (!selectedMath) {\n return;\n }\n const delimiters = mathDelimiters(selectedMath.mathMode);\n if (selectedMath.tokenId) {\n let next = replaceMathTokenFromSession(\n documentRef.current,\n selectedMath.tokenId,\n session,\n delimiters.opening,\n delimiters.closing,\n equationSide,\n );\n if (selectedMath.mathMode === 'display') {\n next = updateMathTokenLabel(next, selectedMath.tokenId, {\n labelEnabled: selectedMath.labelEnabled,\n label: selectedMath.label,\n });\n } else {\n next = updateMathTokenLabel(next, selectedMath.tokenId, { labelEnabled: false, label: '' });\n }\n pendingFocusRef.current = { kind: 'math', tokenId: selectedMath.tokenId };\n applyDocument(next, 'immediate');\n setSelectedMath(null);\n return;\n }\n\n let current = documentRef.current;\n let fieldId = selectedMath.fieldId;\n let textTokenId = selectedMath.textTokenId;\n let insertAt = selectedMath.insertAt;\n\n if (!fieldId) {\n const anchor = afterBlockId();\n current = addDocument2TextBlock(current, '\\\\paragraph', anchor);\n const anchorIndex = anchor ? current.blocks.findIndex((block) => block.id === anchor) : -1;\n const newIndex = anchorIndex >= 0 ? anchorIndex + 1 : current.blocks.length - 1;\n const newBlock = current.blocks[newIndex];\n const field = newBlock?.kind === 'textBlock' ? newBlock.field : null;\n if (!field) {\n setSelectedMath(null);\n return;\n }\n fieldId = field.id;\n textTokenId = field.tokens.find((token) => token.kind === 'text')?.id ?? null;\n insertAt = 0;\n }\n\n let next = insertMathTokenAtCaret(\n current,\n fieldId,\n textTokenId,\n insertAt,\n session,\n delimiters.opening,\n delimiters.closing,\n equationSide,\n );\n const trailingTextTokenId = trailingTextTokenAfterInsertedMath(current, next, fieldId, textTokenId, insertAt);\n const fieldAfter = findInlineFieldById(next, fieldId);\n const insertedMathId =\n trailingTextTokenId && fieldAfter\n ? fieldAfter.tokens[\n Math.max(\n 0,\n fieldAfter.tokens.findIndex((token) => token.id === trailingTextTokenId) - 1,\n )\n ]?.kind === 'math'\n ? fieldAfter.tokens[\n Math.max(\n 0,\n fieldAfter.tokens.findIndex((token) => token.id === trailingTextTokenId) - 1,\n )\n ]?.id\n : null\n : fieldAfter?.tokens.filter((token) => token.kind === 'math').at(-1)?.id ?? null;\n if (insertedMathId && selectedMath.mathMode === 'display' && selectedMath.labelEnabled) {\n next = updateMathTokenLabel(next, insertedMathId, {\n labelEnabled: true,\n label: selectedMath.label,\n });\n }\n if (trailingTextTokenId) {\n pendingFocusRef.current = { kind: 'text', fieldId, textTokenId: trailingTextTokenId, caretOffset: 0 };\n }\n applyDocument(next, 'immediate');\n setSelectedMath(null);\n }\n\n function deleteSelectedEquation(): void {\n if (!selectedMath?.tokenId) {\n return;\n }\n const current = documentRef.current;\n const next = removeMathTokenById(current, selectedMath.tokenId);\n pendingFocusRef.current = focusAfterDeletedMath(current, next, selectedMath.tokenId);\n applyDocument(next, 'immediate');\n setSelectedMath(null);\n }\n\n function deleteMathToken(tokenId: string): void {\n const current = documentRef.current;\n const next = removeMathTokenById(current, tokenId);\n pendingFocusRef.current = focusAfterDeletedMath(current, next, tokenId);\n applyDocument(next, 'immediate');\n }\n\n function openCitePickerForInsert(): void {\n const target = resolveInsertField(documentRef.current, editorFocus);\n setCitePicker({\n tokenId: null,\n fieldId: target?.fieldId ?? null,\n textTokenId: target?.textTokenId ?? editorFocus.textTokenId,\n caretOffset: target?.caretOffset ?? editorFocus.caretOffset,\n keys: [],\n });\n }\n\n function openCite(token: CiteToken2): void {\n setCitePicker({\n tokenId: token.id,\n fieldId: null,\n textTokenId: null,\n caretOffset: 0,\n keys: [...token.keys],\n });\n }\n\n function confirmCiteKeys(keys: string[]): void {\n if (!citePicker || keys.length === 0) {\n setCitePicker(null);\n return;\n }\n if (citePicker.tokenId) {\n applyDocument(updateCiteTokenKeys(documentRef.current, citePicker.tokenId, keys), 'immediate');\n pendingFocusRef.current = { kind: 'cite', tokenId: citePicker.tokenId };\n setCitePicker(null);\n return;\n }\n const target = resolveInsertField(documentRef.current, editorFocus);\n const fieldId = citePicker.fieldId ?? target?.fieldId;\n if (!fieldId) {\n setCitePicker(null);\n return;\n }\n const textTokenId = citePicker.textTokenId ?? target?.textTokenId ?? null;\n const caretOffset = citePicker.caretOffset ?? target?.caretOffset ?? 0;\n const next = insertCiteTokenAtCaret(documentRef.current, fieldId, textTokenId, caretOffset, keys);\n applyDocument(next, 'immediate');\n setCitePicker(null);\n }\n\n function deleteCiteToken(tokenId: string): void {\n applyDocument(removeCiteTokenById(documentRef.current, tokenId), 'immediate');\n }\n\n function openRefPickerForInsert(): void {\n const target = resolveInsertField(documentRef.current, editorFocus);\n setRefPicker({\n tokenId: null,\n fieldId: target?.fieldId ?? null,\n textTokenId: target?.textTokenId ?? editorFocus.textTokenId,\n caretOffset: target?.caretOffset ?? editorFocus.caretOffset,\n keys: [],\n refCommand: 'ref',\n });\n }\n\n function openRef(token: RefToken2): void {\n setRefPicker({\n tokenId: token.id,\n fieldId: null,\n textTokenId: null,\n caretOffset: 0,\n keys: [...token.keys],\n refCommand: token.refCommand,\n });\n }\n\n function confirmRefKeys(keys: string[], refCommand: 'ref' | 'eqref'): void {\n if (!refPicker || keys.length === 0) {\n setRefPicker(null);\n return;\n }\n if (refPicker.tokenId) {\n applyDocument(updateRefTokenKeys(documentRef.current, refPicker.tokenId, keys, refCommand), 'immediate');\n pendingFocusRef.current = { kind: 'ref', tokenId: refPicker.tokenId };\n setRefPicker(null);\n return;\n }\n const target = resolveInsertField(documentRef.current, editorFocus);\n const fieldId = refPicker.fieldId ?? target?.fieldId;\n if (!fieldId) {\n setRefPicker(null);\n return;\n }\n const textTokenId = refPicker.textTokenId ?? target?.textTokenId ?? null;\n const caretOffset = refPicker.caretOffset ?? target?.caretOffset ?? 0;\n const next = insertRefTokenAtCaret(documentRef.current, fieldId, textTokenId, caretOffset, keys, refCommand);\n applyDocument(next, 'immediate');\n setRefPicker(null);\n }\n\n function deleteRefToken(tokenId: string): void {\n applyDocument(removeRefTokenById(documentRef.current, tokenId), 'immediate');\n }\n\n const showEditorPanel = !previewOnly && editorOpen;\n const showPreviewPanel = previewOnly || previewOpen;\n\n return (\n <div\n ref={widgetRef}\n className={['butex-document2-widget', className].filter(Boolean).join(' ')}\n dir={uiLocaleDirection(uiLocale)}\n lang={uiLocale}\n >\n <div className=\"butex-document2-widget__shell\">\n {!previewOnly ? (\n <div className=\"butex-document2-widget__toolbar\">\n <DocumentInsertToolbar\n canUndo={canUndo}\n canRedo={canRedo}\n editableEquations={editableEquations}\n uiLocale={uiLocale}\n digitForm={digitForm}\n selectionCount={selectionCount}\n canMoveSelectionUp={canMoveSelectionUp}\n canMoveSelectionDown={canMoveSelectionDown}\n onUndo={undoDocument}\n onRedo={redoDocument}\n onMoveSelectionUp={() => moveSelectedBlocks(-1)}\n onMoveSelectionDown={() => moveSelectedBlocks(1)}\n onDeleteSelection={deleteSelectedBlocks}\n onAddSection={() => {\n clearBlockSelection();\n applyDocument(addDocument2TextBlock(documentRef.current, '\\\\section', afterBlockId()), 'immediate');\n }}\n onAddSubsection={() => {\n clearBlockSelection();\n applyDocument(addDocument2TextBlock(documentRef.current, '\\\\subsection', afterBlockId()), 'immediate');\n }}\n onAddSubsubsection={() => {\n clearBlockSelection();\n applyDocument(addDocument2TextBlock(documentRef.current, '\\\\subsubsection', afterBlockId()), 'immediate');\n }}\n onAddParagraph={() => {\n clearBlockSelection();\n applyDocument(addDocument2TextBlock(documentRef.current, '\\\\paragraph', afterBlockId()), 'immediate');\n }}\n onAddInlineEquation={() => openNewEquation('inline')}\n onAddDisplayEquation={() => openNewEquation('display')}\n onAddTable={(rowCount, colCount) => {\n clearBlockSelection();\n applyDocument(addDocument2TableBlock(documentRef.current, 'l'.repeat(colCount), rowCount, colCount, afterBlockId()), 'immediate');\n }}\n onAddList={() => {\n clearBlockSelection();\n applyDocument(addDocument2ListBlock(documentRef.current, false, afterBlockId()), 'immediate');\n }}\n onAddEnumerate={() => {\n clearBlockSelection();\n applyDocument(addDocument2ListBlock(documentRef.current, true, afterBlockId()), 'immediate');\n }}\n onAddFigure={() => {\n clearBlockSelection();\n applyDocument(addDocument2ImageBlock(documentRef.current, '', afterBlockId()), 'immediate');\n }}\n onInsertCitation={openCitePickerForInsert}\n onInsertInternalRef={openRefPickerForInsert}\n onInsertBibliography={() => {\n clearBlockSelection();\n applyDocument(ensureDocument2BibliographyBlock(documentRef.current, afterBlockId()), 'immediate');\n }}\n onManageReferences={() => setReferencesOpen(true)}\n onManageLabels={() => setLabelsOpen(true)}\n onOpenArticleMeta={() => focusArticleMetaPanel(articleMetaPanelRef.current)}\n onDigitFormChange={(next) => {\n setDigitFormState(next);\n onDigitFormChange?.(next);\n }}\n />\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.panels}>\n <button type=\"button\" aria-pressed={editorOpen} onClick={toggleEditorPanel}>\n {editorOpen ? messages.hideEditor : messages.editor}\n </button>\n <button type=\"button\" aria-pressed={previewOpen} onClick={togglePreviewPanel}>\n {previewOpen ? messages.hidePreview : messages.preview}\n </button>\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.collapseBlocks}>\n <button type=\"button\" onClick={collapseAllBlocks}>\n {messages.collapseAll}\n </button>\n <button type=\"button\" onClick={openAllBlocks}>\n {messages.openAll}\n </button>\n </div>\n </div>\n ) : null}\n {error ? <p className=\"butex-document2-widget__error\">{error}</p> : null}\n <div\n className={`butex-document2-widget__layout butex-document2-widget__layout--editor-${showEditorPanel ? 'open' : 'closed'} butex-document2-widget__layout--preview-${showPreviewPanel ? 'open' : 'closed'}`}\n >\n {!previewOnly ? (\n <section\n className=\"butex-document2-widget__panel butex-document2-widget__editor-panel\"\n aria-label={messages.documentEditor}\n aria-hidden={!showEditorPanel}\n >\n <div className=\"butex-document2-widget__blocks\">\n <ArticleMetaPanel\n meta={documentNode.meta ?? emptyDocument2Meta()}\n uiLocale={uiLocale}\n digitForm={digitForm}\n panelRef={articleMetaPanelRef}\n onChange={(patch) => {\n clearBlockSelection();\n applyDocument(updateDocument2Meta(documentRef.current, patch), 'text');\n }}\n />\n {documentNode.blocks.map((block, blockIndex) => (\n <BlockEditor\n key={block.id}\n block={block}\n references={documentNode.references}\n documentNode={documentNode}\n documentDirection={documentDirection}\n digitForm={digitForm}\n mathOutput={mathOutput}\n equationSide={equationSide}\n editableEquations={editableEquations}\n editableCitations={!previewOnly}\n uiLocale={uiLocale}\n isCollapsed={collapsedBlockIds.has(block.id)}\n selected={Boolean(blockSelection && blockIndex >= blockSelection.from && blockIndex <= blockSelection.to)}\n onToggleSelect={toggleSelectBlock}\n onTextChange={(fieldId, tokenId, text) => {\n clearBlockSelection();\n applyDocument(updateTextToken(documentRef.current, fieldId, tokenId, text), 'text');\n }}\n onOpenMath={openMath}\n onDeleteMath={editableEquations ? deleteMathToken : undefined}\n onOpenCite={openCite}\n onDeleteCite={deleteCiteToken}\n onOpenRef={openRef}\n onDeleteRef={deleteRefToken}\n onToggleCollapse={toggleBlockCollapse}\n onBlockFocus={rememberBlockFocus}\n onFieldFocus={rememberFieldFocus}\n onMathFocus={rememberMathFocus}\n onFieldBlur={onFieldBlur}\n onImageSrcChange={(blockId, value) => {\n clearBlockSelection();\n applyDocument(updateDocument2ImageValue(documentRef.current, blockId, value), 'text');\n }}\n onFloatMetaChange={(blockId, kind, patch) => {\n clearBlockSelection();\n applyDocument(\n kind === 'image'\n ? updateDocument2ImageMeta(documentRef.current, blockId, patch)\n : updateDocument2TableMeta(documentRef.current, blockId, patch),\n 'text',\n );\n }}\n onParagraphCenteredChange={(blockId, centered) => {\n clearBlockSelection();\n applyDocument(updateDocument2TextBlockCentered(documentRef.current, blockId, centered), 'text');\n }}\n onAddListItem={(listBlockId) => {\n clearBlockSelection();\n applyDocument(addDocument2ListItem(documentRef.current, listBlockId), 'immediate');\n }}\n onRemoveListItem={(listBlockId, itemId) => {\n clearBlockSelection();\n applyDocument(removeDocument2ListItem(documentRef.current, listBlockId, itemId), 'immediate');\n }}\n onManageReferences={() => setReferencesOpen(true)}\n />\n ))}\n </div>\n </section>\n ) : null}\n <section\n className=\"butex-document2-widget__panel butex-document2-widget__preview-panel\"\n aria-label={messages.documentPreview}\n aria-hidden={!showPreviewPanel}\n >\n <DocumentPreview\n blocks={preview.blocks}\n output={mathOutput}\n documentDirection={documentDirection}\n uiLocale={uiLocale}\n resolveImageUrl={resolveImageUrl}\n />\n </section>\n </div>\n {debugEnabled ? (\n <div className=\"butex-document2-widget__dev\">\n {debugEnabled && documentNode.diagnostics.length > 0 ? (\n <>\n <strong>{messages.importWarnings}</strong>\n {documentNode.diagnostics.map((diagnostic) => (\n <p key={`${diagnostic.path}-${diagnostic.message}`} className=\"butex-document2-widget__dev-diagnostic\">\n {formatDocument2Diagnostic(diagnostic, messages)}\n </p>\n ))}\n </>\n ) : null}\n <strong>LaTeX</strong>\n <pre>{latex}</pre>\n <strong>AST</strong>\n <pre>{JSON.stringify(documentNode, null, 2)}</pre>\n </div>\n ) : null}\n {!previewOnly && selectedMath ? (\n <EquationDrawer\n session={selectedMath.session}\n reason={selectedMath.reason}\n mathMode={selectedMath.mathMode}\n canDelete={Boolean(selectedMath.tokenId)}\n equationSide={equationSide}\n uiLocale={uiLocale}\n labelEnabled={selectedMath.labelEnabled}\n label={selectedMath.label}\n onLabelEnabledChange={(enabled) =>\n setSelectedMath((current) => (current ? { ...current, labelEnabled: enabled } : current))\n }\n onLabelChange={(nextLabel) => setSelectedMath((current) => (current ? { ...current, label: nextLabel } : current))}\n onMathModeChange={(mode) => setSelectedMath((current) => (current ? { ...current, mathMode: mode } : current))}\n onClose={() => setSelectedMath(null)}\n onSave={saveEquation}\n onDelete={deleteSelectedEquation}\n />\n ) : null}\n {!previewOnly ? (\n <CitePickerPopover\n open={citePicker !== null}\n references={documentNode.references}\n initialKeys={citePicker?.keys ?? []}\n uiLocale={uiLocale}\n onClose={() => setCitePicker(null)}\n onConfirm={confirmCiteKeys}\n onManageReferences={() => {\n setCitePicker(null);\n setReferencesOpen(true);\n }}\n />\n ) : null}\n {!previewOnly ? (\n <RefPickerPopover\n open={refPicker !== null}\n labels={documentLabels}\n initialKeys={refPicker?.keys ?? []}\n initialRefCommand={refPicker?.refCommand ?? 'ref'}\n uiLocale={uiLocale}\n onClose={() => setRefPicker(null)}\n onConfirm={confirmRefKeys}\n onManageLabels={() => {\n setRefPicker(null);\n setLabelsOpen(true);\n }}\n />\n ) : null}\n {!previewOnly ? (\n <ReferencesPanel\n open={referencesOpen}\n references={documentNode.references}\n uiLocale={uiLocale}\n onClose={() => setReferencesOpen(false)}\n onAdd={(partial) => applyDocument(addDocument2Reference(documentRef.current, partial), 'immediate')}\n onUpdate={(referenceId, patch) =>\n applyDocument(updateDocument2Reference(documentRef.current, referenceId, patch), 'immediate')\n }\n onRemove={(referenceId) => applyDocument(removeDocument2Reference(documentRef.current, referenceId), 'immediate')}\n onMove={(referenceId, direction) =>\n applyDocument(moveDocument2Reference(documentRef.current, referenceId, direction), 'immediate')\n }\n />\n ) : null}\n {!previewOnly ? (\n <LabelsPanel\n open={labelsOpen}\n labels={documentLabels}\n uiLocale={uiLocale}\n onClose={() => setLabelsOpen(false)}\n onUpdateFloat={(ownerId, kind, patch) =>\n applyDocument(\n kind === 'fig'\n ? updateDocument2ImageMeta(documentRef.current, ownerId, patch)\n : updateDocument2TableMeta(documentRef.current, ownerId, patch),\n 'text',\n )\n }\n onUpdateEquationLabel={(tokenId, patch) =>\n applyDocument(updateMathTokenLabel(documentRef.current, tokenId, patch), 'text')\n }\n />\n ) : null}\n </div>\n </div>\n );\n}\n","import { useRef } from 'react';\nimport type {\n CiteToken2,\n Document2MathOutput,\n Document2Node,\n InlineField2,\n MathToken2,\n Reference2,\n RefToken2,\n} from '../document2/index.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { EditorSide } from '../editor/index.js';\nimport { CiteChip } from './CiteChip.js';\nimport { MathChip } from './MathChip.js';\nimport { RefChip } from './RefChip.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type InlineFieldProps = {\n field: InlineField2;\n blockId?: string;\n references?: Reference2[];\n documentNode?: Document2Node;\n documentDirection?: 'rtl' | 'ltr';\n digitForm?: DigitFormId;\n mathOutput?: Document2MathOutput;\n equationSide?: EditorSide;\n editableEquations?: boolean;\n editableCitations?: boolean;\n uiLocale?: ButexUiLocale;\n onTextChange: (fieldId: string, tokenId: string, text: string) => void;\n onOpenMath: (token: MathToken2) => void;\n onDeleteMath?: (tokenId: string) => void;\n onOpenCite?: (token: CiteToken2) => void;\n onDeleteCite?: (tokenId: string) => void;\n onOpenRef?: (token: RefToken2) => void;\n onDeleteRef?: (tokenId: string) => void;\n onFieldFocus?: (blockId: string, fieldId: string, textTokenId: string, caretOffset: number) => void;\n onMathFocus?: (blockId: string, fieldId: string, tokenId: string) => void;\n onCiteFocus?: (blockId: string, fieldId: string, tokenId: string) => void;\n onRefFocus?: (blockId: string, fieldId: string, tokenId: string) => void;\n onFieldBlur?: () => void;\n};\n\nfunction rememberCaret(\n element: HTMLTextAreaElement,\n blockId: string | undefined,\n fieldId: string,\n tokenId: string,\n onFieldFocus?: InlineFieldProps['onFieldFocus'],\n): void {\n if (!blockId || !onFieldFocus) {\n return;\n }\n onFieldFocus(blockId, fieldId, tokenId, element.selectionStart ?? element.value.length);\n}\n\nfunction fitTextareaHeight(element: HTMLTextAreaElement | null): void {\n if (!element) {\n return;\n }\n const contentWidth = Math.max(3, Math.min(72, element.value.length + 2));\n element.style.width = `${String(contentWidth)}ch`;\n element.style.height = 'auto';\n element.style.height = `${String(element.scrollHeight)}px`;\n}\n\nexport function InlineField({\n field,\n blockId,\n references = [],\n documentNode,\n documentDirection = 'rtl',\n digitForm,\n mathOutput = 'svg',\n equationSide = 'arabic',\n editableEquations = true,\n editableCitations = true,\n uiLocale = 'ar',\n onTextChange,\n onOpenMath,\n onDeleteMath,\n onOpenCite,\n onDeleteCite,\n onOpenRef,\n onDeleteRef,\n onFieldFocus,\n onMathFocus,\n onCiteFocus,\n onRefFocus,\n onFieldBlur,\n}: InlineFieldProps) {\n const messages = document2Messages(uiLocale);\n const textRefs = useRef(new Map<string, HTMLTextAreaElement>());\n const mathRefs = useRef(new Map<string, HTMLButtonElement>());\n const citeRefs = useRef(new Map<string, HTMLButtonElement>());\n const refTokenRefs = useRef(new Map<string, HTMLButtonElement>());\n\n function textTokenOffset(tokenId: string, fallback: 'start' | 'end'): number {\n const token = field.tokens.find((entry) => entry.id === tokenId && entry.kind === 'text');\n if (!token || token.kind !== 'text') {\n return 0;\n }\n return fallback === 'start' ? 0 : token.text.length;\n }\n\n function focusTextToken(tokenId: string, offset: number): void {\n requestAnimationFrame(() => {\n const element = textRefs.current.get(tokenId);\n if (!element) {\n return;\n }\n const safeOffset = Math.max(0, Math.min(offset, element.value.length));\n element.focus();\n element.setSelectionRange(safeOffset, safeOffset);\n fitTextareaHeight(element);\n rememberCaret(element, blockId, field.id, tokenId, onFieldFocus);\n });\n }\n\n function focusMathToken(tokenId: string): void {\n requestAnimationFrame(() => {\n mathRefs.current.get(tokenId)?.focus();\n });\n }\n\n function focusCiteToken(tokenId: string): void {\n requestAnimationFrame(() => {\n citeRefs.current.get(tokenId)?.focus();\n });\n }\n\n function focusRefToken(tokenId: string): void {\n requestAnimationFrame(() => {\n refTokenRefs.current.get(tokenId)?.focus();\n });\n }\n\n function adjacentTokenId(tokenId: string, direction: -1 | 1, kind: 'math' | 'text' | 'cite' | 'ref'): string | null {\n const index = field.tokens.findIndex((token) => token.id === tokenId);\n if (index < 0) {\n return null;\n }\n for (let i = index + direction; i >= 0 && i < field.tokens.length; i += direction) {\n const token = field.tokens[i];\n if (token?.kind === kind) {\n return token.id;\n }\n }\n return null;\n }\n\n function adjacentIslandId(tokenId: string, direction: -1 | 1): { kind: 'math' | 'cite' | 'ref'; id: string } | null {\n const index = field.tokens.findIndex((token) => token.id === tokenId);\n if (index < 0) {\n return null;\n }\n for (let i = index + direction; i >= 0 && i < field.tokens.length; i += direction) {\n const token = field.tokens[i];\n if (token?.kind === 'math' || token?.kind === 'cite' || token?.kind === 'ref') {\n return { kind: token.kind, id: token.id };\n }\n }\n return null;\n }\n\n function focusTextNearIsland(tokenId: string, direction: -1 | 1): void {\n const fallbackDirection = direction === 1 ? -1 : 1;\n const textTokenId = adjacentTokenId(tokenId, direction, 'text') ?? adjacentTokenId(tokenId, fallbackDirection, 'text');\n if (!textTokenId) {\n return;\n }\n focusTextToken(textTokenId, textTokenOffset(textTokenId, direction === 1 ? 'start' : 'end'));\n }\n\n function typeFromMath(tokenId: string, text: string): void {\n const nextTextTokenId = adjacentTokenId(tokenId, 1, 'text');\n const textTokenId = nextTextTokenId ?? adjacentTokenId(tokenId, -1, 'text');\n if (!textTokenId) {\n return;\n }\n const token = field.tokens.find((entry) => entry.id === textTokenId && entry.kind === 'text');\n if (!token || token.kind !== 'text') {\n return;\n }\n const insertAtStart = nextTextTokenId === textTokenId;\n const nextText = insertAtStart ? `${text}${token.text}` : `${token.text}${text}`;\n onTextChange(field.id, textTokenId, nextText);\n focusTextToken(textTokenId, insertAtStart ? text.length : nextText.length);\n }\n\n const forwardArrowKey = documentDirection === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n const backwardArrowKey = documentDirection === 'rtl' ? 'ArrowRight' : 'ArrowLeft';\n\n return (\n <div className=\"butex-document2-widget__inline-field\" dir={documentDirection} data-document-direction={documentDirection}>\n {field.tokens.map((token) => {\n if (token.kind === 'text') {\n return (\n <textarea\n key={token.id}\n className=\"butex-document2-widget__inline-text\"\n value={token.text}\n dir={documentDirection}\n aria-label={messages.text}\n rows={1}\n data-field-id={field.id}\n data-text-token-id={token.id}\n ref={(element) => {\n if (element) {\n textRefs.current.set(token.id, element);\n fitTextareaHeight(element);\n } else {\n textRefs.current.delete(token.id);\n }\n }}\n onChange={(event) => {\n onTextChange(field.id, token.id, event.currentTarget.value);\n fitTextareaHeight(event.currentTarget);\n }}\n onKeyDown={(event) => {\n const element = event.currentTarget;\n const collapsed = element.selectionStart === element.selectionEnd;\n if (!collapsed) {\n return;\n }\n if (event.key === forwardArrowKey && element.selectionStart === element.value.length) {\n const next = adjacentIslandId(token.id, 1);\n if (next) {\n event.preventDefault();\n if (next.kind === 'math') {\n focusMathToken(next.id);\n } else if (next.kind === 'cite') {\n focusCiteToken(next.id);\n } else {\n focusRefToken(next.id);\n }\n }\n } else if (event.key === backwardArrowKey && element.selectionStart === 0) {\n const previous = adjacentIslandId(token.id, -1);\n if (previous) {\n event.preventDefault();\n if (previous.kind === 'math') {\n focusMathToken(previous.id);\n } else if (previous.kind === 'cite') {\n focusCiteToken(previous.id);\n } else {\n focusRefToken(previous.id);\n }\n }\n }\n }}\n onFocus={(event) => rememberCaret(event.currentTarget, blockId, field.id, token.id, onFieldFocus)}\n onClick={(event) => rememberCaret(event.currentTarget, blockId, field.id, token.id, onFieldFocus)}\n onKeyUp={(event) => {\n rememberCaret(event.currentTarget, blockId, field.id, token.id, onFieldFocus);\n fitTextareaHeight(event.currentTarget);\n }}\n onSelect={(event) => rememberCaret(event.currentTarget, blockId, field.id, token.id, onFieldFocus)}\n onBlur={() => onFieldBlur?.()}\n />\n );\n }\n\n if (token.kind === 'cite') {\n return (\n <CiteChip\n key={token.id}\n token={token}\n references={references}\n documentDirection={documentDirection}\n digitForm={digitForm}\n editable={editableCitations}\n uiLocale={uiLocale}\n buttonRef={(element) => {\n if (element) {\n citeRefs.current.set(token.id, element);\n } else {\n citeRefs.current.delete(token.id);\n }\n }}\n onOpen={(citeToken) => onOpenCite?.(citeToken)}\n onDelete={editableCitations ? onDeleteCite : undefined}\n onFocus={(tokenId) => {\n if (blockId && onCiteFocus) {\n onCiteFocus(blockId, field.id, tokenId);\n }\n }}\n onRequestTextFocus={focusTextNearIsland}\n />\n );\n }\n\n if (token.kind === 'ref') {\n if (!documentNode) {\n return null;\n }\n return (\n <RefChip\n key={token.id}\n token={token}\n document={documentNode}\n documentDirection={documentDirection}\n digitForm={digitForm}\n editable={editableCitations}\n uiLocale={uiLocale}\n buttonRef={(element) => {\n if (element) {\n refTokenRefs.current.set(token.id, element);\n } else {\n refTokenRefs.current.delete(token.id);\n }\n }}\n onOpen={(refToken) => onOpenRef?.(refToken)}\n onDelete={editableCitations ? onDeleteRef : undefined}\n onFocus={(tokenId) => {\n if (blockId && onRefFocus) {\n onRefFocus(blockId, field.id, tokenId);\n }\n }}\n onRequestTextFocus={focusTextNearIsland}\n />\n );\n }\n\n return (\n <MathChip\n key={token.id}\n token={token}\n output={mathOutput}\n equationSide={equationSide}\n editable={editableEquations}\n uiLocale={uiLocale}\n buttonRef={(element) => {\n if (element) {\n mathRefs.current.set(token.id, element);\n } else {\n mathRefs.current.delete(token.id);\n }\n }}\n onOpen={onOpenMath}\n onDelete={onDeleteMath}\n documentDirection={documentDirection}\n onFocus={(tokenId) => {\n if (blockId && onMathFocus) {\n onMathFocus(blockId, field.id, tokenId);\n }\n }}\n onRequestTextFocus={focusTextNearIsland}\n onTextInputFromFocus={typeFromMath}\n />\n );\n })}\n </div>\n );\n}\n","import { formatCiteLabel } from '../document2/index.js';\nimport type { CiteToken2, Reference2 } from '../document2/index.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type CiteChipProps = {\n token: CiteToken2;\n references: Reference2[];\n documentDirection?: 'rtl' | 'ltr';\n digitForm?: DigitFormId;\n editable?: boolean;\n uiLocale?: ButexUiLocale;\n buttonRef?: (element: HTMLButtonElement | null) => void;\n onOpen: (token: CiteToken2) => void;\n onDelete?: (tokenId: string) => void;\n onFocus?: (tokenId: string) => void;\n onRequestTextFocus?: (tokenId: string, direction: -1 | 1) => void;\n};\n\nexport function CiteChip({\n token,\n references,\n documentDirection = 'rtl',\n digitForm,\n editable = true,\n uiLocale = 'ar',\n buttonRef,\n onOpen,\n onDelete,\n onFocus,\n onRequestTextFocus,\n}: CiteChipProps) {\n const messages = document2Messages(uiLocale);\n const label = formatCiteLabel(token.keys, references, { documentDirection, digitForm });\n const forwardArrowKey = documentDirection === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n const backwardArrowKey = documentDirection === 'rtl' ? 'ArrowRight' : 'ArrowLeft';\n\n if (!editable) {\n return (\n <span className=\"butex-document2-widget__cite-chip-wrap\">\n <span className=\"butex-document2-widget__cite-chip\" data-editable=\"false\">\n {label}\n </span>\n </span>\n );\n }\n\n return (\n <span className=\"butex-document2-widget__cite-chip-wrap\">\n <button\n type=\"button\"\n className=\"butex-document2-widget__cite-chip\"\n data-editable=\"true\"\n data-cite-token-id={token.id}\n ref={buttonRef}\n title={messages.editCitation}\n onClick={() => onOpen(token)}\n onFocus={() => onFocus?.(token.id)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n onOpen(token);\n return;\n }\n if (event.key === forwardArrowKey) {\n event.preventDefault();\n onRequestTextFocus?.(token.id, 1);\n return;\n }\n if (event.key === backwardArrowKey) {\n event.preventDefault();\n onRequestTextFocus?.(token.id, -1);\n }\n }}\n >\n {label}\n </button>\n {onDelete ? (\n <button\n type=\"button\"\n className=\"butex-document2-widget__cite-chip-delete\"\n title={messages.deleteCitation}\n aria-label={messages.deleteCitation}\n onClick={(event) => {\n event.stopPropagation();\n onDelete(token.id);\n }}\n >\n ×\n </button>\n ) : null}\n </span>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport {\n normalizeBuTeXMathInput,\n patchBuTeXSvgMathAfterLayout,\n renderBuTeXMathIsland,\n type BuTeXMathOutput,\n} from '../mathjax/renderIsland.js';\n\nexport type MathIslandProps = {\n id: string;\n tex: string;\n display: boolean;\n output?: BuTeXMathOutput;\n};\n\nexport function MathIsland({ id, tex, display, output = 'svg' }: MathIslandProps) {\n const ref = useRef<HTMLSpanElement | null>(null);\n const version = useRef(0);\n const [error, setError] = useState<string | null>(null);\n const [renderState, setRenderState] = useState<'loading' | 'ready' | 'error'>('loading');\n\n useEffect(() => {\n let cancelled = false;\n version.current += 1;\n const renderVersion = version.current;\n const target = ref.current;\n\n if (!target) {\n return;\n }\n\n target.textContent = tex;\n setError(null);\n setRenderState('loading');\n\n void (async () => {\n try {\n const normalized = normalizeBuTeXMathInput(tex, output);\n const renderDisplay = display || normalized.display;\n const node = await renderBuTeXMathIsland(tex, { display: renderDisplay, output });\n if (cancelled || renderVersion !== version.current) {\n return;\n }\n const latestTarget = ref.current;\n if (!latestTarget) {\n return;\n }\n latestTarget.replaceChildren(node);\n if (output === 'svg') {\n patchBuTeXSvgMathAfterLayout(latestTarget);\n }\n setRenderState('ready');\n } catch (err) {\n if (cancelled || renderVersion !== version.current) {\n return;\n }\n const latestTarget = ref.current;\n if (!latestTarget) {\n return;\n }\n setError(err instanceof Error ? err.message : String(err));\n setRenderState('error');\n latestTarget.textContent = tex;\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [display, output, tex]);\n\n return (\n <span\n ref={ref}\n className=\"butex-document2-widget__math-island\"\n data-display={display ? 'true' : 'false'}\n data-math-id={id}\n data-render-state={renderState}\n title={error ?? undefined}\n >\n {tex}\n </span>\n );\n}\n","const SVG_ARABSQRT_SELECTOR = 'mjx-container[jax=\"SVG\"] svg .mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]';\nconst ARABSQRT_SELECTOR = '.mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]';\nconst PATCHED_ATTR = 'data-butex-svg-arabsqrt';\nconst ROOT_INDEX_SCALE = 0.72;\nconst ROOT_INDEX_GAP_FACTOR = 0.08;\nconst ROOT_INDEX_MIN_GAP = 2;\nconst ROOT_INDEX_Y_RAISE = 18;\nconst ROOT_INDEX_LEFT_SHIFT = 360;\nconst VIEWBOX_PADDING = 20;\n\ntype SvgBox = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\ntype SvgPlacement = SvgBox & {\n visualX: number;\n visualY: number;\n translateX: number;\n translateY: number;\n};\n\nfunction closestArabSqrtRoot(element: Element): Element | null {\n return element.closest('.mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]');\n}\n\nfunction rootDepth(root: Element): number {\n let depth = 0;\n let parent = root.parentElement;\n while (parent) {\n if (parent.matches('.mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]')) {\n depth += 1;\n }\n parent = parent.parentElement;\n }\n return depth;\n}\n\nfunction directSvgElementChildren(element: Element): Element[] {\n return Array.from(element.children).filter((child) => child instanceof SVGElement);\n}\n\nfunction boxFor(element: Element): SvgBox | null {\n if (!(element instanceof SVGGraphicsElement) || typeof element.getBBox !== 'function') {\n return null;\n }\n try {\n const box = element.getBBox();\n return {\n x: box.x,\n y: box.y,\n width: box.width,\n height: box.height,\n };\n } catch {\n return null;\n }\n}\n\nfunction placementFor(element: Element): SvgPlacement | null {\n const box = boxFor(element);\n if (!box) {\n return null;\n }\n const [translateX, translateY] = readTranslate(element);\n return {\n ...box,\n translateX,\n translateY,\n visualX: box.x + translateX,\n visualY: box.y + translateY,\n };\n}\n\nfunction readTranslate(element: Element): [number, number] {\n const transform = element.getAttribute('transform') ?? '';\n const match = transform.match(/translate\\(\\s*([-+.\\d]+)(?:[,\\s]+([-+.\\d]+))?\\s*\\)/);\n if (!match) {\n return [0, 0];\n }\n return [Number(match[1]) || 0, Number(match[2]) || 0];\n}\n\nfunction setTranslate(element: Element, x: number, y: number): void {\n replaceTransform(element, `translate(${roundSvg(x)},${roundSvg(y)})`);\n}\n\nfunction setMirroredTranslate(element: Element, x: number, y: number, width: number): void {\n replaceTransform(element, `translate(${roundSvg(x + width)},${roundSvg(y)}) scale(-1,1)`);\n}\n\nfunction setRootIndexTranslate(element: Element, x: number, y: number): void {\n const current = element.getAttribute('transform') ?? '';\n const rest = current\n .replace(/translate\\(\\s*[-+.\\d]+(?:[,\\s]+[-+.\\d]+)?\\s*\\)/g, '')\n .replace(/matrix\\([^)]*\\)/g, '')\n .replace(/scale\\([^)]*\\)/g, '')\n .trim();\n const transform = `translate(${roundSvg(x)},${roundSvg(y)}) scale(${ROOT_INDEX_SCALE})`;\n element.setAttribute('transform', rest ? `${transform} ${rest}` : transform);\n}\n\nfunction setRootIndexVisualX(element: Element, placement: SvgPlacement, visualX: number): void {\n const x = visualX - placement.x * ROOT_INDEX_SCALE;\n setRootIndexTranslate(element, x, placement.translateY + ROOT_INDEX_Y_RAISE);\n}\n\nfunction replaceTransform(element: Element, transform: string): void {\n const current = element.getAttribute('transform') ?? '';\n const rest = current\n .replace(/translate\\(\\s*[-+.\\d]+(?:[,\\s]+[-+.\\d]+)?\\s*\\)/g, '')\n .replace(/matrix\\([^)]*\\)/g, '')\n .replace(/scale\\(\\s*-1(?:[,\\s]+1)?\\s*\\)/g, '')\n .trim();\n element.setAttribute('transform', rest ? `${transform} ${rest}` : transform);\n}\n\nfunction roundSvg(value: number): string {\n return Number.isFinite(value) ? value.toFixed(2).replace(/\\.?0+$/, '') : '0';\n}\n\nfunction findRootNode(root: Element): Element | null {\n const candidates = Array.from(root.querySelectorAll('[data-mml-node=\"msqrt\"], [data-mml-node=\"mroot\"]'));\n return candidates.find((candidate) => closestArabSqrtRoot(candidate) === root) ?? null;\n}\n\nfunction findSurd(rootNode: Element): Element | null {\n return directSvgElementChildren(rootNode).find((child) => child.getAttribute('data-mml-node') === 'mo') ?? null;\n}\n\nfunction findRootIndex(rootNode: Element): Element | null {\n const marked = rootNode.querySelector('[data-butex-arabsqrt-part=\"index\"]');\n if (marked?.parentElement === rootNode) {\n return marked;\n }\n if (marked?.parentElement?.parentElement === rootNode) {\n return marked.parentElement;\n }\n return directSvgElementChildren(rootNode).find((child) => {\n return child.classList.contains('mjx-rtl-root-index') || child.querySelector('.mjx-rtl-root-index') != null;\n }) ?? null;\n}\n\nfunction findBase(rootNode: Element, surd: Element | null, rootIndex: Element | null): Element | null {\n const marked = rootNode.querySelector('[data-butex-arabsqrt-part=\"base\"]');\n if (marked?.parentElement === rootNode) {\n return marked;\n }\n if (marked?.parentElement?.parentElement === rootNode) {\n return marked.parentElement;\n }\n return directSvgElementChildren(rootNode).find((child) => {\n if (child === surd || child === rootIndex || child.tagName.toLowerCase() === 'rect') {\n return false;\n }\n return child.querySelector('.mjx-rtl-unmirror:not(.mjx-rtl-root-index)') != null;\n }) ?? null;\n}\n\nfunction findOverbar(rootNode: Element): SVGRectElement | null {\n const directRects = directSvgElementChildren(rootNode).filter((child) => child.tagName.toLowerCase() === 'rect');\n return (directRects[directRects.length - 1] as SVGRectElement | undefined) ?? null;\n}\n\nfunction visualExtent(parts: Array<Element | null>): { left: number; right: number } | null {\n const placements = parts\n .filter((part): part is Element => part != null)\n .map((part) => placementFor(part))\n .filter((placement): placement is SvgPlacement => placement != null && placement.width > 0);\n if (!placements.length) {\n return null;\n }\n return placements.reduce(\n (extent, placement) => {\n return {\n left: Math.min(extent.left, placement.visualX),\n right: Math.max(extent.right, placement.visualX + placement.width),\n };\n },\n { left: Infinity, right: -Infinity }\n );\n}\n\nfunction mirroredVisualX(placement: SvgPlacement, extent: { left: number; right: number }): number {\n return extent.left + extent.right - (placement.visualX + placement.width);\n}\n\nfunction moveToVisualX(element: Element, placement: SvgPlacement, visualX: number): void {\n setTranslate(element, placement.translateX + visualX - placement.visualX, placement.translateY);\n}\n\nfunction mirrorToVisualX(element: Element, placement: SvgPlacement, visualX: number): void {\n const translateX = visualX + placement.x + placement.width;\n setMirroredTranslate(element, translateX - placement.width, placement.translateY, placement.width);\n}\n\nfunction findSvg(element: Element): SVGSVGElement | null {\n const svg = element.closest('svg');\n return svg instanceof SVGSVGElement ? svg : null;\n}\n\nfunction parseViewBox(svg: SVGSVGElement): [number, number, number, number] | null {\n const viewBox = svg.getAttribute('viewBox');\n if (!viewBox) {\n return null;\n }\n const values = viewBox.trim().split(/[\\s,]+/).map(Number);\n if (values.length !== 4 || values.some((value) => !Number.isFinite(value))) {\n return null;\n }\n return values as [number, number, number, number];\n}\n\nfunction parseEx(value: string | null): number | null {\n const match = value?.match(/^([-+.\\d]+)ex$/);\n if (!match) {\n return null;\n }\n const n = Number(match[1]);\n return Number.isFinite(n) ? n : null;\n}\n\nfunction expandSvgViewBox(root: Element, contentLeft: number, contentRight: number): void {\n const svg = findSvg(root);\n if (!svg) {\n return;\n }\n const box = parseViewBox(svg);\n if (!box) {\n return;\n }\n const [minX, minY, width, height] = box;\n const oldRight = minX + width;\n const nextLeft = Math.min(minX, contentLeft - VIEWBOX_PADDING);\n const nextRight = Math.max(oldRight, contentRight + VIEWBOX_PADDING);\n const nextWidth = nextRight - nextLeft;\n if (nextLeft === minX && nextWidth === width) {\n return;\n }\n svg.setAttribute('viewBox', [roundSvg(nextLeft), roundSvg(minY), roundSvg(nextWidth), roundSvg(height)].join(' '));\n\n const widthEx = parseEx(svg.getAttribute('width'));\n if (widthEx && width > 0) {\n svg.setAttribute('width', `${roundSvg(widthEx * (nextWidth / width))}ex`);\n }\n}\n\nfunction patchArabSqrtRoot(root: Element): void {\n if (root.getAttribute(PATCHED_ATTR) === 'patched') {\n return;\n }\n\n const rootNode = findRootNode(root);\n if (!rootNode) {\n return;\n }\n\n const surd = findSurd(rootNode);\n const rootIndex = findRootIndex(rootNode);\n const base = findBase(rootNode, surd, rootIndex);\n const overbar = findOverbar(rootNode);\n if (!surd || !base || !overbar) {\n return;\n }\n\n const surdPlacement = placementFor(surd);\n const basePlacement = placementFor(base);\n const indexPlacement = rootIndex ? placementFor(rootIndex) : null;\n if (!surdPlacement || !basePlacement || !surdPlacement.width || !basePlacement.width) {\n return;\n }\n\n const extent = visualExtent([surd, base, overbar]);\n if (!extent) {\n return;\n }\n\n let targetBaseX = mirroredVisualX(basePlacement, extent);\n let targetSurdX = mirroredVisualX(surdPlacement, extent);\n let targetOverbarX: number | null = null;\n\n const overbarBox = boxFor(overbar);\n if (overbarBox) {\n targetOverbarX = mirroredVisualX({ ...overbarBox, translateX: 0, translateY: 0, visualX: overbarBox.x, visualY: overbarBox.y }, extent);\n }\n\n let targetIndexX: number | null = null;\n let indexVisualWidth = 0;\n if (rootIndex && indexPlacement) {\n const indexGap = Math.max(surdPlacement.width * ROOT_INDEX_GAP_FACTOR, ROOT_INDEX_MIN_GAP);\n indexVisualWidth = indexPlacement.width * ROOT_INDEX_SCALE;\n targetIndexX = targetSurdX + surdPlacement.width + indexGap - ROOT_INDEX_LEFT_SHIFT;\n\n const bodyRight = Math.max(\n targetSurdX + surdPlacement.width,\n targetBaseX + basePlacement.width,\n targetOverbarX == null || !overbarBox ? -Infinity : targetOverbarX + overbarBox.width\n );\n const bodyShift = Math.max(0, targetIndexX + indexVisualWidth - bodyRight);\n if (bodyShift) {\n targetBaseX -= bodyShift;\n targetSurdX -= bodyShift;\n targetIndexX -= bodyShift;\n if (targetOverbarX != null) {\n targetOverbarX -= bodyShift;\n }\n }\n }\n\n moveToVisualX(base, basePlacement, targetBaseX);\n mirrorToVisualX(surd, surdPlacement, targetSurdX);\n\n if (overbarBox && targetOverbarX != null) {\n overbar.setAttribute('x', roundSvg(targetOverbarX));\n overbar.setAttribute('width', roundSvg(overbarBox.width));\n }\n\n if (rootIndex && indexPlacement && targetIndexX != null) {\n setRootIndexVisualX(rootIndex, indexPlacement, targetIndexX);\n }\n\n const contentLeft = Math.min(\n targetSurdX,\n targetBaseX,\n targetOverbarX ?? targetBaseX,\n targetIndexX ?? targetBaseX\n );\n const contentRight = Math.max(\n targetSurdX + surdPlacement.width,\n targetBaseX + basePlacement.width,\n targetOverbarX == null || !overbarBox ? targetBaseX + basePlacement.width : targetOverbarX + overbarBox.width,\n targetIndexX == null ? targetBaseX + basePlacement.width : targetIndexX + indexVisualWidth\n );\n expandSvgViewBox(root, contentLeft, contentRight);\n\n root.setAttribute(PATCHED_ATTR, 'patched');\n rootNode.setAttribute(PATCHED_ATTR, 'patched');\n}\n\nexport function patchBuTeXSvgMath(root: ParentNode): void {\n if (typeof root.querySelectorAll !== 'function') {\n return;\n }\n let roots = Array.from(root.querySelectorAll(SVG_ARABSQRT_SELECTOR));\n if (!roots.length) {\n roots = Array.from(root.querySelectorAll(ARABSQRT_SELECTOR)).filter((candidate) => {\n return candidate.closest('mjx-container[jax=\"SVG\"]') != null;\n });\n }\n roots\n .sort((a, b) => rootDepth(b) - rootDepth(a))\n .forEach((arabSqrtRoot) => patchArabSqrtRoot(arabSqrtRoot));\n}\n","import { patchBuTeXSvgMath } from './svgPatcher.js';\nimport { mirrorBuTeXOperatorsInTex } from '../editor/atomicCommandsOperators.js';\n\nexport { patchBuTeXSvgMath } from './svgPatcher.js';\n\nexport type BuTeXMathOutput = 'chtml' | 'svg';\n\nexport type RenderBuTeXMathIslandOptions = {\n display?: boolean;\n mirrorOperators?: boolean;\n output?: BuTeXMathOutput;\n};\n\ntype MathJaxRenderApi = {\n typesetPromise?: (nodes: HTMLElement[]) => Promise<void>;\n typesetClear?: (nodes: HTMLElement[]) => void;\n tex2chtml?: (input: string, options?: { display?: boolean }) => HTMLElement;\n tex2chtmlPromise?: (input: string, options?: { display?: boolean }) => Promise<HTMLElement>;\n tex2svg?: (input: string, options?: { display?: boolean }) => HTMLElement;\n tex2svgPromise?: (input: string, options?: { display?: boolean }) => Promise<HTMLElement>;\n startup?: {\n promise?: Promise<void>;\n document?: { updateDocument?: () => void };\n };\n};\n\nexport type RenderBuTeXMathTypesetOptions = {\n display?: boolean;\n mirrorOperators?: boolean;\n};\n\nexport function patchBuTeXSvgMathAfterLayout(root: ParentNode): void {\n const run = () => patchBuTeXSvgMath(root);\n const raf =\n typeof globalThis !== 'undefined'\n ? (globalThis as { requestAnimationFrame?: (callback: FrameRequestCallback) => number }).requestAnimationFrame\n : undefined;\n\n if (typeof raf === 'function') {\n raf(run);\n return;\n }\n\n if (typeof queueMicrotask === 'function') {\n queueMicrotask(run);\n return;\n }\n\n run();\n}\n\nfunction mathJaxApi(): MathJaxRenderApi | undefined {\n if (typeof globalThis === 'undefined') {\n return undefined;\n }\n return (globalThis as { MathJax?: MathJaxRenderApi }).MathJax;\n}\n\n/** Convert delimited source text to `\\(...\\)` / `\\[...\\]` form. */\nexport function normalizePreviewMathForMathJax(tex: string): string {\n if (tex.startsWith('$$') && tex.endsWith('$$')) {\n return `\\\\[${tex.slice(2, -2)}\\\\]`;\n }\n if (tex.startsWith('$') && tex.endsWith('$')) {\n return `\\\\(${tex.slice(1, -1)}\\\\)`;\n }\n return tex;\n}\n\n/** Normalize delimited TeX for direct MathJax island conversion. */\nexport function normalizeBuTeXMathInput(\n tex: string,\n output: BuTeXMathOutput = 'chtml',\n): { tex: string; display: boolean } {\n const inline = (inner: string) => ({\n tex: output === 'chtml' ? `\\\\displaystyle ${inner}` : inner,\n display: false,\n });\n\n if (tex.startsWith('$$') && tex.endsWith('$$')) {\n return { tex: tex.slice(2, -2), display: true };\n }\n if (tex.startsWith('$') && tex.endsWith('$')) {\n return inline(tex.slice(1, -1));\n }\n if (tex.startsWith('\\\\[') && tex.endsWith('\\\\]')) {\n return { tex: tex.slice(2, -2), display: true };\n }\n if (tex.startsWith('\\\\(') && tex.endsWith('\\\\)')) {\n return inline(tex.slice(2, -2));\n }\n return tex.startsWith('\\\\begin{') ? { tex, display: true } : inline(tex);\n}\n\nasync function renderWithOutput(\n mathJax: MathJaxRenderApi,\n tex: string,\n display: boolean,\n output: BuTeXMathOutput,\n): Promise<HTMLElement> {\n if (output === 'svg') {\n const node = mathJax.tex2svg?.(tex, { display }) ?? (await mathJax.tex2svgPromise?.(tex, { display }));\n if (!node) {\n throw new Error('BuTeX: tex2svg is not available. Load mathjax/tex-svg.js.');\n }\n patchBuTeXSvgMath(node);\n return node;\n }\n\n const node = mathJax.tex2chtml?.(tex, { display }) ?? (await mathJax.tex2chtmlPromise?.(tex, { display }));\n if (!node) {\n throw new Error('BuTeX: tex2chtml is not available. Load mathjax/tex-chtml.js.');\n }\n return node;\n}\n\nexport async function renderBuTeXMathIsland(\n tex: string,\n options: RenderBuTeXMathIslandOptions = {},\n): Promise<HTMLElement> {\n const output = options.output ?? 'chtml';\n const mathJax = mathJaxApi();\n if (!mathJax) {\n throw new Error('BuTeX: MathJax is not loaded.');\n }\n\n await (mathJax.startup?.promise ?? Promise.resolve());\n const normalized = normalizeBuTeXMathInput(tex, output);\n const display = options.display ?? normalized.display;\n const renderTex = options.mirrorOperators\n ? mirrorBuTeXOperatorsInTex(normalized.tex)\n : normalized.tex;\n const node = await renderWithOutput(mathJax, renderTex, display, output);\n mathJax.startup?.document?.updateDocument?.();\n return node;\n}\n\nexport async function mountBuTeXMathIsland(\n host: HTMLElement,\n tex: string,\n options: RenderBuTeXMathIslandOptions = {},\n): Promise<void> {\n try {\n const node = await renderBuTeXMathIsland(tex, options);\n host.replaceChildren(node);\n if ((options.output ?? 'chtml') === 'svg') {\n patchBuTeXSvgMathAfterLayout(host);\n }\n } catch {\n host.replaceChildren(document.createTextNode(tex));\n }\n}\n\n/**\n * Render via MathJax's document typesetter (`typesetPromise`).\n * Use for equation-editor preview of raw AST TeX (display `\\[...\\]` by default).\n */\nexport async function mountBuTeXMathTypeset(\n host: HTMLElement,\n tex: string,\n options: RenderBuTeXMathTypesetOptions = {},\n): Promise<void> {\n const mathJax = mathJaxApi();\n await (mathJax?.startup?.promise ?? Promise.resolve());\n const body = tex || '\\\\, ';\n const renderBody = options.mirrorOperators\n ? mirrorBuTeXOperatorsInTex(body)\n : body;\n const display = options.display ?? true;\n mathJax?.typesetClear?.([host]);\n host.innerHTML = display ? `\\\\[ ${renderBody} \\\\]` : `\\\\( ${renderBody} \\\\)`;\n if (!mathJax?.typesetPromise) {\n return;\n }\n await mathJax.typesetPromise([host]);\n patchBuTeXSvgMath(host);\n}\n\n/** @deprecated Use normalizeBuTeXMathInput instead. */\nexport function mathJaxInputFromPreviewTex(tex: string): { tex: string; display: boolean } {\n return normalizeBuTeXMathInput(tex, 'chtml');\n}\n","import type { Document2MathOutput, MathToken2 } from '../document2/index.js';\nimport { mathTokenSourceForSide } from '../document2/index.js';\nimport type { EditorSide } from '../editor/index.js';\nimport { MathIsland } from './MathIsland.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type MathChipProps = {\n token: MathToken2;\n output?: Document2MathOutput;\n documentDirection?: 'rtl' | 'ltr';\n equationSide?: EditorSide;\n editable?: boolean;\n uiLocale?: ButexUiLocale;\n buttonRef?: (element: HTMLButtonElement | null) => void;\n onOpen: (token: MathToken2) => void;\n onDelete?: (tokenId: string) => void;\n onFocus?: (tokenId: string) => void;\n onRequestTextFocus?: (tokenId: string, direction: -1 | 1) => void;\n onTextInputFromFocus?: (tokenId: string, text: string) => void;\n};\n\nexport function MathChip({\n token,\n output = 'svg',\n documentDirection = 'rtl',\n equationSide = 'arabic',\n editable = true,\n uiLocale = 'ar',\n buttonRef,\n onOpen,\n onDelete,\n onFocus,\n onRequestTextFocus,\n onTextInputFromFocus,\n}: MathChipProps) {\n const messages = document2Messages(uiLocale);\n const tex = mathTokenSourceForSide(token, equationSide);\n const forwardArrowKey = documentDirection === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n const backwardArrowKey = documentDirection === 'rtl' ? 'ArrowRight' : 'ArrowLeft';\n\n const island = <MathIsland id={token.id} tex={tex} display={token.display} output={output} />;\n\n if (!editable) {\n return (\n <span className=\"butex-document2-widget__math-chip-wrap\" data-display={token.display ? 'true' : 'false'}>\n <span className=\"butex-document2-widget__math-chip\" data-editable=\"false\" data-display={token.display ? 'true' : 'false'}>\n {island}\n </span>\n </span>\n );\n }\n\n return (\n <span className=\"butex-document2-widget__math-chip-wrap\" data-display={token.display ? 'true' : 'false'}>\n <button\n type=\"button\"\n className=\"butex-document2-widget__math-chip\"\n data-editable={token.editable ? 'true' : 'false'}\n data-display={token.display ? 'true' : 'false'}\n data-source-owner={token.sourceOwner}\n data-math-token-id={token.id}\n ref={buttonRef}\n title={token.editable ? messages.editEquation : messages.rawEquation}\n onClick={() => onOpen(token)}\n onFocus={() => onFocus?.(token.id)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n onOpen(token);\n return;\n }\n if (event.key === forwardArrowKey) {\n event.preventDefault();\n onRequestTextFocus?.(token.id, 1);\n return;\n }\n if (event.key === backwardArrowKey) {\n event.preventDefault();\n onRequestTextFocus?.(token.id, -1);\n return;\n }\n if ((event.key === 'Delete' || event.key === 'Backspace') && onDelete) {\n event.preventDefault();\n onDelete(token.id);\n return;\n }\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n onTextInputFromFocus?.(token.id, event.key);\n }\n }}\n >\n {island}\n </button>\n {onDelete ? (\n <button\n type=\"button\"\n className=\"butex-document2-widget__math-chip-delete\"\n title={messages.deleteEquation}\n aria-label={messages.deleteEquation}\n onClick={(event) => {\n event.stopPropagation();\n onDelete(token.id);\n }}\n >\n ×\n </button>\n ) : null}\n </span>\n );\n}\n","import { formatRefLabel } from '../document2/index.js';\nimport type { Document2Node, RefToken2 } from '../document2/index.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type RefChipProps = {\n token: RefToken2;\n document: Document2Node;\n documentDirection?: 'rtl' | 'ltr';\n digitForm?: DigitFormId;\n editable?: boolean;\n uiLocale?: ButexUiLocale;\n buttonRef?: (element: HTMLButtonElement | null) => void;\n onOpen: (token: RefToken2) => void;\n onDelete?: (tokenId: string) => void;\n onFocus?: (tokenId: string) => void;\n onRequestTextFocus?: (tokenId: string, direction: -1 | 1) => void;\n};\n\nexport function RefChip({\n token,\n document,\n documentDirection = 'rtl',\n digitForm,\n editable = true,\n uiLocale = 'ar',\n buttonRef,\n onOpen,\n onDelete,\n onFocus,\n onRequestTextFocus,\n}: RefChipProps) {\n const messages = document2Messages(uiLocale);\n const label = formatRefLabel(token.keys, document, token.refCommand, { documentDirection, digitForm });\n const forwardArrowKey = documentDirection === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n const backwardArrowKey = documentDirection === 'rtl' ? 'ArrowRight' : 'ArrowLeft';\n\n if (!editable) {\n return (\n <span className=\"butex-document2-widget__cite-chip-wrap\">\n <span className=\"butex-document2-widget__cite-chip butex-document2-widget__ref-chip\" data-editable=\"false\">\n {label}\n </span>\n </span>\n );\n }\n\n return (\n <span className=\"butex-document2-widget__cite-chip-wrap\">\n <button\n type=\"button\"\n className=\"butex-document2-widget__cite-chip butex-document2-widget__ref-chip\"\n data-editable=\"true\"\n data-ref-token-id={token.id}\n ref={buttonRef}\n title={messages.editInternalRef}\n onClick={() => onOpen(token)}\n onFocus={() => onFocus?.(token.id)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n onOpen(token);\n return;\n }\n if (event.key === forwardArrowKey) {\n event.preventDefault();\n onRequestTextFocus?.(token.id, 1);\n return;\n }\n if (event.key === backwardArrowKey) {\n event.preventDefault();\n onRequestTextFocus?.(token.id, -1);\n }\n }}\n >\n {label}\n </button>\n {onDelete ? (\n <button\n type=\"button\"\n className=\"butex-document2-widget__cite-chip-delete\"\n title={messages.deleteInternalRef}\n aria-label={messages.deleteInternalRef}\n onClick={(event) => {\n event.stopPropagation();\n onDelete(token.id);\n }}\n >\n ×\n </button>\n ) : null}\n </span>\n );\n}\n","export type ButexUiLocale = 'ar' | 'en';\n\nexport function uiLocaleDirection(locale: ButexUiLocale): 'rtl' | 'ltr' {\n return locale === 'ar' ? 'rtl' : 'ltr';\n}\n","import type {\n CiteToken2,\n Document2Block,\n Document2MathOutput,\n FloatMetaPatch,\n InlineField2,\n MathToken2,\n Reference2,\n RefToken2,\n} from '../document2/index.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { EditorSide } from '../editor/index.js';\nimport { InlineField } from './InlineField.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { uiLocaleDirection } from '../uiLocale.js';\nimport { document2Messages, type Document2Messages } from './uiMessages.js';\n\nexport type BlockEditorProps = {\n block: Document2Block;\n depth?: number;\n references?: Reference2[];\n documentNode?: import('../document2/index.js').Document2Node;\n documentDirection?: 'rtl' | 'ltr';\n digitForm?: DigitFormId;\n mathOutput?: Document2MathOutput;\n equationSide?: EditorSide;\n editableEquations?: boolean;\n editableCitations?: boolean;\n uiLocale?: ButexUiLocale;\n isCollapsed?: boolean;\n onTextChange: (fieldId: string, tokenId: string, text: string) => void;\n onOpenMath: (token: MathToken2) => void;\n onDeleteMath?: (tokenId: string) => void;\n onOpenCite?: (token: CiteToken2) => void;\n onDeleteCite?: (tokenId: string) => void;\n onOpenRef?: (token: RefToken2) => void;\n onDeleteRef?: (tokenId: string) => void;\n selected?: boolean;\n onToggleSelect?: (blockId: string, shiftKey: boolean) => void;\n onToggleCollapse?: (blockId: string) => void;\n onBlockFocus?: (blockId: string) => void;\n onFieldFocus?: (blockId: string, fieldId: string, textTokenId: string, caretOffset: number) => void;\n onMathFocus?: (blockId: string, fieldId: string, tokenId: string) => void;\n onCiteFocus?: (blockId: string, fieldId: string, tokenId: string) => void;\n onRefFocus?: (blockId: string, fieldId: string, tokenId: string) => void;\n onFieldBlur?: () => void;\n onImageSrcChange?: (blockId: string, value: string) => void;\n onFloatMetaChange?: (blockId: string, kind: 'image' | 'table', patch: FloatMetaPatch) => void;\n onParagraphCenteredChange?: (blockId: string, centered: boolean) => void;\n onAddListItem?: (listBlockId: string) => void;\n onRemoveListItem?: (listBlockId: string, itemId: string) => void;\n onManageReferences?: () => void;\n};\n\nfunction blockChromeClass(block: Document2Block): string {\n const root = 'butex-document2-widget__block';\n if (block.kind === 'textBlock') {\n if (block.command === '\\\\section') {\n return `${root} ${root}--section`;\n }\n if (block.command === '\\\\subsection') {\n return `${root} ${root}--subsection`;\n }\n if (block.command === '\\\\subsubsection') {\n return `${root} ${root}--subsubsection`;\n }\n return `${root} ${root}--paragraph`;\n }\n if (block.kind === 'list') {\n return `${root} ${root}--list`;\n }\n if (block.kind === 'table') {\n return `${root} ${root}--table`;\n }\n if (block.kind === 'image') {\n return `${root} ${root}--image`;\n }\n if (block.kind === 'bibliography') {\n return `${root} ${root}--bibliography`;\n }\n return `${root} ${root}--raw`;\n}\n\nfunction blockLabel(block: Document2Block, messages: Document2Messages): string {\n if (block.kind === 'textBlock') {\n if (block.command === '\\\\section') {\n return messages.section;\n }\n if (block.command === '\\\\subsection') {\n return messages.subsection;\n }\n if (block.command === '\\\\subsubsection') {\n return messages.subsubsection;\n }\n return messages.paragraph;\n }\n if (block.kind === 'list') {\n return block.command === '\\\\begin{enumerate}' ? messages.numberedList : messages.list;\n }\n if (block.kind === 'table') {\n return messages.table;\n }\n if (block.kind === 'image') {\n return messages.image;\n }\n if (block.kind === 'bibliography') {\n return messages.bibliography;\n }\n return messages.raw;\n}\n\nfunction truncateSummary(value: string): string {\n const normalized = value.replace(/\\s+/g, ' ').trim();\n if (normalized.length === 0) {\n return '...';\n }\n if (normalized.length <= 72) {\n return normalized;\n }\n return `${normalized.slice(0, 69)}...`;\n}\n\nfunction inlineFieldSummary(field: InlineField2): string {\n return truncateSummary(\n field.tokens\n .map((token) => {\n if (token.kind === 'text') {\n return token.text;\n }\n if (token.kind === 'cite') {\n return ' [cite] ';\n }\n if (token.kind === 'ref') {\n return ' [ref] ';\n }\n return ' [math] ';\n })\n .join(''),\n );\n}\n\nfunction FloatMetaEditor({\n captionEnabled,\n caption,\n labelEnabled,\n label,\n labelPlaceholder,\n labelDir,\n messages,\n onChange,\n}: {\n captionEnabled: boolean;\n caption: string;\n labelEnabled: boolean;\n label: string;\n labelPlaceholder: string;\n labelDir: 'rtl' | 'ltr';\n messages: Document2Messages;\n onChange: (patch: FloatMetaPatch) => void;\n}) {\n return (\n <div className=\"butex-document2-widget__float-meta\">\n <label className=\"butex-document2-widget__float-meta-toggle\">\n <input\n type=\"checkbox\"\n checked={captionEnabled}\n onChange={(event) => {\n const enabled = event.currentTarget.checked;\n onChange({ captionEnabled: enabled });\n }}\n />\n <span>{messages.captionToggle}</span>\n </label>\n {captionEnabled ? (\n <label className=\"butex-document2-widget__refs-field\">\n <span>{messages.floatCaption}</span>\n <input\n value={caption}\n dir={labelDir}\n placeholder={messages.captionPlaceholder}\n onChange={(event) => {\n const value = event.currentTarget.value;\n onChange({ caption: value });\n }}\n />\n </label>\n ) : null}\n <label className=\"butex-document2-widget__float-meta-toggle\">\n <input\n type=\"checkbox\"\n checked={labelEnabled}\n onChange={(event) => {\n const enabled = event.currentTarget.checked;\n onChange({ labelEnabled: enabled });\n }}\n />\n <span>{messages.labelToggle}</span>\n </label>\n {labelEnabled ? (\n <label className=\"butex-document2-widget__refs-field\">\n <span>{messages.floatLabel}</span>\n <input\n value={label}\n dir={labelDir}\n placeholder={labelPlaceholder}\n onChange={(event) => {\n const value = event.currentTarget.value;\n onChange({ label: value });\n }}\n />\n </label>\n ) : null}\n </div>\n );\n}\n\nfunction blockSummary(block: Document2Block, referenceCount: number, messages: Document2Messages): string {\n if (block.kind === 'textBlock') {\n return inlineFieldSummary(block.field);\n }\n if (block.kind === 'list') {\n return `${String(block.items.length)} ${messages.item}`;\n }\n if (block.kind === 'table') {\n return `${String(block.rows.length)} × ${String(block.rows[0]?.length ?? 0)} ${messages.table}`;\n }\n if (block.kind === 'image') {\n return truncateSummary(block.value || messages.emptyImagePath);\n }\n if (block.kind === 'bibliography') {\n return `${String(referenceCount)} ${messages.bibliography}`;\n }\n return truncateSummary(block.value);\n}\n\nexport function BlockEditor({\n block,\n depth = 0,\n references = [],\n documentNode,\n documentDirection = 'rtl',\n digitForm,\n mathOutput = 'svg',\n equationSide = 'arabic',\n editableEquations = true,\n editableCitations = true,\n uiLocale = 'ar',\n isCollapsed = false,\n onTextChange,\n onOpenMath,\n onDeleteMath,\n onOpenCite,\n onDeleteCite,\n onOpenRef,\n onDeleteRef,\n selected = false,\n onToggleSelect,\n onToggleCollapse,\n onBlockFocus,\n onFieldFocus,\n onMathFocus,\n onCiteFocus,\n onRefFocus,\n onFieldBlur,\n onImageSrcChange,\n onFloatMetaChange,\n onParagraphCenteredChange,\n onAddListItem,\n onRemoveListItem,\n onManageReferences,\n}: BlockEditorProps) {\n const messages = document2Messages(uiLocale);\n const showChrome = depth === 0;\n const chromeClass = [\n blockChromeClass(block),\n isCollapsed ? 'butex-document2-widget__block--collapsed' : '',\n selected ? 'butex-document2-widget__block--selected' : '',\n ]\n .filter(Boolean)\n .join(' ');\n const fieldProps = {\n blockId: block.id,\n references,\n documentNode,\n documentDirection,\n digitForm,\n mathOutput,\n equationSide,\n editableEquations,\n editableCitations,\n uiLocale,\n onTextChange,\n onOpenMath,\n onDeleteMath,\n onOpenCite,\n onDeleteCite,\n onOpenRef,\n onDeleteRef,\n onFieldFocus,\n onMathFocus,\n onCiteFocus,\n onRefFocus,\n onFieldBlur,\n };\n\n const header = showChrome ? (\n <div\n className=\"butex-document2-widget__block-header\"\n onClick={(event) => {\n if (event.shiftKey && onToggleSelect) {\n event.preventDefault();\n onToggleSelect(block.id, true);\n return;\n }\n onBlockFocus?.(block.id);\n }}\n >\n <span className=\"butex-document2-widget__block-title\">\n {onToggleSelect ? (\n <input\n type=\"checkbox\"\n className=\"butex-document2-widget__block-select\"\n checked={selected}\n title={messages.selectBlock}\n aria-label={messages.selectBlock}\n onClick={(event) => {\n event.stopPropagation();\n }}\n onChange={(event) => {\n onToggleSelect(block.id, event.nativeEvent instanceof MouseEvent ? event.nativeEvent.shiftKey : false);\n }}\n />\n ) : null}\n {onToggleCollapse ? (\n <button\n type=\"button\"\n className=\"butex-document2-widget__block-collapse\"\n aria-expanded={!isCollapsed}\n title={isCollapsed ? messages.openBlock : messages.collapseBlock}\n onClick={(event) => {\n event.stopPropagation();\n onToggleCollapse(block.id);\n }}\n >\n {isCollapsed ? '+' : '-'}\n </button>\n ) : null}\n <span>{blockLabel(block, messages)}</span>\n </span>\n </div>\n ) : null;\n\n if (isCollapsed && showChrome) {\n return (\n <section className={chromeClass}>\n {header}\n <div className=\"butex-document2-widget__block-summary\">{blockSummary(block, references.length, messages)}</div>\n </section>\n );\n }\n\n if (block.kind === 'textBlock') {\n return (\n <section className={chromeClass}>\n {header}\n <InlineField field={block.field} {...fieldProps} />\n {block.command === '\\\\paragraph' ? (\n <div className=\"butex-document2-widget__float-meta butex-document2-widget__float-meta--compact\">\n <label className=\"butex-document2-widget__float-meta-toggle\">\n <input\n type=\"checkbox\"\n checked={Boolean(block.centered)}\n onChange={(event) => {\n const enabled = event.currentTarget.checked;\n onParagraphCenteredChange?.(block.id, enabled);\n }}\n />\n <span>{messages.centerParagraph}</span>\n </label>\n </div>\n ) : null}\n </section>\n );\n }\n if (block.kind === 'list') {\n return (\n <section className={chromeClass}>\n {header}\n {block.items.map((item, index) => (\n <div key={item.id} className=\"butex-document2-widget__field\" dir=\"rtl\">\n <span className=\"butex-document2-widget__toolbar-label\">\n {block.command === '\\\\begin{enumerate}' ? `${messages.item} ${String(index + 1)}` : messages.item}\n </span>\n <div className=\"butex-document2-widget__list-item-content\" dir={documentDirection}>\n <InlineField field={item.field} {...fieldProps} />\n {item.blocks.map((child) => (\n <BlockEditor\n key={child.id}\n block={child}\n depth={depth + 1}\n references={references}\n documentDirection={documentDirection}\n digitForm={digitForm}\n mathOutput={mathOutput}\n equationSide={equationSide}\n editableEquations={editableEquations}\n editableCitations={editableCitations}\n uiLocale={uiLocale}\n onTextChange={onTextChange}\n onOpenMath={onOpenMath}\n onDeleteMath={onDeleteMath}\n onOpenCite={onOpenCite}\n onDeleteCite={onDeleteCite}\n onFieldFocus={onFieldFocus}\n onMathFocus={onMathFocus}\n onCiteFocus={onCiteFocus}\n onFieldBlur={onFieldBlur}\n onImageSrcChange={onImageSrcChange}\n onAddListItem={onAddListItem}\n onRemoveListItem={onRemoveListItem}\n onManageReferences={onManageReferences}\n />\n ))}\n </div>\n {onRemoveListItem && block.items.length > 1 ? (\n <div className=\"butex-document2-widget__list-item-actions\">\n <button type=\"button\" className=\"butex-document2-widget__button--danger\" onClick={() => onRemoveListItem(block.id, item.id)}>\n {messages.deleteItem}\n </button>\n </div>\n ) : null}\n </div>\n ))}\n {onAddListItem ? (\n <div className=\"butex-document2-widget__list-footer\">\n <button type=\"button\" onClick={() => onAddListItem(block.id)}>\n + {messages.addItem}\n </button>\n </div>\n ) : null}\n </section>\n );\n }\n if (block.kind === 'table') {\n return (\n <section className={chromeClass}>\n {header}\n {block.rows.map((row, rowIndex) => (\n <div key={rowIndex} className=\"butex-document2-widget__row\" dir={documentDirection}>\n {row.map((cell) => (\n <div key={cell.id} className=\"butex-document2-widget__table-cell\" dir={documentDirection}>\n <InlineField field={cell} {...fieldProps} />\n </div>\n ))}\n </div>\n ))}\n <FloatMetaEditor\n captionEnabled={block.captionEnabled}\n caption={block.caption}\n labelEnabled={block.labelEnabled}\n label={block.label}\n labelPlaceholder={messages.tableLabelPlaceholder}\n labelDir={uiLocaleDirection(uiLocale)}\n messages={messages}\n onChange={(patch) => onFloatMetaChange?.(block.id, 'table', patch)}\n />\n </section>\n );\n }\n if (block.kind === 'image') {\n const imageFieldId = `butex-d2-img-${block.id}`;\n return (\n <section className={chromeClass}>\n {header}\n <label className=\"butex-document2-widget__image-src-label\" htmlFor={imageFieldId}>\n {messages.imagePath}\n </label>\n <textarea\n id={imageFieldId}\n className=\"butex-document2-widget__inline-text\"\n value={block.value}\n dir=\"ltr\"\n aria-label={messages.imagePathLabel}\n rows={1}\n ref={(element) => {\n if (element) {\n element.style.height = 'auto';\n element.style.height = `${String(element.scrollHeight)}px`;\n }\n }}\n onFocus={() => onBlockFocus?.(block.id)}\n onChange={(event) => {\n onImageSrcChange?.(block.id, event.currentTarget.value);\n event.currentTarget.style.height = 'auto';\n event.currentTarget.style.height = `${String(event.currentTarget.scrollHeight)}px`;\n }}\n />\n <FloatMetaEditor\n captionEnabled={block.captionEnabled}\n caption={block.caption}\n labelEnabled={block.labelEnabled}\n label={block.label}\n labelPlaceholder={messages.figureLabelPlaceholder}\n labelDir={uiLocaleDirection(uiLocale)}\n messages={messages}\n onChange={(patch) => onFloatMetaChange?.(block.id, 'image', patch)}\n />\n </section>\n );\n }\n if (block.kind === 'bibliography') {\n return (\n <section className={chromeClass}>\n {header}\n <ol className=\"butex-document2-widget__bibliography-editor\" dir={documentDirection}>\n {references.map((reference, index) => (\n <li key={reference.id}>\n <strong>\n [{index + 1}] {reference.key}\n </strong>\n <span>\n {[reference.authors, reference.title, reference.venue, reference.year].filter(Boolean).join(' — ')}\n </span>\n </li>\n ))}\n </ol>\n {onManageReferences ? (\n <button type=\"button\" onClick={onManageReferences}>\n {messages.manageReferences}\n </button>\n ) : null}\n </section>\n );\n }\n return (\n <section className={chromeClass}>\n {header}\n <pre className=\"butex-document2-widget__raw\">{block.value}</pre>\n </section>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { Reference2 } from '../document2/index.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type CitePickerPopoverProps = {\n open: boolean;\n references: Reference2[];\n initialKeys?: string[];\n uiLocale?: ButexUiLocale;\n onClose: () => void;\n onConfirm: (keys: string[]) => void;\n onManageReferences?: () => void;\n};\n\nexport function CitePickerPopover({\n open,\n references,\n initialKeys = [],\n uiLocale = 'ar',\n onClose,\n onConfirm,\n onManageReferences,\n}: CitePickerPopoverProps) {\n const messages = document2Messages(uiLocale);\n const [selected, setSelected] = useState<string[]>(initialKeys);\n\n useEffect(() => {\n if (open) {\n setSelected(initialKeys);\n }\n }, [open, initialKeys]);\n\n if (!open) {\n return null;\n }\n\n function toggleKey(key: string): void {\n setSelected((current) => (current.includes(key) ? current.filter((entry) => entry !== key) : [...current, key]));\n }\n\n return (\n <div className=\"butex-document2-widget__cite-picker-backdrop\" role=\"presentation\" onClick={onClose}>\n <div\n className=\"butex-document2-widget__cite-picker\"\n role=\"dialog\"\n aria-label={messages.citePickerTitle}\n onClick={(event) => event.stopPropagation()}\n >\n <header className=\"butex-document2-widget__cite-picker-header\">\n <strong>{messages.citePickerTitle}</strong>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.close} aria-label={messages.close} onClick={onClose}>\n ×\n </button>\n </header>\n {references.length === 0 ? (\n <p className=\"butex-document2-widget__cite-picker-empty\">{messages.noReferencesYet}</p>\n ) : (\n <ul className=\"butex-document2-widget__cite-picker-list\">\n {references.map((reference, index) => {\n const checked = selected.includes(reference.key);\n const subtitle = [reference.authors, reference.title].filter(Boolean).join(' — ');\n return (\n <li key={reference.id}>\n <label className=\"butex-document2-widget__cite-picker-item\">\n <input type=\"checkbox\" checked={checked} onChange={() => toggleKey(reference.key)} />\n <span>\n <strong>\n [{index + 1}] {reference.key}\n </strong>\n {subtitle ? <span className=\"butex-document2-widget__cite-picker-meta\">{subtitle}</span> : null}\n </span>\n </label>\n </li>\n );\n })}\n </ul>\n )}\n <footer className=\"butex-document2-widget__cite-picker-footer\">\n {onManageReferences ? (\n <button type=\"button\" onClick={onManageReferences}>\n {messages.manageReferences}\n </button>\n ) : null}\n <button type=\"button\" onClick={onClose}>\n {messages.close}\n </button>\n <button\n type=\"button\"\n className=\"butex-document2-widget__primary-btn\"\n disabled={selected.length === 0}\n onClick={() => onConfirm(selected)}\n >\n {messages.insertCitation}\n </button>\n </footer>\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport type { DigitFormId } from '../editor/types.js';\nimport { TableInsertPopover } from './TableInsertPopover.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nconst DIGIT_FORMS: DigitFormId[] = ['western', 'arabicIndic', 'persianIndic'];\n\nexport type DocumentInsertToolbarProps = {\n canUndo: boolean;\n canRedo: boolean;\n editableEquations?: boolean;\n uiLocale?: ButexUiLocale;\n digitForm?: DigitFormId;\n selectionCount?: number;\n canMoveSelectionUp?: boolean;\n canMoveSelectionDown?: boolean;\n onUndo: () => void;\n onRedo: () => void;\n onMoveSelectionUp?: () => void;\n onMoveSelectionDown?: () => void;\n onDeleteSelection?: () => void;\n onAddSection: () => void;\n onAddSubsection: () => void;\n onAddSubsubsection: () => void;\n onAddParagraph: () => void;\n onAddInlineEquation: () => void;\n onAddDisplayEquation: () => void;\n onAddTable: (rowCount: number, colCount: number) => void;\n onAddList: () => void;\n onAddEnumerate: () => void;\n onAddFigure: () => void;\n onInsertCitation: () => void;\n onInsertInternalRef: () => void;\n onInsertBibliography: () => void;\n onManageReferences: () => void;\n onManageLabels: () => void;\n onOpenArticleMeta?: () => void;\n onDigitFormChange: (digitForm: DigitFormId) => void;\n};\n\nfunction digitFormLabel(digitForm: DigitFormId): string {\n if (digitForm === 'arabicIndic') {\n return '٤٥٦';\n }\n if (digitForm === 'persianIndic') {\n return '۴۵۶';\n }\n return '456';\n}\n\nexport function DocumentInsertToolbar({\n canUndo,\n canRedo,\n editableEquations = true,\n uiLocale = 'ar',\n digitForm = 'western',\n selectionCount = 0,\n canMoveSelectionUp = false,\n canMoveSelectionDown = false,\n onUndo,\n onRedo,\n onMoveSelectionUp,\n onMoveSelectionDown,\n onDeleteSelection,\n onAddSection,\n onAddSubsection,\n onAddSubsubsection,\n onAddParagraph,\n onAddInlineEquation,\n onAddDisplayEquation,\n onAddTable,\n onAddList,\n onAddEnumerate,\n onAddFigure,\n onInsertCitation,\n onInsertInternalRef,\n onInsertBibliography,\n onManageReferences,\n onManageLabels,\n onOpenArticleMeta,\n onDigitFormChange,\n}: DocumentInsertToolbarProps) {\n const messages = document2Messages(uiLocale);\n const [digitMenuOpen, setDigitMenuOpen] = useState(false);\n\n function digitTitle(id: DigitFormId): string {\n if (id === 'arabicIndic') {\n return messages.arabicIndicDigits;\n }\n if (id === 'persianIndic') {\n return messages.persianIndicDigits;\n }\n return messages.westernDigits;\n }\n\n return (\n <div className=\"butex-document2-widget__toolbar-insert\">\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.undoRedo}>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={`${messages.undo} (Ctrl+Z)`} aria-label={messages.undo} disabled={!canUndo} onClick={onUndo}>\n ↶\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={`${messages.redo} (Ctrl+Shift+Z)`} aria-label={messages.redo} disabled={!canRedo} onClick={onRedo}>\n ↷\n </button>\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.blockSelection}>\n <button\n type=\"button\"\n className=\"butex-document2-widget__icon-btn\"\n title={messages.moveUp}\n aria-label={messages.moveUp}\n disabled={selectionCount === 0 || !canMoveSelectionUp}\n onClick={onMoveSelectionUp}\n >\n ↑\n </button>\n <button\n type=\"button\"\n className=\"butex-document2-widget__icon-btn\"\n title={messages.moveDown}\n aria-label={messages.moveDown}\n disabled={selectionCount === 0 || !canMoveSelectionDown}\n onClick={onMoveSelectionDown}\n >\n ↓\n </button>\n <button\n type=\"button\"\n className=\"butex-document2-widget__button--danger\"\n title={messages.deleteBlock}\n aria-label={messages.deleteBlock}\n disabled={selectionCount === 0}\n onClick={onDeleteSelection}\n >\n {messages.deleteBlock}\n </button>\n {selectionCount > 0 ? (\n <span className=\"butex-document2-widget__selection-count\">\n {selectionCount} {messages.selectedBlockCount}\n </span>\n ) : null}\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.structure}>\n <button\n type=\"button\"\n className=\"butex-document2-widget__icon-btn\"\n title={messages.articleMetaTitle}\n aria-label={messages.articleMetaTitle}\n onClick={onOpenArticleMeta}\n >\n ✦\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn butex-document2-widget__icon-btn--h1\" title={messages.addSection} aria-label={messages.addSection} onClick={onAddSection}>\n {messages.sectionGlyph}\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn butex-document2-widget__icon-btn--h2\" title={messages.addSubsection} aria-label={messages.addSubsection} onClick={onAddSubsection}>\n {messages.subsectionGlyph}\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn butex-document2-widget__icon-btn--h3\" title={messages.addSubsubsection} aria-label={messages.addSubsubsection} onClick={onAddSubsubsection}>\n {messages.subsubsectionGlyph}\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.addParagraph} aria-label={messages.addParagraph} onClick={onAddParagraph}>\n {messages.paragraphGlyph}\n </button>\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.equations}>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={`${messages.inlineEquation} ($…$)`} aria-label={messages.inlineEquation} disabled={!editableEquations} onClick={onAddInlineEquation}>\n <span className=\"butex-document2-widget__icon-math-inline\" aria-hidden=\"true\">\n $=$\n </span>\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={`${messages.displayEquation} (\\\\[…\\\\])`} aria-label={messages.displayEquation} disabled={!editableEquations} onClick={onAddDisplayEquation}>\n <span className=\"butex-document2-widget__icon-math-display\" aria-hidden=\"true\">\n \\[÷\\]\n </span>\n </button>\n <div className=\"butex-document2-widget__digit-form-menu\">\n <button\n type=\"button\"\n className=\"butex-document2-widget__icon-btn\"\n title={messages.chooseDigitForm}\n aria-label={messages.chooseDigitForm}\n aria-expanded={digitMenuOpen}\n onClick={() => setDigitMenuOpen((open) => !open)}\n >\n {digitFormLabel(digitForm)}\n </button>\n {digitMenuOpen ? (\n <div className=\"butex-document2-widget__digit-form-options\" role=\"listbox\" aria-label={messages.chooseDigitForm}>\n {DIGIT_FORMS.map((id) => (\n <button\n key={id}\n type=\"button\"\n role=\"option\"\n aria-selected={digitForm === id}\n title={digitTitle(id)}\n className=\"butex-document2-widget__digit-form-option\"\n onClick={() => {\n onDigitFormChange(id);\n setDigitMenuOpen(false);\n }}\n >\n {digitFormLabel(id)}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.citations}>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.insertCitation} aria-label={messages.insertCitation} onClick={onInsertCitation}>\n []\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.insertInternalRef} aria-label={messages.insertInternalRef} onClick={onInsertInternalRef}>\n §\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.insertBibliography} aria-label={messages.insertBibliography} onClick={onInsertBibliography}>\n <span className=\"butex-document2-widget__icon-bibliography\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M2.2 2.4h7.2c.9 0 1.6.7 1.6 1.6v9.2c0 .5-.6.8-1 .5l-2.2-1.6H2.2c-.9 0-1.6-.7-1.6-1.6V4c0-.9.7-1.6 1.6-1.6zm0 1.2c-.2 0-.4.2-.4.4v6.5c0 .2.2.4.4.4h6.1l1.5 1.1V4c0-.2-.2-.4-.4-.4H2.2z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M3.4 5.2h5.2v1H3.4zm0 2.1h4.2v1H3.4zm0 2.1h3.4v1H3.4z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M11.4 4.1h2.2c.8 0 1.4.6 1.4 1.4v7.1c0 .4-.5.7-.8.4l-1.7-1.3h-1.1V4.1zm1.2 1.2v5.4l.7.5V5.5c0-.1-.1-.2-.2-.2h-.5z\"\n />\n </svg>\n </span>\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.manageReferences} aria-label={messages.manageReferences} onClick={onManageReferences}>\n ☰\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.manageLabels} aria-label={messages.manageLabels} onClick={onManageLabels}>\n ⌗\n </button>\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.lists}>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.bulletedList} aria-label={messages.bulletedList} onClick={onAddList}>\n •≡\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.numberedList} aria-label={messages.numberedList} onClick={onAddEnumerate}>\n 1.\n </button>\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.table}>\n <TableInsertPopover uiLocale={uiLocale} onConfirm={onAddTable} />\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.figures}>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.insertImage} aria-label={messages.insertImage} onClick={onAddFigure}>\n 🖼\n </button>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type TableInsertPopoverProps = {\n uiLocale?: ButexUiLocale;\n onConfirm: (rowCount: number, colCount: number) => void;\n};\n\nexport function TableInsertPopover({ uiLocale = 'ar', onConfirm }: TableInsertPopoverProps) {\n const messages = document2Messages(uiLocale);\n const [open, setOpen] = useState(false);\n const [rows, setRows] = useState('3');\n const [cols, setCols] = useState('3');\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n const onPointerDown = (event: MouseEvent): void => {\n if (!rootRef.current?.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', onPointerDown);\n return () => document.removeEventListener('mousedown', onPointerDown);\n }, [open]);\n\n function confirm(): void {\n const rowCount = Math.max(1, Math.min(20, Number.parseInt(rows, 10) || 3));\n const colCount = Math.max(1, Math.min(10, Number.parseInt(cols, 10) || 3));\n onConfirm(rowCount, colCount);\n setOpen(false);\n }\n\n return (\n <div className=\"butex-document2-widget__table-popover\" ref={rootRef}>\n <button\n type=\"button\"\n className=\"butex-document2-widget__icon-btn\"\n title={messages.insertTable}\n aria-label={messages.insertTable}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n >\n ⊞\n </button>\n {open ? (\n <div className=\"butex-document2-widget__table-popover-panel\" role=\"dialog\" aria-label={messages.tableSize}>\n <label>\n {messages.rows}\n <input type=\"number\" min={1} max={20} value={rows} onChange={(event) => setRows(event.currentTarget.value)} />\n </label>\n <label>\n {messages.columns}\n <input type=\"number\" min={1} max={10} value={cols} onChange={(event) => setCols(event.currentTarget.value)} />\n </label>\n <button type=\"button\" onClick={confirm}>\n {messages.insert}\n </button>\n </div>\n ) : null}\n </div>\n );\n}\n","import type { Document2MathOutput, PreviewBlock2, PreviewInline2 } from '../document2/index.js';\nimport { MathIsland } from './MathIsland.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type ResolveDocument2ImageUrl = (ref: { assetId?: string; value: string }) => string;\n\nfunction PreviewInlines({ inlines, output }: { inlines: PreviewInline2[]; output: Document2MathOutput }) {\n return (\n <>\n {inlines.map((inline, index) => {\n if (inline.kind === 'text') {\n return <span key={index}>{inline.text}</span>;\n }\n if (inline.kind === 'cite') {\n return (\n <span key={inline.id} className=\"butex-document2-widget__preview-cite\">\n {inline.label}\n </span>\n );\n }\n if (inline.kind === 'ref') {\n return (\n <span key={inline.id} className=\"butex-document2-widget__preview-cite butex-document2-widget__preview-ref\">\n {inline.label}\n </span>\n );\n }\n return <MathIsland key={inline.id} id={inline.id} tex={inline.tex} display={inline.display} output={output} />;\n })}\n </>\n );\n}\n\nfunction isBodyPreviewBlock(block: PreviewBlock2): boolean {\n return (\n block.kind === 'heading' ||\n block.kind === 'paragraph' ||\n block.kind === 'list' ||\n block.kind === 'table' ||\n block.kind === 'image' ||\n block.kind === 'bibliography'\n );\n}\n\nfunction PreviewBlock({\n block,\n output,\n resolveImageUrl,\n uiLocale,\n documentDirection,\n}: {\n block: PreviewBlock2;\n output: Document2MathOutput;\n resolveImageUrl?: ResolveDocument2ImageUrl;\n uiLocale: ButexUiLocale;\n documentDirection: 'rtl' | 'ltr';\n}) {\n const messages = document2Messages(uiLocale);\n const floatCaptionSeparator = uiLocale === 'ar' ? ': ' : '. ';\n function FloatCaption({ numberLabel, caption }: { numberLabel?: string; caption?: string }) {\n if (!numberLabel && !caption) {\n return null;\n }\n return (\n <figcaption dir={documentDirection}>\n {numberLabel ? (\n <span className=\"butex-document2-widget__preview-float-number\">\n {numberLabel}\n {caption ? floatCaptionSeparator : ''}\n </span>\n ) : null}\n {caption ?? ''}\n </figcaption>\n );\n }\n if (block.kind === 'basmala' || block.kind === 'closing') {\n return (\n <p\n className={\n block.kind === 'basmala'\n ? 'butex-document2-widget__preview-basmala'\n : 'butex-document2-widget__preview-closing'\n }\n >\n <MathIsland id={block.id} tex={block.tex} display output={output} />\n </p>\n );\n }\n if (block.kind === 'titleBlock') {\n return (\n <header className=\"butex-document2-widget__preview-title-block\">\n {block.title ? <h1 className=\"butex-document2-widget__preview-article-title\">{block.title}</h1> : null}\n {block.authors ? (\n <p className=\"butex-document2-widget__preview-article-authors\">\n {block.authors.split('\\n').map((line, index) => (\n <span key={index}>\n {index > 0 ? <br /> : null}\n {line}\n </span>\n ))}\n </p>\n ) : null}\n {block.date ? <p className=\"butex-document2-widget__preview-article-date\">{block.date}</p> : null}\n </header>\n );\n }\n if (block.kind === 'abstract') {\n return (\n <section className=\"butex-document2-widget__preview-abstract\" aria-label={messages.articleAbstract}>\n <h2 className=\"butex-document2-widget__preview-abstract-label\">{messages.articleAbstract}</h2>\n <p>{block.text}</p>\n </section>\n );\n }\n if (block.kind === 'heading') {\n const Tag = block.level === 1 ? 'h1' : block.level === 2 ? 'h2' : 'h3';\n return (\n <Tag>\n <PreviewInlines inlines={block.inlines} output={output} />\n </Tag>\n );\n }\n if (block.kind === 'paragraph') {\n return (\n <p className={block.centered ? 'butex-document2-widget__preview-paragraph--centered' : undefined}>\n <PreviewInlines inlines={block.inlines} output={output} />\n </p>\n );\n }\n if (block.kind === 'list') {\n const Tag = block.ordered ? 'ol' : 'ul';\n return (\n <Tag>\n {block.items.map((item) => (\n <li key={item.id}>\n <PreviewInlines inlines={item.inlines} output={output} />\n {item.blocks.map((child) => (\n <PreviewBlock\n key={child.id}\n block={child}\n output={output}\n resolveImageUrl={resolveImageUrl}\n uiLocale={uiLocale}\n documentDirection={documentDirection}\n />\n ))}\n </li>\n ))}\n </Tag>\n );\n }\n if (block.kind === 'omit') {\n return null;\n }\n if (block.kind === 'table') {\n return (\n <figure className=\"butex-document2-widget__preview-float\">\n <table>\n <tbody>\n {block.rows.map((row, rowIndex) => (\n <tr key={rowIndex}>\n {row.map((cell, columnIndex) => (\n <td key={columnIndex}>\n <PreviewInlines inlines={cell} output={output} />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n <FloatCaption numberLabel={block.numberLabel} caption={block.caption} />\n </figure>\n );\n }\n if (block.kind === 'image') {\n const src = resolveImageUrl ? resolveImageUrl({ assetId: block.assetId, value: block.src }) : block.src;\n return (\n <figure className=\"butex-document2-widget__preview-float\">\n <img src={src} alt={block.caption ?? ''} />\n <FloatCaption numberLabel={block.numberLabel} caption={block.caption} />\n </figure>\n );\n }\n if (block.kind === 'bibliography') {\n return (\n <ol className=\"butex-document2-widget__preview-bibliography\">\n {block.items.map((item) => (\n <li key={item.id}>\n <span className=\"butex-document2-widget__preview-bib-number\">{item.numberLabel}.</span>{' '}\n <span>\n {[item.authors, item.title, item.venue, item.year].filter(Boolean).join(', ')}\n {item.url ? (\n <>\n {' '}\n <a href={item.url} target=\"_blank\" rel=\"noreferrer\">\n {item.url}\n </a>\n </>\n ) : null}\n </span>\n </li>\n ))}\n </ol>\n );\n }\n return null;\n}\n\nexport function DocumentPreview({\n blocks,\n output,\n documentDirection = 'rtl',\n uiLocale = 'ar',\n resolveImageUrl,\n}: {\n blocks: PreviewBlock2[];\n output: Document2MathOutput;\n documentDirection?: 'rtl' | 'ltr';\n uiLocale?: ButexUiLocale;\n resolveImageUrl?: ResolveDocument2ImageUrl;\n}) {\n const messages = document2Messages(uiLocale);\n const hasBody = blocks.some(isBodyPreviewBlock);\n return (\n <div className=\"butex-document2-widget__preview\" dir={documentDirection}>\n {blocks.map((block) => (\n <PreviewBlock\n key={block.id}\n block={block}\n output={output}\n resolveImageUrl={resolveImageUrl}\n uiLocale={uiLocale}\n documentDirection={documentDirection}\n />\n ))}\n {!hasBody ? <p className=\"butex-document2-widget__preview-empty-body\">{messages.emptyDocument}</p> : null}\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport type { EditorSession } from '../editor/index.js';\nimport type { EditorSide } from '../editor/index.js';\nimport { ButexEditor } from '../react/ButexEditor.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { uiLocaleDirection } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type EquationMathMode = 'inline' | 'display';\n\nexport type EquationDrawerProps = {\n session: EditorSession;\n reason?: string | null;\n mathMode: EquationMathMode;\n canDelete?: boolean;\n equationSide?: EditorSide;\n uiLocale?: ButexUiLocale;\n labelEnabled?: boolean;\n label?: string;\n onLabelEnabledChange?: (enabled: boolean) => void;\n onLabelChange?: (label: string) => void;\n onMathModeChange: (mode: EquationMathMode) => void;\n onClose: () => void;\n onSave: (session: EditorSession) => void;\n onDelete?: () => void;\n};\n\nexport function EquationDrawer({\n session,\n reason,\n mathMode,\n canDelete = false,\n equationSide = 'arabic',\n uiLocale = 'ar',\n labelEnabled = false,\n label = '',\n onLabelEnabledChange,\n onLabelChange,\n onMathModeChange,\n onClose,\n onSave,\n onDelete,\n}: EquationDrawerProps) {\n const messages = document2Messages(uiLocale);\n const latestSession = useRef(session);\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [onClose]);\n\n return (\n <div className=\"butex-document2-widget__equation-modal\" role=\"presentation\">\n <button\n type=\"button\"\n className=\"butex-document2-widget__equation-modal-backdrop\"\n aria-label={messages.closeEquationDialog}\n onClick={onClose}\n />\n <div\n className=\"butex-document2-widget__equation-modal-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"butex-document2-equation-modal-title\"\n dir={uiLocaleDirection(uiLocale)}\n lang={uiLocale}\n >\n <div className=\"butex-document2-widget__row\">\n <strong id=\"butex-document2-equation-modal-title\">{messages.equationEditorTitle}</strong>\n <button type=\"button\" onClick={onClose}>\n {messages.close}\n </button>\n </div>\n <div className=\"butex-document2-widget__row\" role=\"group\" aria-label={messages.equationType}>\n <button type=\"button\" aria-pressed={mathMode === 'inline'} onClick={() => onMathModeChange('inline')}>\n {messages.inline} ($)\n </button>\n <button type=\"button\" aria-pressed={mathMode === 'display'} onClick={() => onMathModeChange('display')}>\n {messages.displayed} (\\\\[)\n </button>\n </div>\n {mathMode === 'display' ? (\n <div className=\"butex-document2-widget__float-meta\">\n <label className=\"butex-document2-widget__float-meta-toggle\">\n <input\n type=\"checkbox\"\n checked={labelEnabled}\n onChange={(event) => onLabelEnabledChange?.(event.currentTarget.checked)}\n />\n <span>{messages.labelToggle}</span>\n </label>\n {labelEnabled ? (\n <label className=\"butex-document2-widget__refs-field\">\n <span>{messages.floatLabel}</span>\n <input\n value={label}\n dir={uiLocaleDirection(uiLocale)}\n placeholder={messages.equationLabelPlaceholder}\n onChange={(event) => onLabelChange?.(event.currentTarget.value)}\n />\n </label>\n ) : null}\n </div>\n ) : null}\n {reason ? <p className=\"butex-document2-widget__error\">{uiLocale === 'en' ? messages.equationUnavailable : reason}</p> : null}\n <ButexEditor\n debug={false}\n defaultSide={equationSide}\n uiLocale={uiLocale}\n initialSession={session}\n onSessionChange={(nextSession) => {\n latestSession.current = nextSession;\n }}\n />\n <div className=\"butex-document2-widget__row\">\n {canDelete && onDelete ? (\n <button type=\"button\" className=\"butex-document2-widget__button--danger\" onClick={onDelete}>\n {messages.deleteEquation}\n </button>\n ) : null}\n <button type=\"button\" onClick={() => onSave({ ...latestSession.current, activeSide: equationSide })}>\n {messages.saveEquation}\n </button>\n </div>\n </div>\n </div>\n );\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';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { uiLocaleDirection } from '../uiLocale.js';\nimport {\n atomicCommandTitle,\n atomicOperatorCommandTitle,\n equationEditorMessages,\n type EquationEditorMessages,\n} from '../editor/uiLocale.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 /** Initial equation side. Users may still switch sides from the toolbar. */\n defaultSide?: EditorSide;\n /** Human-facing editor chrome language. Independent from the active equation side. */\n uiLocale?: ButexUiLocale;\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 }> = [\n { id: 'western', label: '456' },\n { id: 'arabicIndic', label: '٤٥٦' },\n { id: 'persianIndic', label: '۴۵۶' },\n];\nconst CHARACTER_FONT_OPTIONS: Array<{ id: CharacterFontId; label: string }> = [\n { id: 'default', label: 'س' },\n { id: 'takween', label: 'تك' },\n { id: 'diwani', label: 'ديو' },\n { id: 'diwaniOutline', label: 'ظل' },\n];\nconst FUNCTION_COMMANDS = atomicCommandsByCategory('function');\nconst LIMITS_SERIES_COMMANDS = atomicCommandsByCategory('limits_series');\nconst FUNCTION2_COMMANDS = atomicCommandsByCategory('function2');\nconst DERIVATIVE_COMMANDS = atomicCommandsByCategory('derivative');\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 }> = [\n { id: 'matrix', label: '□' },\n { id: 'pmatrix', label: '(□)' },\n { id: 'bmatrix', label: '[□]' },\n { id: 'Bmatrix', label: '{□}' },\n { id: 'vmatrix', label: '|□|' },\n { id: 'Vmatrix', label: '||□||' },\n];\ntype EnvPaletteMode = 'matrix' | 'array' | 'aligned';\nconst ARRAY_ALIGNMENTS: Array<{ id: EnvColumnAlignment }> = [\n { id: 'l' },\n { id: 'c' },\n { id: 'r' },\n];\n\nfunction matrixSizeLabel(rows: number, columns: number, messages: EquationEditorMessages): string {\n return `${String(rows)} ${messages.row} × ${String(columns)} ${messages.column}`;\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 } {\n return CHARACTER_FONT_OPTIONS.find((option) => option.id === fontId) ?? CHARACTER_FONT_OPTIONS[0];\n}\n\nfunction characterFontTitle(fontId: CharacterFontId, messages: EquationEditorMessages): string {\n if (fontId === 'takween') return messages.takweenFont;\n if (fontId === 'diwani') return messages.diwaniFont;\n if (fontId === 'diwaniOutline') return messages.diwaniOutlineFont;\n return messages.defaultFont;\n}\n\nfunction digitFormTitle(digitForm: DigitFormId, messages: EquationEditorMessages): string {\n if (digitForm === 'arabicIndic') return messages.arabicIndicDigits;\n if (digitForm === 'persianIndic') return messages.persianIndicDigits;\n return messages.westernDigits;\n}\n\nfunction matrixStyleTitle(style: MatrixEnvStyle, messages: EquationEditorMessages): string {\n if (style === 'pmatrix') return messages.matrixParentheses;\n if (style === 'bmatrix') return messages.matrixBrackets;\n if (style === 'Bmatrix') return messages.matrixBraces;\n if (style === 'vmatrix') return messages.matrixBars;\n if (style === 'Vmatrix') return messages.matrixDoubleBars;\n return messages.matrixNoDelimiters;\n}\n\nfunction alignmentCopy(alignment: EnvColumnAlignment, messages: EquationEditorMessages): { label: string; title: string } {\n if (alignment === 'l') return { label: messages.alignLeft, title: messages.alignColumnLeft };\n if (alignment === 'r') return { label: messages.alignRight, title: messages.alignColumnRight };\n return { label: messages.alignCenter, title: messages.alignColumnCenter };\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, messages: EquationEditorMessages): string {\n const passive = session.activeSide === 'arabic' ? session.englishTree : session.arabicTree;\n const title =\n session.activeSide === 'arabic'\n ? messages.inactiveEnglish\n : messages.inactiveArabic;\n const latex =\n session.activeSide === 'arabic'\n ? renderChainEnglish(passive)\n : renderChainArabic(passive);\n return `${title}\\n\\n${latex || messages.empty}`;\n}\n\nexport const ButexEditor = forwardRef<ButexEditorHandle, ButexEditorProps>(\n function ButexEditor({ className, debug = false, defaultSide, uiLocale = 'ar', initialSession, onSessionChange }, ref) {\n const messages = equationEditorMessages(uiLocale);\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 const uiLocaleRef = useRef(uiLocale);\n uiLocaleRef.current = uiLocale;\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 [derivativeMenuOpen, setDerivativeMenuOpen] = 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 const currentMessages = equationEditorMessages(uiLocaleRef.current);\n latexLinesEl.textContent = `${currentMessages.englishLatex}:\\n${english || currentMessages.empty}\\n\\n${currentMessages.arabicLatex}:\\n${arabic || currentMessages.empty}`;\n }\n if (debugRef.current && passivePreviewEl) {\n passivePreviewEl.textContent = passiveTreeText(session, equationEditorMessages(uiLocaleRef.current));\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 = `${equationEditorMessages(uiLocaleRef.current).mathJaxError}: ${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 defaultSide,\n uiLocale,\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 = `${equationEditorMessages(uiLocaleRef.current).previewError}: ${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 useEffect(() => {\n runtimeRef.current?.setUiLocale(uiLocale);\n const session = runtimeRef.current?.getSession();\n if (session) {\n void updatePreviewRef.current(session);\n }\n }, [uiLocale]);\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={uiLocaleDirection(uiLocale)}\n lang={uiLocale}\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={messages.undoRedo}>\n <button ref={undoBtnRef} id=\"btn-undo\" type=\"button\" className=\"icon-btn\" title={messages.undo} aria-label={messages.undo}>\n ↷\n </button>\n <button ref={redoBtnRef} id=\"btn-redo\" type=\"button\" className=\"icon-btn\" title={messages.redo} aria-label={messages.redo}>\n ↶\n </button>\n </div>\n <div className=\"toolbar-group toolbar-clipboard\" role=\"group\" aria-label={messages.clipboard}>\n <button ref={copyBtnRef} id=\"btn-copy\" type=\"button\" className=\"icon-btn\" title={messages.copy} aria-label={messages.copy} disabled>\n ⧉\n </button>\n <button ref={cutBtnRef} id=\"btn-cut\" type=\"button\" className=\"icon-btn\" title={messages.cut} aria-label={messages.cut} disabled>\n ✂\n </button>\n <button\n id=\"btn-paste\"\n type=\"button\"\n className=\"icon-btn\"\n title={messages.paste}\n aria-label={messages.paste}\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={messages.editorSettings}>\n <button className=\"icon-btn accent\" type=\"button\" title={messages.toggleSide} aria-label={messages.toggleSide} onClick={() => runtimeRef.current?.toggleSide()}>\n ⇄\n </button>\n </div>\n <div className=\"toolbar-group toolbar-structures\" role=\"group\" aria-label={messages.structures}>\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={messages.insertDelimiters}\n aria-label={messages.insertDelimiters}\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={messages.insertDelimiters} hidden={!delimiterMenuOpen}>\n <button\n className=\"delimiter-command-option\"\n data-delim=\"paren\"\n type=\"button\"\n role=\"option\"\n title={messages.insertParentheses}\n aria-label={messages.insertParentheses}\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={messages.insertBrackets}\n aria-label={messages.insertBrackets}\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={messages.insertBraces}\n aria-label={messages.insertBraces}\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={messages.insertFraction} aria-label={messages.insertFraction} 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={messages.insertRoot} aria-label={messages.insertRoot} 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={messages.environments}>\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={messages.insertEnvironment}\n aria-label={messages.insertEnvironment}\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={messages.insertEnvironment} hidden={!matrixMenuOpen}>\n <div className=\"matrix-style-options\" role=\"listbox\" aria-label={messages.environmentType}>\n {[\n { id: 'matrix' as const, label: messages.matrix },\n { id: 'array' as const, label: messages.array },\n { id: 'aligned' as const, label: messages.aligned },\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={messages.matrixType}>\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={matrixStyleTitle(style.id, messages)}\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, messages) : matrixSizeLabel(matrixRows, matrixColumns, messages)}\n </div>\n <div className=\"matrix-grid-picker\" aria-label={messages.chooseEnvironmentSize}>\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, messages)}\n aria-label={matrixSizeLabel(rows, columns, messages)}\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 {messages.row}\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 {messages.column}\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 {messages.insert}\n </button>\n </div>\n <div className=\"matrix-edit-actions\" aria-label={messages.editSelectedEnvironment}>\n {envPaletteMode === 'matrix' ? (\n <button type=\"button\" title={messages.applySelectedMatrixStyle} onMouseDown={(event) => event.preventDefault()} onClick={() => runtimeRef.current?.setMatrixEnvStyle(matrixStyle)}>\n {messages.applyStyle}\n </button>\n ) : null}\n {envPaletteMode === 'array' ? (\n <>\n <label>\n {messages.column}\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={alignmentCopy(alignment.id, messages).title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => runtimeRef.current?.setArrayColumnAlignment(arrayAlignmentColumn - 1, alignment.id)}\n >\n {alignmentCopy(alignment.id, messages).label}\n </button>\n ))}\n </>\n ) : null}\n <button type=\"button\" title={messages.addRow} onMouseDown={(event) => event.preventDefault()} onClick={() => runtimeRef.current?.addMatrixRow()}>\n +{messages.row}\n </button>\n <button type=\"button\" title={messages.removeRow} onMouseDown={(event) => event.preventDefault()} onClick={() => runtimeRef.current?.removeMatrixRow()}>\n -{messages.row}\n </button>\n <button type=\"button\" title={messages.addColumn} onMouseDown={(event) => event.preventDefault()} onClick={() => runtimeRef.current?.addMatrixColumn()}>\n +{messages.column}\n </button>\n <button type=\"button\" title={messages.removeColumn} onMouseDown={(event) => event.preventDefault()} onClick={() => runtimeRef.current?.removeMatrixColumn()}>\n -{messages.column}\n </button>\n </div>\n </div>\n </div>\n </div>\n <div className=\"toolbar-group toolbar-settings\" role=\"group\" aria-label={messages.spaces}>\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={messages.insertSpace}\n aria-label={messages.insertSpace}\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={messages.insertSpace} 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={atomicCommandTitle(command, uiLocale)}\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\">{atomicCommandTitle(command, uiLocale)}</span>\n </button>\n ))}\n </div>\n </div>\n </div>\n <div className=\"toolbar-group toolbar-functions\" role=\"group\" aria-label={messages.functions}>\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={messages.insertFunction}\n aria-label={messages.insertFunction}\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={messages.insertFunction} 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={atomicCommandTitle(command, uiLocale)}\n aria-label={atomicCommandTitle(command, uiLocale)}\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={messages.insertLimitsSeries}\n aria-label={messages.insertLimitsSeries}\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={messages.insertLimitsSeries} 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={atomicCommandTitle(command, uiLocale)}\n aria-label={atomicCommandTitle(command, uiLocale)}\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={messages.insertAdditionalFunctions}\n aria-label={messages.insertAdditionalFunctions}\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={messages.insertAdditionalFunctions} 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={atomicCommandTitle(command, uiLocale)}\n aria-label={atomicCommandTitle(command, uiLocale)}\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--derivative\"\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setDerivativeMenuOpen(false);\n }\n }}\n >\n <button\n className=\"icon-btn function-command-btn\"\n type=\"button\"\n title={messages.insertDerivative}\n aria-label={messages.insertDerivative}\n aria-haspopup=\"listbox\"\n aria-expanded={derivativeMenuOpen}\n onClick={() => setDerivativeMenuOpen((open) => !open)}\n >\n {DERIVATIVE_COMMANDS[0]?.arabicLabel ?? 'ء'}\n </button>\n <div className=\"function-command-options\" role=\"listbox\" aria-label={messages.insertDerivative} hidden={!derivativeMenuOpen}>\n {DERIVATIVE_COMMANDS.map((command) => (\n <button\n key={command.id}\n className=\"function-command-option\"\n type=\"button\"\n role=\"option\"\n title={atomicCommandTitle(command, uiLocale)}\n aria-label={atomicCommandTitle(command, uiLocale)}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertAtomicCommand(command.id);\n setDerivativeMenuOpen(false);\n focusSurface();\n }}\n >\n {command.arabicLabel}\n </button>\n ))}\n <button\n className=\"function-command-option\"\n type=\"button\"\n role=\"option\"\n title={messages.insertFirstDerivative}\n aria-label={messages.insertFirstDerivative}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertFirstDerivative();\n setDerivativeMenuOpen(false);\n focusSurface();\n }}\n >\n ء/س\n </button>\n <button\n className=\"function-command-option\"\n type=\"button\"\n role=\"option\"\n title={messages.insertSecondDerivative}\n aria-label={messages.insertSecondDerivative}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertSecondDerivative();\n setDerivativeMenuOpen(false);\n focusSurface();\n }}\n >\n ء²/س²\n </button>\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={messages.insertNumberSets}\n aria-label={messages.insertNumberSets}\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={messages.insertNumberSets} 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={atomicCommandTitle(command, uiLocale)}\n aria-label={atomicCommandTitle(command, uiLocale)}\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={messages.operations}>\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={messages.insertOperation}\n aria-label={messages.insertOperation}\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={messages.insertOperation} 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={atomicOperatorCommandTitle(command, uiLocale)}\n aria-label={atomicOperatorCommandTitle(command, uiLocale)}\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={messages.insertRelationsSets}\n aria-label={messages.insertRelationsSets}\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={messages.insertRelationsSets} 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={atomicOperatorCommandTitle(command, uiLocale)}\n aria-label={atomicOperatorCommandTitle(command, uiLocale)}\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={messages.insertArrows}\n aria-label={messages.insertArrows}\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={messages.insertArrows} 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={atomicOperatorCommandTitle(command, uiLocale)}\n aria-label={atomicOperatorCommandTitle(command, uiLocale)}\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={messages.insertDots}\n aria-label={messages.insertDots}\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={messages.insertDots} 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={atomicOperatorCommandTitle(command, uiLocale)}\n aria-label={atomicOperatorCommandTitle(command, uiLocale)}\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={messages.insertIntegrals}\n aria-label={messages.insertIntegrals}\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={messages.insertIntegrals} 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={atomicOperatorCommandTitle(command, uiLocale)}\n aria-label={atomicOperatorCommandTitle(command, uiLocale)}\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={messages.scripts}>\n <button className=\"icon-btn script-icon-btn\" type=\"button\" title={messages.addSuperscript} aria-label={messages.addSuperscript} 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={messages.addSubscript} aria-label={messages.addSubscript} 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={messages.removeSuperscript} aria-label={messages.removeSuperscript} 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={messages.removeSubscript} aria-label={messages.removeSubscript} 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={messages.inputStyles}>\n <button className=\"icon-btn delete-node-btn\" type=\"button\" title={messages.deleteSelectedStructure} aria-label={messages.deleteSelectedStructure} onClick={() => runtimeRef.current?.deleteStructure()}>\n ×\n </button>\n <button ref={splitTypingBtnRef} id=\"toggle-split-leaf-typing\" className=\"icon-btn ligature-btn\" type=\"button\" title={messages.toggleLetterMerging} aria-label={messages.toggleLetterMerging} 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={characterFontTitle(selectedCharacterFont, messages)}\n aria-label={messages.chooseWritingFont}\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={messages.chooseWritingFont} 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={characterFontTitle(option.id, messages)}\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={messages.chooseDigitForm}\n aria-label={messages.chooseDigitForm}\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={messages.chooseDigitForm} 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={digitFormTitle(option.id, messages)}\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={messages.equationEditor}\n />\n <div ref={renderErrorRef} className=\"error\" hidden />\n </section>\n\n <section className=\"panel panel-preview\" aria-label={messages.renderPreview}>\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\">{messages.development}</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 ? messages.showDebugLog : messages.hideDebugLog}\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 {messages.copyDebugLog}\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","import type { Document2LabelEntry } from '../document2/index.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { uiLocaleDirection } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type LabelsPanelProps = {\n open: boolean;\n labels: Document2LabelEntry[];\n uiLocale?: ButexUiLocale;\n onClose: () => void;\n onUpdateFloat?: (ownerId: string, kind: 'fig' | 'tab', patch: { caption?: string; label?: string; captionEnabled?: boolean; labelEnabled?: boolean }) => void;\n onUpdateEquationLabel?: (tokenId: string, patch: { label?: string; labelEnabled?: boolean }) => void;\n};\n\nfunction kindLabel(kind: Document2LabelEntry['kind'], uiLocale: ButexUiLocale): string {\n const messages = document2Messages(uiLocale);\n if (kind === 'fig') {\n return messages.labelKindFig;\n }\n if (kind === 'tab') {\n return messages.labelKindTab;\n }\n return messages.labelKindEq;\n}\n\nexport function LabelsPanel({\n open,\n labels,\n uiLocale = 'ar',\n onClose,\n onUpdateFloat,\n onUpdateEquationLabel,\n}: LabelsPanelProps) {\n const messages = document2Messages(uiLocale);\n\n if (!open) {\n return null;\n }\n\n return (\n <div className=\"butex-document2-widget__refs-backdrop\" role=\"presentation\" onClick={onClose}>\n <div className=\"butex-document2-widget__refs-panel\" role=\"dialog\" aria-label={messages.labelsTitle} onClick={(event) => event.stopPropagation()}>\n <header className=\"butex-document2-widget__refs-header\">\n <strong>{messages.labelsTitle}</strong>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.close} aria-label={messages.close} onClick={onClose}>\n ×\n </button>\n </header>\n <p className=\"butex-document2-widget__labels-help\">{messages.labelsHelp}</p>\n {labels.length === 0 ? (\n <p className=\"butex-document2-widget__cite-picker-empty\">{messages.noLabelsYet}</p>\n ) : (\n <ul className=\"butex-document2-widget__refs-list\">\n {labels.map((entry) => (\n <li key={`${entry.kind}:${entry.ownerId}`} className=\"butex-document2-widget__refs-item\">\n <div className=\"butex-document2-widget__refs-item-head\">\n <strong>\n [{kindLabel(entry.kind, uiLocale)} {entry.number}] {entry.key}\n </strong>\n </div>\n <div className=\"butex-document2-widget__refs-grid\">\n <label className=\"butex-document2-widget__refs-field\">\n <span>{messages.floatLabel}</span>\n <input\n value={entry.key}\n dir={uiLocaleDirection(uiLocale)}\n onChange={(event) => {\n const value = event.currentTarget.value;\n if (entry.kind === 'eq') {\n onUpdateEquationLabel?.(entry.ownerId, { label: value, labelEnabled: true });\n } else if (entry.kind === 'fig' || entry.kind === 'tab') {\n onUpdateFloat?.(entry.ownerId, entry.kind, { label: value, labelEnabled: true });\n }\n }}\n />\n </label>\n {entry.kind === 'fig' || entry.kind === 'tab' ? (\n <label className=\"butex-document2-widget__refs-field\">\n <span>{messages.floatCaption}</span>\n <input\n value={entry.caption}\n onChange={(event) => {\n const value = event.currentTarget.value;\n const kind = entry.kind;\n if (kind === 'fig' || kind === 'tab') {\n onUpdateFloat?.(entry.ownerId, kind, { caption: value, captionEnabled: true });\n }\n }}\n />\n </label>\n ) : null}\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport type { Reference2, Reference2Json } from '../document2/index.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type ReferencesPanelProps = {\n open: boolean;\n references: Reference2[];\n uiLocale?: ButexUiLocale;\n onClose: () => void;\n onAdd: (partial?: Partial<Reference2Json>) => void;\n onUpdate: (referenceId: string, patch: Partial<Reference2Json>) => void;\n onRemove: (referenceId: string) => void;\n onMove: (referenceId: string, direction: -1 | 1) => void;\n};\n\nconst EMPTY_DRAFT: Reference2Json = { key: '', authors: '', title: '', year: '', url: '', venue: '' };\n\nexport function ReferencesPanel({\n open,\n references,\n uiLocale = 'ar',\n onClose,\n onAdd,\n onUpdate,\n onRemove,\n onMove,\n}: ReferencesPanelProps) {\n const messages = document2Messages(uiLocale);\n const [draft, setDraft] = useState<Reference2Json>(EMPTY_DRAFT);\n\n if (!open) {\n return null;\n }\n\n return (\n <div className=\"butex-document2-widget__refs-backdrop\" role=\"presentation\" onClick={onClose}>\n <div className=\"butex-document2-widget__refs-panel\" role=\"dialog\" aria-label={messages.referencesTitle} onClick={(event) => event.stopPropagation()}>\n <header className=\"butex-document2-widget__refs-header\">\n <strong>{messages.referencesTitle}</strong>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.close} aria-label={messages.close} onClick={onClose}>\n ×\n </button>\n </header>\n\n <div className=\"butex-document2-widget__refs-add\">\n <h3>{messages.addReference}</h3>\n <div className=\"butex-document2-widget__refs-grid\">\n {(\n [\n ['key', messages.referenceKey],\n ['authors', messages.referenceAuthors],\n ['title', messages.referenceTitle],\n ['year', messages.referenceYear],\n ['venue', messages.referenceVenue],\n ['url', messages.referenceUrl],\n ] as const\n ).map(([field, label]) => (\n <label key={field} className=\"butex-document2-widget__refs-field\">\n <span>{label}</span>\n <input\n value={draft[field] ?? ''}\n onChange={(event) => {\n const value = event.currentTarget.value;\n setDraft((current) => ({ ...current, [field]: value }));\n }}\n />\n </label>\n ))}\n </div>\n <button\n type=\"button\"\n className=\"butex-document2-widget__primary-btn\"\n disabled={!draft.key?.trim()}\n onClick={() => {\n onAdd(draft);\n setDraft(EMPTY_DRAFT);\n }}\n >\n {messages.addReference}\n </button>\n </div>\n\n <ul className=\"butex-document2-widget__refs-list\">\n {references.map((reference, index) => (\n <li key={reference.id} className=\"butex-document2-widget__refs-item\">\n <div className=\"butex-document2-widget__refs-item-head\">\n <strong>\n [{index + 1}] {reference.key}\n </strong>\n <div className=\"butex-document2-widget__refs-item-actions\">\n <button type=\"button\" title={messages.moveUp} aria-label={messages.moveUp} disabled={index === 0} onClick={() => onMove(reference.id, -1)}>\n ↑\n </button>\n <button\n type=\"button\"\n title={messages.moveDown}\n aria-label={messages.moveDown}\n disabled={index === references.length - 1}\n onClick={() => onMove(reference.id, 1)}\n >\n ↓\n </button>\n <button type=\"button\" title={messages.deleteReference} aria-label={messages.deleteReference} onClick={() => onRemove(reference.id)}>\n ×\n </button>\n </div>\n </div>\n <div className=\"butex-document2-widget__refs-grid\">\n {(\n [\n ['key', messages.referenceKey],\n ['authors', messages.referenceAuthors],\n ['title', messages.referenceTitle],\n ['year', messages.referenceYear],\n ['venue', messages.referenceVenue],\n ['url', messages.referenceUrl],\n ] as const\n ).map(([field, label]) => (\n <label key={field} className=\"butex-document2-widget__refs-field\">\n <span>{label}</span>\n <input\n value={reference[field]}\n onChange={(event) => {\n const value = event.currentTarget.value;\n onUpdate(reference.id, { [field]: value });\n }}\n />\n </label>\n ))}\n </div>\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { Document2LabelEntry } from '../document2/index.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type RefPickerPopoverProps = {\n open: boolean;\n labels: Document2LabelEntry[];\n initialKeys?: string[];\n initialRefCommand?: 'ref' | 'eqref';\n uiLocale?: ButexUiLocale;\n onClose: () => void;\n onConfirm: (keys: string[], refCommand: 'ref' | 'eqref') => void;\n onManageLabels?: () => void;\n};\n\nexport function RefPickerPopover({\n open,\n labels,\n initialKeys = [],\n initialRefCommand = 'ref',\n uiLocale = 'ar',\n onClose,\n onConfirm,\n onManageLabels,\n}: RefPickerPopoverProps) {\n const messages = document2Messages(uiLocale);\n const [selected, setSelected] = useState<string[]>(initialKeys);\n const [refCommand, setRefCommand] = useState<'ref' | 'eqref'>(initialRefCommand);\n\n useEffect(() => {\n if (open) {\n setSelected(initialKeys);\n setRefCommand(initialRefCommand);\n }\n }, [open, initialKeys, initialRefCommand]);\n\n if (!open) {\n return null;\n }\n\n function selectKey(key: string, kind: Document2LabelEntry['kind']): void {\n setSelected([key]);\n setRefCommand(kind === 'eq' ? 'eqref' : 'ref');\n }\n\n return (\n <div className=\"butex-document2-widget__cite-picker-backdrop\" role=\"presentation\" onClick={onClose}>\n <div\n className=\"butex-document2-widget__cite-picker\"\n role=\"dialog\"\n aria-label={messages.refPickerTitle}\n onClick={(event) => event.stopPropagation()}\n >\n <header className=\"butex-document2-widget__cite-picker-header\">\n <strong>{messages.refPickerTitle}</strong>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.close} aria-label={messages.close} onClick={onClose}>\n ×\n </button>\n </header>\n {labels.length === 0 ? (\n <p className=\"butex-document2-widget__cite-picker-empty\">{messages.noLabelsYet}</p>\n ) : (\n <ul className=\"butex-document2-widget__cite-picker-list\">\n {labels.map((entry) => {\n const checked = selected.includes(entry.key);\n return (\n <li key={`${entry.kind}:${entry.ownerId}`}>\n <label className=\"butex-document2-widget__cite-picker-item\">\n <input type=\"radio\" name=\"butex-ref-key\" checked={checked} onChange={() => selectKey(entry.key, entry.kind)} />\n <span>\n <strong>\n [{entry.kind} {entry.number}] {entry.key}\n </strong>\n {entry.caption ? <span className=\"butex-document2-widget__cite-picker-meta\">{entry.caption}</span> : null}\n </span>\n </label>\n </li>\n );\n })}\n </ul>\n )}\n <footer className=\"butex-document2-widget__cite-picker-footer\">\n {onManageLabels ? (\n <button type=\"button\" onClick={onManageLabels}>\n {messages.manageLabels}\n </button>\n ) : null}\n <button type=\"button\" onClick={onClose}>\n {messages.close}\n </button>\n <button\n type=\"button\"\n className=\"butex-document2-widget__primary-btn\"\n disabled={selected.length === 0}\n onClick={() => onConfirm(selected, refCommand)}\n >\n {messages.insertInternalRef}\n </button>\n </footer>\n </div>\n </div>\n );\n}\n","import type { Document2Block, Document2Node } from '../document2/index.js';\n\nexport type Document2EditorFocus = {\n blockId: string | null;\n fieldId: string | null;\n textTokenId: string | null;\n caretOffset: number;\n};\n\nexport function createEmptyDocument2EditorFocus(): Document2EditorFocus {\n return { blockId: null, fieldId: null, textTokenId: null, caretOffset: 0 };\n}\n\nexport function findBlockIdForField(blocks: Document2Block[], fieldId: string): string | null {\n for (const block of blocks) {\n if (block.kind === 'textBlock' && block.field.id === fieldId) {\n return block.id;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (item.field.id === fieldId) {\n return block.id;\n }\n const nested = findBlockIdForField(item.blocks, fieldId);\n if (nested) {\n return nested;\n }\n }\n }\n if (block.kind === 'table') {\n for (const row of block.rows) {\n for (const cell of row) {\n if (cell.id === fieldId) {\n return block.id;\n }\n }\n }\n }\n }\n return null;\n}\n\nexport function resolveInsertField(document: Document2Node, focus: Document2EditorFocus): { fieldId: string; caretOffset: number; textTokenId: string | null } | null {\n if (focus.fieldId) {\n return { fieldId: focus.fieldId, caretOffset: focus.caretOffset, textTokenId: focus.textTokenId };\n }\n for (const block of document.blocks) {\n if (block.kind === 'textBlock') {\n const textToken = block.field.tokens.find((t) => t.kind === 'text');\n const text = textToken?.kind === 'text' ? textToken.text : '';\n return { fieldId: block.field.id, caretOffset: text.length, textTokenId: textToken?.kind === 'text' ? textToken.id : null };\n }\n }\n return null;\n}\n\nexport function resolveInsertAfterBlockId(document: Document2Node, focus: Document2EditorFocus): string | null {\n if (focus.blockId && document.blocks.some((b) => b.id === focus.blockId)) {\n return focus.blockId;\n }\n if (focus.fieldId) {\n return findBlockIdForField(document.blocks, focus.fieldId);\n }\n return document.blocks.length > 0 ? document.blocks[document.blocks.length - 1]!.id : null;\n}\n","export const DOCUMENT2_WIDGET_CSS = `\n.butex-document2-widget {\n --butex-document2-bg: var(--butex-bg, #f8fafc);\n --butex-document2-fg: var(--butex-fg, #0f172a);\n --butex-document2-muted: var(--butex-muted, #64748b);\n --butex-document2-panel: var(--butex-panel, #ffffff);\n --butex-document2-border: var(--butex-border, #e2e8f0);\n --butex-document2-accent: var(--butex-accent, #0d9488);\n --butex-document2-accent-bg: var(--butex-toolbar-hover-bg, rgba(13, 148, 136, 0.08));\n --butex-document2-focus-shadow: var(--butex-focus-shadow, rgba(13, 148, 136, 0.16));\n --butex-document2-danger: var(--butex-danger, #dc2626);\n --butex-document2-error: var(--butex-error, #b91c1c);\n --butex-document2-error-bg: var(--butex-error-bg, #fef2f2);\n --butex-document2-preview-bg: var(--butex-preview-bg, #ffffff);\n --butex-document2-preview-fg: var(--butex-preview-fg, var(--butex-document2-fg));\n --butex-document2-preview-font: \"Amiri\", \"Noto Serif Arabic\", Georgia, \"Times New Roman\", serif;\n --butex-document2-drawer-bg: var(--butex-document2-panel);\n --butex-document2-input-bg: #ffffff;\n --butex-document2-raw-bg: #f8fafc;\n --butex-document2-math-bg: var(--butex-document2-accent-bg);\n --butex-document2-math-border: rgba(13, 148, 136, 0.35);\n --butex-document2-text-token-bg: var(--butex-text-token-bg, color-mix(in srgb, var(--butex-document2-panel) 86%, var(--butex-document2-bg)));\n --butex-document2-text-token-border: var(--butex-text-token-border, color-mix(in srgb, var(--butex-document2-border) 86%, var(--butex-document2-muted)));\n --butex-document2-math-inline-bg: var(--butex-math-inline-bg, color-mix(in srgb, var(--butex-document2-accent) 10%, var(--butex-document2-panel)));\n --butex-document2-math-display-bg: var(--butex-math-display-bg, color-mix(in srgb, var(--butex-document2-accent) 7%, var(--butex-document2-bg)));\n --butex-document2-collapse-bg: var(--butex-collapse-bg, color-mix(in srgb, var(--butex-document2-muted) 8%, var(--butex-document2-panel)));\n --butex-document2-dev-bg: var(--butex-dev-bg, #fffbeb);\n --butex-document2-dev-border: var(--butex-dev-border, #fcd34d);\n --butex-document2-dev-code-bg: var(--butex-dev-inset-bg, #ffffff);\n --butex-document2-dev-code-fg: var(--butex-dev-inset-fg, var(--butex-document2-fg));\n box-sizing: border-box;\n color: var(--butex-document2-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-document2-widget *,\n.butex-document2-widget *::before,\n.butex-document2-widget *::after {\n box-sizing: inherit;\n}\n\n.butex-document2-widget__shell,\n.butex-document2-widget__editor-panel,\n.butex-document2-widget__blocks,\n.butex-document2-widget__dev,\n.butex-document2-widget__field {\n display: grid;\n gap: 10px;\n min-width: 0;\n}\n\n.butex-document2-widget__toolbar,\n.butex-document2-widget__panel,\n.butex-document2-widget__block,\n.butex-document2-widget__dev {\n background: var(--butex-document2-panel);\n border: 1px solid var(--butex-document2-border);\n border-radius: 12px;\n min-width: 0;\n padding: 12px;\n}\n\n.butex-document2-widget__toolbar {\n position: sticky;\n top: 0;\n z-index: 20;\n box-shadow: 0 4px 16px color-mix(in srgb, var(--butex-document2-fg) 6%, transparent);\n gap: 6px;\n}\n\n.butex-document2-widget__toolbar-insert {\n align-items: center;\n display: flex;\n flex: 1 1 auto;\n flex-wrap: wrap;\n gap: 6px;\n min-width: 0;\n}\n\n.butex-document2-widget__toolbar-group {\n align-items: center;\n border-inline-start: 1px solid color-mix(in srgb, var(--butex-document2-border) 75%, transparent);\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n padding-inline-start: 6px;\n}\n\n.butex-document2-widget__toolbar-group:first-child {\n border-inline-start: 0;\n padding-inline-start: 0;\n}\n\n.butex-document2-widget__icon-btn {\n align-items: center;\n background: var(--butex-document2-panel);\n border: 1px solid var(--butex-document2-border);\n border-radius: 8px;\n color: var(--butex-document2-fg);\n cursor: pointer;\n display: inline-flex;\n font-weight: 700;\n justify-content: center;\n line-height: 1;\n min-height: 30px;\n min-width: 30px;\n padding: 0 6px;\n}\n\n.butex-document2-widget__icon-btn:hover:not(:disabled),\n.butex-document2-widget__icon-btn[aria-pressed=\"true\"] {\n background: var(--butex-document2-accent-bg);\n border-color: var(--butex-document2-accent);\n}\n\n.butex-document2-widget__icon-btn:disabled {\n cursor: not-allowed;\n opacity: 0.45;\n}\n\n.butex-document2-widget__icon-btn--h1 {\n font-size: 1.15rem;\n}\n\n.butex-document2-widget__icon-btn--h2 {\n font-size: 1rem;\n}\n\n.butex-document2-widget__icon-btn--h3 {\n font-size: 0.88rem;\n}\n\n.butex-document2-widget__icon-math-inline {\n font-family: ui-monospace, Consolas, monospace;\n font-size: 0.78rem;\n font-weight: 600;\n}\n\n.butex-document2-widget__icon-math-display {\n font-size: 0.82rem;\n font-weight: 700;\n}\n\n.butex-document2-widget__icon-bibliography {\n display: inline-flex;\n line-height: 0;\n}\n\n.butex-document2-widget__icon-bibliography svg {\n display: block;\n}\n\n.butex-document2-widget__float-meta {\n display: grid;\n gap: 8px;\n margin-top: 8px;\n}\n\n.butex-document2-widget__float-meta--compact {\n gap: 4px;\n}\n\n.butex-document2-widget__float-meta-toggle {\n align-items: center;\n display: inline-flex;\n gap: 6px;\n font-size: 0.9rem;\n}\n\n.butex-document2-widget__preview-paragraph--centered {\n text-align: center;\n}\n\n.butex-document2-widget__labels-help {\n color: color-mix(in srgb, var(--butex-document2-fg) 72%, transparent);\n font-size: 0.9rem;\n margin: 0 0 10px;\n}\n\n.butex-document2-widget__preview-float {\n margin: 0.75rem 0;\n text-align: center;\n}\n\n.butex-document2-widget__preview-float figcaption {\n color: color-mix(in srgb, var(--butex-document2-fg) 80%, transparent);\n font-size: 0.92rem;\n margin-top: 0.4rem;\n text-align: center;\n}\n\n.butex-document2-widget__preview-float-number {\n font-weight: 600;\n}\n\n.butex-document2-widget__preview-ref {\n font-variant-numeric: tabular-nums;\n}\n\n.butex-document2-widget__ref-chip {\n border-style: dashed;\n}\n\n.butex-document2-widget__block-actions {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.butex-document2-widget button.butex-document2-widget__block-collapse {\n align-items: center;\n background: var(--butex-document2-collapse-bg);\n border-color: color-mix(in srgb, var(--butex-document2-border) 70%, var(--butex-document2-muted));\n display: inline-flex;\n font-weight: 800;\n justify-content: center;\n min-height: 26px;\n min-width: 26px;\n padding: 0;\n}\n\n.butex-document2-widget__math-chip-wrap {\n align-items: center;\n display: inline-flex;\n gap: 2px;\n}\n\n.butex-document2-widget__math-chip-wrap[data-display=\"true\"] {\n flex: 1 1 100%;\n justify-content: center;\n width: 100%;\n}\n\n.butex-document2-widget__math-chip-delete {\n background: transparent;\n border: 1px solid color-mix(in srgb, var(--butex-document2-danger) 35%, var(--butex-document2-border));\n border-radius: 6px;\n color: var(--butex-document2-danger);\n cursor: pointer;\n font-size: 0.85rem;\n line-height: 1;\n min-height: 24px;\n min-width: 24px;\n padding: 0;\n}\n\n.butex-document2-widget__table-cell {\n flex: 1 1 8rem;\n min-width: 8rem;\n}\n\n.butex-document2-widget__block--table .butex-document2-widget__inline-text {\n min-height: 3.5em;\n min-width: min(12ch, 100%);\n}\n\n.butex-document2-widget__table-popover {\n display: inline-block;\n position: relative;\n}\n\n.butex-document2-widget__table-popover-panel {\n background: var(--butex-document2-panel);\n border: 1px solid var(--butex-document2-border);\n border-radius: 10px;\n box-shadow: 0 8px 24px color-mix(in srgb, var(--butex-document2-fg) 12%, transparent);\n display: grid;\n gap: 8px;\n inset-inline-end: 0;\n padding: 10px;\n position: absolute;\n top: calc(100% + 6px);\n width: min(220px, 70vw);\n z-index: 30;\n}\n\n.butex-document2-widget__table-popover-panel label {\n color: var(--butex-document2-muted);\n display: grid;\n font-size: 0.82rem;\n gap: 4px;\n}\n\n.butex-document2-widget__toolbar-row {\n align-items: center;\n border-block-end: 1px solid color-mix(in srgb, var(--butex-document2-border) 70%, transparent);\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-block-end: 8px;\n padding-block-end: 8px;\n width: 100%;\n}\n\n.butex-document2-widget__toolbar-row:last-child {\n border-block-end: 0;\n margin-block-end: 0;\n padding-block-end: 0;\n}\n\n.butex-document2-widget__toolbar-label {\n color: var(--butex-document2-muted);\n font-size: 0.78rem;\n font-weight: 600;\n margin-inline-end: 4px;\n white-space: nowrap;\n}\n\n.butex-document2-widget__block-header {\n align-items: center;\n border-block-end: 1px solid color-mix(in srgb, var(--butex-document2-border) 80%, transparent);\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n justify-content: space-between;\n margin-block-end: 10px;\n padding-block-end: 8px;\n}\n\n.butex-document2-widget__block-select {\n accent-color: var(--butex-document2-accent);\n cursor: pointer;\n flex: 0 0 auto;\n height: 1rem;\n margin: 0;\n width: 1rem;\n}\n\n.butex-document2-widget__block--selected {\n background: var(--butex-document2-accent-bg);\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--butex-document2-accent) 45%, transparent);\n}\n\n.butex-document2-widget__selection-count {\n color: var(--butex-document2-muted);\n font-size: 0.78rem;\n font-weight: 600;\n padding-inline: 4px;\n white-space: nowrap;\n}\n\n.butex-document2-widget__block-title {\n align-items: center;\n color: var(--butex-document2-fg);\n display: inline-flex;\n gap: 8px;\n font-weight: 700;\n}\n\n.butex-document2-widget__block--section .butex-document2-widget__block-title {\n font-size: 1.12rem;\n}\n\n.butex-document2-widget__block--subsection .butex-document2-widget__block-title {\n font-size: 1.04rem;\n}\n\n.butex-document2-widget__block--subsubsection .butex-document2-widget__block-title {\n font-size: 0.98rem;\n}\n\n.butex-document2-widget__block--paragraph .butex-document2-widget__block-title {\n color: var(--butex-document2-muted);\n font-size: 0.86rem;\n font-weight: 600;\n}\n\n.butex-document2-widget__block--list .butex-document2-widget__block-title,\n.butex-document2-widget__block--table .butex-document2-widget__block-title,\n.butex-document2-widget__block--image .butex-document2-widget__block-title,\n.butex-document2-widget__block--raw .butex-document2-widget__block-title {\n font-size: 0.9rem;\n}\n\n.butex-document2-widget__block--section {\n background: color-mix(in srgb, var(--butex-document2-accent) 9%, var(--butex-document2-panel));\n border-inline-start: 4px solid var(--butex-document2-accent);\n}\n\n.butex-document2-widget__block--subsection {\n background: color-mix(in srgb, var(--butex-document2-accent) 6%, var(--butex-document2-panel));\n border-inline-start: 3px solid color-mix(in srgb, var(--butex-document2-accent) 78%, var(--butex-document2-border));\n}\n\n.butex-document2-widget__block--subsubsection {\n background: color-mix(in srgb, var(--butex-document2-accent) 4%, var(--butex-document2-panel));\n border-inline-start: 3px solid var(--butex-document2-border);\n}\n\n.butex-document2-widget__block--paragraph {\n border-inline-start: 2px solid color-mix(in srgb, var(--butex-document2-muted) 35%, transparent);\n}\n\n.butex-document2-widget__block--list {\n background: color-mix(in srgb, var(--butex-document2-bg) 55%, var(--butex-document2-panel));\n border-inline-start: 3px solid color-mix(in srgb, var(--butex-document2-accent) 55%, var(--butex-document2-border));\n}\n\n.butex-document2-widget__block--table {\n background: color-mix(in srgb, var(--butex-document2-bg) 40%, var(--butex-document2-panel));\n border-inline-start: 3px solid var(--butex-document2-border);\n}\n\n.butex-document2-widget__block--image {\n background: color-mix(in srgb, var(--butex-document2-muted) 6%, var(--butex-document2-panel));\n border-inline-start: 3px dashed color-mix(in srgb, var(--butex-document2-muted) 45%, var(--butex-document2-border));\n}\n\n.butex-document2-widget__block--raw {\n background: color-mix(in srgb, var(--butex-document2-muted) 8%, var(--butex-document2-panel));\n border-inline-start: 3px dashed var(--butex-document2-muted);\n}\n\n.butex-document2-widget__block--collapsed {\n background: var(--butex-document2-collapse-bg);\n}\n\n.butex-document2-widget__block--collapsed .butex-document2-widget__block-header {\n margin-block-end: 8px;\n}\n\n.butex-document2-widget__block-summary {\n background: color-mix(in srgb, var(--butex-document2-panel) 72%, transparent);\n border: 1px dashed color-mix(in srgb, var(--butex-document2-border) 70%, var(--butex-document2-muted));\n border-radius: 8px;\n color: var(--butex-document2-muted);\n font-size: 0.86rem;\n line-height: 1.5;\n min-width: 0;\n overflow-wrap: anywhere;\n padding: 8px 10px;\n}\n\n.butex-document2-widget__list-item-actions {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-block-start: 6px;\n}\n\n.butex-document2-widget__list-item-content {\n display: grid;\n gap: 8px;\n min-width: 0;\n}\n\n.butex-document2-widget__list-footer {\n border-block-start: 1px dashed color-mix(in srgb, var(--butex-document2-border) 85%, transparent);\n margin-block-start: 10px;\n padding-block-start: 10px;\n}\n\n.butex-document2-widget__button--danger:hover {\n border-color: var(--butex-document2-danger);\n color: var(--butex-document2-danger);\n}\n\n.butex-document2-widget__image-src-label {\n color: var(--butex-document2-muted);\n display: block;\n font-size: 0.82rem;\n margin-block-end: 4px;\n}\n\n.butex-document2-widget__toolbar,\n.butex-document2-widget__row {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.butex-document2-widget button {\n background: var(--butex-document2-panel);\n border: 1px solid var(--butex-document2-border);\n border-radius: 8px;\n color: var(--butex-document2-fg);\n cursor: pointer;\n min-height: 32px;\n padding: 0 10px;\n}\n\n.butex-document2-widget button:hover,\n.butex-document2-widget button[aria-pressed=\"true\"] {\n background: var(--butex-document2-accent-bg);\n border-color: var(--butex-document2-accent);\n}\n\n.butex-document2-widget button:focus-visible,\n.butex-document2-widget input:focus-visible,\n.butex-document2-widget textarea:focus-visible {\n border-color: var(--butex-document2-accent);\n box-shadow: 0 0 0 3px var(--butex-document2-focus-shadow);\n outline: none;\n}\n\n.butex-document2-widget input {\n background: var(--butex-document2-input-bg);\n border: 1px solid var(--butex-document2-border);\n border-radius: 8px;\n color: var(--butex-document2-fg);\n font: inherit;\n min-height: 34px;\n padding: 7px 9px;\n}\n\n.butex-document2-widget textarea {\n background: var(--butex-document2-input-bg);\n border: 1px solid var(--butex-document2-border);\n border-radius: 8px;\n color: var(--butex-document2-fg);\n font: inherit;\n line-height: 1.45;\n padding: 7px 9px;\n}\n\n.butex-document2-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-document2-widget__layout--editor-open.butex-document2-widget__layout--preview-open {\n grid-template-columns: minmax(0, 1fr) minmax(280px, 0.9fr);\n}\n\n/* One visible panel: a single track so the panel fills the widget (previewOnly / hide editor / hide preview). */\n.butex-document2-widget__layout--editor-open.butex-document2-widget__layout--preview-closed,\n.butex-document2-widget__layout--editor-closed.butex-document2-widget__layout--preview-open,\n.butex-document2-widget__layout--editor-closed.butex-document2-widget__layout--preview-closed {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.butex-document2-widget__editor-panel,\n.butex-document2-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/* When previewOnly (or display:none) leaves a lone panel, span the full grid. */\n.butex-document2-widget__editor-panel:only-child,\n.butex-document2-widget__preview-panel:only-child {\n grid-column: 1 / -1;\n width: 100%;\n}\n\n.butex-document2-widget__layout--editor-closed .butex-document2-widget__editor-panel,\n.butex-document2-widget__layout--preview-closed .butex-document2-widget__preview-panel {\n display: none;\n}\n\n.butex-document2-widget__inline-field {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n max-width: 100%;\n min-width: 0;\n width: 100%;\n}\n\n.butex-document2-widget__inline-text {\n background: var(--butex-document2-text-token-bg);\n border-color: var(--butex-document2-text-token-border);\n box-sizing: border-box;\n flex: 0 1 auto;\n max-width: 100%;\n min-height: 2.75em;\n min-width: 3ch;\n overflow-wrap: break-word;\n overflow-y: hidden;\n resize: none;\n text-align: start;\n white-space: pre-wrap;\n width: auto;\n word-break: break-word;\n}\n\n.butex-document2-widget__inline-text:hover {\n border-color: color-mix(in srgb, var(--butex-document2-text-token-border) 55%, var(--butex-document2-accent));\n}\n\n.butex-document2-widget__inline-field input {\n min-width: 12ch;\n}\n\n.butex-document2-widget__math-chip {\n background: var(--butex-document2-math-inline-bg);\n border-color: color-mix(in srgb, var(--butex-document2-math-border) 70%, var(--butex-document2-accent));\n border-width: 1.5px;\n direction: ltr;\n display: inline-flex;\n font-family: inherit;\n gap: 4px;\n max-width: 100%;\n min-height: 30px;\n overflow: visible;\n padding: 3px 7px;\n unicode-bidi: isolate;\n}\n\n.butex-document2-widget__math-chip:hover,\n.butex-document2-widget__math-chip:focus-visible {\n background: color-mix(in srgb, var(--butex-document2-accent) 12%, var(--butex-document2-panel));\n border-color: var(--butex-document2-accent);\n}\n\n.butex-document2-widget__math-chip[data-editable=\"false\"] {\n border-style: dashed;\n color: var(--butex-document2-muted);\n}\n\n.butex-document2-widget__math-chip[data-display=\"true\"] {\n background: var(--butex-document2-math-display-bg);\n border-color: color-mix(in srgb, var(--butex-document2-accent) 50%, var(--butex-document2-border));\n border-width: 1.5px;\n border-radius: 10px;\n box-shadow: 0 5px 16px color-mix(in srgb, var(--butex-document2-fg) 8%, transparent);\n justify-content: center;\n margin-block: 4px;\n min-height: 54px;\n padding: 10px 12px;\n width: min(100%, 36rem);\n}\n\n.butex-document2-widget__preview {\n background: var(--butex-document2-preview-bg);\n color: var(--butex-document2-preview-fg);\n font-family: var(--butex-document2-preview-font);\n font-size: 1.08rem;\n line-height: 1.9;\n max-width: 100%;\n min-width: 0;\n overflow-wrap: break-word;\n text-align: start;\n word-break: break-word;\n}\n\n.butex-document2-widget__preview h1,\n.butex-document2-widget__preview h2,\n.butex-document2-widget__preview h3,\n.butex-document2-widget__preview p,\n.butex-document2-widget__preview li {\n max-width: 100%;\n overflow-wrap: break-word;\n white-space: normal;\n word-break: break-word;\n}\n\n.butex-document2-widget__preview h1 {\n font-size: 1.75rem;\n font-weight: 700;\n line-height: 1.35;\n margin: 0 0 14px;\n}\n\n.butex-document2-widget__preview h2 {\n font-size: 1.4rem;\n font-weight: 600;\n line-height: 1.4;\n margin: 0 0 12px;\n}\n\n.butex-document2-widget__preview h3 {\n font-size: 1.2rem;\n font-weight: 600;\n line-height: 1.45;\n margin: 0 0 10px;\n}\n\n.butex-document2-widget__preview p {\n margin: 0 0 12px;\n}\n\n.butex-document2-widget__preview ul,\n.butex-document2-widget__preview ol {\n margin: 0 0 12px;\n padding-inline-start: 24px;\n}\n\n.butex-document2-widget__preview ul {\n list-style-type: disc;\n}\n\n.butex-document2-widget__preview ol {\n list-style-type: decimal;\n}\n\n.butex-document2-widget__preview img {\n display: block;\n height: auto;\n max-width: 100%;\n}\n\n.butex-document2-widget__preview table {\n border-collapse: collapse;\n border: 1px solid #000000;\n margin: 12px 0;\n max-width: 100%;\n table-layout: fixed;\n width: 100%;\n}\n\n.butex-document2-widget__preview td {\n border: 1px solid #000000;\n max-width: 100%;\n overflow-wrap: break-word;\n padding: 6px 8px;\n white-space: normal;\n word-break: break-word;\n}\n\n.butex-document2-widget__math-island {\n direction: ltr;\n display: inline-block;\n line-height: normal;\n margin: 0 2px;\n overflow: visible;\n unicode-bidi: isolate;\n vertical-align: middle;\n}\n\n/* Guard against host CSS resets (e.g. Tailwind Preflight's \\`svg { display: block }\\`).\n * MathJax v4 inline line-breaking emits an equation as several sibling <svg> chunks;\n * a block-level svg reset stacks them vertically inside the island. */\n.butex-document2-widget mjx-container svg {\n display: inline;\n}\n\n.butex-document2-widget__math-chip .butex-document2-widget__math-island {\n margin: 0;\n}\n\n.butex-document2-widget__math-island[data-render-state=\"loading\"] {\n opacity: 0.72;\n}\n\n.butex-document2-widget__math-island[data-render-state=\"error\"] {\n color: var(--butex-document2-error);\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n font-size: 0.88rem;\n max-width: 100%;\n overflow-wrap: anywhere;\n white-space: normal;\n}\n\n.butex-document2-widget__math-island[data-display=\"true\"] {\n display: block;\n margin: 10px 0;\n text-align: center;\n}\n\n.butex-document2-widget__math-chip .butex-document2-widget__math-island[data-display=\"true\"] {\n margin: 0;\n}\n\n.butex-document2-widget__raw {\n background: var(--butex-document2-raw-bg);\n border-radius: 8px;\n direction: ltr;\n padding: 8px;\n text-align: left;\n white-space: pre-wrap;\n}\n\n.butex-document2-widget__error {\n background: var(--butex-document2-error-bg);\n border: 1px solid var(--butex-document2-error);\n border-radius: 8px;\n color: var(--butex-document2-error);\n padding: 10px;\n}\n\n.butex-document2-widget__equation-modal {\n align-items: center;\n display: flex;\n inset: 0;\n justify-content: center;\n padding: 16px;\n position: fixed;\n z-index: 30;\n}\n\n.butex-document2-widget__equation-modal-backdrop {\n background: color-mix(in srgb, var(--butex-document2-fg) 34%, transparent);\n border: 0;\n cursor: pointer;\n display: block;\n height: 100%;\n inset: 0;\n margin: 0;\n padding: 0;\n position: absolute;\n width: 100%;\n}\n\n.butex-document2-widget__equation-modal-panel {\n background: var(--butex-document2-drawer-bg);\n border: 1px solid var(--butex-document2-border);\n border-radius: 12px;\n box-shadow: 0 18px 48px color-mix(in srgb, var(--butex-document2-fg) 18%, transparent);\n display: grid;\n gap: 12px;\n max-height: min(90vh, 900px);\n max-width: min(720px, 100%);\n overflow: auto;\n padding: 14px;\n position: relative;\n width: min(680px, 100%);\n z-index: 1;\n}\n\n/* Map document v2 tokens onto BuTeX equation editor chrome when embedded in this modal. */\n.butex-document2-widget__equation-modal-panel .butex-widget {\n --butex-bg: var(--butex-document2-bg);\n --butex-fg: var(--butex-document2-fg);\n --butex-muted: var(--butex-document2-muted);\n --butex-accent: var(--butex-document2-accent);\n --butex-accent-hover: color-mix(in srgb, var(--butex-document2-accent) 82%, #000000);\n --butex-toolbar-hover-bg: var(--butex-document2-accent-bg);\n --butex-toolbar-hover-border: var(--butex-document2-accent);\n --butex-danger: var(--butex-document2-danger);\n --butex-danger-bg: color-mix(in srgb, var(--butex-document2-danger) 12%, transparent);\n --butex-danger-border: color-mix(in srgb, var(--butex-document2-danger) 48%, transparent);\n --butex-on-accent: #ffffff;\n --butex-border: var(--butex-document2-border);\n --butex-panel: var(--butex-document2-panel);\n --butex-preview-bg: var(--butex-document2-preview-bg);\n --butex-preview-fg: var(--butex-document2-preview-fg);\n --butex-error: var(--butex-document2-error);\n --butex-error-bg: var(--butex-document2-error-bg);\n --butex-error-border: color-mix(in srgb, var(--butex-document2-error) 32%, var(--butex-document2-panel));\n --butex-shadow-md: 0 4px 14px color-mix(in srgb, var(--butex-document2-fg) 10%, transparent);\n --butex-dev-bg: var(--butex-document2-dev-bg);\n --butex-dev-border: var(--butex-document2-dev-border);\n --butex-dev-badge: var(--butex-dev-badge, #b45309);\n --butex-dev-badge-fg: var(--butex-dev-badge-fg, #ffffff);\n --butex-dev-muted: var(--butex-dev-muted, #92400e);\n --butex-dev-inset-bg: var(--butex-document2-dev-code-bg);\n --butex-dev-inset-border: color-mix(in srgb, var(--butex-document2-dev-border) 45%, transparent);\n --butex-dev-inset-fg: var(--butex-document2-dev-code-fg);\n --butex-surface-bg: linear-gradient(\n 180deg,\n var(--butex-document2-panel) 0%,\n color-mix(in srgb, var(--butex-document2-panel) 88%, var(--butex-document2-bg)) 100%\n );\n --butex-surface-fg: var(--butex-document2-fg);\n --butex-focus-border: color-mix(in srgb, var(--butex-document2-accent) 45%, transparent);\n --butex-focus-shadow: var(--butex-document2-focus-shadow);\n --butex-slot-hover: var(--butex-document2-accent-bg);\n --butex-selection-bg: color-mix(in srgb, var(--butex-document2-accent) 34%, transparent);\n --butex-selection-border: color-mix(in srgb, var(--butex-document2-accent) 90%, #0f172a);\n --butex-caret: var(--butex-document2-fg);\n --butex-node-hover: color-mix(in srgb, var(--butex-document2-muted) 14%, transparent);\n --butex-node-selected-bg: var(--butex-document2-accent-bg);\n --butex-node-selected-border: color-mix(in srgb, var(--butex-document2-accent) 45%, transparent);\n --butex-script-border: var(--butex-document2-border);\n --butex-script-bg: color-mix(in srgb, var(--butex-document2-bg) 35%, var(--butex-document2-panel));\n --butex-script-color: var(--butex-document2-muted);\n --butex-delim-color: var(--butex-document2-muted);\n --butex-frac-bar: currentColor;\n}\n\n.butex-document2-widget__dev {\n background: var(--butex-document2-dev-bg);\n border-color: var(--butex-document2-dev-border);\n}\n\n.butex-document2-widget__dev pre {\n background: var(--butex-document2-dev-code-bg);\n color: var(--butex-document2-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-document2-widget__dev-diagnostic {\n background: rgba(251, 191, 36, 0.18);\n border: 1px solid rgba(217, 119, 6, 0.4);\n border-radius: 8px;\n color: #92400e;\n margin: 0;\n padding: 8px 10px;\n}\n\n@media (max-width: 900px) {\n .butex-document2-widget__layout,\n .butex-document2-widget__layout--editor-open.butex-document2-widget__layout--preview-open,\n .butex-document2-widget__layout--editor-open.butex-document2-widget__layout--preview-closed,\n .butex-document2-widget__layout--editor-closed.butex-document2-widget__layout--preview-open,\n .butex-document2-widget__layout--editor-closed.butex-document2-widget__layout--preview-closed {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .butex-document2-widget__layout,\n .butex-document2-widget__editor-panel,\n .butex-document2-widget__preview-panel {\n transition: none;\n }\n}\n\n.butex-document2-widget__cite-chip-wrap {\n align-items: center;\n display: inline-flex;\n gap: 2px;\n margin-inline: 2px;\n max-width: 100%;\n vertical-align: baseline;\n}\n\n.butex-document2-widget__cite-chip {\n background: color-mix(in srgb, var(--butex-document2-accent) 8%, var(--butex-document2-panel));\n border: 1.5px solid color-mix(in srgb, var(--butex-document2-accent) 45%, var(--butex-document2-border));\n border-radius: 6px;\n color: inherit;\n cursor: pointer;\n display: inline-flex;\n font: inherit;\n font-variant-numeric: tabular-nums;\n line-height: 1.3;\n min-height: 28px;\n padding: 2px 8px;\n}\n\n.butex-document2-widget__cite-chip[data-editable=\"false\"] {\n border-style: dashed;\n cursor: default;\n}\n\n.butex-document2-widget__cite-chip:hover,\n.butex-document2-widget__cite-chip:focus-visible {\n background: color-mix(in srgb, var(--butex-document2-accent) 14%, var(--butex-document2-panel));\n border-color: var(--butex-document2-accent);\n}\n\n.butex-document2-widget__cite-chip-delete {\n background: transparent;\n border: none;\n color: var(--butex-document2-muted);\n cursor: pointer;\n font: inherit;\n line-height: 1;\n padding: 0 4px;\n}\n\n.butex-document2-widget__preview-cite {\n color: inherit;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n.butex-document2-widget__preview-bibliography,\n.butex-document2-widget__bibliography-editor {\n display: grid;\n gap: 0.5rem;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.butex-document2-widget__preview-bibliography li,\n.butex-document2-widget__bibliography-editor li {\n display: grid;\n gap: 0.25rem;\n grid-template-columns: auto 1fr;\n}\n\n.butex-document2-widget__preview-bib-number {\n font-variant-numeric: tabular-nums;\n}\n\n.butex-document2-widget__block--bibliography {\n border-color: color-mix(in srgb, var(--butex-document2-accent) 35%, var(--butex-document2-border));\n}\n\n.butex-document2-widget__digit-form-menu {\n position: relative;\n}\n\n.butex-document2-widget__digit-form-options {\n background: var(--butex-document2-panel);\n border: 1px solid var(--butex-document2-border);\n border-radius: 8px;\n box-shadow: 0 8px 24px color-mix(in srgb, #000 16%, transparent);\n display: grid;\n gap: 2px;\n inset-inline-start: 0;\n margin-top: 4px;\n padding: 4px;\n position: absolute;\n top: 100%;\n z-index: 5;\n}\n\n.butex-document2-widget__digit-form-option {\n background: transparent;\n border: none;\n border-radius: 6px;\n color: inherit;\n cursor: pointer;\n font: inherit;\n padding: 6px 10px;\n text-align: start;\n}\n\n.butex-document2-widget__digit-form-option[aria-selected=\"true\"],\n.butex-document2-widget__digit-form-option:hover {\n background: color-mix(in srgb, var(--butex-document2-accent) 12%, var(--butex-document2-panel));\n}\n\n.butex-document2-widget__cite-picker-backdrop,\n.butex-document2-widget__refs-backdrop {\n align-items: center;\n background: color-mix(in srgb, #000 35%, transparent);\n display: flex;\n inset: 0;\n justify-content: center;\n padding: 1rem;\n position: fixed;\n z-index: 40;\n}\n\n.butex-document2-widget__cite-picker,\n.butex-document2-widget__refs-panel {\n background: var(--butex-document2-panel);\n border: 1px solid var(--butex-document2-border);\n border-radius: 12px;\n box-shadow: 0 16px 40px color-mix(in srgb, #000 22%, transparent);\n display: grid;\n gap: 0.75rem;\n max-height: min(80vh, 640px);\n max-width: 560px;\n overflow: auto;\n padding: 1rem;\n width: min(100%, 560px);\n}\n\n.butex-document2-widget__cite-picker-header,\n.butex-document2-widget__refs-header,\n.butex-document2-widget__cite-picker-footer,\n.butex-document2-widget__refs-item-head {\n align-items: center;\n display: flex;\n gap: 0.5rem;\n justify-content: space-between;\n}\n\n.butex-document2-widget__cite-picker-list,\n.butex-document2-widget__refs-list {\n display: grid;\n gap: 0.5rem;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.butex-document2-widget__cite-picker-item,\n.butex-document2-widget__refs-field {\n display: grid;\n gap: 0.25rem;\n}\n\n.butex-document2-widget__cite-picker-item {\n align-items: start;\n grid-template-columns: auto 1fr;\n}\n\n.butex-document2-widget__cite-picker-meta,\n.butex-document2-widget__cite-picker-empty {\n color: var(--butex-document2-muted);\n display: block;\n font-size: 0.92em;\n}\n\n.butex-document2-widget__refs-grid {\n display: grid;\n gap: 0.5rem;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n}\n\n.butex-document2-widget__refs-field input {\n background: var(--butex-document2-input-bg, var(--butex-document2-panel));\n border: 1px solid var(--butex-document2-border);\n border-radius: 6px;\n color: inherit;\n font: inherit;\n padding: 0.4rem 0.55rem;\n width: 100%;\n}\n\n.butex-document2-widget__refs-item {\n border: 1px solid var(--butex-document2-border);\n border-radius: 10px;\n display: grid;\n gap: 0.5rem;\n padding: 0.75rem;\n}\n\n.butex-document2-widget__refs-item-actions {\n display: inline-flex;\n gap: 0.25rem;\n}\n\n.butex-document2-widget__primary-btn {\n background: var(--butex-document2-accent);\n border: none;\n border-radius: 8px;\n color: #fff;\n cursor: pointer;\n font: inherit;\n padding: 0.45rem 0.8rem;\n}\n\n.butex-document2-widget__primary-btn:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.butex-document2-widget__article-meta {\n background: color-mix(in srgb, var(--butex-document2-panel) 92%, var(--butex-document2-accent-bg));\n border: 1px solid var(--butex-document2-border);\n border-radius: 10px;\n display: grid;\n gap: 0.75rem;\n margin-bottom: 0.85rem;\n padding: 0.85rem 0.9rem;\n}\n\n.butex-document2-widget__article-meta-header {\n align-items: center;\n display: flex;\n gap: 0.5rem;\n justify-content: space-between;\n}\n\n.butex-document2-widget__article-meta-badge {\n background: var(--butex-document2-accent-bg);\n border: 1px solid color-mix(in srgb, var(--butex-document2-accent) 35%, var(--butex-document2-border));\n border-radius: 999px;\n color: var(--butex-document2-accent);\n font-size: 0.78rem;\n font-weight: 600;\n padding: 0.15rem 0.55rem;\n}\n\n.butex-document2-widget__article-meta-date-preview {\n color: color-mix(in srgb, var(--butex-document2-fg) 70%, transparent);\n font-size: 0.92rem;\n margin: 0.15rem 0 0;\n}\n\n.butex-document2-widget__article-meta-fixed {\n color: color-mix(in srgb, var(--butex-document2-fg) 78%, transparent);\n font-size: 0.95rem;\n line-height: 1.7;\n margin: 0;\n text-align: center;\n}\n\n.butex-document2-widget__article-meta-grid {\n display: grid;\n gap: 0.65rem;\n}\n\n.butex-document2-widget__article-meta-field {\n display: grid;\n gap: 0.3rem;\n font-size: 0.92rem;\n}\n\n.butex-document2-widget__article-meta-field input,\n.butex-document2-widget__article-meta-field textarea {\n background: var(--butex-document2-input-bg, var(--butex-document2-panel));\n border: 1px solid var(--butex-document2-border);\n border-radius: 6px;\n color: inherit;\n font: inherit;\n padding: 0.4rem 0.55rem;\n width: 100%;\n}\n\n.butex-document2-widget__article-meta-date {\n display: grid;\n gap: 0.45rem;\n grid-template-columns: minmax(4rem, 1fr) minmax(7rem, 2fr) minmax(5rem, 1.2fr);\n}\n\n.butex-document2-widget__hijri-menu {\n position: relative;\n}\n\n.butex-document2-widget__hijri-menu-trigger {\n appearance: none;\n background-color: var(--butex-document2-input-bg, var(--butex-document2-panel));\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%236b7280' d='M1.2 1.3L6 6.1l4.8-4.8 1.2 1.2L6 8.5 0 2.5z'/%3E%3C/svg%3E\");\n background-position: left 0.65rem center;\n background-repeat: no-repeat;\n background-size: 0.7rem;\n border: 1px solid var(--butex-document2-border);\n border-radius: 8px;\n color: inherit;\n cursor: pointer;\n font: inherit;\n min-height: 2.35rem;\n padding: 0.45rem 0.7rem 0.45rem 1.7rem;\n text-align: start;\n transition: border-color 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease;\n width: 100%;\n}\n\n.butex-document2-widget[dir=\"rtl\"] .butex-document2-widget__hijri-menu-trigger {\n background-position: right 0.65rem center;\n padding: 0.45rem 1.7rem 0.45rem 0.7rem;\n}\n\n.butex-document2-widget__hijri-menu-trigger:hover,\n.butex-document2-widget__hijri-menu-trigger[aria-expanded=\"true\"] {\n background-color: color-mix(in srgb, var(--butex-document2-accent-bg) 55%, var(--butex-document2-panel));\n border-color: color-mix(in srgb, var(--butex-document2-accent) 45%, var(--butex-document2-border));\n}\n\n.butex-document2-widget__hijri-menu-trigger:focus-visible {\n border-color: var(--butex-document2-accent);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--butex-document2-accent) 28%, transparent);\n outline: none;\n}\n\n.butex-document2-widget__hijri-menu-list {\n background: var(--butex-document2-panel);\n border: 1px solid var(--butex-document2-border);\n border-radius: 10px;\n box-shadow: 0 12px 28px color-mix(in srgb, #000 18%, transparent);\n inset-inline-start: 0;\n list-style: none;\n margin: 0.3rem 0 0;\n max-height: 14rem;\n overflow-x: hidden;\n overflow-y: auto;\n padding: 0.35rem;\n position: absolute;\n scrollbar-color: color-mix(in srgb, var(--butex-document2-muted) 55%, transparent) transparent;\n scrollbar-width: thin;\n top: 100%;\n width: 100%;\n z-index: 12;\n}\n\n.butex-document2-widget__hijri-menu-list::-webkit-scrollbar {\n width: 0.55rem;\n}\n\n.butex-document2-widget__hijri-menu-list::-webkit-scrollbar-track {\n background: transparent;\n margin: 0.35rem 0;\n}\n\n.butex-document2-widget__hijri-menu-list::-webkit-scrollbar-thumb {\n background: color-mix(in srgb, var(--butex-document2-muted) 45%, transparent);\n border: 2px solid transparent;\n border-radius: 999px;\n background-clip: padding-box;\n}\n\n.butex-document2-widget__hijri-menu-list::-webkit-scrollbar-thumb:hover {\n background: color-mix(in srgb, var(--butex-document2-accent) 55%, var(--butex-document2-muted));\n background-clip: padding-box;\n border: 2px solid transparent;\n}\n\n.butex-document2-widget__hijri-menu-option {\n background: transparent;\n border: none;\n border-radius: 7px;\n color: inherit;\n cursor: pointer;\n display: block;\n font: inherit;\n padding: 0.45rem 0.65rem;\n text-align: start;\n width: 100%;\n}\n\n.butex-document2-widget__hijri-menu-option:hover,\n.butex-document2-widget__hijri-menu-option[aria-selected=\"true\"] {\n background: color-mix(in srgb, var(--butex-document2-accent) 14%, var(--butex-document2-panel));\n}\n\n.butex-document2-widget__hijri-menu-option:focus-visible {\n outline: 2px solid color-mix(in srgb, var(--butex-document2-accent) 55%, transparent);\n outline-offset: -2px;\n}\n\n.butex-document2-widget__visually-hidden {\n border: 0;\n clip: rect(0, 0, 0, 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n\n.butex-document2-widget__preview-basmala,\n.butex-document2-widget__preview-closing {\n margin: 0.35rem 0 0.85rem;\n}\n\n.butex-document2-widget__preview-basmala .butex-document2-widget__math-island[data-display=\"true\"],\n.butex-document2-widget__preview-closing .butex-document2-widget__math-island[data-display=\"true\"] {\n margin: 0;\n}\n\n.butex-document2-widget__preview-title-block {\n background: color-mix(in srgb, var(--butex-document2-accent-bg) 55%, transparent);\n border: 1px solid color-mix(in srgb, var(--butex-document2-border) 75%, transparent);\n border-radius: 10px;\n margin: 0.5rem 0 1rem;\n padding: 0.85rem 1rem;\n text-align: center;\n}\n\n.butex-document2-widget__preview-article-title {\n font-size: 1.45rem;\n font-weight: 700;\n line-height: 1.35;\n margin: 0 0 0.45rem;\n}\n\n.butex-document2-widget__preview-article-authors,\n.butex-document2-widget__preview-article-date {\n margin: 0.2rem 0;\n}\n\n.butex-document2-widget__preview-article-date {\n color: color-mix(in srgb, var(--butex-document2-fg) 72%, transparent);\n font-size: 0.95rem;\n}\n\n.butex-document2-widget__preview-abstract {\n background: color-mix(in srgb, var(--butex-document2-panel) 88%, var(--butex-document2-muted));\n border: 1px dashed color-mix(in srgb, var(--butex-document2-border) 85%, transparent);\n border-radius: 8px;\n margin: 0.75rem 0 1rem;\n padding: 0.75rem 0.9rem;\n}\n\n.butex-document2-widget__preview-abstract-label {\n font-size: 1rem;\n font-weight: 700;\n margin: 0 0 0.35rem;\n}\n\n.butex-document2-widget__preview-abstract p {\n margin: 0;\n}\n\n.butex-document2-widget__preview-empty-body {\n color: var(--butex-document2-muted);\n font-style: italic;\n text-align: center;\n}\n`;\n\nexport function injectBuTeXDocument2Styles(doc?: Document): void {\n const d = doc ?? (typeof document !== 'undefined' ? document : undefined);\n if (!d) {\n return;\n }\n\n const id = 'butex-document2-widget-styles';\n if (d.getElementById(id)) {\n return;\n }\n\n const style = d.createElement('style');\n style.id = id;\n style.textContent = DOCUMENT2_WIDGET_CSS;\n d.head.appendChild(style);\n}\n"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBA4WhB,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKxB,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKvB,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBA2H/B,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAOvB,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAmD/B,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoWtC,KAAK;AAEP,IAAM,kBAAkB;AAEjB,SAAS,sBAAsB,KAAsB;AAC1D,QAAM,IAAI,QAAQ,OAAO,aAAa,cAAc,WAAW;AAC/D,MAAI,CAAC,KAAK,EAAE,eAAe,eAAe,GAAG;AAC3C;AAAA,EACF;AACA,QAAM,QAAQ,EAAE,cAAc,OAAO;AACrC,QAAM,KAAK;AACX,QAAM,cAAc;AACpB,IAAE,KAAK,YAAY,KAAK;AAC1B;;;ADzwBI,SAkgBkB,YAAAC,WAjgBhB,OAAAC,OADF,QAAAC,cAAA;AA9FJ,IAAM,qBAAgE;AAAA,EACpE,EAAE,IAAI,WAAW,OAAO,MAAM;AAAA,EAC9B,EAAE,IAAI,eAAe,OAAO,qBAAM;AAAA,EAClC,EAAE,IAAI,gBAAgB,OAAO,qBAAM;AACrC;AACA,IAAM,yBAAwE;AAAA,EAC5E,EAAE,IAAI,WAAW,OAAO,SAAI;AAAA,EAC5B,EAAE,IAAI,WAAW,OAAO,eAAK;AAAA,EAC7B,EAAE,IAAI,UAAU,OAAO,qBAAM;AAAA,EAC7B,EAAE,IAAI,iBAAiB,OAAO,eAAK;AACrC;AACA,IAAM,oBAAoB,yBAAyB,UAAU;AAC7D,IAAM,yBAAyB,yBAAyB,eAAe;AACvE,IAAM,qBAAqB,yBAAyB,WAAW;AAC/D,IAAM,sBAAsB,yBAAyB,YAAY;AACjE,IAAM,iBAAiB,yBAAyB,QAAQ;AACxD,IAAM,mBAAmB,yBAAyB,SAAS,EAAE,OAAO,oBAAoB;AACxF,IAAM,oBAAoB,iCAAiC,YAAY;AACvE,IAAM,qBAAqB,iCAAiC,YAAY;AACxE,IAAM,qBAAqB,iCAAiC,YAAY;AACxE,IAAM,eAAe,iCAAiC,MAAM;AAC5D,IAAM,oBAAoB,iCAAiC,WAAW;AACtE,IAAM,gBAA8D;AAAA,EAClE,EAAE,IAAI,UAAU,OAAO,SAAI;AAAA,EAC3B,EAAE,IAAI,WAAW,OAAO,WAAM;AAAA,EAC9B,EAAE,IAAI,WAAW,OAAO,WAAM;AAAA,EAC9B,EAAE,IAAI,WAAW,OAAO,WAAM;AAAA,EAC9B,EAAE,IAAI,WAAW,OAAO,WAAM;AAAA,EAC9B,EAAE,IAAI,WAAW,OAAO,aAAQ;AAClC;AAEA,IAAM,mBAAsD;AAAA,EAC1D,EAAE,IAAI,IAAI;AAAA,EACV,EAAE,IAAI,IAAI;AAAA,EACV,EAAE,IAAI,IAAI;AACZ;AAEA,SAAS,gBAAgB,MAAc,SAAiB,UAA0C;AAChG,SAAO,GAAG,OAAO,IAAI,CAAC,IAAI,SAAS,GAAG,SAAM,OAAO,OAAO,CAAC,IAAI,SAAS,MAAM;AAChF;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,CAAC,CAAC;AACpD;AAEA,SAASC,gBAAe,WAAgC;AACtD,SAAO,mBAAmB,KAAK,CAAC,WAAW,OAAO,OAAO,SAAS,GAAG,SAAS;AAChF;AAEA,SAAS,oBAAoB,QAAiE;AAC5F,SAAO,uBAAuB,KAAK,CAAC,WAAW,OAAO,OAAO,MAAM,KAAK,uBAAuB,CAAC;AAClG;AAEA,SAAS,mBAAmB,QAAyB,UAA0C;AAC7F,MAAI,WAAW,UAAW,QAAO,SAAS;AAC1C,MAAI,WAAW,SAAU,QAAO,SAAS;AACzC,MAAI,WAAW,gBAAiB,QAAO,SAAS;AAChD,SAAO,SAAS;AAClB;AAEA,SAAS,eAAe,WAAwB,UAA0C;AACxF,MAAI,cAAc,cAAe,QAAO,SAAS;AACjD,MAAI,cAAc,eAAgB,QAAO,SAAS;AAClD,SAAO,SAAS;AAClB;AAEA,SAAS,iBAAiB,OAAuB,UAA0C;AACzF,MAAI,UAAU,UAAW,QAAO,SAAS;AACzC,MAAI,UAAU,UAAW,QAAO,SAAS;AACzC,MAAI,UAAU,UAAW,QAAO,SAAS;AACzC,MAAI,UAAU,UAAW,QAAO,SAAS;AACzC,MAAI,UAAU,UAAW,QAAO,SAAS;AACzC,SAAO,SAAS;AAClB;AAEA,SAAS,cAAc,WAA+B,UAAoE;AACxH,MAAI,cAAc,IAAK,QAAO,EAAE,OAAO,SAAS,WAAW,OAAO,SAAS,gBAAgB;AAC3F,MAAI,cAAc,IAAK,QAAO,EAAE,OAAO,SAAS,YAAY,OAAO,SAAS,iBAAiB;AAC7F,SAAO,EAAE,OAAO,SAAS,aAAa,OAAO,SAAS,kBAAkB;AAC1E;AAEA,SAAS,aAAa,MAA0B,MAA0B;AACxE,QAAM,iBAAiB,KAAK,QAAQ,cAAc;AAClD,MAAI,gBAAgB;AAClB,WAAO,SAAS,WAAW,WAAM;AAAA,EACnC;AACA,SAAO,SAAS,WAAW,WAAM;AACnC;AAEA,SAAS,yBAAyB,SAAuC;AACvE,MAAI,QAAQ,OAAO,MAAM;AACvB,WAAO,QAAQ;AAAA,EACjB;AACA,SACE,gBAAAD,OAAC,UAAK,WAAU,mCAAkC,eAAY,QAC5D;AAAA,oBAAAD,MAAC,UAAK,WAAU,yCAAyC,kBAAQ,aAAY;AAAA,IAC7E,gBAAAA,MAAC,UAAK,WAAU,wCAAuC,0BAAE;AAAA,KAC3D;AAEJ;AAEA,SAAS,2BAA2B,SAA+C;AACjF,MAAI,CAAC,QAAQ,UAAU;AACrB,WAAO,QAAQ;AAAA,EACjB;AACA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,OAAO;AAAA,QACL,MAAM,QAAQ,QAAQ,QAAQ;AAAA,QAC9B,YAAY,QAAQ,QAAQ,QAAQ;AAAA,MACtC;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,8BAA8B,SAAgD,UAA6B;AAClH,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,SACE,gBAAAA,MAAC,UAAK,WAAW,4BAA4B,OAAO,IAAI,0DAA0D,0BAC/G,qCAA2B,OAAO,GACrC;AAEJ;AAEA,SAAS,gBAAgB,SAAwB,UAA0C;AACzF,QAAM,UAAU,QAAQ,eAAe,WAAW,QAAQ,cAAc,QAAQ;AAChF,QAAM,QACJ,QAAQ,eAAe,WACnB,SAAS,kBACT,SAAS;AACf,QAAM,QACJ,QAAQ,eAAe,WACnB,mBAAmB,OAAO,IAC1B,kBAAkB,OAAO;AAC/B,SAAO,GAAG,KAAK;AAAA;AAAA,EAAO,SAAS,SAAS,KAAK;AAC/C;AAEO,IAAM,cAAc;AAAA,EACzB,SAASG,aAAY,EAAE,WAAW,QAAQ,OAAO,aAAa,WAAW,MAAM,gBAAgB,gBAAgB,GAAG,KAAK;AACrH,UAAM,WAAW,uBAAuB,QAAQ;AAChD,UAAM,aAAaC,QAA8B,IAAI;AACrD,UAAM,aAAaA,QAA8B,IAAI;AACrD,UAAM,gBAAgBA,QAA8B,IAAI;AACxD,UAAM,iBAAiBA,QAA8B,IAAI;AACzD,UAAM,gBAAgBA,QAA8B,IAAI;AACxD,UAAM,oBAAoBA,QAA8B,IAAI;AAC5D,UAAM,cAAcA,QAA8B,IAAI;AAEtD,UAAM,aAAaA,QAAiC,IAAI;AACxD,UAAM,aAAaA,QAAiC,IAAI;AACxD,UAAM,aAAaA,QAAiC,IAAI;AACxD,UAAM,YAAYA,QAAiC,IAAI;AACvD,UAAM,oBAAoBA,QAAiC,IAAI;AAC/D,UAAM,sBAAsBA,QAAiC,IAAI;AACjE,UAAM,kBAAkBA,QAAiC,IAAI;AAE7D,UAAM,aAAaA,QAAgC,IAAI;AACvD,UAAM,WAAWA,QAAO,KAAK;AAC7B,aAAS,UAAU;AACnB,UAAM,cAAcA,QAAO,QAAQ;AACnC,gBAAY,UAAU;AAEtB,UAAM,qBAAqBA,QAAO,eAAe;AACjD,uBAAmB,UAAU;AAE7B,UAAM,qBAAqBA,QAAO,KAAK;AACvC,UAAM,CAAC,iBAAiB,kBAAkB,IAAIC,UAAS,KAAK;AAC5D,uBAAmB,UAAU;AAC7B,UAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,KAAK;AACxD,UAAM,CAAC,uBAAuB,wBAAwB,IAAIA,UAAS,KAAK;AACxE,UAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,KAAK;AAChE,UAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,KAAK;AAC1D,UAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,KAAK;AAC5D,UAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,KAAK;AAC9D,UAAM,CAAC,sBAAsB,uBAAuB,IAAIA,UAAS,KAAK;AACtE,UAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,KAAK;AAChE,UAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAS,KAAK;AAClE,UAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,KAAK;AACxD,UAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,KAAK;AAC9D,UAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,KAAK;AAChE,UAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,KAAK;AAChE,UAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,UAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,KAAK;AAC9D,UAAM,CAACC,oBAAmB,oBAAoB,IAAID,UAAsB,SAAS;AACjF,UAAM,CAAC,uBAAuB,wBAAwB,IAAIA,UAA0B,SAAS;AAC7F,UAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAqB,QAAQ;AAC7E,UAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAyB,QAAQ;AAC7E,UAAM,CAAC,aAAa,cAAc,IAAIA,UAAyB,SAAS;AACxE,UAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,CAAC;AAC9C,UAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,CAAC;AACpD,UAAM,CAAC,aAAa,cAAc,IAAIA,UAAmD,IAAI;AAC7F,UAAM,CAAC,sBAAsB,uBAAuB,IAAIA,UAAS,CAAC;AAElE,wBAAoB,KAAK,OAAO;AAAA,MAC9B,YAAY,MAAM,WAAW;AAAA,IAC/B,EAAE;AAEF,UAAM,gBAAgB,YAAY,OAAO,YAA2B;AAClE,YAAM,eAAe,cAAc;AACnC,YAAM,gBAAgB,eAAe;AACrC,YAAM,eAAe,cAAc;AACnC,YAAM,mBAAmB,kBAAkB;AAC3C,YAAM,aAAa,YAAY;AAE/B,YAAM,UAAU,8BAA8B,OAAO;AACrD,YAAM,SAAS,6BAA6B,OAAO;AACnD,YAAM,cAAc,QAAQ,eAAe,WAAW,SAAS;AAE/D,UAAI,SAAS,WAAW,cAAc;AACpC,cAAM,kBAAkB,uBAAuB,YAAY,OAAO;AAClE,qBAAa,cAAc,GAAG,gBAAgB,YAAY;AAAA,EAAM,WAAW,gBAAgB,KAAK;AAAA;AAAA,EAAO,gBAAgB,WAAW;AAAA,EAAM,UAAU,gBAAgB,KAAK;AAAA,MACzK;AACA,UAAI,SAAS,WAAW,kBAAkB;AACxC,yBAAiB,cAAc,gBAAgB,SAAS,uBAAuB,YAAY,OAAO,CAAC;AACnG,yBAAiB,UAAU,OAAO,gBAAgB,QAAQ,eAAe,QAAQ;AAAA,MACnF;AACA,UAAI,SAAS,WAAW,YAAY;AAClC,cAAM,QAAQ,QAAQ,SAAS,IAAI,CAAC,UAAU,KAAK,UAAU,KAAK,CAAC;AACnE,mBAAW,cAAc,MAAM,KAAK,IAAI;AACxC,mBAAW,SAAS,mBAAmB;AAAA,MACzC;AAEA,UAAI,CAAC,eAAe;AAClB;AAAA,MACF;AAEA,UAAI;AACF,YAAI,OAAO,WAAW,eAAe,cAAc;AACjD,gBAAM,KAAM,OAAyE;AACrF,gBAAM,gBACJ,IAAI,WAAW,QAAQ,IAAI,kBAAkB,OAAO,QAAQ;AAC9D,gBAAM,OAAO,MAAM,sBAAsB,eAAe,QAAQ,EAAE,SAAS,MAAM,QAAQ,cAAc,CAAC;AACxG,uBAAa,gBAAgB,IAAI;AACjC,cAAI,kBAAkB,OAAO;AAC3B,yCAA6B,YAAY;AAAA,UAC3C;AAAA,QACF;AACA,sBAAc,SAAS;AACvB,sBAAc,cAAc;AAAA,MAC9B,SAAS,KAAK;AACZ,cAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,sBAAc,SAAS;AACvB,sBAAc,cAAc,GAAG,uBAAuB,YAAY,OAAO,EAAE,YAAY,KAAK,OAAO;AACnG,YAAI,WAAW,SAAS;AACtB,qBAAW,QAAQ,WAAW,eAAe,WAAW,QAAQ,WAAW,GAAG,OAAO,CAAC;AAAA,QACxF;AAAA,MACF;AAAA,IACF,GAAG,CAAC,CAAC;AAEL,UAAM,mBAAmBD,QAAO,aAAa;AAC7C,qBAAiB,UAAU;AAE3B,IAAAG,WAAU,MAAM;AACd,4BAAsB;AACtB,8BAAwB,OAAO,aAAa,cAAc,WAAW,MAAS;AAE9E,YAAM,YAAY,WAAW;AAC7B,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AAEA,YAAM,UAAU,oBAAoB;AAAA,QAClC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,UACd,SAAS,WAAW;AAAA,UACpB,SAAS,WAAW;AAAA,UACpB,SAAS,WAAW;AAAA,UACpB,QAAQ,UAAU;AAAA,UAClB,gBAAgB,kBAAkB;AAAA,UAClC,cAAc,gBAAgB;AAAA,QAChC;AAAA,QACA,+BAA+B,CAAC,0BAA0B,aAAa,YAAY,YAAY;AAAA,QAC/F,iBAAiB,CAAC,YAAY;AAC5B,+BAAqB,QAAQ,oBAAoB,SAAS;AAC1D,mCAAyB,QAAQ,wBAAwB,SAAS;AAClE,8BAAoB,QAAQ,UAAU;AACtC,6BAAmB,UAAU,OAAO;AACpC,eAAK,iBAAiB,QAAQ,OAAO,EAAE,MAAM,CAAC,QAAiB;AAC7D,kBAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,kBAAM,KAAK,eAAe;AAC1B,gBAAI,IAAI;AACN,iBAAG,SAAS;AACZ,iBAAG,cAAc,GAAG,uBAAuB,YAAY,OAAO,EAAE,YAAY,KAAK,OAAO;AAAA,YAC1F;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AACD,iBAAW,UAAU;AAErB,UAAI,OAAO,WAAW,eAAe,OAAO,SAAS,SAAS,SAAS;AACrE,eAAO,QAAQ,QAAQ,QACpB,KAAK,MAAM;AACV,kBAAQ,OAAO;AAAA,QACjB,CAAC,EACA,MAAM,CAAC,QAAiB;AACvB,gBAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,cAAI,WAAW,SAAS;AACtB,uBAAW,QAAQ,WAAW,eAAe,WAAW,QAAQ,WAAW,GAAG,OAAO,CAAC;AAAA,UACxF;AACA,kBAAQ,OAAO;AAAA,QACjB,CAAC;AAAA,MACL,OAAO;AACL,gBAAQ,OAAO;AAAA,MACjB;AAEA,gBAAU,MAAM;AAEhB,aAAO,MAAM;AACX,gBAAQ,QAAQ;AAChB,mBAAW,UAAU;AAAA,MACvB;AAAA,IACF,GAAG,CAAC,CAAC;AAEL,IAAAA,WAAU,MAAM;AACd,iBAAW,SAAS,YAAY,QAAQ;AACxC,YAAM,UAAU,WAAW,SAAS,WAAW;AAC/C,UAAI,SAAS;AACX,aAAK,iBAAiB,QAAQ,OAAO;AAAA,MACvC;AAAA,IACF,GAAG,CAAC,QAAQ,CAAC;AAEb,aAAS,eAAqB;AAC5B,iBAAW,SAAS,MAAM;AAAA,IAC5B;AAEA,aAAS,0BAA0B,MAAc,SAAuB;AACtE,UAAI,mBAAmB,SAAS;AAC9B,mBAAW,SAAS,eAAe,MAAM,OAAO;AAAA,MAClD,WAAW,mBAAmB,WAAW;AACvC,mBAAW,SAAS,iBAAiB,MAAM,OAAO;AAAA,MACpD,OAAO;AACL,mBAAW,SAAS,gBAAgB,aAAa,MAAM,OAAO;AAAA,MAChE;AAAA,IACF;AAEA,WACE,gBAAAP;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAW,gBAAgB,aAAa,EAAE,GAAG,KAAK;AAAA,QAClD,KAAK,kBAAkB,QAAQ;AAAA,QAC/B,MAAM;AAAA,QAEN,0BAAAC,OAAC,SAAI,WAAU,uBACb;AAAA,0BAAAA,OAAC,aAAQ,WAAU,SACjB;AAAA,4BAAAA,OAAC,SAAI,WAAU,WACb;AAAA,8BAAAA,OAAC,SAAI,WAAU,iCAAgC,MAAK,SAAQ,cAAY,SAAS,UAC/E;AAAA,gCAAAD,MAAC,YAAO,KAAK,YAAY,IAAG,YAAW,MAAK,UAAS,WAAU,YAAW,OAAO,SAAS,MAAM,cAAY,SAAS,MAAM,oBAE3H;AAAA,gBACA,gBAAAA,MAAC,YAAO,KAAK,YAAY,IAAG,YAAW,MAAK,UAAS,WAAU,YAAW,OAAO,SAAS,MAAM,cAAY,SAAS,MAAM,oBAE3H;AAAA,iBACF;AAAA,cACA,gBAAAC,OAAC,SAAI,WAAU,mCAAkC,MAAK,SAAQ,cAAY,SAAS,WACjF;AAAA,gCAAAD,MAAC,YAAO,KAAK,YAAY,IAAG,YAAW,MAAK,UAAS,WAAU,YAAW,OAAO,SAAS,MAAM,cAAY,SAAS,MAAM,UAAQ,MAAC,oBAEpI;AAAA,gBACA,gBAAAA,MAAC,YAAO,KAAK,WAAW,IAAG,WAAU,MAAK,UAAS,WAAU,YAAW,OAAO,SAAS,KAAK,cAAY,SAAS,KAAK,UAAQ,MAAC,oBAEhI;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAG;AAAA,oBACH,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,OAAO,SAAS;AAAA,oBAChB,cAAY,SAAS;AAAA,oBACrB,SAAS,MAAM;AACb,2BAAK,WAAW,SAAS,aAAa,EAAE,KAAK,MAAM;AACjD,qCAAa;AAAA,sBACf,CAAC;AAAA,oBACH;AAAA,oBACD;AAAA;AAAA,gBAED;AAAA,iBACF;AAAA,cACA,gBAAAA,MAAC,SAAI,WAAU,kCAAiC,MAAK,SAAQ,cAAY,SAAS,gBAClF,0BAAAA,MAAC,YAAO,WAAU,mBAAkB,MAAK,UAAS,OAAO,SAAS,YAAY,cAAY,SAAS,YAAY,SAAS,MAAM,WAAW,SAAS,WAAW,GAAG,oBAEhK,GACA;AAAA,cACA,gBAAAC,OAAC,SAAI,WAAU,oCAAmC,MAAK,SAAQ,cAAY,SAAS,YACpF;AAAA,gCAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,QAAQ,CAAC,UAAU;AACjB,4BAAM,YAAY,MAAM;AACxB,0BAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG;AAC5E,6CAAqB,KAAK;AAAA,sBAC5B;AAAA,oBACF;AAAA,oBAEA;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,OAAO,SAAS;AAAA,0BAChB,cAAY,SAAS;AAAA,0BACrB,iBAAc;AAAA,0BACd,iBAAe;AAAA,0BACf,SAAS,MAAM,qBAAqB,CAAC,SAAS,CAAC,IAAI;AAAA,0BACpD;AAAA;AAAA,sBAED;AAAA,sBACA,gBAAAC,OAAC,SAAI,WAAU,6BAA4B,MAAK,WAAU,cAAY,SAAS,kBAAkB,QAAQ,CAAC,mBACxG;AAAA,wCAAAD;AAAA,0BAAC;AAAA;AAAA,4BACC,WAAU;AAAA,4BACV,cAAW;AAAA,4BACX,MAAK;AAAA,4BACL,MAAK;AAAA,4BACL,OAAO,SAAS;AAAA,4BAChB,cAAY,SAAS;AAAA,4BACrB,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,4BAC7C,SAAS,MAAM;AACb,yCAAW,SAAS,sBAAsB,OAAO;AACjD,mDAAqB,KAAK;AAC1B,2CAAa;AAAA,4BACf;AAAA,4BACD;AAAA;AAAA,wBAED;AAAA,wBACA,gBAAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,WAAU;AAAA,4BACV,cAAW;AAAA,4BACX,MAAK;AAAA,4BACL,MAAK;AAAA,4BACL,OAAO,SAAS;AAAA,4BAChB,cAAY,SAAS;AAAA,4BACrB,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,4BAC7C,SAAS,MAAM;AACb,yCAAW,SAAS,sBAAsB,SAAS;AACnD,mDAAqB,KAAK;AAC1B,2CAAa;AAAA,4BACf;AAAA,4BACD;AAAA;AAAA,wBAED;AAAA,wBACA,gBAAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,WAAU;AAAA,4BACV,cAAW;AAAA,4BACX,MAAK;AAAA,4BACL,MAAK;AAAA,4BACL,OAAO,SAAS;AAAA,4BAChB,cAAY,SAAS;AAAA,4BACrB,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,4BAC7C,SAAS,MAAM;AACb,yCAAW,SAAS,sBAAsB,OAAO;AACjD,mDAAqB,KAAK;AAC1B,2CAAa;AAAA,4BACf;AAAA,4BAEC;AAAA;AAAA,wBACH;AAAA,yBACF;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAA,MAAC,YAAO,IAAG,eAAc,WAAU,0BAAyB,MAAK,UAAS,OAAO,SAAS,gBAAgB,cAAY,SAAS,gBAAgB,SAAS,MAAM;AAAE,6BAAW,SAAS,eAAe;AAAG,+BAAa;AAAA,gBAAG,GACpN,0BAAAC,OAAC,UAAK,WAAU,qBAAoB,eAAY,QAAO;AAAA,kCAAAD,MAAC,UAAK,oBAAC;AAAA,kBAAO,gBAAAA,MAAC,UAAK,oBAAC;AAAA,mBAAO,GACrF;AAAA,gBACA,gBAAAA,MAAC,YAAO,IAAG,eAAc,WAAU,YAAW,MAAK,UAAS,OAAO,SAAS,YAAY,cAAY,SAAS,YAAY,SAAS,MAAM;AAAE,6BAAW,SAAS,WAAW;AAAG,+BAAa;AAAA,gBAAG,GAC1L,0BAAAA,MAAC,UAAK,WAAU,qBAAoB,eAAY,QAAO,oBAAC,GAC1D;AAAA,iBACA;AAAA,cACA,gBAAAA,MAAC,SAAI,WAAU,sCAAqC,MAAK,SAAQ,cAAY,SAAS,cACtF,0BAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,QAAQ,CAAC,UAAU;AACjB,0BAAM,YAAY,MAAM;AACxB,wBAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG;AAC5E,wCAAkB,KAAK;AAAA,oBACzB;AAAA,kBACF;AAAA,kBAEA;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,WAAU;AAAA,wBACV,MAAK;AAAA,wBACL,OAAO,SAAS;AAAA,wBAChB,cAAY,SAAS;AAAA,wBACrB,iBAAc;AAAA,wBACd,iBAAe;AAAA,wBACf,SAAS,MAAM,kBAAkB,CAAC,SAAS,CAAC,IAAI;AAAA,wBAEhD,0BAAAC,OAAC,UAAK,WAAU,uBAAsB,eAAY,QAAO;AAAA,0CAAAD,MAAC,UAAK;AAAA,0BAAE,gBAAAA,MAAC,UAAK;AAAA,0BAAE,gBAAAA,MAAC,UAAK;AAAA,0BAAE,gBAAAA,MAAC,UAAK;AAAA,2BAAE;AAAA;AAAA,oBAC3F;AAAA,oBACA,gBAAAC,OAAC,SAAI,WAAU,0BAAyB,MAAK,UAAS,cAAY,SAAS,mBAAmB,QAAQ,CAAC,gBACrG;AAAA,sCAAAD,MAAC,SAAI,WAAU,wBAAuB,MAAK,WAAU,cAAY,SAAS,iBACvE;AAAA,wBACC,EAAE,IAAI,UAAmB,OAAO,SAAS,OAAO;AAAA,wBAChD,EAAE,IAAI,SAAkB,OAAO,SAAS,MAAM;AAAA,wBAC9C,EAAE,IAAI,WAAoB,OAAO,SAAS,QAAQ;AAAA,sBACpD,EAAE,IAAI,CAAC,WACL,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,iBAAe,mBAAmB,OAAO;AAAA,0BACzC,WAAU;AAAA,0BACV,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,0BAC7C,SAAS,MAAM;AACb,8CAAkB,OAAO,EAAE;AAC3B,gCAAI,OAAO,OAAO,WAAW;AAC3B,+CAAiB,CAAC;AAAA,4BACpB;AAAA,0BACF;AAAA,0BAEC,iBAAO;AAAA;AAAA,wBAbH,OAAO;AAAA,sBAcd,CACD,GACH;AAAA,sBACC,mBAAmB,WAClB,gBAAAA,MAAC,SAAI,WAAU,wBAAuB,MAAK,WAAU,cAAY,SAAS,YACvE,wBAAc,IAAI,CAAC,UACpB,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,iBAAe,gBAAgB,MAAM;AAAA,0BACrC,WAAU;AAAA,0BACV,OAAO,iBAAiB,MAAM,IAAI,QAAQ;AAAA,0BAC1C,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,0BAC7C,SAAS,MAAM;AACb,2CAAe,MAAM,EAAE;AAAA,0BACzB;AAAA,0BAEC,gBAAM;AAAA;AAAA,wBAXF,MAAM;AAAA,sBAYb,CACC,GACH,IACE;AAAA,sBACJ,gBAAAA,MAAC,SAAI,WAAU,uBACZ,wBAAc,gBAAgB,YAAY,MAAM,YAAY,SAAS,QAAQ,IAAI,gBAAgB,YAAY,eAAe,QAAQ,GACvI;AAAA,sBACA,gBAAAA,MAAC,SAAI,WAAU,sBAAqB,cAAY,SAAS,uBACtD,gBAAM;AAAA,wBAAK,EAAE,QAAQ,EAAE;AAAA,wBAAG,CAAC,GAAG,aAC7B,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAACQ,IAAG,gBAAgB;AAC5C,gCAAM,OAAO,WAAW;AACxB,gCAAM,UAAU,cAAc;AAC9B,gCAAM,aAAa,aAAa,QAAQ;AACxC,gCAAM,gBAAgB,aAAa,WAAW;AAC9C,iCACE,gBAAAR;AAAA,4BAAC;AAAA;AAAA,8BAEC,MAAK;AAAA,8BACL,WAAW,QAAQ,cAAc,WAAW,gBAAgB,4BAA4B;AAAA,8BACxF,OAAO,gBAAgB,MAAM,SAAS,QAAQ;AAAA,8BAC9C,cAAY,gBAAgB,MAAM,SAAS,QAAQ;AAAA,8BACnD,cAAc,MAAM,eAAe,EAAE,MAAM,QAAQ,CAAC;AAAA,8BACpD,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,8BAC7C,SAAS,MAAM;AACb,8CAAc,IAAI;AAClB,iDAAiB,OAAO;AACxB,0DAA0B,MAAM,OAAO;AACvC,kDAAkB,KAAK;AACvB,+CAAe,IAAI;AACnB,6CAAa;AAAA,8BACf;AAAA;AAAA,4BAdK,GAAG,IAAI,IAAI,OAAO;AAAA,0BAezB;AAAA,wBAEJ,CAAC;AAAA,sBACH,GACF;AAAA,sBACA,gBAAAC,OAAC,SAAI,WAAU,sBACb;AAAA,wCAAAA,OAAC,WACE;AAAA,mCAAS;AAAA,0BACV,gBAAAD;AAAA,4BAAC;AAAA;AAAA,8BACC,MAAK;AAAA,8BACL,KAAK;AAAA,8BACL,KAAK;AAAA,8BACL,OAAO;AAAA,8BACP,UAAU,CAAC,UAAU,cAAc,gBAAgB,OAAO,MAAM,cAAc,KAAK,KAAK,CAAC,CAAC;AAAA;AAAA,0BAC5F;AAAA,2BACF;AAAA,wBACA,gBAAAC,OAAC,WACE;AAAA,mCAAS;AAAA,0BACV,gBAAAD;AAAA,4BAAC;AAAA;AAAA,8BACC,MAAK;AAAA,8BACL,KAAK;AAAA,8BACL,KAAK;AAAA,8BACL,OAAO;AAAA,8BACP,UAAU,CAAC,UAAU,iBAAiB,gBAAgB,OAAO,MAAM,cAAc,KAAK,KAAK,CAAC,CAAC;AAAA;AAAA,0BAC/F;AAAA,2BACF;AAAA,wBACA,gBAAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,MAAK;AAAA,4BACL,WAAU;AAAA,4BACV,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,4BAC7C,SAAS,MAAM;AACb,oCAAM,OAAO,gBAAgB,UAAU;AACvC,oCAAM,UAAU,gBAAgB,aAAa;AAC7C,wDAA0B,MAAM,OAAO;AACvC,gDAAkB,KAAK;AACvB,6CAAe,IAAI;AACnB,2CAAa;AAAA,4BACf;AAAA,4BAEC,mBAAS;AAAA;AAAA,wBACZ;AAAA,yBACF;AAAA,sBACA,gBAAAC,OAAC,SAAI,WAAU,uBAAsB,cAAY,SAAS,yBACvD;AAAA,2CAAmB,WAClB,gBAAAD,MAAC,YAAO,MAAK,UAAS,OAAO,SAAS,0BAA0B,aAAa,CAAC,UAAU,MAAM,eAAe,GAAG,SAAS,MAAM,WAAW,SAAS,kBAAkB,WAAW,GAC7K,mBAAS,YACZ,IACE;AAAA,wBACH,mBAAmB,UAClB,gBAAAC,OAAAF,WAAA,EACE;AAAA,0CAAAE,OAAC,WACE;AAAA,qCAAS;AAAA,4BACV,gBAAAD;AAAA,8BAAC;AAAA;AAAA,gCACC,MAAK;AAAA,gCACL,KAAK;AAAA,gCACL,KAAK;AAAA,gCACL,OAAO;AAAA,gCACP,UAAU,CAAC,UAAU,wBAAwB,gBAAgB,OAAO,MAAM,cAAc,KAAK,KAAK,CAAC,CAAC;AAAA;AAAA,4BACtG;AAAA,6BACF;AAAA,0BACC,iBAAiB,IAAI,CAAC,cACrB,gBAAAA;AAAA,4BAAC;AAAA;AAAA,8BAEC,MAAK;AAAA,8BACL,OAAO,cAAc,UAAU,IAAI,QAAQ,EAAE;AAAA,8BAC7C,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,8BAC7C,SAAS,MAAM,WAAW,SAAS,wBAAwB,uBAAuB,GAAG,UAAU,EAAE;AAAA,8BAEhG,wBAAc,UAAU,IAAI,QAAQ,EAAE;AAAA;AAAA,4BANlC,UAAU;AAAA,0BAOjB,CACD;AAAA,2BACH,IACE;AAAA,wBACJ,gBAAAC,OAAC,YAAO,MAAK,UAAS,OAAO,SAAS,QAAQ,aAAa,CAAC,UAAU,MAAM,eAAe,GAAG,SAAS,MAAM,WAAW,SAAS,aAAa,GAAG;AAAA;AAAA,0BAC7I,SAAS;AAAA,2BACb;AAAA,wBACA,gBAAAA,OAAC,YAAO,MAAK,UAAS,OAAO,SAAS,WAAW,aAAa,CAAC,UAAU,MAAM,eAAe,GAAG,SAAS,MAAM,WAAW,SAAS,gBAAgB,GAAG;AAAA;AAAA,0BACnJ,SAAS;AAAA,2BACb;AAAA,wBACA,gBAAAA,OAAC,YAAO,MAAK,UAAS,OAAO,SAAS,WAAW,aAAa,CAAC,UAAU,MAAM,eAAe,GAAG,SAAS,MAAM,WAAW,SAAS,gBAAgB,GAAG;AAAA;AAAA,0BACnJ,SAAS;AAAA,2BACb;AAAA,wBACA,gBAAAA,OAAC,YAAO,MAAK,UAAS,OAAO,SAAS,cAAc,aAAa,CAAC,UAAU,MAAM,eAAe,GAAG,SAAS,MAAM,WAAW,SAAS,mBAAmB,GAAG;AAAA;AAAA,0BACzJ,SAAS;AAAA,2BACb;AAAA,yBACF;AAAA,uBACF;AAAA;AAAA;AAAA,cACF,GACA;AAAA,cACA,gBAAAD,MAAC,SAAI,WAAU,kCAAiC,MAAK,SAAQ,cAAY,SAAS,QAClF,0BAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,8CAA8C,gBAAgB;AAAA,kBACzE,QAAQ,CAAC,UAAU;AACjB,0BAAM,YAAY,MAAM;AACxB,wBAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG;AAC5E,yCAAmB,KAAK;AAAA,oBAC1B;AAAA,kBACF;AAAA,kBAEA;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,WAAU;AAAA,wBACV,MAAK;AAAA,wBACL,OAAO,SAAS;AAAA,wBAChB,cAAY,SAAS;AAAA,wBACrB,iBAAc;AAAA,wBACd,iBAAe;AAAA,wBACf,SAAS,MAAM,mBAAmB,CAAC,SAAS,CAAC,IAAI;AAAA,wBAEjD,0BAAAC,OAAC,UAAK,WAAU,wFAAuF,eAAY,QACjH;AAAA,0CAAAD,MAAC,UAAK,WAAU,8BAA6B;AAAA,0BAC7C,gBAAAA,MAAC,UAAK,WAAU,gCAAgC,+BAAqB,WAAW,WAAM,UAAI;AAAA,2BAC5F;AAAA;AAAA,oBACF;AAAA,oBACA,gBAAAA,MAAC,SAAI,WAAU,2BAA0B,MAAK,WAAU,cAAY,SAAS,aAAa,QAAQ,CAAC,iBAChG,2BAAiB,IAAI,CAAC,YACrB,gBAAAC;AAAA,sBAAC;AAAA;AAAA,wBAEC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,WAAW,kDAAkD,QAAQ,QAAQ,SAAS;AAAA,wBACtF,OAAO,mBAAmB,SAAS,QAAQ;AAAA,wBAC3C,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,wBAC7C,SAAS,MAAM;AACb,qCAAW,SAAS,oBAAoB,QAAQ,EAAE;AAClD,6CAAmB,KAAK;AACxB,uCAAa;AAAA,wBACf;AAAA,wBAEA;AAAA,0CAAAA,OAAC,UAAK,WAAW,gDAAgD,QAAQ,QAAQ,SAAS,iCAAiC,OAAO,QAAQ,QAAQ,KAAK,CAAC,IAAI,eAAY,QACrK;AAAA,oCAAQ,QAAQ,cAAc,aAAa,gBAAAD,MAAC,UAAK,WAAU,gCAAgC,uBAAa,SAAS,gBAAgB,GAAE,IAAU;AAAA,4BAC9I,gBAAAA,MAAC,UAAK,WAAU,8BAA6B;AAAA,4BAC5C,QAAQ,QAAQ,cAAc,aAAa,gBAAAA,MAAC,UAAK,WAAU,gCAAgC,uBAAa,SAAS,gBAAgB,GAAE,IAAU;AAAA,6BAChJ;AAAA,0BACA,gBAAAA,MAAC,UAAK,WAAU,gCAAgC,6BAAmB,SAAS,QAAQ,GAAE;AAAA;AAAA;AAAA,sBAjBjF,QAAQ;AAAA,oBAkBf,CACD,GACH;AAAA;AAAA;AAAA,cACF,GACA;AAAA,cACA,gBAAAC,OAAC,SAAI,WAAU,mCAAkC,MAAK,SAAQ,cAAY,SAAS,WACnF;AAAA,gCAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,QAAQ,CAAC,UAAU;AACjB,4BAAM,YAAY,MAAM;AACxB,0BAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG;AAC5E,4CAAoB,KAAK;AAAA,sBAC3B;AAAA,oBACF;AAAA,oBAEA;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,OAAO,SAAS;AAAA,0BAChB,cAAY,SAAS;AAAA,0BACrB,iBAAc;AAAA,0BACd,iBAAe;AAAA,0BACf,SAAS,MAAM,oBAAoB,CAAC,SAAS,CAAC,IAAI;AAAA,0BAEjD,4BAAkB,CAAC,GAAG,eAAe;AAAA;AAAA,sBACxC;AAAA,sBACA,gBAAAA,MAAC,SAAI,WAAU,4BAA2B,MAAK,WAAU,cAAY,SAAS,gBAAgB,QAAQ,CAAC,kBACpG,4BAAkB,IAAI,CAAC,YACtB,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,OAAO,mBAAmB,SAAS,QAAQ;AAAA,0BAC3C,cAAY,mBAAmB,SAAS,QAAQ;AAAA,0BAChD,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,0BAC7C,SAAS,MAAM;AACb,uCAAW,SAAS,oBAAoB,QAAQ,EAAE;AAClD,gDAAoB,KAAK;AACzB,yCAAa;AAAA,0BACf;AAAA,0BAEC,kBAAQ;AAAA;AAAA,wBAbJ,QAAQ;AAAA,sBAcf,CACD,GACH;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,QAAQ,CAAC,UAAU;AACjB,4BAAM,YAAY,MAAM;AACxB,0BAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG;AAC5E,gDAAwB,KAAK;AAAA,sBAC/B;AAAA,oBACF;AAAA,oBAEA;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,OAAO,SAAS;AAAA,0BAChB,cAAY,SAAS;AAAA,0BACrB,iBAAc;AAAA,0BACd,iBAAe;AAAA,0BACf,SAAS,MAAM,wBAAwB,CAAC,SAAS,CAAC,IAAI;AAAA,0BAErD,iCAAuB,CAAC,GAAG,eAAe;AAAA;AAAA,sBAC7C;AAAA,sBACA,gBAAAA,MAAC,SAAI,WAAU,4BAA2B,MAAK,WAAU,cAAY,SAAS,oBAAoB,QAAQ,CAAC,sBACxG,iCAAuB,IAAI,CAAC,YAC3B,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,OAAO,mBAAmB,SAAS,QAAQ;AAAA,0BAC3C,cAAY,mBAAmB,SAAS,QAAQ;AAAA,0BAChD,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,0BAC7C,SAAS,MAAM;AACb,uCAAW,SAAS,oBAAoB,QAAQ,EAAE;AAClD,oDAAwB,KAAK;AAC7B,yCAAa;AAAA,0BACf;AAAA,0BAEC,kBAAQ;AAAA;AAAA,wBAbJ,QAAQ;AAAA,sBAcf,CACD,GACH;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,QAAQ,CAAC,UAAU;AACjB,4BAAM,YAAY,MAAM;AACxB,0BAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG;AAC5E,6CAAqB,KAAK;AAAA,sBAC5B;AAAA,oBACF;AAAA,oBAEA;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,OAAO,SAAS;AAAA,0BAChB,cAAY,SAAS;AAAA,0BACrB,iBAAc;AAAA,0BACd,iBAAe;AAAA,0BACf,SAAS,MAAM,qBAAqB,CAAC,SAAS,CAAC,IAAI;AAAA,0BAElD,6BAAmB,CAAC,GAAG,eAAe;AAAA;AAAA,sBACzC;AAAA,sBACA,gBAAAA,MAAC,SAAI,WAAU,4BAA2B,MAAK,WAAU,cAAY,SAAS,2BAA2B,QAAQ,CAAC,mBAC/G,6BAAmB,IAAI,CAAC,YACvB,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,OAAO,mBAAmB,SAAS,QAAQ;AAAA,0BAC3C,cAAY,mBAAmB,SAAS,QAAQ;AAAA,0BAChD,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,0BAC7C,SAAS,MAAM;AACb,uCAAW,SAAS,oBAAoB,QAAQ,EAAE;AAClD,iDAAqB,KAAK;AAC1B,yCAAa;AAAA,0BACf;AAAA,0BAEC,mCAAyB,OAAO;AAAA;AAAA,wBAb5B,QAAQ;AAAA,sBAcf,CACD,GACH;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,QAAQ,CAAC,UAAU;AACjB,4BAAM,YAAY,MAAM;AACxB,0BAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG;AAC5E,8CAAsB,KAAK;AAAA,sBAC7B;AAAA,oBACF;AAAA,oBAEA;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,OAAO,SAAS;AAAA,0BAChB,cAAY,SAAS;AAAA,0BACrB,iBAAc;AAAA,0BACd,iBAAe;AAAA,0BACf,SAAS,MAAM,sBAAsB,CAAC,SAAS,CAAC,IAAI;AAAA,0BAEnD,8BAAoB,CAAC,GAAG,eAAe;AAAA;AAAA,sBAC1C;AAAA,sBACA,gBAAAC,OAAC,SAAI,WAAU,4BAA2B,MAAK,WAAU,cAAY,SAAS,kBAAkB,QAAQ,CAAC,oBACtG;AAAA,4CAAoB,IAAI,CAAC,YACxB,gBAAAD;AAAA,0BAAC;AAAA;AAAA,4BAEC,WAAU;AAAA,4BACV,MAAK;AAAA,4BACL,MAAK;AAAA,4BACL,OAAO,mBAAmB,SAAS,QAAQ;AAAA,4BAC3C,cAAY,mBAAmB,SAAS,QAAQ;AAAA,4BAChD,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,4BAC7C,SAAS,MAAM;AACb,yCAAW,SAAS,oBAAoB,QAAQ,EAAE;AAClD,oDAAsB,KAAK;AAC3B,2CAAa;AAAA,4BACf;AAAA,4BAEC,kBAAQ;AAAA;AAAA,0BAbJ,QAAQ;AAAA,wBAcf,CACD;AAAA,wBACD,gBAAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,WAAU;AAAA,4BACV,MAAK;AAAA,4BACL,MAAK;AAAA,4BACL,OAAO,SAAS;AAAA,4BAChB,cAAY,SAAS;AAAA,4BACrB,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,4BAC7C,SAAS,MAAM;AACb,yCAAW,SAAS,sBAAsB;AAC1C,oDAAsB,KAAK;AAC3B,2CAAa;AAAA,4BACf;AAAA,4BACD;AAAA;AAAA,wBAED;AAAA,wBACA,gBAAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,WAAU;AAAA,4BACV,MAAK;AAAA,4BACL,MAAK;AAAA,4BACL,OAAO,SAAS;AAAA,4BAChB,cAAY,SAAS;AAAA,4BACrB,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,4BAC7C,SAAS,MAAM;AACb,yCAAW,SAAS,uBAAuB;AAC3C,oDAAsB,KAAK;AAC3B,2CAAa;AAAA,4BACf;AAAA,4BACD;AAAA;AAAA,wBAED;AAAA,yBACF;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,QAAQ,CAAC,UAAU;AACjB,4BAAM,YAAY,MAAM;AACxB,0BAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG;AAC5E,yCAAiB,KAAK;AAAA,sBACxB;AAAA,oBACF;AAAA,oBAEA;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,OAAO,SAAS;AAAA,0BAChB,cAAY,SAAS;AAAA,0BACrB,iBAAc;AAAA,0BACd,iBAAe;AAAA,0BACf,SAAS,MAAM,iBAAiB,CAAC,SAAS,CAAC,IAAI;AAAA,0BAE9C,yBAAe,CAAC,GAAG,eAAe;AAAA;AAAA,sBACrC;AAAA,sBACA,gBAAAA,MAAC,SAAI,WAAU,4BAA2B,MAAK,WAAU,cAAY,SAAS,kBAAkB,QAAQ,CAAC,eACtG,yBAAe,IAAI,CAAC,YACnB,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,OAAO,mBAAmB,SAAS,QAAQ;AAAA,0BAC3C,cAAY,mBAAmB,SAAS,QAAQ;AAAA,0BAChD,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,0BAC7C,SAAS,MAAM;AACb,uCAAW,SAAS,oBAAoB,QAAQ,EAAE;AAClD,6CAAiB,KAAK;AACtB,yCAAa;AAAA,0BACf;AAAA,0BAEC,kBAAQ;AAAA;AAAA,wBAbJ,QAAQ;AAAA,sBAcf,CACD,GACH;AAAA;AAAA;AAAA,gBACF;AAAA,iBACA;AAAA,cACA,gBAAAC,OAAC,SAAI,WAAU,mCAAkC,MAAK,SAAQ,cAAY,SAAS,YACnF;AAAA,gCAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,QAAQ,CAAC,UAAU;AACjB,4BAAM,YAAY,MAAM;AACxB,0BAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG;AAC5E,4CAAoB,KAAK;AAAA,sBAC3B;AAAA,oBACF;AAAA,oBAEA;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,OAAO,SAAS;AAAA,0BAChB,cAAY,SAAS;AAAA,0BACrB,iBAAc;AAAA,0BACd,iBAAe;AAAA,0BACf,SAAS,MAAM,oBAAoB,CAAC,SAAS,CAAC,IAAI;AAAA,0BAEjD,wCAA8B,kBAAkB,CAAC,GAAG,QAAG;AAAA;AAAA,sBAC1D;AAAA,sBACA,gBAAAA,MAAC,SAAI,WAAU,qDAAoD,MAAK,WAAU,cAAY,SAAS,iBAAiB,QAAQ,CAAC,kBAC9H,4BAAkB,IAAI,CAAC,YACtB,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,OAAO,2BAA2B,SAAS,QAAQ;AAAA,0BACnD,cAAY,2BAA2B,SAAS,QAAQ;AAAA,0BACxD,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,0BAC7C,SAAS,MAAM;AACb,uCAAW,SAAS,4BAA4B,QAAQ,EAAE;AAC1D,gDAAoB,KAAK;AACzB,yCAAa;AAAA,0BACf;AAAA,0BAEA,0BAAAA,MAAC,UAAK,WAAW,4BAA4B,OAAO,IAAI,0DAA0D,0BAC/G,qCAA2B,OAAO,GACrC;AAAA;AAAA,wBAfK,QAAQ;AAAA,sBAgBf,CACD,GACH;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,QAAQ,CAAC,UAAU;AACjB,4BAAM,YAAY,MAAM;AACxB,0BAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG;AAC5E,6CAAqB,KAAK;AAAA,sBAC5B;AAAA,oBACF;AAAA,oBAEA;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,OAAO,SAAS;AAAA,0BAChB,cAAY,SAAS;AAAA,0BACrB,iBAAc;AAAA,0BACd,iBAAe;AAAA,0BACf,SAAS,MAAM,qBAAqB,CAAC,SAAS,CAAC,IAAI;AAAA,0BACpD;AAAA;AAAA,sBAED;AAAA,sBACA,gBAAAA,MAAC,SAAI,WAAU,qDAAoD,MAAK,WAAU,cAAY,SAAS,qBAAqB,QAAQ,CAAC,mBAClI,6BAAmB,IAAI,CAAC,YACvB,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,OAAO,2BAA2B,SAAS,QAAQ;AAAA,0BACnD,cAAY,2BAA2B,SAAS,QAAQ;AAAA,0BACxD,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,0BAC7C,SAAS,MAAM;AACb,uCAAW,SAAS,4BAA4B,QAAQ,EAAE;AAC1D,iDAAqB,KAAK;AAC1B,yCAAa;AAAA,0BACf;AAAA,0BAEA,0BAAAA,MAAC,UAAK,WAAW,4BAA4B,OAAO,IAAI,0DAA0D,0BAC/G,qCAA2B,OAAO,GACrC;AAAA;AAAA,wBAfK,QAAQ;AAAA,sBAgBf,CACD,GACH;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,QAAQ,CAAC,UAAU;AACjB,4BAAM,YAAY,MAAM;AACxB,0BAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG;AAC5E,6CAAqB,KAAK;AAAA,sBAC5B;AAAA,oBACF;AAAA,oBAEA;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,OAAO,SAAS;AAAA,0BAChB,cAAY,SAAS;AAAA,0BACrB,iBAAc;AAAA,0BACd,iBAAe;AAAA,0BACf,SAAS,MAAM,qBAAqB,CAAC,SAAS,CAAC,IAAI;AAAA,0BAElD,wCAA8B,mBAAmB,CAAC,GAAG,QAAG;AAAA;AAAA,sBAC3D;AAAA,sBACA,gBAAAA,MAAC,SAAI,WAAU,qDAAoD,MAAK,WAAU,cAAY,SAAS,cAAc,QAAQ,CAAC,mBAC3H,6BAAmB,IAAI,CAAC,YACvB,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,OAAO,2BAA2B,SAAS,QAAQ;AAAA,0BACnD,cAAY,2BAA2B,SAAS,QAAQ;AAAA,0BACxD,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,0BAC7C,SAAS,MAAM;AACb,uCAAW,SAAS,4BAA4B,QAAQ,EAAE;AAC1D,iDAAqB,KAAK;AAC1B,yCAAa;AAAA,0BACf;AAAA,0BAEA,0BAAAA,MAAC,UAAK,WAAW,4BAA4B,OAAO,IAAI,0DAA0D,0BAC/G,qCAA2B,OAAO,GACrC;AAAA;AAAA,wBAfK,QAAQ;AAAA,sBAgBf,CACD,GACH;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,QAAQ,CAAC,UAAU;AACjB,4BAAM,YAAY,MAAM;AACxB,0BAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG;AAC5E,uCAAe,KAAK;AAAA,sBACtB;AAAA,oBACF;AAAA,oBAEA;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,OAAO,SAAS;AAAA,0BAChB,cAAY,SAAS;AAAA,0BACrB,iBAAc;AAAA,0BACd,iBAAe;AAAA,0BACf,SAAS,MAAM,eAAe,CAAC,SAAS,CAAC,IAAI;AAAA,0BAE5C,wCAA8B,aAAa,CAAC,GAAG,QAAG;AAAA;AAAA,sBACrD;AAAA,sBACA,gBAAAA,MAAC,SAAI,WAAU,qDAAoD,MAAK,WAAU,cAAY,SAAS,YAAY,QAAQ,CAAC,aACzH,uBAAa,IAAI,CAAC,YACjB,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,OAAO,2BAA2B,SAAS,QAAQ;AAAA,0BACnD,cAAY,2BAA2B,SAAS,QAAQ;AAAA,0BACxD,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,0BAC7C,SAAS,MAAM;AACb,uCAAW,SAAS,4BAA4B,QAAQ,EAAE;AAC1D,2CAAe,KAAK;AACpB,yCAAa;AAAA,0BACf;AAAA,0BAEA,0BAAAA,MAAC,UAAK,WAAW,4BAA4B,OAAO,IAAI,0DAA0D,0BAC/G,qCAA2B,OAAO,GACrC;AAAA;AAAA,wBAfK,QAAQ;AAAA,sBAgBf,CACD,GACH;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,QAAQ,CAAC,UAAU;AACjB,4BAAM,YAAY,MAAM;AACxB,0BAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG;AAC5E,4CAAoB,KAAK;AAAA,sBAC3B;AAAA,oBACF;AAAA,oBAEA;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,OAAO,SAAS;AAAA,0BAChB,cAAY,SAAS;AAAA,0BACrB,iBAAc;AAAA,0BACd,iBAAe;AAAA,0BACf,SAAS,MAAM,oBAAoB,CAAC,SAAS,CAAC,IAAI;AAAA,0BAEjD,wCAA8B,kBAAkB,CAAC,GAAG,QAAG;AAAA;AAAA,sBAC1D;AAAA,sBACA,gBAAAA,MAAC,SAAI,WAAU,qDAAoD,MAAK,WAAU,cAAY,SAAS,iBAAiB,QAAQ,CAAC,kBAC9H,4BAAkB,IAAI,CAAC,YACtB,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,OAAO,2BAA2B,SAAS,QAAQ;AAAA,0BACnD,cAAY,2BAA2B,SAAS,QAAQ;AAAA,0BACxD,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,0BAC7C,SAAS,MAAM;AACb,uCAAW,SAAS,4BAA4B,QAAQ,EAAE;AAC1D,gDAAoB,KAAK;AACzB,yCAAa;AAAA,0BACf;AAAA,0BAEA,0BAAAA,MAAC,UAAK,WAAW,4BAA4B,OAAO,IAAI,0DAA0D,0BAC/G,qCAA2B,OAAO,GACrC;AAAA;AAAA,wBAfK,QAAQ;AAAA,sBAgBf,CACD,GACH;AAAA;AAAA;AAAA,gBACF;AAAA,iBACA;AAAA,cACA,gBAAAC,OAAC,SAAI,WAAU,iCAAgC,MAAK,SAAQ,cAAY,SAAS,SAC/E;AAAA,gCAAAD,MAAC,YAAO,WAAU,4BAA2B,MAAK,UAAS,OAAO,SAAS,gBAAgB,cAAY,SAAS,gBAAgB,SAAS,MAAM,WAAW,SAAS,OAAO,GACxK,0BAAAC,OAAC,UAAK,WAAU,gDAA+C,eAAY,QAAO;AAAA,kCAAAD,MAAC,UAAK,oBAAC;AAAA,kBAAO,gBAAAA,MAAC,UAAK,oBAAC;AAAA,mBAAO,GAChH;AAAA,gBACA,gBAAAA,MAAC,YAAO,WAAU,4BAA2B,MAAK,UAAS,OAAO,SAAS,cAAc,cAAY,SAAS,cAAc,SAAS,MAAM,WAAW,SAAS,OAAO,GACpK,0BAAAC,OAAC,UAAK,WAAU,gDAA+C,eAAY,QAAO;AAAA,kCAAAD,MAAC,UAAK,oBAAC;AAAA,kBAAO,gBAAAA,MAAC,UAAK,oBAAC;AAAA,mBAAO,GAChH;AAAA,gBACA,gBAAAA,MAAC,YAAO,WAAU,8CAA6C,MAAK,UAAS,OAAO,SAAS,mBAAmB,cAAY,SAAS,mBAAmB,SAAS,MAAM,WAAW,SAAS,UAAU,GACnM,0BAAAC,OAAC,UAAK,WAAU,8DAA6D,eAAY,QAAO;AAAA,kCAAAD,MAAC,UAAK,oBAAC;AAAA,kBAAO,gBAAAA,MAAC,UAAK,kBAAC;AAAA,mBAAO,GAC9H;AAAA,gBACA,gBAAAA,MAAC,YAAO,WAAU,8CAA6C,MAAK,UAAS,OAAO,SAAS,iBAAiB,cAAY,SAAS,iBAAiB,SAAS,MAAM,WAAW,SAAS,UAAU,GAC/L,0BAAAC,OAAC,UAAK,WAAU,8DAA6D,eAAY,QAAO;AAAA,kCAAAD,MAAC,UAAK,oBAAC;AAAA,kBAAO,gBAAAA,MAAC,UAAK,kBAAC;AAAA,mBAAO,GAC9H;AAAA,iBACF;AAAA,cACA,gBAAAC,OAAC,SAAI,WAAU,kCAAiC,MAAK,SAAQ,cAAY,SAAS,aAClF;AAAA,gCAAAD,MAAC,YAAO,WAAU,4BAA2B,MAAK,UAAS,OAAO,SAAS,yBAAyB,cAAY,SAAS,yBAAyB,SAAS,MAAM,WAAW,SAAS,gBAAgB,GAAG,kBAExM;AAAA,gBACA,gBAAAA,MAAC,YAAO,KAAK,mBAAmB,IAAG,4BAA2B,WAAU,yBAAwB,MAAK,UAAS,OAAO,SAAS,qBAAqB,cAAY,SAAS,qBAAqB,SAAS,MAAM,WAAW,SAAS,sBAAsB,GAAG,gCAEzP;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,QAAQ,CAAC,UAAU;AACjB,4BAAM,YAAY,MAAM;AACxB,0BAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG;AAC5E,iDAAyB,KAAK;AAAA,sBAChC;AAAA,oBACF;AAAA,oBAEA;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,KAAK;AAAA,0BACL,IAAG;AAAA,0BACH,WAAW,yCAAyC,qBAAqB;AAAA,0BACzE,MAAK;AAAA,0BACL,OAAO,mBAAmB,uBAAuB,QAAQ;AAAA,0BACzD,cAAY,SAAS;AAAA,0BACrB,iBAAc;AAAA,0BACd,iBAAe;AAAA,0BACf,SAAS,MAAM,yBAAyB,CAAC,SAAS,CAAC,IAAI;AAAA,0BAEtD,8BAAoB,qBAAqB,EAAE;AAAA;AAAA,sBAC9C;AAAA,sBACA,gBAAAA,MAAC,SAAI,WAAU,0BAAyB,MAAK,WAAU,cAAY,SAAS,mBAAmB,QAAQ,CAAC,uBACrG,iCAAuB,IAAI,CAAC,WAC3B,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,iBAAe,0BAA0B,OAAO;AAAA,0BAChD,WAAW,gDAAgD,OAAO,EAAE;AAAA,0BACpE,OAAO,mBAAmB,OAAO,IAAI,QAAQ;AAAA,0BAC7C,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,0BAC7C,SAAS,MAAM;AACb,uCAAW,SAAS,wBAAwB,OAAO,EAAE;AACrD,qDAAyB,OAAO,EAAE;AAClC,qDAAyB,KAAK;AAC9B,yCAAa;AAAA,0BACf;AAAA,0BAEC,iBAAO;AAAA;AAAA,wBAdH,OAAO;AAAA,sBAed,CACD,GACH;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,QAAQ,CAAC,UAAU;AACjB,4BAAM,YAAY,MAAM;AACxB,0BAAI,EAAE,qBAAqB,SAAS,CAAC,MAAM,cAAc,SAAS,SAAS,GAAG;AAC5E,yCAAiB,KAAK;AAAA,sBACxB;AAAA,oBACF;AAAA,oBAEA;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,KAAK;AAAA,0BACL,IAAG;AAAA,0BACH,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,OAAO,SAAS;AAAA,0BAChB,cAAY,SAAS;AAAA,0BACrB,iBAAc;AAAA,0BACd,iBAAe;AAAA,0BACf,SAAS,MAAM,iBAAiB,CAAC,SAAS,CAAC,IAAI;AAAA,0BAE9C,UAAAE,gBAAeI,kBAAiB;AAAA;AAAA,sBACnC;AAAA,sBACA,gBAAAN,MAAC,SAAI,WAAU,sBAAqB,MAAK,WAAU,cAAY,SAAS,iBAAiB,QAAQ,CAAC,eAC/F,6BAAmB,IAAI,CAAC,WACvB,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,iBAAeM,uBAAsB,OAAO;AAAA,0BAC5C,WAAU;AAAA,0BACV,OAAO,eAAe,OAAO,IAAI,QAAQ;AAAA,0BACzC,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,0BAC7C,SAAS,MAAM;AACb,uCAAW,SAAS,oBAAoB,OAAO,EAAE;AACjD,iDAAqB,OAAO,EAAE;AAC9B,6CAAiB,KAAK;AACtB,yCAAa;AAAA,0BACf;AAAA,0BAEC,iBAAO;AAAA;AAAA,wBAdH,OAAO;AAAA,sBAed,CACD,GACH;AAAA;AAAA;AAAA,gBACF;AAAA,iBACA;AAAA,eACF;AAAA,YACA,gBAAAN;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,IAAG;AAAA,gBACH,WAAU;AAAA,gBACV,UAAU;AAAA,gBACV,cAAY,SAAS;AAAA;AAAA,YACvB;AAAA,YACA,gBAAAA,MAAC,SAAI,KAAK,gBAAgB,WAAU,SAAQ,QAAM,MAAC;AAAA,aACrD;AAAA,UAEA,gBAAAA,MAAC,aAAQ,WAAU,uBAAsB,cAAY,SAAS,eAC5D,0BAAAA,MAAC,SAAI,KAAK,eAAe,WAAU,eAAc,GACnD;AAAA,UAEC,QACC,gBAAAC,OAAC,aAAQ,WAAU,SACjB;AAAA,4BAAAA,OAAC,SAAI,WAAU,aACb;AAAA,8BAAAD,MAAC,UAAK,WAAU,aAAa,mBAAS,aAAY;AAAA,cAClD,gBAAAA,MAAC,SAAI,KAAK,eAAe,WAAU,SAAQ;AAAA,cAC3C,gBAAAA,MAAC,SAAI,KAAK,mBAAmB,WAAU,wBAAuB;AAAA,eAChE;AAAA,YACA,gBAAAC,OAAC,SAAI,OAAO,EAAE,WAAW,GAAG,GAC1B;AAAA,8BAAAA,OAAC,SAAI,WAAU,cACb;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM;AACb,yCAAmB,CAAC,MAAM;AACxB,8BAAM,OAAO,CAAC;AACd,2CAAmB,UAAU;AAC7B,uCAAe,MAAM;AACnB,gCAAM,IAAI,WAAW,SAAS,WAAW;AACzC,8BAAI,GAAG;AACL,iCAAK,iBAAiB,QAAQ,CAAC;AAAA,0BACjC;AAAA,wBACF,CAAC;AACD,+BAAO;AAAA,sBACT,CAAC;AAAA,oBACH;AAAA,oBAEC,4BAAkB,SAAS,eAAe,SAAS;AAAA;AAAA,gBACtD;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,YAAY;AACnB,4BAAM,UAAU,WAAW,SAAS,WAAW,EAAE,SAAS,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,KAAK;AACtG,0BAAI;AACF,8BAAM,UAAU,UAAU,UAAU,OAAO;AAAA,sBAC7C,QAAQ;AAAA,sBAER;AAAA,oBACF;AAAA,oBAEC,mBAAS;AAAA;AAAA,gBACZ;AAAA,iBACF;AAAA,cACA,gBAAAA,MAAC,SAAI,KAAK,aAAa,WAAU,aAAY;AAAA,eAC/C;AAAA,aACF,IACE;AAAA,WACN;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,YAAY,cAAc;;;AD1zCpB,gBAAAS,OAcE,QAAAC,cAdF;AA/BC,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,WAAW;AAAA,EACX,eAAe;AAAA,EACf,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,WAAW,kBAAkB,QAAQ;AAC3C,QAAM,gBAAgBC,QAAO,OAAO;AAEpC,EAAAC,WAAU,MAAM;AACd,UAAM,YAAY,CAAC,UAA+B;AAChD,UAAI,MAAM,QAAQ,UAAU;AAC1B,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,SAAS;AAC5C,WAAO,MAAM,OAAO,oBAAoB,WAAW,SAAS;AAAA,EAC9D,GAAG,CAAC,OAAO,CAAC;AAEZ,SACE,gBAAAF,OAAC,SAAI,WAAU,0CAAyC,MAAK,gBAC3D;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,cAAY,SAAS;AAAA,QACrB,SAAS;AAAA;AAAA,IACX;AAAA,IACA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,cAAW;AAAA,QACX,mBAAgB;AAAA,QAChB,KAAK,kBAAkB,QAAQ;AAAA,QAC/B,MAAM;AAAA,QAEN;AAAA,0BAAAA,OAAC,SAAI,WAAU,+BACb;AAAA,4BAAAD,MAAC,YAAO,IAAG,wCAAwC,mBAAS,qBAAoB;AAAA,YAChF,gBAAAA,MAAC,YAAO,MAAK,UAAS,SAAS,SAC5B,mBAAS,OACZ;AAAA,aACF;AAAA,UACA,gBAAAC,OAAC,SAAI,WAAU,+BAA8B,MAAK,SAAQ,cAAY,SAAS,cAC7E;AAAA,4BAAAA,OAAC,YAAO,MAAK,UAAS,gBAAc,aAAa,UAAU,SAAS,MAAM,iBAAiB,QAAQ,GAChG;AAAA,uBAAS;AAAA,cAAO;AAAA,eACnB;AAAA,YACA,gBAAAA,OAAC,YAAO,MAAK,UAAS,gBAAc,aAAa,WAAW,SAAS,MAAM,iBAAiB,SAAS,GAClG;AAAA,uBAAS;AAAA,cAAU;AAAA,eACtB;AAAA,aACF;AAAA,UACC,aAAa,YACZ,gBAAAA,OAAC,SAAI,WAAU,sCACb;AAAA,4BAAAA,OAAC,WAAM,WAAU,6CACf;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,UAAU,CAAC,UAAU,uBAAuB,MAAM,cAAc,OAAO;AAAA;AAAA,cACzE;AAAA,cACA,gBAAAA,MAAC,UAAM,mBAAS,aAAY;AAAA,eAC9B;AAAA,YACC,eACC,gBAAAC,OAAC,WAAM,WAAU,sCACf;AAAA,8BAAAD,MAAC,UAAM,mBAAS,YAAW;AAAA,cAC3B,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,kBACP,KAAK,kBAAkB,QAAQ;AAAA,kBAC/B,aAAa,SAAS;AAAA,kBACtB,UAAU,CAAC,UAAU,gBAAgB,MAAM,cAAc,KAAK;AAAA;AAAA,cAChE;AAAA,eACF,IACE;AAAA,aACN,IACE;AAAA,UACH,SAAS,gBAAAA,MAAC,OAAE,WAAU,iCAAiC,uBAAa,OAAO,SAAS,sBAAsB,QAAO,IAAO;AAAA,UACzH,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,aAAa;AAAA,cACb;AAAA,cACA,gBAAgB;AAAA,cAChB,iBAAiB,CAAC,gBAAgB;AAChC,8BAAc,UAAU;AAAA,cAC1B;AAAA;AAAA,UACF;AAAA,UACA,gBAAAC,OAAC,SAAI,WAAU,+BACZ;AAAA,yBAAa,WACZ,gBAAAD,MAAC,YAAO,MAAK,UAAS,WAAU,0CAAyC,SAAS,UAC/E,mBAAS,gBACZ,IACE;AAAA,YACJ,gBAAAA,MAAC,YAAO,MAAK,UAAS,SAAS,MAAM,OAAO,EAAE,GAAG,cAAc,SAAS,YAAY,aAAa,CAAC,GAC/F,mBAAS,cACZ;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AG1FQ,SACE,OAAAI,OADF,QAAAC,cAAA;AA5BR,SAAS,UAAU,MAAmC,UAAiC;AACrF,QAAM,WAAW,kBAAkB,QAAQ;AAC3C,MAAI,SAAS,OAAO;AAClB,WAAO,SAAS;AAAA,EAClB;AACA,MAAI,SAAS,OAAO;AAClB,WAAO,SAAS;AAAA,EAClB;AACA,SAAO,SAAS;AAClB;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,WAAW,kBAAkB,QAAQ;AAE3C,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SACE,gBAAAD,MAAC,SAAI,WAAU,yCAAwC,MAAK,gBAAe,SAAS,SAClF,0BAAAC,OAAC,SAAI,WAAU,sCAAqC,MAAK,UAAS,cAAY,SAAS,aAAa,SAAS,CAAC,UAAU,MAAM,gBAAgB,GAC5I;AAAA,oBAAAA,OAAC,YAAO,WAAU,uCAChB;AAAA,sBAAAD,MAAC,YAAQ,mBAAS,aAAY;AAAA,MAC9B,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,oCAAmC,OAAO,SAAS,OAAO,cAAY,SAAS,OAAO,SAAS,SAAS,kBAExI;AAAA,OACF;AAAA,IACA,gBAAAA,MAAC,OAAE,WAAU,uCAAuC,mBAAS,YAAW;AAAA,IACvE,OAAO,WAAW,IACjB,gBAAAA,MAAC,OAAE,WAAU,6CAA6C,mBAAS,aAAY,IAE/E,gBAAAA,MAAC,QAAG,WAAU,qCACX,iBAAO,IAAI,CAAC,UACX,gBAAAC,OAAC,QAA0C,WAAU,qCACnD;AAAA,sBAAAD,MAAC,SAAI,WAAU,0CACb,0BAAAC,OAAC,YAAO;AAAA;AAAA,QACJ,UAAU,MAAM,MAAM,QAAQ;AAAA,QAAE;AAAA,QAAE,MAAM;AAAA,QAAO;AAAA,QAAG,MAAM;AAAA,SAC5D,GACF;AAAA,MACA,gBAAAA,OAAC,SAAI,WAAU,qCACb;AAAA,wBAAAA,OAAC,WAAM,WAAU,sCACf;AAAA,0BAAAD,MAAC,UAAM,mBAAS,YAAW;AAAA,UAC3B,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,MAAM;AAAA,cACb,KAAK,kBAAkB,QAAQ;AAAA,cAC/B,UAAU,CAAC,UAAU;AACnB,sBAAM,QAAQ,MAAM,cAAc;AAClC,oBAAI,MAAM,SAAS,MAAM;AACvB,0CAAwB,MAAM,SAAS,EAAE,OAAO,OAAO,cAAc,KAAK,CAAC;AAAA,gBAC7E,WAAW,MAAM,SAAS,SAAS,MAAM,SAAS,OAAO;AACvD,kCAAgB,MAAM,SAAS,MAAM,MAAM,EAAE,OAAO,OAAO,cAAc,KAAK,CAAC;AAAA,gBACjF;AAAA,cACF;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QACC,MAAM,SAAS,SAAS,MAAM,SAAS,QACtC,gBAAAC,OAAC,WAAM,WAAU,sCACf;AAAA,0BAAAD,MAAC,UAAM,mBAAS,cAAa;AAAA,UAC7B,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,MAAM;AAAA,cACb,UAAU,CAAC,UAAU;AACnB,sBAAM,QAAQ,MAAM,cAAc;AAClC,sBAAM,OAAO,MAAM;AACnB,oBAAI,SAAS,SAAS,SAAS,OAAO;AACpC,kCAAgB,MAAM,SAAS,MAAM,EAAE,SAAS,OAAO,gBAAgB,KAAK,CAAC;AAAA,gBAC/E;AAAA,cACF;AAAA;AAAA,UACF;AAAA,WACF,IACE;AAAA,SACN;AAAA,SArCO,GAAG,MAAM,IAAI,IAAI,MAAM,OAAO,EAsCvC,CACD,GACH;AAAA,KAEJ,GACF;AAEJ;;;ACnGA,SAAS,YAAAE,iBAAgB;AAsCjB,SACE,OAAAC,OADF,QAAAC,cAAA;AAtBR,IAAM,cAA8B,EAAE,KAAK,IAAI,SAAS,IAAI,OAAO,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,GAAG;AAE7F,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,WAAW,kBAAkB,QAAQ;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAyB,WAAW;AAE9D,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SACE,gBAAAF,MAAC,SAAI,WAAU,yCAAwC,MAAK,gBAAe,SAAS,SAClF,0BAAAC,OAAC,SAAI,WAAU,sCAAqC,MAAK,UAAS,cAAY,SAAS,iBAAiB,SAAS,CAAC,UAAU,MAAM,gBAAgB,GAChJ;AAAA,oBAAAA,OAAC,YAAO,WAAU,uCAChB;AAAA,sBAAAD,MAAC,YAAQ,mBAAS,iBAAgB;AAAA,MAClC,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,oCAAmC,OAAO,SAAS,OAAO,cAAY,SAAS,OAAO,SAAS,SAAS,kBAExI;AAAA,OACF;AAAA,IAEA,gBAAAC,OAAC,SAAI,WAAU,oCACb;AAAA,sBAAAD,MAAC,QAAI,mBAAS,cAAa;AAAA,MAC3B,gBAAAA,MAAC,SAAI,WAAU,qCAEX;AAAA,QACE,CAAC,OAAO,SAAS,YAAY;AAAA,QAC7B,CAAC,WAAW,SAAS,gBAAgB;AAAA,QACrC,CAAC,SAAS,SAAS,cAAc;AAAA,QACjC,CAAC,QAAQ,SAAS,aAAa;AAAA,QAC/B,CAAC,SAAS,SAAS,cAAc;AAAA,QACjC,CAAC,OAAO,SAAS,YAAY;AAAA,MAC/B,EACA,IAAI,CAAC,CAAC,OAAO,KAAK,MAClB,gBAAAC,OAAC,WAAkB,WAAU,sCAC3B;AAAA,wBAAAD,MAAC,UAAM,iBAAM;AAAA,QACb,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM,KAAK,KAAK;AAAA,YACvB,UAAU,CAAC,UAAU;AACnB,oBAAM,QAAQ,MAAM,cAAc;AAClC,uBAAS,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,KAAK,GAAG,MAAM,EAAE;AAAA,YACxD;AAAA;AAAA,QACF;AAAA,WARU,KASZ,CACD,GACH;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU,CAAC,MAAM,KAAK,KAAK;AAAA,UAC3B,SAAS,MAAM;AACb,kBAAM,KAAK;AACX,qBAAS,WAAW;AAAA,UACtB;AAAA,UAEC,mBAAS;AAAA;AAAA,MACZ;AAAA,OACF;AAAA,IAEA,gBAAAA,MAAC,QAAG,WAAU,qCACX,qBAAW,IAAI,CAAC,WAAW,UAC1B,gBAAAC,OAAC,QAAsB,WAAU,qCAC/B;AAAA,sBAAAA,OAAC,SAAI,WAAU,0CACb;AAAA,wBAAAA,OAAC,YAAO;AAAA;AAAA,UACJ,QAAQ;AAAA,UAAE;AAAA,UAAG,UAAU;AAAA,WAC3B;AAAA,QACA,gBAAAA,OAAC,SAAI,WAAU,6CACb;AAAA,0BAAAD,MAAC,YAAO,MAAK,UAAS,OAAO,SAAS,QAAQ,cAAY,SAAS,QAAQ,UAAU,UAAU,GAAG,SAAS,MAAM,OAAO,UAAU,IAAI,EAAE,GAAG,oBAE3I;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO,SAAS;AAAA,cAChB,cAAY,SAAS;AAAA,cACrB,UAAU,UAAU,WAAW,SAAS;AAAA,cACxC,SAAS,MAAM,OAAO,UAAU,IAAI,CAAC;AAAA,cACtC;AAAA;AAAA,UAED;AAAA,UACA,gBAAAA,MAAC,YAAO,MAAK,UAAS,OAAO,SAAS,iBAAiB,cAAY,SAAS,iBAAiB,SAAS,MAAM,SAAS,UAAU,EAAE,GAAG,kBAEpI;AAAA,WACF;AAAA,SACF;AAAA,MACA,gBAAAA,MAAC,SAAI,WAAU,qCAEX;AAAA,QACE,CAAC,OAAO,SAAS,YAAY;AAAA,QAC7B,CAAC,WAAW,SAAS,gBAAgB;AAAA,QACrC,CAAC,SAAS,SAAS,cAAc;AAAA,QACjC,CAAC,QAAQ,SAAS,aAAa;AAAA,QAC/B,CAAC,SAAS,SAAS,cAAc;AAAA,QACjC,CAAC,OAAO,SAAS,YAAY;AAAA,MAC/B,EACA,IAAI,CAAC,CAAC,OAAO,KAAK,MAClB,gBAAAC,OAAC,WAAkB,WAAU,sCAC3B;AAAA,wBAAAD,MAAC,UAAM,iBAAM;AAAA,QACb,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,UAAU,KAAK;AAAA,YACtB,UAAU,CAAC,UAAU;AACnB,oBAAM,QAAQ,MAAM,cAAc;AAClC,uBAAS,UAAU,IAAI,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC;AAAA,YAC3C;AAAA;AAAA,QACF;AAAA,WARU,KASZ,CACD,GACH;AAAA,SA7CO,UAAU,EA8CnB,CACD,GACH;AAAA,KACF,GACF;AAEJ;;;ACzIA,SAAS,aAAAG,YAAW,YAAAC,iBAAgB;AAsD5B,SACE,OAAAC,OADF,QAAAC,cAAA;AAtCD,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,cAAc,CAAC;AAAA,EACf,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,WAAW,kBAAkB,QAAQ;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAmB,WAAW;AAC9D,QAAM,CAAC,YAAY,aAAa,IAAIA,UAA0B,iBAAiB;AAE/E,EAAAC,WAAU,MAAM;AACd,QAAI,MAAM;AACR,kBAAY,WAAW;AACvB,oBAAc,iBAAiB;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,MAAM,aAAa,iBAAiB,CAAC;AAEzC,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,WAAS,UAAU,KAAa,MAAyC;AACvE,gBAAY,CAAC,GAAG,CAAC;AACjB,kBAAc,SAAS,OAAO,UAAU,KAAK;AAAA,EAC/C;AAEA,SACE,gBAAAH,MAAC,SAAI,WAAU,gDAA+C,MAAK,gBAAe,SAAS,SACzF,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,cAAY,SAAS;AAAA,MACrB,SAAS,CAAC,UAAU,MAAM,gBAAgB;AAAA,MAE1C;AAAA,wBAAAA,OAAC,YAAO,WAAU,8CAChB;AAAA,0BAAAD,MAAC,YAAQ,mBAAS,gBAAe;AAAA,UACjC,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,oCAAmC,OAAO,SAAS,OAAO,cAAY,SAAS,OAAO,SAAS,SAAS,kBAExI;AAAA,WACF;AAAA,QACC,OAAO,WAAW,IACjB,gBAAAA,MAAC,OAAE,WAAU,6CAA6C,mBAAS,aAAY,IAE/E,gBAAAA,MAAC,QAAG,WAAU,4CACX,iBAAO,IAAI,CAAC,UAAU;AACrB,gBAAM,UAAU,SAAS,SAAS,MAAM,GAAG;AAC3C,iBACE,gBAAAA,MAAC,QACC,0BAAAC,OAAC,WAAM,WAAU,4CACf;AAAA,4BAAAD,MAAC,WAAM,MAAK,SAAQ,MAAK,iBAAgB,SAAkB,UAAU,MAAM,UAAU,MAAM,KAAK,MAAM,IAAI,GAAG;AAAA,YAC7G,gBAAAC,OAAC,UACC;AAAA,8BAAAA,OAAC,YAAO;AAAA;AAAA,gBACJ,MAAM;AAAA,gBAAK;AAAA,gBAAE,MAAM;AAAA,gBAAO;AAAA,gBAAG,MAAM;AAAA,iBACvC;AAAA,cACC,MAAM,UAAU,gBAAAD,MAAC,UAAK,WAAU,4CAA4C,gBAAM,SAAQ,IAAU;AAAA,eACvG;AAAA,aACF,KATO,GAAG,MAAM,IAAI,IAAI,MAAM,OAAO,EAUvC;AAAA,QAEJ,CAAC,GACH;AAAA,QAEF,gBAAAC,OAAC,YAAO,WAAU,8CACf;AAAA,2BACC,gBAAAD,MAAC,YAAO,MAAK,UAAS,SAAS,gBAC5B,mBAAS,cACZ,IACE;AAAA,UACJ,gBAAAA,MAAC,YAAO,MAAK,UAAS,SAAS,SAC5B,mBAAS,OACZ;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,UAAU,SAAS,WAAW;AAAA,cAC9B,SAAS,MAAM,UAAU,UAAU,UAAU;AAAA,cAE5C,mBAAS;AAAA;AAAA,UACZ;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;;;AC9FO,SAAS,kCAAwD;AACtE,SAAO,EAAE,SAAS,MAAM,SAAS,MAAM,aAAa,MAAM,aAAa,EAAE;AAC3E;AAEO,SAAS,oBAAoB,QAA0B,SAAgC;AAC5F,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,eAAe,MAAM,MAAM,OAAO,SAAS;AAC5D,aAAO,MAAM;AAAA,IACf;AACA,QAAI,MAAM,SAAS,QAAQ;AACzB,iBAAW,QAAQ,MAAM,OAAO;AAC9B,YAAI,KAAK,MAAM,OAAO,SAAS;AAC7B,iBAAO,MAAM;AAAA,QACf;AACA,cAAM,SAAS,oBAAoB,KAAK,QAAQ,OAAO;AACvD,YAAI,QAAQ;AACV,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAM,SAAS,SAAS;AAC1B,iBAAW,OAAO,MAAM,MAAM;AAC5B,mBAAW,QAAQ,KAAK;AACtB,cAAI,KAAK,OAAO,SAAS;AACvB,mBAAO,MAAM;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,mBAAmBI,WAAyB,OAA0G;AACpK,MAAI,MAAM,SAAS;AACjB,WAAO,EAAE,SAAS,MAAM,SAAS,aAAa,MAAM,aAAa,aAAa,MAAM,YAAY;AAAA,EAClG;AACA,aAAW,SAASA,UAAS,QAAQ;AACnC,QAAI,MAAM,SAAS,aAAa;AAC9B,YAAM,YAAY,MAAM,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAClE,YAAM,OAAO,WAAW,SAAS,SAAS,UAAU,OAAO;AAC3D,aAAO,EAAE,SAAS,MAAM,MAAM,IAAI,aAAa,KAAK,QAAQ,aAAa,WAAW,SAAS,SAAS,UAAU,KAAK,KAAK;AAAA,IAC5H;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,0BAA0BA,WAAyB,OAA4C;AAC7G,MAAI,MAAM,WAAWA,UAAS,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,OAAO,GAAG;AACxE,WAAO,MAAM;AAAA,EACf;AACA,MAAI,MAAM,SAAS;AACjB,WAAO,oBAAoBA,UAAS,QAAQ,MAAM,OAAO;AAAA,EAC3D;AACA,SAAOA,UAAS,OAAO,SAAS,IAAIA,UAAS,OAAOA,UAAS,OAAO,SAAS,CAAC,EAAG,KAAK;AACxF;;;AChEO,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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":["value","node","parseChain","document","isObject","nextId","targetRow","next","clamp","clamp","scripts","document","document","document","document","document","document","block","reference","document","document","document","useCallback","useEffect","useRef","useState","useRef","jsx","jsxs","useEffect","useRef","useState","node","jsx","useRef","useState","useEffect","jsx","jsxs","jsx","jsxs","document","jsx","useRef","jsx","jsxs","useEffect","useState","jsx","jsxs","useState","useEffect","useState","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","useState","jsx","jsxs","useEffect","useRef","useEffect","useRef","useState","Fragment","jsx","jsxs","digitFormLabel","ButexEditor","useRef","useState","selectedDigitForm","useEffect","_","jsx","jsxs","useRef","useEffect","jsx","jsxs","useState","jsx","jsxs","useState","useEffect","useState","jsx","jsxs","useState","useEffect","document","Fragment","jsx","jsxs","document","useState","useRef","useEffect","useCallback","next"]}
|
|
1
|
+
{"version":3,"sources":["../src/react-document2/ArticleMetaPanel.tsx","../src/document2/ids.ts","../src/editor/digits.ts","../src/document2/articleMeta.ts","../src/document2/citations.ts","../src/ast/commands/index.ts","../src/ast/arabic_ast.ts","../src/document/mathObject.ts","../src/document2/labels.ts","../src/document2/inlineScanner.ts","../src/document2/importJson.ts","../src/editor/atomicCommands.ts","../src/editor/atomicCommandsOperators.ts","../src/editor/factory.ts","../src/editor/divideOperator.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/derivativeTemplates.ts","../src/editor/uiLocale.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/normalizeCharImport.ts","../src/document/mathEditorAdapter.ts","../src/document2/mathBridge.ts","../src/document2/commands.ts","../src/document2/arabicPreamble.ts","../src/document2/exportLatex.ts","../src/document2/history.ts","../src/document2/blockSelection.ts","../src/document2/previewModel.ts","../src/react-document2/uiMessages.ts","../src/react-document2/ButexDocumentEditor2.tsx","../src/react-document2/InlineField.tsx","../src/react-document2/CiteChip.tsx","../src/react-document2/MathIsland.tsx","../src/mathjax/svgPatcher.ts","../src/mathjax/renderIsland.ts","../src/react-document2/MathChip.tsx","../src/react-document2/RefChip.tsx","../src/uiLocale.ts","../src/react-document2/BlockEditor.tsx","../src/react-document2/CitePickerPopover.tsx","../src/react-document2/DocumentInsertToolbar.tsx","../src/react-document2/TableInsertPopover.tsx","../src/react-document2/DocumentPreview.tsx","../src/react-document2/EquationDrawer.tsx","../src/react/ButexEditor.tsx","../src/react/widgetChromeCss.ts","../src/react-document2/LabelsPanel.tsx","../src/react-document2/ReferencesPanel.tsx","../src/react-document2/RefPickerPopover.tsx","../src/react-document2/editorFocus.ts","../src/react-document2/documentWidgetCss2.ts"],"sourcesContent":["import { useEffect, useId, useRef, useState, type RefObject } from 'react';\nimport {\n BUTEX_BASMALA_LINE1,\n BUTEX_BASMALA_LINE2,\n BUTEX_BASMALA_SALAWAT,\n BUTEX_CLOSING_HAMDALA,\n HIJRI_MONTH_IDS,\n HIJRI_YEAR_MAX,\n HIJRI_YEAR_MIN,\n formatHijriDate,\n hijriMonthLabel,\n type Document2Meta,\n type Document2MetaProp,\n type HijriMonthId,\n} from '../document2/index.js';\nimport { formatDigits } from '../editor/digits.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type ArticleMetaPanelProps = {\n meta: Document2Meta;\n uiLocale?: ButexUiLocale;\n digitForm?: DigitFormId;\n panelRef?: RefObject<HTMLElement | null>;\n onChange: (patch: Document2MetaProp) => void;\n};\n\nconst HIJRI_DAYS = Array.from({ length: 30 }, (_, index) => index + 1);\nconst HIJRI_YEARS = Array.from(\n { length: HIJRI_YEAR_MAX - HIJRI_YEAR_MIN + 1 },\n (_, index) => HIJRI_YEAR_MIN + index,\n);\n\ntype HijriMenuOption = { value: string; label: string };\n\nfunction HijriDateMenu({\n label,\n value,\n options,\n onChange,\n}: {\n label: string;\n value: string;\n options: HijriMenuOption[];\n onChange: (value: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const listId = useId();\n const selected = options.find((option) => option.value === value) ?? options[0];\n\n useEffect(() => {\n if (!open) {\n return;\n }\n const onPointerDown = (event: MouseEvent): void => {\n if (!rootRef.current?.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', onPointerDown);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('mousedown', onPointerDown);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n\n return (\n <div className=\"butex-document2-widget__hijri-menu\" ref={rootRef}>\n <span className=\"butex-document2-widget__visually-hidden\">{label}</span>\n <button\n type=\"button\"\n className=\"butex-document2-widget__hijri-menu-trigger\"\n aria-label={label}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={listId}\n onClick={() => setOpen((current) => !current)}\n >\n {selected?.label ?? value}\n </button>\n {open ? (\n <ul id={listId} className=\"butex-document2-widget__hijri-menu-list\" role=\"listbox\" aria-label={label}>\n {options.map((option) => {\n const isSelected = option.value === value;\n return (\n <li key={option.value} role=\"presentation\">\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n className=\"butex-document2-widget__hijri-menu-option\"\n onClick={() => {\n onChange(option.value);\n setOpen(false);\n }}\n >\n {option.label}\n </button>\n </li>\n );\n })}\n </ul>\n ) : null}\n </div>\n );\n}\n\nexport function ArticleMetaPanel({\n meta,\n uiLocale = 'ar',\n digitForm = 'arabicIndic',\n panelRef,\n onChange,\n}: ArticleMetaPanelProps) {\n const messages = document2Messages(uiLocale);\n const titleInputRef = useRef<HTMLInputElement>(null);\n const localRef = useRef<HTMLElement>(null);\n const resolvedRef = panelRef ?? localRef;\n const formattedDate = formatHijriDate(meta.date, { locale: uiLocale, digitForm });\n\n return (\n <section\n ref={resolvedRef}\n className=\"butex-document2-widget__article-meta\"\n aria-label={messages.articleMetaTitle}\n >\n <header className=\"butex-document2-widget__article-meta-header\">\n <strong>{messages.articleMetaTitle}</strong>\n <span className=\"butex-document2-widget__article-meta-badge\">{messages.articleMetaBadge}</span>\n </header>\n\n <p className=\"butex-document2-widget__article-meta-fixed\" dir=\"rtl\">\n {BUTEX_BASMALA_LINE1}\n <br />\n {BUTEX_BASMALA_LINE2}\n <br />\n {BUTEX_BASMALA_SALAWAT}\n </p>\n\n <div className=\"butex-document2-widget__article-meta-grid\">\n <label className=\"butex-document2-widget__article-meta-field\">\n <span>{messages.articleTitle}</span>\n <input\n ref={titleInputRef}\n value={meta.title}\n onChange={(event) => {\n const value = event.currentTarget.value;\n onChange({ title: value });\n }}\n />\n </label>\n\n <label className=\"butex-document2-widget__article-meta-field\">\n <span>{messages.articleAuthors}</span>\n <textarea\n rows={2}\n value={meta.authors}\n onChange={(event) => {\n const value = event.currentTarget.value;\n onChange({ authors: value });\n }}\n />\n </label>\n\n <div className=\"butex-document2-widget__article-meta-field\">\n <span>{messages.articleDate}</span>\n <div className=\"butex-document2-widget__article-meta-date\">\n <HijriDateMenu\n label={messages.articleDay}\n value={String(meta.date.day)}\n options={HIJRI_DAYS.map((day) => ({\n value: String(day),\n label: formatDigits(String(day), digitForm),\n }))}\n onChange={(value) => onChange({ date: { day: Number(value) } })}\n />\n <HijriDateMenu\n label={messages.articleMonth}\n value={meta.date.month}\n options={HIJRI_MONTH_IDS.map((month) => ({\n value: month,\n label: hijriMonthLabel(month, uiLocale),\n }))}\n onChange={(value) => onChange({ date: { month: value as HijriMonthId } })}\n />\n <HijriDateMenu\n label={messages.articleYear}\n value={String(meta.date.year)}\n options={HIJRI_YEARS.map((year) => ({\n value: String(year),\n label: formatDigits(String(year), digitForm),\n }))}\n onChange={(value) => onChange({ date: { year: Number(value) } })}\n />\n </div>\n <p className=\"butex-document2-widget__article-meta-date-preview\" dir={uiLocale === 'ar' ? 'rtl' : 'ltr'}>\n {formattedDate}\n </p>\n </div>\n\n <label className=\"butex-document2-widget__article-meta-field\">\n <span>{messages.articleAbstract}</span>\n <textarea\n rows={3}\n value={meta.abstract}\n onChange={(event) => {\n const value = event.currentTarget.value;\n onChange({ abstract: value });\n }}\n />\n </label>\n </div>\n\n <p className=\"butex-document2-widget__article-meta-fixed\" dir=\"rtl\">\n {BUTEX_CLOSING_HAMDALA}\n </p>\n </section>\n );\n}\n\nexport function focusArticleMetaPanel(panel: HTMLElement | null): void {\n if (!panel) {\n return;\n }\n panel.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n const input = panel.querySelector('input');\n if (input instanceof HTMLInputElement) {\n input.focus();\n }\n}\n","let nextId = 1;\n\nexport function document2Id(prefix: string): string {\n const id = `${prefix}_${String(nextId)}`;\n nextId += 1;\n return id;\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 { formatDigits } from '../editor/digits.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport type { Document2HijriDate, Document2Meta, HijriMonthId } from './types.js';\n\nexport const BUTEX_BASMALA_LINE1 = 'بِسْمِ ٱللَّٰهِ ٱلرَّحْمَٰنِ ٱلرَّحِيمِ';\n\nexport const BUTEX_BASMALA_LINE2 = 'وَٱلصَّلَاةُ وَٱلسَّلَامُ عَلَىٰ رَسُولِ ٱللَّٰهِ';\n\nexport const BUTEX_BASMALA_SALAWAT = 'صَلَّى ٱللَّهُ عَلَيْهِ وَسَلَّمَ';\n\n/** Three-line basmala joined for UI / plain-text matchers. */\nexport const BUTEX_BASMALA = `${BUTEX_BASMALA_LINE1}\\n${BUTEX_BASMALA_LINE2}\\n${BUTEX_BASMALA_SALAWAT}`;\n\nexport const BUTEX_CLOSING_HAMDALA = 'الْحَمْدُ لِلَّهِ نَفَعَنَا بِعِلْمِهِ';\n\nfunction escapeButexTextArg(text: string): string {\n return text.replace(/\\\\/g, '\\\\textbackslash{}').replace(/[{}]/g, '\\\\$&');\n}\n\n/** Display-math body using BuTeX Diwani (for MathJax preview islands). */\nexport function butexDiwaniDisplayTex(text: string): string {\n return `\\\\butexdiwani{${escapeButexTextArg(text)}}`;\n}\n\n/** Full display equation for XeLaTeX export. */\nexport function butexDiwaniDisplayLatex(text: string): string {\n return `\\\\[\\n${butexDiwaniDisplayTex(text)}\\n\\\\]`;\n}\n\nconst BASMALA_LINES = [BUTEX_BASMALA_LINE1, BUTEX_BASMALA_LINE2, BUTEX_BASMALA_SALAWAT] as const;\n\n/** Three-line Diwani body for MathJax basmala islands. */\nexport function butexBasmalaDisplayTex(): string {\n return BASMALA_LINES.map((line) => butexDiwaniDisplayTex(line)).join(' \\\\\\\\ ');\n}\n\n/** Standalone display equation when there is no \\\\maketitle (title-less docs). */\nexport function butexBasmalaDisplayLatex(): string {\n return `\\\\[\\n${butexBasmalaDisplayTex()}\\n\\\\]`;\n}\n\n/**\n * Keep \\\\maketitle inside the current column when twocolumn is on.\n * Standard article otherwise does \\\\twocolumn[\\\\@maketitle] and spans both columns.\n * Call after titling so \\\\@maketitle still includes \\\\pretitle hooks.\n */\nexport function butexInColumnMaketitleHook(): string {\n return String.raw`\\makeatletter\n\\renewcommand{\\maketitle}{%\n \\par\n \\begingroup\n \\renewcommand\\thefootnote{\\@fnsymbol\\c@footnote}%\n \\def\\@makefnmark{\\rlap{\\@textsuperscript{\\normalfont\\@thefnmark}}}%\n \\long\\def\\@makefntext##1{\\parindent 1em\\noindent\n \\hb@xt@1.8em{\\hss\\@textsuperscript{\\normalfont\\@thefnmark}}##1}%\n \\@maketitle\n \\thispagestyle{plain}\\@thanks\n \\endgroup\n \\setcounter{footnote}{0}%\n \\global\\let\\thanks\\relax\n \\global\\let\\maketitle\\relax\n \\global\\let\\@maketitle\\relax\n \\global\\let\\@thanks\\@empty\n \\global\\let\\@author\\@empty\n \\global\\let\\@date\\@empty\n \\global\\let\\@title\\@empty\n \\global\\let\\title\\relax\n \\global\\let\\author\\relax\n \\global\\let\\date\\relax\n \\global\\let\\and\\relax\n}\n\\makeatother`;\n}\n\n/** Titling hooks so the basmala stays attached to the visible title. */\nexport function butexBasmalaTitlingPreamble(options: { twocolumn?: boolean } = {}): string {\n const lines = [\n '\\\\usepackage{titling}',\n '\\\\pretitle{%',\n ' \\\\begin{center}',\n ...BASMALA_LINES.map((line, index) => {\n const suffix = index < BASMALA_LINES.length - 1 ? '\\\\\\\\' : '';\n return ` ${butexDiwaniDisplayTex(line)}${suffix}`;\n }),\n ' \\\\par\\\\vspace{1.5em}',\n ' \\\\LARGE',\n '}',\n '\\\\posttitle{\\\\par\\\\end{center}}',\n ];\n if (options.twocolumn) {\n lines.push(butexInColumnMaketitleHook());\n }\n return lines.join('\\n');\n}\nexport const HIJRI_YEAR_MIN = 1400;\nexport const HIJRI_YEAR_MAX = 1500;\n\nexport const HIJRI_MONTH_IDS: HijriMonthId[] = [\n 'محرم',\n 'صفر',\n 'ربيع الأول',\n 'ربيع الآخر',\n 'جمادى الأولى',\n 'جمادى الآخرة',\n 'رجب',\n 'شعبان',\n 'رمضان',\n 'شوال',\n 'ذو القعدة',\n 'ذو الحجة',\n];\n\nconst HIJRI_MONTH_LABELS_EN: Record<HijriMonthId, string> = {\n محرم: 'Muharram',\n صفر: 'Safar',\n 'ربيع الأول': 'Rabiʻ I',\n 'ربيع الآخر': 'Rabiʻ II',\n 'جمادى الأولى': 'Jumada I',\n 'جمادى الآخرة': 'Jumada II',\n رجب: 'Rajab',\n شعبان: 'Shaʻban',\n رمضان: 'Ramadan',\n شوال: 'Shawwal',\n 'ذو القعدة': 'Dhul Qaʻdah',\n 'ذو الحجة': 'Dhul Hijjah',\n};\n\n/** Legacy Latin month ids from earlier drafts — accepted on import only. */\nconst LEGACY_LATIN_MONTH: Record<string, HijriMonthId> = {\n muharram: 'محرم',\n safar: 'صفر',\n rabiAwwal: 'ربيع الأول',\n rabiThani: 'ربيع الآخر',\n jumadaAwwal: 'جمادى الأولى',\n jumadaThani: 'جمادى الآخرة',\n rajab: 'رجب',\n shaban: 'شعبان',\n ramadan: 'رمضان',\n shawwal: 'شوال',\n dhulQadah: 'ذو القعدة',\n dhulHijjah: 'ذو الحجة',\n};\n\nexport const DEFAULT_HIJRI_DATE: Document2HijriDate = {\n day: 1,\n month: 'محرم',\n year: 1448,\n};\n\nexport function hijriMonthLabel(month: HijriMonthId, locale: ButexUiLocale = 'ar'): string {\n return locale === 'en' ? HIJRI_MONTH_LABELS_EN[month] : month;\n}\n\nexport function emptyDocument2Meta(): Document2Meta {\n return {\n title: '',\n authors: '',\n date: { ...DEFAULT_HIJRI_DATE },\n abstract: '',\n };\n}\n\nfunction clampInt(value: number, min: number, max: number): number {\n if (!Number.isFinite(value)) {\n return min;\n }\n return Math.min(max, Math.max(min, Math.trunc(value)));\n}\n\nfunction isHijriMonthId(value: unknown): value is HijriMonthId {\n return typeof value === 'string' && (HIJRI_MONTH_IDS as string[]).includes(value);\n}\n\nfunction resolveHijriMonthId(value: unknown): HijriMonthId {\n if (isHijriMonthId(value)) {\n return value;\n }\n if (typeof value === 'string' && value in LEGACY_LATIN_MONTH) {\n return LEGACY_LATIN_MONTH[value]!;\n }\n return DEFAULT_HIJRI_DATE.month;\n}\n\nexport function normalizeDocument2HijriDate(value: unknown): Document2HijriDate {\n if (typeof value !== 'object' || value === null) {\n return { ...DEFAULT_HIJRI_DATE };\n }\n const raw = value as Record<string, unknown>;\n const day = clampInt(typeof raw.day === 'number' ? raw.day : Number(raw.day), 1, 30);\n const year = clampInt(typeof raw.year === 'number' ? raw.year : Number(raw.year), HIJRI_YEAR_MIN, HIJRI_YEAR_MAX);\n const month = resolveHijriMonthId(raw.month);\n return { day, month, year };\n}\n\nexport function normalizeDocument2Meta(value: unknown): Document2Meta {\n if (typeof value !== 'object' || value === null) {\n return emptyDocument2Meta();\n }\n const raw = value as Record<string, unknown>;\n return {\n title: typeof raw.title === 'string' ? raw.title : '',\n authors: typeof raw.authors === 'string' ? raw.authors : '',\n date: normalizeDocument2HijriDate(raw.date),\n abstract: typeof raw.abstract === 'string' ? raw.abstract : '',\n };\n}\n\nexport type Document2MetaProp = Partial<Omit<Document2Meta, 'date'>> & {\n date?: Partial<Document2HijriDate>;\n};\n\n/** Prop fills gaps; JSON wins only when the key is present on the JSON object. */\nexport function mergeDocument2Meta(fromJson: unknown, fromProp?: Document2MetaProp): Document2Meta {\n const fromPropMeta: Document2Meta = {\n title: typeof fromProp?.title === 'string' ? fromProp.title : '',\n authors: typeof fromProp?.authors === 'string' ? fromProp.authors : '',\n abstract: typeof fromProp?.abstract === 'string' ? fromProp.abstract : '',\n date: fromProp?.date\n ? normalizeDocument2HijriDate({ ...DEFAULT_HIJRI_DATE, ...fromProp.date })\n : { ...DEFAULT_HIJRI_DATE },\n };\n if (typeof fromJson !== 'object' || fromJson === null) {\n return fromPropMeta;\n }\n const json = fromJson as Record<string, unknown>;\n return {\n title: 'title' in json && typeof json.title === 'string' ? json.title : fromPropMeta.title,\n authors: 'authors' in json && typeof json.authors === 'string' ? json.authors : fromPropMeta.authors,\n abstract: 'abstract' in json && typeof json.abstract === 'string' ? json.abstract : fromPropMeta.abstract,\n date: 'date' in json ? normalizeDocument2HijriDate(json.date) : fromPropMeta.date,\n };\n}\n\n/** For live Document2Node meta: prop fills empty title/authors/abstract; date patch merges. */\nexport function fillDocument2MetaGaps(current: Document2Meta, fromProp?: Document2MetaProp): Document2Meta {\n if (!fromProp) {\n return cloneDocument2Meta(current);\n }\n return {\n title: current.title.trim().length > 0 ? current.title : typeof fromProp.title === 'string' ? fromProp.title : current.title,\n authors:\n current.authors.trim().length > 0\n ? current.authors\n : typeof fromProp.authors === 'string'\n ? fromProp.authors\n : current.authors,\n abstract:\n current.abstract.trim().length > 0\n ? current.abstract\n : typeof fromProp.abstract === 'string'\n ? fromProp.abstract\n : current.abstract,\n date: fromProp.date\n ? normalizeDocument2HijriDate({ ...current.date, ...fromProp.date })\n : { ...current.date },\n };\n}\n\nexport function document2HasMaketitle(meta: Document2Meta): boolean {\n return meta.title.trim().length > 0 || meta.authors.trim().length > 0;\n}\n\nexport function document2HasAbstract(meta: Document2Meta): boolean {\n return meta.abstract.trim().length > 0;\n}\n\nexport function document2HasTitleStack(meta: Document2Meta): boolean {\n return document2HasMaketitle(meta) || document2HasAbstract(meta);\n}\n\nexport type FormatHijriDateOptions = {\n locale?: ButexUiLocale;\n digitForm?: DigitFormId;\n};\n\nexport function formatHijriDate(date: Document2HijriDate, options: FormatHijriDateOptions | ButexUiLocale = 'ar'): string {\n const opts: FormatHijriDateOptions = typeof options === 'string' ? { locale: options } : options;\n const locale = opts.locale ?? 'ar';\n const digitForm: DigitFormId =\n opts.digitForm ?? (locale === 'en' ? 'western' : 'arabicIndic');\n const month = hijriMonthLabel(date.month, locale);\n const day = formatDigits(String(date.day), digitForm);\n const year = formatDigits(String(date.year), digitForm);\n if (locale === 'en') {\n return `${day} ${month} ${year} AH`;\n }\n return `${day} ${month} ${year}هـ`;\n}\n\nexport function cloneDocument2Meta(meta: Document2Meta): Document2Meta {\n return {\n title: meta.title,\n authors: meta.authors,\n date: { ...meta.date },\n abstract: meta.abstract,\n };\n}\n","import { formatDigits } from '../editor/digits.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { FormatCiteLabelOptions, Reference2, Reference2Json } from './types.js';\nimport { document2Id } from './ids.js';\n\nexport function referenceNumberMap(references: Array<Pick<Reference2, 'key'>>): Map<string, number> {\n const map = new Map<string, number>();\n references.forEach((reference, index) => {\n if (!map.has(reference.key)) {\n map.set(reference.key, index + 1);\n }\n });\n return map;\n}\n\nexport function resolveCiteNumbers(keys: string[], references: Array<Pick<Reference2, 'key'>>): Array<number | null> {\n const map = referenceNumberMap(references);\n return keys.map((key) => map.get(key) ?? null);\n}\n\nexport function formatCiteLabel(\n keys: string[],\n references: Array<Pick<Reference2, 'key'>>,\n options: FormatCiteLabelOptions = {},\n): string {\n const documentDirection = options.documentDirection ?? 'rtl';\n const digitForm: DigitFormId = options.digitForm ?? (documentDirection === 'rtl' ? 'arabicIndic' : 'western');\n const numbers = resolveCiteNumbers(keys, references).map((value) => (value === null ? '?' : String(value)));\n const display = documentDirection === 'rtl' ? [...numbers].reverse() : numbers;\n const separator = documentDirection === 'rtl' ? '،' : ', ';\n const body = display.map((part) => formatDigits(part, digitForm)).join(separator);\n return `[${body}]`;\n}\n\nexport function formatBibliographyNumber(index: number, options: FormatCiteLabelOptions = {}): string {\n const documentDirection = options.documentDirection ?? 'rtl';\n const digitForm: DigitFormId = options.digitForm ?? (documentDirection === 'rtl' ? 'arabicIndic' : 'western');\n return formatDigits(String(index), digitForm);\n}\n\nexport function parseCiteKeys(source: string): string[] {\n const match = /^\\\\cite\\{([^}]*)\\}$/.exec(source.trim());\n if (!match) {\n return [];\n }\n return (match[1] ?? '')\n .split(',')\n .map((key) => key.trim())\n .filter((key) => key.length > 0);\n}\n\nexport function citeTokenLatex(keys: string[]): string {\n return `\\\\cite{${keys.join(',')}}`;\n}\n\nexport function referenceFromJson(json: Reference2Json): Reference2 {\n return {\n id: document2Id('ref'),\n key: json.key,\n authors: typeof json.authors === 'string' ? json.authors : '',\n title: typeof json.title === 'string' ? json.title : '',\n year: typeof json.year === 'string' ? json.year : '',\n url: typeof json.url === 'string' ? json.url : '',\n venue: typeof json.venue === 'string' ? json.venue : '',\n };\n}\n\nexport function createEmptyReference2(partial: Partial<Reference2Json> = {}): Reference2 {\n return referenceFromJson({\n key: partial.key ?? `ref${String(Date.now()).slice(-4)}`,\n authors: partial.authors,\n title: partial.title,\n year: partial.year,\n url: partial.url,\n venue: partial.venue,\n });\n}\n\nexport function bibliographyEntryLatex(reference: Reference2): string {\n const parts = [reference.authors, reference.title, reference.venue, reference.year].filter((part) => part.trim().length > 0);\n const body = parts.join(', ');\n const url = reference.url.trim().length > 0 ? ` \\\\url{${reference.url}}` : '';\n return `\\\\bibitem{${reference.key}} ${body}${url}`.trim();\n}\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 { formatDigits } from '../editor/digits.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type {\n Document2Block,\n Document2Direction,\n Document2Node,\n FormatCiteLabelOptions,\n ImageBlock2,\n InlineField2,\n MathToken2,\n TableBlock2,\n} from './types.js';\n\nexport type Document2LabelKind = 'fig' | 'tab' | 'eq';\n\nexport type Document2LabelEntry = {\n key: string;\n kind: Document2LabelKind;\n caption: string;\n /** Block id for fig/tab, or math token id for eq. */\n ownerId: string;\n number: number;\n};\n\nexport type FloatMetaPatch = {\n centered?: boolean;\n captionEnabled?: boolean;\n caption?: string;\n labelEnabled?: boolean;\n label?: string;\n};\n\nexport function defaultFloatMeta(): {\n centered: true;\n captionEnabled: false;\n caption: '';\n labelEnabled: false;\n label: '';\n} {\n return {\n centered: true,\n captionEnabled: false,\n caption: '',\n labelEnabled: false,\n label: '',\n };\n}\n\nexport function parseFloatMetaFromJson(json: {\n caption?: string;\n label?: string;\n caption_enabled?: boolean;\n label_enabled?: boolean;\n centered?: boolean;\n}): {\n centered: boolean;\n captionEnabled: boolean;\n caption: string;\n labelEnabled: boolean;\n label: string;\n} {\n const caption = typeof json.caption === 'string' ? json.caption : '';\n const label = typeof json.label === 'string' ? json.label : '';\n return {\n centered: json.centered !== false,\n captionEnabled: json.caption_enabled === true || (typeof json.caption_enabled !== 'boolean' && caption.length > 0),\n caption,\n labelEnabled: json.label_enabled === true || (typeof json.label_enabled !== 'boolean' && label.trim().length > 0),\n label,\n };\n}\n\nexport function parseRefKeys(source: string): { keys: string[]; refCommand: 'ref' | 'eqref' } {\n const eqref = /^\\\\eqref\\{([^}]*)\\}$/.exec(source.trim());\n if (eqref) {\n return {\n refCommand: 'eqref',\n keys: (eqref[1] ?? '')\n .split(',')\n .map((key) => key.trim())\n .filter((key) => key.length > 0),\n };\n }\n const ref = /^\\\\ref\\{([^}]*)\\}$/.exec(source.trim());\n if (ref) {\n return {\n refCommand: 'ref',\n keys: (ref[1] ?? '')\n .split(',')\n .map((key) => key.trim())\n .filter((key) => key.length > 0),\n };\n }\n return { keys: [], refCommand: 'ref' };\n}\n\nexport function refTokenLatex(keys: string[], refCommand: 'ref' | 'eqref'): string {\n const command = refCommand === 'eqref' ? '\\\\eqref' : '\\\\ref';\n return `${command}{${keys.join(',')}}`;\n}\n\n/** Collect enabled labels in document order, numbering per kind. */\nexport function collectDocument2Labels(document: Document2Node): Document2LabelEntry[] {\n const entries: Document2LabelEntry[] = [];\n const counters: Record<Document2LabelKind, number> = { fig: 0, tab: 0, eq: 0 };\n\n function pushEqFromField(tokens: MathToken2[] | InlineField2['tokens']): void {\n for (const token of tokens) {\n if (token.kind !== 'math') {\n continue;\n }\n if (token.display && token.labelEnabled && token.label && token.label.trim().length > 0) {\n counters.eq += 1;\n entries.push({\n key: token.label.trim(),\n kind: 'eq',\n caption: '',\n ownerId: token.id,\n number: counters.eq,\n });\n }\n }\n }\n\n function walk(blocks: Document2Block[]): void {\n for (const block of blocks) {\n if (block.kind === 'image' && block.labelEnabled && block.label.trim().length > 0) {\n counters.fig += 1;\n entries.push({\n key: block.label.trim(),\n kind: 'fig',\n caption: block.captionEnabled ? block.caption : '',\n ownerId: block.id,\n number: counters.fig,\n });\n }\n if (block.kind === 'table') {\n if (block.labelEnabled && block.label.trim().length > 0) {\n counters.tab += 1;\n entries.push({\n key: block.label.trim(),\n kind: 'tab',\n caption: block.captionEnabled ? block.caption : '',\n ownerId: block.id,\n number: counters.tab,\n });\n }\n for (const row of block.rows) {\n for (const cell of row) {\n pushEqFromField(cell.tokens);\n }\n }\n }\n if (block.kind === 'textBlock') {\n pushEqFromField(block.field.tokens);\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n pushEqFromField(item.field.tokens);\n walk(item.blocks);\n }\n }\n }\n }\n\n walk(document.blocks);\n return entries;\n}\n\nexport function labelNumberMap(document: Document2Node): Map<string, { kind: Document2LabelKind; number: number }> {\n const map = new Map<string, { kind: Document2LabelKind; number: number }>();\n for (const entry of collectDocument2Labels(document)) {\n if (!map.has(entry.key)) {\n map.set(entry.key, { kind: entry.kind, number: entry.number });\n }\n }\n return map;\n}\n\nexport function formatRefLabel(\n keys: string[],\n document: Document2Node,\n refCommand: 'ref' | 'eqref',\n options: FormatCiteLabelOptions = {},\n): string {\n const documentDirection: Document2Direction = options.documentDirection ?? 'rtl';\n const digitForm: DigitFormId = options.digitForm ?? (documentDirection === 'rtl' ? 'arabicIndic' : 'western');\n const map = labelNumberMap(document);\n const parts = keys.map((key) => {\n const hit = map.get(key);\n if (!hit) {\n return '?';\n }\n return formatDigits(String(hit.number), digitForm);\n });\n const body = parts.join(documentDirection === 'rtl' ? '،' : ', ');\n if (refCommand === 'eqref') {\n return `(${body})`;\n }\n return body;\n}\n\nexport function stripDisplayMathDelimiters(source: string): string {\n const trimmed = source.trim();\n if (trimmed.startsWith('\\\\[') && trimmed.endsWith('\\\\]')) {\n return trimmed.slice(2, -2).trim();\n }\n if (trimmed.startsWith('$$') && trimmed.endsWith('$$')) {\n return trimmed.slice(2, -2).trim();\n }\n if (trimmed.startsWith('\\\\begin{equation}') && trimmed.endsWith('\\\\end{equation}')) {\n return trimmed.slice('\\\\begin{equation}'.length, -'\\\\end{equation}'.length).trim();\n }\n return trimmed;\n}\n\nexport function applyFloatMetaPatch<T extends ImageBlock2 | TableBlock2>(block: T, patch: FloatMetaPatch): void {\n if (typeof patch.centered === 'boolean') {\n block.centered = patch.centered;\n }\n if (typeof patch.captionEnabled === 'boolean') {\n block.captionEnabled = patch.captionEnabled;\n }\n if (typeof patch.caption === 'string') {\n block.caption = patch.caption;\n }\n if (typeof patch.labelEnabled === 'boolean') {\n block.labelEnabled = patch.labelEnabled;\n }\n if (typeof patch.label === 'string') {\n block.label = patch.label;\n }\n}\n","import type { DetectedInlineSpan2, DetectedMathSpan2 } from './types.js';\nimport { parseCiteKeys } from './citations.js';\nimport { parseRefKeys } from './labels.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 environmentSpan(value: string, start: number): DetectedMathSpan2 | 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 { start, end, source: value.slice(start, end), opening, closing, display: true };\n}\n\nfunction citeSpan(value: string, start: number): DetectedInlineSpan2 | null {\n if (!value.startsWith('\\\\cite{', start) || isEscaped(value, start)) {\n return null;\n }\n const openBrace = start + '\\\\cite'.length;\n if (value[openBrace] !== '{') {\n return null;\n }\n let depth = 0;\n for (let i = openBrace; i < value.length; i += 1) {\n const char = value[i];\n if (char === '{' && !isEscaped(value, i)) {\n depth += 1;\n continue;\n }\n if (char === '}' && !isEscaped(value, i)) {\n depth -= 1;\n if (depth === 0) {\n const end = i + 1;\n const source = value.slice(start, end);\n return { kind: 'cite', start, end, source, keys: parseCiteKeys(source) };\n }\n }\n }\n return null;\n}\n\nfunction refSpan(value: string, start: number): DetectedInlineSpan2 | null {\n const eqrefPrefix = '\\\\eqref{';\n const refPrefix = '\\\\ref{';\n let refCommand: 'ref' | 'eqref' = 'ref';\n let prefix = refPrefix;\n if (value.startsWith(eqrefPrefix, start) && !isEscaped(value, start)) {\n refCommand = 'eqref';\n prefix = eqrefPrefix;\n } else if (value.startsWith(refPrefix, start) && !isEscaped(value, start)) {\n refCommand = 'ref';\n prefix = refPrefix;\n } else {\n return null;\n }\n\n const openBrace = start + prefix.length - 1;\n if (value[openBrace] !== '{') {\n return null;\n }\n let depth = 0;\n for (let i = openBrace; i < value.length; i += 1) {\n const char = value[i];\n if (char === '{' && !isEscaped(value, i)) {\n depth += 1;\n continue;\n }\n if (char === '}' && !isEscaped(value, i)) {\n depth -= 1;\n if (depth === 0) {\n const end = i + 1;\n const source = value.slice(start, end);\n const parsed = parseRefKeys(source);\n return { kind: 'ref', start, end, source, keys: parsed.keys, refCommand };\n }\n }\n }\n return null;\n}\n\nfunction mathSpanAt(value: string, i: number): DetectedMathSpan2 | null {\n if (value.startsWith('\\\\begin{', i)) {\n return environmentSpan(value, i);\n }\n\n if (value.startsWith('\\\\(', i)) {\n const close = value.indexOf('\\\\)', i + 2);\n if (close >= 0) {\n const end = close + 2;\n return { start: i, end, source: value.slice(i, end), opening: '\\\\(', closing: '\\\\)', display: false };\n }\n }\n\n if (value.startsWith('\\\\[', i)) {\n const close = value.indexOf('\\\\]', i + 2);\n if (close >= 0) {\n const end = close + 2;\n return { start: i, end, source: value.slice(i, end), opening: '\\\\[', closing: '\\\\]', display: true };\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 return { start: i, end, source: value.slice(i, end), opening: '$$', closing: '$$', display: true };\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 return { start: i, end, source: value.slice(i, end), opening: '$', closing: '$', display: false };\n }\n }\n\n return null;\n}\n\n/** Math-only spans (used for math_objects alignment counts). */\nexport function detectMathSpans2(value: string): DetectedMathSpan2[] {\n return detectInlineSpans2(value)\n .filter((span): span is DetectedInlineSpan2 & { kind: 'math' } => span.kind === 'math')\n .map(({ kind: _kind, ...span }) => span);\n}\n\n/** Left-to-right math + \\\\cite + \\\\ref/\\\\eqref spans without overlap. */\nexport function detectInlineSpans2(value: string): DetectedInlineSpan2[] {\n const spans: DetectedInlineSpan2[] = [];\n let i = 0;\n\n while (i < value.length) {\n const cite = citeSpan(value, i);\n if (cite) {\n spans.push(cite);\n i = cite.end;\n continue;\n }\n\n const ref = refSpan(value, i);\n if (ref) {\n spans.push(ref);\n i = ref.end;\n continue;\n }\n\n const math = mathSpanAt(value, i);\n if (math) {\n spans.push({ kind: 'math', ...math });\n i = math.end;\n continue;\n }\n\n i += 1;\n }\n\n return spans;\n}\n","import { fromMathObjectJson } from '../document/mathObject.js';\nimport { normalizeDocument2Meta, emptyDocument2Meta } from './articleMeta.js';\nimport { referenceFromJson } from './citations.js';\nimport { document2Id } from './ids.js';\nimport { detectInlineSpans2, detectMathSpans2 } from './inlineScanner.js';\nimport { parseFloatMetaFromJson } from './labels.js';\nimport type {\n BibliographyBlock2,\n Document2Block,\n Document2BlockJson,\n Document2Diagnostic,\n Document2ListItemJson,\n Document2Node,\n Document2ParseMode,\n ImageBlock2,\n ImportDocument2Options,\n InlineField2,\n InlineToken2,\n ListBlock2,\n ListItem2,\n MathObject2Json,\n RawBlock2,\n Reference2,\n Reference2Json,\n TableBlock2,\n TextBlock2,\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 requireString(value: unknown, message: string): string {\n if (typeof value !== 'string') {\n throw new Error(message);\n }\n return value;\n}\n\nfunction isRecordOfStrings(value: unknown): value is Record<string, string> {\n return isObject(value) && Object.values(value).every((entry) => typeof entry === 'string');\n}\n\nfunction asBlockJson(value: unknown): Document2BlockJson {\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 Document2BlockJson;\n}\n\nfunction pushDiagnostic(diagnostics: Document2Diagnostic[], options: ImportDocument2Options, path: string, message: string): void {\n if (options.strict) {\n throw new Error(message);\n }\n diagnostics.push({ code: 'math_alignment', message, path });\n}\n\nfunction parseReferences(json: unknown): Reference2[] {\n if (!Array.isArray(json)) {\n return [];\n }\n const references: Reference2[] = [];\n for (const entry of json) {\n if (!isObject(entry) || typeof entry.key !== 'string' || entry.key.trim().length === 0) {\n continue;\n }\n references.push(\n referenceFromJson({\n key: entry.key.trim(),\n authors: typeof entry.authors === 'string' ? entry.authors : undefined,\n title: typeof entry.title === 'string' ? entry.title : undefined,\n year: typeof entry.year === 'string' ? entry.year : undefined,\n url: typeof entry.url === 'string' ? entry.url : undefined,\n venue: typeof entry.venue === 'string' ? entry.venue : undefined,\n } satisfies Reference2Json),\n );\n }\n return references;\n}\n\nexport function createInlineField2(\n value = '',\n mathObjects: MathObject2Json[] = [],\n options: ImportDocument2Options = {},\n path = '$',\n diagnostics: Document2Diagnostic[] = [],\n): InlineField2 {\n const mode: Document2ParseMode = options.mode ?? 'english';\n const spans = detectInlineSpans2(value);\n const mathSpans = spans.filter((span) => span.kind === 'math');\n const tokens: InlineToken2[] = [];\n let index = 0;\n let mathObjectIndex = 0;\n\n if (mathObjects.length > 0 && mathObjects.length !== mathSpans.length) {\n pushDiagnostic(diagnostics, options, path, `math_objects count mismatch: detected ${String(mathSpans.length)}, got ${String(mathObjects.length)}`);\n }\n\n for (const span of spans) {\n if (span.start > index) {\n tokens.push({ id: document2Id('text'), kind: 'text', text: value.slice(index, span.start) });\n }\n\n if (span.kind === 'cite') {\n tokens.push({\n id: document2Id('cite'),\n kind: 'cite',\n keys: span.keys.length > 0 ? span.keys : [],\n });\n index = span.end;\n continue;\n }\n\n if (span.kind === 'ref') {\n tokens.push({\n id: document2Id('ref'),\n kind: 'ref',\n keys: span.keys.length > 0 ? span.keys : [],\n refCommand: span.refCommand,\n });\n index = span.end;\n continue;\n }\n\n const mathJson = mathObjects[mathObjectIndex];\n mathObjectIndex += 1;\n if (mathJson && (mathJson.math_mode !== span.opening || mathJson.closing !== span.closing)) {\n pushDiagnostic(diagnostics, options, path, 'math_objects order mismatch');\n }\n\n if (mathJson && mathJson.math_mode === span.opening && mathJson.closing === span.closing) {\n tokens.push({\n id: document2Id('math'),\n kind: 'math',\n display: span.display,\n opening: span.opening,\n closing: span.closing,\n source: span.source,\n sourceSide: mode,\n math: fromMathObjectJson(mathJson, mode),\n editable: true,\n sourceOwner: 'imported-structured',\n });\n } else {\n tokens.push({\n id: document2Id('math'),\n kind: 'math',\n display: span.display,\n opening: span.opening,\n closing: span.closing,\n source: span.source,\n math: null,\n editable: false,\n reason: 'هذه المعادلة محفوظة كنص خام فقط حاليا',\n sourceOwner: 'raw',\n });\n }\n\n index = span.end;\n }\n\n if (index < value.length || tokens.length === 0) {\n tokens.push({ id: document2Id('text'), kind: 'text', text: value.slice(index) });\n }\n\n return { id: document2Id('field'), tokens };\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 parseTextBlock(json: Document2BlockJson, options: ImportDocument2Options, path: string, diagnostics: Document2Diagnostic[]): TextBlock2 {\n const value = requireString(json.value, `${json.command} requires string value`);\n return {\n id: document2Id('block'),\n kind: 'textBlock',\n command: json.command as TextBlock2['command'],\n field: createInlineField2(value, json.math_objects ?? [], options, `${path}.value`, diagnostics),\n ...(json.centered === true ? { centered: true } : {}),\n };\n}\n\nfunction parseListItem(json: Document2ListItemJson, options: ImportDocument2Options, path: string, diagnostics: Document2Diagnostic[]): ListItem2 {\n const value = requireString(json.value, 'Document list item requires string value');\n const blocksJson = Array.isArray(json.blocks) ? json.blocks : [];\n return {\n id: document2Id('item'),\n field: createInlineField2(value, json.math_objects ?? [], options, `${path}.value`, diagnostics),\n blocks: blocksJson.map((block, index) => parseBlock(asBlockJson(block), options, `${path}.blocks[${String(index)}]`, diagnostics)),\n };\n}\n\nfunction parseListBlock(json: Document2BlockJson, options: ImportDocument2Options, path: string, diagnostics: Document2Diagnostic[]): ListBlock2 {\n if (!Array.isArray(json.items)) {\n throw new Error(`${json.command} requires items array`);\n }\n const command = json.command as ListBlock2['command'];\n const closing = closingForList(command);\n return {\n id: document2Id('block'),\n kind: 'list',\n command,\n closing,\n items: json.items.map((item, index) => parseListItem(item, options, `${path}.items[${String(index)}]`, diagnostics)),\n };\n}\n\nfunction parseTableBlock(json: Document2BlockJson, options: ImportDocument2Options, path: string, diagnostics: Document2Diagnostic[]): TableBlock2 {\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, rowIndex) => {\n if (!Array.isArray(row)) {\n throw new Error('\\\\begin{tabular} rows must be arrays');\n }\n return row.map((cell, columnIndex) => {\n const value = requireString(cell, '\\\\begin{tabular} cells must be strings');\n const spanCount = detectMathSpans2(value).length;\n const cellMathObjects = mathObjects.slice(mathObjectIndex, mathObjectIndex + spanCount);\n mathObjectIndex += spanCount;\n return createInlineField2(value, cellMathObjects, options, `${path}.rows[${String(rowIndex)}][${String(columnIndex)}]`, diagnostics);\n });\n });\n\n if (mathObjects.length > 0 && mathObjects.length !== mathObjectIndex) {\n pushDiagnostic(diagnostics, options, path, `math_objects count mismatch: detected ${String(mathObjectIndex)}, got ${String(mathObjects.length)}`);\n }\n\n return {\n id: document2Id('block'),\n kind: 'table',\n command: '\\\\begin{tabular}',\n closing: '\\\\end{tabular}',\n columns: typeof json.columns === 'string' ? json.columns : '',\n rows,\n ...parseFloatMetaFromJson(json),\n };\n}\n\nfunction parseImageBlock(json: Document2BlockJson): ImageBlock2 {\n const assetId = typeof json.asset_id === 'string' && json.asset_id.length > 0 ? json.asset_id : undefined;\n const value =\n assetId !== undefined\n ? typeof json.value === 'string'\n ? json.value\n : ''\n : requireString(json.value, '\\\\includegraphics requires string value');\n return {\n id: document2Id('block'),\n kind: 'image',\n command: '\\\\includegraphics',\n value,\n ...(assetId !== undefined ? { assetId } : {}),\n options: isRecordOfStrings(json.options) ? json.options : {},\n ...parseFloatMetaFromJson(json),\n };\n}\n\nfunction parseRawBlock(json: Document2BlockJson): RawBlock2 {\n return {\n id: document2Id('block'),\n kind: 'raw',\n command: '\\\\raw',\n value: typeof json.value === 'string' ? json.value : '',\n };\n}\n\nfunction parseBibliographyBlock(): BibliographyBlock2 {\n return {\n id: document2Id('block'),\n kind: 'bibliography',\n command: '\\\\begin{thebibliography}',\n closing: '\\\\end{thebibliography}',\n };\n}\n\nfunction parseBlock(json: Document2BlockJson, options: ImportDocument2Options, path: string, diagnostics: Document2Diagnostic[]): Document2Block {\n if (TEXT_COMMANDS.has(json.command)) {\n return parseTextBlock(json, options, path, diagnostics);\n }\n if (LIST_COMMANDS.has(json.command)) {\n return parseListBlock(json, options, path, diagnostics);\n }\n if (json.command === '\\\\begin{tabular}') {\n return parseTableBlock(json, options, path, diagnostics);\n }\n if (json.command === '\\\\includegraphics') {\n return parseImageBlock(json);\n }\n if (json.command === '\\\\begin{thebibliography}' || json.command === '\\\\bibliography') {\n return parseBibliographyBlock();\n }\n if (json.command === '\\\\raw') {\n return parseRawBlock(json);\n }\n return {\n id: document2Id('block'),\n kind: 'raw',\n command: '\\\\raw',\n value: typeof json.value === 'string' ? json.value : json.command,\n };\n}\n\nexport function fromDocumentJson2(json: unknown, options: ImportDocument2Options = {}): Document2Node {\n if (!isObject(json) || json.node_type !== 'DocumentObject') {\n throw new Error('DocumentObject requires node_type \"DocumentObject\"');\n }\n if (!Array.isArray(json.blocks)) {\n throw new Error('DocumentObject requires blocks array');\n }\n\n const diagnostics: Document2Diagnostic[] = [];\n return {\n nodeType: 'DocumentObject',\n meta: normalizeDocument2Meta(json.meta),\n references: parseReferences(json.references),\n blocks: json.blocks.map((block, index) => parseBlock(asBlockJson(block), options, `$.blocks[${String(index)}]`, diagnostics)),\n diagnostics,\n };\n}\n\nexport function createEmptyDocument2(): Document2Node {\n return {\n nodeType: 'DocumentObject',\n meta: emptyDocument2Meta(),\n references: [],\n blocks: [],\n diagnostics: [],\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 ////////////////////// Derivatives ////////////////////////////////\n ad: {\n id: 'ad',\n category: 'derivative',\n englishTex: '\\\\mathrm{d}',\n englishLabel: 'd',\n arabicTex: '\\\\ad',\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' | 'derivative';\nexport type SpacingDirection = 'positive' | 'negative';\n\nexport type AtomicCommandSpec = (typeof ATOMIC_COMMANDS)[AtomicCommandId] & {\n arabicRenderTex?: string;\n englishLabel?: 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 coloneqq: {\n id: 'coloneqq',\n category: 'operators1',\n Tex: '\\\\coloneqq',\n mirror: true,\n Label: '≔',\n title: 'يعرف بأنه يساوي',\n svg_path: null,\n },\n eqqcolon: {\n id: 'eqqcolon',\n category: 'operators1',\n Tex: '\\\\eqqcolon',\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 implies: {\n id: 'implies',\n category: 'operators3',\n Tex: '\\\\implies',\n mirror: true,\n Label: '⇒',\n title: 'يستلزم',\n svg_path: null,\n },\n impliedby: {\n id: 'impliedby',\n category: 'operators3',\n Tex: '\\\\impliedby',\n mirror: true,\n Label: '⇐',\n title: 'مستلزم من',\n svg_path: null,\n },\n iff: {\n id: 'iff',\n category: 'operators3',\n Tex: '\\\\iff',\n mirror: false,\n Label: '⇔',\n title: 'إذا وفقط إذا',\n svg_path: null,\n },\n Longrightarrow: {\n id: 'Longrightarrow',\n category: 'operators3',\n Tex: '\\\\Longrightarrow',\n mirror: true,\n Label: '⟹',\n title: 'سهم مزدوج طويل إلى اليمين',\n svg_path: null,\n },\n Longleftarrow: {\n id: 'Longleftarrow',\n category: 'operators3',\n Tex: '\\\\Longleftarrow',\n mirror: true,\n Label: '⟸',\n title: 'سهم مزدوج طويل إلى اليسار',\n svg_path: null,\n },\n to: {\n id: 'to',\n category: 'operators3',\n Tex: '\\\\to',\n mirror: true,\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 { EditorSide } from './types.js';\n\n/** LTR divide stroke stored on the English tree (reference OperatorObject `/`). */\nexport const DIVIDE_OPERATOR_EN = '/';\n\n/** RTL divide stroke shown on the Arabic editing surface. */\nexport const DIVIDE_OPERATOR_AR = '\\\\';\n\nexport function isDivideOperatorExpr(expr: string): boolean {\n return expr === DIVIDE_OPERATOR_EN || expr === DIVIDE_OPERATOR_AR;\n}\n\nexport function divideOperatorSurfaceExpr(expr: string, side: EditorSide): string {\n if (!isDivideOperatorExpr(expr)) {\n return expr;\n }\n return side === 'arabic' ? DIVIDE_OPERATOR_AR : DIVIDE_OPERATOR_EN;\n}\n\nexport function renderDivideOperatorLatex(side: EditorSide): string {\n return side === 'arabic' ? '\\\\backslash' : DIVIDE_OPERATOR_EN;\n}\n","import type { DigitFormId, EditorChain, EditorNode, EditorSession, EnvColumnAlignment } from './types.js';\nimport { atomicCommandSpec } from './atomicCommands.js';\nimport { atomicOperatorCommandSpec } from './atomicCommandsOperators.js';\nimport { isDivideOperatorExpr, renderDivideOperatorLatex } from './divideOperator.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 if (node.kind === 'operator' && isDivideOperatorExpr(node.expr)) {\n return `${renderDivideOperatorLatex('english')}${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 if (node.kind === 'operator' && isDivideOperatorExpr(node.expr)) {\n return arabicScripts(node, renderDivideOperatorLatex('arabic'), 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 {\n createAtomicCommandNode,\n createDelimiterNode,\n createEditorChain,\n createEditorNode,\n createFracNode,\n} from './factory.js';\nimport type { EditorChain, EditorNode } from './types.js';\n\nconst ARABIC_VAR = 'س';\nconst ENGLISH_VAR = 'x';\n\nfunction mirroredAd(): { english: EditorNode; arabic: EditorNode } {\n const english = createAtomicCommandNode('ad');\n const arabic = createAtomicCommandNode('ad');\n arabic.id = english.id;\n return { english, arabic };\n}\n\nfunction mirroredVar(): { english: EditorNode; arabic: EditorNode } {\n const english = createEditorNode('char', ENGLISH_VAR);\n const arabic = createEditorNode('char', ARABIC_VAR);\n arabic.id = english.id;\n return { english, arabic };\n}\n\nfunction withMirroredSuperscript2(english: EditorNode, arabic: EditorNode): void {\n const englishSup = createEditorChain([createEditorNode('number', '2')]);\n const arabicSup = createEditorChain([createEditorNode('number', '2')]);\n arabicSup.id = englishSup.id;\n arabicSup.nodes[0].id = englishSup.nodes[0].id;\n english.superscript = englishSup;\n arabic.superscript = arabicSup;\n}\n\nfunction syncChainIds(english: EditorChain, arabic: EditorChain): void {\n arabic.id = english.id;\n const limit = Math.min(english.nodes.length, arabic.nodes.length);\n for (let index = 0; index < limit; index += 1) {\n arabic.nodes[index].id = english.nodes[index].id;\n }\n}\n\nfunction syncFracIds(englishFrac: EditorNode, arabicFrac: EditorNode): void {\n arabicFrac.id = englishFrac.id;\n if (englishFrac.numerator && arabicFrac.numerator) {\n syncChainIds(englishFrac.numerator, arabicFrac.numerator);\n }\n if (englishFrac.denominator && arabicFrac.denominator) {\n syncChainIds(englishFrac.denominator, arabicFrac.denominator);\n }\n}\n\n/** Same [ad, var] chain on both sides so every slot is mirrored and editable. */\nfunction buildAdVarChain(): { english: EditorChain; arabic: EditorChain } {\n const ad = mirroredAd();\n const variable = mirroredVar();\n const english = createEditorChain([ad.english, variable.english]);\n const arabic = createEditorChain([ad.arabic, variable.arabic]);\n syncChainIds(english, arabic);\n return { english, arabic };\n}\n\nfunction mirroredEmptyDelimiter(): { english: EditorNode; arabic: EditorNode } {\n const english = createDelimiterNode('', '');\n const arabic = createDelimiterNode('', '');\n arabic.id = english.id;\n if (english.innerExpr && arabic.innerExpr) {\n syncChainIds(english.innerExpr, arabic.innerExpr);\n }\n return { english, arabic };\n}\n\nfunction setMirroredDelimiterInner(\n english: EditorNode,\n arabic: EditorNode,\n pairs: Array<{ english: EditorNode; arabic: EditorNode }>,\n): void {\n const englishInner = createEditorChain(pairs.map((pair) => pair.english));\n const arabicInner = createEditorChain(pairs.map((pair) => pair.arabic));\n syncChainIds(englishInner, arabicInner);\n english.innerExpr = englishInner;\n arabic.innerExpr = arabicInner;\n}\n\n/** Matches \\\\arabdiff{#1}{#2} with default variable س / x in both numerator and denominator. */\nexport function buildFirstDerivativeFrac(): { english: EditorNode; arabic: EditorNode } {\n const englishFrac = createFracNode();\n const arabicFrac = createFracNode();\n syncFracIds(englishFrac, arabicFrac);\n\n const numerator = buildAdVarChain();\n const denominator = buildAdVarChain();\n englishFrac.numerator = numerator.english;\n englishFrac.denominator = denominator.english;\n arabicFrac.numerator = numerator.arabic;\n arabicFrac.denominator = denominator.arabic;\n\n return { english: englishFrac, arabic: arabicFrac };\n}\n\n/** Matches \\\\arabddiff{#1}{#2} with mirrored structure on EN and AR. */\nexport function buildSecondDerivativeFrac(): { english: EditorNode; arabic: EditorNode } {\n const englishFrac = createFracNode();\n const arabicFrac = createFracNode();\n syncFracIds(englishFrac, arabicFrac);\n\n const numAd = mirroredAd();\n const numVar = mirroredVar();\n withMirroredSuperscript2(numAd.english, numAd.arabic);\n const englishNumerator = createEditorChain([numAd.english, numVar.english]);\n const arabicNumerator = createEditorChain([numAd.arabic, numVar.arabic]);\n syncChainIds(englishNumerator, arabicNumerator);\n englishFrac.numerator = englishNumerator;\n arabicFrac.numerator = arabicNumerator;\n\n const denGroup = mirroredEmptyDelimiter();\n const denInnerAd = mirroredAd();\n const denInnerVar = mirroredVar();\n setMirroredDelimiterInner(denGroup.english, denGroup.arabic, [\n { english: denInnerAd.english, arabic: denInnerAd.arabic },\n { english: denInnerVar.english, arabic: denInnerVar.arabic },\n ]);\n withMirroredSuperscript2(denGroup.english, denGroup.arabic);\n\n englishFrac.denominator = createEditorChain([denGroup.english]);\n arabicFrac.denominator = createEditorChain([denGroup.arabic]);\n syncChainIds(englishFrac.denominator, arabicFrac.denominator);\n\n return { english: englishFrac, arabic: arabicFrac };\n}\n\n/** Caret index on an [ad, var] chain — slot before the variable char. */\nexport const DERIVATIVE_TEMPLATE_VAR_CARET_INDEX = 1;\n\nexport function derivativeTemplateInitialCaret(englishFrac: EditorNode): { chainId: string; index: number } {\n const denominator = englishFrac.denominator;\n if (!denominator) {\n return {\n chainId: englishFrac.numerator?.id ?? '',\n index: DERIVATIVE_TEMPLATE_VAR_CARET_INDEX,\n };\n }\n const loneDelimiter =\n denominator.nodes.length === 1 &&\n denominator.nodes[0]?.kind === 'delimiter' &&\n denominator.nodes[0].innerExpr;\n if (loneDelimiter) {\n return {\n chainId: denominator.nodes[0].innerExpr!.id,\n index: DERIVATIVE_TEMPLATE_VAR_CARET_INDEX,\n };\n }\n return {\n chainId: denominator.id,\n index: DERIVATIVE_TEMPLATE_VAR_CARET_INDEX,\n };\n}\n","import type { AtomicCommandSpec } from './atomicCommands.js';\nimport type { AtomicOperatorCommandSpec } from './atomicCommandsOperators.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\n\nconst ENGLISH_COMMAND_TITLES: Record<string, string> = {\n cos: 'Cosine', sin: 'Sine', tan: 'Tangent', cot: 'Cotangent', sec: 'Secant', csc: 'Cosecant',\n arccos: 'Inverse cosine', arcsin: 'Inverse sine', arctan: 'Inverse tangent', arccot: 'Inverse cotangent',\n arcsec: 'Inverse secant', arccsc: 'Inverse cosecant', cosh: 'Hyperbolic cosine', sinh: 'Hyperbolic sine',\n tanh: 'Hyperbolic tangent', coth: 'Hyperbolic cotangent', sum: 'Sum', prod: 'Product', lim: 'Limit',\n max: 'Maximum', min: 'Minimum', sup: 'Supremum', inf: 'Infimum', pi: 'Pi', exp: 'Exponential',\n ln: 'Natural logarithm', log: 'Logarithm', det: 'Determinant', ad: 'Derivative (d / ad)', N: 'Natural numbers', Z: 'Integers',\n Q: 'Rational numbers', R: 'Real numbers', C: 'Complex numbers', H: 'Quaternions',\n negThinSpace: 'Negative thin space', mediumSpace: 'Medium space', thickSpace: 'Thick space',\n quadSpace: 'Large space', qquadSpace: 'Extra-large space',\n};\n\nconst ENGLISH_OPERATOR_TITLES: Record<string, string> = {\n inf: 'Infinity', times: 'Multiplication', div: 'Division', pm: 'Plus or minus', mp: 'Minus or plus',\n neq: 'Not equal', approx: 'Approximately equal', sim: 'Similar', mid: 'Divides',\n leq: 'Less than or equal', geq: 'Greater than or equal', coloneqq: 'Defined as equal to',\n eqqcolon: 'Equal by definition', propto: 'Proportional to', in: 'Element of', notin: 'Not an element of',\n subset: 'Subset of', supset: 'Superset of', subseteq: 'Subset of or equal', supseteq: 'Superset of or equal',\n cap: 'Intersection', cup: 'Union', emptyset: 'Empty set', nsubseteq: 'Not a subset of or equal',\n nsupseteq: 'Not a superset of or equal', ldots: 'Horizontal dots', cdot: 'Multiplication dot',\n cdots: 'Centered horizontal dots', vdots: 'Vertical dots', ddots: 'Diagonal dots',\n leftrightarrowDouble: 'Equivalent', implies: 'Implies', impliedby: 'Implied by', iff: 'If and only if',\n Longrightarrow: 'Long double arrow right', Longleftarrow: 'Long double arrow left', to: 'Maps to',\n rightleftharpoons: 'Equilibrium', leftarrow: 'Left arrow', rightarrow: 'Right arrow',\n leftarrowDouble: 'Double left arrow', rightarrowDouble: 'Double right arrow',\n leftharpoonup: 'Upper left harpoon', rightharpoonup: 'Upper right harpoon',\n leftharpoondown: 'Lower left harpoon', rightharpoondown: 'Lower right harpoon', int: 'Integral',\n iint: 'Double integral', iiint: 'Triple integral', iiiint: 'Quadruple integral', oint: 'Contour integral',\n oiint: 'Closed surface integral', oiiint: 'Closed volume integral',\n};\n\nexport const EQUATION_EDITOR_MESSAGES = {\n ar: {\n undoRedo: 'تراجع وإعادة', undo: 'تراجع', redo: 'إعادة', clipboard: 'الحافظة', copy: 'نسخ', cut: 'قص', paste: 'لصق',\n editorSettings: 'إعدادات المحرر', toggleSide: 'تبديل عربي / إنجليزي', structures: 'البنى', insertDelimiters: 'إدراج محددات',\n insertParentheses: 'إدراج قوسين', insertBrackets: 'إدراج معقوفين', insertBraces: 'إدراج حاصرتين',\n insertFraction: 'إدراج كسر', insertRoot: 'إدراج جذر', environments: 'البيئات', insertEnvironment: 'إدراج بيئة شبكية',\n environmentType: 'نوع البيئة', matrix: 'مصفوفة', array: 'جدول', aligned: 'محاذاة', matrixType: 'نوع المصفوفة',\n chooseEnvironmentSize: 'اختيار حجم البيئة', rows: 'صفوف', columns: 'أعمدة', row: 'صف', column: 'عمود', insert: 'إدراج',\n editSelectedEnvironment: 'تعديل البيئة المحددة', applySelectedMatrixStyle: 'تطبيق النمط على المصفوفة المحددة',\n applyStyle: 'تطبيق النمط', addRow: 'إضافة صف', removeRow: 'حذف صف', addColumn: 'إضافة عمود', removeColumn: 'حذف عمود',\n spaces: 'الفراغات', insertSpace: 'إدراج فراغ', functions: 'الدوال', insertFunction: 'إدراج دالة',\n insertLimitsSeries: 'إدراج حدود ومتسلسلات', insertAdditionalFunctions: 'إدراج دوال إضافية',\n derivatives: 'الاشتقاق', insertDerivative: 'إدراج علامة اشتقاق',\n insertFirstDerivative: 'إدراج اشتقاق أول', insertSecondDerivative: 'إدراج اشتقاق ثاني',\n insertNumberSets: 'إدراج مجموعات أعداد', operations: 'العمليات', insertOperation: 'إدراج رمز عملية',\n insertRelationsSets: 'إدراج رموز علاقات ومجموعات', insertArrows: 'إدراج أسهم', insertDots: 'إدراج نقاط',\n insertIntegrals: 'إدراج تكاملات', scripts: 'الأس والسفلي', addSuperscript: 'إضافة أس', addSubscript: 'إضافة سفلي',\n removeSuperscript: 'إزالة الأس', removeSubscript: 'إزالة السفلي', inputStyles: 'أنماط الإدخال',\n deleteSelectedStructure: 'حذف البنية المحددة', toggleLetterMerging: 'تبديل دمج الحروف', disableLetterMerging: 'تعطيل دمج الحروف',\n enableLetterMerging: 'تفعيل دمج الحروف', chooseWritingFont: 'اختيار خط الكتابة', chooseDigitForm: 'اختيار شكل الأرقام',\n defaultFont: 'الخط الافتراضي', takweenFont: 'خط تكوين', diwaniFont: 'خط ديواني', diwaniOutlineFont: 'خط ديواني مظلل',\n writeDefaultFont: 'الكتابة بالخط الافتراضي', writeTakweenFont: 'الكتابة بخط تكوين', westernDigits: 'أرقام غربية',\n arabicIndicDigits: 'أرقام عربية هندية', persianIndicDigits: 'أرقام فارسية هندية', equationEditor: 'محرر المعادلات',\n renderPreview: 'معاينة الرسم', development: 'تطوير', showDebugLog: 'إظهار سجل التصحيح', hideDebugLog: 'إخفاء سجل التصحيح',\n copyDebugLog: 'نسخ سجل التصحيح', empty: 'فارغ', englishLatex: 'LaTeX إنجليزي', arabicLatex: 'LaTeX عربي',\n inactiveEnglish: 'السلسلة غير النشطة (إنجليزي)', inactiveArabic: 'السلسلة غير النشطة (عربي)',\n mathJaxError: 'خطأ MathJax', previewError: 'خطأ في المعاينة', activeSide: 'الجانب النشط', syncState: 'حالة المزامنة',\n arabicSide: 'العربية', englishSide: 'الإنجليزية', synced: 'متزامن', differentItems: 'عناصر مختلفة',\n alignLeft: 'يسار', alignCenter: 'وسط', alignRight: 'يمين', alignColumnLeft: 'محاذاة العمود إلى اليسار',\n alignColumnCenter: 'محاذاة العمود في الوسط', alignColumnRight: 'محاذاة العمود إلى اليمين',\n matrixNoDelimiters: 'مصفوفة بلا أقواس', matrixParentheses: 'مصفوفة بين قوسين', matrixBrackets: 'مصفوفة بين معقوفين',\n matrixBraces: 'مصفوفة بين حاصرتين', matrixBars: 'مصفوفة بين خطين', matrixDoubleBars: 'مصفوفة بين خطين مزدوجين',\n },\n en: {\n undoRedo: 'Undo and redo', undo: 'Undo', redo: 'Redo', clipboard: 'Clipboard', copy: 'Copy', cut: 'Cut', paste: 'Paste',\n editorSettings: 'Editor settings', toggleSide: 'Switch Arabic / English equation side', structures: 'Structures',\n insertDelimiters: 'Insert delimiters', insertParentheses: 'Insert parentheses', insertBrackets: 'Insert brackets', insertBraces: 'Insert braces',\n insertFraction: 'Insert fraction', insertRoot: 'Insert root', environments: 'Environments', insertEnvironment: 'Insert grid environment',\n environmentType: 'Environment type', matrix: 'Matrix', array: 'Array', aligned: 'Aligned', matrixType: 'Matrix type',\n chooseEnvironmentSize: 'Choose environment size', rows: 'Rows', columns: 'Columns', row: 'Row', column: 'Column', insert: 'Insert',\n editSelectedEnvironment: 'Edit selected environment', applySelectedMatrixStyle: 'Apply style to selected matrix', applyStyle: 'Apply style',\n addRow: 'Add row', removeRow: 'Remove row', addColumn: 'Add column', removeColumn: 'Remove column', spaces: 'Spacing',\n insertSpace: 'Insert space', functions: 'Functions', insertFunction: 'Insert function', insertLimitsSeries: 'Insert limits and series',\n insertAdditionalFunctions: 'Insert additional functions', derivatives: 'Derivatives', insertDerivative: 'Insert derivative marker',\n insertFirstDerivative: 'Insert first derivative', insertSecondDerivative: 'Insert second derivative',\n insertNumberSets: 'Insert number sets', operations: 'Operators',\n insertOperation: 'Insert operator', insertRelationsSets: 'Insert relation or set symbol', insertArrows: 'Insert arrow',\n insertDots: 'Insert dots', insertIntegrals: 'Insert integral', scripts: 'Superscript and subscript', addSuperscript: 'Add superscript',\n addSubscript: 'Add subscript', removeSuperscript: 'Remove superscript', removeSubscript: 'Remove subscript', inputStyles: 'Input styles',\n deleteSelectedStructure: 'Delete selected structure', toggleLetterMerging: 'Toggle letter merging', disableLetterMerging: 'Disable letter merging',\n enableLetterMerging: 'Enable letter merging', chooseWritingFont: 'Choose writing font', chooseDigitForm: 'Choose digit form',\n defaultFont: 'Default font', takweenFont: 'Takween font', diwaniFont: 'Diwani font', diwaniOutlineFont: 'Outlined Diwani font',\n writeDefaultFont: 'Write with the default font', writeTakweenFont: 'Write with Takween font', westernDigits: 'Western digits',\n arabicIndicDigits: 'Arabic-Indic digits', persianIndicDigits: 'Persian digits', equationEditor: 'Equation editor',\n renderPreview: 'Rendered preview', development: 'Development', showDebugLog: 'Show debug log', hideDebugLog: 'Hide debug log',\n copyDebugLog: 'Copy debug log', empty: 'Empty', englishLatex: 'English LaTeX', arabicLatex: 'Arabic LaTeX',\n inactiveEnglish: 'Inactive chain (English)', inactiveArabic: 'Inactive chain (Arabic)', mathJaxError: 'MathJax error',\n previewError: 'Preview error', activeSide: 'Active side', syncState: 'Sync state', arabicSide: 'Arabic', englishSide: 'English',\n synced: 'Synced', differentItems: 'different items', alignLeft: 'Left', alignCenter: 'Center', alignRight: 'Right',\n alignColumnLeft: 'Align column left', alignColumnCenter: 'Align column center', alignColumnRight: 'Align column right',\n matrixNoDelimiters: 'Matrix without delimiters', matrixParentheses: 'Matrix in parentheses', matrixBrackets: 'Matrix in brackets',\n matrixBraces: 'Matrix in braces', matrixBars: 'Matrix between bars', matrixDoubleBars: 'Matrix between double bars',\n },\n} as const;\n\nexport type EquationEditorMessages = (typeof EQUATION_EDITOR_MESSAGES)['ar'] | (typeof EQUATION_EDITOR_MESSAGES)['en'];\n\nexport function equationEditorMessages(locale: ButexUiLocale): EquationEditorMessages {\n return EQUATION_EDITOR_MESSAGES[locale];\n}\n\nexport function atomicCommandTitle(spec: AtomicCommandSpec, locale: ButexUiLocale): string {\n return locale === 'en' ? ENGLISH_COMMAND_TITLES[spec.id] ?? spec.title : spec.title;\n}\n\nexport function atomicOperatorCommandTitle(spec: AtomicOperatorCommandSpec, locale: ButexUiLocale): string {\n return locale === 'en' ? ENGLISH_OPERATOR_TITLES[spec.id] ?? spec.title : spec.title;\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 { buildFirstDerivativeFrac, buildSecondDerivativeFrac, derivativeTemplateInitialCaret } from './derivativeTemplates.js';\nimport { DIVIDE_OPERATOR_AR, DIVIDE_OPERATOR_EN } from './divideOperator.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 { ButexUiLocale } from '../uiLocale.js';\nimport { equationEditorMessages } from './uiLocale.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 insertDivideOperator(session: EditorSession): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const englishNode = createEditorNode('operator', DIVIDE_OPERATOR_EN);\n const arabicNode = createEditorNode('operator', DIVIDE_OPERATOR_AR);\n arabicNode.id = englishNode.id;\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n markExprSync(next, englishNode.id);\n next.caret.index += 1;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertDivideOperator', '');\n return next;\n}\n\nexport function insertOperator(session: EditorSession, expr: string): EditorSession {\n if (expr === '.' && !session.splitLeafTyping && precedingIsExtendableNumber(session)) {\n return insertNumber(session, '.');\n }\n if (expr === DIVIDE_OPERATOR_EN || expr === DIVIDE_OPERATOR_AR) {\n return insertDivideOperator(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\nfunction insertDerivativeFrac(\n session: EditorSession,\n build: () => { english: EditorNode; arabic: EditorNode },\n debugLabel: string,\n): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const { english, arabic } = build();\n insertMirroredNode(next, next.caret.chainId, next.caret.index, english, arabic);\n syncSubtreeRecursive(next, english, arabic);\n next.caret = derivativeTemplateInitialCaret(english);\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, debugLabel, '');\n return next;\n}\n\nexport function insertFirstDerivative(session: EditorSession): EditorSession {\n return insertDerivativeFrac(session, buildFirstDerivativeFrac, 'insertFirstDerivative');\n}\n\nexport function insertSecondDerivative(session: EditorSession): EditorSession {\n return insertDerivativeFrac(session, buildSecondDerivativeFrac, 'insertSecondDerivative');\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, uiLocale: ButexUiLocale = 'ar'): string {\n const messages = equationEditorMessages(uiLocale);\n const diverged = Object.values(session.sync).filter((entry) => entry.expr === 'diverged').length;\n if (diverged === 0) {\n return messages.synced;\n }\n return uiLocale === 'ar' ? `يوجد ${String(diverged)} ${messages.differentItems}` : `${String(diverged)} ${messages.differentItems}`;\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, uiLocale: ButexUiLocale = 'ar'): string {\n const messages = equationEditorMessages(uiLocale);\n return side === 'arabic' ? messages.arabicSide : messages.englishSide;\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 if (ch === DIVIDE_OPERATOR_AR) {\n s = insertDivideOperator(s);\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, EditorSide } from '../types.js';\nimport { divideOperatorSurfaceExpr } from '../divideOperator.js';\nimport { formatDigits } from '../digits.js';\n\nexport function buildBaseNodeBody(\n node: EditorNode,\n digitForm: DigitFormId = 'western',\n side: EditorSide = 'english',\n): 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 const surfaceExpr = node.kind === 'operator' ? divideOperatorSurfaceExpr(node.expr, side) : node.expr;\n value.textContent = surfaceExpr === '' ? '□' : formatDigits(surfaceExpr, 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';\nimport type { ButexUiLocale } from '../../uiLocale.js';\nimport { atomicCommandTitle } from '../uiLocale.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, uiLocale: ButexUiLocale = 'ar'): string {\n return `${atomicCommandTitle(spec, uiLocale)} ${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'\n ? spec?.arabicLabel ?? node.expr\n : spec?.englishLabel ?? spec?.englishTex.replace(/^\\\\/, '') ?? node.expr;\n return value;\n}\n\nfunction buildSpacingAtomicCommandBody(spec: SpacingCommandSpec, side: EditorSide, uiLocale: ButexUiLocale): 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, uiLocale);\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, uiLocale: ButexUiLocale = 'ar'): HTMLElement {\n const spec = atomicCommandSpec(node.expr);\n if (isSpacingCommandSpec(spec)) {\n return buildSpacingAtomicCommandBody(spec, side, uiLocale);\n }\n return buildFunctionAtomicCommandBody(node, side, spec);\n}\n","import { atomicOperatorCommandSpec, shouldMirrorOperatorDisplay, type AtomicOperatorCommandSpec } from '../atomicCommandsOperators.js';\nimport type { EditorNode, EditorSide } from '../types.js';\nimport type { ButexUiLocale } from '../../uiLocale.js';\nimport { atomicOperatorCommandTitle } from '../uiLocale.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, uiLocale: ButexUiLocale = 'ar'): HTMLElement {\n const spec = atomicOperatorCommandSpec(node.expr);\n const value = document.createElement('span');\n value.className = 'atomic-operator-command';\n value.title = spec ? atomicOperatorCommandTitle(spec, uiLocale) : 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';\nimport type { ButexUiLocale } from '../../uiLocale.js';\n\ntype BuildChain = (chain: EditorChain) => HTMLElement;\n\nexport function buildNodeBody(\n node: EditorNode,\n buildChain: BuildChain,\n side: EditorSide,\n digitForm: DigitFormId = 'western',\n uiLocale: ButexUiLocale = 'ar',\n): 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, uiLocale);\n }\n if (node.kind === 'atomicOperatorCommand') {\n return buildAtomicOperatorCommandNodeBody(node, side, uiLocale);\n }\n return buildBaseNodeBody(node, digitForm, side);\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 insertDivideOperator,\n insertFraction,\n insertFirstDerivative,\n insertSecondDerivative,\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, EditorSide, EnvColumnAlignment, MatrixEnvStyle } from './types.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { atomicCommandSpec, isSpacingCommandSpec, type AtomicCommandId } from './atomicCommands.js';\nimport type { AtomicOperatorCommandId } from './atomicCommandsOperators.js';\nimport { equationEditorMessages } from './uiLocale.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 defaultSide?: EditorSide;\n uiLocale?: ButexUiLocale;\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 setUiLocale: (locale: ButexUiLocale) => 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 insertFirstDerivative: () => void;\n insertSecondDerivative: () => 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 let uiLocale = options.uiLocale ?? 'ar';\n if (options.defaultSide) {\n session = { ...session, activeSide: options.defaultSide };\n }\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 const messages = equationEditorMessages(uiLocale);\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 = messages.undo;\n buttonElements.undoBtn.setAttribute('aria-label', messages.undo);\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 = messages.redo;\n buttonElements.redoBtn.setAttribute('aria-label', messages.redo);\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 const messages = equationEditorMessages(uiLocale);\n buttonElements.splitTypingBtn.textContent = mergeOn ? 'سصع' : 'س ص ع';\n buttonElements.splitTypingBtn.title = mergeOn ? messages.disableLetterMerging : messages.enableLetterMerging;\n buttonElements.splitTypingBtn.setAttribute('aria-label', mergeOn ? messages.disableLetterMerging : messages.enableLetterMerging);\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 const messages = equationEditorMessages(uiLocale);\n buttonElements.characterFontBtn.textContent = 'تك';\n buttonElements.characterFontBtn.title = takweenOn ? messages.writeDefaultFont : messages.writeTakweenFont;\n buttonElements.characterFontBtn.setAttribute('aria-label', takweenOn ? messages.writeDefaultFont : messages.writeTakweenFont);\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 const messages = equationEditorMessages(uiLocale);\n buttonElements.digitFormBtn.title = messages.chooseDigitForm;\n buttonElements.digitFormBtn.setAttribute('aria-label', messages.chooseDigitForm);\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, uiLocale);\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', uiLocale));\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 (char === '\\\\') {\n applyStructural((prev) => insertDivideOperator(prev));\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 setUiLocale: (locale) => {\n if (uiLocale === locale) {\n return;\n }\n uiLocale = locale;\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 insertFirstDerivative: () => {\n applyStructural((prev) => insertFirstDerivative(prev));\n surfaceEl.focus();\n },\n insertSecondDerivative: () => {\n applyStructural((prev) => insertSecondDerivative(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, uiLocale: ButexUiLocale = 'ar'): { activeSide: string; sync: string } {\n const messages = equationEditorMessages(uiLocale);\n return {\n activeSide: `${messages.activeSide}: ${activeSideLabel(session.activeSide, uiLocale)}`,\n sync: `${messages.syncState}: ${syncStateSummary(session, uiLocale)}`,\n };\n}\n","import type { CharacterFontId } from '../editor/types.js';\n\nexport type NormalizedCharImport = {\n expr: string;\n characterFont: CharacterFontId;\n};\n\ntype WrapperSpec = {\n prefix: string;\n font?: CharacterFontId;\n};\n\nconst WRAPPER_SPECS: WrapperSpec[] = [\n { prefix: '\\\\butexdiwanioutline', font: 'diwaniOutline' },\n { prefix: '\\\\diwanioutlineshaded', font: 'diwaniOutline' },\n { prefix: '\\\\butexdiwani', font: 'diwani' },\n { prefix: '\\\\butextakween', font: 'takween' },\n { prefix: '\\\\diwani', font: 'diwani' },\n { prefix: '\\\\takween', font: 'takween' },\n { prefix: '\\\\text' },\n];\n\nfunction readBracedArg(source: string, openBraceIndex: number): { inner: string; end: number } | null {\n if (source[openBraceIndex] !== '{') {\n return null;\n }\n\n let depth = 0;\n for (let index = openBraceIndex; index < source.length; index += 1) {\n const char = source[index];\n if (char === '{') {\n depth += 1;\n } else if (char === '}') {\n depth -= 1;\n if (depth === 0) {\n return { inner: source.slice(openBraceIndex + 1, index), end: index + 1 };\n }\n }\n }\n\n return null;\n}\n\nfunction peelWrapper(source: string): { inner: string; font?: CharacterFontId } | null {\n for (const wrapper of WRAPPER_SPECS) {\n if (!source.startsWith(wrapper.prefix)) {\n continue;\n }\n\n const braced = readBracedArg(source, wrapper.prefix.length);\n if (!braced || braced.end !== source.length) {\n continue;\n }\n\n return { inner: braced.inner, font: wrapper.font };\n }\n\n return null;\n}\n\nexport function normalizeCharImportExpr(expr: string): NormalizedCharImport {\n const original = expr;\n let current = expr;\n let characterFont: CharacterFontId = 'default';\n let changed = false;\n\n while (true) {\n const peeled = peelWrapper(current);\n if (!peeled) {\n break;\n }\n\n current = peeled.inner;\n if (peeled.font) {\n characterFont = peeled.font;\n }\n changed = true;\n }\n\n if (!changed) {\n return { expr: original, characterFont: 'default' };\n }\n\n if (current.includes('\\\\')) {\n return { expr: original, characterFont: 'default' };\n }\n\n return { expr: current, characterFont };\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 CharacterFontId,\n EditorChain,\n EditorNode,\n EditorSession,\n EnvColumnAlignment,\n GridEnvName,\n MatrixEnvStyle,\n} from '../editor/index.js';\nimport { normalizeCharImportExpr } from './normalizeCharImport.js';\nimport type { MathNode } from './types.js';\n\ntype CommandFontPolicy = CharacterFontId | 'infer';\n\nconst COMMAND_FONT_MAP: Record<string, CommandFontPolicy> = {\n '\\\\text': 'infer',\n '\\\\butextakween': 'takween',\n '\\\\takween': 'takween',\n '\\\\butexdiwani': 'diwani',\n '\\\\diwani': 'diwani',\n '\\\\butexdiwanioutline': 'diwaniOutline',\n '\\\\diwanioutlineshaded': 'diwaniOutline',\n};\n\nconst CHAR_FONT_EXPORT_TEX: Record<Exclude<CharacterFontId, 'default'>, string> = {\n takween: '\\\\butextakween',\n diwani: '\\\\butexdiwani',\n diwaniOutline: '\\\\butexdiwanioutline',\n};\n\nfunction charEditorNodeToAstNode(node: EditorNode): BaseAstNode {\n const font = node.characterFont ?? 'default';\n const charNode = new CharNode(node.expr);\n if (font === 'default') {\n return charNode;\n }\n return new CommandNode(CHAR_FONT_EXPORT_TEX[font], [], [new ChainNode([charNode])]);\n}\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 charFromTextLikeCommand(node: CommandNode): NodeAdapterResult | null {\n const commandFont = COMMAND_FONT_MAP[node.name];\n if (commandFont === undefined) {\n return null;\n }\n if (node.optionalArgs.length > 0 || node.mandatoryArgs.length !== 1) {\n return null;\n }\n\n const arg = node.mandatoryArgs[0]!;\n if (arg.chain.length !== 1) {\n return null;\n }\n\n const child = arg.chain[0]!;\n if (child instanceof CommandNode) {\n const nested = charFromTextLikeCommand(child);\n if (!nested?.editable) {\n return null;\n }\n if (commandFont !== 'infer') {\n nested.node.characterFont = commandFont;\n }\n const scripts = attachScripts(node, nested.node);\n return scripts ?? nested;\n }\n\n if (!(child instanceof CharNode)) {\n return null;\n }\n\n const normalized = normalizeCharImportExpr(child.expr);\n const characterFont = commandFont === 'infer' ? normalized.characterFont : commandFont;\n const editorNode = createEditorNode('char', normalized.expr);\n if (characterFont !== 'default') {\n editorNode.characterFont = characterFont;\n }\n const scripts = attachScripts(node, editorNode);\n return scripts ?? { editable: true, node: editorNode };\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 const textLike = charFromTextLikeCommand(node);\n if (textLike) {\n return textLike;\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 normalized = normalizeCharImportExpr(node.expr);\n const editorNode = createEditorNode('char', normalized.expr);\n if (normalized.characterFont !== 'default') {\n editorNode.characterFont = normalized.characterFont;\n }\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 = charEditorNodeToAstNode(node);\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 { mathNodeFromEditorSession, mathObjectToEditorSession } from '../document/mathEditorAdapter.js';\nimport type { MathNode } from '../document/types.js';\nimport {\n buildInitialSyncMap,\n createEditorChain,\n createEditorSession,\n renderArabicLatexFromSession,\n renderEnglishLatexFromSession,\n type EditorSide,\n type EditorSession,\n} from '../editor/index.js';\nimport type { MathToken2 } from './types.js';\n\nexport type Document2MathBridgeResult =\n | { editable: true; session: EditorSession }\n | { editable: false; reason: string };\n\nexport function createEmptyEquationSession(side: EditorSide = 'arabic'): EditorSession {\n const english = createEditorChain();\n const arabic = createEditorChain();\n arabic.id = english.id;\n const session = createEditorSession(english, arabic, side);\n session.sync = buildInitialSyncMap(session.englishTree, session.arabicTree);\n return session;\n}\n\nexport function createEmptyArabicEquationSession(): EditorSession {\n return createEmptyEquationSession('arabic');\n}\n\nexport function mathTokenToEditorSession(math: MathNode | null, side: EditorSide = 'arabic'): Document2MathBridgeResult {\n if (!math) {\n return { editable: false, reason: 'هذه المعادلة محفوظة كنص خام فقط حاليا' };\n }\n const result = mathObjectToEditorSession(math);\n if (!result.editable) {\n return result;\n }\n result.session.activeSide = side;\n result.session.sync = buildInitialSyncMap(result.session.englishTree, result.session.arabicTree);\n return result;\n}\n\nexport function mathTokenToArabicEditorSession(math: MathNode | null): Document2MathBridgeResult {\n return mathTokenToEditorSession(math, 'arabic');\n}\n\nexport function mathSourceFromSession(\n session: EditorSession,\n side: EditorSide,\n opening = '$',\n closing = '$',\n): string {\n const inner = side === 'english'\n ? renderEnglishLatexFromSession(session)\n : renderArabicLatexFromSession(session);\n if (opening === '$' || opening === '\\\\(') {\n return opening + inner + closing;\n }\n if (opening === '$$' || opening === '\\\\[') {\n return `${opening}\\n${inner}\\n${closing}`;\n }\n return `${opening}\\n ${inner}\\n${closing}`;\n}\n\nexport function mathSourceFromArabicSession(session: EditorSession, opening = '$', closing = '$'): string {\n return mathSourceFromSession(session, 'arabic', opening, closing);\n}\n\nexport function mathNodeFromSession(session: EditorSession, opening = '$', closing = '$'): MathNode {\n const converted = mathNodeFromEditorSession(session, opening, closing);\n if (converted.ok) {\n return converted.math;\n }\n return { nodeType: 'MathObject', mathMode: opening, lines: [], closing };\n}\n\nexport function mathNodeFromArabicSession(session: EditorSession, opening = '$', closing = '$'): MathNode {\n return mathNodeFromSession(session, opening, closing);\n}\n\nexport function mathTokenSourceForSide(token: MathToken2, side: EditorSide): string {\n if (!token.math || token.sourceOwner === 'raw') {\n return token.source;\n }\n if (token.sourceSide === side) {\n return token.source;\n }\n const result = mathTokenToEditorSession(token.math, side);\n if (!result.editable) {\n return token.source;\n }\n return mathSourceFromSession(result.session, side, token.opening, token.closing);\n}\n","import { document2Id } from './ids.js';\nimport { cloneDocument2Meta, emptyDocument2Meta, normalizeDocument2HijriDate } from './articleMeta.js';\nimport { createEmptyReference2 } from './citations.js';\nimport { createInlineField2 } from './importJson.js';\nimport { applyFloatMetaPatch, defaultFloatMeta, type FloatMetaPatch } from './labels.js';\nimport { mathNodeFromSession, mathSourceFromSession } from './mathBridge.js';\nimport type {\n BibliographyBlock2,\n CiteToken2,\n Document2Block,\n Document2Node,\n ImageBlock2,\n InlineField2,\n InlineToken2,\n ListBlock2,\n MathToken2,\n Reference2,\n Reference2Json,\n RefToken2,\n TableBlock2,\n TextToken2,\n} from './types.js';\nimport type { Document2MetaProp } from './articleMeta.js';\nimport type { EditorSession, EditorSide } from '../editor/index.js';\n\nfunction cloneToken(token: InlineToken2): InlineToken2 {\n return token.kind === 'text' ? { ...token } : { ...token };\n}\n\nfunction cloneField(field: InlineField2): InlineField2 {\n return { id: field.id, tokens: field.tokens.map(cloneToken) };\n}\n\nfunction cloneBlock(block: Document2Block): Document2Block {\n if (block.kind === 'textBlock') {\n return { ...block, field: cloneField(block.field) };\n }\n if (block.kind === 'list') {\n return {\n ...block,\n items: block.items.map((item) => ({\n ...item,\n field: cloneField(item.field),\n blocks: item.blocks.map(cloneBlock),\n })),\n };\n }\n if (block.kind === 'table') {\n return { ...block, rows: block.rows.map((row) => row.map(cloneField)) };\n }\n if (block.kind === 'image') {\n return { ...block, options: { ...block.options } };\n }\n return { ...block };\n}\n\nfunction cloneDocument(document: Document2Node): Document2Node {\n return {\n nodeType: 'DocumentObject',\n meta: cloneDocument2Meta(document.meta ?? emptyDocument2Meta()),\n references: document.references.map((reference) => ({ ...reference })),\n blocks: document.blocks.map(cloneBlock),\n diagnostics: document.diagnostics.map((diagnostic) => ({ ...diagnostic })),\n };\n}\n\nfunction visitFields(blocks: Document2Block[], visitor: (field: InlineField2) => boolean): boolean {\n for (const block of blocks) {\n if (block.kind === 'textBlock') {\n if (visitor(block.field)) {\n return true;\n }\n } else if (block.kind === 'list') {\n for (const item of block.items) {\n if (visitor(item.field) || visitFields(item.blocks, visitor)) {\n return true;\n }\n }\n } else if (block.kind === 'table') {\n for (const row of block.rows) {\n for (const cell of row) {\n if (visitor(cell)) {\n return true;\n }\n }\n }\n }\n }\n return false;\n}\n\nexport function findFirstInlineField(document: Document2Node): InlineField2 | null {\n let found: InlineField2 | null = null;\n visitFields(document.blocks, (field) => {\n found = field;\n return true;\n });\n return found;\n}\n\nexport function updateTextToken(document: Document2Node, fieldId: string, tokenId: string, text: string): Document2Node {\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n if (field.id !== fieldId) {\n return false;\n }\n const token = field.tokens.find((entry): entry is TextToken2 => entry.id === tokenId && entry.kind === 'text');\n if (!token) {\n return true;\n }\n token.text = text;\n return true;\n });\n return next;\n}\n\nfunction mathTokenFromSession(session: EditorSession, opening = '$', closing = '$', side: EditorSide = 'arabic'): MathToken2 {\n return {\n id: document2Id('math'),\n kind: 'math',\n display: opening === '$$' || opening === '\\\\[' || opening.startsWith('\\\\begin{'),\n opening,\n closing,\n source: mathSourceFromSession(session, side, opening, closing),\n sourceSide: side,\n math: mathNodeFromSession(session, opening, closing),\n editable: true,\n sourceOwner: 'editor',\n };\n}\n\nfunction splitTextForInsertion(token: TextToken2): InlineToken2[] | null {\n const gap = token.text.indexOf(' ');\n if (gap < 0) {\n return null;\n }\n return [\n { id: token.id, kind: 'text', text: token.text.slice(0, gap + 1) },\n { id: document2Id('text'), kind: 'text', text: token.text.slice(gap + 1) },\n ];\n}\n\nexport function cloneDocument2Node(document: Document2Node): Document2Node {\n return cloneDocument(document);\n}\n\nfunction insertBlockAfter(blocks: Document2Block[], afterBlockId: string | null | undefined, block: Document2Block): void {\n if (!afterBlockId) {\n blocks.push(block);\n return;\n }\n const index = blocks.findIndex((entry) => entry.id === afterBlockId);\n if (index < 0) {\n blocks.push(block);\n return;\n }\n blocks.splice(index + 1, 0, block);\n}\n\nexport function insertDocument2BlockAfter(\n document: Document2Node,\n afterBlockId: string | null | undefined,\n block: Document2Block,\n): Document2Node {\n const next = cloneDocument(document);\n insertBlockAfter(next.blocks, afterBlockId, block);\n return next;\n}\n\nexport function moveDocument2BlockById(document: Document2Node, blockId: string, direction: -1 | 1): Document2Node {\n const next = cloneDocument(document);\n const index = next.blocks.findIndex((block) => block.id === blockId);\n const targetIndex = index + direction;\n if (index < 0 || targetIndex < 0 || targetIndex >= next.blocks.length) {\n return document;\n }\n const [block] = next.blocks.splice(index, 1);\n if (!block) {\n return document;\n }\n next.blocks.splice(targetIndex, 0, block);\n return next;\n}\n\nexport function moveDocument2BlockRange(\n document: Document2Node,\n from: number,\n to: number,\n direction: -1 | 1,\n): Document2Node {\n const count = document.blocks.length;\n if (from < 0 || to < 0 || from >= count || to >= count || from > to) {\n return document;\n }\n const insertAt = from + direction;\n if (insertAt < 0 || to + direction >= count) {\n return document;\n }\n const next = cloneDocument(document);\n const slice = next.blocks.splice(from, to - from + 1);\n next.blocks.splice(insertAt, 0, ...slice);\n return next;\n}\n\nexport function removeDocument2BlockRange(document: Document2Node, from: number, to: number): Document2Node {\n const count = document.blocks.length;\n if (from < 0 || to < 0 || from >= count || to >= count || from > to) {\n return document;\n }\n const next = cloneDocument(document);\n next.blocks = [...next.blocks.slice(0, from), ...next.blocks.slice(to + 1)];\n return next;\n}\n\nfunction normalizeFieldTokens(tokens: InlineToken2[]): InlineToken2[] {\n if (tokens.length === 0) {\n return [{ id: document2Id('text'), kind: 'text', text: '' }];\n }\n return tokens;\n}\n\nfunction stitchTextAroundRemovedToken(tokens: InlineToken2[], index: number): InlineToken2[] {\n const before = tokens[index - 1];\n const after = tokens[index + 1];\n if (before?.kind === 'text' && after?.kind === 'text') {\n return [\n ...tokens.slice(0, index - 1),\n { ...before, text: before.text + after.text },\n ...tokens.slice(index + 2),\n ];\n }\n return [...tokens.slice(0, index), ...tokens.slice(index + 1)];\n}\n\nexport function removeMathTokenById(document: Document2Node, tokenId: string): Document2Node {\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n const index = field.tokens.findIndex((token) => token.id === tokenId && token.kind === 'math');\n if (index < 0) {\n return false;\n }\n field.tokens = normalizeFieldTokens(stitchTextAroundRemovedToken(field.tokens, index));\n return true;\n });\n return next;\n}\n\nfunction splitTextTokenAt(token: TextToken2, offset: number): [TextToken2, TextToken2] {\n const safeOffset = Math.max(0, Math.min(offset, token.text.length));\n return [\n { id: token.id, kind: 'text', text: token.text.slice(0, safeOffset) },\n { id: document2Id('text'), kind: 'text', text: token.text.slice(safeOffset) },\n ];\n}\n\nexport function insertMathTokenAtCaret(\n document: Document2Node,\n fieldId: string,\n textTokenId: string | null,\n caretOffset: number,\n session: EditorSession,\n opening = '$',\n closing = '$',\n side: EditorSide = 'arabic',\n): Document2Node {\n const next = cloneDocument(document);\n const mathToken = mathTokenFromSession(session, opening, closing, side);\n visitFields(next.blocks, (field) => {\n if (field.id !== fieldId) {\n return false;\n }\n\n const textIndex = textTokenId\n ? field.tokens.findIndex((token) => token.id === textTokenId && token.kind === 'text')\n : field.tokens.findIndex((token) => token.kind === 'text');\n\n if (textIndex < 0) {\n field.tokens.push(mathToken);\n field.tokens.push({ id: document2Id('text'), kind: 'text', text: '' });\n return true;\n }\n\n const current = field.tokens[textIndex] as TextToken2;\n const [before, after] = splitTextTokenAt(current, caretOffset);\n const parts: InlineToken2[] = [...field.tokens.slice(0, textIndex)];\n if (before.text.length > 0) {\n parts.push(before);\n }\n parts.push(mathToken);\n parts.push(after);\n parts.push(...field.tokens.slice(textIndex + 1));\n field.tokens = normalizeFieldTokens(parts);\n return true;\n });\n return next;\n}\n\nexport function insertMathToken(\n document: Document2Node,\n fieldId: string,\n insertIndex: number,\n session: EditorSession,\n opening = '$',\n closing = '$',\n side: EditorSide = 'arabic',\n): Document2Node {\n const next = cloneDocument(document);\n const mathToken = mathTokenFromSession(session, opening, closing, side);\n visitFields(next.blocks, (field) => {\n if (field.id !== fieldId) {\n return false;\n }\n\n if (field.tokens.length === 1 && field.tokens[0]?.kind === 'text') {\n const split = splitTextForInsertion(field.tokens[0]);\n if (split) {\n field.tokens = [split[0]!, mathToken, split[1]!];\n return true;\n }\n }\n\n const safeIndex = Math.max(0, Math.min(insertIndex, field.tokens.length));\n field.tokens.splice(safeIndex, 0, mathToken);\n return true;\n });\n return next;\n}\n\nexport function replaceMathTokenFromSession(\n document: Document2Node,\n tokenId: string,\n session: EditorSession,\n opening?: string,\n closing?: string,\n side: EditorSide = 'arabic',\n): Document2Node {\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n const index = field.tokens.findIndex((token) => token.id === tokenId && token.kind === 'math');\n if (index < 0) {\n return false;\n }\n const current = field.tokens[index] as MathToken2;\n const open = opening ?? current.opening;\n const close = closing ?? current.closing;\n const replaced = mathTokenFromSession(session, open, close, side);\n replaced.id = current.id;\n if (current.labelEnabled !== undefined) {\n replaced.labelEnabled = current.labelEnabled;\n }\n if (current.label !== undefined) {\n replaced.label = current.label;\n }\n field.tokens[index] = replaced;\n return true;\n });\n return next;\n}\n\nexport function addDocument2TextBlock(\n document: Document2Node,\n command: '\\\\section' | '\\\\subsection' | '\\\\subsubsection' | '\\\\paragraph' = '\\\\paragraph',\n afterBlockId?: string | null,\n): Document2Node {\n const block = {\n id: document2Id('block'),\n kind: 'textBlock' as const,\n command,\n field: createInlineField2(''),\n ...(command === '\\\\paragraph' ? { centered: false } : {}),\n };\n return insertDocument2BlockAfter(document, afterBlockId, block);\n}\n\nexport function updateDocument2TextBlockCentered(\n document: Document2Node,\n blockId: string,\n centered: boolean,\n): Document2Node {\n const next = cloneDocument(document);\n function visit(blocks: Document2Block[]): boolean {\n for (const block of blocks) {\n if (block.id === blockId && block.kind === 'textBlock' && block.command === '\\\\paragraph') {\n block.centered = centered;\n return true;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (visit(item.blocks)) {\n return true;\n }\n }\n }\n }\n return false;\n }\n visit(next.blocks);\n return next;\n}\n\nexport function removeDocument2BlockById(document: Document2Node, blockId: string): Document2Node {\n const next = cloneDocument(document);\n next.blocks = next.blocks.filter((block) => block.id !== blockId);\n return next;\n}\n\nfunction newListBlock(ordered: boolean): ListBlock2 {\n const command: ListBlock2['command'] = ordered ? '\\\\begin{enumerate}' : '\\\\begin{itemize}';\n const closing = ordered ? '\\\\end{enumerate}' : '\\\\end{itemize}';\n return {\n id: document2Id('block'),\n kind: 'list',\n command,\n closing,\n items: [{ id: document2Id('item'), field: createInlineField2(''), blocks: [] }],\n };\n}\n\nexport function addDocument2ListBlock(document: Document2Node, ordered: boolean, afterBlockId?: string | null): Document2Node {\n return insertDocument2BlockAfter(document, afterBlockId, newListBlock(ordered));\n}\n\nexport function addDocument2TableBlock(\n document: Document2Node,\n columns = 'lll',\n rowCount = 3,\n colCount = 3,\n afterBlockId?: string | null,\n): Document2Node {\n const rows = Math.max(1, rowCount);\n const cols = Math.max(1, colCount);\n const tableRows: InlineField2[][] = [];\n for (let r = 0; r < rows; r += 1) {\n const row: InlineField2[] = [];\n for (let c = 0; c < cols; c += 1) {\n row.push(createInlineField2(''));\n }\n tableRows.push(row);\n }\n const block: TableBlock2 = {\n id: document2Id('block'),\n kind: 'table',\n command: '\\\\begin{tabular}',\n closing: '\\\\end{tabular}',\n columns: columns || 'l'.repeat(cols),\n rows: tableRows,\n ...defaultFloatMeta(),\n };\n return insertDocument2BlockAfter(document, afterBlockId, block);\n}\n\nexport function addDocument2ImageBlock(document: Document2Node, src = '', afterBlockId?: string | null): Document2Node {\n const block: ImageBlock2 = {\n id: document2Id('block'),\n kind: 'image',\n command: '\\\\includegraphics',\n value: src,\n options: { width: '0.8\\\\columnwidth' },\n ...defaultFloatMeta(),\n };\n return insertDocument2BlockAfter(document, afterBlockId, block);\n}\n\nexport function updateDocument2ImageValue(document: Document2Node, blockId: string, value: string): Document2Node {\n const next = cloneDocument(document);\n function visit(blocks: Document2Block[]): boolean {\n for (const block of blocks) {\n if (block.id === blockId && block.kind === 'image') {\n block.value = value;\n return true;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (visit(item.blocks)) {\n return true;\n }\n }\n }\n }\n return false;\n }\n visit(next.blocks);\n return next;\n}\n\nexport function updateDocument2ImageMeta(document: Document2Node, blockId: string, patch: FloatMetaPatch): Document2Node {\n const next = cloneDocument(document);\n function visit(blocks: Document2Block[]): boolean {\n for (const block of blocks) {\n if (block.id === blockId && block.kind === 'image') {\n applyFloatMetaPatch(block, patch);\n return true;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (visit(item.blocks)) {\n return true;\n }\n }\n }\n }\n return false;\n }\n visit(next.blocks);\n return next;\n}\n\nexport function updateDocument2TableMeta(document: Document2Node, blockId: string, patch: FloatMetaPatch): Document2Node {\n const next = cloneDocument(document);\n function visit(blocks: Document2Block[]): boolean {\n for (const block of blocks) {\n if (block.id === blockId && block.kind === 'table') {\n applyFloatMetaPatch(block, patch);\n return true;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (visit(item.blocks)) {\n return true;\n }\n }\n }\n }\n return false;\n }\n visit(next.blocks);\n return next;\n}\n\nexport function updateMathTokenLabel(\n document: Document2Node,\n tokenId: string,\n patch: { labelEnabled?: boolean; label?: string },\n): Document2Node {\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n const token = field.tokens.find((entry): entry is MathToken2 => entry.id === tokenId && entry.kind === 'math');\n if (!token) {\n return false;\n }\n if (typeof patch.labelEnabled === 'boolean') {\n token.labelEnabled = patch.labelEnabled;\n }\n if (typeof patch.label === 'string') {\n token.label = patch.label;\n }\n return true;\n });\n return next;\n}\n\nfunction refTokenFromKeys(keys: string[], refCommand: 'ref' | 'eqref'): RefToken2 {\n return { id: document2Id('ref'), kind: 'ref', keys: [...keys], refCommand };\n}\n\nexport function insertRefTokenAtCaret(\n document: Document2Node,\n fieldId: string,\n textTokenId: string | null,\n caretOffset: number,\n keys: string[],\n refCommand: 'ref' | 'eqref' = 'ref',\n): Document2Node {\n if (keys.length === 0) {\n return document;\n }\n const next = cloneDocument(document);\n const refToken = refTokenFromKeys(keys, refCommand);\n visitFields(next.blocks, (field) => {\n if (field.id !== fieldId) {\n return false;\n }\n\n const textIndex = textTokenId\n ? field.tokens.findIndex((token) => token.id === textTokenId && token.kind === 'text')\n : field.tokens.findIndex((token) => token.kind === 'text');\n\n if (textIndex < 0) {\n field.tokens.push(refToken);\n field.tokens.push({ id: document2Id('text'), kind: 'text', text: '' });\n return true;\n }\n\n const current = field.tokens[textIndex] as TextToken2;\n const [before, after] = splitTextTokenAt(current, caretOffset);\n const parts: InlineToken2[] = [...field.tokens.slice(0, textIndex)];\n if (before.text.length > 0) {\n parts.push(before);\n }\n parts.push(refToken);\n parts.push(after);\n parts.push(...field.tokens.slice(textIndex + 1));\n field.tokens = normalizeFieldTokens(parts);\n return true;\n });\n return next;\n}\n\nexport function updateRefTokenKeys(\n document: Document2Node,\n tokenId: string,\n keys: string[],\n refCommand?: 'ref' | 'eqref',\n): Document2Node {\n if (keys.length === 0) {\n return document;\n }\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n const token = field.tokens.find((entry): entry is RefToken2 => entry.id === tokenId && entry.kind === 'ref');\n if (!token) {\n return false;\n }\n token.keys = [...keys];\n if (refCommand) {\n token.refCommand = refCommand;\n }\n return true;\n });\n return next;\n}\n\nexport function removeRefTokenById(document: Document2Node, tokenId: string): Document2Node {\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n const index = field.tokens.findIndex((token) => token.id === tokenId && token.kind === 'ref');\n if (index < 0) {\n return false;\n }\n field.tokens = normalizeFieldTokens(stitchTextAroundRemovedToken(field.tokens, index));\n return true;\n });\n return next;\n}\n\nfunction mutateListBlockById(blocks: Document2Block[], listBlockId: string, mutator: (list: ListBlock2) => void): boolean {\n for (const block of blocks) {\n if (block.id === listBlockId && block.kind === 'list') {\n mutator(block);\n return true;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (mutateListBlockById(item.blocks, listBlockId, mutator)) {\n return true;\n }\n }\n }\n }\n return false;\n}\n\nexport function addDocument2ListItem(document: Document2Node, listBlockId: string): Document2Node {\n const next = cloneDocument(document);\n mutateListBlockById(next.blocks, listBlockId, (list) => {\n list.items.push({ id: document2Id('item'), field: createInlineField2(''), blocks: [] });\n });\n return next;\n}\n\nexport function removeDocument2ListItem(document: Document2Node, listBlockId: string, itemId: string): Document2Node {\n const next = cloneDocument(document);\n mutateListBlockById(next.blocks, listBlockId, (list) => {\n if (list.items.length < 2) {\n return;\n }\n const index = list.items.findIndex((item) => item.id === itemId);\n if (index >= 0) {\n list.items.splice(index, 1);\n }\n });\n return next;\n}\n\nfunction citeTokenFromKeys(keys: string[]): CiteToken2 {\n return { id: document2Id('cite'), kind: 'cite', keys: [...keys] };\n}\n\nexport function insertCiteTokenAtCaret(\n document: Document2Node,\n fieldId: string,\n textTokenId: string | null,\n caretOffset: number,\n keys: string[],\n): Document2Node {\n if (keys.length === 0) {\n return document;\n }\n const next = cloneDocument(document);\n const citeToken = citeTokenFromKeys(keys);\n visitFields(next.blocks, (field) => {\n if (field.id !== fieldId) {\n return false;\n }\n\n const textIndex = textTokenId\n ? field.tokens.findIndex((token) => token.id === textTokenId && token.kind === 'text')\n : field.tokens.findIndex((token) => token.kind === 'text');\n\n if (textIndex < 0) {\n field.tokens.push(citeToken);\n field.tokens.push({ id: document2Id('text'), kind: 'text', text: '' });\n return true;\n }\n\n const current = field.tokens[textIndex] as TextToken2;\n const [before, after] = splitTextTokenAt(current, caretOffset);\n const parts: InlineToken2[] = [...field.tokens.slice(0, textIndex)];\n if (before.text.length > 0) {\n parts.push(before);\n }\n parts.push(citeToken);\n parts.push(after);\n parts.push(...field.tokens.slice(textIndex + 1));\n field.tokens = normalizeFieldTokens(parts);\n return true;\n });\n return next;\n}\n\nexport function updateCiteTokenKeys(document: Document2Node, tokenId: string, keys: string[]): Document2Node {\n if (keys.length === 0) {\n return document;\n }\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n const token = field.tokens.find((entry): entry is CiteToken2 => entry.id === tokenId && entry.kind === 'cite');\n if (!token) {\n return false;\n }\n token.keys = [...keys];\n return true;\n });\n return next;\n}\n\nexport function removeCiteTokenById(document: Document2Node, tokenId: string): Document2Node {\n const next = cloneDocument(document);\n visitFields(next.blocks, (field) => {\n const index = field.tokens.findIndex((token) => token.id === tokenId && token.kind === 'cite');\n if (index < 0) {\n return false;\n }\n field.tokens = normalizeFieldTokens(stitchTextAroundRemovedToken(field.tokens, index));\n return true;\n });\n return next;\n}\n\nexport function ensureDocument2BibliographyBlock(document: Document2Node, afterBlockId?: string | null): Document2Node {\n if (document.blocks.some((block) => block.kind === 'bibliography')) {\n return document;\n }\n const block: BibliographyBlock2 = {\n id: document2Id('block'),\n kind: 'bibliography',\n command: '\\\\begin{thebibliography}',\n closing: '\\\\end{thebibliography}',\n };\n return insertDocument2BlockAfter(document, afterBlockId ?? null, block);\n}\n\nexport function addDocument2Reference(document: Document2Node, partial: Partial<Reference2Json> = {}): Document2Node {\n const next = cloneDocument(document);\n next.references.push(createEmptyReference2(partial));\n return next;\n}\n\nexport function updateDocument2Reference(document: Document2Node, referenceId: string, patch: Partial<Reference2Json>): Document2Node {\n const next = cloneDocument(document);\n const reference = next.references.find((entry) => entry.id === referenceId);\n if (!reference) {\n return document;\n }\n if (typeof patch.key === 'string' && patch.key.trim().length > 0) {\n reference.key = patch.key.trim();\n }\n if (typeof patch.authors === 'string') {\n reference.authors = patch.authors;\n }\n if (typeof patch.title === 'string') {\n reference.title = patch.title;\n }\n if (typeof patch.year === 'string') {\n reference.year = patch.year;\n }\n if (typeof patch.url === 'string') {\n reference.url = patch.url;\n }\n if (typeof patch.venue === 'string') {\n reference.venue = patch.venue;\n }\n return next;\n}\n\nexport function removeDocument2Reference(document: Document2Node, referenceId: string): Document2Node {\n const next = cloneDocument(document);\n next.references = next.references.filter((reference) => reference.id !== referenceId);\n return next;\n}\n\nexport function moveDocument2Reference(document: Document2Node, referenceId: string, direction: -1 | 1): Document2Node {\n const next = cloneDocument(document);\n const index = next.references.findIndex((reference) => reference.id === referenceId);\n const targetIndex = index + direction;\n if (index < 0 || targetIndex < 0 || targetIndex >= next.references.length) {\n return document;\n }\n const [reference] = next.references.splice(index, 1);\n if (!reference) {\n return document;\n }\n next.references.splice(targetIndex, 0, reference);\n return next;\n}\n\nexport function setDocument2References(document: Document2Node, references: Reference2[]): Document2Node {\n const next = cloneDocument(document);\n next.references = references.map((reference) => ({ ...reference }));\n return next;\n}\n\nexport function updateDocument2Meta(document: Document2Node, patch: Document2MetaProp): Document2Node {\n const next = cloneDocument(document);\n const current = next.meta ?? emptyDocument2Meta();\n next.meta = {\n title: typeof patch.title === 'string' ? patch.title : current.title,\n authors: typeof patch.authors === 'string' ? patch.authors : current.authors,\n abstract: typeof patch.abstract === 'string' ? patch.abstract : current.abstract,\n date: patch.date\n ? normalizeDocument2HijriDate({ ...current.date, ...patch.date })\n : { ...current.date },\n };\n return next;\n}\n","/** Arabic XeLaTeX preamble fragments for full-document export. */\n\nexport type ArabicDigitsMapping = 'arabicdigits' | 'digits';\n\nexport type ArabicXeLatexPreambleOptions = {\n digitsMapping?: ArabicDigitsMapping;\n /** When true, add the article class twocolumn option. Default false. */\n twocolumn?: boolean;\n};\n\nexport function arabicXeLatexPreamblePkg(twocolumn = false): string {\n const classOptions = twocolumn\n ? '12pt,a4paper,notitlepage,twocolumn'\n : '12pt,a4paper,notitlepage';\n return (\n `\n\\\\documentclass[${classOptions}]{article}\n` +\n String.raw`\\usepackage{amsmath,amsfonts,amssymb,mathrsfs,tikz,fancyhdr, mathtools}\n\\usepackage{fontspec} % For loading OpenType fonts\n\\usepackage{unicode-math} % For setting the math font\n\\usepackage{polyglossia} % For Arabic support\n\\usepackage{array}\n\\usepackage{cancel}\n\\usepackage{bidi} % For bidirectional text handling\n\\usepackage{multirow}\n\\usepackage{booktabs}\n\\usepackage{graphicx} % For \\reflectbox\n\\usepackage{xcolor}\n\\usepackage{tikz}\n\\usepackage{tcolorbox} % For tcolorbox environment\n\\usepackage{textcomp} % For \\textrightarrow command\n\n\n% visit : https://www.symbolcopy.com/punctuation-symbol.html\n% for inversed punctuation\n\n% save inverted comma for use - copy paste -> ،\n% save back tick for use - copy paste -> ` + '`'\n );\n}\n\nexport function arabicXeLatexPreambleFont(digitsMapping: ArabicDigitsMapping = 'arabicdigits'): string {\n return `\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Toggle between eastern and western digits by changing the Mapping in the below fonts (inside math font as well) between \"arabicdigits\" and \"digits\"\n\\\\setdefaultlanguage[calendar=gregorian]{arabic} % from polyglossia\n\\\\setmainfont[Script=Arabic , Mapping=${digitsMapping}]{Amiri}\n\\\\newfontfamily\\\\diwani[Script=Arabic,Mapping=${digitsMapping}]{Diwani Letter}\n\\\\newfontfamily\\\\diwanioutlineshaded[Script=Arabic,Mapping=${digitsMapping}]{Diwani Outline Shaded}\n\\\\newfontfamily\\\\takween[Script=Arabic,Mapping=${digitsMapping}]{Takween}\n\\\\newfontfamily\\\\boldarabic[Script=Arabic,Mapping=${digitsMapping}]{Amiri Bold}\n\\\\newfontfamily\\\\italicarabic[Script=Arabic,Mapping=${digitsMapping}]{Amiri Italic}\n\n% Explicitly set math font to XITS Math\n% Remove \"Script=Arabic\" to cancel reflected symbols and other RTL symbols\n\\\\setmathfont[Script=Arabic , Mapping=${digitsMapping}]{XITS Math} % Ensure XITS Math is correctly installed and available\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n`;\n}\n\nexport function arabicXeLatexPreambleCmd(): string {\n return String.raw`\n% Run with XeLaTeX compiler\n\\newcommand{\\butextakween}[1]{\\text{\\takween{#1}}}\n\\newcommand{\\butexdiwani}[1]{\\text{\\diwani{#1}}}\n\\newcommand{\\butexdiwanioutline}[1]{\\text{\\diwanioutlineshaded{#1}}}\n\n\\newcommand{\\arabN}{\\text{\\diwanioutlineshaded{ط}}}\n\\newcommand{\\arabZ}{\\text{\\diwanioutlineshaded{ص}}}\n\\newcommand{\\arabQ}{\\text{\\diwanioutlineshaded{ن}}}\n\\newcommand{\\arabR}{\\text{\\diwanioutlineshaded{ح}}}\n\\newcommand{\\arabC}{\\text{\\diwanioutlineshaded{ع}}}\n\\newcommand{\\arabH}{\\text{\\diwanioutlineshaded{ر}}}\n\n\n\\newcommand{\\lowerscript}[1]{\\raisebox{-4pt}{\\scriptsize #1}}\n\\newcommand{\\llowerscript}[1]{\\raisebox{-8pt}{\\scriptsize #1}}\n\\newcommand{\\lllowerscript}[2]{\\raisebox{#2pt}{\\scriptsize #1}}\n\n\\newcommand{\\arabdsub}[3]{\\prescript{}{#1}{\\prescript{}{#2}{#3}}} % arabic double subscript\n\\newcommand{\\arabsub}[2]{\\prescript{}{#1}{#2}} % arabic single subscript\n\n\n\n\\newcommand{\\upperscript}[1]{\\raisebox{8pt}{\\scriptsize #1}}\n\\newcommand{\\uupperscript}[2]{\\raisebox{#2pt}{\\scriptsize #1}}\n\\newcommand{\\vertbar}{\\rule[-1ex]{0.5pt}{2.5ex}}\n\\newcommand{\\horzbar}{\\rule[.5ex]{2.5ex}{0.5pt}}\n\n\\newcommand{\\arabsqrt}[2]{\\reflectbox{\\(\\sqrt[\\reflectbox{\\(#1\\)}]{\\reflectbox{\\(#2\\)}}\\)}}\n\\newcommand{\\arabvec}[1]{\\reflectbox{$\\vec{\\reflectbox{$#1$}}$}}\n\n\\newcommand{\\arabexp}[1]{{}^{#1}\\!\\raisebox{-4.5pt}{\\text{\\diwani{ه}}}}\n\\newcommand{\\arablog}[2]{\\left(\\text{#2}\\right)\\!\\prescript{}{\\text{#1}}{\\text{\\diwani{لو}}}}\n\\newcommand{\\arabnlog}[1]{\\left(\\text{#1}\\right)\\!\\prescript{}{\\text{\\diwani{ه}}}{\\text{\\diwani{لو}}}}\n\n\\newcommand{\\arabcos}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{جتا}}}}\n\\newcommand{\\arabsin}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{جا}}}}\n\\newcommand{\\arabtan}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ظا}}}}\n\\newcommand{\\arabcot}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ظتا}}}}\n\\newcommand{\\arabsec}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قا}}}}\n\\newcommand{\\arabcsc}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قتا}}}}\n\n\\newcommand{\\arabacos}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قجتا}}}}\n\\newcommand{\\arabasin}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قجا}}}}\n\\newcommand{\\arabatan}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قظا}}}}\n\\newcommand{\\arabacot}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قظتا}}}}\n\\newcommand{\\arabasec}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ققا}}}}\n\\newcommand{\\arabacsc}[1]{\\left(#1\\right)\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ققتا}}}}\n\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% summation\n\\newcommand{\\arablim}[2]{\\underset{#2 \\leftarrow #1}{\\text{نـــــها}}}\n\\newcommand{\\arabsum}[2]{\\underset{#1}{\\overset{#2}{\\text{مجـــ}}}}\n\\newcommand{\\arabprod}[2]{\\underset{#1}{\\overset{#2}{\\text{جـــذ}}}}\n\\newcommand{\\arabint}[2]{\\prescript{#2}{#1\\!\\!\\!}\\int}\n\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% we define this command to make it ease for change of notation later\n\\newcommand{\\ad}[0]{\\text{ء}} % \"ad\" for arabic differentiation or derivative (ء\" لإشتقاق\")\n\\newcommand{\\arpi}[0]{\\!\\text{\\diwani{ط}}}\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% differentials\n\n\\newcommand{\\arabdiff}[2]{\\frac{#1\\ad}{#2\\ad}} % arabic differential\n\\newcommand{\\arabddiff}[2]{\\frac{#1{}^{2}\\ad}{{}^{2}#2\\ad}} % arabic second differential\n\n\\newcommand{\\arabode}[2][-5pt]{\\stackrel{\\raisebox{#1}{$\\cdot$}}{\\text{#2}}}\n\\newcommand{\\arabodde}[2][-5pt]{\\stackrel{\\raisebox{#1}{$\\vcenter{\\hbox{$\\cdot\\!\\cdot$}}$}}{\\text{#2}}}\n\\newcommand{\\araboddde}[2][-5pt]{\\stackrel{\\raisebox{#1}{$\\vcenter{\\hbox{$\\cdot\\!\\cdot\\!\\cdot$}}$}}{\\text{#2}}}\n\\newcommand{\\arabpde}[1]{\\prescript{}{#1\\!\\!}{\\nabla}} % arabic partial differential equation (PDE)\n\n\\newcommand{\\arabprime}[0]{\\reflectbox{$\\prime$}\\!} % arabic prime notation\n\\newcommand{\\arabpprime}[0]{\\reflectbox{$\\prime$}\\reflectbox{$\\prime$}\\!} % arabic prime notation\n\\newcommand{\\arabppprime}[0]{\\reflectbox{$\\prime$}\\reflectbox{$\\prime$}\\reflectbox{$\\prime$}\\!} % arabic prime notation\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% probability\n\\newcommand{\\ap}[0]{\\!\\text{\\diwani{حـ}}} % arabic Probability - used a lot so short form\n\\newcommand{\\arabExpct}[0]{\\text{\\diwani{توقـ}}} % arabic Expectation\n\\newcommand{\\arabVar}[0]{\\!\\text{\\diwani{با}}} % arabic Variance\n\\newcommand{\\arabCov}[0]{\\!\\text{\\diwani{ت}}} % arabic Covariance\n\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% custom commands specific to lesson\n\\newcommand{\\lagrange}[2]{\\left(#2\\right)\\!\\prescript{}{#1}{\\text{\\diwani{لا}}}}\n\\newcommand{\\xii}[0]{\\left(\\prescript{}{\\text{يـ}}{\\text{س}}\\right)\\!}\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n\n\\newcommand{\\arsqrt}[2][]{\\reflectbox{\\(\\sqrt[\\reflectbox{\\(#1\\)}]{\\reflectbox{\\(#2\\)}}\\)}}\n\\newcommand{\\arexp}[0]{\\!\\raisebox{-4.5pt}{\\text{\\diwani{ه}}}}\n\\newcommand{\\arlog}[0]{\\!\\!\\text{\\diwani{لو}}}\n\\newcommand{\\arln}[0]{\\!\\!\\prescript{}{\\text{\\diwani{ه}}}{\\text{\\diwani{لو}}}}\n\\newcommand{\\ardet}[0]{\\!\\!\\text{\\diwani{محدد}}}\n\n\\newcommand{\\arsum}[0]{\\text{مجـــ}}\n\\newcommand{\\arprod}[0]{\\text{جـــذ}}\n\n\\newcommand{\\arlim}[0]{\\text{نـــــها}}\n\\newcommand{\\armax}[0]{\\text{أكبر}}\n\\newcommand{\\armin}[0]{\\text{أصغر}}\n\\newcommand{\\arsup}[0]{\\text{أعلى}}\n\\newcommand{\\arinf}[0]{\\text{أدنى}}\n\n\\newcommand{\\arsin}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{جا}}}}\n\\newcommand{\\arcos}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{جتا}}}}\n\\newcommand{\\artan}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ظا}}}}\n\\newcommand{\\arcot}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ظتا}}}}\n\\newcommand{\\arsec}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قا}}}}\n\\newcommand{\\arcsc}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قتا}}}} \n\n\\newcommand{\\arasin}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قجا}}}}\n\\newcommand{\\aracos}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قجتا}}}}\n\\newcommand{\\aratan}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قظا}}}}\n\\newcommand{\\aracot}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قظتا}}}}\n\\newcommand{\\arasec}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ققا}}}}\n\\newcommand{\\aracsc}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ققتا}}}}\n\n\\newcommand{\\arsinh}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{جزا}}}}\n\\newcommand{\\arcosh}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{جتزا}}}}\n\\newcommand{\\artanh}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ظزا}}}}\n\\newcommand{\\arcoth}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ظتزا}}}}\n\\newcommand{\\arsech}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قزا}}}}\n\\newcommand{\\arcsch}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قتزا}}}}\n\n\\newcommand{\\arasinh}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قجزا}}}}\n\\newcommand{\\aracosh}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قجتزا}}}} \n\\newcommand{\\aratanh}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قظزا}}}}\n\\newcommand{\\aracoth}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{قظتزا}}}}\n\\newcommand{\\arasech}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ققزا}}}}\n\\newcommand{\\aracsch}[0]{\\!\\!\\raisebox{-2.5pt}{\\text{\\diwani{ققتزا}}}}\n\n\\newcommand{\\unit}[1]{\\text{#1}}\n\\newcommand{\\idx}[1]{#1}\n\\newcommand{\\arbinom}[2]{\\left(\\begin{array}{c} #1 \\\\ #2 \\end{array} \\right)}\n`;\n}\n\nexport function getArabicXeLatexPreamble(\n digitsMappingOrOptions: ArabicDigitsMapping | ArabicXeLatexPreambleOptions = 'arabicdigits',\n): string {\n const options: ArabicXeLatexPreambleOptions =\n typeof digitsMappingOrOptions === 'string'\n ? { digitsMapping: digitsMappingOrOptions }\n : digitsMappingOrOptions;\n const digitsMapping = options.digitsMapping ?? 'arabicdigits';\n const twocolumn = options.twocolumn === true;\n return (\n arabicXeLatexPreamblePkg(twocolumn) +\n arabicXeLatexPreambleFont(digitsMapping) +\n arabicXeLatexPreambleCmd()\n );\n}\n","import { renderMathNodeLatex } from '../document/mathObject.js';\nimport {\n getArabicXeLatexPreamble,\n type ArabicDigitsMapping,\n} from './arabicPreamble.js';\nimport {\n BUTEX_CLOSING_HAMDALA,\n butexBasmalaDisplayLatex,\n butexBasmalaTitlingPreamble,\n butexDiwaniDisplayLatex,\n document2HasAbstract,\n document2HasMaketitle,\n emptyDocument2Meta,\n formatHijriDate,\n} from './articleMeta.js';\nimport { bibliographyEntryLatex, citeTokenLatex } from './citations.js';\nimport { refTokenLatex, stripDisplayMathDelimiters } from './labels.js';\nimport type {\n Document2Block,\n Document2Meta,\n Document2Node,\n ImageBlock2,\n InlineField2,\n InlineToken2,\n ListBlock2,\n MathToken2,\n TableBlock2,\n TextBlock2,\n} from './types.js';\n\nexport type Document2LatexOptions = {\n /**\n * When true (default), emit a complete Arabic XeLaTeX file:\n * preamble + \\\\begin{document} + body + \\\\end{document}.\n * Pass false for body-only blocks.\n */\n wrapDocument?: boolean;\n /** Font digit Mapping when wrapping. Default 'arabicdigits'. */\n digitsMapping?: ArabicDigitsMapping;\n /** When true, use article class option twocolumn. Default false. */\n twocolumn?: boolean;\n};\n\nfunction mathBodyLatex(token: MathToken2): string {\n if (!token.math || token.sourceOwner === 'raw' || token.sourceOwner === 'editor') {\n return stripDisplayMathDelimiters(token.source);\n }\n const rendered = renderMathNodeLatex(token.math);\n return stripDisplayMathDelimiters(rendered);\n}\n\nfunction tokenLatex(token: InlineToken2): string {\n if (token.kind === 'text') {\n return token.text;\n }\n if (token.kind === 'cite') {\n return citeTokenLatex(token.keys);\n }\n if (token.kind === 'ref') {\n return refTokenLatex(token.keys, token.refCommand);\n }\n if (token.display && token.labelEnabled && token.label && token.label.trim().length > 0) {\n const body = mathBodyLatex(token);\n return `\\\\begin{equation}\\n${body}\\n\\\\label{${token.label.trim()}}\\n\\\\end{equation}`;\n }\n if (!token.math || token.sourceOwner === 'raw' || token.sourceOwner === 'editor') {\n return token.source;\n }\n return renderMathNodeLatex(token.math);\n}\n\nexport function inlineFieldLatex(field: InlineField2): string {\n return field.tokens.map((token) => tokenLatex(token)).join('');\n}\n\nfunction textBlockLatex(block: TextBlock2): string {\n const body = `${block.command}{${inlineFieldLatex(block.field)}}`;\n if (block.command === '\\\\paragraph' && block.centered) {\n return `\\\\begin{center}\\n${body}\\n\\\\end{center}`;\n }\n return body;\n}\n\nfunction indent(value: string): string {\n return value\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n}\n\nfunction listBlockLatex(block: ListBlock2, references: Document2Node['references']): string {\n const items = block.items\n .map((item) => {\n const nested = item.blocks.map((child) => '\\n' + indent(blockLatex(child, references))).join('');\n return ` \\\\item ${inlineFieldLatex(item.field)}${nested}`;\n })\n .join('\\n');\n return `${block.command}\\n${items}\\n${block.closing}`;\n}\n\nfunction tabularInnerLatex(block: TableBlock2): string {\n const rows = block.rows\n .map((row) => ` ${row.map((cell) => inlineFieldLatex(cell)).join(' & ')}`)\n .join(' \\\\\\\\\\n');\n return `${block.command}{${block.columns}}\\n${rows}\\n${block.closing}`;\n}\n\nfunction floatCaptionLabelLines(block: ImageBlock2 | TableBlock2): string[] {\n const lines: string[] = [];\n if (block.captionEnabled && block.caption.trim().length > 0) {\n lines.push(` \\\\caption{${block.caption.trim()}}`);\n }\n if (block.labelEnabled && block.label.trim().length > 0) {\n lines.push(` \\\\label{${block.label.trim()}}`);\n }\n return lines;\n}\n\nfunction tableBlockLatex(block: TableBlock2): string {\n const lines = ['\\\\begin{table}[htbp]'];\n if (block.centered) {\n lines.push(' \\\\centering');\n }\n lines.push(...floatCaptionLabelLines(block));\n lines.push(indent(tabularInnerLatex(block)));\n lines.push('\\\\end{table}');\n return lines.join('\\n');\n}\n\n/** Prefer \\\\columnwidth so figures fit a column (equals \\\\textwidth in one-column). */\nfunction remapImageWidthForColumns(value: string): string {\n return value.replace(/\\\\textwidth\\b/g, '\\\\columnwidth');\n}\n\nfunction imageOptionsLatex(block: ImageBlock2, constrainToColumn: boolean): string {\n const entries = Object.entries(block.options).map(([key, value]) => {\n if (constrainToColumn && key === 'width') {\n return [key, remapImageWidthForColumns(value)] as const;\n }\n return [key, value] as const;\n });\n if (entries.length === 0) {\n return '';\n }\n return `[${entries.map(([key, value]) => `${key}=${value}`).join(',')}]`;\n}\n\nfunction imageBlockLatex(block: ImageBlock2): string {\n const lines = ['\\\\begin{figure}[htbp]'];\n if (block.centered) {\n lines.push(' \\\\centering');\n }\n // Remap textwidth→columnwidth: safe in one-column, required in twocolumn.\n lines.push(` ${block.command}${imageOptionsLatex(block, true)}{${block.value}}`);\n lines.push(...floatCaptionLabelLines(block));\n lines.push('\\\\end{figure}');\n return lines.join('\\n');\n}\n\nfunction blockLatex(block: Document2Block, references: Document2Node['references']): string {\n if (block.kind === 'textBlock') {\n return textBlockLatex(block);\n }\n if (block.kind === 'list') {\n return listBlockLatex(block, references);\n }\n if (block.kind === 'table') {\n return tableBlockLatex(block);\n }\n if (block.kind === 'image') {\n return imageBlockLatex(block);\n }\n if (block.kind === 'bibliography') {\n const width = String(Math.max(references.length, 9));\n const items = references.map((reference) => ` ${bibliographyEntryLatex(reference)}`).join('\\n');\n return `${block.command}{${width}}\\n${items}\\n${block.closing}`;\n }\n return block.value;\n}\n\nfunction authorLatex(authors: string): string {\n return authors\n .split(/\\n+/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(' \\\\\\\\ ');\n}\n\n/** Title metadata + titling hooks for the XeLaTeX preamble (before \\\\begin{document}). */\nfunction articleMaketitlePreamble(meta: Document2Meta, twocolumn = false): string {\n if (!document2HasMaketitle(meta)) {\n return '';\n }\n const parts: string[] = [butexBasmalaTitlingPreamble({ twocolumn })];\n if (meta.title.trim().length > 0) {\n parts.push(`\\\\title{${meta.title.trim()}}`);\n }\n if (meta.authors.trim().length > 0) {\n parts.push(`\\\\author{${authorLatex(meta.authors)}}`);\n }\n parts.push(`\\\\date{${formatHijriDate(meta.date, { locale: 'ar', digitForm: 'arabicIndic' })}}`);\n return parts.join('\\n');\n}\n\nfunction articleFrontMatterLatex(meta: Document2Meta): string[] {\n const parts: string[] = [];\n if (document2HasMaketitle(meta)) {\n parts.push('\\\\maketitle');\n } else {\n parts.push(butexBasmalaDisplayLatex());\n }\n if (document2HasAbstract(meta)) {\n parts.push(`\\\\begin{abstract}\\n${meta.abstract.trim()}\\n\\\\end{abstract}`);\n }\n return parts;\n}\n\nexport function document2Latex(\n document: Document2Node,\n options: Document2LatexOptions = {},\n): string {\n const meta = document.meta ?? emptyDocument2Meta();\n const twocolumn = options.twocolumn === true;\n const front = articleFrontMatterLatex(meta);\n const bodyBlocks = document.blocks.map((block) => blockLatex(block, document.references));\n const closing = butexDiwaniDisplayLatex(BUTEX_CLOSING_HAMDALA);\n const body = [...front, ...bodyBlocks, closing].filter((part) => part.length > 0).join('\\n\\n');\n const wrapDocument = options.wrapDocument !== false;\n if (!wrapDocument) {\n // Body-only: include title metadata so callers still see \\\\title / titling when present.\n const metaPreamble = articleMaketitlePreamble(meta, twocolumn);\n return metaPreamble.length > 0 ? `${metaPreamble}\\n\\n${body}` : body;\n }\n const preamble =\n getArabicXeLatexPreamble({\n digitsMapping: options.digitsMapping ?? 'arabicdigits',\n twocolumn,\n }) +\n '\\n' +\n articleMaketitlePreamble(meta, twocolumn);\n return `${preamble}\\n\\\\begin{document}\\n\\n${body}\\n\\n\\\\end{document}\\n`;\n}\n","import type { Document2Node } from './types.js';\nimport { cloneDocument2Node } from './commands.js';\n\nexport const DEFAULT_DOCUMENT2_HISTORY_MAX_DEPTH = 100;\n\nexport type Document2HistoryStacks = {\n past: Document2Node[];\n future: Document2Node[];\n maxDepth: number;\n};\n\nexport function createDocument2History(maxDepth: number = DEFAULT_DOCUMENT2_HISTORY_MAX_DEPTH): Document2HistoryStacks {\n return { past: [], future: [], maxDepth };\n}\n\nexport function pushDocument2Snapshot(stacks: Document2HistoryStacks, documentBeforeEdit: Document2Node): void {\n stacks.past.push(cloneDocument2Node(documentBeforeEdit));\n if (stacks.past.length > stacks.maxDepth) {\n stacks.past.splice(0, stacks.past.length - stacks.maxDepth);\n }\n stacks.future = [];\n}\n\nexport function restoreDocument2Undo(stacks: Document2HistoryStacks, documentNow: Document2Node): Document2Node | null {\n if (stacks.past.length === 0) {\n return null;\n }\n stacks.future.push(cloneDocument2Node(documentNow));\n return stacks.past.pop() ?? null;\n}\n\nexport function restoreDocument2Redo(stacks: Document2HistoryStacks, documentNow: Document2Node): Document2Node | null {\n if (stacks.future.length === 0) {\n return null;\n }\n stacks.past.push(cloneDocument2Node(documentNow));\n return stacks.future.pop() ?? null;\n}\n\nexport function document2HistoryCanUndo(stacks: Document2HistoryStacks): boolean {\n return stacks.past.length > 0;\n}\n\nexport function document2HistoryCanRedo(stacks: Document2HistoryStacks): boolean {\n return stacks.future.length > 0;\n}\n","export type BlockSelectionRange = { from: number; to: number };\n\nexport type BlockSelectionState = {\n selection: BlockSelectionRange | null;\n anchor: number | null;\n};\n\nexport function emptyBlockSelection(): BlockSelectionState {\n return { selection: null, anchor: null };\n}\n\nexport function normalizeBlockSelection(\n selection: BlockSelectionRange | null,\n blockCount: number,\n): BlockSelectionRange | null {\n if (!selection) {\n return null;\n }\n const { from, to } = selection;\n if (\n blockCount <= 0 ||\n from < 0 ||\n to < 0 ||\n from >= blockCount ||\n to >= blockCount ||\n from > to\n ) {\n return null;\n }\n return { from, to };\n}\n\nfunction inRange(selection: BlockSelectionRange, index: number): boolean {\n return index >= selection.from && index <= selection.to;\n}\n\n/** Checkbox click without Shift */\nexport function toggleBlockInSelection(\n state: BlockSelectionState,\n index: number,\n blockCount: number,\n): BlockSelectionState {\n if (index < 0 || index >= blockCount) {\n return state;\n }\n\n const selection = normalizeBlockSelection(state.selection, blockCount);\n if (!selection) {\n return { selection: { from: index, to: index }, anchor: index };\n }\n\n if (inRange(selection, index)) {\n if (selection.from === selection.to) {\n return emptyBlockSelection();\n }\n if (index === selection.from) {\n return { selection: { from: selection.from + 1, to: selection.to }, anchor: state.anchor };\n }\n if (index === selection.to) {\n return { selection: { from: selection.from, to: selection.to - 1 }, anchor: state.anchor };\n }\n return emptyBlockSelection();\n }\n\n if (index === selection.from - 1) {\n return { selection: { from: index, to: selection.to }, anchor: state.anchor ?? index };\n }\n if (index === selection.to + 1) {\n return { selection: { from: selection.from, to: index }, anchor: state.anchor ?? index };\n }\n\n return { selection: { from: index, to: index }, anchor: index };\n}\n\n/** Shift+click on checkbox or header label */\nexport function extendBlockSelectionFromAnchor(\n state: BlockSelectionState,\n index: number,\n blockCount: number,\n): BlockSelectionState {\n if (index < 0 || index >= blockCount) {\n return state;\n }\n\n const anchor = state.anchor ?? index;\n const from = Math.min(anchor, index);\n const to = Math.max(anchor, index);\n return {\n selection: { from, to },\n anchor: state.anchor ?? index,\n };\n}\n\nexport function remapSelectionAfterRangeMove(\n selection: BlockSelectionRange,\n direction: -1 | 1,\n): BlockSelectionRange {\n return { from: selection.from + direction, to: selection.to + direction };\n}\n","import { formatBibliographyNumber, formatCiteLabel } from './citations.js';\nimport {\n BUTEX_BASMALA,\n BUTEX_CLOSING_HAMDALA,\n butexBasmalaDisplayTex,\n butexDiwaniDisplayTex,\n document2HasAbstract,\n document2HasMaketitle,\n emptyDocument2Meta,\n formatHijriDate,\n} from './articleMeta.js';\nimport { formatRefLabel, labelNumberMap } from './labels.js';\nimport { mathTokenSourceForSide } from './mathBridge.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { EditorSide } from '../editor/index.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport type {\n Document2Block,\n Document2Direction,\n Document2MathOutput,\n Document2Node,\n Document2Preview,\n InlineField2,\n MathIsland2,\n PreviewBlock2,\n PreviewInline2,\n TextBlock2,\n} from './types.js';\n\nexport type Document2PreviewOptions = {\n documentDirection?: Document2Direction;\n digitForm?: DigitFormId;\n uiLocale?: ButexUiLocale;\n};\n\nfunction mathTex(token: Extract<InlineField2['tokens'][number], { kind: 'math' }>, equationSide: EditorSide): string {\n return mathTokenSourceForSide(token, equationSide);\n}\n\nfunction previewInlines(\n field: InlineField2,\n islands: MathIsland2[],\n output: Document2MathOutput,\n equationSide: EditorSide,\n document: Document2Node,\n previewOptions: Document2PreviewOptions,\n): PreviewInline2[] {\n return field.tokens.map((token) => {\n if (token.kind === 'text') {\n return { kind: 'text', text: token.text };\n }\n if (token.kind === 'cite') {\n return {\n kind: 'cite',\n id: token.id,\n keys: [...token.keys],\n label: formatCiteLabel(token.keys, document.references, {\n documentDirection: previewOptions.documentDirection,\n digitForm: previewOptions.digitForm,\n }),\n };\n }\n if (token.kind === 'ref') {\n return {\n kind: 'ref',\n id: token.id,\n keys: [...token.keys],\n refCommand: token.refCommand,\n label: formatRefLabel(token.keys, document, token.refCommand, {\n documentDirection: previewOptions.documentDirection,\n digitForm: previewOptions.digitForm,\n }),\n };\n }\n const island = {\n id: token.id,\n tex: mathTex(token, equationSide),\n display: token.display,\n output,\n editable: token.editable,\n };\n islands.push(island);\n return { kind: 'math', ...island };\n });\n}\n\nfunction textBlockPreview(\n block: TextBlock2,\n islands: MathIsland2[],\n output: Document2MathOutput,\n equationSide: EditorSide,\n document: Document2Node,\n previewOptions: Document2PreviewOptions,\n): PreviewBlock2 {\n const inlines = previewInlines(block.field, islands, output, equationSide, document, previewOptions);\n if (block.command === '\\\\section') {\n return { kind: 'heading', id: block.id, level: 1, inlines };\n }\n if (block.command === '\\\\subsection') {\n return { kind: 'heading', id: block.id, level: 2, inlines };\n }\n if (block.command === '\\\\subsubsection') {\n return { kind: 'heading', id: block.id, level: 3, inlines };\n }\n return {\n kind: 'paragraph',\n id: block.id,\n inlines,\n ...(block.centered ? { centered: true } : {}),\n };\n}\n\nfunction floatNumberLabel(\n document: Document2Node,\n key: string | undefined,\n previewOptions: Document2PreviewOptions,\n): string | undefined {\n if (!key || key.trim().length === 0) {\n return undefined;\n }\n const hit = labelNumberMap(document).get(key.trim());\n if (!hit || (hit.kind !== 'fig' && hit.kind !== 'tab')) {\n return undefined;\n }\n const locale = previewOptions.uiLocale ?? 'ar';\n const kindWord =\n hit.kind === 'fig'\n ? locale === 'ar'\n ? 'الشكل'\n : 'Figure'\n : locale === 'ar'\n ? 'الجدول'\n : 'Table';\n const digits = formatBibliographyNumber(hit.number, {\n documentDirection: previewOptions.documentDirection,\n digitForm: previewOptions.digitForm,\n });\n return `${kindWord} ${digits}`;\n}\n\nfunction blockPreview(\n block: Document2Block,\n islands: MathIsland2[],\n output: Document2MathOutput,\n equationSide: EditorSide,\n document: Document2Node,\n previewOptions: Document2PreviewOptions,\n): PreviewBlock2 {\n if (block.kind === 'textBlock') {\n return textBlockPreview(block, islands, output, equationSide, document, previewOptions);\n }\n if (block.kind === 'list') {\n return {\n kind: 'list',\n id: block.id,\n ordered: block.command === '\\\\begin{enumerate}',\n items: block.items.map((item) => ({\n id: item.id,\n inlines: previewInlines(item.field, islands, output, equationSide, document, previewOptions),\n blocks: item.blocks.map((child) => blockPreview(child, islands, output, equationSide, document, previewOptions)),\n })),\n };\n }\n if (block.kind === 'table') {\n const label = block.labelEnabled ? block.label.trim() : '';\n return {\n kind: 'table',\n id: block.id,\n rows: block.rows.map((row) => row.map((cell) => previewInlines(cell, islands, output, equationSide, document, previewOptions))),\n ...(block.captionEnabled && block.caption.trim().length > 0 ? { caption: block.caption.trim() } : {}),\n ...(label.length > 0 ? { label, numberLabel: floatNumberLabel(document, label, previewOptions) } : {}),\n };\n }\n if (block.kind === 'image') {\n const label = block.labelEnabled ? block.label.trim() : '';\n return {\n kind: 'image',\n id: block.id,\n src: block.value,\n ...(block.assetId !== undefined ? { assetId: block.assetId } : {}),\n options: block.options,\n ...(block.captionEnabled && block.caption.trim().length > 0 ? { caption: block.caption.trim() } : {}),\n ...(label.length > 0 ? { label, numberLabel: floatNumberLabel(document, label, previewOptions) } : {}),\n };\n }\n if (block.kind === 'bibliography') {\n return {\n kind: 'bibliography',\n id: block.id,\n items: document.references.map((reference, index) => ({\n id: reference.id,\n numberLabel: formatBibliographyNumber(index + 1, {\n documentDirection: previewOptions.documentDirection,\n digitForm: previewOptions.digitForm,\n }),\n key: reference.key,\n authors: reference.authors,\n title: reference.title,\n year: reference.year,\n url: reference.url,\n venue: reference.venue,\n })),\n };\n }\n return { kind: 'omit', id: block.id };\n}\n\nfunction articleChromePreview(\n document: Document2Node,\n uiLocale: ButexUiLocale,\n previewOptions: Document2PreviewOptions,\n): PreviewBlock2[] {\n const meta = document.meta ?? emptyDocument2Meta();\n const blocks: PreviewBlock2[] = [\n { kind: 'basmala', id: 'article-basmala', text: BUTEX_BASMALA, tex: butexBasmalaDisplayTex() },\n ];\n if (document2HasMaketitle(meta)) {\n blocks.push({\n kind: 'titleBlock',\n id: 'article-title',\n ...(meta.title.trim().length > 0 ? { title: meta.title.trim() } : {}),\n ...(meta.authors.trim().length > 0 ? { authors: meta.authors.trim() } : {}),\n date: formatHijriDate(meta.date, {\n locale: uiLocale,\n digitForm: previewOptions.digitForm,\n }),\n });\n }\n if (document2HasAbstract(meta)) {\n blocks.push({ kind: 'abstract', id: 'article-abstract', text: meta.abstract.trim() });\n }\n return blocks;\n}\n\nexport function document2Preview(\n document: Document2Node,\n output: Document2MathOutput = 'svg',\n equationSide: EditorSide = 'arabic',\n previewOptions: Document2PreviewOptions = {},\n): Document2Preview {\n const mathIslands: MathIsland2[] = [];\n const options: Document2PreviewOptions = {\n documentDirection: previewOptions.documentDirection ?? 'rtl',\n digitForm:\n previewOptions.digitForm ??\n (previewOptions.documentDirection === 'ltr' ? 'western' : 'arabicIndic'),\n uiLocale: previewOptions.uiLocale ?? 'ar',\n };\n const body = document.blocks.map((block) => blockPreview(block, mathIslands, output, equationSide, document, options));\n return {\n blocks: [\n ...articleChromePreview(document, options.uiLocale ?? 'ar', options),\n ...body,\n { kind: 'closing', id: 'article-closing', text: BUTEX_CLOSING_HAMDALA, tex: butexDiwaniDisplayTex(BUTEX_CLOSING_HAMDALA) },\n ],\n mathIslands,\n };\n}\n","import type { ButexUiLocale } from '../uiLocale.js';\n\nexport const DOCUMENT2_MESSAGES = {\n ar: {\n undoRedo: 'تراجع وإعادة', undo: 'تراجع', redo: 'إعادة', structure: 'هيكل', content: 'محتوى',\n equations: 'معادلات', citations: 'اقتباسات ومراجع', lists: 'قوائم', figures: 'صور',\n addSection: 'إضافة قسم',\n addSubsection: 'إضافة فرع', addSubsubsection: 'إضافة فرع صغير', addParagraph: 'إضافة فقرة',\n inlineEquation: 'معادلة داخل السطر', displayEquation: 'معادلة معروضة', bulletedList: 'قائمة نقطية',\n numberedList: 'قائمة مرقمة', insertImage: 'إدراج صورة', insertTable: 'إدراج جدول', tableSize: 'حجم الجدول',\n rows: 'صفوف', columns: 'أعمدة', insert: 'إدراج', panels: 'اللوحات', hideEditor: 'إخفاء التحرير', editor: 'تحرير',\n hidePreview: 'إخفاء المعاينة', preview: 'معاينة', collapseBlocks: 'طي الكتل', collapseAll: 'طي الكل', openAll: 'فتح الكل',\n documentEditor: 'تحرير المستند', documentPreview: 'معاينة المستند', importWarnings: 'تنبيهات الاستيراد (وضع التطوير)',\n emptyDocument: 'المستند فارغ', text: 'نص', editEquation: 'تحرير المعادلة', rawEquation: 'معادلة خام',\n deleteEquation: 'حذف المعادلة', equationUnavailable: 'هذه المعادلة غير متاحة للتحرير حاليا', closeEquationDialog: 'إغلاق نافذة المعادلة',\n equationEditorTitle: 'تحرير المعادلة', close: 'إغلاق', equationType: 'نوع المعادلة', inline: 'داخل السطر', displayed: 'معروضة',\n saveEquation: 'حفظ المعادلة', section: 'قسم', subsection: 'فرع', subsubsection: 'فرع صغير', paragraph: 'فقرة',\n list: 'قائمة', table: 'جدول', image: 'صورة', raw: 'خام', bibliography: 'المراجع', openBlock: 'فتح الكتلة', collapseBlock: 'طي الكتلة',\n moveUp: 'نقل لأعلى', moveDown: 'نقل لأسفل', deleteBlock: 'حذف الكتلة', item: 'عنصر', deleteItem: 'حذف العنصر',\n addItem: 'عنصر', imagePath: 'مسار ملف الصورة', imagePathLabel: 'مسار الصورة', loadDocumentError: 'تعذر تحميل المستند',\n emptyImagePath: 'لا يوجد مسار صورة',\n blockSelection: 'تحديد الكتل', selectBlock: 'تحديد الكتلة', selectedBlockCount: 'محددة',\n importOrderMismatch: 'ترتيب أو أنواع المحددات في math_objects لا تطابق ما ورد في النص.',\n importCountMismatch: 'عدم تطابق بين المواضع الرياضية المستخرجة من النص وعدد عناصر math_objects.',\n importWarning: 'تنبيه الاستيراد', path: 'المسار', sectionGlyph: 'ق', subsectionGlyph: 'ف', subsubsectionGlyph: 'ص', paragraphGlyph: 'أبج',\n insertCitation: 'إدراج اقتباس', insertBibliography: 'إدراج قائمة المراجع', manageReferences: 'إدارة المراجع',\n insertInternalRef: 'إدراج مرجع داخلي', manageLabels: 'إدارة التسميات',\n refPickerTitle: 'اختيار تسمية', noLabelsYet: 'لا توجد تسميات بعد. أضف تسمية لشكل أو جدول أو معادلة أولاً.',\n editInternalRef: 'تحرير المرجع الداخلي', deleteInternalRef: 'حذف المرجع الداخلي',\n labelsTitle: 'التسميات والمراجع الداخلية', labelsHelp: 'التسميات للمراجع داخل المستند؛ المراجع الببليوغرافية للاقتباسات من قائمة المراجع.',\n captionToggle: 'تعليق', labelToggle: 'تسمية', centerParagraph: 'توسيط الفقرة', captionPlaceholder: 'نص التعليق',\n figureLabelPlaceholder: 'مفتاح…', tableLabelPlaceholder: 'مفتاح…', equationLabelPlaceholder: 'مفتاح…',\n floatCaption: 'التعليق', floatLabel: 'المفتاح', labelKindFig: 'شكل', labelKindTab: 'جدول', labelKindEq: 'معادلة',\n citePickerTitle: 'اختيار المراجع', noReferencesYet: 'لا توجد مراجع بعد. أضف مرجعاً أولاً.',\n editCitation: 'تحرير الاقتباس', deleteCitation: 'حذف الاقتباس', referencesTitle: 'المراجع', addReference: 'إضافة مرجع',\n deleteReference: 'حذف المرجع', referenceKey: 'المفتاح', referenceAuthors: 'المؤلفون', referenceTitle: 'العنوان',\n referenceYear: 'السنة', referenceVenue: 'المجلة / المؤتمر', referenceUrl: 'الرابط', chooseDigitForm: 'شكل الأرقام',\n westernDigits: 'أرقام غربية', arabicIndicDigits: 'أرقام عربية هندية', persianIndicDigits: 'أرقام فارسية',\n articleMetaTitle: 'عنوان المقال', articleTitle: 'العنوان', articleAuthors: 'المؤلفون',\n articleDate: 'التاريخ الهجري', articleDay: 'اليوم', articleMonth: 'الشهر', articleYear: 'السنة',\n articleAbstract: 'ملخص', articleMetaBadge: 'بيانات المقال',\n },\n en: {\n undoRedo: 'Undo and redo', undo: 'Undo', redo: 'Redo', structure: 'Structure', content: 'Content',\n equations: 'Equations', citations: 'Citations and references', lists: 'Lists', figures: 'Figures',\n addSection: 'Add section',\n addSubsection: 'Add subsection', addSubsubsection: 'Add subsubsection', addParagraph: 'Add paragraph',\n inlineEquation: 'Inline equation', displayEquation: 'Display equation', bulletedList: 'Bulleted list', numberedList: 'Numbered list',\n insertImage: 'Insert image', insertTable: 'Insert table', tableSize: 'Table size', rows: 'Rows', columns: 'Columns', insert: 'Insert',\n panels: 'Panels', hideEditor: 'Hide editor', editor: 'Editor', hidePreview: 'Hide preview', preview: 'Preview',\n collapseBlocks: 'Collapse blocks', collapseAll: 'Collapse all', openAll: 'Open all', documentEditor: 'Document editor',\n documentPreview: 'Document preview', importWarnings: 'Import warnings (development mode)', emptyDocument: 'The document is empty',\n text: 'Text', editEquation: 'Edit equation', rawEquation: 'Raw equation', deleteEquation: 'Delete equation',\n equationUnavailable: 'This equation is not currently available for editing', closeEquationDialog: 'Close equation dialog',\n equationEditorTitle: 'Edit equation', close: 'Close', equationType: 'Equation type', inline: 'Inline', displayed: 'Displayed',\n saveEquation: 'Save equation', section: 'Section', subsection: 'Subsection', subsubsection: 'Subsubsection', paragraph: 'Paragraph',\n list: 'List', table: 'Table', image: 'Image', raw: 'Raw', bibliography: 'Bibliography', openBlock: 'Open block', collapseBlock: 'Collapse block',\n moveUp: 'Move up', moveDown: 'Move down', deleteBlock: 'Delete block', item: 'Item', deleteItem: 'Delete item', addItem: 'Item',\n imagePath: 'File path (\\\\includegraphics)', imagePathLabel: 'Image path', loadDocumentError: 'Could not load document',\n emptyImagePath: 'Empty image path',\n blockSelection: 'Block selection', selectBlock: 'Select block', selectedBlockCount: 'selected',\n importOrderMismatch: 'The math_objects delimiter order or types do not match the document text.',\n importCountMismatch: 'The detected math positions do not match the number of math_objects entries.', importWarning: 'Import warning', path: 'Path',\n sectionGlyph: 'H1', subsectionGlyph: 'H2', subsubsectionGlyph: 'H3', paragraphGlyph: 'P',\n insertCitation: 'Insert citation', insertBibliography: 'Insert bibliography', manageReferences: 'Manage references',\n insertInternalRef: 'Insert internal reference', manageLabels: 'Manage labels',\n refPickerTitle: 'Select label', noLabelsYet: 'No labels yet. Enable a label on a figure, table, or equation first.',\n editInternalRef: 'Edit internal reference', deleteInternalRef: 'Delete internal reference',\n labelsTitle: 'Labels and internal refs', labelsHelp: 'Labels are for in-document refs; bibliography entries are for citations from the reference list.',\n captionToggle: 'Caption', labelToggle: 'Label', centerParagraph: 'Center paragraph', captionPlaceholder: 'Caption text',\n figureLabelPlaceholder: 'fig:…', tableLabelPlaceholder: 'tab:…', equationLabelPlaceholder: 'eq:…',\n floatCaption: 'Caption', floatLabel: 'Key', labelKindFig: 'Figure', labelKindTab: 'Table', labelKindEq: 'Equation',\n citePickerTitle: 'Select references', noReferencesYet: 'No references yet. Add a reference first.',\n editCitation: 'Edit citation', deleteCitation: 'Delete citation', referencesTitle: 'References', addReference: 'Add reference',\n deleteReference: 'Delete reference', referenceKey: 'Key', referenceAuthors: 'Authors', referenceTitle: 'Title',\n referenceYear: 'Year', referenceVenue: 'Journal / conference', referenceUrl: 'URL', chooseDigitForm: 'Digit form',\n westernDigits: 'Western digits', arabicIndicDigits: 'Arabic-Indic digits', persianIndicDigits: 'Persian digits',\n articleMetaTitle: 'Article title', articleTitle: 'Title', articleAuthors: 'Authors',\n articleDate: 'Hijri date', articleDay: 'Day', articleMonth: 'Month', articleYear: 'Year',\n articleAbstract: 'Abstract', articleMetaBadge: 'Article meta',\n },\n} as const;\n\nexport type Document2Messages = (typeof DOCUMENT2_MESSAGES)['ar'] | (typeof DOCUMENT2_MESSAGES)['en'];\n\nexport function document2Messages(locale: ButexUiLocale): Document2Messages {\n return DOCUMENT2_MESSAGES[locale];\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n addDocument2ImageBlock,\n addDocument2ListBlock,\n addDocument2ListItem,\n addDocument2Reference,\n addDocument2TableBlock,\n addDocument2TextBlock,\n collectDocument2Labels,\n createDocument2History,\n createEmptyEquationSession,\n createEmptyDocument2,\n document2HistoryCanRedo,\n document2HistoryCanUndo,\n document2Latex,\n document2Preview,\n emptyBlockSelection,\n ensureDocument2BibliographyBlock,\n extendBlockSelectionFromAnchor,\n fromDocumentJson2,\n insertCiteTokenAtCaret,\n insertMathTokenAtCaret,\n insertRefTokenAtCaret,\n mathTokenToEditorSession,\n moveDocument2BlockRange,\n moveDocument2Reference,\n normalizeBlockSelection,\n pushDocument2Snapshot,\n remapSelectionAfterRangeMove,\n removeCiteTokenById,\n removeDocument2BlockRange,\n removeDocument2ListItem,\n removeDocument2Reference,\n removeMathTokenById,\n removeRefTokenById,\n replaceMathTokenFromSession,\n restoreDocument2Redo,\n restoreDocument2Undo,\n toggleBlockInSelection,\n updateCiteTokenKeys,\n updateDocument2ImageMeta,\n updateDocument2ImageValue,\n updateDocument2Reference,\n updateDocument2TableMeta,\n updateMathTokenLabel,\n updateRefTokenKeys,\n updateTextToken,\n updateDocument2TextBlockCentered,\n updateDocument2Meta,\n emptyDocument2Meta,\n mergeDocument2Meta,\n fillDocument2MetaGaps,\n type CiteToken2,\n type Document2Diagnostic,\n type Document2HistoryStacks,\n type Document2MetaProp,\n type InlineField2,\n type Document2Json,\n type Document2MathOutput,\n type Document2Node,\n type MathToken2,\n type RefToken2,\n} from '../document2/index.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { EditorSession, EditorSide } from '../editor/index.js';\nimport { ArticleMetaPanel, focusArticleMetaPanel } from './ArticleMetaPanel.js';\nimport { BlockEditor } from './BlockEditor.js';\nimport { CitePickerPopover } from './CitePickerPopover.js';\nimport { DocumentInsertToolbar } from './DocumentInsertToolbar.js';\nimport { DocumentPreview } from './DocumentPreview.js';\nimport { EquationDrawer, type EquationMathMode } from './EquationDrawer.js';\nimport { LabelsPanel } from './LabelsPanel.js';\nimport { ReferencesPanel } from './ReferencesPanel.js';\nimport { RefPickerPopover } from './RefPickerPopover.js';\nimport { createEmptyDocument2EditorFocus, resolveInsertAfterBlockId, resolveInsertField, type Document2EditorFocus } from './editorFocus.js';\nimport { injectBuTeXDocument2Styles } from './documentWidgetCss2.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { uiLocaleDirection } from '../uiLocale.js';\nimport { document2Messages, type Document2Messages } from './uiMessages.js';\n\nexport type ButexDocumentEditor2Props = {\n initialDocument?: Document2Json | Document2Node;\n /** Seed article metadata when JSON/node omits fields (JSON wins when present). */\n documentMeta?: Document2MetaProp;\n className?: string;\n debug?: boolean;\n documentDirection?: 'rtl' | 'ltr';\n equationSide?: EditorSide;\n editableEquations?: boolean;\n /** When true, render only the read-only document preview (no toolbar, editor panel, or equation drawer). */\n previewOnly?: boolean;\n uiLocale?: ButexUiLocale;\n mathOutput?: Document2MathOutput;\n /** Digit shaping for citation and bibliography numbers (western / arabicIndic / persianIndic). */\n digitForm?: DigitFormId;\n onDigitFormChange?: (digitForm: DigitFormId) => void;\n /** Host maps assetId / literal value to a browser-loadable image URL (S3, CDN, local). */\n resolveImageUrl?: (ref: { assetId?: string; value: string }) => string;\n onDocumentChange?: (document: Document2Node) => void;\n onLatexChange?: (latex: string) => void;\n};\n\nexport type Document2InitialState = {\n document: Document2Node;\n error: string | null;\n};\n\ntype SelectedMath2 = {\n tokenId: string | null;\n fieldId: string | null;\n insertAt: number;\n textTokenId: string | null;\n mathMode: EquationMathMode;\n session: EditorSession;\n reason: string | null;\n labelEnabled: boolean;\n label: string;\n};\n\ntype SelectedCite2 = {\n tokenId: string | null;\n fieldId: string | null;\n textTokenId: string | null;\n caretOffset: number;\n keys: string[];\n};\n\ntype SelectedRef2 = {\n tokenId: string | null;\n fieldId: string | null;\n textTokenId: string | null;\n caretOffset: number;\n keys: string[];\n refCommand: 'ref' | 'eqref';\n};\n\ntype PendingFocus2 =\n | { kind: 'text'; fieldId: string; textTokenId: string; caretOffset: number }\n | { kind: 'math'; tokenId: string }\n | { kind: 'cite'; tokenId: string }\n | { kind: 'ref'; tokenId: string };\n\nfunction mathDelimiters(mode: EquationMathMode): { opening: string; closing: string } {\n return mode === 'inline' ? { opening: '$', closing: '$' } : { opening: '\\\\[', closing: '\\\\]' };\n}\n\nfunction findInlineFieldById(document: Document2Node, fieldId: string): InlineField2 | null {\n function visit(blocks: Document2Node['blocks']): InlineField2 | null {\n for (const block of blocks) {\n if (block.kind === 'textBlock' && block.field.id === fieldId) {\n return block.field;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (item.field.id === fieldId) {\n return item.field;\n }\n const nested = visit(item.blocks);\n if (nested) {\n return nested;\n }\n }\n }\n if (block.kind === 'table') {\n for (const row of block.rows) {\n for (const cell of row) {\n if (cell.id === fieldId) {\n return cell;\n }\n }\n }\n }\n }\n return null;\n }\n return visit(document.blocks);\n}\n\nfunction findInlineFieldContainingToken(document: Document2Node, tokenId: string): InlineField2 | null {\n function visit(blocks: Document2Node['blocks']): InlineField2 | null {\n for (const block of blocks) {\n if (block.kind === 'textBlock' && block.field.tokens.some((token) => token.id === tokenId)) {\n return block.field;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (item.field.tokens.some((token) => token.id === tokenId)) {\n return item.field;\n }\n const nested = visit(item.blocks);\n if (nested) {\n return nested;\n }\n }\n }\n if (block.kind === 'table') {\n for (const row of block.rows) {\n for (const cell of row) {\n if (cell.tokens.some((token) => token.id === tokenId)) {\n return cell;\n }\n }\n }\n }\n }\n return null;\n }\n return visit(document.blocks);\n}\n\nfunction trailingTextTokenAfterInsertedMath(\n before: Document2Node,\n after: Document2Node,\n fieldId: string,\n textTokenId: string | null,\n caretOffset: number,\n): string | null {\n const afterField = findInlineFieldById(after, fieldId);\n if (!afterField) {\n return null;\n }\n if (!textTokenId) {\n const lastText = [...afterField.tokens].reverse().find((token) => token.kind === 'text');\n return lastText?.id ?? null;\n }\n\n const beforeField = findInlineFieldById(before, fieldId);\n const beforeIndex = beforeField?.tokens.findIndex((token) => token.id === textTokenId) ?? -1;\n const beforeToken = beforeField?.tokens[beforeIndex];\n if (!beforeToken || beforeToken.kind !== 'text') {\n return null;\n }\n\n const safeOffset = Math.max(0, Math.min(caretOffset, beforeToken.text.length));\n const expectedIndex = beforeIndex + (safeOffset > 0 ? 2 : 1);\n const expected = afterField.tokens[expectedIndex];\n if (expected?.kind === 'text') {\n return expected.id;\n }\n const nextText = afterField.tokens.slice(expectedIndex).find((token) => token.kind === 'text');\n return nextText?.id ?? null;\n}\n\nfunction focusAfterDeletedMath(before: Document2Node, after: Document2Node, tokenId: string): PendingFocus2 | null {\n const beforeField = findInlineFieldContainingToken(before, tokenId);\n if (!beforeField) {\n return null;\n }\n const index = beforeField.tokens.findIndex((token) => token.id === tokenId);\n const previous = beforeField.tokens[index - 1];\n const next = beforeField.tokens[index + 1];\n const afterField = findInlineFieldById(after, beforeField.id);\n if (!afterField) {\n return null;\n }\n if (previous?.kind === 'text') {\n return { kind: 'text', fieldId: beforeField.id, textTokenId: previous.id, caretOffset: previous.text.length };\n }\n if (next?.kind === 'text') {\n return { kind: 'text', fieldId: beforeField.id, textTokenId: next.id, caretOffset: 0 };\n }\n const remainingText = afterField.tokens.find((token) => token.kind === 'text');\n return remainingText?.kind === 'text' ? { kind: 'text', fieldId: beforeField.id, textTokenId: remainingText.id, caretOffset: 0 } : null;\n}\n\nfunction blockHasField(block: Document2Node['blocks'][number], fieldId: string): boolean {\n if (block.kind === 'textBlock') {\n return block.field.id === fieldId;\n }\n if (block.kind === 'list') {\n return block.items.some((item) => item.field.id === fieldId || item.blocks.some((child) => blockHasField(child, fieldId)));\n }\n if (block.kind === 'table') {\n return block.rows.some((row) => row.some((cell) => cell.id === fieldId));\n }\n return false;\n}\n\nfunction blockHasToken(block: Document2Node['blocks'][number], tokenId: string): boolean {\n if (block.kind === 'textBlock') {\n return block.field.tokens.some((token) => token.id === tokenId);\n }\n if (block.kind === 'list') {\n return block.items.some(\n (item) => item.field.tokens.some((token) => token.id === tokenId) || item.blocks.some((child) => blockHasToken(child, tokenId)),\n );\n }\n if (block.kind === 'table') {\n return block.rows.some((row) => row.some((cell) => cell.tokens.some((token) => token.id === tokenId)));\n }\n return false;\n}\n\nfunction topLevelBlockIdForField(document: Document2Node, fieldId: string): string | null {\n return document.blocks.find((block) => blockHasField(block, fieldId))?.id ?? null;\n}\n\nfunction topLevelBlockIdForToken(document: Document2Node, tokenId: string): string | null {\n return document.blocks.find((block) => blockHasToken(block, tokenId))?.id ?? null;\n}\n\nfunction formatDocument2Diagnostic(d: Document2Diagnostic, messages: Document2Messages): string {\n if (d.message === 'math_objects order mismatch') {\n return `${messages.importOrderMismatch} ${messages.path}: ${d.path}`;\n }\n const countMismatch = /^math_objects count mismatch: detected (\\d+), got (\\d+)$/.exec(d.message);\n if (countMismatch) {\n const [, detected, got] = countMismatch;\n return `${messages.importCountMismatch} (${detected}/${got}) ${messages.path}: ${d.path}`;\n }\n return `${messages.importWarning}: ${d.message} — ${messages.path}: ${d.path}`;\n}\n\nfunction isDocument2Node(value: unknown): value is Document2Node {\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 Array.isArray((value as { diagnostics?: unknown }).diagnostics)\n );\n}\n\nfunction applyDocumentMetaSeed(document: Document2Node, documentMeta?: Document2MetaProp): Document2Node {\n const current = document.meta ?? emptyDocument2Meta();\n return {\n ...document,\n meta: fillDocument2MetaGaps(current, documentMeta),\n };\n}\n\nexport function resolveInitialDocument2(\n initialDocument: Document2Json | Document2Node | undefined,\n uiLocale: ButexUiLocale = 'ar',\n documentMeta?: Document2MetaProp,\n): Document2InitialState {\n if (!initialDocument) {\n return {\n document: applyDocumentMetaSeed(createEmptyDocument2(), documentMeta),\n error: null,\n };\n }\n if (isDocument2Node(initialDocument)) {\n return { document: applyDocumentMetaSeed(initialDocument, documentMeta), error: null };\n }\n try {\n const imported = fromDocumentJson2(initialDocument);\n return {\n document: {\n ...imported,\n meta: mergeDocument2Meta(initialDocument.meta, documentMeta),\n },\n error: null,\n };\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n return {\n document: applyDocumentMetaSeed(createEmptyDocument2(), documentMeta),\n error: `${document2Messages(uiLocale).loadDocumentError}: ${detail}`,\n };\n }\n}\n\nexport function ButexDocumentEditor2({\n initialDocument,\n documentMeta,\n className,\n debug = false,\n documentDirection = 'rtl',\n equationSide = 'arabic',\n editableEquations = true,\n previewOnly = false,\n uiLocale = 'ar',\n mathOutput = 'svg',\n digitForm: digitFormProp,\n onDigitFormChange,\n resolveImageUrl,\n onDocumentChange,\n onLatexChange,\n}: ButexDocumentEditor2Props) {\n const messages = document2Messages(uiLocale);\n const initialState = useMemo(\n () => resolveInitialDocument2(initialDocument, uiLocale, documentMeta),\n [initialDocument, documentMeta, uiLocale],\n );\n const [documentNode, setDocumentNode] = useState(initialState.document);\n const [error, setError] = useState(initialState.error);\n const [editorOpen, setEditorOpen] = useState(true);\n const [previewOpen, setPreviewOpen] = useState(true);\n const [selectedMath, setSelectedMath] = useState<SelectedMath2 | null>(null);\n const [citePicker, setCitePicker] = useState<SelectedCite2 | null>(null);\n const [referencesOpen, setReferencesOpen] = useState(false);\n const [labelsOpen, setLabelsOpen] = useState(false);\n const [refPicker, setRefPicker] = useState<SelectedRef2 | null>(null);\n const [digitFormState, setDigitFormState] = useState<DigitFormId | null>(null);\n const [editorFocus, setEditorFocus] = useState<Document2EditorFocus>(createEmptyDocument2EditorFocus());\n const [collapsedBlockIds, setCollapsedBlockIds] = useState<Set<string>>(() => new Set());\n const [blockSelectionState, setBlockSelectionState] = useState(emptyBlockSelection);\n const [historyTick, setHistoryTick] = useState(0);\n\n const digitForm: DigitFormId =\n digitFormProp ?? digitFormState ?? (documentDirection === 'rtl' ? 'arabicIndic' : 'western');\n\n const historyRef = useRef<Document2HistoryStacks>(createDocument2History());\n const documentRef = useRef(documentNode);\n const textSnapshotArmedRef = useRef(false);\n const textDebounceRef = useRef<number | null>(null);\n const widgetRef = useRef<HTMLDivElement>(null);\n const articleMetaPanelRef = useRef<HTMLElement | null>(null);\n const pendingFocusRef = useRef<PendingFocus2 | null>(null);\n\n documentRef.current = documentNode;\n const latex = document2Latex(documentNode);\n const documentLabels = useMemo(() => collectDocument2Labels(documentNode), [documentNode]);\n const preview = useMemo(\n () =>\n document2Preview(documentNode, mathOutput, equationSide, {\n documentDirection,\n digitForm,\n uiLocale,\n }),\n [documentNode, documentDirection, digitForm, equationSide, mathOutput, uiLocale],\n );\n const debugEnabled = useMemo(() => {\n if (debug) {\n return true;\n }\n if (typeof window === 'undefined') {\n return false;\n }\n return new URLSearchParams(window.location.search).get('debug') === '1';\n }, [debug]);\n\n const canUndo = useMemo(() => document2HistoryCanUndo(historyRef.current), [historyTick, documentNode]);\n const canRedo = useMemo(() => document2HistoryCanRedo(historyRef.current), [historyTick, documentNode]);\n const blockSelection = normalizeBlockSelection(blockSelectionState.selection, documentNode.blocks.length);\n const selectionCount = blockSelection ? blockSelection.to - blockSelection.from + 1 : 0;\n const canMoveSelectionUp = Boolean(blockSelection && blockSelection.from > 0);\n const canMoveSelectionDown = Boolean(blockSelection && blockSelection.to < documentNode.blocks.length - 1);\n\n function clearBlockSelection(): void {\n setBlockSelectionState(emptyBlockSelection());\n }\n\n function toggleSelectBlock(blockId: string, shiftKey: boolean): void {\n const index = documentRef.current.blocks.findIndex((block) => block.id === blockId);\n if (index < 0) {\n return;\n }\n const blockCount = documentRef.current.blocks.length;\n setBlockSelectionState((current) =>\n shiftKey\n ? extendBlockSelectionFromAnchor(current, index, blockCount)\n : toggleBlockInSelection(current, index, blockCount),\n );\n }\n\n function moveSelectedBlocks(direction: -1 | 1): void {\n const selection = normalizeBlockSelection(blockSelectionState.selection, documentRef.current.blocks.length);\n if (!selection) {\n return;\n }\n const next = moveDocument2BlockRange(documentRef.current, selection.from, selection.to, direction);\n if (next === documentRef.current) {\n return;\n }\n applyDocument(next, 'immediate');\n const remapped = remapSelectionAfterRangeMove(selection, direction);\n setBlockSelectionState({\n selection: normalizeBlockSelection(remapped, next.blocks.length),\n anchor: blockSelectionState.anchor === null ? null : blockSelectionState.anchor + direction,\n });\n }\n\n function deleteSelectedBlocks(): void {\n const selection = normalizeBlockSelection(blockSelectionState.selection, documentRef.current.blocks.length);\n if (!selection) {\n return;\n }\n applyDocument(removeDocument2BlockRange(documentRef.current, selection.from, selection.to), 'immediate');\n clearBlockSelection();\n }\n\n useEffect(() => {\n injectBuTeXDocument2Styles();\n }, []);\n\n useEffect(() => {\n if (!editableEquations || previewOnly) {\n setSelectedMath(null);\n }\n }, [editableEquations, previewOnly]);\n\n useEffect(() => {\n const next = resolveInitialDocument2(initialDocument, uiLocale, documentMeta);\n setDocumentNode(next.document);\n setError(next.error);\n setSelectedMath(null);\n setCollapsedBlockIds(new Set());\n historyRef.current = createDocument2History();\n setHistoryTick((tick) => tick + 1);\n }, [initialDocument, documentMeta, uiLocale]);\n\n useEffect(() => {\n onDocumentChange?.(documentNode);\n }, [documentNode, onDocumentChange]);\n\n useEffect(() => {\n onLatexChange?.(latex);\n }, [latex, onLatexChange]);\n\n useEffect(() => {\n const pending = pendingFocusRef.current;\n const root = widgetRef.current;\n if (!pending || !root) {\n return;\n }\n pendingFocusRef.current = null;\n requestAnimationFrame(() => {\n if (pending.kind === 'math') {\n const mathButton = Array.from(root.querySelectorAll<HTMLButtonElement>('[data-math-token-id]')).find(\n (button) => button.dataset.mathTokenId === pending.tokenId,\n );\n mathButton?.focus();\n return;\n }\n if (pending.kind === 'cite') {\n const citeButton = Array.from(root.querySelectorAll<HTMLButtonElement>('[data-cite-token-id]')).find(\n (button) => button.dataset.citeTokenId === pending.tokenId,\n );\n citeButton?.focus();\n return;\n }\n if (pending.kind === 'ref') {\n const refButton = Array.from(root.querySelectorAll<HTMLButtonElement>('[data-ref-token-id]')).find(\n (button) => button.dataset.refTokenId === pending.tokenId,\n );\n refButton?.focus();\n return;\n }\n const textarea = Array.from(root.querySelectorAll<HTMLTextAreaElement>('textarea[data-field-id][data-text-token-id]')).find(\n (element) => element.dataset.fieldId === pending.fieldId && element.dataset.textTokenId === pending.textTokenId,\n );\n if (!textarea) {\n return;\n }\n const safeOffset = Math.max(0, Math.min(pending.caretOffset, textarea.value.length));\n textarea.focus();\n textarea.setSelectionRange(safeOffset, safeOffset);\n });\n }, [documentNode]);\n\n const bumpHistoryUi = useCallback(() => {\n setHistoryTick((tick) => tick + 1);\n }, []);\n\n const applyDocument = useCallback(\n (next: Document2Node, mode: 'immediate' | 'text' | 'none' = 'immediate') => {\n if (mode === 'immediate') {\n pushDocument2Snapshot(historyRef.current, documentRef.current);\n bumpHistoryUi();\n } else if (mode === 'text') {\n if (!textSnapshotArmedRef.current) {\n pushDocument2Snapshot(historyRef.current, documentRef.current);\n textSnapshotArmedRef.current = true;\n bumpHistoryUi();\n }\n if (textDebounceRef.current !== null) {\n window.clearTimeout(textDebounceRef.current);\n }\n textDebounceRef.current = window.setTimeout(() => {\n textSnapshotArmedRef.current = false;\n }, 400);\n }\n setDocumentNode(next);\n },\n [bumpHistoryUi],\n );\n\n const afterBlockId = useCallback(() => resolveInsertAfterBlockId(documentRef.current, editorFocus), [editorFocus]);\n\n function undoDocument(): void {\n const restored = restoreDocument2Undo(historyRef.current, documentRef.current);\n if (!restored) {\n return;\n }\n textSnapshotArmedRef.current = false;\n clearBlockSelection();\n setDocumentNode(restored);\n bumpHistoryUi();\n }\n\n function redoDocument(): void {\n const restored = restoreDocument2Redo(historyRef.current, documentRef.current);\n if (!restored) {\n return;\n }\n textSnapshotArmedRef.current = false;\n clearBlockSelection();\n setDocumentNode(restored);\n bumpHistoryUi();\n }\n\n function openBlock(blockId: string | null | undefined): void {\n if (!blockId) {\n return;\n }\n setCollapsedBlockIds((current) => {\n if (!current.has(blockId)) {\n return current;\n }\n const next = new Set(current);\n next.delete(blockId);\n return next;\n });\n }\n\n function toggleBlockCollapse(blockId: string): void {\n setCollapsedBlockIds((current) => {\n const next = new Set(current);\n if (next.has(blockId)) {\n next.delete(blockId);\n } else {\n next.add(blockId);\n }\n return next;\n });\n }\n\n function collapseAllBlocks(): void {\n setCollapsedBlockIds(new Set(documentRef.current.blocks.map((block) => block.id)));\n }\n\n function openAllBlocks(): void {\n setCollapsedBlockIds(new Set());\n }\n\n useEffect(() => {\n const root = widgetRef.current;\n if (!root) {\n return;\n }\n const onKeyDown = (event: KeyboardEvent): void => {\n if (!editorOpen) {\n return;\n }\n const mod = event.ctrlKey || event.metaKey;\n if (!mod) {\n return;\n }\n if (event.key.toLowerCase() === 'z' && !event.shiftKey) {\n event.preventDefault();\n undoDocument();\n } else if ((event.key.toLowerCase() === 'z' && event.shiftKey) || event.key.toLowerCase() === 'y') {\n event.preventDefault();\n redoDocument();\n }\n };\n root.addEventListener('keydown', onKeyDown);\n return () => root.removeEventListener('keydown', onKeyDown);\n }, [editorOpen]);\n\n function rememberFieldFocus(blockId: string, fieldId: string, textTokenId: string, caretOffset: number): void {\n openBlock(blockId);\n clearBlockSelection();\n setEditorFocus({ blockId, fieldId, textTokenId, caretOffset });\n }\n\n function rememberMathFocus(blockId: string, fieldId: string): void {\n openBlock(blockId);\n clearBlockSelection();\n setEditorFocus({ blockId, fieldId, textTokenId: null, caretOffset: 0 });\n }\n\n function rememberBlockFocus(blockId: string): void {\n openBlock(blockId);\n setEditorFocus((current) => ({ ...current, blockId }));\n }\n\n function onFieldBlur(): void {\n textSnapshotArmedRef.current = false;\n }\n\n function openNewEquation(mode: EquationMathMode): void {\n if (!editableEquations) {\n return;\n }\n const target = resolveInsertField(documentRef.current, editorFocus);\n if (target?.fieldId) {\n openBlock(topLevelBlockIdForField(documentRef.current, target.fieldId));\n }\n setSelectedMath({\n tokenId: null,\n fieldId: target?.fieldId ?? null,\n textTokenId: target?.textTokenId ?? null,\n insertAt: target?.caretOffset ?? 0,\n mathMode: mode,\n session: createEmptyEquationSession(equationSide),\n reason: null,\n labelEnabled: false,\n label: '',\n });\n }\n\n function openMath(token: MathToken2): void {\n if (!editableEquations) {\n return;\n }\n openBlock(topLevelBlockIdForToken(documentRef.current, token.id));\n const result = mathTokenToEditorSession(token.math, equationSide);\n const mode: EquationMathMode = token.display ? 'display' : 'inline';\n if (!result.editable) {\n setSelectedMath({\n tokenId: token.id,\n fieldId: null,\n insertAt: 0,\n textTokenId: null,\n mathMode: mode,\n session: createEmptyEquationSession(equationSide),\n reason: result.reason,\n labelEnabled: Boolean(token.labelEnabled),\n label: token.label ?? '',\n });\n return;\n }\n setSelectedMath({\n tokenId: token.id,\n fieldId: null,\n insertAt: 0,\n textTokenId: null,\n mathMode: mode,\n session: result.session,\n reason: null,\n labelEnabled: Boolean(token.labelEnabled),\n label: token.label ?? '',\n });\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 saveEquation(session: EditorSession): void {\n if (!selectedMath) {\n return;\n }\n const delimiters = mathDelimiters(selectedMath.mathMode);\n if (selectedMath.tokenId) {\n let next = replaceMathTokenFromSession(\n documentRef.current,\n selectedMath.tokenId,\n session,\n delimiters.opening,\n delimiters.closing,\n equationSide,\n );\n if (selectedMath.mathMode === 'display') {\n next = updateMathTokenLabel(next, selectedMath.tokenId, {\n labelEnabled: selectedMath.labelEnabled,\n label: selectedMath.label,\n });\n } else {\n next = updateMathTokenLabel(next, selectedMath.tokenId, { labelEnabled: false, label: '' });\n }\n pendingFocusRef.current = { kind: 'math', tokenId: selectedMath.tokenId };\n applyDocument(next, 'immediate');\n setSelectedMath(null);\n return;\n }\n\n let current = documentRef.current;\n let fieldId = selectedMath.fieldId;\n let textTokenId = selectedMath.textTokenId;\n let insertAt = selectedMath.insertAt;\n\n if (!fieldId) {\n const anchor = afterBlockId();\n current = addDocument2TextBlock(current, '\\\\paragraph', anchor);\n const anchorIndex = anchor ? current.blocks.findIndex((block) => block.id === anchor) : -1;\n const newIndex = anchorIndex >= 0 ? anchorIndex + 1 : current.blocks.length - 1;\n const newBlock = current.blocks[newIndex];\n const field = newBlock?.kind === 'textBlock' ? newBlock.field : null;\n if (!field) {\n setSelectedMath(null);\n return;\n }\n fieldId = field.id;\n textTokenId = field.tokens.find((token) => token.kind === 'text')?.id ?? null;\n insertAt = 0;\n }\n\n let next = insertMathTokenAtCaret(\n current,\n fieldId,\n textTokenId,\n insertAt,\n session,\n delimiters.opening,\n delimiters.closing,\n equationSide,\n );\n const trailingTextTokenId = trailingTextTokenAfterInsertedMath(current, next, fieldId, textTokenId, insertAt);\n const fieldAfter = findInlineFieldById(next, fieldId);\n const insertedMathId =\n trailingTextTokenId && fieldAfter\n ? fieldAfter.tokens[\n Math.max(\n 0,\n fieldAfter.tokens.findIndex((token) => token.id === trailingTextTokenId) - 1,\n )\n ]?.kind === 'math'\n ? fieldAfter.tokens[\n Math.max(\n 0,\n fieldAfter.tokens.findIndex((token) => token.id === trailingTextTokenId) - 1,\n )\n ]?.id\n : null\n : fieldAfter?.tokens.filter((token) => token.kind === 'math').at(-1)?.id ?? null;\n if (insertedMathId && selectedMath.mathMode === 'display' && selectedMath.labelEnabled) {\n next = updateMathTokenLabel(next, insertedMathId, {\n labelEnabled: true,\n label: selectedMath.label,\n });\n }\n if (trailingTextTokenId) {\n pendingFocusRef.current = { kind: 'text', fieldId, textTokenId: trailingTextTokenId, caretOffset: 0 };\n }\n applyDocument(next, 'immediate');\n setSelectedMath(null);\n }\n\n function deleteSelectedEquation(): void {\n if (!selectedMath?.tokenId) {\n return;\n }\n const current = documentRef.current;\n const next = removeMathTokenById(current, selectedMath.tokenId);\n pendingFocusRef.current = focusAfterDeletedMath(current, next, selectedMath.tokenId);\n applyDocument(next, 'immediate');\n setSelectedMath(null);\n }\n\n function deleteMathToken(tokenId: string): void {\n const current = documentRef.current;\n const next = removeMathTokenById(current, tokenId);\n pendingFocusRef.current = focusAfterDeletedMath(current, next, tokenId);\n applyDocument(next, 'immediate');\n }\n\n function openCitePickerForInsert(): void {\n const target = resolveInsertField(documentRef.current, editorFocus);\n setCitePicker({\n tokenId: null,\n fieldId: target?.fieldId ?? null,\n textTokenId: target?.textTokenId ?? editorFocus.textTokenId,\n caretOffset: target?.caretOffset ?? editorFocus.caretOffset,\n keys: [],\n });\n }\n\n function openCite(token: CiteToken2): void {\n setCitePicker({\n tokenId: token.id,\n fieldId: null,\n textTokenId: null,\n caretOffset: 0,\n keys: [...token.keys],\n });\n }\n\n function confirmCiteKeys(keys: string[]): void {\n if (!citePicker || keys.length === 0) {\n setCitePicker(null);\n return;\n }\n if (citePicker.tokenId) {\n applyDocument(updateCiteTokenKeys(documentRef.current, citePicker.tokenId, keys), 'immediate');\n pendingFocusRef.current = { kind: 'cite', tokenId: citePicker.tokenId };\n setCitePicker(null);\n return;\n }\n const target = resolveInsertField(documentRef.current, editorFocus);\n const fieldId = citePicker.fieldId ?? target?.fieldId;\n if (!fieldId) {\n setCitePicker(null);\n return;\n }\n const textTokenId = citePicker.textTokenId ?? target?.textTokenId ?? null;\n const caretOffset = citePicker.caretOffset ?? target?.caretOffset ?? 0;\n const next = insertCiteTokenAtCaret(documentRef.current, fieldId, textTokenId, caretOffset, keys);\n applyDocument(next, 'immediate');\n setCitePicker(null);\n }\n\n function deleteCiteToken(tokenId: string): void {\n applyDocument(removeCiteTokenById(documentRef.current, tokenId), 'immediate');\n }\n\n function openRefPickerForInsert(): void {\n const target = resolveInsertField(documentRef.current, editorFocus);\n setRefPicker({\n tokenId: null,\n fieldId: target?.fieldId ?? null,\n textTokenId: target?.textTokenId ?? editorFocus.textTokenId,\n caretOffset: target?.caretOffset ?? editorFocus.caretOffset,\n keys: [],\n refCommand: 'ref',\n });\n }\n\n function openRef(token: RefToken2): void {\n setRefPicker({\n tokenId: token.id,\n fieldId: null,\n textTokenId: null,\n caretOffset: 0,\n keys: [...token.keys],\n refCommand: token.refCommand,\n });\n }\n\n function confirmRefKeys(keys: string[], refCommand: 'ref' | 'eqref'): void {\n if (!refPicker || keys.length === 0) {\n setRefPicker(null);\n return;\n }\n if (refPicker.tokenId) {\n applyDocument(updateRefTokenKeys(documentRef.current, refPicker.tokenId, keys, refCommand), 'immediate');\n pendingFocusRef.current = { kind: 'ref', tokenId: refPicker.tokenId };\n setRefPicker(null);\n return;\n }\n const target = resolveInsertField(documentRef.current, editorFocus);\n const fieldId = refPicker.fieldId ?? target?.fieldId;\n if (!fieldId) {\n setRefPicker(null);\n return;\n }\n const textTokenId = refPicker.textTokenId ?? target?.textTokenId ?? null;\n const caretOffset = refPicker.caretOffset ?? target?.caretOffset ?? 0;\n const next = insertRefTokenAtCaret(documentRef.current, fieldId, textTokenId, caretOffset, keys, refCommand);\n applyDocument(next, 'immediate');\n setRefPicker(null);\n }\n\n function deleteRefToken(tokenId: string): void {\n applyDocument(removeRefTokenById(documentRef.current, tokenId), 'immediate');\n }\n\n const showEditorPanel = !previewOnly && editorOpen;\n const showPreviewPanel = previewOnly || previewOpen;\n\n return (\n <div\n ref={widgetRef}\n className={['butex-document2-widget', className].filter(Boolean).join(' ')}\n dir={uiLocaleDirection(uiLocale)}\n lang={uiLocale}\n >\n <div className=\"butex-document2-widget__shell\">\n {!previewOnly ? (\n <div className=\"butex-document2-widget__toolbar\">\n <DocumentInsertToolbar\n canUndo={canUndo}\n canRedo={canRedo}\n editableEquations={editableEquations}\n uiLocale={uiLocale}\n digitForm={digitForm}\n selectionCount={selectionCount}\n canMoveSelectionUp={canMoveSelectionUp}\n canMoveSelectionDown={canMoveSelectionDown}\n onUndo={undoDocument}\n onRedo={redoDocument}\n onMoveSelectionUp={() => moveSelectedBlocks(-1)}\n onMoveSelectionDown={() => moveSelectedBlocks(1)}\n onDeleteSelection={deleteSelectedBlocks}\n onAddSection={() => {\n clearBlockSelection();\n applyDocument(addDocument2TextBlock(documentRef.current, '\\\\section', afterBlockId()), 'immediate');\n }}\n onAddSubsection={() => {\n clearBlockSelection();\n applyDocument(addDocument2TextBlock(documentRef.current, '\\\\subsection', afterBlockId()), 'immediate');\n }}\n onAddSubsubsection={() => {\n clearBlockSelection();\n applyDocument(addDocument2TextBlock(documentRef.current, '\\\\subsubsection', afterBlockId()), 'immediate');\n }}\n onAddParagraph={() => {\n clearBlockSelection();\n applyDocument(addDocument2TextBlock(documentRef.current, '\\\\paragraph', afterBlockId()), 'immediate');\n }}\n onAddInlineEquation={() => openNewEquation('inline')}\n onAddDisplayEquation={() => openNewEquation('display')}\n onAddTable={(rowCount, colCount) => {\n clearBlockSelection();\n applyDocument(addDocument2TableBlock(documentRef.current, 'l'.repeat(colCount), rowCount, colCount, afterBlockId()), 'immediate');\n }}\n onAddList={() => {\n clearBlockSelection();\n applyDocument(addDocument2ListBlock(documentRef.current, false, afterBlockId()), 'immediate');\n }}\n onAddEnumerate={() => {\n clearBlockSelection();\n applyDocument(addDocument2ListBlock(documentRef.current, true, afterBlockId()), 'immediate');\n }}\n onAddFigure={() => {\n clearBlockSelection();\n applyDocument(addDocument2ImageBlock(documentRef.current, '', afterBlockId()), 'immediate');\n }}\n onInsertCitation={openCitePickerForInsert}\n onInsertInternalRef={openRefPickerForInsert}\n onInsertBibliography={() => {\n clearBlockSelection();\n applyDocument(ensureDocument2BibliographyBlock(documentRef.current, afterBlockId()), 'immediate');\n }}\n onManageReferences={() => setReferencesOpen(true)}\n onManageLabels={() => setLabelsOpen(true)}\n onOpenArticleMeta={() => focusArticleMetaPanel(articleMetaPanelRef.current)}\n onDigitFormChange={(next) => {\n setDigitFormState(next);\n onDigitFormChange?.(next);\n }}\n />\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.panels}>\n <button type=\"button\" aria-pressed={editorOpen} onClick={toggleEditorPanel}>\n {editorOpen ? messages.hideEditor : messages.editor}\n </button>\n <button type=\"button\" aria-pressed={previewOpen} onClick={togglePreviewPanel}>\n {previewOpen ? messages.hidePreview : messages.preview}\n </button>\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.collapseBlocks}>\n <button type=\"button\" onClick={collapseAllBlocks}>\n {messages.collapseAll}\n </button>\n <button type=\"button\" onClick={openAllBlocks}>\n {messages.openAll}\n </button>\n </div>\n </div>\n ) : null}\n {error ? <p className=\"butex-document2-widget__error\">{error}</p> : null}\n <div\n className={`butex-document2-widget__layout butex-document2-widget__layout--editor-${showEditorPanel ? 'open' : 'closed'} butex-document2-widget__layout--preview-${showPreviewPanel ? 'open' : 'closed'}`}\n >\n {!previewOnly ? (\n <section\n className=\"butex-document2-widget__panel butex-document2-widget__editor-panel\"\n aria-label={messages.documentEditor}\n aria-hidden={!showEditorPanel}\n >\n <div className=\"butex-document2-widget__blocks\">\n <ArticleMetaPanel\n meta={documentNode.meta ?? emptyDocument2Meta()}\n uiLocale={uiLocale}\n digitForm={digitForm}\n panelRef={articleMetaPanelRef}\n onChange={(patch) => {\n clearBlockSelection();\n applyDocument(updateDocument2Meta(documentRef.current, patch), 'text');\n }}\n />\n {documentNode.blocks.map((block, blockIndex) => (\n <BlockEditor\n key={block.id}\n block={block}\n references={documentNode.references}\n documentNode={documentNode}\n documentDirection={documentDirection}\n digitForm={digitForm}\n mathOutput={mathOutput}\n equationSide={equationSide}\n editableEquations={editableEquations}\n editableCitations={!previewOnly}\n uiLocale={uiLocale}\n isCollapsed={collapsedBlockIds.has(block.id)}\n selected={Boolean(blockSelection && blockIndex >= blockSelection.from && blockIndex <= blockSelection.to)}\n onToggleSelect={toggleSelectBlock}\n onTextChange={(fieldId, tokenId, text) => {\n clearBlockSelection();\n applyDocument(updateTextToken(documentRef.current, fieldId, tokenId, text), 'text');\n }}\n onOpenMath={openMath}\n onDeleteMath={editableEquations ? deleteMathToken : undefined}\n onOpenCite={openCite}\n onDeleteCite={deleteCiteToken}\n onOpenRef={openRef}\n onDeleteRef={deleteRefToken}\n onToggleCollapse={toggleBlockCollapse}\n onBlockFocus={rememberBlockFocus}\n onFieldFocus={rememberFieldFocus}\n onMathFocus={rememberMathFocus}\n onFieldBlur={onFieldBlur}\n onImageSrcChange={(blockId, value) => {\n clearBlockSelection();\n applyDocument(updateDocument2ImageValue(documentRef.current, blockId, value), 'text');\n }}\n onFloatMetaChange={(blockId, kind, patch) => {\n clearBlockSelection();\n applyDocument(\n kind === 'image'\n ? updateDocument2ImageMeta(documentRef.current, blockId, patch)\n : updateDocument2TableMeta(documentRef.current, blockId, patch),\n 'text',\n );\n }}\n onParagraphCenteredChange={(blockId, centered) => {\n clearBlockSelection();\n applyDocument(updateDocument2TextBlockCentered(documentRef.current, blockId, centered), 'text');\n }}\n onAddListItem={(listBlockId) => {\n clearBlockSelection();\n applyDocument(addDocument2ListItem(documentRef.current, listBlockId), 'immediate');\n }}\n onRemoveListItem={(listBlockId, itemId) => {\n clearBlockSelection();\n applyDocument(removeDocument2ListItem(documentRef.current, listBlockId, itemId), 'immediate');\n }}\n onManageReferences={() => setReferencesOpen(true)}\n />\n ))}\n </div>\n </section>\n ) : null}\n <section\n className=\"butex-document2-widget__panel butex-document2-widget__preview-panel\"\n aria-label={messages.documentPreview}\n aria-hidden={!showPreviewPanel}\n >\n <DocumentPreview\n blocks={preview.blocks}\n output={mathOutput}\n documentDirection={documentDirection}\n uiLocale={uiLocale}\n resolveImageUrl={resolveImageUrl}\n />\n </section>\n </div>\n {debugEnabled ? (\n <div className=\"butex-document2-widget__dev\">\n {debugEnabled && documentNode.diagnostics.length > 0 ? (\n <>\n <strong>{messages.importWarnings}</strong>\n {documentNode.diagnostics.map((diagnostic) => (\n <p key={`${diagnostic.path}-${diagnostic.message}`} className=\"butex-document2-widget__dev-diagnostic\">\n {formatDocument2Diagnostic(diagnostic, messages)}\n </p>\n ))}\n </>\n ) : null}\n <strong>LaTeX</strong>\n <pre>{latex}</pre>\n <strong>AST</strong>\n <pre>{JSON.stringify(documentNode, null, 2)}</pre>\n </div>\n ) : null}\n {!previewOnly && selectedMath ? (\n <EquationDrawer\n session={selectedMath.session}\n reason={selectedMath.reason}\n mathMode={selectedMath.mathMode}\n canDelete={Boolean(selectedMath.tokenId)}\n equationSide={equationSide}\n uiLocale={uiLocale}\n labelEnabled={selectedMath.labelEnabled}\n label={selectedMath.label}\n onLabelEnabledChange={(enabled) =>\n setSelectedMath((current) => (current ? { ...current, labelEnabled: enabled } : current))\n }\n onLabelChange={(nextLabel) => setSelectedMath((current) => (current ? { ...current, label: nextLabel } : current))}\n onMathModeChange={(mode) => setSelectedMath((current) => (current ? { ...current, mathMode: mode } : current))}\n onClose={() => setSelectedMath(null)}\n onSave={saveEquation}\n onDelete={deleteSelectedEquation}\n />\n ) : null}\n {!previewOnly ? (\n <CitePickerPopover\n open={citePicker !== null}\n references={documentNode.references}\n initialKeys={citePicker?.keys ?? []}\n uiLocale={uiLocale}\n onClose={() => setCitePicker(null)}\n onConfirm={confirmCiteKeys}\n onManageReferences={() => {\n setCitePicker(null);\n setReferencesOpen(true);\n }}\n />\n ) : null}\n {!previewOnly ? (\n <RefPickerPopover\n open={refPicker !== null}\n labels={documentLabels}\n initialKeys={refPicker?.keys ?? []}\n initialRefCommand={refPicker?.refCommand ?? 'ref'}\n uiLocale={uiLocale}\n onClose={() => setRefPicker(null)}\n onConfirm={confirmRefKeys}\n onManageLabels={() => {\n setRefPicker(null);\n setLabelsOpen(true);\n }}\n />\n ) : null}\n {!previewOnly ? (\n <ReferencesPanel\n open={referencesOpen}\n references={documentNode.references}\n uiLocale={uiLocale}\n onClose={() => setReferencesOpen(false)}\n onAdd={(partial) => applyDocument(addDocument2Reference(documentRef.current, partial), 'immediate')}\n onUpdate={(referenceId, patch) =>\n applyDocument(updateDocument2Reference(documentRef.current, referenceId, patch), 'immediate')\n }\n onRemove={(referenceId) => applyDocument(removeDocument2Reference(documentRef.current, referenceId), 'immediate')}\n onMove={(referenceId, direction) =>\n applyDocument(moveDocument2Reference(documentRef.current, referenceId, direction), 'immediate')\n }\n />\n ) : null}\n {!previewOnly ? (\n <LabelsPanel\n open={labelsOpen}\n labels={documentLabels}\n uiLocale={uiLocale}\n onClose={() => setLabelsOpen(false)}\n onUpdateFloat={(ownerId, kind, patch) =>\n applyDocument(\n kind === 'fig'\n ? updateDocument2ImageMeta(documentRef.current, ownerId, patch)\n : updateDocument2TableMeta(documentRef.current, ownerId, patch),\n 'text',\n )\n }\n onUpdateEquationLabel={(tokenId, patch) =>\n applyDocument(updateMathTokenLabel(documentRef.current, tokenId, patch), 'text')\n }\n />\n ) : null}\n </div>\n </div>\n );\n}\n","import { useRef } from 'react';\nimport type {\n CiteToken2,\n Document2MathOutput,\n Document2Node,\n InlineField2,\n MathToken2,\n Reference2,\n RefToken2,\n} from '../document2/index.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { EditorSide } from '../editor/index.js';\nimport { CiteChip } from './CiteChip.js';\nimport { MathChip } from './MathChip.js';\nimport { RefChip } from './RefChip.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type InlineFieldProps = {\n field: InlineField2;\n blockId?: string;\n references?: Reference2[];\n documentNode?: Document2Node;\n documentDirection?: 'rtl' | 'ltr';\n digitForm?: DigitFormId;\n mathOutput?: Document2MathOutput;\n equationSide?: EditorSide;\n editableEquations?: boolean;\n editableCitations?: boolean;\n uiLocale?: ButexUiLocale;\n onTextChange: (fieldId: string, tokenId: string, text: string) => void;\n onOpenMath: (token: MathToken2) => void;\n onDeleteMath?: (tokenId: string) => void;\n onOpenCite?: (token: CiteToken2) => void;\n onDeleteCite?: (tokenId: string) => void;\n onOpenRef?: (token: RefToken2) => void;\n onDeleteRef?: (tokenId: string) => void;\n onFieldFocus?: (blockId: string, fieldId: string, textTokenId: string, caretOffset: number) => void;\n onMathFocus?: (blockId: string, fieldId: string, tokenId: string) => void;\n onCiteFocus?: (blockId: string, fieldId: string, tokenId: string) => void;\n onRefFocus?: (blockId: string, fieldId: string, tokenId: string) => void;\n onFieldBlur?: () => void;\n};\n\nfunction rememberCaret(\n element: HTMLTextAreaElement,\n blockId: string | undefined,\n fieldId: string,\n tokenId: string,\n onFieldFocus?: InlineFieldProps['onFieldFocus'],\n): void {\n if (!blockId || !onFieldFocus) {\n return;\n }\n onFieldFocus(blockId, fieldId, tokenId, element.selectionStart ?? element.value.length);\n}\n\nfunction fitTextareaHeight(element: HTMLTextAreaElement | null): void {\n if (!element) {\n return;\n }\n const contentWidth = Math.max(3, Math.min(72, element.value.length + 2));\n element.style.width = `${String(contentWidth)}ch`;\n element.style.height = 'auto';\n element.style.height = `${String(element.scrollHeight)}px`;\n}\n\nexport function InlineField({\n field,\n blockId,\n references = [],\n documentNode,\n documentDirection = 'rtl',\n digitForm,\n mathOutput = 'svg',\n equationSide = 'arabic',\n editableEquations = true,\n editableCitations = true,\n uiLocale = 'ar',\n onTextChange,\n onOpenMath,\n onDeleteMath,\n onOpenCite,\n onDeleteCite,\n onOpenRef,\n onDeleteRef,\n onFieldFocus,\n onMathFocus,\n onCiteFocus,\n onRefFocus,\n onFieldBlur,\n}: InlineFieldProps) {\n const messages = document2Messages(uiLocale);\n const textRefs = useRef(new Map<string, HTMLTextAreaElement>());\n const mathRefs = useRef(new Map<string, HTMLButtonElement>());\n const citeRefs = useRef(new Map<string, HTMLButtonElement>());\n const refTokenRefs = useRef(new Map<string, HTMLButtonElement>());\n\n function textTokenOffset(tokenId: string, fallback: 'start' | 'end'): number {\n const token = field.tokens.find((entry) => entry.id === tokenId && entry.kind === 'text');\n if (!token || token.kind !== 'text') {\n return 0;\n }\n return fallback === 'start' ? 0 : token.text.length;\n }\n\n function focusTextToken(tokenId: string, offset: number): void {\n requestAnimationFrame(() => {\n const element = textRefs.current.get(tokenId);\n if (!element) {\n return;\n }\n const safeOffset = Math.max(0, Math.min(offset, element.value.length));\n element.focus();\n element.setSelectionRange(safeOffset, safeOffset);\n fitTextareaHeight(element);\n rememberCaret(element, blockId, field.id, tokenId, onFieldFocus);\n });\n }\n\n function focusMathToken(tokenId: string): void {\n requestAnimationFrame(() => {\n mathRefs.current.get(tokenId)?.focus();\n });\n }\n\n function focusCiteToken(tokenId: string): void {\n requestAnimationFrame(() => {\n citeRefs.current.get(tokenId)?.focus();\n });\n }\n\n function focusRefToken(tokenId: string): void {\n requestAnimationFrame(() => {\n refTokenRefs.current.get(tokenId)?.focus();\n });\n }\n\n function adjacentTokenId(tokenId: string, direction: -1 | 1, kind: 'math' | 'text' | 'cite' | 'ref'): string | null {\n const index = field.tokens.findIndex((token) => token.id === tokenId);\n if (index < 0) {\n return null;\n }\n for (let i = index + direction; i >= 0 && i < field.tokens.length; i += direction) {\n const token = field.tokens[i];\n if (token?.kind === kind) {\n return token.id;\n }\n }\n return null;\n }\n\n function adjacentIslandId(tokenId: string, direction: -1 | 1): { kind: 'math' | 'cite' | 'ref'; id: string } | null {\n const index = field.tokens.findIndex((token) => token.id === tokenId);\n if (index < 0) {\n return null;\n }\n for (let i = index + direction; i >= 0 && i < field.tokens.length; i += direction) {\n const token = field.tokens[i];\n if (token?.kind === 'math' || token?.kind === 'cite' || token?.kind === 'ref') {\n return { kind: token.kind, id: token.id };\n }\n }\n return null;\n }\n\n function focusTextNearIsland(tokenId: string, direction: -1 | 1): void {\n const fallbackDirection = direction === 1 ? -1 : 1;\n const textTokenId = adjacentTokenId(tokenId, direction, 'text') ?? adjacentTokenId(tokenId, fallbackDirection, 'text');\n if (!textTokenId) {\n return;\n }\n focusTextToken(textTokenId, textTokenOffset(textTokenId, direction === 1 ? 'start' : 'end'));\n }\n\n function typeFromMath(tokenId: string, text: string): void {\n const nextTextTokenId = adjacentTokenId(tokenId, 1, 'text');\n const textTokenId = nextTextTokenId ?? adjacentTokenId(tokenId, -1, 'text');\n if (!textTokenId) {\n return;\n }\n const token = field.tokens.find((entry) => entry.id === textTokenId && entry.kind === 'text');\n if (!token || token.kind !== 'text') {\n return;\n }\n const insertAtStart = nextTextTokenId === textTokenId;\n const nextText = insertAtStart ? `${text}${token.text}` : `${token.text}${text}`;\n onTextChange(field.id, textTokenId, nextText);\n focusTextToken(textTokenId, insertAtStart ? text.length : nextText.length);\n }\n\n const forwardArrowKey = documentDirection === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n const backwardArrowKey = documentDirection === 'rtl' ? 'ArrowRight' : 'ArrowLeft';\n\n return (\n <div className=\"butex-document2-widget__inline-field\" dir={documentDirection} data-document-direction={documentDirection}>\n {field.tokens.map((token) => {\n if (token.kind === 'text') {\n return (\n <textarea\n key={token.id}\n className=\"butex-document2-widget__inline-text\"\n value={token.text}\n dir={documentDirection}\n aria-label={messages.text}\n rows={1}\n data-field-id={field.id}\n data-text-token-id={token.id}\n ref={(element) => {\n if (element) {\n textRefs.current.set(token.id, element);\n fitTextareaHeight(element);\n } else {\n textRefs.current.delete(token.id);\n }\n }}\n onChange={(event) => {\n onTextChange(field.id, token.id, event.currentTarget.value);\n fitTextareaHeight(event.currentTarget);\n }}\n onKeyDown={(event) => {\n const element = event.currentTarget;\n const collapsed = element.selectionStart === element.selectionEnd;\n if (!collapsed) {\n return;\n }\n if (event.key === forwardArrowKey && element.selectionStart === element.value.length) {\n const next = adjacentIslandId(token.id, 1);\n if (next) {\n event.preventDefault();\n if (next.kind === 'math') {\n focusMathToken(next.id);\n } else if (next.kind === 'cite') {\n focusCiteToken(next.id);\n } else {\n focusRefToken(next.id);\n }\n }\n } else if (event.key === backwardArrowKey && element.selectionStart === 0) {\n const previous = adjacentIslandId(token.id, -1);\n if (previous) {\n event.preventDefault();\n if (previous.kind === 'math') {\n focusMathToken(previous.id);\n } else if (previous.kind === 'cite') {\n focusCiteToken(previous.id);\n } else {\n focusRefToken(previous.id);\n }\n }\n }\n }}\n onFocus={(event) => rememberCaret(event.currentTarget, blockId, field.id, token.id, onFieldFocus)}\n onClick={(event) => rememberCaret(event.currentTarget, blockId, field.id, token.id, onFieldFocus)}\n onKeyUp={(event) => {\n rememberCaret(event.currentTarget, blockId, field.id, token.id, onFieldFocus);\n fitTextareaHeight(event.currentTarget);\n }}\n onSelect={(event) => rememberCaret(event.currentTarget, blockId, field.id, token.id, onFieldFocus)}\n onBlur={() => onFieldBlur?.()}\n />\n );\n }\n\n if (token.kind === 'cite') {\n return (\n <CiteChip\n key={token.id}\n token={token}\n references={references}\n documentDirection={documentDirection}\n digitForm={digitForm}\n editable={editableCitations}\n uiLocale={uiLocale}\n buttonRef={(element) => {\n if (element) {\n citeRefs.current.set(token.id, element);\n } else {\n citeRefs.current.delete(token.id);\n }\n }}\n onOpen={(citeToken) => onOpenCite?.(citeToken)}\n onDelete={editableCitations ? onDeleteCite : undefined}\n onFocus={(tokenId) => {\n if (blockId && onCiteFocus) {\n onCiteFocus(blockId, field.id, tokenId);\n }\n }}\n onRequestTextFocus={focusTextNearIsland}\n />\n );\n }\n\n if (token.kind === 'ref') {\n if (!documentNode) {\n return null;\n }\n return (\n <RefChip\n key={token.id}\n token={token}\n document={documentNode}\n documentDirection={documentDirection}\n digitForm={digitForm}\n editable={editableCitations}\n uiLocale={uiLocale}\n buttonRef={(element) => {\n if (element) {\n refTokenRefs.current.set(token.id, element);\n } else {\n refTokenRefs.current.delete(token.id);\n }\n }}\n onOpen={(refToken) => onOpenRef?.(refToken)}\n onDelete={editableCitations ? onDeleteRef : undefined}\n onFocus={(tokenId) => {\n if (blockId && onRefFocus) {\n onRefFocus(blockId, field.id, tokenId);\n }\n }}\n onRequestTextFocus={focusTextNearIsland}\n />\n );\n }\n\n return (\n <MathChip\n key={token.id}\n token={token}\n output={mathOutput}\n equationSide={equationSide}\n editable={editableEquations}\n uiLocale={uiLocale}\n buttonRef={(element) => {\n if (element) {\n mathRefs.current.set(token.id, element);\n } else {\n mathRefs.current.delete(token.id);\n }\n }}\n onOpen={onOpenMath}\n onDelete={onDeleteMath}\n documentDirection={documentDirection}\n onFocus={(tokenId) => {\n if (blockId && onMathFocus) {\n onMathFocus(blockId, field.id, tokenId);\n }\n }}\n onRequestTextFocus={focusTextNearIsland}\n onTextInputFromFocus={typeFromMath}\n />\n );\n })}\n </div>\n );\n}\n","import { formatCiteLabel } from '../document2/index.js';\nimport type { CiteToken2, Reference2 } from '../document2/index.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type CiteChipProps = {\n token: CiteToken2;\n references: Reference2[];\n documentDirection?: 'rtl' | 'ltr';\n digitForm?: DigitFormId;\n editable?: boolean;\n uiLocale?: ButexUiLocale;\n buttonRef?: (element: HTMLButtonElement | null) => void;\n onOpen: (token: CiteToken2) => void;\n onDelete?: (tokenId: string) => void;\n onFocus?: (tokenId: string) => void;\n onRequestTextFocus?: (tokenId: string, direction: -1 | 1) => void;\n};\n\nexport function CiteChip({\n token,\n references,\n documentDirection = 'rtl',\n digitForm,\n editable = true,\n uiLocale = 'ar',\n buttonRef,\n onOpen,\n onDelete,\n onFocus,\n onRequestTextFocus,\n}: CiteChipProps) {\n const messages = document2Messages(uiLocale);\n const label = formatCiteLabel(token.keys, references, { documentDirection, digitForm });\n const forwardArrowKey = documentDirection === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n const backwardArrowKey = documentDirection === 'rtl' ? 'ArrowRight' : 'ArrowLeft';\n\n if (!editable) {\n return (\n <span className=\"butex-document2-widget__cite-chip-wrap\">\n <span className=\"butex-document2-widget__cite-chip\" data-editable=\"false\">\n {label}\n </span>\n </span>\n );\n }\n\n return (\n <span className=\"butex-document2-widget__cite-chip-wrap\">\n <button\n type=\"button\"\n className=\"butex-document2-widget__cite-chip\"\n data-editable=\"true\"\n data-cite-token-id={token.id}\n ref={buttonRef}\n title={messages.editCitation}\n onClick={() => onOpen(token)}\n onFocus={() => onFocus?.(token.id)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n onOpen(token);\n return;\n }\n if (event.key === forwardArrowKey) {\n event.preventDefault();\n onRequestTextFocus?.(token.id, 1);\n return;\n }\n if (event.key === backwardArrowKey) {\n event.preventDefault();\n onRequestTextFocus?.(token.id, -1);\n }\n }}\n >\n {label}\n </button>\n {onDelete ? (\n <button\n type=\"button\"\n className=\"butex-document2-widget__cite-chip-delete\"\n title={messages.deleteCitation}\n aria-label={messages.deleteCitation}\n onClick={(event) => {\n event.stopPropagation();\n onDelete(token.id);\n }}\n >\n ×\n </button>\n ) : null}\n </span>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport {\n normalizeBuTeXMathInput,\n patchBuTeXSvgMathAfterLayout,\n renderBuTeXMathIsland,\n type BuTeXMathOutput,\n} from '../mathjax/renderIsland.js';\n\nexport type MathIslandProps = {\n id: string;\n tex: string;\n display: boolean;\n output?: BuTeXMathOutput;\n};\n\nexport function MathIsland({ id, tex, display, output = 'svg' }: MathIslandProps) {\n const ref = useRef<HTMLSpanElement | null>(null);\n const version = useRef(0);\n const [error, setError] = useState<string | null>(null);\n const [renderState, setRenderState] = useState<'loading' | 'ready' | 'error'>('loading');\n\n useEffect(() => {\n let cancelled = false;\n version.current += 1;\n const renderVersion = version.current;\n const target = ref.current;\n\n if (!target) {\n return;\n }\n\n target.textContent = tex;\n setError(null);\n setRenderState('loading');\n\n void (async () => {\n try {\n const normalized = normalizeBuTeXMathInput(tex, output);\n const renderDisplay = display || normalized.display;\n const node = await renderBuTeXMathIsland(tex, { display: renderDisplay, output });\n if (cancelled || renderVersion !== version.current) {\n return;\n }\n const latestTarget = ref.current;\n if (!latestTarget) {\n return;\n }\n latestTarget.replaceChildren(node);\n if (output === 'svg') {\n patchBuTeXSvgMathAfterLayout(latestTarget);\n }\n setRenderState('ready');\n } catch (err) {\n if (cancelled || renderVersion !== version.current) {\n return;\n }\n const latestTarget = ref.current;\n if (!latestTarget) {\n return;\n }\n setError(err instanceof Error ? err.message : String(err));\n setRenderState('error');\n latestTarget.textContent = tex;\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [display, output, tex]);\n\n return (\n <span\n ref={ref}\n className=\"butex-document2-widget__math-island\"\n data-display={display ? 'true' : 'false'}\n data-math-id={id}\n data-render-state={renderState}\n title={error ?? undefined}\n >\n {tex}\n </span>\n );\n}\n","const SVG_ARABSQRT_SELECTOR = 'mjx-container[jax=\"SVG\"] svg .mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]';\nconst ARABSQRT_SELECTOR = '.mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]';\nconst PATCHED_ATTR = 'data-butex-svg-arabsqrt';\nconst ROOT_INDEX_SCALE = 0.72;\nconst ROOT_INDEX_GAP_FACTOR = 0.08;\nconst ROOT_INDEX_MIN_GAP = 2;\nconst ROOT_INDEX_Y_RAISE = 18;\nconst ROOT_INDEX_LEFT_SHIFT = 360;\nconst VIEWBOX_PADDING = 20;\n\ntype SvgBox = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\ntype SvgPlacement = SvgBox & {\n visualX: number;\n visualY: number;\n translateX: number;\n translateY: number;\n};\n\nfunction closestArabSqrtRoot(element: Element): Element | null {\n return element.closest('.mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]');\n}\n\nfunction rootDepth(root: Element): number {\n let depth = 0;\n let parent = root.parentElement;\n while (parent) {\n if (parent.matches('.mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]')) {\n depth += 1;\n }\n parent = parent.parentElement;\n }\n return depth;\n}\n\nfunction directSvgElementChildren(element: Element): Element[] {\n return Array.from(element.children).filter((child) => child instanceof SVGElement);\n}\n\nfunction boxFor(element: Element): SvgBox | null {\n if (!(element instanceof SVGGraphicsElement) || typeof element.getBBox !== 'function') {\n return null;\n }\n try {\n const box = element.getBBox();\n return {\n x: box.x,\n y: box.y,\n width: box.width,\n height: box.height,\n };\n } catch {\n return null;\n }\n}\n\nfunction placementFor(element: Element): SvgPlacement | null {\n const box = boxFor(element);\n if (!box) {\n return null;\n }\n const [translateX, translateY] = readTranslate(element);\n return {\n ...box,\n translateX,\n translateY,\n visualX: box.x + translateX,\n visualY: box.y + translateY,\n };\n}\n\nfunction readTranslate(element: Element): [number, number] {\n const transform = element.getAttribute('transform') ?? '';\n const match = transform.match(/translate\\(\\s*([-+.\\d]+)(?:[,\\s]+([-+.\\d]+))?\\s*\\)/);\n if (!match) {\n return [0, 0];\n }\n return [Number(match[1]) || 0, Number(match[2]) || 0];\n}\n\nfunction setTranslate(element: Element, x: number, y: number): void {\n replaceTransform(element, `translate(${roundSvg(x)},${roundSvg(y)})`);\n}\n\nfunction setMirroredTranslate(element: Element, x: number, y: number, width: number): void {\n replaceTransform(element, `translate(${roundSvg(x + width)},${roundSvg(y)}) scale(-1,1)`);\n}\n\nfunction setRootIndexTranslate(element: Element, x: number, y: number): void {\n const current = element.getAttribute('transform') ?? '';\n const rest = current\n .replace(/translate\\(\\s*[-+.\\d]+(?:[,\\s]+[-+.\\d]+)?\\s*\\)/g, '')\n .replace(/matrix\\([^)]*\\)/g, '')\n .replace(/scale\\([^)]*\\)/g, '')\n .trim();\n const transform = `translate(${roundSvg(x)},${roundSvg(y)}) scale(${ROOT_INDEX_SCALE})`;\n element.setAttribute('transform', rest ? `${transform} ${rest}` : transform);\n}\n\nfunction setRootIndexVisualX(element: Element, placement: SvgPlacement, visualX: number): void {\n const x = visualX - placement.x * ROOT_INDEX_SCALE;\n setRootIndexTranslate(element, x, placement.translateY + ROOT_INDEX_Y_RAISE);\n}\n\nfunction replaceTransform(element: Element, transform: string): void {\n const current = element.getAttribute('transform') ?? '';\n const rest = current\n .replace(/translate\\(\\s*[-+.\\d]+(?:[,\\s]+[-+.\\d]+)?\\s*\\)/g, '')\n .replace(/matrix\\([^)]*\\)/g, '')\n .replace(/scale\\(\\s*-1(?:[,\\s]+1)?\\s*\\)/g, '')\n .trim();\n element.setAttribute('transform', rest ? `${transform} ${rest}` : transform);\n}\n\nfunction roundSvg(value: number): string {\n return Number.isFinite(value) ? value.toFixed(2).replace(/\\.?0+$/, '') : '0';\n}\n\nfunction findRootNode(root: Element): Element | null {\n const candidates = Array.from(root.querySelectorAll('[data-mml-node=\"msqrt\"], [data-mml-node=\"mroot\"]'));\n return candidates.find((candidate) => closestArabSqrtRoot(candidate) === root) ?? null;\n}\n\nfunction findSurd(rootNode: Element): Element | null {\n return directSvgElementChildren(rootNode).find((child) => child.getAttribute('data-mml-node') === 'mo') ?? null;\n}\n\nfunction findRootIndex(rootNode: Element): Element | null {\n const marked = rootNode.querySelector('[data-butex-arabsqrt-part=\"index\"]');\n if (marked?.parentElement === rootNode) {\n return marked;\n }\n if (marked?.parentElement?.parentElement === rootNode) {\n return marked.parentElement;\n }\n return directSvgElementChildren(rootNode).find((child) => {\n return child.classList.contains('mjx-rtl-root-index') || child.querySelector('.mjx-rtl-root-index') != null;\n }) ?? null;\n}\n\nfunction findBase(rootNode: Element, surd: Element | null, rootIndex: Element | null): Element | null {\n const marked = rootNode.querySelector('[data-butex-arabsqrt-part=\"base\"]');\n if (marked?.parentElement === rootNode) {\n return marked;\n }\n if (marked?.parentElement?.parentElement === rootNode) {\n return marked.parentElement;\n }\n return directSvgElementChildren(rootNode).find((child) => {\n if (child === surd || child === rootIndex || child.tagName.toLowerCase() === 'rect') {\n return false;\n }\n return child.querySelector('.mjx-rtl-unmirror:not(.mjx-rtl-root-index)') != null;\n }) ?? null;\n}\n\nfunction findOverbar(rootNode: Element): SVGRectElement | null {\n const directRects = directSvgElementChildren(rootNode).filter((child) => child.tagName.toLowerCase() === 'rect');\n return (directRects[directRects.length - 1] as SVGRectElement | undefined) ?? null;\n}\n\nfunction visualExtent(parts: Array<Element | null>): { left: number; right: number } | null {\n const placements = parts\n .filter((part): part is Element => part != null)\n .map((part) => placementFor(part))\n .filter((placement): placement is SvgPlacement => placement != null && placement.width > 0);\n if (!placements.length) {\n return null;\n }\n return placements.reduce(\n (extent, placement) => {\n return {\n left: Math.min(extent.left, placement.visualX),\n right: Math.max(extent.right, placement.visualX + placement.width),\n };\n },\n { left: Infinity, right: -Infinity }\n );\n}\n\nfunction mirroredVisualX(placement: SvgPlacement, extent: { left: number; right: number }): number {\n return extent.left + extent.right - (placement.visualX + placement.width);\n}\n\nfunction moveToVisualX(element: Element, placement: SvgPlacement, visualX: number): void {\n setTranslate(element, placement.translateX + visualX - placement.visualX, placement.translateY);\n}\n\nfunction mirrorToVisualX(element: Element, placement: SvgPlacement, visualX: number): void {\n const translateX = visualX + placement.x + placement.width;\n setMirroredTranslate(element, translateX - placement.width, placement.translateY, placement.width);\n}\n\nfunction findSvg(element: Element): SVGSVGElement | null {\n const svg = element.closest('svg');\n return svg instanceof SVGSVGElement ? svg : null;\n}\n\nfunction parseViewBox(svg: SVGSVGElement): [number, number, number, number] | null {\n const viewBox = svg.getAttribute('viewBox');\n if (!viewBox) {\n return null;\n }\n const values = viewBox.trim().split(/[\\s,]+/).map(Number);\n if (values.length !== 4 || values.some((value) => !Number.isFinite(value))) {\n return null;\n }\n return values as [number, number, number, number];\n}\n\nfunction parseEx(value: string | null): number | null {\n const match = value?.match(/^([-+.\\d]+)ex$/);\n if (!match) {\n return null;\n }\n const n = Number(match[1]);\n return Number.isFinite(n) ? n : null;\n}\n\nfunction expandSvgViewBox(root: Element, contentLeft: number, contentRight: number): void {\n const svg = findSvg(root);\n if (!svg) {\n return;\n }\n const box = parseViewBox(svg);\n if (!box) {\n return;\n }\n const [minX, minY, width, height] = box;\n const oldRight = minX + width;\n const nextLeft = Math.min(minX, contentLeft - VIEWBOX_PADDING);\n const nextRight = Math.max(oldRight, contentRight + VIEWBOX_PADDING);\n const nextWidth = nextRight - nextLeft;\n if (nextLeft === minX && nextWidth === width) {\n return;\n }\n svg.setAttribute('viewBox', [roundSvg(nextLeft), roundSvg(minY), roundSvg(nextWidth), roundSvg(height)].join(' '));\n\n const widthEx = parseEx(svg.getAttribute('width'));\n if (widthEx && width > 0) {\n svg.setAttribute('width', `${roundSvg(widthEx * (nextWidth / width))}ex`);\n }\n}\n\nfunction patchArabSqrtRoot(root: Element): void {\n if (root.getAttribute(PATCHED_ATTR) === 'patched') {\n return;\n }\n\n const rootNode = findRootNode(root);\n if (!rootNode) {\n return;\n }\n\n const surd = findSurd(rootNode);\n const rootIndex = findRootIndex(rootNode);\n const base = findBase(rootNode, surd, rootIndex);\n const overbar = findOverbar(rootNode);\n if (!surd || !base || !overbar) {\n return;\n }\n\n const surdPlacement = placementFor(surd);\n const basePlacement = placementFor(base);\n const indexPlacement = rootIndex ? placementFor(rootIndex) : null;\n if (!surdPlacement || !basePlacement || !surdPlacement.width || !basePlacement.width) {\n return;\n }\n\n const extent = visualExtent([surd, base, overbar]);\n if (!extent) {\n return;\n }\n\n let targetBaseX = mirroredVisualX(basePlacement, extent);\n let targetSurdX = mirroredVisualX(surdPlacement, extent);\n let targetOverbarX: number | null = null;\n\n const overbarBox = boxFor(overbar);\n if (overbarBox) {\n targetOverbarX = mirroredVisualX({ ...overbarBox, translateX: 0, translateY: 0, visualX: overbarBox.x, visualY: overbarBox.y }, extent);\n }\n\n let targetIndexX: number | null = null;\n let indexVisualWidth = 0;\n if (rootIndex && indexPlacement) {\n const indexGap = Math.max(surdPlacement.width * ROOT_INDEX_GAP_FACTOR, ROOT_INDEX_MIN_GAP);\n indexVisualWidth = indexPlacement.width * ROOT_INDEX_SCALE;\n targetIndexX = targetSurdX + surdPlacement.width + indexGap - ROOT_INDEX_LEFT_SHIFT;\n\n const bodyRight = Math.max(\n targetSurdX + surdPlacement.width,\n targetBaseX + basePlacement.width,\n targetOverbarX == null || !overbarBox ? -Infinity : targetOverbarX + overbarBox.width\n );\n const bodyShift = Math.max(0, targetIndexX + indexVisualWidth - bodyRight);\n if (bodyShift) {\n targetBaseX -= bodyShift;\n targetSurdX -= bodyShift;\n targetIndexX -= bodyShift;\n if (targetOverbarX != null) {\n targetOverbarX -= bodyShift;\n }\n }\n }\n\n moveToVisualX(base, basePlacement, targetBaseX);\n mirrorToVisualX(surd, surdPlacement, targetSurdX);\n\n if (overbarBox && targetOverbarX != null) {\n overbar.setAttribute('x', roundSvg(targetOverbarX));\n overbar.setAttribute('width', roundSvg(overbarBox.width));\n }\n\n if (rootIndex && indexPlacement && targetIndexX != null) {\n setRootIndexVisualX(rootIndex, indexPlacement, targetIndexX);\n }\n\n const contentLeft = Math.min(\n targetSurdX,\n targetBaseX,\n targetOverbarX ?? targetBaseX,\n targetIndexX ?? targetBaseX\n );\n const contentRight = Math.max(\n targetSurdX + surdPlacement.width,\n targetBaseX + basePlacement.width,\n targetOverbarX == null || !overbarBox ? targetBaseX + basePlacement.width : targetOverbarX + overbarBox.width,\n targetIndexX == null ? targetBaseX + basePlacement.width : targetIndexX + indexVisualWidth\n );\n expandSvgViewBox(root, contentLeft, contentRight);\n\n root.setAttribute(PATCHED_ATTR, 'patched');\n rootNode.setAttribute(PATCHED_ATTR, 'patched');\n}\n\nexport function patchBuTeXSvgMath(root: ParentNode): void {\n if (typeof root.querySelectorAll !== 'function') {\n return;\n }\n let roots = Array.from(root.querySelectorAll(SVG_ARABSQRT_SELECTOR));\n if (!roots.length) {\n roots = Array.from(root.querySelectorAll(ARABSQRT_SELECTOR)).filter((candidate) => {\n return candidate.closest('mjx-container[jax=\"SVG\"]') != null;\n });\n }\n roots\n .sort((a, b) => rootDepth(b) - rootDepth(a))\n .forEach((arabSqrtRoot) => patchArabSqrtRoot(arabSqrtRoot));\n}\n","import { patchBuTeXSvgMath } from './svgPatcher.js';\nimport { mirrorBuTeXOperatorsInTex } from '../editor/atomicCommandsOperators.js';\n\nexport { patchBuTeXSvgMath } from './svgPatcher.js';\n\nexport type BuTeXMathOutput = 'chtml' | 'svg';\n\nexport type RenderBuTeXMathIslandOptions = {\n display?: boolean;\n mirrorOperators?: boolean;\n output?: BuTeXMathOutput;\n};\n\ntype MathJaxRenderApi = {\n typesetPromise?: (nodes: HTMLElement[]) => Promise<void>;\n typesetClear?: (nodes: HTMLElement[]) => void;\n tex2chtml?: (input: string, options?: { display?: boolean }) => HTMLElement;\n tex2chtmlPromise?: (input: string, options?: { display?: boolean }) => Promise<HTMLElement>;\n tex2svg?: (input: string, options?: { display?: boolean }) => HTMLElement;\n tex2svgPromise?: (input: string, options?: { display?: boolean }) => Promise<HTMLElement>;\n startup?: {\n promise?: Promise<void>;\n document?: { updateDocument?: () => void };\n };\n};\n\nexport type RenderBuTeXMathTypesetOptions = {\n display?: boolean;\n mirrorOperators?: boolean;\n};\n\nexport function patchBuTeXSvgMathAfterLayout(root: ParentNode): void {\n const run = () => patchBuTeXSvgMath(root);\n const raf =\n typeof globalThis !== 'undefined'\n ? (globalThis as { requestAnimationFrame?: (callback: FrameRequestCallback) => number }).requestAnimationFrame\n : undefined;\n\n if (typeof raf === 'function') {\n raf(run);\n return;\n }\n\n if (typeof queueMicrotask === 'function') {\n queueMicrotask(run);\n return;\n }\n\n run();\n}\n\nfunction mathJaxApi(): MathJaxRenderApi | undefined {\n if (typeof globalThis === 'undefined') {\n return undefined;\n }\n return (globalThis as { MathJax?: MathJaxRenderApi }).MathJax;\n}\n\n/** Convert delimited source text to `\\(...\\)` / `\\[...\\]` form. */\nexport function normalizePreviewMathForMathJax(tex: string): string {\n if (tex.startsWith('$$') && tex.endsWith('$$')) {\n return `\\\\[${tex.slice(2, -2)}\\\\]`;\n }\n if (tex.startsWith('$') && tex.endsWith('$')) {\n return `\\\\(${tex.slice(1, -1)}\\\\)`;\n }\n return tex;\n}\n\n/** Normalize delimited TeX for direct MathJax island conversion. */\nexport function normalizeBuTeXMathInput(\n tex: string,\n output: BuTeXMathOutput = 'chtml',\n): { tex: string; display: boolean } {\n const inline = (inner: string) => ({\n tex: output === 'chtml' ? `\\\\displaystyle ${inner}` : inner,\n display: false,\n });\n\n if (tex.startsWith('$$') && tex.endsWith('$$')) {\n return { tex: tex.slice(2, -2), display: true };\n }\n if (tex.startsWith('$') && tex.endsWith('$')) {\n return inline(tex.slice(1, -1));\n }\n if (tex.startsWith('\\\\[') && tex.endsWith('\\\\]')) {\n return { tex: tex.slice(2, -2), display: true };\n }\n if (tex.startsWith('\\\\(') && tex.endsWith('\\\\)')) {\n return inline(tex.slice(2, -2));\n }\n return tex.startsWith('\\\\begin{') ? { tex, display: true } : inline(tex);\n}\n\nasync function renderWithOutput(\n mathJax: MathJaxRenderApi,\n tex: string,\n display: boolean,\n output: BuTeXMathOutput,\n): Promise<HTMLElement> {\n if (output === 'svg') {\n const node = mathJax.tex2svg?.(tex, { display }) ?? (await mathJax.tex2svgPromise?.(tex, { display }));\n if (!node) {\n throw new Error('BuTeX: tex2svg is not available. Load mathjax/tex-svg.js.');\n }\n patchBuTeXSvgMath(node);\n return node;\n }\n\n const node = mathJax.tex2chtml?.(tex, { display }) ?? (await mathJax.tex2chtmlPromise?.(tex, { display }));\n if (!node) {\n throw new Error('BuTeX: tex2chtml is not available. Load mathjax/tex-chtml.js.');\n }\n return node;\n}\n\nexport async function renderBuTeXMathIsland(\n tex: string,\n options: RenderBuTeXMathIslandOptions = {},\n): Promise<HTMLElement> {\n const output = options.output ?? 'chtml';\n const mathJax = mathJaxApi();\n if (!mathJax) {\n throw new Error('BuTeX: MathJax is not loaded.');\n }\n\n await (mathJax.startup?.promise ?? Promise.resolve());\n const normalized = normalizeBuTeXMathInput(tex, output);\n const display = options.display ?? normalized.display;\n const renderTex = options.mirrorOperators\n ? mirrorBuTeXOperatorsInTex(normalized.tex)\n : normalized.tex;\n const node = await renderWithOutput(mathJax, renderTex, display, output);\n mathJax.startup?.document?.updateDocument?.();\n return node;\n}\n\nexport async function mountBuTeXMathIsland(\n host: HTMLElement,\n tex: string,\n options: RenderBuTeXMathIslandOptions = {},\n): Promise<void> {\n try {\n const node = await renderBuTeXMathIsland(tex, options);\n host.replaceChildren(node);\n if ((options.output ?? 'chtml') === 'svg') {\n patchBuTeXSvgMathAfterLayout(host);\n }\n } catch {\n host.replaceChildren(document.createTextNode(tex));\n }\n}\n\n/**\n * Render via MathJax's document typesetter (`typesetPromise`).\n * Use for equation-editor preview of raw AST TeX (display `\\[...\\]` by default).\n */\nexport async function mountBuTeXMathTypeset(\n host: HTMLElement,\n tex: string,\n options: RenderBuTeXMathTypesetOptions = {},\n): Promise<void> {\n const mathJax = mathJaxApi();\n await (mathJax?.startup?.promise ?? Promise.resolve());\n const body = tex || '\\\\, ';\n const renderBody = options.mirrorOperators\n ? mirrorBuTeXOperatorsInTex(body)\n : body;\n const display = options.display ?? true;\n mathJax?.typesetClear?.([host]);\n host.innerHTML = display ? `\\\\[ ${renderBody} \\\\]` : `\\\\( ${renderBody} \\\\)`;\n if (!mathJax?.typesetPromise) {\n return;\n }\n await mathJax.typesetPromise([host]);\n patchBuTeXSvgMath(host);\n}\n\n/** @deprecated Use normalizeBuTeXMathInput instead. */\nexport function mathJaxInputFromPreviewTex(tex: string): { tex: string; display: boolean } {\n return normalizeBuTeXMathInput(tex, 'chtml');\n}\n","import type { Document2MathOutput, MathToken2 } from '../document2/index.js';\nimport { mathTokenSourceForSide } from '../document2/index.js';\nimport type { EditorSide } from '../editor/index.js';\nimport { MathIsland } from './MathIsland.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type MathChipProps = {\n token: MathToken2;\n output?: Document2MathOutput;\n documentDirection?: 'rtl' | 'ltr';\n equationSide?: EditorSide;\n editable?: boolean;\n uiLocale?: ButexUiLocale;\n buttonRef?: (element: HTMLButtonElement | null) => void;\n onOpen: (token: MathToken2) => void;\n onDelete?: (tokenId: string) => void;\n onFocus?: (tokenId: string) => void;\n onRequestTextFocus?: (tokenId: string, direction: -1 | 1) => void;\n onTextInputFromFocus?: (tokenId: string, text: string) => void;\n};\n\nexport function MathChip({\n token,\n output = 'svg',\n documentDirection = 'rtl',\n equationSide = 'arabic',\n editable = true,\n uiLocale = 'ar',\n buttonRef,\n onOpen,\n onDelete,\n onFocus,\n onRequestTextFocus,\n onTextInputFromFocus,\n}: MathChipProps) {\n const messages = document2Messages(uiLocale);\n const tex = mathTokenSourceForSide(token, equationSide);\n const forwardArrowKey = documentDirection === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n const backwardArrowKey = documentDirection === 'rtl' ? 'ArrowRight' : 'ArrowLeft';\n\n const island = <MathIsland id={token.id} tex={tex} display={token.display} output={output} />;\n\n if (!editable) {\n return (\n <span className=\"butex-document2-widget__math-chip-wrap\" data-display={token.display ? 'true' : 'false'}>\n <span className=\"butex-document2-widget__math-chip\" data-editable=\"false\" data-display={token.display ? 'true' : 'false'}>\n {island}\n </span>\n </span>\n );\n }\n\n return (\n <span className=\"butex-document2-widget__math-chip-wrap\" data-display={token.display ? 'true' : 'false'}>\n <button\n type=\"button\"\n className=\"butex-document2-widget__math-chip\"\n data-editable={token.editable ? 'true' : 'false'}\n data-display={token.display ? 'true' : 'false'}\n data-source-owner={token.sourceOwner}\n data-math-token-id={token.id}\n ref={buttonRef}\n title={token.editable ? messages.editEquation : messages.rawEquation}\n onClick={() => onOpen(token)}\n onFocus={() => onFocus?.(token.id)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n onOpen(token);\n return;\n }\n if (event.key === forwardArrowKey) {\n event.preventDefault();\n onRequestTextFocus?.(token.id, 1);\n return;\n }\n if (event.key === backwardArrowKey) {\n event.preventDefault();\n onRequestTextFocus?.(token.id, -1);\n return;\n }\n if ((event.key === 'Delete' || event.key === 'Backspace') && onDelete) {\n event.preventDefault();\n onDelete(token.id);\n return;\n }\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n onTextInputFromFocus?.(token.id, event.key);\n }\n }}\n >\n {island}\n </button>\n {onDelete ? (\n <button\n type=\"button\"\n className=\"butex-document2-widget__math-chip-delete\"\n title={messages.deleteEquation}\n aria-label={messages.deleteEquation}\n onClick={(event) => {\n event.stopPropagation();\n onDelete(token.id);\n }}\n >\n ×\n </button>\n ) : null}\n </span>\n );\n}\n","import { formatRefLabel } from '../document2/index.js';\nimport type { Document2Node, RefToken2 } from '../document2/index.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type RefChipProps = {\n token: RefToken2;\n document: Document2Node;\n documentDirection?: 'rtl' | 'ltr';\n digitForm?: DigitFormId;\n editable?: boolean;\n uiLocale?: ButexUiLocale;\n buttonRef?: (element: HTMLButtonElement | null) => void;\n onOpen: (token: RefToken2) => void;\n onDelete?: (tokenId: string) => void;\n onFocus?: (tokenId: string) => void;\n onRequestTextFocus?: (tokenId: string, direction: -1 | 1) => void;\n};\n\nexport function RefChip({\n token,\n document,\n documentDirection = 'rtl',\n digitForm,\n editable = true,\n uiLocale = 'ar',\n buttonRef,\n onOpen,\n onDelete,\n onFocus,\n onRequestTextFocus,\n}: RefChipProps) {\n const messages = document2Messages(uiLocale);\n const label = formatRefLabel(token.keys, document, token.refCommand, { documentDirection, digitForm });\n const forwardArrowKey = documentDirection === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n const backwardArrowKey = documentDirection === 'rtl' ? 'ArrowRight' : 'ArrowLeft';\n\n if (!editable) {\n return (\n <span className=\"butex-document2-widget__cite-chip-wrap\">\n <span className=\"butex-document2-widget__cite-chip butex-document2-widget__ref-chip\" data-editable=\"false\">\n {label}\n </span>\n </span>\n );\n }\n\n return (\n <span className=\"butex-document2-widget__cite-chip-wrap\">\n <button\n type=\"button\"\n className=\"butex-document2-widget__cite-chip butex-document2-widget__ref-chip\"\n data-editable=\"true\"\n data-ref-token-id={token.id}\n ref={buttonRef}\n title={messages.editInternalRef}\n onClick={() => onOpen(token)}\n onFocus={() => onFocus?.(token.id)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n onOpen(token);\n return;\n }\n if (event.key === forwardArrowKey) {\n event.preventDefault();\n onRequestTextFocus?.(token.id, 1);\n return;\n }\n if (event.key === backwardArrowKey) {\n event.preventDefault();\n onRequestTextFocus?.(token.id, -1);\n }\n }}\n >\n {label}\n </button>\n {onDelete ? (\n <button\n type=\"button\"\n className=\"butex-document2-widget__cite-chip-delete\"\n title={messages.deleteInternalRef}\n aria-label={messages.deleteInternalRef}\n onClick={(event) => {\n event.stopPropagation();\n onDelete(token.id);\n }}\n >\n ×\n </button>\n ) : null}\n </span>\n );\n}\n","export type ButexUiLocale = 'ar' | 'en';\n\nexport function uiLocaleDirection(locale: ButexUiLocale): 'rtl' | 'ltr' {\n return locale === 'ar' ? 'rtl' : 'ltr';\n}\n","import type {\n CiteToken2,\n Document2Block,\n Document2MathOutput,\n FloatMetaPatch,\n InlineField2,\n MathToken2,\n Reference2,\n RefToken2,\n} from '../document2/index.js';\nimport type { DigitFormId } from '../editor/types.js';\nimport type { EditorSide } from '../editor/index.js';\nimport { InlineField } from './InlineField.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { uiLocaleDirection } from '../uiLocale.js';\nimport { document2Messages, type Document2Messages } from './uiMessages.js';\n\nexport type BlockEditorProps = {\n block: Document2Block;\n depth?: number;\n references?: Reference2[];\n documentNode?: import('../document2/index.js').Document2Node;\n documentDirection?: 'rtl' | 'ltr';\n digitForm?: DigitFormId;\n mathOutput?: Document2MathOutput;\n equationSide?: EditorSide;\n editableEquations?: boolean;\n editableCitations?: boolean;\n uiLocale?: ButexUiLocale;\n isCollapsed?: boolean;\n onTextChange: (fieldId: string, tokenId: string, text: string) => void;\n onOpenMath: (token: MathToken2) => void;\n onDeleteMath?: (tokenId: string) => void;\n onOpenCite?: (token: CiteToken2) => void;\n onDeleteCite?: (tokenId: string) => void;\n onOpenRef?: (token: RefToken2) => void;\n onDeleteRef?: (tokenId: string) => void;\n selected?: boolean;\n onToggleSelect?: (blockId: string, shiftKey: boolean) => void;\n onToggleCollapse?: (blockId: string) => void;\n onBlockFocus?: (blockId: string) => void;\n onFieldFocus?: (blockId: string, fieldId: string, textTokenId: string, caretOffset: number) => void;\n onMathFocus?: (blockId: string, fieldId: string, tokenId: string) => void;\n onCiteFocus?: (blockId: string, fieldId: string, tokenId: string) => void;\n onRefFocus?: (blockId: string, fieldId: string, tokenId: string) => void;\n onFieldBlur?: () => void;\n onImageSrcChange?: (blockId: string, value: string) => void;\n onFloatMetaChange?: (blockId: string, kind: 'image' | 'table', patch: FloatMetaPatch) => void;\n onParagraphCenteredChange?: (blockId: string, centered: boolean) => void;\n onAddListItem?: (listBlockId: string) => void;\n onRemoveListItem?: (listBlockId: string, itemId: string) => void;\n onManageReferences?: () => void;\n};\n\nfunction blockChromeClass(block: Document2Block): string {\n const root = 'butex-document2-widget__block';\n if (block.kind === 'textBlock') {\n if (block.command === '\\\\section') {\n return `${root} ${root}--section`;\n }\n if (block.command === '\\\\subsection') {\n return `${root} ${root}--subsection`;\n }\n if (block.command === '\\\\subsubsection') {\n return `${root} ${root}--subsubsection`;\n }\n return `${root} ${root}--paragraph`;\n }\n if (block.kind === 'list') {\n return `${root} ${root}--list`;\n }\n if (block.kind === 'table') {\n return `${root} ${root}--table`;\n }\n if (block.kind === 'image') {\n return `${root} ${root}--image`;\n }\n if (block.kind === 'bibliography') {\n return `${root} ${root}--bibliography`;\n }\n return `${root} ${root}--raw`;\n}\n\nfunction blockLabel(block: Document2Block, messages: Document2Messages): string {\n if (block.kind === 'textBlock') {\n if (block.command === '\\\\section') {\n return messages.section;\n }\n if (block.command === '\\\\subsection') {\n return messages.subsection;\n }\n if (block.command === '\\\\subsubsection') {\n return messages.subsubsection;\n }\n return messages.paragraph;\n }\n if (block.kind === 'list') {\n return block.command === '\\\\begin{enumerate}' ? messages.numberedList : messages.list;\n }\n if (block.kind === 'table') {\n return messages.table;\n }\n if (block.kind === 'image') {\n return messages.image;\n }\n if (block.kind === 'bibliography') {\n return messages.bibliography;\n }\n return messages.raw;\n}\n\nfunction truncateSummary(value: string): string {\n const normalized = value.replace(/\\s+/g, ' ').trim();\n if (normalized.length === 0) {\n return '...';\n }\n if (normalized.length <= 72) {\n return normalized;\n }\n return `${normalized.slice(0, 69)}...`;\n}\n\nfunction inlineFieldSummary(field: InlineField2): string {\n return truncateSummary(\n field.tokens\n .map((token) => {\n if (token.kind === 'text') {\n return token.text;\n }\n if (token.kind === 'cite') {\n return ' [cite] ';\n }\n if (token.kind === 'ref') {\n return ' [ref] ';\n }\n return ' [math] ';\n })\n .join(''),\n );\n}\n\nfunction FloatMetaEditor({\n captionEnabled,\n caption,\n labelEnabled,\n label,\n labelPlaceholder,\n labelDir,\n messages,\n onChange,\n}: {\n captionEnabled: boolean;\n caption: string;\n labelEnabled: boolean;\n label: string;\n labelPlaceholder: string;\n labelDir: 'rtl' | 'ltr';\n messages: Document2Messages;\n onChange: (patch: FloatMetaPatch) => void;\n}) {\n return (\n <div className=\"butex-document2-widget__float-meta\">\n <label className=\"butex-document2-widget__float-meta-toggle\">\n <input\n type=\"checkbox\"\n checked={captionEnabled}\n onChange={(event) => {\n const enabled = event.currentTarget.checked;\n onChange({ captionEnabled: enabled });\n }}\n />\n <span>{messages.captionToggle}</span>\n </label>\n {captionEnabled ? (\n <label className=\"butex-document2-widget__refs-field\">\n <span>{messages.floatCaption}</span>\n <input\n value={caption}\n dir={labelDir}\n placeholder={messages.captionPlaceholder}\n onChange={(event) => {\n const value = event.currentTarget.value;\n onChange({ caption: value });\n }}\n />\n </label>\n ) : null}\n <label className=\"butex-document2-widget__float-meta-toggle\">\n <input\n type=\"checkbox\"\n checked={labelEnabled}\n onChange={(event) => {\n const enabled = event.currentTarget.checked;\n onChange({ labelEnabled: enabled });\n }}\n />\n <span>{messages.labelToggle}</span>\n </label>\n {labelEnabled ? (\n <label className=\"butex-document2-widget__refs-field\">\n <span>{messages.floatLabel}</span>\n <input\n value={label}\n dir={labelDir}\n placeholder={labelPlaceholder}\n onChange={(event) => {\n const value = event.currentTarget.value;\n onChange({ label: value });\n }}\n />\n </label>\n ) : null}\n </div>\n );\n}\n\nfunction blockSummary(block: Document2Block, referenceCount: number, messages: Document2Messages): string {\n if (block.kind === 'textBlock') {\n return inlineFieldSummary(block.field);\n }\n if (block.kind === 'list') {\n return `${String(block.items.length)} ${messages.item}`;\n }\n if (block.kind === 'table') {\n return `${String(block.rows.length)} × ${String(block.rows[0]?.length ?? 0)} ${messages.table}`;\n }\n if (block.kind === 'image') {\n return truncateSummary(block.value || messages.emptyImagePath);\n }\n if (block.kind === 'bibliography') {\n return `${String(referenceCount)} ${messages.bibliography}`;\n }\n return truncateSummary(block.value);\n}\n\nexport function BlockEditor({\n block,\n depth = 0,\n references = [],\n documentNode,\n documentDirection = 'rtl',\n digitForm,\n mathOutput = 'svg',\n equationSide = 'arabic',\n editableEquations = true,\n editableCitations = true,\n uiLocale = 'ar',\n isCollapsed = false,\n onTextChange,\n onOpenMath,\n onDeleteMath,\n onOpenCite,\n onDeleteCite,\n onOpenRef,\n onDeleteRef,\n selected = false,\n onToggleSelect,\n onToggleCollapse,\n onBlockFocus,\n onFieldFocus,\n onMathFocus,\n onCiteFocus,\n onRefFocus,\n onFieldBlur,\n onImageSrcChange,\n onFloatMetaChange,\n onParagraphCenteredChange,\n onAddListItem,\n onRemoveListItem,\n onManageReferences,\n}: BlockEditorProps) {\n const messages = document2Messages(uiLocale);\n const showChrome = depth === 0;\n const chromeClass = [\n blockChromeClass(block),\n isCollapsed ? 'butex-document2-widget__block--collapsed' : '',\n selected ? 'butex-document2-widget__block--selected' : '',\n ]\n .filter(Boolean)\n .join(' ');\n const fieldProps = {\n blockId: block.id,\n references,\n documentNode,\n documentDirection,\n digitForm,\n mathOutput,\n equationSide,\n editableEquations,\n editableCitations,\n uiLocale,\n onTextChange,\n onOpenMath,\n onDeleteMath,\n onOpenCite,\n onDeleteCite,\n onOpenRef,\n onDeleteRef,\n onFieldFocus,\n onMathFocus,\n onCiteFocus,\n onRefFocus,\n onFieldBlur,\n };\n\n const header = showChrome ? (\n <div\n className=\"butex-document2-widget__block-header\"\n onClick={(event) => {\n if (event.shiftKey && onToggleSelect) {\n event.preventDefault();\n onToggleSelect(block.id, true);\n return;\n }\n onBlockFocus?.(block.id);\n }}\n >\n <span className=\"butex-document2-widget__block-title\">\n {onToggleSelect ? (\n <input\n type=\"checkbox\"\n className=\"butex-document2-widget__block-select\"\n checked={selected}\n title={messages.selectBlock}\n aria-label={messages.selectBlock}\n onClick={(event) => {\n event.stopPropagation();\n }}\n onChange={(event) => {\n onToggleSelect(block.id, event.nativeEvent instanceof MouseEvent ? event.nativeEvent.shiftKey : false);\n }}\n />\n ) : null}\n {onToggleCollapse ? (\n <button\n type=\"button\"\n className=\"butex-document2-widget__block-collapse\"\n aria-expanded={!isCollapsed}\n title={isCollapsed ? messages.openBlock : messages.collapseBlock}\n onClick={(event) => {\n event.stopPropagation();\n onToggleCollapse(block.id);\n }}\n >\n {isCollapsed ? '+' : '-'}\n </button>\n ) : null}\n <span>{blockLabel(block, messages)}</span>\n </span>\n </div>\n ) : null;\n\n if (isCollapsed && showChrome) {\n return (\n <section className={chromeClass}>\n {header}\n <div className=\"butex-document2-widget__block-summary\">{blockSummary(block, references.length, messages)}</div>\n </section>\n );\n }\n\n if (block.kind === 'textBlock') {\n return (\n <section className={chromeClass}>\n {header}\n <InlineField field={block.field} {...fieldProps} />\n {block.command === '\\\\paragraph' ? (\n <div className=\"butex-document2-widget__float-meta butex-document2-widget__float-meta--compact\">\n <label className=\"butex-document2-widget__float-meta-toggle\">\n <input\n type=\"checkbox\"\n checked={Boolean(block.centered)}\n onChange={(event) => {\n const enabled = event.currentTarget.checked;\n onParagraphCenteredChange?.(block.id, enabled);\n }}\n />\n <span>{messages.centerParagraph}</span>\n </label>\n </div>\n ) : null}\n </section>\n );\n }\n if (block.kind === 'list') {\n return (\n <section className={chromeClass}>\n {header}\n {block.items.map((item, index) => (\n <div key={item.id} className=\"butex-document2-widget__field\" dir=\"rtl\">\n <span className=\"butex-document2-widget__toolbar-label\">\n {block.command === '\\\\begin{enumerate}' ? `${messages.item} ${String(index + 1)}` : messages.item}\n </span>\n <div className=\"butex-document2-widget__list-item-content\" dir={documentDirection}>\n <InlineField field={item.field} {...fieldProps} />\n {item.blocks.map((child) => (\n <BlockEditor\n key={child.id}\n block={child}\n depth={depth + 1}\n references={references}\n documentDirection={documentDirection}\n digitForm={digitForm}\n mathOutput={mathOutput}\n equationSide={equationSide}\n editableEquations={editableEquations}\n editableCitations={editableCitations}\n uiLocale={uiLocale}\n onTextChange={onTextChange}\n onOpenMath={onOpenMath}\n onDeleteMath={onDeleteMath}\n onOpenCite={onOpenCite}\n onDeleteCite={onDeleteCite}\n onFieldFocus={onFieldFocus}\n onMathFocus={onMathFocus}\n onCiteFocus={onCiteFocus}\n onFieldBlur={onFieldBlur}\n onImageSrcChange={onImageSrcChange}\n onAddListItem={onAddListItem}\n onRemoveListItem={onRemoveListItem}\n onManageReferences={onManageReferences}\n />\n ))}\n </div>\n {onRemoveListItem && block.items.length > 1 ? (\n <div className=\"butex-document2-widget__list-item-actions\">\n <button type=\"button\" className=\"butex-document2-widget__button--danger\" onClick={() => onRemoveListItem(block.id, item.id)}>\n {messages.deleteItem}\n </button>\n </div>\n ) : null}\n </div>\n ))}\n {onAddListItem ? (\n <div className=\"butex-document2-widget__list-footer\">\n <button type=\"button\" onClick={() => onAddListItem(block.id)}>\n + {messages.addItem}\n </button>\n </div>\n ) : null}\n </section>\n );\n }\n if (block.kind === 'table') {\n return (\n <section className={chromeClass}>\n {header}\n {block.rows.map((row, rowIndex) => (\n <div key={rowIndex} className=\"butex-document2-widget__row\" dir={documentDirection}>\n {row.map((cell) => (\n <div key={cell.id} className=\"butex-document2-widget__table-cell\" dir={documentDirection}>\n <InlineField field={cell} {...fieldProps} />\n </div>\n ))}\n </div>\n ))}\n <FloatMetaEditor\n captionEnabled={block.captionEnabled}\n caption={block.caption}\n labelEnabled={block.labelEnabled}\n label={block.label}\n labelPlaceholder={messages.tableLabelPlaceholder}\n labelDir={uiLocaleDirection(uiLocale)}\n messages={messages}\n onChange={(patch) => onFloatMetaChange?.(block.id, 'table', patch)}\n />\n </section>\n );\n }\n if (block.kind === 'image') {\n const imageFieldId = `butex-d2-img-${block.id}`;\n return (\n <section className={chromeClass}>\n {header}\n <label className=\"butex-document2-widget__image-src-label\" htmlFor={imageFieldId}>\n {messages.imagePath}\n </label>\n <textarea\n id={imageFieldId}\n className=\"butex-document2-widget__inline-text\"\n value={block.value}\n dir=\"ltr\"\n aria-label={messages.imagePathLabel}\n rows={1}\n ref={(element) => {\n if (element) {\n element.style.height = 'auto';\n element.style.height = `${String(element.scrollHeight)}px`;\n }\n }}\n onFocus={() => onBlockFocus?.(block.id)}\n onChange={(event) => {\n onImageSrcChange?.(block.id, event.currentTarget.value);\n event.currentTarget.style.height = 'auto';\n event.currentTarget.style.height = `${String(event.currentTarget.scrollHeight)}px`;\n }}\n />\n <FloatMetaEditor\n captionEnabled={block.captionEnabled}\n caption={block.caption}\n labelEnabled={block.labelEnabled}\n label={block.label}\n labelPlaceholder={messages.figureLabelPlaceholder}\n labelDir={uiLocaleDirection(uiLocale)}\n messages={messages}\n onChange={(patch) => onFloatMetaChange?.(block.id, 'image', patch)}\n />\n </section>\n );\n }\n if (block.kind === 'bibliography') {\n return (\n <section className={chromeClass}>\n {header}\n <ol className=\"butex-document2-widget__bibliography-editor\" dir={documentDirection}>\n {references.map((reference, index) => (\n <li key={reference.id}>\n <strong>\n [{index + 1}] {reference.key}\n </strong>\n <span>\n {[reference.authors, reference.title, reference.venue, reference.year].filter(Boolean).join(' — ')}\n </span>\n </li>\n ))}\n </ol>\n {onManageReferences ? (\n <button type=\"button\" onClick={onManageReferences}>\n {messages.manageReferences}\n </button>\n ) : null}\n </section>\n );\n }\n return (\n <section className={chromeClass}>\n {header}\n <pre className=\"butex-document2-widget__raw\">{block.value}</pre>\n </section>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { Reference2 } from '../document2/index.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type CitePickerPopoverProps = {\n open: boolean;\n references: Reference2[];\n initialKeys?: string[];\n uiLocale?: ButexUiLocale;\n onClose: () => void;\n onConfirm: (keys: string[]) => void;\n onManageReferences?: () => void;\n};\n\nexport function CitePickerPopover({\n open,\n references,\n initialKeys = [],\n uiLocale = 'ar',\n onClose,\n onConfirm,\n onManageReferences,\n}: CitePickerPopoverProps) {\n const messages = document2Messages(uiLocale);\n const [selected, setSelected] = useState<string[]>(initialKeys);\n\n useEffect(() => {\n if (open) {\n setSelected(initialKeys);\n }\n }, [open, initialKeys]);\n\n if (!open) {\n return null;\n }\n\n function toggleKey(key: string): void {\n setSelected((current) => (current.includes(key) ? current.filter((entry) => entry !== key) : [...current, key]));\n }\n\n return (\n <div className=\"butex-document2-widget__cite-picker-backdrop\" role=\"presentation\" onClick={onClose}>\n <div\n className=\"butex-document2-widget__cite-picker\"\n role=\"dialog\"\n aria-label={messages.citePickerTitle}\n onClick={(event) => event.stopPropagation()}\n >\n <header className=\"butex-document2-widget__cite-picker-header\">\n <strong>{messages.citePickerTitle}</strong>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.close} aria-label={messages.close} onClick={onClose}>\n ×\n </button>\n </header>\n {references.length === 0 ? (\n <p className=\"butex-document2-widget__cite-picker-empty\">{messages.noReferencesYet}</p>\n ) : (\n <ul className=\"butex-document2-widget__cite-picker-list\">\n {references.map((reference, index) => {\n const checked = selected.includes(reference.key);\n const subtitle = [reference.authors, reference.title].filter(Boolean).join(' — ');\n return (\n <li key={reference.id}>\n <label className=\"butex-document2-widget__cite-picker-item\">\n <input type=\"checkbox\" checked={checked} onChange={() => toggleKey(reference.key)} />\n <span>\n <strong>\n [{index + 1}] {reference.key}\n </strong>\n {subtitle ? <span className=\"butex-document2-widget__cite-picker-meta\">{subtitle}</span> : null}\n </span>\n </label>\n </li>\n );\n })}\n </ul>\n )}\n <footer className=\"butex-document2-widget__cite-picker-footer\">\n {onManageReferences ? (\n <button type=\"button\" onClick={onManageReferences}>\n {messages.manageReferences}\n </button>\n ) : null}\n <button type=\"button\" onClick={onClose}>\n {messages.close}\n </button>\n <button\n type=\"button\"\n className=\"butex-document2-widget__primary-btn\"\n disabled={selected.length === 0}\n onClick={() => onConfirm(selected)}\n >\n {messages.insertCitation}\n </button>\n </footer>\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport type { DigitFormId } from '../editor/types.js';\nimport { TableInsertPopover } from './TableInsertPopover.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nconst DIGIT_FORMS: DigitFormId[] = ['western', 'arabicIndic', 'persianIndic'];\n\nexport type DocumentInsertToolbarProps = {\n canUndo: boolean;\n canRedo: boolean;\n editableEquations?: boolean;\n uiLocale?: ButexUiLocale;\n digitForm?: DigitFormId;\n selectionCount?: number;\n canMoveSelectionUp?: boolean;\n canMoveSelectionDown?: boolean;\n onUndo: () => void;\n onRedo: () => void;\n onMoveSelectionUp?: () => void;\n onMoveSelectionDown?: () => void;\n onDeleteSelection?: () => void;\n onAddSection: () => void;\n onAddSubsection: () => void;\n onAddSubsubsection: () => void;\n onAddParagraph: () => void;\n onAddInlineEquation: () => void;\n onAddDisplayEquation: () => void;\n onAddTable: (rowCount: number, colCount: number) => void;\n onAddList: () => void;\n onAddEnumerate: () => void;\n onAddFigure: () => void;\n onInsertCitation: () => void;\n onInsertInternalRef: () => void;\n onInsertBibliography: () => void;\n onManageReferences: () => void;\n onManageLabels: () => void;\n onOpenArticleMeta?: () => void;\n onDigitFormChange: (digitForm: DigitFormId) => void;\n};\n\nfunction digitFormLabel(digitForm: DigitFormId): string {\n if (digitForm === 'arabicIndic') {\n return '٤٥٦';\n }\n if (digitForm === 'persianIndic') {\n return '۴۵۶';\n }\n return '456';\n}\n\nexport function DocumentInsertToolbar({\n canUndo,\n canRedo,\n editableEquations = true,\n uiLocale = 'ar',\n digitForm = 'western',\n selectionCount = 0,\n canMoveSelectionUp = false,\n canMoveSelectionDown = false,\n onUndo,\n onRedo,\n onMoveSelectionUp,\n onMoveSelectionDown,\n onDeleteSelection,\n onAddSection,\n onAddSubsection,\n onAddSubsubsection,\n onAddParagraph,\n onAddInlineEquation,\n onAddDisplayEquation,\n onAddTable,\n onAddList,\n onAddEnumerate,\n onAddFigure,\n onInsertCitation,\n onInsertInternalRef,\n onInsertBibliography,\n onManageReferences,\n onManageLabels,\n onOpenArticleMeta,\n onDigitFormChange,\n}: DocumentInsertToolbarProps) {\n const messages = document2Messages(uiLocale);\n const [digitMenuOpen, setDigitMenuOpen] = useState(false);\n\n function digitTitle(id: DigitFormId): string {\n if (id === 'arabicIndic') {\n return messages.arabicIndicDigits;\n }\n if (id === 'persianIndic') {\n return messages.persianIndicDigits;\n }\n return messages.westernDigits;\n }\n\n return (\n <div className=\"butex-document2-widget__toolbar-insert\">\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.undoRedo}>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={`${messages.undo} (Ctrl+Z)`} aria-label={messages.undo} disabled={!canUndo} onClick={onUndo}>\n ↶\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={`${messages.redo} (Ctrl+Shift+Z)`} aria-label={messages.redo} disabled={!canRedo} onClick={onRedo}>\n ↷\n </button>\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.blockSelection}>\n <button\n type=\"button\"\n className=\"butex-document2-widget__icon-btn\"\n title={messages.moveUp}\n aria-label={messages.moveUp}\n disabled={selectionCount === 0 || !canMoveSelectionUp}\n onClick={onMoveSelectionUp}\n >\n ↑\n </button>\n <button\n type=\"button\"\n className=\"butex-document2-widget__icon-btn\"\n title={messages.moveDown}\n aria-label={messages.moveDown}\n disabled={selectionCount === 0 || !canMoveSelectionDown}\n onClick={onMoveSelectionDown}\n >\n ↓\n </button>\n <button\n type=\"button\"\n className=\"butex-document2-widget__button--danger\"\n title={messages.deleteBlock}\n aria-label={messages.deleteBlock}\n disabled={selectionCount === 0}\n onClick={onDeleteSelection}\n >\n {messages.deleteBlock}\n </button>\n {selectionCount > 0 ? (\n <span className=\"butex-document2-widget__selection-count\">\n {selectionCount} {messages.selectedBlockCount}\n </span>\n ) : null}\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.structure}>\n <button\n type=\"button\"\n className=\"butex-document2-widget__icon-btn\"\n title={messages.articleMetaTitle}\n aria-label={messages.articleMetaTitle}\n onClick={onOpenArticleMeta}\n >\n ✦\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn butex-document2-widget__icon-btn--h1\" title={messages.addSection} aria-label={messages.addSection} onClick={onAddSection}>\n {messages.sectionGlyph}\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn butex-document2-widget__icon-btn--h2\" title={messages.addSubsection} aria-label={messages.addSubsection} onClick={onAddSubsection}>\n {messages.subsectionGlyph}\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn butex-document2-widget__icon-btn--h3\" title={messages.addSubsubsection} aria-label={messages.addSubsubsection} onClick={onAddSubsubsection}>\n {messages.subsubsectionGlyph}\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.addParagraph} aria-label={messages.addParagraph} onClick={onAddParagraph}>\n {messages.paragraphGlyph}\n </button>\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.equations}>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={`${messages.inlineEquation} ($…$)`} aria-label={messages.inlineEquation} disabled={!editableEquations} onClick={onAddInlineEquation}>\n <span className=\"butex-document2-widget__icon-math-inline\" aria-hidden=\"true\">\n $=$\n </span>\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={`${messages.displayEquation} (\\\\[…\\\\])`} aria-label={messages.displayEquation} disabled={!editableEquations} onClick={onAddDisplayEquation}>\n <span className=\"butex-document2-widget__icon-math-display\" aria-hidden=\"true\">\n \\[÷\\]\n </span>\n </button>\n <div className=\"butex-document2-widget__digit-form-menu\">\n <button\n type=\"button\"\n className=\"butex-document2-widget__icon-btn\"\n title={messages.chooseDigitForm}\n aria-label={messages.chooseDigitForm}\n aria-expanded={digitMenuOpen}\n onClick={() => setDigitMenuOpen((open) => !open)}\n >\n {digitFormLabel(digitForm)}\n </button>\n {digitMenuOpen ? (\n <div className=\"butex-document2-widget__digit-form-options\" role=\"listbox\" aria-label={messages.chooseDigitForm}>\n {DIGIT_FORMS.map((id) => (\n <button\n key={id}\n type=\"button\"\n role=\"option\"\n aria-selected={digitForm === id}\n title={digitTitle(id)}\n className=\"butex-document2-widget__digit-form-option\"\n onClick={() => {\n onDigitFormChange(id);\n setDigitMenuOpen(false);\n }}\n >\n {digitFormLabel(id)}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.citations}>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.insertCitation} aria-label={messages.insertCitation} onClick={onInsertCitation}>\n []\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.insertInternalRef} aria-label={messages.insertInternalRef} onClick={onInsertInternalRef}>\n §\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.insertBibliography} aria-label={messages.insertBibliography} onClick={onInsertBibliography}>\n <span className=\"butex-document2-widget__icon-bibliography\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M2.2 2.4h7.2c.9 0 1.6.7 1.6 1.6v9.2c0 .5-.6.8-1 .5l-2.2-1.6H2.2c-.9 0-1.6-.7-1.6-1.6V4c0-.9.7-1.6 1.6-1.6zm0 1.2c-.2 0-.4.2-.4.4v6.5c0 .2.2.4.4.4h6.1l1.5 1.1V4c0-.2-.2-.4-.4-.4H2.2z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M3.4 5.2h5.2v1H3.4zm0 2.1h4.2v1H3.4zm0 2.1h3.4v1H3.4z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M11.4 4.1h2.2c.8 0 1.4.6 1.4 1.4v7.1c0 .4-.5.7-.8.4l-1.7-1.3h-1.1V4.1zm1.2 1.2v5.4l.7.5V5.5c0-.1-.1-.2-.2-.2h-.5z\"\n />\n </svg>\n </span>\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.manageReferences} aria-label={messages.manageReferences} onClick={onManageReferences}>\n ☰\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.manageLabels} aria-label={messages.manageLabels} onClick={onManageLabels}>\n ⌗\n </button>\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.lists}>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.bulletedList} aria-label={messages.bulletedList} onClick={onAddList}>\n •≡\n </button>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.numberedList} aria-label={messages.numberedList} onClick={onAddEnumerate}>\n 1.\n </button>\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.table}>\n <TableInsertPopover uiLocale={uiLocale} onConfirm={onAddTable} />\n </div>\n <div className=\"butex-document2-widget__toolbar-group\" role=\"group\" aria-label={messages.figures}>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.insertImage} aria-label={messages.insertImage} onClick={onAddFigure}>\n 🖼\n </button>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type TableInsertPopoverProps = {\n uiLocale?: ButexUiLocale;\n onConfirm: (rowCount: number, colCount: number) => void;\n};\n\nexport function TableInsertPopover({ uiLocale = 'ar', onConfirm }: TableInsertPopoverProps) {\n const messages = document2Messages(uiLocale);\n const [open, setOpen] = useState(false);\n const [rows, setRows] = useState('3');\n const [cols, setCols] = useState('3');\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n const onPointerDown = (event: MouseEvent): void => {\n if (!rootRef.current?.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', onPointerDown);\n return () => document.removeEventListener('mousedown', onPointerDown);\n }, [open]);\n\n function confirm(): void {\n const rowCount = Math.max(1, Math.min(20, Number.parseInt(rows, 10) || 3));\n const colCount = Math.max(1, Math.min(10, Number.parseInt(cols, 10) || 3));\n onConfirm(rowCount, colCount);\n setOpen(false);\n }\n\n return (\n <div className=\"butex-document2-widget__table-popover\" ref={rootRef}>\n <button\n type=\"button\"\n className=\"butex-document2-widget__icon-btn\"\n title={messages.insertTable}\n aria-label={messages.insertTable}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n >\n ⊞\n </button>\n {open ? (\n <div className=\"butex-document2-widget__table-popover-panel\" role=\"dialog\" aria-label={messages.tableSize}>\n <label>\n {messages.rows}\n <input type=\"number\" min={1} max={20} value={rows} onChange={(event) => setRows(event.currentTarget.value)} />\n </label>\n <label>\n {messages.columns}\n <input type=\"number\" min={1} max={10} value={cols} onChange={(event) => setCols(event.currentTarget.value)} />\n </label>\n <button type=\"button\" onClick={confirm}>\n {messages.insert}\n </button>\n </div>\n ) : null}\n </div>\n );\n}\n","import type { Document2MathOutput, PreviewBlock2, PreviewInline2 } from '../document2/index.js';\nimport { MathIsland } from './MathIsland.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type ResolveDocument2ImageUrl = (ref: { assetId?: string; value: string }) => string;\n\nfunction PreviewInlines({ inlines, output }: { inlines: PreviewInline2[]; output: Document2MathOutput }) {\n return (\n <>\n {inlines.map((inline, index) => {\n if (inline.kind === 'text') {\n return <span key={index}>{inline.text}</span>;\n }\n if (inline.kind === 'cite') {\n return (\n <span key={inline.id} className=\"butex-document2-widget__preview-cite\">\n {inline.label}\n </span>\n );\n }\n if (inline.kind === 'ref') {\n return (\n <span key={inline.id} className=\"butex-document2-widget__preview-cite butex-document2-widget__preview-ref\">\n {inline.label}\n </span>\n );\n }\n return <MathIsland key={inline.id} id={inline.id} tex={inline.tex} display={inline.display} output={output} />;\n })}\n </>\n );\n}\n\nfunction isBodyPreviewBlock(block: PreviewBlock2): boolean {\n return (\n block.kind === 'heading' ||\n block.kind === 'paragraph' ||\n block.kind === 'list' ||\n block.kind === 'table' ||\n block.kind === 'image' ||\n block.kind === 'bibliography'\n );\n}\n\nfunction PreviewBlock({\n block,\n output,\n resolveImageUrl,\n uiLocale,\n documentDirection,\n}: {\n block: PreviewBlock2;\n output: Document2MathOutput;\n resolveImageUrl?: ResolveDocument2ImageUrl;\n uiLocale: ButexUiLocale;\n documentDirection: 'rtl' | 'ltr';\n}) {\n const messages = document2Messages(uiLocale);\n const floatCaptionSeparator = uiLocale === 'ar' ? ': ' : '. ';\n function FloatCaption({ numberLabel, caption }: { numberLabel?: string; caption?: string }) {\n if (!numberLabel && !caption) {\n return null;\n }\n return (\n <figcaption dir={documentDirection}>\n {numberLabel ? (\n <span className=\"butex-document2-widget__preview-float-number\">\n {numberLabel}\n {caption ? floatCaptionSeparator : ''}\n </span>\n ) : null}\n {caption ?? ''}\n </figcaption>\n );\n }\n if (block.kind === 'basmala' || block.kind === 'closing') {\n return (\n <p\n className={\n block.kind === 'basmala'\n ? 'butex-document2-widget__preview-basmala'\n : 'butex-document2-widget__preview-closing'\n }\n >\n <MathIsland id={block.id} tex={block.tex} display output={output} />\n </p>\n );\n }\n if (block.kind === 'titleBlock') {\n return (\n <header className=\"butex-document2-widget__preview-title-block\">\n {block.title ? <h1 className=\"butex-document2-widget__preview-article-title\">{block.title}</h1> : null}\n {block.authors ? (\n <p className=\"butex-document2-widget__preview-article-authors\">\n {block.authors.split('\\n').map((line, index) => (\n <span key={index}>\n {index > 0 ? <br /> : null}\n {line}\n </span>\n ))}\n </p>\n ) : null}\n {block.date ? <p className=\"butex-document2-widget__preview-article-date\">{block.date}</p> : null}\n </header>\n );\n }\n if (block.kind === 'abstract') {\n return (\n <section className=\"butex-document2-widget__preview-abstract\" aria-label={messages.articleAbstract}>\n <h2 className=\"butex-document2-widget__preview-abstract-label\">{messages.articleAbstract}</h2>\n <p>{block.text}</p>\n </section>\n );\n }\n if (block.kind === 'heading') {\n const Tag = block.level === 1 ? 'h1' : block.level === 2 ? 'h2' : 'h3';\n return (\n <Tag>\n <PreviewInlines inlines={block.inlines} output={output} />\n </Tag>\n );\n }\n if (block.kind === 'paragraph') {\n return (\n <p className={block.centered ? 'butex-document2-widget__preview-paragraph--centered' : undefined}>\n <PreviewInlines inlines={block.inlines} output={output} />\n </p>\n );\n }\n if (block.kind === 'list') {\n const Tag = block.ordered ? 'ol' : 'ul';\n return (\n <Tag>\n {block.items.map((item) => (\n <li key={item.id}>\n <PreviewInlines inlines={item.inlines} output={output} />\n {item.blocks.map((child) => (\n <PreviewBlock\n key={child.id}\n block={child}\n output={output}\n resolveImageUrl={resolveImageUrl}\n uiLocale={uiLocale}\n documentDirection={documentDirection}\n />\n ))}\n </li>\n ))}\n </Tag>\n );\n }\n if (block.kind === 'omit') {\n return null;\n }\n if (block.kind === 'table') {\n return (\n <figure className=\"butex-document2-widget__preview-float\">\n <table>\n <tbody>\n {block.rows.map((row, rowIndex) => (\n <tr key={rowIndex}>\n {row.map((cell, columnIndex) => (\n <td key={columnIndex}>\n <PreviewInlines inlines={cell} output={output} />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n <FloatCaption numberLabel={block.numberLabel} caption={block.caption} />\n </figure>\n );\n }\n if (block.kind === 'image') {\n const src = resolveImageUrl ? resolveImageUrl({ assetId: block.assetId, value: block.src }) : block.src;\n return (\n <figure className=\"butex-document2-widget__preview-float\">\n <img src={src} alt={block.caption ?? ''} />\n <FloatCaption numberLabel={block.numberLabel} caption={block.caption} />\n </figure>\n );\n }\n if (block.kind === 'bibliography') {\n return (\n <ol className=\"butex-document2-widget__preview-bibliography\">\n {block.items.map((item) => (\n <li key={item.id}>\n <span className=\"butex-document2-widget__preview-bib-number\">{item.numberLabel}.</span>{' '}\n <span>\n {[item.authors, item.title, item.venue, item.year].filter(Boolean).join(', ')}\n {item.url ? (\n <>\n {' '}\n <a href={item.url} target=\"_blank\" rel=\"noreferrer\">\n {item.url}\n </a>\n </>\n ) : null}\n </span>\n </li>\n ))}\n </ol>\n );\n }\n return null;\n}\n\nexport function DocumentPreview({\n blocks,\n output,\n documentDirection = 'rtl',\n uiLocale = 'ar',\n resolveImageUrl,\n}: {\n blocks: PreviewBlock2[];\n output: Document2MathOutput;\n documentDirection?: 'rtl' | 'ltr';\n uiLocale?: ButexUiLocale;\n resolveImageUrl?: ResolveDocument2ImageUrl;\n}) {\n const messages = document2Messages(uiLocale);\n const hasBody = blocks.some(isBodyPreviewBlock);\n return (\n <div className=\"butex-document2-widget__preview\" dir={documentDirection}>\n {blocks.map((block) => (\n <PreviewBlock\n key={block.id}\n block={block}\n output={output}\n resolveImageUrl={resolveImageUrl}\n uiLocale={uiLocale}\n documentDirection={documentDirection}\n />\n ))}\n {!hasBody ? <p className=\"butex-document2-widget__preview-empty-body\">{messages.emptyDocument}</p> : null}\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport type { EditorSession } from '../editor/index.js';\nimport type { EditorSide } from '../editor/index.js';\nimport { ButexEditor } from '../react/ButexEditor.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { uiLocaleDirection } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type EquationMathMode = 'inline' | 'display';\n\nexport type EquationDrawerProps = {\n session: EditorSession;\n reason?: string | null;\n mathMode: EquationMathMode;\n canDelete?: boolean;\n equationSide?: EditorSide;\n uiLocale?: ButexUiLocale;\n labelEnabled?: boolean;\n label?: string;\n onLabelEnabledChange?: (enabled: boolean) => void;\n onLabelChange?: (label: string) => void;\n onMathModeChange: (mode: EquationMathMode) => void;\n onClose: () => void;\n onSave: (session: EditorSession) => void;\n onDelete?: () => void;\n};\n\nexport function EquationDrawer({\n session,\n reason,\n mathMode,\n canDelete = false,\n equationSide = 'arabic',\n uiLocale = 'ar',\n labelEnabled = false,\n label = '',\n onLabelEnabledChange,\n onLabelChange,\n onMathModeChange,\n onClose,\n onSave,\n onDelete,\n}: EquationDrawerProps) {\n const messages = document2Messages(uiLocale);\n const latestSession = useRef(session);\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [onClose]);\n\n return (\n <div className=\"butex-document2-widget__equation-modal\" role=\"presentation\">\n <button\n type=\"button\"\n className=\"butex-document2-widget__equation-modal-backdrop\"\n aria-label={messages.closeEquationDialog}\n onClick={onClose}\n />\n <div\n className=\"butex-document2-widget__equation-modal-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"butex-document2-equation-modal-title\"\n dir={uiLocaleDirection(uiLocale)}\n lang={uiLocale}\n >\n <div className=\"butex-document2-widget__row\">\n <strong id=\"butex-document2-equation-modal-title\">{messages.equationEditorTitle}</strong>\n <button type=\"button\" onClick={onClose}>\n {messages.close}\n </button>\n </div>\n <div className=\"butex-document2-widget__row\" role=\"group\" aria-label={messages.equationType}>\n <button type=\"button\" aria-pressed={mathMode === 'inline'} onClick={() => onMathModeChange('inline')}>\n {messages.inline} ($)\n </button>\n <button type=\"button\" aria-pressed={mathMode === 'display'} onClick={() => onMathModeChange('display')}>\n {messages.displayed} (\\\\[)\n </button>\n </div>\n {mathMode === 'display' ? (\n <div className=\"butex-document2-widget__float-meta\">\n <label className=\"butex-document2-widget__float-meta-toggle\">\n <input\n type=\"checkbox\"\n checked={labelEnabled}\n onChange={(event) => onLabelEnabledChange?.(event.currentTarget.checked)}\n />\n <span>{messages.labelToggle}</span>\n </label>\n {labelEnabled ? (\n <label className=\"butex-document2-widget__refs-field\">\n <span>{messages.floatLabel}</span>\n <input\n value={label}\n dir={uiLocaleDirection(uiLocale)}\n placeholder={messages.equationLabelPlaceholder}\n onChange={(event) => onLabelChange?.(event.currentTarget.value)}\n />\n </label>\n ) : null}\n </div>\n ) : null}\n {reason ? <p className=\"butex-document2-widget__error\">{uiLocale === 'en' ? messages.equationUnavailable : reason}</p> : null}\n <ButexEditor\n debug={false}\n defaultSide={equationSide}\n uiLocale={uiLocale}\n initialSession={session}\n onSessionChange={(nextSession) => {\n latestSession.current = nextSession;\n }}\n />\n <div className=\"butex-document2-widget__row\">\n {canDelete && onDelete ? (\n <button type=\"button\" className=\"butex-document2-widget__button--danger\" onClick={onDelete}>\n {messages.deleteEquation}\n </button>\n ) : null}\n <button type=\"button\" onClick={() => onSave({ ...latestSession.current, activeSide: equationSide })}>\n {messages.saveEquation}\n </button>\n </div>\n </div>\n </div>\n );\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';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { uiLocaleDirection } from '../uiLocale.js';\nimport {\n atomicCommandTitle,\n atomicOperatorCommandTitle,\n equationEditorMessages,\n type EquationEditorMessages,\n} from '../editor/uiLocale.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 /** Initial equation side. Users may still switch sides from the toolbar. */\n defaultSide?: EditorSide;\n /** Human-facing editor chrome language. Independent from the active equation side. */\n uiLocale?: ButexUiLocale;\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 }> = [\n { id: 'western', label: '456' },\n { id: 'arabicIndic', label: '٤٥٦' },\n { id: 'persianIndic', label: '۴۵۶' },\n];\nconst CHARACTER_FONT_OPTIONS: Array<{ id: CharacterFontId; label: string }> = [\n { id: 'default', label: 'س' },\n { id: 'takween', label: 'تك' },\n { id: 'diwani', label: 'ديو' },\n { id: 'diwaniOutline', label: 'ظل' },\n];\nconst FUNCTION_COMMANDS = atomicCommandsByCategory('function');\nconst LIMITS_SERIES_COMMANDS = atomicCommandsByCategory('limits_series');\nconst FUNCTION2_COMMANDS = atomicCommandsByCategory('function2');\nconst DERIVATIVE_COMMANDS = atomicCommandsByCategory('derivative');\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 }> = [\n { id: 'matrix', label: '□' },\n { id: 'pmatrix', label: '(□)' },\n { id: 'bmatrix', label: '[□]' },\n { id: 'Bmatrix', label: '{□}' },\n { id: 'vmatrix', label: '|□|' },\n { id: 'Vmatrix', label: '||□||' },\n];\ntype EnvPaletteMode = 'matrix' | 'array' | 'aligned';\nconst ARRAY_ALIGNMENTS: Array<{ id: EnvColumnAlignment }> = [\n { id: 'l' },\n { id: 'c' },\n { id: 'r' },\n];\n\nfunction matrixSizeLabel(rows: number, columns: number, messages: EquationEditorMessages): string {\n return `${String(rows)} ${messages.row} × ${String(columns)} ${messages.column}`;\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 } {\n return CHARACTER_FONT_OPTIONS.find((option) => option.id === fontId) ?? CHARACTER_FONT_OPTIONS[0];\n}\n\nfunction characterFontTitle(fontId: CharacterFontId, messages: EquationEditorMessages): string {\n if (fontId === 'takween') return messages.takweenFont;\n if (fontId === 'diwani') return messages.diwaniFont;\n if (fontId === 'diwaniOutline') return messages.diwaniOutlineFont;\n return messages.defaultFont;\n}\n\nfunction digitFormTitle(digitForm: DigitFormId, messages: EquationEditorMessages): string {\n if (digitForm === 'arabicIndic') return messages.arabicIndicDigits;\n if (digitForm === 'persianIndic') return messages.persianIndicDigits;\n return messages.westernDigits;\n}\n\nfunction matrixStyleTitle(style: MatrixEnvStyle, messages: EquationEditorMessages): string {\n if (style === 'pmatrix') return messages.matrixParentheses;\n if (style === 'bmatrix') return messages.matrixBrackets;\n if (style === 'Bmatrix') return messages.matrixBraces;\n if (style === 'vmatrix') return messages.matrixBars;\n if (style === 'Vmatrix') return messages.matrixDoubleBars;\n return messages.matrixNoDelimiters;\n}\n\nfunction alignmentCopy(alignment: EnvColumnAlignment, messages: EquationEditorMessages): { label: string; title: string } {\n if (alignment === 'l') return { label: messages.alignLeft, title: messages.alignColumnLeft };\n if (alignment === 'r') return { label: messages.alignRight, title: messages.alignColumnRight };\n return { label: messages.alignCenter, title: messages.alignColumnCenter };\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, messages: EquationEditorMessages): string {\n const passive = session.activeSide === 'arabic' ? session.englishTree : session.arabicTree;\n const title =\n session.activeSide === 'arabic'\n ? messages.inactiveEnglish\n : messages.inactiveArabic;\n const latex =\n session.activeSide === 'arabic'\n ? renderChainEnglish(passive)\n : renderChainArabic(passive);\n return `${title}\\n\\n${latex || messages.empty}`;\n}\n\nexport const ButexEditor = forwardRef<ButexEditorHandle, ButexEditorProps>(\n function ButexEditor({ className, debug = false, defaultSide, uiLocale = 'ar', initialSession, onSessionChange }, ref) {\n const messages = equationEditorMessages(uiLocale);\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 const uiLocaleRef = useRef(uiLocale);\n uiLocaleRef.current = uiLocale;\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 [derivativeMenuOpen, setDerivativeMenuOpen] = 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 const currentMessages = equationEditorMessages(uiLocaleRef.current);\n latexLinesEl.textContent = `${currentMessages.englishLatex}:\\n${english || currentMessages.empty}\\n\\n${currentMessages.arabicLatex}:\\n${arabic || currentMessages.empty}`;\n }\n if (debugRef.current && passivePreviewEl) {\n passivePreviewEl.textContent = passiveTreeText(session, equationEditorMessages(uiLocaleRef.current));\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 = `${equationEditorMessages(uiLocaleRef.current).mathJaxError}: ${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 defaultSide,\n uiLocale,\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 = `${equationEditorMessages(uiLocaleRef.current).previewError}: ${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 useEffect(() => {\n runtimeRef.current?.setUiLocale(uiLocale);\n const session = runtimeRef.current?.getSession();\n if (session) {\n void updatePreviewRef.current(session);\n }\n }, [uiLocale]);\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={uiLocaleDirection(uiLocale)}\n lang={uiLocale}\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={messages.undoRedo}>\n <button ref={undoBtnRef} id=\"btn-undo\" type=\"button\" className=\"icon-btn\" title={messages.undo} aria-label={messages.undo}>\n ↷\n </button>\n <button ref={redoBtnRef} id=\"btn-redo\" type=\"button\" className=\"icon-btn\" title={messages.redo} aria-label={messages.redo}>\n ↶\n </button>\n </div>\n <div className=\"toolbar-group toolbar-clipboard\" role=\"group\" aria-label={messages.clipboard}>\n <button ref={copyBtnRef} id=\"btn-copy\" type=\"button\" className=\"icon-btn\" title={messages.copy} aria-label={messages.copy} disabled>\n ⧉\n </button>\n <button ref={cutBtnRef} id=\"btn-cut\" type=\"button\" className=\"icon-btn\" title={messages.cut} aria-label={messages.cut} disabled>\n ✂\n </button>\n <button\n id=\"btn-paste\"\n type=\"button\"\n className=\"icon-btn\"\n title={messages.paste}\n aria-label={messages.paste}\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={messages.editorSettings}>\n <button className=\"icon-btn accent\" type=\"button\" title={messages.toggleSide} aria-label={messages.toggleSide} onClick={() => runtimeRef.current?.toggleSide()}>\n ⇄\n </button>\n </div>\n <div className=\"toolbar-group toolbar-structures\" role=\"group\" aria-label={messages.structures}>\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={messages.insertDelimiters}\n aria-label={messages.insertDelimiters}\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={messages.insertDelimiters} hidden={!delimiterMenuOpen}>\n <button\n className=\"delimiter-command-option\"\n data-delim=\"paren\"\n type=\"button\"\n role=\"option\"\n title={messages.insertParentheses}\n aria-label={messages.insertParentheses}\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={messages.insertBrackets}\n aria-label={messages.insertBrackets}\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={messages.insertBraces}\n aria-label={messages.insertBraces}\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={messages.insertFraction} aria-label={messages.insertFraction} 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={messages.insertRoot} aria-label={messages.insertRoot} 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={messages.environments}>\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={messages.insertEnvironment}\n aria-label={messages.insertEnvironment}\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={messages.insertEnvironment} hidden={!matrixMenuOpen}>\n <div className=\"matrix-style-options\" role=\"listbox\" aria-label={messages.environmentType}>\n {[\n { id: 'matrix' as const, label: messages.matrix },\n { id: 'array' as const, label: messages.array },\n { id: 'aligned' as const, label: messages.aligned },\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={messages.matrixType}>\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={matrixStyleTitle(style.id, messages)}\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, messages) : matrixSizeLabel(matrixRows, matrixColumns, messages)}\n </div>\n <div className=\"matrix-grid-picker\" aria-label={messages.chooseEnvironmentSize}>\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, messages)}\n aria-label={matrixSizeLabel(rows, columns, messages)}\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 {messages.row}\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 {messages.column}\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 {messages.insert}\n </button>\n </div>\n <div className=\"matrix-edit-actions\" aria-label={messages.editSelectedEnvironment}>\n {envPaletteMode === 'matrix' ? (\n <button type=\"button\" title={messages.applySelectedMatrixStyle} onMouseDown={(event) => event.preventDefault()} onClick={() => runtimeRef.current?.setMatrixEnvStyle(matrixStyle)}>\n {messages.applyStyle}\n </button>\n ) : null}\n {envPaletteMode === 'array' ? (\n <>\n <label>\n {messages.column}\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={alignmentCopy(alignment.id, messages).title}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => runtimeRef.current?.setArrayColumnAlignment(arrayAlignmentColumn - 1, alignment.id)}\n >\n {alignmentCopy(alignment.id, messages).label}\n </button>\n ))}\n </>\n ) : null}\n <button type=\"button\" title={messages.addRow} onMouseDown={(event) => event.preventDefault()} onClick={() => runtimeRef.current?.addMatrixRow()}>\n +{messages.row}\n </button>\n <button type=\"button\" title={messages.removeRow} onMouseDown={(event) => event.preventDefault()} onClick={() => runtimeRef.current?.removeMatrixRow()}>\n -{messages.row}\n </button>\n <button type=\"button\" title={messages.addColumn} onMouseDown={(event) => event.preventDefault()} onClick={() => runtimeRef.current?.addMatrixColumn()}>\n +{messages.column}\n </button>\n <button type=\"button\" title={messages.removeColumn} onMouseDown={(event) => event.preventDefault()} onClick={() => runtimeRef.current?.removeMatrixColumn()}>\n -{messages.column}\n </button>\n </div>\n </div>\n </div>\n </div>\n <div className=\"toolbar-group toolbar-settings\" role=\"group\" aria-label={messages.spaces}>\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={messages.insertSpace}\n aria-label={messages.insertSpace}\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={messages.insertSpace} 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={atomicCommandTitle(command, uiLocale)}\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\">{atomicCommandTitle(command, uiLocale)}</span>\n </button>\n ))}\n </div>\n </div>\n </div>\n <div className=\"toolbar-group toolbar-functions\" role=\"group\" aria-label={messages.functions}>\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={messages.insertFunction}\n aria-label={messages.insertFunction}\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={messages.insertFunction} 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={atomicCommandTitle(command, uiLocale)}\n aria-label={atomicCommandTitle(command, uiLocale)}\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={messages.insertLimitsSeries}\n aria-label={messages.insertLimitsSeries}\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={messages.insertLimitsSeries} 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={atomicCommandTitle(command, uiLocale)}\n aria-label={atomicCommandTitle(command, uiLocale)}\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={messages.insertAdditionalFunctions}\n aria-label={messages.insertAdditionalFunctions}\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={messages.insertAdditionalFunctions} 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={atomicCommandTitle(command, uiLocale)}\n aria-label={atomicCommandTitle(command, uiLocale)}\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--derivative\"\n onBlur={(event) => {\n const nextFocus = event.relatedTarget;\n if (!(nextFocus instanceof Node) || !event.currentTarget.contains(nextFocus)) {\n setDerivativeMenuOpen(false);\n }\n }}\n >\n <button\n className=\"icon-btn function-command-btn\"\n type=\"button\"\n title={messages.insertDerivative}\n aria-label={messages.insertDerivative}\n aria-haspopup=\"listbox\"\n aria-expanded={derivativeMenuOpen}\n onClick={() => setDerivativeMenuOpen((open) => !open)}\n >\n {DERIVATIVE_COMMANDS[0]?.arabicLabel ?? 'ء'}\n </button>\n <div className=\"function-command-options\" role=\"listbox\" aria-label={messages.insertDerivative} hidden={!derivativeMenuOpen}>\n {DERIVATIVE_COMMANDS.map((command) => (\n <button\n key={command.id}\n className=\"function-command-option\"\n type=\"button\"\n role=\"option\"\n title={atomicCommandTitle(command, uiLocale)}\n aria-label={atomicCommandTitle(command, uiLocale)}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertAtomicCommand(command.id);\n setDerivativeMenuOpen(false);\n focusSurface();\n }}\n >\n {command.arabicLabel}\n </button>\n ))}\n <button\n className=\"function-command-option\"\n type=\"button\"\n role=\"option\"\n title={messages.insertFirstDerivative}\n aria-label={messages.insertFirstDerivative}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertFirstDerivative();\n setDerivativeMenuOpen(false);\n focusSurface();\n }}\n >\n ء/س\n </button>\n <button\n className=\"function-command-option\"\n type=\"button\"\n role=\"option\"\n title={messages.insertSecondDerivative}\n aria-label={messages.insertSecondDerivative}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n runtimeRef.current?.insertSecondDerivative();\n setDerivativeMenuOpen(false);\n focusSurface();\n }}\n >\n ء²/س²\n </button>\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={messages.insertNumberSets}\n aria-label={messages.insertNumberSets}\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={messages.insertNumberSets} 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={atomicCommandTitle(command, uiLocale)}\n aria-label={atomicCommandTitle(command, uiLocale)}\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={messages.operations}>\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={messages.insertOperation}\n aria-label={messages.insertOperation}\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={messages.insertOperation} 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={atomicOperatorCommandTitle(command, uiLocale)}\n aria-label={atomicOperatorCommandTitle(command, uiLocale)}\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={messages.insertRelationsSets}\n aria-label={messages.insertRelationsSets}\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={messages.insertRelationsSets} 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={atomicOperatorCommandTitle(command, uiLocale)}\n aria-label={atomicOperatorCommandTitle(command, uiLocale)}\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={messages.insertArrows}\n aria-label={messages.insertArrows}\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={messages.insertArrows} 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={atomicOperatorCommandTitle(command, uiLocale)}\n aria-label={atomicOperatorCommandTitle(command, uiLocale)}\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={messages.insertDots}\n aria-label={messages.insertDots}\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={messages.insertDots} 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={atomicOperatorCommandTitle(command, uiLocale)}\n aria-label={atomicOperatorCommandTitle(command, uiLocale)}\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={messages.insertIntegrals}\n aria-label={messages.insertIntegrals}\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={messages.insertIntegrals} 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={atomicOperatorCommandTitle(command, uiLocale)}\n aria-label={atomicOperatorCommandTitle(command, uiLocale)}\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={messages.scripts}>\n <button className=\"icon-btn script-icon-btn\" type=\"button\" title={messages.addSuperscript} aria-label={messages.addSuperscript} 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={messages.addSubscript} aria-label={messages.addSubscript} 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={messages.removeSuperscript} aria-label={messages.removeSuperscript} 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={messages.removeSubscript} aria-label={messages.removeSubscript} 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={messages.inputStyles}>\n <button className=\"icon-btn delete-node-btn\" type=\"button\" title={messages.deleteSelectedStructure} aria-label={messages.deleteSelectedStructure} onClick={() => runtimeRef.current?.deleteStructure()}>\n ×\n </button>\n <button ref={splitTypingBtnRef} id=\"toggle-split-leaf-typing\" className=\"icon-btn ligature-btn\" type=\"button\" title={messages.toggleLetterMerging} aria-label={messages.toggleLetterMerging} 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={characterFontTitle(selectedCharacterFont, messages)}\n aria-label={messages.chooseWritingFont}\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={messages.chooseWritingFont} 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={characterFontTitle(option.id, messages)}\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={messages.chooseDigitForm}\n aria-label={messages.chooseDigitForm}\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={messages.chooseDigitForm} 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={digitFormTitle(option.id, messages)}\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={messages.equationEditor}\n />\n <div ref={renderErrorRef} className=\"error\" hidden />\n </section>\n\n <section className=\"panel panel-preview\" aria-label={messages.renderPreview}>\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\">{messages.development}</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 ? messages.showDebugLog : messages.hideDebugLog}\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 {messages.copyDebugLog}\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","import type { Document2LabelEntry } from '../document2/index.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { uiLocaleDirection } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type LabelsPanelProps = {\n open: boolean;\n labels: Document2LabelEntry[];\n uiLocale?: ButexUiLocale;\n onClose: () => void;\n onUpdateFloat?: (ownerId: string, kind: 'fig' | 'tab', patch: { caption?: string; label?: string; captionEnabled?: boolean; labelEnabled?: boolean }) => void;\n onUpdateEquationLabel?: (tokenId: string, patch: { label?: string; labelEnabled?: boolean }) => void;\n};\n\nfunction kindLabel(kind: Document2LabelEntry['kind'], uiLocale: ButexUiLocale): string {\n const messages = document2Messages(uiLocale);\n if (kind === 'fig') {\n return messages.labelKindFig;\n }\n if (kind === 'tab') {\n return messages.labelKindTab;\n }\n return messages.labelKindEq;\n}\n\nexport function LabelsPanel({\n open,\n labels,\n uiLocale = 'ar',\n onClose,\n onUpdateFloat,\n onUpdateEquationLabel,\n}: LabelsPanelProps) {\n const messages = document2Messages(uiLocale);\n\n if (!open) {\n return null;\n }\n\n return (\n <div className=\"butex-document2-widget__refs-backdrop\" role=\"presentation\" onClick={onClose}>\n <div className=\"butex-document2-widget__refs-panel\" role=\"dialog\" aria-label={messages.labelsTitle} onClick={(event) => event.stopPropagation()}>\n <header className=\"butex-document2-widget__refs-header\">\n <strong>{messages.labelsTitle}</strong>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.close} aria-label={messages.close} onClick={onClose}>\n ×\n </button>\n </header>\n <p className=\"butex-document2-widget__labels-help\">{messages.labelsHelp}</p>\n {labels.length === 0 ? (\n <p className=\"butex-document2-widget__cite-picker-empty\">{messages.noLabelsYet}</p>\n ) : (\n <ul className=\"butex-document2-widget__refs-list\">\n {labels.map((entry) => (\n <li key={`${entry.kind}:${entry.ownerId}`} className=\"butex-document2-widget__refs-item\">\n <div className=\"butex-document2-widget__refs-item-head\">\n <strong>\n [{kindLabel(entry.kind, uiLocale)} {entry.number}] {entry.key}\n </strong>\n </div>\n <div className=\"butex-document2-widget__refs-grid\">\n <label className=\"butex-document2-widget__refs-field\">\n <span>{messages.floatLabel}</span>\n <input\n value={entry.key}\n dir={uiLocaleDirection(uiLocale)}\n onChange={(event) => {\n const value = event.currentTarget.value;\n if (entry.kind === 'eq') {\n onUpdateEquationLabel?.(entry.ownerId, { label: value, labelEnabled: true });\n } else if (entry.kind === 'fig' || entry.kind === 'tab') {\n onUpdateFloat?.(entry.ownerId, entry.kind, { label: value, labelEnabled: true });\n }\n }}\n />\n </label>\n {entry.kind === 'fig' || entry.kind === 'tab' ? (\n <label className=\"butex-document2-widget__refs-field\">\n <span>{messages.floatCaption}</span>\n <input\n value={entry.caption}\n onChange={(event) => {\n const value = event.currentTarget.value;\n const kind = entry.kind;\n if (kind === 'fig' || kind === 'tab') {\n onUpdateFloat?.(entry.ownerId, kind, { caption: value, captionEnabled: true });\n }\n }}\n />\n </label>\n ) : null}\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport type { Reference2, Reference2Json } from '../document2/index.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type ReferencesPanelProps = {\n open: boolean;\n references: Reference2[];\n uiLocale?: ButexUiLocale;\n onClose: () => void;\n onAdd: (partial?: Partial<Reference2Json>) => void;\n onUpdate: (referenceId: string, patch: Partial<Reference2Json>) => void;\n onRemove: (referenceId: string) => void;\n onMove: (referenceId: string, direction: -1 | 1) => void;\n};\n\nconst EMPTY_DRAFT: Reference2Json = { key: '', authors: '', title: '', year: '', url: '', venue: '' };\n\nexport function ReferencesPanel({\n open,\n references,\n uiLocale = 'ar',\n onClose,\n onAdd,\n onUpdate,\n onRemove,\n onMove,\n}: ReferencesPanelProps) {\n const messages = document2Messages(uiLocale);\n const [draft, setDraft] = useState<Reference2Json>(EMPTY_DRAFT);\n\n if (!open) {\n return null;\n }\n\n return (\n <div className=\"butex-document2-widget__refs-backdrop\" role=\"presentation\" onClick={onClose}>\n <div className=\"butex-document2-widget__refs-panel\" role=\"dialog\" aria-label={messages.referencesTitle} onClick={(event) => event.stopPropagation()}>\n <header className=\"butex-document2-widget__refs-header\">\n <strong>{messages.referencesTitle}</strong>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.close} aria-label={messages.close} onClick={onClose}>\n ×\n </button>\n </header>\n\n <div className=\"butex-document2-widget__refs-add\">\n <h3>{messages.addReference}</h3>\n <div className=\"butex-document2-widget__refs-grid\">\n {(\n [\n ['key', messages.referenceKey],\n ['authors', messages.referenceAuthors],\n ['title', messages.referenceTitle],\n ['year', messages.referenceYear],\n ['venue', messages.referenceVenue],\n ['url', messages.referenceUrl],\n ] as const\n ).map(([field, label]) => (\n <label key={field} className=\"butex-document2-widget__refs-field\">\n <span>{label}</span>\n <input\n value={draft[field] ?? ''}\n onChange={(event) => {\n const value = event.currentTarget.value;\n setDraft((current) => ({ ...current, [field]: value }));\n }}\n />\n </label>\n ))}\n </div>\n <button\n type=\"button\"\n className=\"butex-document2-widget__primary-btn\"\n disabled={!draft.key?.trim()}\n onClick={() => {\n onAdd(draft);\n setDraft(EMPTY_DRAFT);\n }}\n >\n {messages.addReference}\n </button>\n </div>\n\n <ul className=\"butex-document2-widget__refs-list\">\n {references.map((reference, index) => (\n <li key={reference.id} className=\"butex-document2-widget__refs-item\">\n <div className=\"butex-document2-widget__refs-item-head\">\n <strong>\n [{index + 1}] {reference.key}\n </strong>\n <div className=\"butex-document2-widget__refs-item-actions\">\n <button type=\"button\" title={messages.moveUp} aria-label={messages.moveUp} disabled={index === 0} onClick={() => onMove(reference.id, -1)}>\n ↑\n </button>\n <button\n type=\"button\"\n title={messages.moveDown}\n aria-label={messages.moveDown}\n disabled={index === references.length - 1}\n onClick={() => onMove(reference.id, 1)}\n >\n ↓\n </button>\n <button type=\"button\" title={messages.deleteReference} aria-label={messages.deleteReference} onClick={() => onRemove(reference.id)}>\n ×\n </button>\n </div>\n </div>\n <div className=\"butex-document2-widget__refs-grid\">\n {(\n [\n ['key', messages.referenceKey],\n ['authors', messages.referenceAuthors],\n ['title', messages.referenceTitle],\n ['year', messages.referenceYear],\n ['venue', messages.referenceVenue],\n ['url', messages.referenceUrl],\n ] as const\n ).map(([field, label]) => (\n <label key={field} className=\"butex-document2-widget__refs-field\">\n <span>{label}</span>\n <input\n value={reference[field]}\n onChange={(event) => {\n const value = event.currentTarget.value;\n onUpdate(reference.id, { [field]: value });\n }}\n />\n </label>\n ))}\n </div>\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { Document2LabelEntry } from '../document2/index.js';\nimport type { ButexUiLocale } from '../uiLocale.js';\nimport { document2Messages } from './uiMessages.js';\n\nexport type RefPickerPopoverProps = {\n open: boolean;\n labels: Document2LabelEntry[];\n initialKeys?: string[];\n initialRefCommand?: 'ref' | 'eqref';\n uiLocale?: ButexUiLocale;\n onClose: () => void;\n onConfirm: (keys: string[], refCommand: 'ref' | 'eqref') => void;\n onManageLabels?: () => void;\n};\n\nexport function RefPickerPopover({\n open,\n labels,\n initialKeys = [],\n initialRefCommand = 'ref',\n uiLocale = 'ar',\n onClose,\n onConfirm,\n onManageLabels,\n}: RefPickerPopoverProps) {\n const messages = document2Messages(uiLocale);\n const [selected, setSelected] = useState<string[]>(initialKeys);\n const [refCommand, setRefCommand] = useState<'ref' | 'eqref'>(initialRefCommand);\n\n useEffect(() => {\n if (open) {\n setSelected(initialKeys);\n setRefCommand(initialRefCommand);\n }\n }, [open, initialKeys, initialRefCommand]);\n\n if (!open) {\n return null;\n }\n\n function selectKey(key: string, kind: Document2LabelEntry['kind']): void {\n setSelected([key]);\n setRefCommand(kind === 'eq' ? 'eqref' : 'ref');\n }\n\n return (\n <div className=\"butex-document2-widget__cite-picker-backdrop\" role=\"presentation\" onClick={onClose}>\n <div\n className=\"butex-document2-widget__cite-picker\"\n role=\"dialog\"\n aria-label={messages.refPickerTitle}\n onClick={(event) => event.stopPropagation()}\n >\n <header className=\"butex-document2-widget__cite-picker-header\">\n <strong>{messages.refPickerTitle}</strong>\n <button type=\"button\" className=\"butex-document2-widget__icon-btn\" title={messages.close} aria-label={messages.close} onClick={onClose}>\n ×\n </button>\n </header>\n {labels.length === 0 ? (\n <p className=\"butex-document2-widget__cite-picker-empty\">{messages.noLabelsYet}</p>\n ) : (\n <ul className=\"butex-document2-widget__cite-picker-list\">\n {labels.map((entry) => {\n const checked = selected.includes(entry.key);\n return (\n <li key={`${entry.kind}:${entry.ownerId}`}>\n <label className=\"butex-document2-widget__cite-picker-item\">\n <input type=\"radio\" name=\"butex-ref-key\" checked={checked} onChange={() => selectKey(entry.key, entry.kind)} />\n <span>\n <strong>\n [{entry.kind} {entry.number}] {entry.key}\n </strong>\n {entry.caption ? <span className=\"butex-document2-widget__cite-picker-meta\">{entry.caption}</span> : null}\n </span>\n </label>\n </li>\n );\n })}\n </ul>\n )}\n <footer className=\"butex-document2-widget__cite-picker-footer\">\n {onManageLabels ? (\n <button type=\"button\" onClick={onManageLabels}>\n {messages.manageLabels}\n </button>\n ) : null}\n <button type=\"button\" onClick={onClose}>\n {messages.close}\n </button>\n <button\n type=\"button\"\n className=\"butex-document2-widget__primary-btn\"\n disabled={selected.length === 0}\n onClick={() => onConfirm(selected, refCommand)}\n >\n {messages.insertInternalRef}\n </button>\n </footer>\n </div>\n </div>\n );\n}\n","import type { Document2Block, Document2Node } from '../document2/index.js';\n\nexport type Document2EditorFocus = {\n blockId: string | null;\n fieldId: string | null;\n textTokenId: string | null;\n caretOffset: number;\n};\n\nexport function createEmptyDocument2EditorFocus(): Document2EditorFocus {\n return { blockId: null, fieldId: null, textTokenId: null, caretOffset: 0 };\n}\n\nexport function findBlockIdForField(blocks: Document2Block[], fieldId: string): string | null {\n for (const block of blocks) {\n if (block.kind === 'textBlock' && block.field.id === fieldId) {\n return block.id;\n }\n if (block.kind === 'list') {\n for (const item of block.items) {\n if (item.field.id === fieldId) {\n return block.id;\n }\n const nested = findBlockIdForField(item.blocks, fieldId);\n if (nested) {\n return nested;\n }\n }\n }\n if (block.kind === 'table') {\n for (const row of block.rows) {\n for (const cell of row) {\n if (cell.id === fieldId) {\n return block.id;\n }\n }\n }\n }\n }\n return null;\n}\n\nexport function resolveInsertField(document: Document2Node, focus: Document2EditorFocus): { fieldId: string; caretOffset: number; textTokenId: string | null } | null {\n if (focus.fieldId) {\n return { fieldId: focus.fieldId, caretOffset: focus.caretOffset, textTokenId: focus.textTokenId };\n }\n for (const block of document.blocks) {\n if (block.kind === 'textBlock') {\n const textToken = block.field.tokens.find((t) => t.kind === 'text');\n const text = textToken?.kind === 'text' ? textToken.text : '';\n return { fieldId: block.field.id, caretOffset: text.length, textTokenId: textToken?.kind === 'text' ? textToken.id : null };\n }\n }\n return null;\n}\n\nexport function resolveInsertAfterBlockId(document: Document2Node, focus: Document2EditorFocus): string | null {\n if (focus.blockId && document.blocks.some((b) => b.id === focus.blockId)) {\n return focus.blockId;\n }\n if (focus.fieldId) {\n return findBlockIdForField(document.blocks, focus.fieldId);\n }\n return document.blocks.length > 0 ? document.blocks[document.blocks.length - 1]!.id : null;\n}\n","export const DOCUMENT2_WIDGET_CSS = `\n.butex-document2-widget {\n --butex-document2-bg: var(--butex-bg, #f8fafc);\n --butex-document2-fg: var(--butex-fg, #0f172a);\n --butex-document2-muted: var(--butex-muted, #64748b);\n --butex-document2-panel: var(--butex-panel, #ffffff);\n --butex-document2-border: var(--butex-border, #e2e8f0);\n --butex-document2-accent: var(--butex-accent, #0d9488);\n --butex-document2-accent-bg: var(--butex-toolbar-hover-bg, rgba(13, 148, 136, 0.08));\n --butex-document2-focus-shadow: var(--butex-focus-shadow, rgba(13, 148, 136, 0.16));\n --butex-document2-danger: var(--butex-danger, #dc2626);\n --butex-document2-error: var(--butex-error, #b91c1c);\n --butex-document2-error-bg: var(--butex-error-bg, #fef2f2);\n --butex-document2-preview-bg: var(--butex-preview-bg, #ffffff);\n --butex-document2-preview-fg: var(--butex-preview-fg, var(--butex-document2-fg));\n --butex-document2-preview-font: \"Amiri\", \"Noto Serif Arabic\", Georgia, \"Times New Roman\", serif;\n --butex-document2-drawer-bg: var(--butex-document2-panel);\n --butex-document2-input-bg: #ffffff;\n --butex-document2-raw-bg: #f8fafc;\n --butex-document2-math-bg: var(--butex-document2-accent-bg);\n --butex-document2-math-border: rgba(13, 148, 136, 0.35);\n --butex-document2-text-token-bg: var(--butex-text-token-bg, color-mix(in srgb, var(--butex-document2-panel) 86%, var(--butex-document2-bg)));\n --butex-document2-text-token-border: var(--butex-text-token-border, color-mix(in srgb, var(--butex-document2-border) 86%, var(--butex-document2-muted)));\n --butex-document2-math-inline-bg: var(--butex-math-inline-bg, color-mix(in srgb, var(--butex-document2-accent) 10%, var(--butex-document2-panel)));\n --butex-document2-math-display-bg: var(--butex-math-display-bg, color-mix(in srgb, var(--butex-document2-accent) 7%, var(--butex-document2-bg)));\n --butex-document2-collapse-bg: var(--butex-collapse-bg, color-mix(in srgb, var(--butex-document2-muted) 8%, var(--butex-document2-panel)));\n --butex-document2-dev-bg: var(--butex-dev-bg, #fffbeb);\n --butex-document2-dev-border: var(--butex-dev-border, #fcd34d);\n --butex-document2-dev-code-bg: var(--butex-dev-inset-bg, #ffffff);\n --butex-document2-dev-code-fg: var(--butex-dev-inset-fg, var(--butex-document2-fg));\n box-sizing: border-box;\n color: var(--butex-document2-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-document2-widget *,\n.butex-document2-widget *::before,\n.butex-document2-widget *::after {\n box-sizing: inherit;\n}\n\n.butex-document2-widget__shell,\n.butex-document2-widget__editor-panel,\n.butex-document2-widget__blocks,\n.butex-document2-widget__dev,\n.butex-document2-widget__field {\n display: grid;\n gap: 10px;\n min-width: 0;\n}\n\n.butex-document2-widget__toolbar,\n.butex-document2-widget__panel,\n.butex-document2-widget__block,\n.butex-document2-widget__dev {\n background: var(--butex-document2-panel);\n border: 1px solid var(--butex-document2-border);\n border-radius: 12px;\n min-width: 0;\n padding: 12px;\n}\n\n.butex-document2-widget__toolbar {\n position: sticky;\n top: 0;\n z-index: 20;\n box-shadow: 0 4px 16px color-mix(in srgb, var(--butex-document2-fg) 6%, transparent);\n gap: 6px;\n}\n\n.butex-document2-widget__toolbar-insert {\n align-items: center;\n display: flex;\n flex: 1 1 auto;\n flex-wrap: wrap;\n gap: 6px;\n min-width: 0;\n}\n\n.butex-document2-widget__toolbar-group {\n align-items: center;\n border-inline-start: 1px solid color-mix(in srgb, var(--butex-document2-border) 75%, transparent);\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n padding-inline-start: 6px;\n}\n\n.butex-document2-widget__toolbar-group:first-child {\n border-inline-start: 0;\n padding-inline-start: 0;\n}\n\n.butex-document2-widget__icon-btn {\n align-items: center;\n background: var(--butex-document2-panel);\n border: 1px solid var(--butex-document2-border);\n border-radius: 8px;\n color: var(--butex-document2-fg);\n cursor: pointer;\n display: inline-flex;\n font-weight: 700;\n justify-content: center;\n line-height: 1;\n min-height: 30px;\n min-width: 30px;\n padding: 0 6px;\n}\n\n.butex-document2-widget__icon-btn:hover:not(:disabled),\n.butex-document2-widget__icon-btn[aria-pressed=\"true\"] {\n background: var(--butex-document2-accent-bg);\n border-color: var(--butex-document2-accent);\n}\n\n.butex-document2-widget__icon-btn:disabled {\n cursor: not-allowed;\n opacity: 0.45;\n}\n\n.butex-document2-widget__icon-btn--h1 {\n font-size: 1.15rem;\n}\n\n.butex-document2-widget__icon-btn--h2 {\n font-size: 1rem;\n}\n\n.butex-document2-widget__icon-btn--h3 {\n font-size: 0.88rem;\n}\n\n.butex-document2-widget__icon-math-inline {\n font-family: ui-monospace, Consolas, monospace;\n font-size: 0.78rem;\n font-weight: 600;\n}\n\n.butex-document2-widget__icon-math-display {\n font-size: 0.82rem;\n font-weight: 700;\n}\n\n.butex-document2-widget__icon-bibliography {\n display: inline-flex;\n line-height: 0;\n}\n\n.butex-document2-widget__icon-bibliography svg {\n display: block;\n}\n\n.butex-document2-widget__float-meta {\n display: grid;\n gap: 8px;\n margin-top: 8px;\n}\n\n.butex-document2-widget__float-meta--compact {\n gap: 4px;\n}\n\n.butex-document2-widget__float-meta-toggle {\n align-items: center;\n display: inline-flex;\n gap: 6px;\n font-size: 0.9rem;\n}\n\n.butex-document2-widget__preview-paragraph--centered {\n text-align: center;\n}\n\n.butex-document2-widget__labels-help {\n color: color-mix(in srgb, var(--butex-document2-fg) 72%, transparent);\n font-size: 0.9rem;\n margin: 0 0 10px;\n}\n\n.butex-document2-widget__preview-float {\n margin: 0.75rem 0;\n text-align: center;\n}\n\n.butex-document2-widget__preview-float figcaption {\n color: color-mix(in srgb, var(--butex-document2-fg) 80%, transparent);\n font-size: 0.92rem;\n margin-top: 0.4rem;\n text-align: center;\n}\n\n.butex-document2-widget__preview-float-number {\n font-weight: 600;\n}\n\n.butex-document2-widget__preview-ref {\n font-variant-numeric: tabular-nums;\n}\n\n.butex-document2-widget__ref-chip {\n border-style: dashed;\n}\n\n.butex-document2-widget__block-actions {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.butex-document2-widget button.butex-document2-widget__block-collapse {\n align-items: center;\n background: var(--butex-document2-collapse-bg);\n border-color: color-mix(in srgb, var(--butex-document2-border) 70%, var(--butex-document2-muted));\n display: inline-flex;\n font-weight: 800;\n justify-content: center;\n min-height: 26px;\n min-width: 26px;\n padding: 0;\n}\n\n.butex-document2-widget__math-chip-wrap {\n align-items: center;\n display: inline-flex;\n gap: 2px;\n}\n\n.butex-document2-widget__math-chip-wrap[data-display=\"true\"] {\n flex: 1 1 100%;\n justify-content: center;\n width: 100%;\n}\n\n.butex-document2-widget__math-chip-delete {\n background: transparent;\n border: 1px solid color-mix(in srgb, var(--butex-document2-danger) 35%, var(--butex-document2-border));\n border-radius: 6px;\n color: var(--butex-document2-danger);\n cursor: pointer;\n font-size: 0.85rem;\n line-height: 1;\n min-height: 24px;\n min-width: 24px;\n padding: 0;\n}\n\n.butex-document2-widget__table-cell {\n flex: 1 1 8rem;\n min-width: 8rem;\n}\n\n.butex-document2-widget__block--table .butex-document2-widget__inline-text {\n min-height: 3.5em;\n min-width: min(12ch, 100%);\n}\n\n.butex-document2-widget__table-popover {\n display: inline-block;\n position: relative;\n}\n\n.butex-document2-widget__table-popover-panel {\n background: var(--butex-document2-panel);\n border: 1px solid var(--butex-document2-border);\n border-radius: 10px;\n box-shadow: 0 8px 24px color-mix(in srgb, var(--butex-document2-fg) 12%, transparent);\n display: grid;\n gap: 8px;\n inset-inline-end: 0;\n padding: 10px;\n position: absolute;\n top: calc(100% + 6px);\n width: min(220px, 70vw);\n z-index: 30;\n}\n\n.butex-document2-widget__table-popover-panel label {\n color: var(--butex-document2-muted);\n display: grid;\n font-size: 0.82rem;\n gap: 4px;\n}\n\n.butex-document2-widget__toolbar-row {\n align-items: center;\n border-block-end: 1px solid color-mix(in srgb, var(--butex-document2-border) 70%, transparent);\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-block-end: 8px;\n padding-block-end: 8px;\n width: 100%;\n}\n\n.butex-document2-widget__toolbar-row:last-child {\n border-block-end: 0;\n margin-block-end: 0;\n padding-block-end: 0;\n}\n\n.butex-document2-widget__toolbar-label {\n color: var(--butex-document2-muted);\n font-size: 0.78rem;\n font-weight: 600;\n margin-inline-end: 4px;\n white-space: nowrap;\n}\n\n.butex-document2-widget__block-header {\n align-items: center;\n border-block-end: 1px solid color-mix(in srgb, var(--butex-document2-border) 80%, transparent);\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n justify-content: space-between;\n margin-block-end: 10px;\n padding-block-end: 8px;\n}\n\n.butex-document2-widget__block-select {\n accent-color: var(--butex-document2-accent);\n cursor: pointer;\n flex: 0 0 auto;\n height: 1rem;\n margin: 0;\n width: 1rem;\n}\n\n.butex-document2-widget__block--selected {\n background: var(--butex-document2-accent-bg);\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--butex-document2-accent) 45%, transparent);\n}\n\n.butex-document2-widget__selection-count {\n color: var(--butex-document2-muted);\n font-size: 0.78rem;\n font-weight: 600;\n padding-inline: 4px;\n white-space: nowrap;\n}\n\n.butex-document2-widget__block-title {\n align-items: center;\n color: var(--butex-document2-fg);\n display: inline-flex;\n gap: 8px;\n font-weight: 700;\n}\n\n.butex-document2-widget__block--section .butex-document2-widget__block-title {\n font-size: 1.12rem;\n}\n\n.butex-document2-widget__block--subsection .butex-document2-widget__block-title {\n font-size: 1.04rem;\n}\n\n.butex-document2-widget__block--subsubsection .butex-document2-widget__block-title {\n font-size: 0.98rem;\n}\n\n.butex-document2-widget__block--paragraph .butex-document2-widget__block-title {\n color: var(--butex-document2-muted);\n font-size: 0.86rem;\n font-weight: 600;\n}\n\n.butex-document2-widget__block--list .butex-document2-widget__block-title,\n.butex-document2-widget__block--table .butex-document2-widget__block-title,\n.butex-document2-widget__block--image .butex-document2-widget__block-title,\n.butex-document2-widget__block--raw .butex-document2-widget__block-title {\n font-size: 0.9rem;\n}\n\n.butex-document2-widget__block--section {\n background: color-mix(in srgb, var(--butex-document2-accent) 9%, var(--butex-document2-panel));\n border-inline-start: 4px solid var(--butex-document2-accent);\n}\n\n.butex-document2-widget__block--subsection {\n background: color-mix(in srgb, var(--butex-document2-accent) 6%, var(--butex-document2-panel));\n border-inline-start: 3px solid color-mix(in srgb, var(--butex-document2-accent) 78%, var(--butex-document2-border));\n}\n\n.butex-document2-widget__block--subsubsection {\n background: color-mix(in srgb, var(--butex-document2-accent) 4%, var(--butex-document2-panel));\n border-inline-start: 3px solid var(--butex-document2-border);\n}\n\n.butex-document2-widget__block--paragraph {\n border-inline-start: 2px solid color-mix(in srgb, var(--butex-document2-muted) 35%, transparent);\n}\n\n.butex-document2-widget__block--list {\n background: color-mix(in srgb, var(--butex-document2-bg) 55%, var(--butex-document2-panel));\n border-inline-start: 3px solid color-mix(in srgb, var(--butex-document2-accent) 55%, var(--butex-document2-border));\n}\n\n.butex-document2-widget__block--table {\n background: color-mix(in srgb, var(--butex-document2-bg) 40%, var(--butex-document2-panel));\n border-inline-start: 3px solid var(--butex-document2-border);\n}\n\n.butex-document2-widget__block--image {\n background: color-mix(in srgb, var(--butex-document2-muted) 6%, var(--butex-document2-panel));\n border-inline-start: 3px dashed color-mix(in srgb, var(--butex-document2-muted) 45%, var(--butex-document2-border));\n}\n\n.butex-document2-widget__block--raw {\n background: color-mix(in srgb, var(--butex-document2-muted) 8%, var(--butex-document2-panel));\n border-inline-start: 3px dashed var(--butex-document2-muted);\n}\n\n.butex-document2-widget__block--collapsed {\n background: var(--butex-document2-collapse-bg);\n}\n\n.butex-document2-widget__block--collapsed .butex-document2-widget__block-header {\n margin-block-end: 8px;\n}\n\n.butex-document2-widget__block-summary {\n background: color-mix(in srgb, var(--butex-document2-panel) 72%, transparent);\n border: 1px dashed color-mix(in srgb, var(--butex-document2-border) 70%, var(--butex-document2-muted));\n border-radius: 8px;\n color: var(--butex-document2-muted);\n font-size: 0.86rem;\n line-height: 1.5;\n min-width: 0;\n overflow-wrap: anywhere;\n padding: 8px 10px;\n}\n\n.butex-document2-widget__list-item-actions {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-block-start: 6px;\n}\n\n.butex-document2-widget__list-item-content {\n display: grid;\n gap: 8px;\n min-width: 0;\n}\n\n.butex-document2-widget__list-footer {\n border-block-start: 1px dashed color-mix(in srgb, var(--butex-document2-border) 85%, transparent);\n margin-block-start: 10px;\n padding-block-start: 10px;\n}\n\n.butex-document2-widget__button--danger:hover {\n border-color: var(--butex-document2-danger);\n color: var(--butex-document2-danger);\n}\n\n.butex-document2-widget__image-src-label {\n color: var(--butex-document2-muted);\n display: block;\n font-size: 0.82rem;\n margin-block-end: 4px;\n}\n\n.butex-document2-widget__toolbar,\n.butex-document2-widget__row {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.butex-document2-widget button {\n background: var(--butex-document2-panel);\n border: 1px solid var(--butex-document2-border);\n border-radius: 8px;\n color: var(--butex-document2-fg);\n cursor: pointer;\n min-height: 32px;\n padding: 0 10px;\n}\n\n.butex-document2-widget button:hover,\n.butex-document2-widget button[aria-pressed=\"true\"] {\n background: var(--butex-document2-accent-bg);\n border-color: var(--butex-document2-accent);\n}\n\n.butex-document2-widget button:focus-visible,\n.butex-document2-widget input:focus-visible,\n.butex-document2-widget textarea:focus-visible {\n border-color: var(--butex-document2-accent);\n box-shadow: 0 0 0 3px var(--butex-document2-focus-shadow);\n outline: none;\n}\n\n.butex-document2-widget input {\n background: var(--butex-document2-input-bg);\n border: 1px solid var(--butex-document2-border);\n border-radius: 8px;\n color: var(--butex-document2-fg);\n font: inherit;\n min-height: 34px;\n padding: 7px 9px;\n}\n\n.butex-document2-widget textarea {\n background: var(--butex-document2-input-bg);\n border: 1px solid var(--butex-document2-border);\n border-radius: 8px;\n color: var(--butex-document2-fg);\n font: inherit;\n line-height: 1.45;\n padding: 7px 9px;\n}\n\n.butex-document2-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-document2-widget__layout--editor-open.butex-document2-widget__layout--preview-open {\n grid-template-columns: minmax(0, 1fr) minmax(280px, 0.9fr);\n}\n\n/* One visible panel: a single track so the panel fills the widget (previewOnly / hide editor / hide preview). */\n.butex-document2-widget__layout--editor-open.butex-document2-widget__layout--preview-closed,\n.butex-document2-widget__layout--editor-closed.butex-document2-widget__layout--preview-open,\n.butex-document2-widget__layout--editor-closed.butex-document2-widget__layout--preview-closed {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.butex-document2-widget__editor-panel,\n.butex-document2-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/* When previewOnly (or display:none) leaves a lone panel, span the full grid. */\n.butex-document2-widget__editor-panel:only-child,\n.butex-document2-widget__preview-panel:only-child {\n grid-column: 1 / -1;\n width: 100%;\n}\n\n.butex-document2-widget__layout--editor-closed .butex-document2-widget__editor-panel,\n.butex-document2-widget__layout--preview-closed .butex-document2-widget__preview-panel {\n display: none;\n}\n\n.butex-document2-widget__inline-field {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n max-width: 100%;\n min-width: 0;\n width: 100%;\n}\n\n.butex-document2-widget__inline-text {\n background: var(--butex-document2-text-token-bg);\n border-color: var(--butex-document2-text-token-border);\n box-sizing: border-box;\n flex: 0 1 auto;\n max-width: 100%;\n min-height: 2.75em;\n min-width: 3ch;\n overflow-wrap: break-word;\n overflow-y: hidden;\n resize: none;\n text-align: start;\n white-space: pre-wrap;\n width: auto;\n word-break: break-word;\n}\n\n.butex-document2-widget__inline-text:hover {\n border-color: color-mix(in srgb, var(--butex-document2-text-token-border) 55%, var(--butex-document2-accent));\n}\n\n.butex-document2-widget__inline-field input {\n min-width: 12ch;\n}\n\n.butex-document2-widget__math-chip {\n background: var(--butex-document2-math-inline-bg);\n border-color: color-mix(in srgb, var(--butex-document2-math-border) 70%, var(--butex-document2-accent));\n border-width: 1.5px;\n direction: ltr;\n display: inline-flex;\n font-family: inherit;\n gap: 4px;\n max-width: 100%;\n min-height: 30px;\n overflow: visible;\n padding: 3px 7px;\n unicode-bidi: isolate;\n}\n\n.butex-document2-widget__math-chip:hover,\n.butex-document2-widget__math-chip:focus-visible {\n background: color-mix(in srgb, var(--butex-document2-accent) 12%, var(--butex-document2-panel));\n border-color: var(--butex-document2-accent);\n}\n\n.butex-document2-widget__math-chip[data-editable=\"false\"] {\n border-style: dashed;\n color: var(--butex-document2-muted);\n}\n\n.butex-document2-widget__math-chip[data-display=\"true\"] {\n background: var(--butex-document2-math-display-bg);\n border-color: color-mix(in srgb, var(--butex-document2-accent) 50%, var(--butex-document2-border));\n border-width: 1.5px;\n border-radius: 10px;\n box-shadow: 0 5px 16px color-mix(in srgb, var(--butex-document2-fg) 8%, transparent);\n justify-content: center;\n margin-block: 4px;\n min-height: 54px;\n padding: 10px 12px;\n width: min(100%, 36rem);\n}\n\n.butex-document2-widget__preview {\n background: var(--butex-document2-preview-bg);\n color: var(--butex-document2-preview-fg);\n font-family: var(--butex-document2-preview-font);\n font-size: 1.08rem;\n line-height: 1.9;\n max-width: 100%;\n min-width: 0;\n overflow-wrap: break-word;\n text-align: start;\n word-break: break-word;\n}\n\n.butex-document2-widget__preview h1,\n.butex-document2-widget__preview h2,\n.butex-document2-widget__preview h3,\n.butex-document2-widget__preview p,\n.butex-document2-widget__preview li {\n max-width: 100%;\n overflow-wrap: break-word;\n white-space: normal;\n word-break: break-word;\n}\n\n.butex-document2-widget__preview h1 {\n font-size: 1.75rem;\n font-weight: 700;\n line-height: 1.35;\n margin: 0 0 14px;\n}\n\n.butex-document2-widget__preview h2 {\n font-size: 1.4rem;\n font-weight: 600;\n line-height: 1.4;\n margin: 0 0 12px;\n}\n\n.butex-document2-widget__preview h3 {\n font-size: 1.2rem;\n font-weight: 600;\n line-height: 1.45;\n margin: 0 0 10px;\n}\n\n.butex-document2-widget__preview p {\n margin: 0 0 12px;\n}\n\n.butex-document2-widget__preview ul,\n.butex-document2-widget__preview ol {\n margin: 0 0 12px;\n padding-inline-start: 24px;\n}\n\n.butex-document2-widget__preview ul {\n list-style-type: disc;\n}\n\n.butex-document2-widget__preview ol {\n list-style-type: decimal;\n}\n\n.butex-document2-widget__preview img {\n display: block;\n height: auto;\n max-width: 100%;\n}\n\n.butex-document2-widget__preview table {\n border-collapse: collapse;\n border: 1px solid #000000;\n margin: 12px 0;\n max-width: 100%;\n table-layout: fixed;\n width: 100%;\n}\n\n.butex-document2-widget__preview td {\n border: 1px solid #000000;\n max-width: 100%;\n overflow-wrap: break-word;\n padding: 6px 8px;\n white-space: normal;\n word-break: break-word;\n}\n\n.butex-document2-widget__math-island {\n direction: ltr;\n display: inline-block;\n line-height: normal;\n margin: 0 2px;\n overflow: visible;\n unicode-bidi: isolate;\n vertical-align: middle;\n}\n\n/* Guard against host CSS resets (e.g. Tailwind Preflight's \\`svg { display: block }\\`).\n * MathJax v4 inline line-breaking emits an equation as several sibling <svg> chunks;\n * a block-level svg reset stacks them vertically inside the island. */\n.butex-document2-widget mjx-container svg {\n display: inline;\n}\n\n.butex-document2-widget__math-chip .butex-document2-widget__math-island {\n margin: 0;\n}\n\n.butex-document2-widget__math-island[data-render-state=\"loading\"] {\n opacity: 0.72;\n}\n\n.butex-document2-widget__math-island[data-render-state=\"error\"] {\n color: var(--butex-document2-error);\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n font-size: 0.88rem;\n max-width: 100%;\n overflow-wrap: anywhere;\n white-space: normal;\n}\n\n.butex-document2-widget__math-island[data-display=\"true\"] {\n display: block;\n margin: 10px 0;\n text-align: center;\n}\n\n.butex-document2-widget__math-chip .butex-document2-widget__math-island[data-display=\"true\"] {\n margin: 0;\n}\n\n.butex-document2-widget__raw {\n background: var(--butex-document2-raw-bg);\n border-radius: 8px;\n direction: ltr;\n padding: 8px;\n text-align: left;\n white-space: pre-wrap;\n}\n\n.butex-document2-widget__error {\n background: var(--butex-document2-error-bg);\n border: 1px solid var(--butex-document2-error);\n border-radius: 8px;\n color: var(--butex-document2-error);\n padding: 10px;\n}\n\n.butex-document2-widget__equation-modal {\n align-items: center;\n display: flex;\n inset: 0;\n justify-content: center;\n padding: 16px;\n position: fixed;\n z-index: 30;\n}\n\n.butex-document2-widget__equation-modal-backdrop {\n background: color-mix(in srgb, var(--butex-document2-fg) 34%, transparent);\n border: 0;\n cursor: pointer;\n display: block;\n height: 100%;\n inset: 0;\n margin: 0;\n padding: 0;\n position: absolute;\n width: 100%;\n}\n\n.butex-document2-widget__equation-modal-panel {\n background: var(--butex-document2-drawer-bg);\n border: 1px solid var(--butex-document2-border);\n border-radius: 12px;\n box-shadow: 0 18px 48px color-mix(in srgb, var(--butex-document2-fg) 18%, transparent);\n display: grid;\n gap: 12px;\n max-height: min(90vh, 900px);\n max-width: min(720px, 100%);\n overflow: auto;\n padding: 14px;\n position: relative;\n width: min(680px, 100%);\n z-index: 1;\n}\n\n/* Map document v2 tokens onto BuTeX equation editor chrome when embedded in this modal. */\n.butex-document2-widget__equation-modal-panel .butex-widget {\n --butex-bg: var(--butex-document2-bg);\n --butex-fg: var(--butex-document2-fg);\n --butex-muted: var(--butex-document2-muted);\n --butex-accent: var(--butex-document2-accent);\n --butex-accent-hover: color-mix(in srgb, var(--butex-document2-accent) 82%, #000000);\n --butex-toolbar-hover-bg: var(--butex-document2-accent-bg);\n --butex-toolbar-hover-border: var(--butex-document2-accent);\n --butex-danger: var(--butex-document2-danger);\n --butex-danger-bg: color-mix(in srgb, var(--butex-document2-danger) 12%, transparent);\n --butex-danger-border: color-mix(in srgb, var(--butex-document2-danger) 48%, transparent);\n --butex-on-accent: #ffffff;\n --butex-border: var(--butex-document2-border);\n --butex-panel: var(--butex-document2-panel);\n --butex-preview-bg: var(--butex-document2-preview-bg);\n --butex-preview-fg: var(--butex-document2-preview-fg);\n --butex-error: var(--butex-document2-error);\n --butex-error-bg: var(--butex-document2-error-bg);\n --butex-error-border: color-mix(in srgb, var(--butex-document2-error) 32%, var(--butex-document2-panel));\n --butex-shadow-md: 0 4px 14px color-mix(in srgb, var(--butex-document2-fg) 10%, transparent);\n --butex-dev-bg: var(--butex-document2-dev-bg);\n --butex-dev-border: var(--butex-document2-dev-border);\n --butex-dev-badge: var(--butex-dev-badge, #b45309);\n --butex-dev-badge-fg: var(--butex-dev-badge-fg, #ffffff);\n --butex-dev-muted: var(--butex-dev-muted, #92400e);\n --butex-dev-inset-bg: var(--butex-document2-dev-code-bg);\n --butex-dev-inset-border: color-mix(in srgb, var(--butex-document2-dev-border) 45%, transparent);\n --butex-dev-inset-fg: var(--butex-document2-dev-code-fg);\n --butex-surface-bg: linear-gradient(\n 180deg,\n var(--butex-document2-panel) 0%,\n color-mix(in srgb, var(--butex-document2-panel) 88%, var(--butex-document2-bg)) 100%\n );\n --butex-surface-fg: var(--butex-document2-fg);\n --butex-focus-border: color-mix(in srgb, var(--butex-document2-accent) 45%, transparent);\n --butex-focus-shadow: var(--butex-document2-focus-shadow);\n --butex-slot-hover: var(--butex-document2-accent-bg);\n --butex-selection-bg: color-mix(in srgb, var(--butex-document2-accent) 34%, transparent);\n --butex-selection-border: color-mix(in srgb, var(--butex-document2-accent) 90%, #0f172a);\n --butex-caret: var(--butex-document2-fg);\n --butex-node-hover: color-mix(in srgb, var(--butex-document2-muted) 14%, transparent);\n --butex-node-selected-bg: var(--butex-document2-accent-bg);\n --butex-node-selected-border: color-mix(in srgb, var(--butex-document2-accent) 45%, transparent);\n --butex-script-border: var(--butex-document2-border);\n --butex-script-bg: color-mix(in srgb, var(--butex-document2-bg) 35%, var(--butex-document2-panel));\n --butex-script-color: var(--butex-document2-muted);\n --butex-delim-color: var(--butex-document2-muted);\n --butex-frac-bar: currentColor;\n}\n\n.butex-document2-widget__dev {\n background: var(--butex-document2-dev-bg);\n border-color: var(--butex-document2-dev-border);\n}\n\n.butex-document2-widget__dev pre {\n background: var(--butex-document2-dev-code-bg);\n color: var(--butex-document2-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-document2-widget__dev-diagnostic {\n background: rgba(251, 191, 36, 0.18);\n border: 1px solid rgba(217, 119, 6, 0.4);\n border-radius: 8px;\n color: #92400e;\n margin: 0;\n padding: 8px 10px;\n}\n\n@media (max-width: 900px) {\n .butex-document2-widget__layout,\n .butex-document2-widget__layout--editor-open.butex-document2-widget__layout--preview-open,\n .butex-document2-widget__layout--editor-open.butex-document2-widget__layout--preview-closed,\n .butex-document2-widget__layout--editor-closed.butex-document2-widget__layout--preview-open,\n .butex-document2-widget__layout--editor-closed.butex-document2-widget__layout--preview-closed {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .butex-document2-widget__layout,\n .butex-document2-widget__editor-panel,\n .butex-document2-widget__preview-panel {\n transition: none;\n }\n}\n\n.butex-document2-widget__cite-chip-wrap {\n align-items: center;\n display: inline-flex;\n gap: 2px;\n margin-inline: 2px;\n max-width: 100%;\n vertical-align: baseline;\n}\n\n.butex-document2-widget__cite-chip {\n background: color-mix(in srgb, var(--butex-document2-accent) 8%, var(--butex-document2-panel));\n border: 1.5px solid color-mix(in srgb, var(--butex-document2-accent) 45%, var(--butex-document2-border));\n border-radius: 6px;\n color: inherit;\n cursor: pointer;\n display: inline-flex;\n font: inherit;\n font-variant-numeric: tabular-nums;\n line-height: 1.3;\n min-height: 28px;\n padding: 2px 8px;\n}\n\n.butex-document2-widget__cite-chip[data-editable=\"false\"] {\n border-style: dashed;\n cursor: default;\n}\n\n.butex-document2-widget__cite-chip:hover,\n.butex-document2-widget__cite-chip:focus-visible {\n background: color-mix(in srgb, var(--butex-document2-accent) 14%, var(--butex-document2-panel));\n border-color: var(--butex-document2-accent);\n}\n\n.butex-document2-widget__cite-chip-delete {\n background: transparent;\n border: none;\n color: var(--butex-document2-muted);\n cursor: pointer;\n font: inherit;\n line-height: 1;\n padding: 0 4px;\n}\n\n.butex-document2-widget__preview-cite {\n color: inherit;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n.butex-document2-widget__preview-bibliography,\n.butex-document2-widget__bibliography-editor {\n display: grid;\n gap: 0.5rem;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.butex-document2-widget__preview-bibliography li,\n.butex-document2-widget__bibliography-editor li {\n display: grid;\n gap: 0.25rem;\n grid-template-columns: auto 1fr;\n}\n\n.butex-document2-widget__preview-bib-number {\n font-variant-numeric: tabular-nums;\n}\n\n.butex-document2-widget__block--bibliography {\n border-color: color-mix(in srgb, var(--butex-document2-accent) 35%, var(--butex-document2-border));\n}\n\n.butex-document2-widget__digit-form-menu {\n position: relative;\n}\n\n.butex-document2-widget__digit-form-options {\n background: var(--butex-document2-panel);\n border: 1px solid var(--butex-document2-border);\n border-radius: 8px;\n box-shadow: 0 8px 24px color-mix(in srgb, #000 16%, transparent);\n display: grid;\n gap: 2px;\n inset-inline-start: 0;\n margin-top: 4px;\n padding: 4px;\n position: absolute;\n top: 100%;\n z-index: 5;\n}\n\n.butex-document2-widget__digit-form-option {\n background: transparent;\n border: none;\n border-radius: 6px;\n color: inherit;\n cursor: pointer;\n font: inherit;\n padding: 6px 10px;\n text-align: start;\n}\n\n.butex-document2-widget__digit-form-option[aria-selected=\"true\"],\n.butex-document2-widget__digit-form-option:hover {\n background: color-mix(in srgb, var(--butex-document2-accent) 12%, var(--butex-document2-panel));\n}\n\n.butex-document2-widget__cite-picker-backdrop,\n.butex-document2-widget__refs-backdrop {\n align-items: center;\n background: color-mix(in srgb, #000 35%, transparent);\n display: flex;\n inset: 0;\n justify-content: center;\n padding: 1rem;\n position: fixed;\n z-index: 40;\n}\n\n.butex-document2-widget__cite-picker,\n.butex-document2-widget__refs-panel {\n background: var(--butex-document2-panel);\n border: 1px solid var(--butex-document2-border);\n border-radius: 12px;\n box-shadow: 0 16px 40px color-mix(in srgb, #000 22%, transparent);\n display: grid;\n gap: 0.75rem;\n max-height: min(80vh, 640px);\n max-width: 560px;\n overflow: auto;\n padding: 1rem;\n width: min(100%, 560px);\n}\n\n.butex-document2-widget__cite-picker-header,\n.butex-document2-widget__refs-header,\n.butex-document2-widget__cite-picker-footer,\n.butex-document2-widget__refs-item-head {\n align-items: center;\n display: flex;\n gap: 0.5rem;\n justify-content: space-between;\n}\n\n.butex-document2-widget__cite-picker-list,\n.butex-document2-widget__refs-list {\n display: grid;\n gap: 0.5rem;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.butex-document2-widget__cite-picker-item,\n.butex-document2-widget__refs-field {\n display: grid;\n gap: 0.25rem;\n}\n\n.butex-document2-widget__cite-picker-item {\n align-items: start;\n grid-template-columns: auto 1fr;\n}\n\n.butex-document2-widget__cite-picker-meta,\n.butex-document2-widget__cite-picker-empty {\n color: var(--butex-document2-muted);\n display: block;\n font-size: 0.92em;\n}\n\n.butex-document2-widget__refs-grid {\n display: grid;\n gap: 0.5rem;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n}\n\n.butex-document2-widget__refs-field input {\n background: var(--butex-document2-input-bg, var(--butex-document2-panel));\n border: 1px solid var(--butex-document2-border);\n border-radius: 6px;\n color: inherit;\n font: inherit;\n padding: 0.4rem 0.55rem;\n width: 100%;\n}\n\n.butex-document2-widget__refs-item {\n border: 1px solid var(--butex-document2-border);\n border-radius: 10px;\n display: grid;\n gap: 0.5rem;\n padding: 0.75rem;\n}\n\n.butex-document2-widget__refs-item-actions {\n display: inline-flex;\n gap: 0.25rem;\n}\n\n.butex-document2-widget__primary-btn {\n background: var(--butex-document2-accent);\n border: none;\n border-radius: 8px;\n color: #fff;\n cursor: pointer;\n font: inherit;\n padding: 0.45rem 0.8rem;\n}\n\n.butex-document2-widget__primary-btn:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.butex-document2-widget__article-meta {\n background: color-mix(in srgb, var(--butex-document2-panel) 92%, var(--butex-document2-accent-bg));\n border: 1px solid var(--butex-document2-border);\n border-radius: 10px;\n display: grid;\n gap: 0.75rem;\n margin-bottom: 0.85rem;\n padding: 0.85rem 0.9rem;\n}\n\n.butex-document2-widget__article-meta-header {\n align-items: center;\n display: flex;\n gap: 0.5rem;\n justify-content: space-between;\n}\n\n.butex-document2-widget__article-meta-badge {\n background: var(--butex-document2-accent-bg);\n border: 1px solid color-mix(in srgb, var(--butex-document2-accent) 35%, var(--butex-document2-border));\n border-radius: 999px;\n color: var(--butex-document2-accent);\n font-size: 0.78rem;\n font-weight: 600;\n padding: 0.15rem 0.55rem;\n}\n\n.butex-document2-widget__article-meta-date-preview {\n color: color-mix(in srgb, var(--butex-document2-fg) 70%, transparent);\n font-size: 0.92rem;\n margin: 0.15rem 0 0;\n}\n\n.butex-document2-widget__article-meta-fixed {\n color: color-mix(in srgb, var(--butex-document2-fg) 78%, transparent);\n font-size: 0.95rem;\n line-height: 1.7;\n margin: 0;\n text-align: center;\n}\n\n.butex-document2-widget__article-meta-grid {\n display: grid;\n gap: 0.65rem;\n}\n\n.butex-document2-widget__article-meta-field {\n display: grid;\n gap: 0.3rem;\n font-size: 0.92rem;\n}\n\n.butex-document2-widget__article-meta-field input,\n.butex-document2-widget__article-meta-field textarea {\n background: var(--butex-document2-input-bg, var(--butex-document2-panel));\n border: 1px solid var(--butex-document2-border);\n border-radius: 6px;\n color: inherit;\n font: inherit;\n padding: 0.4rem 0.55rem;\n width: 100%;\n}\n\n.butex-document2-widget__article-meta-date {\n display: grid;\n gap: 0.45rem;\n grid-template-columns: minmax(4rem, 1fr) minmax(7rem, 2fr) minmax(5rem, 1.2fr);\n}\n\n.butex-document2-widget__hijri-menu {\n position: relative;\n}\n\n.butex-document2-widget__hijri-menu-trigger {\n appearance: none;\n background-color: var(--butex-document2-input-bg, var(--butex-document2-panel));\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%236b7280' d='M1.2 1.3L6 6.1l4.8-4.8 1.2 1.2L6 8.5 0 2.5z'/%3E%3C/svg%3E\");\n background-position: left 0.65rem center;\n background-repeat: no-repeat;\n background-size: 0.7rem;\n border: 1px solid var(--butex-document2-border);\n border-radius: 8px;\n color: inherit;\n cursor: pointer;\n font: inherit;\n min-height: 2.35rem;\n padding: 0.45rem 0.7rem 0.45rem 1.7rem;\n text-align: start;\n transition: border-color 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease;\n width: 100%;\n}\n\n.butex-document2-widget[dir=\"rtl\"] .butex-document2-widget__hijri-menu-trigger {\n background-position: right 0.65rem center;\n padding: 0.45rem 1.7rem 0.45rem 0.7rem;\n}\n\n.butex-document2-widget__hijri-menu-trigger:hover,\n.butex-document2-widget__hijri-menu-trigger[aria-expanded=\"true\"] {\n background-color: color-mix(in srgb, var(--butex-document2-accent-bg) 55%, var(--butex-document2-panel));\n border-color: color-mix(in srgb, var(--butex-document2-accent) 45%, var(--butex-document2-border));\n}\n\n.butex-document2-widget__hijri-menu-trigger:focus-visible {\n border-color: var(--butex-document2-accent);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--butex-document2-accent) 28%, transparent);\n outline: none;\n}\n\n.butex-document2-widget__hijri-menu-list {\n background: var(--butex-document2-panel);\n border: 1px solid var(--butex-document2-border);\n border-radius: 10px;\n box-shadow: 0 12px 28px color-mix(in srgb, #000 18%, transparent);\n inset-inline-start: 0;\n list-style: none;\n margin: 0.3rem 0 0;\n max-height: 14rem;\n overflow-x: hidden;\n overflow-y: auto;\n padding: 0.35rem;\n position: absolute;\n scrollbar-color: color-mix(in srgb, var(--butex-document2-muted) 55%, transparent) transparent;\n scrollbar-width: thin;\n top: 100%;\n width: 100%;\n z-index: 12;\n}\n\n.butex-document2-widget__hijri-menu-list::-webkit-scrollbar {\n width: 0.55rem;\n}\n\n.butex-document2-widget__hijri-menu-list::-webkit-scrollbar-track {\n background: transparent;\n margin: 0.35rem 0;\n}\n\n.butex-document2-widget__hijri-menu-list::-webkit-scrollbar-thumb {\n background: color-mix(in srgb, var(--butex-document2-muted) 45%, transparent);\n border: 2px solid transparent;\n border-radius: 999px;\n background-clip: padding-box;\n}\n\n.butex-document2-widget__hijri-menu-list::-webkit-scrollbar-thumb:hover {\n background: color-mix(in srgb, var(--butex-document2-accent) 55%, var(--butex-document2-muted));\n background-clip: padding-box;\n border: 2px solid transparent;\n}\n\n.butex-document2-widget__hijri-menu-option {\n background: transparent;\n border: none;\n border-radius: 7px;\n color: inherit;\n cursor: pointer;\n display: block;\n font: inherit;\n padding: 0.45rem 0.65rem;\n text-align: start;\n width: 100%;\n}\n\n.butex-document2-widget__hijri-menu-option:hover,\n.butex-document2-widget__hijri-menu-option[aria-selected=\"true\"] {\n background: color-mix(in srgb, var(--butex-document2-accent) 14%, var(--butex-document2-panel));\n}\n\n.butex-document2-widget__hijri-menu-option:focus-visible {\n outline: 2px solid color-mix(in srgb, var(--butex-document2-accent) 55%, transparent);\n outline-offset: -2px;\n}\n\n.butex-document2-widget__visually-hidden {\n border: 0;\n clip: rect(0, 0, 0, 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n\n.butex-document2-widget__preview-basmala,\n.butex-document2-widget__preview-closing {\n margin: 0.35rem 0 0.85rem;\n}\n\n.butex-document2-widget__preview-basmala .butex-document2-widget__math-island[data-display=\"true\"],\n.butex-document2-widget__preview-closing .butex-document2-widget__math-island[data-display=\"true\"] {\n margin: 0;\n}\n\n.butex-document2-widget__preview-title-block {\n background: color-mix(in srgb, var(--butex-document2-accent-bg) 55%, transparent);\n border: 1px solid color-mix(in srgb, var(--butex-document2-border) 75%, transparent);\n border-radius: 10px;\n margin: 0.5rem 0 1rem;\n padding: 0.85rem 1rem;\n text-align: center;\n}\n\n.butex-document2-widget__preview-article-title {\n font-size: 1.45rem;\n font-weight: 700;\n line-height: 1.35;\n margin: 0 0 0.45rem;\n}\n\n.butex-document2-widget__preview-article-authors,\n.butex-document2-widget__preview-article-date {\n margin: 0.2rem 0;\n}\n\n.butex-document2-widget__preview-article-date {\n color: color-mix(in srgb, var(--butex-document2-fg) 72%, transparent);\n font-size: 0.95rem;\n}\n\n.butex-document2-widget__preview-abstract {\n background: color-mix(in srgb, var(--butex-document2-panel) 88%, var(--butex-document2-muted));\n border: 1px dashed color-mix(in srgb, var(--butex-document2-border) 85%, transparent);\n border-radius: 8px;\n margin: 0.75rem 0 1rem;\n padding: 0.75rem 0.9rem;\n}\n\n.butex-document2-widget__preview-abstract-label {\n font-size: 1rem;\n font-weight: 700;\n margin: 0 0 0.35rem;\n}\n\n.butex-document2-widget__preview-abstract p {\n margin: 0;\n}\n\n.butex-document2-widget__preview-empty-body {\n color: var(--butex-document2-muted);\n font-style: italic;\n text-align: center;\n}\n`;\n\nexport function injectBuTeXDocument2Styles(doc?: Document): void {\n const d = doc ?? (typeof document !== 'undefined' ? document : undefined);\n if (!d) {\n return;\n }\n\n const id = 'butex-document2-widget-styles';\n if (d.getElementById(id)) {\n return;\n }\n\n const style = d.createElement('style');\n style.id = id;\n style.textContent = DOCUMENT2_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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AA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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["value","node","parseChain","document","isObject","nextId","targetRow","next","clamp","clamp","scripts","document","document","document","document","document","document","block","reference","document","document","document","useCallback","useEffect","useRef","useState","useRef","jsx","jsxs","useEffect","useRef","useState","node","jsx","useRef","useState","useEffect","jsx","jsxs","jsx","jsxs","document","jsx","useRef","jsx","jsxs","useEffect","useState","jsx","jsxs","useState","useEffect","useState","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","useState","jsx","jsxs","useEffect","useRef","useEffect","useRef","useState","Fragment","jsx","jsxs","digitFormLabel","ButexEditor","useRef","useState","selectedDigitForm","useEffect","_","jsx","jsxs","useRef","useEffect","jsx","jsxs","useState","jsx","jsxs","useState","useEffect","useState","jsx","jsxs","useState","useEffect","document","Fragment","jsx","jsxs","document","useState","useRef","useEffect","useCallback","next"]}
|