@drghaliasri/butex 3.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/diwani-font.ts","../src/rtl-css.ts","../src/register/arabsqrt.ts","../src/register/prescript.ts","../src/editor/atomicCommands.ts","../src/register/atomicCommands.ts","../src/register/takween.ts","../src/register/mirror.ts","../src/register/passthrough.ts","../src/register.ts","../src/editor/display/delimiter.ts","../src/editor/display/frac.ts","../src/editor/display/sqrt.ts","../src/editor/display/env.ts","../src/editor/display/atomicCommand.ts","../src/editor/atomicCommandsOperators.ts","../src/editor/display/atomicCommandsOperators.ts","../src/editor/styles.ts","../src/editor/index.ts","../src/editor/factory.ts","../src/editor/digits.ts","../src/editor/render.ts","../src/editor/caretOrder.ts","../src/editor/traversal.ts","../src/editor/selection.ts","../src/editor/clipboard.ts","../src/editor/history.ts","../src/editor/state.ts","../src/editor/display/base.ts","../src/editor/display/scripts.ts","../src/editor/display/index.ts","../src/editor/runtime.ts","../src/parser/errors.ts","../src/parser/commands.ts","../src/parser/emit.ts","../src/parser/tokenizer.ts","../src/parser/parser.ts","../src/mathjax/svgPatcher.ts","../src/mathjax/renderIsland.ts","../src/mathjax/svgTextWrapper.ts","../src/index.ts"],"sourcesContent":["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 {\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\n/**\n * Styles for Arabic RTL radical rendering via double horizontal reflection.\n * Inject once per document (e.g. append a `<style>` tag).\n */\nexport const BUTEX_CHROME_CSS = `\n${BUTEX_FONT_FACE_CSS}\n\n/* BuTeX: Arabic sqrt — outer mirror entire radical, inner unmirror index & radicand */\nmjx-container[jax=\"CHTML\"] .mjx-rtl-mirror {\n transform: scaleX(-1);\n transform-origin: center;\n display: inline-block;\n}\n\nmjx-container[jax=\"CHTML\"] .mjx-rtl-unmirror {\n transform: scaleX(-1);\n transform-origin: center;\n display: inline-block;\n}\n\nmjx-container[jax=\"CHTML\"] .mjx-rtl-root-index {\n --butex-arabsqrt-root-rise: -0.38em;\n transform: scaleX(-1) translateY(var(--butex-arabsqrt-root-rise));\n}\n\n/* SVG output needs explicit transform geometry; CommonHTML keeps the rules above. */\nmjx-container[jax=\"SVG\"] svg .mjx-rtl-mirror,\nmjx-container[jax=\"SVG\"] svg .mjx-rtl-unmirror,\nmjx-container[jax=\"SVG\"] svg .mjx-rtl-root-index {\n transform-box: fill-box;\n transform-origin: center center;\n}\n\nmjx-container[jax=\"SVG\"] svg [data-butex-svg-arabsqrt=\"patched\"] {\n vector-effect: non-scaling-stroke;\n}\n\n/* BuTeX custom-font SVG text draws real glyphs that may overflow the (fixed,\n * math-sized) layout box. Allow the overflow to paint instead of clipping it;\n * this never reflows surrounding math because the layout box is unchanged. */\nmjx-container[jax=\"SVG\"] svg:has(text[data-butex-svg-text]) {\n overflow: visible;\n}\n\nmjx-container[jax=\"SVG\"] svg text[data-butex-svg-text] {\n direction: rtl;\n unicode-bidi: isolate;\n}\n\n.butex-preview-mirror {\n transform: scaleX(-1);\n transform-origin: center;\n display: inline-block;\n}\n\nmjx-container[jax=\"SVG\"] svg .butex-preview-mirror {\n transform-box: fill-box;\n transform-origin: center center;\n}\n\n/* Keeps Arabic text shaping sane after double flip; tweak fonts in page preamble */\n.mjx-rtl-unmirror .mjx-text,\n.mjx-rtl-unmirror .mjx-char {\n direction: rtl;\n unicode-bidi: isolate;\n}\n\n.butex-diwani-command {\n font-family: ${BUTEX_DIWANI_FONT_STACK};\n direction: rtl;\n unicode-bidi: isolate;\n}\n\n.butex-diwani-command mjx-utext {\n font-family: ${BUTEX_DIWANI_FONT_STACK} !important;\n}\n\n.butex-diwani-outline-command {\n font-family: ${BUTEX_DIWANI_OUTLINE_FONT_STACK};\n direction: rtl;\n unicode-bidi: isolate;\n}\n\n.butex-diwani-outline-command mjx-utext {\n font-family: ${BUTEX_DIWANI_OUTLINE_FONT_STACK} !important;\n}\n\n.butex-takween-text {\n font-family: ${BUTEX_TAKWEEN_FONT_STACK};\n direction: rtl;\n unicode-bidi: isolate;\n}\n\n.butex-takween-text mjx-utext {\n font-family: ${BUTEX_TAKWEEN_FONT_STACK} !important;\n}\n\n.butex-diwani-text {\n font-family: ${BUTEX_DIWANI_FONT_STACK};\n direction: rtl;\n unicode-bidi: isolate;\n}\n\n.butex-diwani-text mjx-utext {\n font-family: ${BUTEX_DIWANI_FONT_STACK} !important;\n}\n\n.butex-diwani-outline-text {\n font-family: ${BUTEX_DIWANI_OUTLINE_FONT_STACK};\n direction: rtl;\n unicode-bidi: isolate;\n}\n\n.butex-diwani-outline-text mjx-utext {\n font-family: ${BUTEX_DIWANI_OUTLINE_FONT_STACK} !important;\n}\n`.trim();\n","import type { ParseMethod, TexParserLike, TexModule } from '../mathjax-types.js';\nimport { texMod } from '../register.js';\n\nconst COMMAND_MAP = 'butex-arabsqrt-macros';\n\nfunction parseRoot(parser: TexParserLike, n: string): unknown {\n const env = parser.stack.env;\n const inRoot = env['inRoot'];\n env['inRoot'] = true;\n\n const TexParserClass = parser.constructor as unknown as new (\n tex: string,\n env: Record<string, unknown>,\n configuration: unknown\n ) => {\n mml(): unknown;\n stack: { global: Record<string, unknown> };\n };\n\n const newParser = new TexParserClass(n, env, parser.configuration);\n let node = newParser.mml();\n const global = newParser.stack.global;\n if (global['leftRoot'] || global['upRoot']) {\n const def: Record<string, unknown> = {};\n if (global['leftRoot']) {\n def['width'] = global['leftRoot'];\n }\n if (global['upRoot']) {\n def['voffset'] = global['upRoot'];\n def['height'] = global['upRoot'];\n }\n node = parser.create('node', 'mpadded', [node], def);\n }\n env['inRoot'] = inRoot;\n return node;\n}\n\nfunction unmirrorWrap(parser: TexParserLike, inner: unknown, extraClass = '', part = ''): unknown {\n const row = parser.create('node', 'mrow', [inner], {});\n const NU = texMod().NodeUtil.default;\n NU.setAttribute(row, 'class', `mjx-rtl-unmirror${extraClass ? ` ${extraClass}` : ''}`);\n if (part) {\n NU.setAttribute(row, 'data-butex-arabsqrt-part', part);\n }\n return row;\n}\n\nfunction arabSqrt(parser: TexParserLike, name: string): void {\n const n = parser.GetBrackets(name);\n let arg = parser.GetArgument(name);\n if (arg === '\\\\frac') {\n arg +=\n '{' + parser.GetArgument(arg) + '}{' + parser.GetArgument(arg) + '}';\n }\n\n const TexParserClass = parser.constructor as unknown as new (\n tex: string,\n env: Record<string, unknown>,\n configuration: unknown\n ) => {\n mml(): unknown;\n };\n\n let inner = new TexParserClass(arg, parser.stack.env, parser.configuration).mml();\n inner = unmirrorWrap(parser, inner, '', 'base');\n\n let rootNode: unknown;\n if (!n) {\n rootNode = parser.create('node', 'msqrt', [inner]);\n } else {\n let indexNode = parseRoot(parser, n);\n indexNode = unmirrorWrap(parser, indexNode, 'mjx-rtl-root-index', 'index');\n rootNode = parser.create('node', 'mroot', [inner, indexNode]);\n }\n\n const outer = parser.create('node', 'mrow', [rootNode], {});\n const NU = texMod().NodeUtil.default;\n NU.setAttribute(outer, 'class', 'mjx-rtl-mirror');\n NU.setAttribute(outer, 'data-mjx-rtl-root', 'true');\n\n parser.Push(outer);\n}\n\nconst arabSqrtTyped = arabSqrt as ParseMethod;\n\nexport function registerArabSqrtCommand(\n CommandMap: TexModule['TokenMap']['CommandMap']\n): string {\n new CommandMap(COMMAND_MAP, {\n arabsqrt: arabSqrtTyped,\n arsqrt: arabSqrtTyped,\n });\n return COMMAND_MAP;\n}\n","import type { ParseMethod, TexParserLike, TexModule } from '../mathjax-types.js';\n\nconst COMMAND_MAP = 'butex-prescript-macros';\n\nfunction parseArgumentMml(parser: TexParserLike, tex: string): unknown {\n const TexParserClass = parser.constructor as unknown as new (\n texInput: string,\n env: Record<string, unknown>,\n configuration: unknown\n ) => {\n mml(): unknown;\n };\n return new TexParserClass(tex, parser.stack.env, parser.configuration).mml();\n}\n\n/**\n * Implements `\\prescript{sup}{sub}{base}` via MathML `mmultiscripts`.\n * Child order is:\n * base, (post-sub none), (post-sup none), mprescripts, pre-sub, pre-sup.\n */\nfunction prescript(parser: TexParserLike, name: string): void {\n const supArg = parser.GetArgument(name);\n const subArg = parser.GetArgument(name);\n const baseArg = parser.GetArgument(name);\n\n const base = parseArgumentMml(parser, baseArg);\n const preSub = parseArgumentMml(parser, subArg);\n const preSup = parseArgumentMml(parser, supArg);\n const nonePostSub = parser.create('node', 'none', []);\n const nonePostSup = parser.create('node', 'none', []);\n const mprescripts = parser.create('node', 'mprescripts', []);\n\n const scripted = parser.create('node', 'mmultiscripts', [\n base,\n nonePostSub,\n nonePostSup,\n mprescripts,\n preSub,\n preSup,\n ]);\n parser.Push(scripted);\n}\n\nconst prescriptTyped = prescript as ParseMethod;\n\nexport function registerPrescriptCommand(\n CommandMap: TexModule['TokenMap']['CommandMap']\n): string {\n new CommandMap(COMMAND_MAP, { prescript: prescriptTyped });\n return COMMAND_MAP;\n}\n\n","export const ATOMIC_COMMANDS = {\n ///////////////////////// Functions ////////////////////////////////\n\n //////////////// Trigonometric Functions \n cos: {\n id: 'cos',\n category: 'function',\n englishTex: '\\\\cos',\n arabicTex: '\\\\arcos',\n arabicLabel: 'جتا',\n title: 'جيب التمام',\n },\n sin: {\n id: 'sin',\n category: 'function',\n englishTex: '\\\\sin',\n arabicTex: '\\\\arsin',\n arabicLabel: 'جا',\n title: 'جيب',\n },\n tan: {\n id: 'tan',\n category: 'function',\n englishTex: '\\\\tan',\n arabicTex: '\\\\artan',\n arabicLabel: 'ظا',\n title: 'ظل',\n },\n cot: {\n id: 'cot',\n category: 'function',\n englishTex: '\\\\cot',\n arabicTex: '\\\\arcot',\n arabicLabel: 'ظتا',\n title: 'ظل تمام',\n },\n sec: {\n id: 'sec',\n category: 'function',\n englishTex: '\\\\sec',\n arabicTex: '\\\\arsec',\n arabicLabel: 'قا',\n title: 'قاطع',\n },\n csc: {\n id: 'csc',\n category: 'function',\n englishTex: '\\\\csc',\n arabicTex: '\\\\arcsc',\n arabicLabel: 'قتا',\n title: 'قاطع تمام',\n },\n\n\n /////////////////// Arc Trigonometric Functions \n arccos: {\n id: 'arccos',\n category: 'function',\n englishTex: '\\\\arccos',\n arabicTex: '\\\\aracos',\n arabicLabel: 'قجتا',\n title: 'قاطع جيب التمام',\n },\n arcsin: {\n id: 'arcsin',\n category: 'function',\n englishTex: '\\\\arcsin',\n arabicTex: '\\\\arasin',\n arabicLabel: 'قجا',\n title: 'قاطع جيب',\n },\n arctan: {\n id: 'arctan',\n category: 'function',\n englishTex: '\\\\arctan',\n arabicTex: '\\\\aratan',\n arabicLabel: 'قظا',\n title: 'قاطع ظل',\n },\n arccot: {\n id: 'arccot',\n category: 'function',\n englishTex: '\\\\arccot',\n arabicTex: '\\\\aracot',\n arabicLabel: 'قظتا',\n title: 'قاطع ظل التمام',\n },\n arcsec: {\n id: 'arcsec',\n category: 'function',\n englishTex: '\\\\arcsec',\n arabicTex: '\\\\arasec',\n arabicLabel: 'ققا',\n title: 'قاطع القاطع',\n },\n arccsc: {\n id: 'arccsc',\n category: 'function',\n englishTex: '\\\\arccsc',\n arabicTex: '\\\\aracsc',\n arabicLabel: 'ققتا',\n title: 'قاطع القاطع التمام',\n },\n\n ///////////////// Hyperbolic Functions \n cosh: {\n id: 'cosh',\n category: 'function',\n englishTex: '\\\\cosh',\n arabicTex: '\\\\arcosh',\n arabicLabel: 'جتزا',\n title: 'جيب التمام الزائد',\n },\n sinh: {\n id: 'sinh',\n category: 'function',\n englishTex: '\\\\sinh',\n arabicTex: '\\\\arsinh',\n arabicLabel: 'جزا',\n title: 'جيب الزائد',\n },\n tanh: {\n id: 'tanh',\n category: 'function',\n englishTex: '\\\\tanh',\n arabicTex: '\\\\artanh',\n arabicLabel: 'ظزا',\n title: 'ظل الزائد',\n },\n coth: {\n id: 'coth',\n category: 'function',\n englishTex: '\\\\coth',\n arabicTex: '\\\\arcoth',\n arabicLabel: 'ظتزا',\n title: 'ظل تمام الزائد',\n },\n\n ////// These function somehow doesnt exist in LaTeX and therefore MathJax, skip for now. no problem.\n // sech: {\n // id: 'sech',\n // category: 'function',\n // englishTex: '\\\\sech',\n // arabicTex: '\\\\arsech',\n // arabicLabel: 'قزا',\n // title: 'قاطع الزائد',\n // },\n // csch: {\n // id: 'csch',\n // category: 'function',\n // englishTex: '\\\\csch',\n // arabicTex: '\\\\arcsch',\n // arabicLabel: 'قتزا',\n // title: 'قاطع تمام الزائد',\n // },\n\n\n ///////////////// arc Hyperbolic Functions \n ///// Not on MathJax, skip for now, it is okay.\n\n\n\n ////////////////////// Limits & Series ////////////////////////////////\n sum: {\n id: 'sum',\n category: 'limits_series',\n englishTex: '\\\\sum',\n arabicTex: '\\\\arsum',\n arabicLabel: 'مجـــ',\n title: 'مجموع',\n },\n prod: {\n id: 'prod',\n category: 'limits_series',\n englishTex: '\\\\prod',\n arabicTex: '\\\\arprod',\n arabicLabel: 'جـــد',\n title: 'جداء',\n },\n lim: {\n id: 'lim',\n category: 'limits_series',\n englishTex: '\\\\lim',\n arabicTex: '\\\\arlim',\n arabicLabel: 'نـــــها',\n title: 'حد',\n },\n max: {\n id: 'max',\n category: 'limits_series',\n englishTex: '\\\\max',\n arabicTex: '\\\\armax',\n arabicLabel: 'أكبر',\n title: 'أكبر',\n },\n min: {\n id: 'min',\n category: 'limits_series',\n englishTex: '\\\\min',\n arabicTex: '\\\\armin',\n arabicLabel: 'أصغر',\n title: 'أصغر',\n },\n sup: {\n id: 'sup',\n category: 'limits_series',\n englishTex: '\\\\sup',\n arabicTex: '\\\\arsup',\n arabicLabel: 'أعلى',\n title: 'أعلى',\n },\n inf: {\n id: 'inf',\n category: 'limits_series',\n englishTex: '\\\\inf',\n arabicTex: '\\\\arinf',\n arabicLabel: 'أدنى',\n title: 'أدنى',\n },\n\n ////////////////////// Logarithmic and Exponential and Determinant Functions ////////////////////////////////\n pi: {\n id: 'pi',\n category: 'function2',\n englishTex: '\\\\pi',\n arabicTex: '\\\\arpi',\n arabicLabel: 'ط',\n title: 'نسبة الدائرة',\n },\n exp: {\n id: 'exp',\n category: 'function2',\n englishTex: '\\\\exp',\n arabicTex: '\\\\arexp',\n arabicLabel: 'هـ',\n title: 'أسية',\n },\n ln: {\n id: 'ln',\n category: 'function2',\n englishTex: '\\\\ln',\n arabicTex: '\\\\arln',\n arabicRenderTex: '\\\\prescript{}{\\\\arexp}{\\\\arlog}',\n arabicLabel: 'لو',\n title: 'لوغاريتم طبيعي',\n },\n log: {\n id: 'log',\n category: 'function2',\n englishTex: '\\\\log',\n arabicTex: '\\\\arlog',\n arabicLabel: 'لو',\n title: 'لوغاريتم',\n },\n det: {\n id: 'det',\n category: 'function2',\n englishTex: '\\\\det',\n arabicTex: '\\\\ardet',\n arabicLabel: 'محدد',\n title: 'محدد',\n },\n\n ////////////////////// Groups /////////////////////////////////\n N: {\n id: 'N',\n category: 'groups',\n englishTex: '\\\\mathbb{N}',\n arabicTex: '\\\\arabN',\n arabicLabel: 'ط',\n title: 'أعداد طبيعية',\n },\n Z: {\n id: 'Z',\n category: 'groups',\n englishTex: '\\\\mathbb{Z}',\n arabicTex: '\\\\arabZ',\n arabicLabel: 'ص',\n title: 'أعداد صحيحة',\n },\n Q: {\n id: 'Q',\n category: 'groups',\n englishTex: '\\\\mathbb{Q}',\n arabicTex: '\\\\arabQ',\n arabicLabel: 'ن',\n title: 'أعداد نسبية',\n },\n R: {\n id: 'R',\n category: 'groups',\n englishTex: '\\\\mathbb{R}',\n arabicTex: '\\\\arabR',\n arabicLabel: 'ح',\n title: 'أعداد حقيقية',\n },\n C: {\n id: 'C',\n category: 'groups',\n englishTex: '\\\\mathbb{C}',\n arabicTex: '\\\\arabC',\n arabicLabel: 'ع',\n title: 'أعداد عُقدية',\n },\n H: {\n id: 'H',\n category: 'groups',\n englishTex: '\\\\mathbb{H}',\n arabicTex: '\\\\arabH',\n arabicLabel: 'ر',\n title: 'أعداد رباعية',\n },\n\n ////////////////////// Operations ////////////////////////////\n\n\n ////////////////////// Spacing ////////////////////////////////\n negThinSpace: {\n id: 'negThinSpace',\n category: 'spacing',\n englishTex: '\\\\!',\n arabicTex: '\\\\!',\n arabicLabel: '',\n title: 'فراغ سالب رفيع',\n spacing: { direction: 'negative', level: 1 },\n },\n mediumSpace: {\n id: 'mediumSpace',\n category: 'spacing',\n englishTex: '\\\\:',\n arabicTex: '\\\\:',\n arabicLabel: '',\n title: 'فراغ متوسط',\n spacing: { direction: 'positive', level: 1 },\n },\n thickSpace: {\n id: 'thickSpace',\n category: 'spacing',\n englishTex: '\\\\;',\n arabicTex: '\\\\;',\n arabicLabel: '',\n title: 'فراغ عريض',\n spacing: { direction: 'positive', level: 2 },\n },\n quadSpace: {\n id: 'quadSpace',\n category: 'spacing',\n englishTex: '\\\\quad',\n arabicTex: '\\\\quad',\n arabicLabel: '',\n title: 'فراغ كبير',\n spacing: { direction: 'positive', level: 3 },\n },\n qquadSpace: {\n id: 'qquadSpace',\n category: 'spacing',\n englishTex: '\\\\qquad',\n arabicTex: '\\\\qquad',\n arabicLabel: '',\n title: 'فراغ كبير جدا',\n spacing: { direction: 'positive', level: 4 },\n },\n} as const;\n\nexport type AtomicCommandId = keyof typeof ATOMIC_COMMANDS;\nexport type AtomicCommandCategory = 'function' | 'function2' | 'limits_series' | 'groups' | 'spacing';\nexport type SpacingDirection = 'positive' | 'negative';\n\nexport type AtomicCommandSpec = (typeof ATOMIC_COMMANDS)[AtomicCommandId] & {\n arabicRenderTex?: string;\n};\nexport type SpacingCommandSpec = AtomicCommandSpec & {\n category: 'spacing';\n spacing: {\n direction: SpacingDirection;\n level: 1 | 2 | 3 | 4;\n };\n};\n\nexport function atomicCommandsByCategory(category: AtomicCommandCategory): AtomicCommandSpec[] {\n return Object.values(ATOMIC_COMMANDS).filter((command) => command.category === category);\n}\n\nexport function isSpacingCommandSpec(spec: AtomicCommandSpec | null): spec is SpacingCommandSpec {\n return spec?.category === 'spacing';\n}\n\nexport function atomicCommandSpec(id: string): AtomicCommandSpec | null {\n return Object.prototype.hasOwnProperty.call(ATOMIC_COMMANDS, id)\n ? ATOMIC_COMMANDS[id as AtomicCommandId]\n : null;\n}\n","import type { ParseMethod, TexParserLike, TexModule } from '../mathjax-types.js';\nimport { ATOMIC_COMMANDS } from '../editor/atomicCommands.js';\n\nconst COMMAND_MAP = 'butex-atomic-command-macros';\n\nconst ARABIC_COMMAND_LABELS = Object.fromEntries(\n Object.values(ATOMIC_COMMANDS)\n .filter((command) => command.category !== 'spacing')\n .map((command) => [\n command.arabicTex.replace(/^\\\\/, ''),\n command.arabicLabel,\n ])\n);\n\nconst ARABIC_COMMAND_CLASSES = Object.fromEntries(\n Object.values(ATOMIC_COMMANDS)\n .filter((command) => command.category !== 'spacing')\n .map((command) => [\n command.arabicTex.replace(/^\\\\/, ''),\n command.category === 'groups' ? 'butex-diwani-outline-command' : 'butex-diwani-command',\n ])\n);\n\nfunction arabicAtomicCommand(parser: TexParserLike, name: string): void {\n const commandName = name.replace(/^\\\\/, '');\n const label = ARABIC_COMMAND_LABELS[commandName] ?? commandName;\n const className = ARABIC_COMMAND_CLASSES[commandName] ?? 'butex-diwani-command';\n const node = parser.create(\n 'token',\n 'mtext',\n { class: className, 'data-butex-svg-text': label },\n label\n );\n parser.Push(node);\n}\n\nconst arabicAtomicCommandTyped = arabicAtomicCommand as ParseMethod;\n\nexport function registerAtomicCommandMacros(\n CommandMap: TexModule['TokenMap']['CommandMap']\n): string {\n const mappings = Object.fromEntries(\n Object.keys(ARABIC_COMMAND_LABELS).map((name) => [name, arabicAtomicCommandTyped])\n );\n new CommandMap(COMMAND_MAP, mappings);\n return COMMAND_MAP;\n}\n","import type { ParseMethod, TexParserLike, TexModule } from '../mathjax-types.js';\n\nconst COMMAND_MAP = 'butex-takween-text-macros';\n\nfunction takweenText(parser: TexParserLike, name: string): void {\n const text = parser.GetArgument(name);\n const node = parser.create(\n 'token',\n 'mtext',\n { class: 'butex-takween-text', 'data-butex-svg-text': text },\n text\n );\n parser.Push(node);\n}\n\nfunction diwaniText(parser: TexParserLike, name: string): void {\n const text = parser.GetArgument(name);\n const node = parser.create(\n 'token',\n 'mtext',\n { class: 'butex-diwani-text', 'data-butex-svg-text': text },\n text\n );\n parser.Push(node);\n}\n\nfunction diwaniOutlineText(parser: TexParserLike, name: string): void {\n const text = parser.GetArgument(name);\n const node = parser.create(\n 'token',\n 'mtext',\n { class: 'butex-diwani-outline-text', 'data-butex-svg-text': text },\n text\n );\n parser.Push(node);\n}\n\nconst takweenTextTyped = takweenText as ParseMethod;\nconst diwaniTextTyped = diwaniText as ParseMethod;\nconst diwaniOutlineTextTyped = diwaniOutlineText as ParseMethod;\n\nexport function registerTakweenTextCommand(\n CommandMap: TexModule['TokenMap']['CommandMap']\n): string {\n new CommandMap(COMMAND_MAP, {\n butextakween: takweenTextTyped,\n butexdiwani: diwaniTextTyped,\n butexdiwanioutline: diwaniOutlineTextTyped,\n });\n return COMMAND_MAP;\n}\n","import type { ParseMethod, TexParserLike, TexModule } from '../mathjax-types.js';\nimport { texMod } from '../register.js';\n\nconst COMMAND_MAP = 'butex-mirror-macros';\n\nfunction mirrorContent(parser: TexParserLike, name: string): void {\n const arg = parser.GetArgument(name);\n const TexParserClass = parser.constructor as unknown as new (\n tex: string,\n env: Record<string, unknown>,\n configuration: unknown\n ) => {\n mml(): unknown;\n };\n const inner = new TexParserClass(arg, parser.stack.env, parser.configuration).mml();\n const row = parser.create('node', 'mrow', [inner], {});\n texMod().NodeUtil.default.setAttribute(row, 'class', 'butex-preview-mirror');\n parser.Push(row);\n}\n\nconst mirrorContentTyped = mirrorContent as ParseMethod;\n\nexport function registerMirrorCommand(\n CommandMap: TexModule['TokenMap']['CommandMap']\n): string {\n new CommandMap(COMMAND_MAP, { butexmirror: mirrorContentTyped });\n return COMMAND_MAP;\n}\n","import type { ParseMethod, TexParserLike, TexModule } from '../mathjax-types.js';\n\nconst COMMAND_MAP = 'butex-passthrough-macros';\n\nfunction passthroughArgument(parser: TexParserLike, name: string): void {\n const arg = parser.GetArgument(name);\n const TexParserClass = parser.constructor as unknown as new (\n tex: string,\n env: Record<string, unknown>,\n configuration: unknown\n ) => {\n mml(): unknown;\n };\n const inner = new TexParserClass(arg, parser.stack.env, parser.configuration).mml();\n parser.Push(inner);\n}\n\nconst passthroughArgumentTyped = passthroughArgument as ParseMethod;\n\nexport function registerPassthroughCommandMacros(\n CommandMap: TexModule['TokenMap']['CommandMap']\n): string {\n new CommandMap(COMMAND_MAP, {\n unit: passthroughArgumentTyped,\n idx: passthroughArgumentTyped,\n });\n return COMMAND_MAP;\n}\n","import type { GlobalMathJax, TexModule } from './mathjax-types.js';\nimport { registerArabSqrtCommand } from './register/arabsqrt.js';\nimport { registerPrescriptCommand } from './register/prescript.js';\nimport { registerAtomicCommandMacros } from './register/atomicCommands.js';\nimport { registerTakweenTextCommand } from './register/takween.js';\nimport { registerMirrorCommand } from './register/mirror.js';\nimport { registerPassthroughCommandMacros } from './register/passthrough.js';\n\n/** Public configuration package id — must appear in `tex.packages`. */\nexport const BUTEX_TEX_PACKAGE = 'butex-arabic-math';\n\n/** Set during {@link registerBuTeX}; used by macro handlers for NodeUtil access. */\nlet mjRef: GlobalMathJax | null = null;\n\nexport function texMod(): TexModule {\n const mj =\n mjRef ??\n (typeof globalThis !== 'undefined'\n ? (globalThis as unknown as { MathJax?: GlobalMathJax }).MathJax\n : undefined);\n if (!mj?._.input.tex) {\n throw new Error(\n 'BuTeX: MathJax TeX internals missing. Load MathJax TeX before registering BuTeX.'\n );\n }\n return mj._.input.tex;\n}\n\n/**\n * Registers the `\\arabsqrt` TeX extension with MathJax.\n *\n * Call **once**, synchronously, inside `MathJax.startup.ready()` **before**\n * `MathJax.startup.defaultReady()`, after TeX input code has loaded (see README).\n */\nexport function registerBuTeX(mathJax: GlobalMathJax): void {\n mjRef = mathJax;\n const T = mathJax._.input.tex;\n const Configuration = T.Configuration.Configuration;\n const ConfigurationHandler = T.Configuration.ConfigurationHandler;\n const CommandMap = T.TokenMap.CommandMap;\n const HandlerType = T.HandlerTypes.HandlerType;\n const ConfigurationType = T.HandlerTypes.ConfigurationType;\n\n const macroMaps = [\n registerArabSqrtCommand(CommandMap),\n registerPrescriptCommand(CommandMap),\n registerAtomicCommandMacros(CommandMap),\n registerTakweenTextCommand(CommandMap),\n registerMirrorCommand(CommandMap),\n registerPassthroughCommandMacros(CommandMap),\n ];\n\n const BuTeXConfiguration = Configuration.create(BUTEX_TEX_PACKAGE, {\n [ConfigurationType.HANDLER]: {\n [HandlerType.MACRO]: macroMaps,\n },\n });\n\n ConfigurationHandler.set(BUTEX_TEX_PACKAGE, BuTeXConfiguration);\n\n mergeTexPackages(mathJax);\n}\n\nconst PKG_EXT_KEY = '[+]';\n\nfunction mergeTexPackages(mathJax: GlobalMathJax): void {\n const pkg = mathJax.config?.tex?.packages;\n const name = BUTEX_TEX_PACKAGE;\n if (pkg == null) {\n return;\n }\n if (Array.isArray(pkg)) {\n if (!pkg.includes(name)) {\n pkg.push(name);\n }\n return;\n }\n if (typeof pkg === 'object' && pkg !== null && PKG_EXT_KEY in pkg) {\n const o = pkg as Record<string, string[]>;\n const plus = o[PKG_EXT_KEY] ?? [];\n if (!plus.includes(name)) {\n plus.push(name);\n o[PKG_EXT_KEY] = plus;\n }\n }\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 { atomicCommandSpec, isSpacingCommandSpec, type AtomicCommandSpec, type SpacingCommandSpec } from '../atomicCommands.js';\nimport { BUTEX_DIWANI_FONT_STACK, BUTEX_DIWANI_OUTLINE_FONT_STACK } from '../../diwani-font.js';\nimport type { EditorNode, EditorSide } from '../types.js';\n\nexport const ATOMIC_COMMAND_CSS = `\n/* Shared atomic-command display */\n.atomic-command {\n display: inline-flex;\n align-items: center;\n font-weight: 600;\n line-height: 1;\n}\n\n/* Function-style commands: sin/cos/tan families. */\n.atomic-command--arabic {\n font-family: ${BUTEX_DIWANI_FONT_STACK};\n font-size: 1.15em;\n direction: rtl;\n}\n\n.atomic-command--diwani-outline {\n font-family: ${BUTEX_DIWANI_OUTLINE_FONT_STACK};\n}\n\n.atomic-command--english {\n font-family: \"Cambria Math\", \"Times New Roman\", serif;\n font-size: 0.96em;\n}\n\n.atomic-command-label-with-sub {\n position: relative;\n display: inline-block;\n padding-inline-end: 0.45em;\n padding-block-end: 0.22em;\n line-height: 1;\n}\n\n.atomic-command-label-with-sub__sub {\n position: absolute;\n inset-inline-end: 0;\n inset-block-end: 0;\n font-size: 0.62em;\n line-height: 1;\n}\n\n/* Spacing commands: tiny selectable marker, real spacing remains in LaTeX preview. */\n.atomic-spacing {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 3px;\n min-width: 3px;\n height: 1em;\n color: var(--butex-accent, currentColor);\n opacity: 0.62;\n}\n\n.atomic-spacing__marker {\n display: inline-block;\n width: 3px;\n height: 0.85em;\n border-radius: 999px;\n background: currentColor;\n}\n\n.atomic-spacing--negative {\n color: var(--butex-danger, #dc2626);\n}\n`.trim();\n\nfunction spacingArrowForSide(spec: SpacingCommandSpec, side: EditorSide): string {\n const pointsWithFlow = spec.spacing.direction === 'positive';\n if (pointsWithFlow) {\n return side === 'arabic' ? '\\u2190' : '\\u2192';\n }\n return side === 'arabic' ? '\\u2192' : '\\u2190';\n}\n\nexport function spacingTooltipForSide(spec: SpacingCommandSpec, side: EditorSide): string {\n return `${spec.title} ${spacingArrowForSide(spec, side).repeat(spec.spacing.level)}`;\n}\n\nfunction buildFunctionAtomicCommandBody(node: EditorNode, side: EditorSide, spec: AtomicCommandSpec | null): HTMLElement {\n const value = document.createElement('span');\n value.className = `atomic-command atomic-command--${side}`;\n if (side === 'arabic' && spec?.category === 'groups') {\n value.classList.add('atomic-command--diwani-outline');\n }\n if (side === 'arabic' && node.expr === 'ln') {\n const label = document.createElement('span');\n label.className = 'atomic-command-label-with-sub';\n const base = document.createElement('span');\n base.className = 'atomic-command-label-with-sub__base';\n base.textContent = spec?.arabicLabel ?? node.expr;\n const sub = document.createElement('span');\n sub.className = 'atomic-command-label-with-sub__sub';\n sub.textContent = 'هـ';\n label.append(base, sub);\n value.appendChild(label);\n return value;\n }\n value.textContent = side === 'arabic' ? spec?.arabicLabel ?? node.expr : spec?.englishTex.replace('\\\\', '') ?? node.expr;\n return value;\n}\n\nfunction buildSpacingAtomicCommandBody(spec: SpacingCommandSpec, side: EditorSide): HTMLElement {\n const value = document.createElement('span');\n value.className = `atomic-spacing atomic-spacing--${spec.spacing.direction} atomic-spacing--level-${String(spec.spacing.level)}`;\n value.title = spacingTooltipForSide(spec, side);\n const marker = document.createElement('span');\n marker.className = 'atomic-spacing__marker';\n value.appendChild(marker);\n return value;\n}\n\nexport function buildAtomicCommandNodeBody(node: EditorNode, side: EditorSide): HTMLElement {\n const spec = atomicCommandSpec(node.expr);\n if (isSpacingCommandSpec(spec)) {\n return buildSpacingAtomicCommandBody(spec, side);\n }\n return buildFunctionAtomicCommandBody(node, side, spec);\n}\n","export const ATOMIC_OPERATOR_COMMANDS = {\n inf: {\n id: 'inf',\n category: 'operators1',\n Tex: '\\\\infty',\n mirror: true,\n Label: '∞',\n title: 'اللانهاية',\n svg_path: null,\n },\n times: {\n id: 'times',\n category: 'operators1',\n Tex: '\\\\times',\n mirror: false,\n Label: '×',\n title: 'ضرب',\n svg_path: null,\n },\n div: {\n id: 'div',\n category: 'operators1',\n Tex: '\\\\div',\n mirror: false,\n Label: '÷',\n title: 'قسمة',\n svg_path: null,\n },\n pm: {\n id: 'pm',\n category: 'operators1',\n Tex: '\\\\pm',\n mirror: false,\n Label: '±',\n title: 'زائد أو ناقص',\n svg_path: null,\n },\n mp: {\n id: 'mp',\n category: 'operators1',\n Tex: '\\\\mp',\n mirror: false,\n Label: '∓',\n title: 'ناقص أو زائد',\n svg_path: null,\n },\n neq: {\n id: 'neq',\n category: 'operators1',\n Tex: '\\\\neq',\n mirror: false,\n Label: '≠',\n title: 'لا يساوي',\n svg_path: null,\n },\n approx: {\n id: 'approx',\n category: 'operators1',\n Tex: '\\\\approx',\n mirror: false,\n Label: '≈',\n title: 'تقريبا يساوي',\n svg_path: null,\n },\n sim: {\n id: 'sim',\n category: 'operators1',\n Tex: '\\\\sim',\n mirror: false,\n Label: '∼',\n title: 'مشابه',\n svg_path: null,\n },\n mid: {\n id: 'mid',\n category: 'operators1',\n Tex: '\\\\mid',\n mirror: false,\n Label: '∣',\n title: 'يقسم',\n svg_path: null,\n },\n leq: {\n id: 'leq',\n category: 'operators1',\n Tex: '\\\\leq',\n mirror: true,\n Label: '≤',\n title: 'أصغر من أو يساوي',\n svg_path: null,\n },\n geq: {\n id: 'geq',\n category: 'operators1',\n Tex: '\\\\geq',\n mirror: true,\n Label: '≥',\n title: 'أكبر من أو يساوي',\n svg_path: null,\n },\n\n ///// Operators 2\n propto: {\n id: 'propto',\n category: 'operators2',\n Tex: '\\\\propto',\n mirror: true,\n Label: '∝',\n title: 'يتناسب مع',\n svg_path: null,\n },\n in: {\n id: 'in',\n category: 'operators2',\n Tex: '\\\\in',\n mirror: true,\n Label: '∈',\n title: 'ينتمي إلى',\n svg_path: null,\n },\n notin: {\n id: 'notin',\n category: 'operators2',\n Tex: '\\\\notin',\n mirror: false,\n Label: '∉',\n title: 'لا ينتمي إلى',\n svg_path: null,\n },\n subset: {\n id: 'subset',\n category: 'operators2',\n Tex: '\\\\subset',\n mirror: true,\n Label: '⊂',\n title: 'مجموعة جزئية من',\n svg_path: null,\n },\n supset: {\n id: 'supset',\n category: 'operators2',\n Tex: '\\\\supset',\n mirror: true,\n Label: '⊃',\n title: 'مجموعة شاملة لـ',\n svg_path: null,\n },\n subseteq: {\n id: 'subseteq',\n category: 'operators2',\n Tex: '\\\\subseteq',\n mirror: true,\n Label: '⊆',\n title: 'مجموعة جزئية أو تساوي',\n svg_path: null,\n },\n supseteq: {\n id: 'supseteq',\n category: 'operators2',\n Tex: '\\\\supseteq',\n mirror: true,\n Label: '⊇',\n title: 'مجموعة شاملة أو تساوي',\n svg_path: null,\n },\n cap: {\n id: 'cap',\n category: 'operators2',\n Tex: '\\\\cap',\n mirror: false,\n Label: '∩',\n title: 'تقاطع',\n svg_path: null,\n },\n cup: {\n id: 'cup',\n category: 'operators2',\n Tex: '\\\\cup',\n mirror: false,\n Label: '∪',\n title: 'اتحاد',\n svg_path: null,\n },\n emptyset: {\n id: 'emptyset',\n category: 'operators2',\n Tex: '\\\\emptyset',\n mirror: false,\n Label: '∅',\n title: 'المجموعة الخالية',\n svg_path: null,\n },\n nsubseteq: {\n id: 'nsubseteq',\n category: 'operators2',\n Tex: '\\\\nsubseteq',\n mirror: true,\n Label: '⊈',\n title: 'ليست مجموعة جزئية أو تساوي',\n svg_path: null,\n },\n nsupseteq: {\n id: 'nsupseteq',\n category: 'operators2',\n Tex: '\\\\nsupseteq',\n mirror: true,\n Label: '⊉',\n title: 'ليست مجموعة شاملة أو تساوي',\n svg_path: null,\n },\n\n ///// Dots\n ldots: {\n id: 'ldots',\n category: 'dots',\n Tex: '\\\\ldots',\n mirror: false,\n Label: '…',\n title: 'نقاط أفقية',\n svg_path: null,\n },\n cdot: {\n id: 'cdot',\n category: 'dots',\n Tex: '\\\\cdot',\n mirror: false,\n Label: '·',\n title: 'نقطة ضرب',\n svg_path: null,\n },\n cdots: {\n id: 'cdots',\n category: 'dots',\n Tex: '\\\\cdots',\n mirror: false,\n Label: '⋯',\n title: 'نقاط وسطية أفقية',\n svg_path: null,\n },\n vdots: {\n id: 'vdots',\n category: 'dots',\n Tex: '\\\\vdots',\n mirror: false,\n Label: '⋮',\n title: 'نقاط عمودية',\n svg_path: null,\n },\n ddots: {\n id: 'ddots',\n category: 'dots',\n Tex: '\\\\ddots',\n mirror: true,\n displayMirror: false,\n Label: '⋱',\n title: 'نقاط قطرية',\n svg_path: null,\n },\n\n /// Operators 3\n leftrightarrowDouble: {\n id: 'leftrightarrowDouble',\n category: 'operators3',\n Tex: '\\\\Leftrightarrow',\n mirror: false,\n Label: '⇔',\n title: 'يكافئ',\n svg_path: null,\n },\n rightleftharpoons: {\n id: 'rightleftharpoons',\n category: 'operators3',\n Tex: '\\\\rightleftharpoons',\n mirror: true,\n Label: '⇌',\n title: 'اتزان',\n svg_path: null,\n },\n leftarrow: {\n id: 'leftarrow',\n category: 'operators3',\n Tex: '\\\\leftarrow',\n mirror: true,\n Label: '←',\n title: 'سهم إلى اليسار',\n svg_path: null,\n },\n rightarrow: {\n id: 'rightarrow',\n category: 'operators3',\n Tex: '\\\\rightarrow',\n mirror: true,\n Label: '→',\n title: 'سهم إلى اليمين',\n svg_path: null,\n },\n leftarrowDouble: {\n id: 'leftarrowDouble',\n category: 'operators3',\n Tex: '\\\\Leftarrow',\n mirror: true,\n Label: '⇐',\n title: 'سهم مزدوج إلى اليسار',\n svg_path: null,\n },\n rightarrowDouble: {\n id: 'rightarrowDouble',\n category: 'operators3',\n Tex: '\\\\Rightarrow',\n mirror: true,\n Label: '⇒',\n title: 'سهم مزدوج إلى اليمين',\n svg_path: null,\n },\n leftharpoonup: {\n id: 'leftharpoonup',\n category: 'operators3',\n Tex: '\\\\leftharpoonup',\n mirror: true,\n Label: '↼',\n title: 'سهم خطافي علوي إلى اليسار',\n svg_path: null,\n },\n rightharpoonup: {\n id: 'rightharpoonup',\n category: 'operators3',\n Tex: '\\\\rightharpoonup',\n mirror: true,\n Label: '⇀',\n title: 'سهم خطافي علوي إلى اليمين',\n svg_path: null,\n },\n leftharpoondown: {\n id: 'leftharpoondown',\n category: 'operators3',\n Tex: '\\\\leftharpoondown',\n mirror: true,\n Label: '↽',\n title: 'سهم خطافي سفلي إلى اليسار',\n svg_path: null,\n },\n rightharpoondown: {\n id: 'rightharpoondown',\n category: 'operators3',\n Tex: '\\\\rightharpoondown',\n mirror: true,\n Label: '⇁',\n title: 'سهم خطافي سفلي إلى اليمين',\n svg_path: null,\n },\n\n // Integrals\n int: {\n id: 'int',\n category: 'integrals',\n Tex: '\\\\int',\n mirror: true,\n Label: '∫',\n title: 'تكامل',\n svg_path: null,\n },\n iint: {\n id: 'iint',\n category: 'integrals',\n Tex: '\\\\iint',\n mirror: true,\n Label: '∬',\n title: 'تكامل مزدوج',\n svg_path: null,\n },\n iiint: {\n id: 'iiint',\n category: 'integrals',\n Tex: '\\\\iiint',\n mirror: true,\n Label: '∭',\n title: 'تكامل ثلاثي',\n svg_path: null,\n },\n iiiint: {\n id: 'iiiint',\n category: 'integrals',\n Tex: '\\\\iiiint',\n mirror: true,\n Label: '⨌',\n title: 'تكامل رباعي',\n svg_path: null,\n },\n oint: {\n id: 'oint',\n category: 'integrals',\n Tex: '\\\\oint',\n mirror: true,\n Label: '∮',\n title: 'تكامل مغلق',\n svg_path: null,\n },\n oiint: {\n id: 'oiint',\n category: 'integrals',\n Tex: '\\\\oiint',\n mirror: true,\n Label: '∯',\n title: 'تكامل سطحي مغلق',\n svg_path: null,\n },\n oiiint: {\n id: 'oiiint',\n category: 'integrals',\n Tex: '\\\\oiiint',\n mirror: true,\n Label: '∰',\n title: 'تكامل حجمي مغلق',\n svg_path: null,\n },\n} as const;\n\nexport type AtomicOperatorCommandId = keyof typeof ATOMIC_OPERATOR_COMMANDS;\n\nexport type AtomicOperatorCommandCategory =\n | 'operators1'\n | 'operators2'\n | 'operators3'\n | 'dots'\n | 'integrals';\n\nexport type AtomicOperatorCommandSpec =\n (typeof ATOMIC_OPERATOR_COMMANDS)[AtomicOperatorCommandId] & {\n displayMirror?: boolean;\n };\n\nexport function shouldMirrorOperatorDisplay(\n command: AtomicOperatorCommandSpec | null | undefined,\n): boolean {\n return command?.displayMirror ?? command?.mirror ?? false;\n}\n\nconst MIRRORED_OPERATOR_TEX = Object.values(ATOMIC_OPERATOR_COMMANDS)\n .filter((command) => command.mirror)\n .map((command) => command.Tex)\n .sort((a, b) => b.length - a.length);\n\nfunction matchingMirroredOperator(tex: string, index: number): string | null {\n for (const operatorTex of MIRRORED_OPERATOR_TEX) {\n if (!tex.startsWith(operatorTex, index)) {\n continue;\n }\n const next = tex[index + operatorTex.length];\n if (next != null && /[A-Za-z]/.test(next)) {\n continue;\n }\n return operatorTex;\n }\n return null;\n}\n\nfunction findMatchingBrace(tex: string, openIndex: number): number {\n let depth = 0;\n for (let index = openIndex; index < tex.length; index += 1) {\n const char = tex[index];\n if (char === '\\\\') {\n index += 1;\n continue;\n }\n if (char === '{') {\n depth += 1;\n } else if (char === '}') {\n depth -= 1;\n if (depth === 0) {\n return index;\n }\n }\n }\n return -1;\n}\n\nexport function mirrorBuTeXOperatorsInTex(tex: string): string {\n let result = '';\n let index = 0;\n\n while (index < tex.length) {\n if (tex.startsWith('\\\\butexmirror{', index)) {\n const end = findMatchingBrace(tex, index + '\\\\butexmirror'.length);\n if (end !== -1) {\n result += tex.slice(index, end + 1);\n index = end + 1;\n continue;\n }\n }\n\n const operatorTex = matchingMirroredOperator(tex, index);\n if (operatorTex) {\n result += `\\\\butexmirror{${operatorTex}}`;\n index += operatorTex.length;\n continue;\n }\n\n result += tex[index];\n index += 1;\n }\n\n return result;\n}\n\nexport function atomicOperatorCommandsByCategory(\n category: AtomicOperatorCommandCategory,\n): AtomicOperatorCommandSpec[] {\n return Object.values(ATOMIC_OPERATOR_COMMANDS).filter(\n (command) => command.category === category,\n );\n}\n\nexport function atomicOperatorCommandSpec(\n id: string,\n): AtomicOperatorCommandSpec | null {\n return Object.prototype.hasOwnProperty.call(ATOMIC_OPERATOR_COMMANDS, id)\n ? ATOMIC_OPERATOR_COMMANDS[id as AtomicOperatorCommandId]\n : null;\n}\n","import { atomicOperatorCommandSpec, shouldMirrorOperatorDisplay, type AtomicOperatorCommandSpec } from '../atomicCommandsOperators.js';\nimport type { EditorNode, EditorSide } from '../types.js';\n\nexport const ATOMIC_OPERATOR_COMMAND_CSS = `\n.atomic-operator-command {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 0.9em;\n font-family: \"Cambria Math\", \"Times New Roman\", serif;\n font-size: 1.05em;\n font-weight: 600;\n line-height: 1;\n}\n\n.atomic-operator-command--mirrored {\n transform: scaleX(-1);\n}\n\n.atomic-operator-command__svg {\n width: 1em;\n height: 1em;\n background: currentColor;\n}\n`.trim();\n\nfunction buildOperatorLabel(spec: AtomicOperatorCommandSpec): HTMLElement {\n const value = document.createElement('span');\n value.className = 'atomic-operator-command__label';\n value.textContent = spec.Label;\n return value;\n}\n\nexport function buildAtomicOperatorCommandNodeBody(node: EditorNode, side: EditorSide): HTMLElement {\n const spec = atomicOperatorCommandSpec(node.expr);\n const value = document.createElement('span');\n value.className = 'atomic-operator-command';\n value.title = spec?.title ?? node.expr;\n if (side === 'arabic' && shouldMirrorOperatorDisplay(spec)) {\n value.classList.add('atomic-operator-command--mirrored');\n }\n\n if (spec?.svg_path) {\n const icon = document.createElement('span');\n icon.className = 'atomic-operator-command__svg';\n icon.style.mask = `url(\"${spec.svg_path}\") center / contain no-repeat`;\n icon.style.webkitMask = `url(\"${spec.svg_path}\") center / contain no-repeat`;\n value.appendChild(icon);\n return value;\n }\n\n if (spec) {\n value.appendChild(buildOperatorLabel(spec));\n } else {\n const label = document.createElement('span');\n label.className = 'atomic-operator-command__label';\n label.textContent = node.expr;\n value.appendChild(label);\n }\n return value;\n}\n","import { 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","export type {\n CharacterFontId,\n DigitFormId,\n EditorCaret,\n EditorChain,\n EditorDebugEntry,\n EditorNode,\n EditorNodeKind,\n EditorSelectionRange,\n EditorSession,\n EditorSide,\n EditorSyncMap,\n EditorSyncState,\n EnvColumnAlignment,\n GridEnvName,\n MatrixEnvStyle,\n} from './types.js';\n\nexport {\n buildInitialSyncMap,\n cloneEditorSession,\n createDelimiterNode,\n createEditorChain,\n createEditorNode,\n createEditorSession,\n createFracNode,\n createGridEnvNode,\n createMatrixEnvNode,\n createSqrtNode,\n createAtomicCommandNode,\n createAtomicOperatorCommandNode,\n} from './factory.js';\nexport { ATOMIC_COMMANDS, atomicCommandSpec, atomicCommandsByCategory, isSpacingCommandSpec } from './atomicCommands.js';\nexport type { AtomicCommandCategory, AtomicCommandId, AtomicCommandSpec, SpacingCommandSpec, SpacingDirection } from './atomicCommands.js';\nexport { ATOMIC_OPERATOR_COMMANDS, atomicOperatorCommandSpec, atomicOperatorCommandsByCategory, mirrorBuTeXOperatorsInTex, shouldMirrorOperatorDisplay } from './atomicCommandsOperators.js';\nexport type { AtomicOperatorCommandCategory, AtomicOperatorCommandId, AtomicOperatorCommandSpec } from './atomicCommandsOperators.js';\n\nexport { renderArabicLatexFromSession, renderChainArabic, renderChainEnglish, renderEnglishLatexFromSession } from './render.js';\n\nexport { caretStep, collectCaretPositions } from './caretOrder.js';\nexport {\n clearSelection,\n coveredNodeIds,\n extendSelectionByStep,\n isSelectionActive,\n nodeChildChains,\n normalizeSelection,\n setSelectionFromMouse,\n} from './selection.js';\nexport {\n BUTEX_FRAGMENT_MIME,\n deserializeFragment,\n fragmentToPlainText,\n regenerateFragmentIds,\n serializeSelection,\n} from './clipboard.js';\nexport type { EditorFragment } from './clipboard.js';\nexport {\n DEFAULT_UNDO_HISTORY_MAX_DEPTH,\n createUndoRedoStacks,\n pushUndoRedoSnapshot,\n restoreRedo,\n restoreUndo,\n undoRedoCanRedo,\n undoRedoCanUndo,\n} from './history.js';\nexport type { UndoRedoStacks } from './history.js';\nexport { activeTreeKey, findChainById, findNodeById, passiveTreeKey } from './traversal.js';\n\nexport {\n activeSideLabel,\n addSub,\n addSup,\n breakLeafTyping,\n copySelection,\n createStarterSession,\n cutSelection,\n deleteBackward,\n deleteForward,\n deleteStructure,\n insertAlignedEnv,\n insertArrayEnv,\n insertChar,\n insertDelimiterPair,\n insertFraction,\n insertMatrixEnv,\n insertSqrt,\n insertAtomicCommand,\n insertAtomicOperatorCommand,\n insertNumber,\n insertOperator,\n horizontalCaretDelta,\n moveCaret,\n moveCaretHorizontal,\n moveCaretVertical,\n pasteFragment,\n pasteText,\n addMatrixColumn,\n addMatrixRow,\n removeMatrixColumn,\n removeMatrixRow,\n removeSub,\n removeSup,\n selectNode,\n setCaret,\n setArrayColumnAlignment,\n setExpr,\n setMatrixEnvStyle,\n setRenderError,\n setArabicReverseNumberTyping,\n setCurrentCharacterFont,\n setCurrentDigitForm,\n setSplitLeafTyping,\n switchSide,\n syncSelectionToCaret,\n syncStateSummary,\n toggleTakweenCharacterFont,\n} from './state.js';\n\nexport { buildNodeBody, buildNodeScripts } from './display/index.js';\nexport { formatDigits } from './digits.js';\nexport { DELIMITER_CSS, FRAC_CSS, SQRT_CSS, MATRIX_ENV_CSS, ATOMIC_COMMAND_CSS, ATOMIC_OPERATOR_COMMAND_CSS } from './display/index.js';\nexport { BUTEX_EDITOR_CSS, injectBuTeXEditorStyles } from './styles.js';\nexport { createEditorRuntime, runtimeStatusText } from './runtime.js';\nexport type { EditorRuntimeApi, EditorRuntimeOptions } from './runtime.js';\n","import type { EditorChain, EditorNode, EditorSession, EditorSide, EnvColumnAlignment, GridEnvName, MatrixEnvStyle } from './types.js';\nimport type { AtomicCommandId } from './atomicCommands.js';\nimport type { AtomicOperatorCommandId } from './atomicCommandsOperators.js';\n\nlet nextId = 1;\n\nfunction makeId(prefix: string): string {\n const id = `${prefix}_${String(nextId)}`;\n nextId += 1;\n return id;\n}\n\nexport function createEditorChain(nodes: EditorNode[] = []): EditorChain {\n return {\n id: makeId('chain'),\n nodes,\n };\n}\n\nexport function createEditorNode(kind: EditorNode['kind'], expr: string): EditorNode {\n return {\n id: makeId('node'),\n kind,\n expr,\n characterFont: undefined,\n superscript: null,\n subscript: null,\n leftDelimExpr: '',\n rightDelimExpr: '',\n innerExpr: null,\n numerator: null,\n denominator: null,\n radicand: null,\n rootIndex: null,\n envName: null,\n matrixStyle: null,\n matrixRows: null,\n columnAlignments: null,\n };\n}\n\nexport function createDelimiterNode(leftDelimExpr: string, rightDelimExpr: string): EditorNode {\n return {\n ...createEditorNode('delimiter', ''),\n leftDelimExpr,\n rightDelimExpr,\n innerExpr: createEditorChain(),\n };\n}\n\nexport function createFracNode(): EditorNode {\n return {\n ...createEditorNode('frac', ''),\n numerator: createEditorChain(),\n denominator: createEditorChain(),\n };\n}\n\nexport function createSqrtNode(): EditorNode {\n return {\n ...createEditorNode('sqrt', ''),\n radicand: createEditorChain(),\n rootIndex: createEditorChain(),\n };\n}\n\nexport function createMatrixEnvNode(style: MatrixEnvStyle, rows: number, columns: number): EditorNode {\n return createGridEnvNode(style, rows, columns);\n}\n\nexport function createGridEnvNode(\n envName: GridEnvName,\n rows: number,\n columns: number,\n columnAlignments?: EnvColumnAlignment[],\n): EditorNode {\n const safeRows = Math.max(1, Math.min(12, Math.trunc(rows)));\n const safeColumns = Math.max(1, Math.min(12, Math.trunc(columns)));\n const matrixStyles = new Set<GridEnvName>(['matrix', 'pmatrix', 'bmatrix', 'Bmatrix', 'vmatrix', 'Vmatrix']);\n const isMatrix = matrixStyles.has(envName) && envName !== 'array' && envName !== 'aligned';\n return {\n ...createEditorNode('env', ''),\n envName,\n matrixStyle: isMatrix ? (envName as MatrixEnvStyle) : null,\n matrixRows: Array.from({ length: safeRows }, () =>\n Array.from({ length: safeColumns }, () => createEditorChain()),\n ),\n columnAlignments: envName === 'array'\n ? Array.from({ length: safeColumns }, (_, index) => columnAlignments?.[index] ?? 'c')\n : null,\n };\n}\n\nexport function createAtomicCommandNode(commandId: AtomicCommandId): EditorNode {\n return createEditorNode('atomicCommand', commandId);\n}\n\nexport function createAtomicOperatorCommandNode(commandId: AtomicOperatorCommandId): EditorNode {\n return createEditorNode('atomicOperatorCommand', commandId);\n}\n\nexport function cloneEditorSession(session: EditorSession): EditorSession {\n return {\n englishTree: structuredClone(session.englishTree),\n arabicTree: structuredClone(session.arabicTree),\n activeSide: session.activeSide,\n splitLeafTyping: session.splitLeafTyping,\n forceSplitNextLeaf: session.forceSplitNextLeaf,\n arabicReverseNumberTyping: session.arabicReverseNumberTyping,\n currentCharacterFont: session.currentCharacterFont ?? 'default',\n currentDigitForm: session.currentDigitForm ?? 'western',\n caret: { ...session.caret },\n selection: session.selection ? { ...session.selection } : null,\n selectedNodeId: session.selectedNodeId,\n selectedStructureNodeId: session.selectedStructureNodeId,\n sync: structuredClone(session.sync),\n debugLog: session.debugLog.slice(),\n };\n}\n\nfunction collectNodeIds(chain: EditorChain, ids: string[]): void {\n for (const node of chain.nodes) {\n ids.push(node.id);\n if (node.superscript) {\n collectNodeIds(node.superscript, ids);\n }\n if (node.subscript) {\n collectNodeIds(node.subscript, ids);\n }\n if (node.innerExpr) {\n collectNodeIds(node.innerExpr, ids);\n }\n if (node.numerator) {\n collectNodeIds(node.numerator, ids);\n }\n if (node.denominator) {\n collectNodeIds(node.denominator, ids);\n }\n if (node.rootIndex) {\n collectNodeIds(node.rootIndex, ids);\n }\n if (node.radicand) {\n collectNodeIds(node.radicand, ids);\n }\n if (node.matrixRows) {\n for (const row of node.matrixRows) {\n for (const cell of row) {\n collectNodeIds(cell, ids);\n }\n }\n }\n }\n}\n\nexport function buildInitialSyncMap(englishTree: EditorChain, arabicTree: EditorChain): EditorSession['sync'] {\n const englishIds: string[] = [];\n const arabicIds: string[] = [];\n collectNodeIds(englishTree, englishIds);\n collectNodeIds(arabicTree, arabicIds);\n\n const all = new Set<string>([...englishIds, ...arabicIds]);\n const sync: EditorSession['sync'] = {};\n for (const nodeId of all) {\n sync[nodeId] = { expr: 'synced' };\n }\n return sync;\n}\n\nexport function createEditorSession(englishTree: EditorChain, arabicTree: EditorChain, activeSide: EditorSide = 'arabic'): EditorSession {\n return {\n englishTree,\n arabicTree,\n activeSide,\n splitLeafTyping: false,\n forceSplitNextLeaf: false,\n arabicReverseNumberTyping: true,\n currentCharacterFont: 'default',\n currentDigitForm: 'western',\n caret: {\n chainId: englishTree.id,\n index: 0,\n },\n selection: null,\n selectedNodeId: null,\n selectedStructureNodeId: null,\n sync: buildInitialSyncMap(englishTree, arabicTree),\n debugLog: [],\n };\n}\n","import type { DigitFormId } from './types.js';\n\nconst WESTERN = '0123456789';\nconst ARABIC_INDIC = '٠١٢٣٤٥٦٧٨٩';\nconst PERSIAN_INDIC = '۰۱۲۳۴۵۶۷۸۹';\n\nconst digitSets: Record<DigitFormId, string> = {\n western: WESTERN,\n arabicIndic: ARABIC_INDIC,\n persianIndic: PERSIAN_INDIC,\n};\n\nfunction digitValue(char: string): number {\n const western = WESTERN.indexOf(char);\n if (western >= 0) {\n return western;\n }\n const arabicIndic = ARABIC_INDIC.indexOf(char);\n if (arabicIndic >= 0) {\n return arabicIndic;\n }\n return PERSIAN_INDIC.indexOf(char);\n}\n\nexport function formatDigits(value: string, digitForm: DigitFormId = 'western'): string {\n const target = digitSets[digitForm];\n return Array.from(value, (char) => {\n const value = digitValue(char);\n return value >= 0 ? target[value] : char;\n }).join('');\n}\n","import type { DigitFormId, EditorChain, EditorNode, EditorSession, EnvColumnAlignment } from './types.js';\nimport { atomicCommandSpec } from './atomicCommands.js';\nimport { atomicOperatorCommandSpec } from './atomicCommandsOperators.js';\nimport { formatDigits } from './digits.js';\n\ntype RenderOptions = {\n digitForm?: DigitFormId;\n};\n\nfunction selectedDigitForm(options?: RenderOptions): DigitFormId {\n return options?.digitForm ?? 'western';\n}\n\nfunction latinScripts(node: EditorNode, options?: RenderOptions): string {\n let scripts = '';\n if (node.superscript) {\n scripts += `^{${renderChainEnglish(node.superscript, options)}}`;\n }\n if (node.subscript) {\n scripts += `_{${renderChainEnglish(node.subscript, options)}}`;\n }\n return scripts;\n}\n\nfunction optionalRootIndexEnglish(node: EditorNode, options?: RenderOptions): string {\n if (!node.rootIndex) {\n return '';\n }\n const rendered = renderChainEnglish(node.rootIndex, options);\n return rendered === '' ? '' : `[${rendered}]`;\n}\n\nfunction optionalRootIndexArabic(node: EditorNode, options?: RenderOptions): string {\n if (!node.rootIndex) {\n return '';\n }\n const rendered = renderChainArabic(node.rootIndex, options);\n return rendered === '' ? '' : `[${rendered}]`;\n}\n\nfunction arabicScripts(node: EditorNode, content: string, options?: RenderOptions): string {\n const sup = node.superscript ? renderChainArabic(node.superscript, options) : '';\n const sub = node.subscript ? renderChainArabic(node.subscript, options) : '';\n if (sup !== '' || sub !== '') {\n return `\\\\prescript{${sup}}{${sub}}{${content}}`;\n }\n return content;\n}\n\nfunction renderMatrixRowsEnglish(node: EditorNode, options?: RenderOptions): string {\n if (!node.matrixRows) {\n return '';\n }\n const envName = node.envName ?? node.matrixStyle;\n if (!envName) {\n return '';\n }\n const rows = node.matrixRows.map((row) => row.map((cell) => renderChainEnglish(cell, options)).join(' & '));\n if (envName === 'array') {\n const spec = (node.columnAlignments ?? []).slice(0, node.matrixRows[0]?.length ?? 0).join('');\n return `\\\\begin{array}{${spec || 'c'}}${rows.join(' \\\\\\\\\\n')}\\\\end{array}`;\n }\n return `\\\\begin{${envName}}${rows.join(' \\\\\\\\\\n')}\\\\end{${envName}}`;\n}\n\nfunction reverseAlignmentForArabic(alignment: EnvColumnAlignment): EnvColumnAlignment {\n if (alignment === 'l') {\n return 'r';\n }\n if (alignment === 'r') {\n return 'l';\n }\n return 'c';\n}\n\nfunction renderMatrixRowsArabic(node: EditorNode, options?: RenderOptions): string {\n if (!node.matrixRows) {\n return '';\n }\n const envName = node.envName ?? node.matrixStyle;\n if (!envName) {\n return '';\n }\n const rows = node.matrixRows.map((row) =>\n row\n .slice()\n .reverse()\n .map((cell) => renderChainArabic(cell, options))\n .join(' & '),\n );\n if (envName === 'array') {\n const spec = (node.columnAlignments ?? [])\n .slice(0, node.matrixRows[0]?.length ?? 0)\n .reverse()\n .map(reverseAlignmentForArabic)\n .join('');\n return `\\\\begin{array}{${spec || 'c'}}${rows.join(' \\\\\\\\\\n')}\\\\end{array}`;\n }\n return `\\\\begin{${envName}}${rows.join(' \\\\\\\\\\n')}\\\\end{${envName}}`;\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/\\\\/g, '\\\\textbackslash{}').replace(/[{}]/g, '\\\\$&');\n}\n\nfunction renderCharContent(node: EditorNode, options?: RenderOptions): string {\n const expr = formatDigits(node.expr, selectedDigitForm(options));\n const font = node.characterFont ?? 'default';\n if (font === 'takween') {\n return `\\\\butextakween{${escapeText(expr)}}`;\n }\n if (font === 'diwani') {\n return `\\\\butexdiwani{${escapeText(expr)}}`;\n }\n if (font === 'diwaniOutline') {\n return `\\\\butexdiwanioutline{${escapeText(expr)}}`;\n }\n return expr;\n}\n\nfunction renderNodeEnglish(node: EditorNode, options?: RenderOptions): string {\n if (node.kind === 'delimiter' && node.innerExpr) {\n return `${node.leftDelimExpr}${renderChainEnglish(node.innerExpr, options)}${node.rightDelimExpr}${latinScripts(node, options)}`;\n }\n if (node.kind === 'frac' && node.numerator && node.denominator) {\n const body = `\\\\frac{${renderChainEnglish(node.numerator, options)}}{${renderChainEnglish(node.denominator, options)}}`;\n return `${body}${latinScripts(node, options)}`;\n }\n if (node.kind === 'sqrt' && node.radicand) {\n const body = `\\\\sqrt${optionalRootIndexEnglish(node, options)}{${renderChainEnglish(node.radicand, options)}}`;\n return `${body}${latinScripts(node, options)}`;\n }\n if (node.kind === 'env') {\n return `${renderMatrixRowsEnglish(node, options)}${latinScripts(node, options)}`;\n }\n if (node.kind === 'atomicCommand') {\n const body = atomicCommandSpec(node.expr)?.englishTex ?? node.expr;\n return `${body}${latinScripts(node, options)}`;\n }\n if (node.kind === 'atomicOperatorCommand') {\n const body = atomicOperatorCommandSpec(node.expr)?.Tex ?? node.expr;\n return `${body}${latinScripts(node, options)}`;\n }\n if (node.kind === 'char') {\n return `${renderCharContent(node, options)}${latinScripts(node, options)}`;\n }\n return `${formatDigits(node.expr, selectedDigitForm(options))}${latinScripts(node, options)}`;\n}\n\nfunction renderNodeArabic(node: EditorNode, options?: RenderOptions): string {\n if (node.kind === 'delimiter' && node.innerExpr) {\n const content = `${node.leftDelimExpr}${renderChainArabic(node.innerExpr, options)}${node.rightDelimExpr}`;\n return arabicScripts(node, content, options);\n }\n if (node.kind === 'frac' && node.numerator && node.denominator) {\n const content = `\\\\frac{${renderChainArabic(node.numerator, options)}}{${renderChainArabic(node.denominator, options)}}`;\n return arabicScripts(node, content, options);\n }\n if (node.kind === 'sqrt' && node.radicand) {\n const content = `\\\\arabsqrt${optionalRootIndexArabic(node, options)}{${renderChainArabic(node.radicand, options)}}`;\n return arabicScripts(node, content, options);\n }\n if (node.kind === 'env') {\n return arabicScripts(node, renderMatrixRowsArabic(node, options), options);\n }\n if (node.kind === 'atomicCommand') {\n const spec = atomicCommandSpec(node.expr);\n const content = spec?.arabicRenderTex ?? spec?.arabicTex ?? node.expr;\n return arabicScripts(node, content, options);\n }\n if (node.kind === 'atomicOperatorCommand') {\n const spec = atomicOperatorCommandSpec(node.expr);\n const tex = spec?.Tex ?? node.expr;\n const content = spec?.mirror ? `\\\\butexmirror{${tex}}` : tex;\n return arabicScripts(node, content, options);\n }\n if (node.kind === 'char') {\n const expr = formatDigits(node.expr, selectedDigitForm(options));\n const content = renderCharContent(node, options);\n return arabicScripts(node, (node.characterFont ?? 'default') === 'default'\n ? `\\\\text{${escapeText(expr)}}`\n : content, options);\n }\n return arabicScripts(node, formatDigits(node.expr, selectedDigitForm(options)), options);\n}\n\nexport function renderChainEnglish(chain: EditorChain, options?: RenderOptions): string {\n return chain.nodes.map((node) => renderNodeEnglish(node, options)).join(' ');\n}\n\nexport function renderChainArabic(chain: EditorChain, options?: RenderOptions): string {\n return chain.nodes\n .slice()\n .reverse()\n .map((node) => renderNodeArabic(node, options))\n .join(' ');\n}\n\nexport function renderEnglishLatexFromSession(session: EditorSession): string {\n return renderChainEnglish(session.englishTree, { digitForm: session.currentDigitForm ?? 'western' });\n}\n\nexport function renderArabicLatexFromSession(session: EditorSession): string {\n return renderChainArabic(session.arabicTree, { digitForm: session.currentDigitForm ?? 'western' });\n}\n","import type { EditorCaret, EditorChain, EditorNode } from './types.js';\n\n/**\n * Depth-first preorder of all caret slots: for each chain, slot 0, then each node's\n * nested chains (inner → superscript → subscript), then slot after that node, etc.\n * Horizontal moves step through this order without skipping positions.\n */\nexport function collectCaretPositions(chain: EditorChain): EditorCaret[] {\n const out: EditorCaret[] = [];\n\n function walkNode(node: EditorNode): void {\n if (node.innerExpr) {\n walkChain(node.innerExpr);\n }\n if (node.numerator) {\n walkChain(node.numerator);\n }\n if (node.denominator) {\n walkChain(node.denominator);\n }\n if (node.rootIndex) {\n walkChain(node.rootIndex);\n }\n if (node.radicand) {\n walkChain(node.radicand);\n }\n if (node.matrixRows) {\n for (const row of node.matrixRows) {\n for (const cell of row) {\n walkChain(cell);\n }\n }\n }\n if (node.superscript) {\n walkChain(node.superscript);\n }\n if (node.subscript) {\n walkChain(node.subscript);\n }\n }\n\n function walkChain(c: EditorChain): void {\n out.push({ chainId: c.id, index: 0 });\n for (let i = 0; i < c.nodes.length; i += 1) {\n walkNode(c.nodes[i]);\n out.push({ chainId: c.id, index: i + 1 });\n }\n }\n\n walkChain(chain);\n return out;\n}\n\nexport function caretStep(root: EditorChain, caret: EditorCaret, delta: -1 | 1): EditorCaret {\n const positions = collectCaretPositions(root);\n const idx = positions.findIndex((p) => p.chainId === caret.chainId && p.index === caret.index);\n if (idx < 0) {\n return caret;\n }\n const nextIdx = idx + delta;\n if (nextIdx < 0) {\n return positions[0]!;\n }\n if (nextIdx >= positions.length) {\n return positions[positions.length - 1]!;\n }\n return positions[nextIdx]!;\n}\n","import type { EditorChain, EditorNode, EditorSide } from './types.js';\n\nexport type ParentRelationKind =\n | 'root'\n | 'superscript'\n | 'subscript'\n | 'inner'\n | 'numerator'\n | 'denominator'\n | 'radicand'\n | 'rootIndex'\n | 'matrixCell';\n\nexport type ParentRelation = {\n kind: ParentRelationKind;\n ownerNodeId: string | null;\n ownerChainId: string | null;\n rowIndex?: number;\n columnIndex?: number;\n};\n\nexport type LocatedChain = {\n chain: EditorChain;\n relation: ParentRelation;\n};\n\nexport type LocatedNode = {\n node: EditorNode;\n chain: EditorChain;\n index: number;\n};\n\nexport function findChainById(root: EditorChain, chainId: string): LocatedChain | null {\n if (root.id === chainId) {\n return {\n chain: root,\n relation: { kind: 'root', ownerNodeId: null, ownerChainId: null },\n };\n }\n\n for (const node of root.nodes) {\n if (node.superscript) {\n if (node.superscript.id === chainId) {\n return {\n chain: node.superscript,\n relation: { kind: 'superscript', ownerNodeId: node.id, ownerChainId: root.id },\n };\n }\n const nested = findChainById(node.superscript, chainId);\n if (nested) {\n return nested;\n }\n }\n\n if (node.subscript) {\n if (node.subscript.id === chainId) {\n return {\n chain: node.subscript,\n relation: { kind: 'subscript', ownerNodeId: node.id, ownerChainId: root.id },\n };\n }\n const nested = findChainById(node.subscript, chainId);\n if (nested) {\n return nested;\n }\n }\n\n if (node.innerExpr) {\n if (node.innerExpr.id === chainId) {\n return {\n chain: node.innerExpr,\n relation: { kind: 'inner', ownerNodeId: node.id, ownerChainId: root.id },\n };\n }\n const nested = findChainById(node.innerExpr, chainId);\n if (nested) {\n return nested;\n }\n }\n\n if (node.numerator) {\n if (node.numerator.id === chainId) {\n return {\n chain: node.numerator,\n relation: { kind: 'numerator', ownerNodeId: node.id, ownerChainId: root.id },\n };\n }\n const nested = findChainById(node.numerator, chainId);\n if (nested) {\n return nested;\n }\n }\n\n if (node.denominator) {\n if (node.denominator.id === chainId) {\n return {\n chain: node.denominator,\n relation: { kind: 'denominator', ownerNodeId: node.id, ownerChainId: root.id },\n };\n }\n const nested = findChainById(node.denominator, chainId);\n if (nested) {\n return nested;\n }\n }\n\n if (node.rootIndex) {\n if (node.rootIndex.id === chainId) {\n return {\n chain: node.rootIndex,\n relation: { kind: 'rootIndex', ownerNodeId: node.id, ownerChainId: root.id },\n };\n }\n const nested = findChainById(node.rootIndex, chainId);\n if (nested) {\n return nested;\n }\n }\n\n if (node.radicand) {\n if (node.radicand.id === chainId) {\n return {\n chain: node.radicand,\n relation: { kind: 'radicand', ownerNodeId: node.id, ownerChainId: root.id },\n };\n }\n const nested = findChainById(node.radicand, chainId);\n if (nested) {\n return nested;\n }\n }\n\n if (node.matrixRows) {\n for (let rowIndex = 0; rowIndex < node.matrixRows.length; rowIndex += 1) {\n const row = node.matrixRows[rowIndex];\n for (let columnIndex = 0; columnIndex < row.length; columnIndex += 1) {\n const cell = row[columnIndex];\n if (cell.id === chainId) {\n return {\n chain: cell,\n relation: { kind: 'matrixCell', ownerNodeId: node.id, ownerChainId: root.id, rowIndex, columnIndex },\n };\n }\n const nested = findChainById(cell, chainId);\n if (nested) {\n return nested;\n }\n }\n }\n }\n }\n\n return null;\n}\n\nexport function findNodeById(root: EditorChain, nodeId: string): LocatedNode | null {\n for (let i = 0; i < root.nodes.length; i += 1) {\n const node = root.nodes[i];\n if (node.id === nodeId) {\n return {\n node,\n chain: root,\n index: i,\n };\n }\n if (node.superscript) {\n const nested = findNodeById(node.superscript, nodeId);\n if (nested) {\n return nested;\n }\n }\n if (node.subscript) {\n const nested = findNodeById(node.subscript, nodeId);\n if (nested) {\n return nested;\n }\n }\n if (node.innerExpr) {\n const nested = findNodeById(node.innerExpr, nodeId);\n if (nested) {\n return nested;\n }\n }\n if (node.numerator) {\n const nested = findNodeById(node.numerator, nodeId);\n if (nested) {\n return nested;\n }\n }\n if (node.denominator) {\n const nested = findNodeById(node.denominator, nodeId);\n if (nested) {\n return nested;\n }\n }\n if (node.rootIndex) {\n const nested = findNodeById(node.rootIndex, nodeId);\n if (nested) {\n return nested;\n }\n }\n if (node.radicand) {\n const nested = findNodeById(node.radicand, nodeId);\n if (nested) {\n return nested;\n }\n }\n if (node.matrixRows) {\n for (const row of node.matrixRows) {\n for (const cell of row) {\n const nested = findNodeById(cell, nodeId);\n if (nested) {\n return nested;\n }\n }\n }\n }\n }\n return null;\n}\n\nexport function activeTreeKey(side: EditorSide): 'englishTree' | 'arabicTree' {\n return side === 'english' ? 'englishTree' : 'arabicTree';\n}\n\nexport function passiveTreeKey(side: EditorSide): 'englishTree' | 'arabicTree' {\n return side === 'english' ? 'arabicTree' : 'englishTree';\n}\n","import { cloneEditorSession } from './factory.js';\nimport { activeTreeKey, findChainById } from './traversal.js';\nimport type { EditorChain, EditorNode, EditorSelectionRange, EditorSession } from './types.js';\n\n/**\n * Single source of truth for child chains of a node.\n * Future node kinds (commands, env, math objects) extend this helper and\n * everything downstream (caret traversal mirroring, copy/paste, selection)\n * keeps working. Today's children: innerExpr / numerator / denominator / rootIndex / radicand / matrix cells / superscript / subscript.\n */\nexport function nodeChildChains(node: EditorNode): EditorChain[] {\n const chains: EditorChain[] = [];\n if (node.innerExpr) {\n chains.push(node.innerExpr);\n }\n if (node.numerator) {\n chains.push(node.numerator);\n }\n if (node.denominator) {\n chains.push(node.denominator);\n }\n if (node.rootIndex) {\n chains.push(node.rootIndex);\n }\n if (node.radicand) {\n chains.push(node.radicand);\n }\n if (node.matrixRows) {\n for (const row of node.matrixRows) {\n chains.push(...row);\n }\n }\n if (node.superscript) {\n chains.push(node.superscript);\n }\n if (node.subscript) {\n chains.push(node.subscript);\n }\n return chains;\n}\n\n/** Lower/higher slot indices regardless of anchor/focus order. */\nexport function normalizeSelection(sel: EditorSelectionRange): { start: number; end: number } {\n const start = Math.min(sel.anchorIndex, sel.focusIndex);\n const end = Math.max(sel.anchorIndex, sel.focusIndex);\n return { start, end };\n}\n\n/** A selection is active only when it actually spans at least one node. */\nexport function isSelectionActive(sel: EditorSelectionRange | null): boolean {\n if (!sel) {\n return false;\n }\n return sel.anchorIndex !== sel.focusIndex;\n}\n\nexport function clearSelection(session: EditorSession): EditorSession {\n if (session.selection === null) {\n return session;\n }\n const next = cloneEditorSession(session);\n next.selection = null;\n return next;\n}\n\n/**\n * Extend the selection by one slot inside the same chain.\n * Initializes from the current caret when no selection exists.\n * Clamps focus to [0, chain.nodes.length]; collapses selection when it shrinks\n * back to its anchor.\n */\nexport function extendSelectionByStep(session: EditorSession, delta: -1 | 1): EditorSession {\n const next = cloneEditorSession(session);\n const tree = next[activeTreeKey(next.activeSide)];\n const located = findChainById(tree, next.caret.chainId);\n if (!located) {\n return session;\n }\n const chainLen = located.chain.nodes.length;\n\n if (next.selection === null || next.selection.chainId !== next.caret.chainId) {\n next.selection = {\n chainId: next.caret.chainId,\n anchorIndex: next.caret.index,\n focusIndex: next.caret.index,\n };\n }\n\n const targetFocus = Math.max(0, Math.min(chainLen, next.selection.focusIndex + delta));\n if (targetFocus === next.selection.focusIndex) {\n return session;\n }\n next.selection.focusIndex = targetFocus;\n next.caret = { chainId: next.selection.chainId, index: targetFocus };\n\n if (next.selection.anchorIndex === next.selection.focusIndex) {\n next.selection = null;\n }\n return next;\n}\n\n/**\n * Mouse-driven selection setter.\n * - role 'anchor': starts a fresh selection at slotIndex (collapsed).\n * - role 'focus': updates focus on the existing selection. Cross-chain\n * focus moves are ignored (drag stays inside one chain).\n */\nexport function setSelectionFromMouse(\n session: EditorSession,\n chainId: string,\n slotIndex: number,\n role: 'anchor' | 'focus',\n): EditorSession {\n const next = cloneEditorSession(session);\n const tree = next[activeTreeKey(next.activeSide)];\n const located = findChainById(tree, chainId);\n if (!located) {\n return session;\n }\n const clamped = Math.max(0, Math.min(located.chain.nodes.length, slotIndex));\n\n if (role === 'anchor') {\n next.selection = {\n chainId,\n anchorIndex: clamped,\n focusIndex: clamped,\n };\n next.caret = { chainId, index: clamped };\n next.selectedStructureNodeId = null;\n return next;\n }\n\n if (next.selection === null || next.selection.chainId !== chainId) {\n return session;\n }\n if (next.selection.focusIndex === clamped) {\n return session;\n }\n next.selection.focusIndex = clamped;\n next.caret = { chainId, index: clamped };\n if (next.selection.anchorIndex === next.selection.focusIndex) {\n next.selection = null;\n }\n return next;\n}\n\n/** Ids of whole nodes covered by the current selection in the active tree. */\nexport function coveredNodeIds(session: EditorSession): string[] {\n if (!isSelectionActive(session.selection)) {\n return [];\n }\n const sel = session.selection!;\n const tree = session[activeTreeKey(session.activeSide)];\n const located = findChainById(tree, sel.chainId);\n if (!located) {\n return [];\n }\n const { start, end } = normalizeSelection(sel);\n const lo = Math.max(0, Math.min(located.chain.nodes.length, start));\n const hi = Math.max(0, Math.min(located.chain.nodes.length, end));\n return located.chain.nodes.slice(lo, hi).map((n) => n.id);\n}\n","import { renderChainArabic, renderChainEnglish } from './render.js';\nimport { nodeChildChains } from './selection.js';\nimport { activeTreeKey, findChainById, findNodeById } from './traversal.js';\nimport type { EditorChain, EditorNode, EditorSession, EditorSide } from './types.js';\n\n/** MIME used for the structured BuTeX clipboard fragment. */\nexport const BUTEX_FRAGMENT_MIME = 'application/x-butex-fragment+json';\n\nexport type EditorFragment = {\n version: 1;\n source: 'butex-editor';\n english: EditorNode[];\n arabic: EditorNode[];\n};\n\n/** Same incrementing counter behavior as src/editor/factory.ts (private to clipboard reuse path). */\nlet fragmentNextId = 1;\n\nfunction freshId(prefix: string): string {\n const id = `${prefix}_paste_${String(fragmentNextId)}`;\n fragmentNextId += 1;\n return id;\n}\n\n/**\n * Build a fragment from the active selection by deep-cloning the covered nodes\n * from BOTH english and arabic trees (mirrored by node id at matching index).\n * Returns null when the selection is collapsed or invalid.\n */\nexport function serializeSelection(session: EditorSession): EditorFragment | null {\n const sel = session.selection;\n if (!sel || sel.anchorIndex === sel.focusIndex) {\n return null;\n }\n const start = Math.min(sel.anchorIndex, sel.focusIndex);\n const end = Math.max(sel.anchorIndex, sel.focusIndex);\n\n const activeKey = activeTreeKey(session.activeSide);\n const passiveKey = activeKey === 'englishTree' ? 'arabicTree' : 'englishTree';\n const activeLocated = findChainById(session[activeKey], sel.chainId);\n if (!activeLocated) {\n return null;\n }\n const lo = Math.max(0, Math.min(activeLocated.chain.nodes.length, start));\n const hi = Math.max(0, Math.min(activeLocated.chain.nodes.length, end));\n if (hi <= lo) {\n return null;\n }\n\n const passiveTree = session[passiveKey];\n const englishOut: EditorNode[] = [];\n const arabicOut: EditorNode[] = [];\n for (let i = lo; i < hi; i += 1) {\n const activeNode = activeLocated.chain.nodes[i];\n const passiveLocated = findNodeById(passiveTree, activeNode.id);\n if (!passiveLocated) {\n return null;\n }\n if (activeKey === 'englishTree') {\n englishOut.push(structuredClone(activeNode));\n arabicOut.push(structuredClone(passiveLocated.node));\n } else {\n englishOut.push(structuredClone(passiveLocated.node));\n arabicOut.push(structuredClone(activeNode));\n }\n }\n\n return { version: 1, source: 'butex-editor', english: englishOut, arabic: arabicOut };\n}\n\n/**\n * Re-id every node and nested chain in both sides of the fragment so they no\n * longer collide with the live tree. Keeps the EN/AR mirror invariant\n * (matching ids index-by-index, including in nested child chains).\n */\nexport function regenerateFragmentIds(fragment: EditorFragment): EditorFragment {\n const out: EditorFragment = {\n version: 1,\n source: 'butex-editor',\n english: fragment.english.map((n) => structuredClone(n)),\n arabic: fragment.arabic.map((n) => structuredClone(n)),\n };\n if (out.english.length !== out.arabic.length) {\n return out;\n }\n for (let i = 0; i < out.english.length; i += 1) {\n rebuildIdsMirrored(out.english[i], out.arabic[i]);\n }\n return out;\n}\n\nfunction rebuildIdsMirrored(eng: EditorNode, ar: EditorNode): void {\n const newId = freshId('node');\n eng.id = newId;\n ar.id = newId;\n\n const engChains = nodeChildChains(eng);\n const arChains = nodeChildChains(ar);\n for (let c = 0; c < engChains.length && c < arChains.length; c += 1) {\n const newChainId = freshId('chain');\n engChains[c].id = newChainId;\n arChains[c].id = newChainId;\n const engNodes = engChains[c].nodes;\n const arNodes = arChains[c].nodes;\n for (let j = 0; j < engNodes.length && j < arNodes.length; j += 1) {\n rebuildIdsMirrored(engNodes[j], arNodes[j]);\n }\n }\n}\n\n/** Best-effort parse of a clipboard payload. Returns null when shape is wrong. */\nexport function deserializeFragment(payload: string): EditorFragment | null {\n if (!payload) {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(payload);\n } catch {\n return null;\n }\n if (!parsed || typeof parsed !== 'object') {\n return null;\n }\n const obj = parsed as Partial<EditorFragment>;\n if (obj.version !== 1 || obj.source !== 'butex-editor') {\n return null;\n }\n if (!Array.isArray(obj.english) || !Array.isArray(obj.arabic)) {\n return null;\n }\n if (obj.english.length !== obj.arabic.length) {\n return null;\n }\n return { version: 1, source: 'butex-editor', english: obj.english, arabic: obj.arabic };\n}\n\n/** Plain-text rendering of the fragment for cross-app clipboard fallback. */\nexport function fragmentToPlainText(fragment: EditorFragment, side: EditorSide): string {\n const fakeChain: EditorChain = {\n id: 'fragment',\n nodes: side === 'arabic' ? fragment.arabic : fragment.english,\n };\n return side === 'arabic' ? renderChainArabic(fakeChain) : renderChainEnglish(fakeChain);\n}\n","import { cloneEditorSession } from './factory.js';\nimport type { EditorSession } from './types.js';\n\n/** Maximum number of editable states kept in the past stack (oldest drops first). */\nexport const DEFAULT_UNDO_HISTORY_MAX_DEPTH = 100;\n\nexport type UndoRedoStacks = {\n past: EditorSession[];\n future: EditorSession[];\n maxDepth: number;\n};\n\nexport function createUndoRedoStacks(maxDepth: number = DEFAULT_UNDO_HISTORY_MAX_DEPTH): UndoRedoStacks {\n return { past: [], future: [], maxDepth };\n}\n\n/**\n * Records the session **before** a user edit so it can be restored later.\n * Clears the redo branch (standard editor semantics).\n */\nexport function pushUndoRedoSnapshot(stacks: UndoRedoStacks, sessionBeforeEdit: EditorSession): void {\n stacks.past.push(cloneEditorSession(sessionBeforeEdit));\n if (stacks.past.length > stacks.maxDepth) {\n stacks.past.splice(0, stacks.past.length - stacks.maxDepth);\n }\n stacks.future = [];\n}\n\n/** Restore the previous editable state, or null if there is nothing to undo. */\nexport function restoreUndo(stacks: UndoRedoStacks, sessionNow: EditorSession): EditorSession | null {\n if (stacks.past.length === 0) {\n return null;\n }\n stacks.future.push(cloneEditorSession(sessionNow));\n return stacks.past.pop() ?? null;\n}\n\n/** Restore the next state after an undo, or null if there is nothing to redo. */\nexport function restoreRedo(stacks: UndoRedoStacks, sessionNow: EditorSession): EditorSession | null {\n if (stacks.future.length === 0) {\n return null;\n }\n stacks.past.push(cloneEditorSession(sessionNow));\n return stacks.future.pop() ?? null;\n}\n\nexport function undoRedoCanUndo(stacks: UndoRedoStacks): boolean {\n return stacks.past.length > 0;\n}\n\nexport function undoRedoCanRedo(stacks: UndoRedoStacks): boolean {\n return stacks.future.length > 0;\n}\n","import { caretStep } from './caretOrder.js';\nimport {\n type EditorFragment,\n regenerateFragmentIds,\n serializeSelection,\n} from './clipboard.js';\nimport {\n cloneEditorSession,\n createDelimiterNode,\n createEditorChain,\n createEditorNode,\n createFracNode,\n createSqrtNode,\n createGridEnvNode,\n createAtomicCommandNode,\n createAtomicOperatorCommandNode,\n} from './factory.js';\nimport { renderArabicLatexFromSession, renderEnglishLatexFromSession } from './render.js';\nimport { coveredNodeIds, isSelectionActive, nodeChildChains } from './selection.js';\nimport { activeTreeKey, findChainById, findNodeById, passiveTreeKey } from './traversal.js';\nimport type {\n CharacterFontId,\n DigitFormId,\n EditorChain,\n EditorDebugEntry,\n EditorNode,\n EditorSession,\n EditorSide,\n EnvColumnAlignment,\n GridEnvName,\n MatrixEnvStyle,\n} from './types.js';\nimport type { AtomicCommandId } from './atomicCommands.js';\nimport type { AtomicOperatorCommandId } from './atomicCommandsOperators.js';\n\nfunction ensureSyncEntry(session: EditorSession, nodeId: string): void {\n if (!session.sync[nodeId]) {\n session.sync[nodeId] = { expr: 'synced' };\n }\n}\n\nfunction markExprSync(session: EditorSession, nodeId: string): void {\n const english = findNodeById(session.englishTree, nodeId);\n const arabic = findNodeById(session.arabicTree, nodeId);\n ensureSyncEntry(session, nodeId);\n if (!english || !arabic) {\n session.sync[nodeId].expr = 'diverged';\n return;\n }\n session.sync[nodeId].expr = english.node.expr === arabic.node.expr ? 'synced' : 'diverged';\n}\n\n/** Keep highlighted node aligned with caret (keyboard + programmatic caret moves). */\nexport function syncSelectionToCaret(session: EditorSession): void {\n const activeKey = activeTreeKey(session.activeSide);\n const tree = session[activeKey];\n const { chainId, index } = session.caret;\n const located = findChainById(tree, chainId);\n if (!located) {\n session.selectedNodeId = null;\n return;\n }\n if (index > 0) {\n session.selectedNodeId = located.chain.nodes[index - 1].id;\n return;\n }\n if (located.relation.kind === 'superscript' || located.relation.kind === 'subscript') {\n session.selectedNodeId = located.relation.ownerNodeId;\n return;\n }\n if (\n located.relation.kind === 'inner' ||\n located.relation.kind === 'numerator' ||\n located.relation.kind === 'denominator' ||\n located.relation.kind === 'radicand' ||\n located.relation.kind === 'rootIndex' ||\n located.relation.kind === 'matrixCell'\n ) {\n session.selectedNodeId = located.relation.ownerNodeId;\n return;\n }\n session.selectedNodeId = null;\n}\n\nfunction appendDebug(session: EditorSession, command: string, note: string): void {\n const entry: EditorDebugEntry = {\n timestamp: new Date().toISOString(),\n command,\n activeSide: session.activeSide,\n englishLatex: renderEnglishLatexFromSession(session),\n arabicLatex: renderArabicLatexFromSession(session),\n renderOk: true,\n renderError: null,\n note,\n };\n const nextLog = session.debugLog.concat(entry);\n session.debugLog = nextLog.slice(-120);\n}\n\nfunction insertMirroredNode(session: EditorSession, chainId: string, index: number, englishNode: EditorNode, arabicNode: EditorNode): void {\n const englishLocated = findChainById(session.englishTree, chainId);\n const arabicLocated = findChainById(session.arabicTree, chainId);\n if (!englishLocated || !arabicLocated) {\n return;\n }\n const safeIndex = Math.max(0, Math.min(index, englishLocated.chain.nodes.length));\n englishLocated.chain.nodes.splice(safeIndex, 0, englishNode);\n arabicLocated.chain.nodes.splice(safeIndex, 0, arabicNode);\n ensureSyncEntry(session, englishNode.id);\n markExprSync(session, englishNode.id);\n}\n\nfunction syncMatrixCellChainIds(englishNode: EditorNode, arabicNode: EditorNode): void {\n const englishRows = englishNode.matrixRows ?? [];\n const arabicRows = arabicNode.matrixRows ?? [];\n const rowLimit = Math.min(englishRows.length, arabicRows.length);\n for (let rowIndex = 0; rowIndex < rowLimit; rowIndex += 1) {\n const englishRow = englishRows[rowIndex];\n const arabicRow = arabicRows[rowIndex];\n const columnLimit = Math.min(englishRow.length, arabicRow.length);\n for (let columnIndex = 0; columnIndex < columnLimit; columnIndex += 1) {\n arabicRow[columnIndex].id = englishRow[columnIndex].id;\n }\n }\n}\n\nfunction createMatrixRow(columnCount: number): EditorChain[] {\n return Array.from({ length: columnCount }, () => createEditorChain());\n}\n\nfunction findSelectedMatrixPair(session: EditorSession): { english: EditorNode; arabic: EditorNode } | null {\n const targetNodeId = session.selectedStructureNodeId ?? session.selectedNodeId;\n if (!targetNodeId) {\n return null;\n }\n const englishLocated = findNodeById(session.englishTree, targetNodeId);\n const arabicLocated = findNodeById(session.arabicTree, targetNodeId);\n if (!englishLocated || !arabicLocated) {\n return null;\n }\n if (englishLocated.node.kind !== 'env' || arabicLocated.node.kind !== 'env') {\n return null;\n }\n return { english: englishLocated.node, arabic: arabicLocated.node };\n}\n\nfunction normalizeArrayAlignments(node: EditorNode): void {\n if ((node.envName ?? node.matrixStyle) !== 'array' || !node.matrixRows) {\n return;\n }\n const columnCount = Math.max(1, node.matrixRows[0]?.length ?? 1);\n const current = node.columnAlignments ?? [];\n node.columnAlignments = Array.from({ length: columnCount }, (_, index) => current[index] ?? 'c');\n}\n\nfunction removeMirroredNodeById(session: EditorSession, nodeId: string): boolean {\n const englishLocated = findNodeById(session.englishTree, nodeId);\n const arabicLocated = findNodeById(session.arabicTree, nodeId);\n if (!englishLocated || !arabicLocated) {\n return false;\n }\n englishLocated.chain.nodes.splice(englishLocated.index, 1);\n arabicLocated.chain.nodes.splice(arabicLocated.index, 1);\n delete session.sync[nodeId];\n return true;\n}\n\n/**\n * Mutates `next` to remove every node covered by its current selection (mirrored\n * across EN/AR), parks the caret at selection.start, and clears the selection.\n * Returns true when something was removed.\n */\nfunction applyDeleteSelectionRange(next: EditorSession): boolean {\n if (!isSelectionActive(next.selection)) {\n next.selection = null;\n return false;\n }\n const ids = coveredNodeIds(next);\n if (ids.length === 0) {\n next.selection = null;\n return false;\n }\n const sel = next.selection;\n if (!sel) {\n return false;\n }\n const start = Math.min(sel.anchorIndex, sel.focusIndex);\n const chainId = sel.chainId;\n for (const id of ids) {\n removeMirroredNodeById(next, id);\n }\n next.caret = { chainId, index: start };\n next.selection = null;\n next.selectedStructureNodeId = null;\n return true;\n}\n\n/** Recursively ensure sync entries for an inserted mirrored subtree (top + nested). */\nfunction syncSubtreeRecursive(session: EditorSession, eng: EditorNode, ar: EditorNode): void {\n ensureSyncEntry(session, eng.id);\n markExprSync(session, eng.id);\n const engChains = nodeChildChains(eng);\n const arChains = nodeChildChains(ar);\n const limit = Math.min(engChains.length, arChains.length);\n for (let c = 0; c < limit; c += 1) {\n const ec = engChains[c];\n const ac = arChains[c];\n const innerLimit = Math.min(ec.nodes.length, ac.nodes.length);\n for (let j = 0; j < innerLimit; j += 1) {\n syncSubtreeRecursive(session, ec.nodes[j], ac.nodes[j]);\n }\n }\n}\n\nexport function switchSide(session: EditorSession): EditorSession {\n const next = cloneEditorSession(session);\n next.activeSide = next.activeSide === 'english' ? 'arabic' : 'english';\n next.selection = null;\n appendDebug(next, 'switchSide', `active=${next.activeSide}`);\n return next;\n}\n\nexport function setSplitLeafTyping(session: EditorSession, enabled: boolean): EditorSession {\n const next = cloneEditorSession(session);\n next.splitLeafTyping = enabled;\n appendDebug(next, 'setSplitLeafTyping', enabled ? 'on' : 'off');\n return next;\n}\n\nexport function setArabicReverseNumberTyping(session: EditorSession, enabled: boolean): EditorSession {\n const next = cloneEditorSession(session);\n next.arabicReverseNumberTyping = enabled;\n appendDebug(next, 'setArabicReverseNumberTyping', enabled ? 'on' : 'off');\n return next;\n}\n\nexport function setCaret(session: EditorSession, chainId: string, index: number): EditorSession {\n const next = cloneEditorSession(session);\n const activeKey = activeTreeKey(next.activeSide);\n const located = findChainById(next[activeKey], chainId);\n if (!located) {\n return session;\n }\n next.caret = {\n chainId,\n index: Math.max(0, Math.min(index, located.chain.nodes.length)),\n };\n next.selection = null;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n return next;\n}\n\nexport function moveCaret(session: EditorSession, delta: -1 | 1): EditorSession {\n const next = cloneEditorSession(session);\n const activeKey = activeTreeKey(next.activeSide);\n const tree = next[activeKey];\n const located = findChainById(tree, next.caret.chainId);\n if (!located) {\n return session;\n }\n next.caret = caretStep(tree, next.caret, delta);\n next.selection = null;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaret', `delta=${String(delta)} dfs`);\n return next;\n}\n\nexport function horizontalCaretDelta(session: EditorSession, direction: 'left' | 'right'): -1 | 1 {\n const activeKey = activeTreeKey(session.activeSide);\n const tree = session[activeKey];\n const located = findChainById(tree, session.caret.chainId);\n const inMatrixCell = located?.relation.kind === 'matrixCell';\n const canMoveInsideCell =\n inMatrixCell &&\n session.activeSide === 'arabic' &&\n ((direction === 'left' && session.caret.index < located.chain.nodes.length) ||\n (direction === 'right' && session.caret.index > 0));\n if (session.activeSide === 'arabic' && (!inMatrixCell || canMoveInsideCell)) {\n return direction === 'left' ? 1 : -1;\n }\n return direction === 'left' ? -1 : 1;\n}\n\nexport function moveCaretHorizontal(session: EditorSession, direction: 'left' | 'right'): EditorSession {\n const activeKey = activeTreeKey(session.activeSide);\n const tree = session[activeKey];\n const located = findChainById(tree, session.caret.chainId);\n if (!located || located.relation.kind !== 'matrixCell') {\n return moveCaret(session, horizontalCaretDelta(session, direction));\n }\n\n const textDelta = session.activeSide === 'arabic'\n ? direction === 'left' ? 1 : -1\n : direction === 'left' ? -1 : 1;\n const nextIndex = session.caret.index + textDelta;\n if (nextIndex >= 0 && nextIndex <= located.chain.nodes.length) {\n return moveCaret(session, textDelta);\n }\n\n const ownerLocated =\n located.relation.ownerNodeId !== null ? findNodeById(tree, located.relation.ownerNodeId) : null;\n const ownerNode = ownerLocated?.node ?? null;\n if (!ownerLocated || !ownerNode?.matrixRows) {\n return session;\n }\n\n const rowIndex = located.relation.rowIndex ?? 0;\n const columnIndex = located.relation.columnIndex ?? 0;\n const row = ownerNode.matrixRows[rowIndex];\n if (!row) {\n return session;\n }\n\n const toVisualIndex = (column: number, columnCount: number): number =>\n session.activeSide === 'arabic' ? columnCount - 1 - column : column;\n const fromVisualIndex = (visualColumn: number, columnCount: number): number =>\n session.activeSide === 'arabic' ? columnCount - 1 - visualColumn : visualColumn;\n const entryIndex = (cell: EditorChain): number => {\n if (session.activeSide === 'arabic') {\n return direction === 'left' ? 0 : cell.nodes.length;\n }\n return direction === 'left' ? cell.nodes.length : 0;\n };\n\n const visualDelta = direction === 'left' ? -1 : 1;\n const currentVisualIndex = toVisualIndex(columnIndex, row.length);\n let targetRowIndex = rowIndex;\n let targetVisualIndex = currentVisualIndex + visualDelta;\n\n if (targetVisualIndex < 0 || targetVisualIndex >= row.length) {\n if (direction === 'left') {\n if (session.activeSide === 'arabic') {\n targetRowIndex = rowIndex + 1;\n const targetRow = ownerNode.matrixRows[targetRowIndex];\n if (targetRow) {\n targetVisualIndex = targetRow.length - 1;\n }\n } else {\n targetRowIndex = rowIndex - 1;\n const targetRow = ownerNode.matrixRows[targetRowIndex];\n if (targetRow) {\n targetVisualIndex = targetRow.length - 1;\n }\n }\n } else if (session.activeSide === 'arabic') {\n targetRowIndex = rowIndex - 1;\n targetVisualIndex = 0;\n } else {\n targetRowIndex = rowIndex + 1;\n targetVisualIndex = 0;\n }\n }\n\n const targetRow = ownerNode.matrixRows[targetRowIndex];\n if (targetRow && targetVisualIndex >= 0 && targetVisualIndex < targetRow.length) {\n const targetColumnIndex = fromVisualIndex(targetVisualIndex, targetRow.length);\n const targetCell = targetRow[targetColumnIndex];\n if (targetCell) {\n const next = cloneEditorSession(session);\n next.caret = { chainId: targetCell.id, index: entryIndex(targetCell) };\n next.selection = null;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretHorizontal', `matrix-${direction}`);\n return next;\n }\n }\n\n const next = cloneEditorSession(session);\n const exitsAfter =\n (session.activeSide === 'english' && direction === 'right') ||\n (session.activeSide === 'arabic' && direction === 'left');\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: exitsAfter ? ownerLocated.index + 1 : ownerLocated.index,\n };\n next.selection = null;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretHorizontal', `matrix-${direction}-exit`);\n return next;\n}\n\nexport function moveCaretVertical(session: EditorSession, direction: 'up' | 'down'): EditorSession {\n const next = cloneEditorSession(session);\n next.selection = null;\n const activeKey = activeTreeKey(next.activeSide);\n const tree = next[activeKey];\n const located = findChainById(tree, next.caret.chainId);\n if (!located) {\n return session;\n }\n\n const ownerLocated =\n located.relation.ownerNodeId !== null ? findNodeById(tree, located.relation.ownerNodeId) : null;\n const ownerNode = ownerLocated?.node ?? null;\n\n if (located.relation.kind === 'numerator' && ownerLocated && ownerNode && ownerNode.denominator) {\n if (direction === 'down') {\n next.caret = {\n chainId: ownerNode.denominator.id,\n index: ownerNode.denominator.nodes.length,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'frac-num->den');\n return next;\n }\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'frac-num-up-exit');\n return next;\n }\n\n if (located.relation.kind === 'denominator' && ownerLocated && ownerNode && ownerNode.numerator) {\n if (direction === 'up') {\n next.caret = {\n chainId: ownerNode.numerator.id,\n index: ownerNode.numerator.nodes.length,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'frac-den->num');\n return next;\n }\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index + 1,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'frac-den-down-exit');\n return next;\n }\n\n if (located.relation.kind === 'rootIndex' && ownerLocated && ownerNode && ownerNode.radicand) {\n if (direction === 'down') {\n next.caret = {\n chainId: ownerNode.radicand.id,\n index: ownerNode.radicand.nodes.length,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sqrt-root->radicand');\n return next;\n }\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sqrt-root-up-exit');\n return next;\n }\n\n if (located.relation.kind === 'radicand' && ownerLocated && ownerNode && ownerNode.rootIndex) {\n if (direction === 'up') {\n next.caret = {\n chainId: ownerNode.rootIndex.id,\n index: ownerNode.rootIndex.nodes.length,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sqrt-radicand->root');\n return next;\n }\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index + 1,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sqrt-radicand-down-exit');\n return next;\n }\n\n if (located.relation.kind === 'matrixCell' && ownerLocated && ownerNode?.matrixRows) {\n const rowIndex = located.relation.rowIndex ?? 0;\n const columnIndex = located.relation.columnIndex ?? 0;\n const nextRowIndex = direction === 'up' ? rowIndex - 1 : rowIndex + 1;\n if (nextRowIndex >= 0 && nextRowIndex < ownerNode.matrixRows.length) {\n const nextRow = ownerNode.matrixRows[nextRowIndex];\n const nextCell = nextRow[Math.min(columnIndex, nextRow.length - 1)];\n if (nextCell) {\n next.caret = {\n chainId: nextCell.id,\n index: nextCell.nodes.length,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'matrix-cell');\n return next;\n }\n }\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: direction === 'up' ? ownerLocated.index : ownerLocated.index + 1,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', `matrix-${direction}-exit`);\n return next;\n }\n\n if (located.relation.kind === 'superscript' && ownerLocated && ownerNode) {\n if (direction === 'down') {\n if (ownerNode.subscript) {\n next.caret = {\n chainId: ownerNode.subscript.id,\n index: ownerNode.subscript.nodes.length,\n };\n } else {\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index + 1,\n };\n }\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sup->down');\n return next;\n }\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sup->up-exit');\n return next;\n }\n\n if (located.relation.kind === 'subscript' && ownerLocated && ownerNode) {\n if (direction === 'up') {\n if (ownerNode.superscript) {\n next.caret = {\n chainId: ownerNode.superscript.id,\n index: ownerNode.superscript.nodes.length,\n };\n } else {\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index,\n };\n }\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sub->up');\n return next;\n }\n next.caret = {\n chainId: ownerLocated.chain.id,\n index: ownerLocated.index + 1,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', 'sub->down-exit');\n return next;\n }\n\n if (located.relation.kind !== 'root' && located.relation.kind !== 'inner') {\n return session;\n }\n\n const caretIdx = next.caret.index;\n if (caretIdx <= 0) {\n return session;\n }\n const nodeBeforeCaret = located.chain.nodes[caretIdx - 1];\n if (!nodeBeforeCaret) {\n return session;\n }\n\n const targetChain =\n direction === 'up'\n ? nodeBeforeCaret.superscript ?? nodeBeforeCaret.subscript\n : nodeBeforeCaret.subscript ?? nodeBeforeCaret.superscript;\n\n if (!targetChain) {\n return session;\n }\n next.caret = {\n chainId: targetChain.id,\n index: targetChain.nodes.length,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'moveCaretVertical', `base->script:${direction}`);\n return next;\n}\n\nfunction insertLeaf(session: EditorSession, kind: 'char' | 'number' | 'operator', expr: string): EditorSession {\n const next = cloneEditorSession(session);\n const englishNode = createEditorNode(kind, expr);\n const arabicNode = createEditorNode(kind, expr);\n if (kind === 'char' && (next.currentCharacterFont ?? 'default') !== 'default') {\n englishNode.characterFont = next.currentCharacterFont;\n arabicNode.characterFont = next.currentCharacterFont;\n }\n arabicNode.id = englishNode.id;\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n next.caret.index += 1;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertLeaf', `${kind}:${expr}`);\n return next;\n}\n\n/** When Arabic active and flag on, number fragments prepend on both mirrored exprs (same printed string on EN/AR). */\nfunction shouldReverseArabicNumber(session: EditorSession): boolean {\n return session.activeSide === 'arabic' && session.arabicReverseNumberTyping;\n}\n\nfunction characterFontOf(node: EditorNode): CharacterFontId {\n return node.kind === 'char' ? node.characterFont ?? 'default' : 'default';\n}\n\n/** When split mode is off: merge into adjacent same-kind leaf (append after node at index-1, else prepend node at index). */\nfunction tryMergeLeafTyping(session: EditorSession, kind: 'char' | 'number', fragment: string): boolean {\n const engLocated = findChainById(session.englishTree, session.caret.chainId);\n if (!engLocated) {\n return false;\n }\n const nodes = engLocated.chain.nodes;\n const i = session.caret.index;\n let targetId: string | null = null;\n let prepend = false;\n if (i > 0) {\n const prev = nodes[i - 1];\n if (prev.kind === kind && (kind !== 'char' || characterFontOf(prev) === (session.currentCharacterFont ?? 'default'))) {\n targetId = prev.id;\n prepend = false;\n }\n }\n if (!targetId && i < nodes.length) {\n const fwd = nodes[i];\n if (fwd.kind === kind && (kind !== 'char' || characterFontOf(fwd) === (session.currentCharacterFont ?? 'default'))) {\n targetId = fwd.id;\n prepend = true;\n }\n }\n if (!targetId) {\n return false;\n }\n const englishHit = findNodeById(session.englishTree, targetId);\n const arabicHit = findNodeById(session.arabicTree, targetId);\n if (!englishHit || !arabicHit) {\n return false;\n }\n const prependBoth = kind === 'number' && shouldReverseArabicNumber(session) ? true : prepend;\n if (prependBoth) {\n englishHit.node.expr = `${fragment}${englishHit.node.expr}`;\n arabicHit.node.expr = `${fragment}${arabicHit.node.expr}`;\n } else {\n englishHit.node.expr = `${englishHit.node.expr}${fragment}`;\n arabicHit.node.expr = `${arabicHit.node.expr}${fragment}`;\n }\n markExprSync(session, targetId);\n return true;\n}\n\n/**\n * Replace any active selection with a freshly-cleared range, then return a base\n * session ready for the actual insert. Mutating helper so reducers stay short.\n */\nfunction replaceSelectionFirst(session: EditorSession): EditorSession {\n if (!isSelectionActive(session.selection)) {\n return session;\n }\n const next = cloneEditorSession(session);\n applyDeleteSelectionRange(next);\n syncSelectionToCaret(next);\n return next;\n}\n\n/** Returns true when the node before the caret is a pure-digit number leaf (no existing dot). */\nfunction precedingIsExtendableNumber(session: EditorSession): boolean {\n const located = findChainById(session.englishTree, session.caret.chainId);\n if (!located || session.caret.index <= 0) {\n return false;\n }\n const prev = located.chain.nodes[session.caret.index - 1];\n if (!prev || prev.kind !== 'number') {\n return false;\n }\n if (prev.expr.includes('.')) {\n return false;\n }\n return /^\\d+$/.test(prev.expr);\n}\n\n/** One-shot: forces the next insertChar/insertNumber to start a new leaf instead of merging. No-op in split mode. */\nexport function breakLeafTyping(session: EditorSession): EditorSession {\n if (session.splitLeafTyping) {\n return session;\n }\n const next = cloneEditorSession(session);\n next.forceSplitNextLeaf = true;\n appendDebug(next, 'breakLeafTyping', 'split-next');\n return next;\n}\n\nexport function setCurrentCharacterFont(session: EditorSession, fontId: CharacterFontId): EditorSession {\n const next = cloneEditorSession(session);\n next.currentCharacterFont = fontId;\n appendDebug(next, 'setCurrentCharacterFont', fontId);\n return next;\n}\n\nexport function toggleTakweenCharacterFont(session: EditorSession): EditorSession {\n return setCurrentCharacterFont(session, (session.currentCharacterFont ?? 'default') === 'takween' ? 'default' : 'takween');\n}\n\nexport function setCurrentDigitForm(session: EditorSession, digitForm: DigitFormId): EditorSession {\n const next = cloneEditorSession(session);\n next.currentDigitForm = digitForm;\n appendDebug(next, 'setCurrentDigitForm', digitForm);\n return next;\n}\n\nexport function insertChar(session: EditorSession, expr: string): EditorSession {\n const base = replaceSelectionFirst(session);\n if (!base.splitLeafTyping && !base.forceSplitNextLeaf) {\n const next = cloneEditorSession(base);\n if (tryMergeLeafTyping(next, 'char', expr)) {\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'mergeLeaf', `char:${expr}`);\n return next;\n }\n }\n const inserted = insertLeaf(base, 'char', expr);\n inserted.forceSplitNextLeaf = false;\n return inserted;\n}\n\nexport function insertNumber(session: EditorSession, expr: string): EditorSession {\n const base = replaceSelectionFirst(session);\n if (!base.splitLeafTyping && !base.forceSplitNextLeaf) {\n const next = cloneEditorSession(base);\n if (tryMergeLeafTyping(next, 'number', expr)) {\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'mergeLeaf', `number:${expr}`);\n return next;\n }\n }\n const inserted = insertLeaf(base, 'number', expr);\n inserted.forceSplitNextLeaf = false;\n return inserted;\n}\n\nexport function insertOperator(session: EditorSession, expr: string): EditorSession {\n if (expr === '.' && !session.splitLeafTyping && precedingIsExtendableNumber(session)) {\n return insertNumber(session, '.');\n }\n const base = replaceSelectionFirst(session);\n return insertLeaf(base, 'operator', expr);\n}\n\nexport function insertAtomicCommand(session: EditorSession, commandId: AtomicCommandId): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const englishNode = createAtomicCommandNode(commandId);\n const arabicNode = createAtomicCommandNode(commandId);\n arabicNode.id = englishNode.id;\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n next.caret.index += 1;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertAtomicCommand', commandId);\n return next;\n}\n\nexport function insertAtomicOperatorCommand(session: EditorSession, commandId: AtomicOperatorCommandId): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const englishNode = createAtomicOperatorCommandNode(commandId);\n const arabicNode = createAtomicOperatorCommandNode(commandId);\n arabicNode.id = englishNode.id;\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n next.caret.index += 1;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertAtomicOperatorCommand', commandId);\n return next;\n}\n\nexport function insertDelimiterPair(session: EditorSession, leftDelimExpr: string, rightDelimExpr: string): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const englishNode = createDelimiterNode(leftDelimExpr, rightDelimExpr);\n const arabicNode = createDelimiterNode(leftDelimExpr, rightDelimExpr);\n arabicNode.id = englishNode.id;\n if (arabicNode.innerExpr && englishNode.innerExpr) {\n arabicNode.innerExpr.id = englishNode.innerExpr.id;\n }\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n next.caret = {\n chainId: englishNode.innerExpr ? englishNode.innerExpr.id : next.caret.chainId,\n index: 0,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertDelimiterPair', `${leftDelimExpr}${rightDelimExpr}`);\n return next;\n}\n\nexport function insertFraction(session: EditorSession): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const englishNode = createFracNode();\n const arabicNode = createFracNode();\n arabicNode.id = englishNode.id;\n if (arabicNode.numerator && englishNode.numerator) {\n arabicNode.numerator.id = englishNode.numerator.id;\n }\n if (arabicNode.denominator && englishNode.denominator) {\n arabicNode.denominator.id = englishNode.denominator.id;\n }\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n next.caret = {\n chainId: englishNode.numerator ? englishNode.numerator.id : next.caret.chainId,\n index: 0,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertFraction', '');\n return next;\n}\n\nexport function insertSqrt(session: EditorSession): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const englishNode = createSqrtNode();\n const arabicNode = createSqrtNode();\n arabicNode.id = englishNode.id;\n if (arabicNode.radicand && englishNode.radicand) {\n arabicNode.radicand.id = englishNode.radicand.id;\n }\n if (arabicNode.rootIndex && englishNode.rootIndex) {\n arabicNode.rootIndex.id = englishNode.rootIndex.id;\n }\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n next.caret = {\n chainId: englishNode.radicand ? englishNode.radicand.id : next.caret.chainId,\n index: 0,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertSqrt', '');\n return next;\n}\n\nexport function insertMatrixEnv(\n session: EditorSession,\n style: MatrixEnvStyle,\n rows: number,\n columns: number,\n): EditorSession {\n return insertGridEnv(session, style, rows, columns);\n}\n\nexport function insertArrayEnv(\n session: EditorSession,\n rows: number,\n columns: number,\n columnAlignments?: EnvColumnAlignment[],\n): EditorSession {\n return insertGridEnv(session, 'array', rows, columns, columnAlignments);\n}\n\nexport function insertAlignedEnv(\n session: EditorSession,\n rows: number,\n columns: number,\n): EditorSession {\n return insertGridEnv(session, 'aligned', rows, columns);\n}\n\nfunction insertGridEnv(\n session: EditorSession,\n envName: GridEnvName,\n rows: number,\n columns: number,\n columnAlignments?: EnvColumnAlignment[],\n): EditorSession {\n const base = replaceSelectionFirst(session);\n const next = cloneEditorSession(base);\n const englishNode = createGridEnvNode(envName, rows, columns, columnAlignments);\n const arabicNode = createGridEnvNode(envName, rows, columns, columnAlignments);\n arabicNode.id = englishNode.id;\n syncMatrixCellChainIds(englishNode, arabicNode);\n insertMirroredNode(next, next.caret.chainId, next.caret.index, englishNode, arabicNode);\n next.caret = {\n chainId: englishNode.matrixRows?.[0]?.[0]?.id ?? next.caret.chainId,\n index: 0,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'insertGridEnv', `${envName}:${String(rows)}x${String(columns)}`);\n return next;\n}\n\nexport function setMatrixEnvStyle(session: EditorSession, style: MatrixEnvStyle): EditorSession {\n const next = cloneEditorSession(session);\n const pair = findSelectedMatrixPair(next);\n if (!pair) {\n return session;\n }\n pair.english.envName = style;\n pair.arabic.envName = style;\n pair.english.matrixStyle = style;\n pair.arabic.matrixStyle = style;\n pair.english.columnAlignments = null;\n pair.arabic.columnAlignments = null;\n appendDebug(next, 'setMatrixEnvStyle', style);\n return next;\n}\n\nexport function setArrayColumnAlignment(\n session: EditorSession,\n columnIndex: number,\n alignment: EnvColumnAlignment,\n): EditorSession {\n const next = cloneEditorSession(session);\n const pair = findSelectedMatrixPair(next);\n if (!pair || (pair.english.envName ?? pair.english.matrixStyle) !== 'array') {\n return session;\n }\n normalizeArrayAlignments(pair.english);\n normalizeArrayAlignments(pair.arabic);\n const columnCount = pair.english.columnAlignments?.length ?? 0;\n const safeIndex = Math.max(0, Math.min(columnIndex, Math.max(0, columnCount - 1)));\n if (pair.english.columnAlignments && pair.arabic.columnAlignments && columnCount > 0) {\n pair.english.columnAlignments[safeIndex] = alignment;\n pair.arabic.columnAlignments[safeIndex] = alignment;\n }\n appendDebug(next, 'setArrayColumnAlignment', `${String(safeIndex)}:${alignment}`);\n return next;\n}\n\nexport function addMatrixRow(session: EditorSession): EditorSession {\n const next = cloneEditorSession(session);\n const pair = findSelectedMatrixPair(next);\n if (!pair || !pair.english.matrixRows || !pair.arabic.matrixRows || pair.english.matrixRows.length >= 12) {\n return session;\n }\n const columnCount = Math.max(1, pair.english.matrixRows[0]?.length ?? 1);\n const englishRow = createMatrixRow(columnCount);\n const arabicRow = createMatrixRow(columnCount);\n for (let i = 0; i < columnCount; i += 1) {\n arabicRow[i].id = englishRow[i].id;\n }\n pair.english.matrixRows.push(englishRow);\n pair.arabic.matrixRows.push(arabicRow);\n normalizeArrayAlignments(pair.english);\n normalizeArrayAlignments(pair.arabic);\n appendDebug(next, 'addMatrixRow', pair.english.id);\n return next;\n}\n\nexport function removeMatrixRow(session: EditorSession): EditorSession {\n const next = cloneEditorSession(session);\n const pair = findSelectedMatrixPair(next);\n if (!pair || !pair.english.matrixRows || !pair.arabic.matrixRows || pair.english.matrixRows.length <= 1) {\n return session;\n }\n pair.english.matrixRows.pop();\n pair.arabic.matrixRows.pop();\n normalizeArrayAlignments(pair.english);\n normalizeArrayAlignments(pair.arabic);\n appendDebug(next, 'removeMatrixRow', pair.english.id);\n return next;\n}\n\nexport function addMatrixColumn(session: EditorSession): EditorSession {\n const next = cloneEditorSession(session);\n const pair = findSelectedMatrixPair(next);\n if (!pair || !pair.english.matrixRows || !pair.arabic.matrixRows) {\n return session;\n }\n const columnCount = pair.english.matrixRows[0]?.length ?? 0;\n if (columnCount >= 12) {\n return session;\n }\n for (let rowIndex = 0; rowIndex < pair.english.matrixRows.length; rowIndex += 1) {\n const englishCell = createEditorChain();\n const arabicCell = createEditorChain();\n arabicCell.id = englishCell.id;\n pair.english.matrixRows[rowIndex].push(englishCell);\n pair.arabic.matrixRows[rowIndex].push(arabicCell);\n }\n normalizeArrayAlignments(pair.english);\n normalizeArrayAlignments(pair.arabic);\n appendDebug(next, 'addMatrixColumn', pair.english.id);\n return next;\n}\n\nexport function removeMatrixColumn(session: EditorSession): EditorSession {\n const next = cloneEditorSession(session);\n const pair = findSelectedMatrixPair(next);\n if (!pair || !pair.english.matrixRows || !pair.arabic.matrixRows) {\n return session;\n }\n const columnCount = pair.english.matrixRows[0]?.length ?? 0;\n if (columnCount <= 1) {\n return session;\n }\n for (let rowIndex = 0; rowIndex < pair.english.matrixRows.length; rowIndex += 1) {\n pair.english.matrixRows[rowIndex].pop();\n pair.arabic.matrixRows[rowIndex].pop();\n }\n normalizeArrayAlignments(pair.english);\n normalizeArrayAlignments(pair.arabic);\n appendDebug(next, 'removeMatrixColumn', pair.english.id);\n return next;\n}\n\nfunction addScript(session: EditorSession, type: 'superscript' | 'subscript'): EditorSession {\n const targetNodeId = session.selectedNodeId;\n if (!targetNodeId) {\n return session;\n }\n const next = cloneEditorSession(session);\n const englishLocated = findNodeById(next.englishTree, targetNodeId);\n const arabicLocated = findNodeById(next.arabicTree, targetNodeId);\n if (!englishLocated || !arabicLocated) {\n return session;\n }\n const englishNode = englishLocated.node;\n const arabicNode = arabicLocated.node;\n if (!englishNode[type]) {\n englishNode[type] = createEditorChain();\n }\n if (!arabicNode[type]) {\n arabicNode[type] = createEditorChain();\n }\n if (englishNode[type] && arabicNode[type]) {\n arabicNode[type].id = englishNode[type].id;\n next.caret = {\n chainId: englishNode[type].id,\n index: englishNode[type].nodes.length,\n };\n }\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, `add${type === 'superscript' ? 'Sup' : 'Sub'}`, targetNodeId);\n return next;\n}\n\nfunction removeScript(session: EditorSession, type: 'superscript' | 'subscript'): EditorSession {\n const targetNodeId = session.selectedNodeId;\n if (!targetNodeId) {\n return session;\n }\n const next = cloneEditorSession(session);\n const englishLocated = findNodeById(next.englishTree, targetNodeId);\n const arabicLocated = findNodeById(next.arabicTree, targetNodeId);\n if (!englishLocated || !arabicLocated) {\n return session;\n }\n englishLocated.node[type] = null;\n arabicLocated.node[type] = null;\n next.caret = {\n chainId: englishLocated.chain.id,\n index: englishLocated.index + 1,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, `remove${type === 'superscript' ? 'Sup' : 'Sub'}`, targetNodeId);\n return next;\n}\n\nexport function addSup(session: EditorSession): EditorSession {\n return addScript(session, 'superscript');\n}\n\nexport function addSub(session: EditorSession): EditorSession {\n return addScript(session, 'subscript');\n}\n\nexport function removeSup(session: EditorSession): EditorSession {\n return removeScript(session, 'superscript');\n}\n\nexport function removeSub(session: EditorSession): EditorSession {\n return removeScript(session, 'subscript');\n}\n\nexport function selectNode(session: EditorSession, nodeId: string | null): EditorSession {\n const next = cloneEditorSession(session);\n next.selectedNodeId = nodeId;\n next.selectedStructureNodeId = null;\n return next;\n}\n\nexport function deleteStructure(session: EditorSession): EditorSession {\n const targetNodeId = session.selectedStructureNodeId ?? session.selectedNodeId;\n if (!targetNodeId) {\n return session;\n }\n const next = cloneEditorSession(session);\n const activeKey = activeTreeKey(next.activeSide);\n const located = findNodeById(next[activeKey], targetNodeId);\n if (!located) {\n return session;\n }\n const removed = removeMirroredNodeById(next, targetNodeId);\n if (!removed) {\n return session;\n }\n next.caret = {\n chainId: located.chain.id,\n index: located.index,\n };\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'deleteStructure', targetNodeId);\n return next;\n}\n\nexport function deleteBackward(session: EditorSession): EditorSession {\n if (isSelectionActive(session.selection)) {\n const next = cloneEditorSession(session);\n applyDeleteSelectionRange(next);\n syncSelectionToCaret(next);\n appendDebug(next, 'deleteBackward', 'deleted range');\n return next;\n }\n const next = cloneEditorSession(session);\n const activeKey = activeTreeKey(next.activeSide);\n const located = findChainById(next[activeKey], next.caret.chainId);\n if (!located) {\n return session;\n }\n if (next.caret.index <= 0) {\n return session;\n }\n const previousNode = located.chain.nodes[next.caret.index - 1];\n if (!previousNode) {\n return session;\n }\n if (\n (previousNode.kind === 'delimiter' || previousNode.kind === 'frac' || previousNode.kind === 'sqrt' || previousNode.kind === 'env') &&\n next.selectedStructureNodeId !== previousNode.id\n ) {\n next.selectedStructureNodeId = previousNode.id;\n next.selectedNodeId = previousNode.id;\n appendDebug(next, 'deleteBackward', 'selected structure');\n return next;\n }\n if (\n !next.splitLeafTyping &&\n (previousNode.kind === 'char' || previousNode.kind === 'number') &&\n previousNode.expr.length > 1\n ) {\n const id = previousNode.id;\n const englishHit = findNodeById(next.englishTree, id);\n const arabicHit = findNodeById(next.arabicTree, id);\n if (englishHit && arabicHit) {\n if (previousNode.kind === 'number' && shouldReverseArabicNumber(next)) {\n englishHit.node.expr = englishHit.node.expr.slice(1);\n arabicHit.node.expr = arabicHit.node.expr.slice(1);\n } else {\n englishHit.node.expr = englishHit.node.expr.slice(0, -1);\n arabicHit.node.expr = arabicHit.node.expr.slice(0, -1);\n }\n markExprSync(next, id);\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'deleteBackward', 'trimmed leaf');\n return next;\n }\n }\n const removed = removeMirroredNodeById(next, previousNode.id);\n if (!removed) {\n return session;\n }\n next.caret.index = Math.max(0, next.caret.index - 1);\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'deleteBackward', 'removed node');\n return next;\n}\n\nexport function deleteForward(session: EditorSession): EditorSession {\n if (isSelectionActive(session.selection)) {\n const next = cloneEditorSession(session);\n applyDeleteSelectionRange(next);\n syncSelectionToCaret(next);\n appendDebug(next, 'deleteForward', 'deleted range');\n return next;\n }\n const next = cloneEditorSession(session);\n const activeKey = activeTreeKey(next.activeSide);\n const located = findChainById(next[activeKey], next.caret.chainId);\n if (!located) {\n return session;\n }\n if (next.caret.index >= located.chain.nodes.length) {\n return session;\n }\n const node = located.chain.nodes[next.caret.index];\n if (!node) {\n return session;\n }\n if (!next.splitLeafTyping && (node.kind === 'char' || node.kind === 'number') && node.expr.length > 1) {\n const englishHit = findNodeById(next.englishTree, node.id);\n const arabicHit = findNodeById(next.arabicTree, node.id);\n if (englishHit && arabicHit) {\n if (node.kind === 'number' && shouldReverseArabicNumber(next)) {\n englishHit.node.expr = englishHit.node.expr.slice(0, -1);\n arabicHit.node.expr = arabicHit.node.expr.slice(0, -1);\n } else {\n englishHit.node.expr = englishHit.node.expr.slice(1);\n arabicHit.node.expr = arabicHit.node.expr.slice(1);\n }\n markExprSync(next, node.id);\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'deleteForward', 'trimmed leaf');\n return next;\n }\n }\n const removed = removeMirroredNodeById(next, node.id);\n if (!removed) {\n return session;\n }\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'deleteForward', 'removed node');\n return next;\n}\n\nexport function setExpr(session: EditorSession, nodeId: string, expr: string): EditorSession {\n const next = cloneEditorSession(session);\n const activeKey = activeTreeKey(next.activeSide);\n const passiveKey = passiveTreeKey(next.activeSide);\n const activeNode = findNodeById(next[activeKey], nodeId);\n const passiveNode = findNodeById(next[passiveKey], nodeId);\n if (!activeNode || !passiveNode) {\n return session;\n }\n activeNode.node.expr = expr;\n markExprSync(next, nodeId);\n appendDebug(next, 'setExpr', nodeId);\n return next;\n}\n\nexport function createStarterSession(): EditorSession {\n const englishRoot = createEditorChain([createEditorNode('char', 'x')]);\n const arabicRoot = createEditorChain([createEditorNode('char', 'س')]);\n arabicRoot.id = englishRoot.id;\n arabicRoot.nodes[0].id = englishRoot.nodes[0].id;\n const session: EditorSession = {\n englishTree: englishRoot,\n arabicTree: arabicRoot,\n activeSide: 'arabic',\n splitLeafTyping: false,\n forceSplitNextLeaf: false,\n arabicReverseNumberTyping: true,\n currentCharacterFont: 'default',\n currentDigitForm: 'western',\n caret: {\n chainId: englishRoot.id,\n index: 1,\n },\n selection: null,\n selectedNodeId: englishRoot.nodes[0].id,\n selectedStructureNodeId: null,\n sync: {\n [englishRoot.nodes[0].id]: { expr: 'diverged' },\n },\n debugLog: [],\n };\n appendDebug(session, 'createStarterSession', 'initialized');\n return session;\n}\n\nexport function syncStateSummary(session: EditorSession): string {\n const diverged = Object.values(session.sync).filter((entry) => entry.expr === 'diverged').length;\n if (diverged === 0) {\n return 'متزامن';\n }\n return `يوجد ${String(diverged)} عناصر مختلفة`;\n}\n\nexport function setRenderError(session: EditorSession, message: string | null): EditorSession {\n const next = cloneEditorSession(session);\n if (next.debugLog.length === 0) {\n appendDebug(next, 'render', 'init');\n }\n const last = next.debugLog[next.debugLog.length - 1];\n next.debugLog[next.debugLog.length - 1] = {\n ...last,\n renderOk: message === null,\n renderError: message,\n };\n return next;\n}\n\nexport function activeSideLabel(side: EditorSide): string {\n return side === 'arabic' ? 'العربية' : 'الإنجليزية';\n}\n\nconst PASTE_OPERATORS = new Set(['+', '-', '*', '/', '=', '<', '>', '.']);\n\n/** Read-only: build a fragment from the active selection (or null when collapsed). */\nexport function copySelection(session: EditorSession): EditorFragment | null {\n return serializeSelection(session);\n}\n\n/** Cut: removes the selection and returns both the cleaned session and the fragment. */\nexport function cutSelection(\n session: EditorSession,\n): { session: EditorSession; fragment: EditorFragment | null } {\n const fragment = serializeSelection(session);\n if (!fragment) {\n return { session, fragment: null };\n }\n const next = cloneEditorSession(session);\n applyDeleteSelectionRange(next);\n syncSelectionToCaret(next);\n appendDebug(next, 'cutSelection', `count=${String(fragment.english.length)}`);\n return { session: next, fragment };\n}\n\n/**\n * Insert a structured fragment at the caret in the active chain. The fragment\n * is re-id'd so it can't collide with the live tree, mirrored EN/AR ids are\n * preserved, and sync entries are populated for every nested node.\n */\nexport function pasteFragment(session: EditorSession, fragment: EditorFragment): EditorSession {\n if (!fragment || !fragment.english.length || !fragment.arabic.length) {\n return session;\n }\n const next = cloneEditorSession(session);\n applyDeleteSelectionRange(next);\n\n const fresh = regenerateFragmentIds(fragment);\n const limit = Math.min(fresh.english.length, fresh.arabic.length);\n for (let i = 0; i < limit; i += 1) {\n const eng = fresh.english[i];\n const ar = fresh.arabic[i];\n insertMirroredNode(next, next.caret.chainId, next.caret.index, eng, ar);\n syncSubtreeRecursive(next, eng, ar);\n next.caret = { chainId: next.caret.chainId, index: next.caret.index + 1 };\n }\n next.selection = null;\n next.selectedStructureNodeId = null;\n syncSelectionToCaret(next);\n appendDebug(next, 'pasteFragment', `count=${String(limit)}`);\n return next;\n}\n\n/**\n * Plain-text fallback paste. Each character is dispatched through the existing\n * typing path so split/merge mode and selection-replace behave the same as\n * keyboard input. Whitespace is silently skipped in this MVP.\n */\nexport function pasteText(session: EditorSession, text: string): EditorSession {\n if (!text) {\n return session;\n }\n let s = session;\n let i = 0;\n while (i < text.length) {\n const ch = text[i]!;\n if (ch === '\\n' || ch === '\\r' || ch === '\\t' || ch === ' ') {\n if (!s.splitLeafTyping) {\n s = breakLeafTyping(s);\n }\n i += 1;\n continue;\n }\n if (/^[0-9]$/.test(ch)) {\n let j = i + 1;\n let sawDot = false;\n while (j < text.length) {\n const c = text[j]!;\n if (/^[0-9]$/.test(c)) {\n j += 1;\n continue;\n }\n if (c === '.' && !sawDot && j + 1 < text.length && /^[0-9]$/.test(text[j + 1]!)) {\n sawDot = true;\n j += 1;\n continue;\n }\n break;\n }\n s = insertNumber(s, text.slice(i, j));\n i = j;\n continue;\n }\n if (PASTE_OPERATORS.has(ch)) {\n s = insertOperator(s, ch);\n i += 1;\n continue;\n }\n s = insertChar(s, ch);\n i += 1;\n }\n return s;\n}\n","import type { EditorNode } from '../types.js';\nimport type { DigitFormId } from '../types.js';\nimport { formatDigits } from '../digits.js';\n\nexport function buildBaseNodeBody(node: EditorNode, digitForm: DigitFormId = 'western'): HTMLElement {\n const value = document.createElement('span');\n value.className = 'node-value';\n if (node.kind === 'char' && node.characterFont === 'takween') {\n value.classList.add('node-value--takween');\n } else if (node.kind === 'char' && node.characterFont === 'diwani') {\n value.classList.add('node-value--diwani');\n } else if (node.kind === 'char' && node.characterFont === 'diwaniOutline') {\n value.classList.add('node-value--diwani-outline');\n }\n value.textContent = node.expr === '' ? '□' : formatDigits(node.expr, digitForm);\n return value;\n}\n","import type { EditorChain, EditorNode } from '../types.js';\n\ntype BuildChain = (chain: EditorChain) => HTMLElement;\n\nexport function buildNodeScripts(node: EditorNode, buildChain: BuildChain): HTMLElement | null {\n const hasScripts = Boolean(node.superscript) || Boolean(node.subscript);\n if (!hasScripts) {\n return null;\n }\n\n const scripts = document.createElement('span');\n scripts.className = 'scripts';\n if (node.superscript && node.subscript) {\n scripts.classList.add('scripts--both');\n } else if (node.superscript) {\n scripts.classList.add('scripts--sup-only');\n } else {\n scripts.classList.add('scripts--sub-only');\n }\n\n if (node.superscript) {\n const supBox = document.createElement('span');\n supBox.className = 'script-box script-box--sup';\n supBox.appendChild(buildChain(node.superscript));\n scripts.appendChild(supBox);\n }\n if (node.subscript) {\n const subBox = document.createElement('span');\n subBox.className = 'script-box script-box--sub';\n subBox.appendChild(buildChain(node.subscript));\n scripts.appendChild(subBox);\n }\n\n return scripts;\n}\n","import { buildBaseNodeBody } from './base.js';\nimport { buildDelimiterNodeBody } from './delimiter.js';\nimport { buildFracNodeBody } from './frac.js';\nimport { buildSqrtNodeBody } from './sqrt.js';\nimport { buildMatrixEnvNodeBody } from './env.js';\nimport { buildAtomicCommandNodeBody } from './atomicCommand.js';\nimport { buildAtomicOperatorCommandNodeBody } from './atomicCommandsOperators.js';\nimport { buildNodeScripts } from './scripts.js';\nimport type { DigitFormId, EditorChain, EditorNode, EditorSide } from '../types.js';\n\ntype BuildChain = (chain: EditorChain) => HTMLElement;\n\nexport function buildNodeBody(node: EditorNode, buildChain: BuildChain, side: EditorSide, digitForm: DigitFormId = 'western'): HTMLElement {\n if (node.kind === 'delimiter') {\n return buildDelimiterNodeBody(node, buildChain);\n }\n if (node.kind === 'frac') {\n return buildFracNodeBody(node, buildChain);\n }\n if (node.kind === 'sqrt') {\n return buildSqrtNodeBody(node, buildChain, side);\n }\n if (node.kind === 'env') {\n return buildMatrixEnvNodeBody(node, buildChain, side);\n }\n if (node.kind === 'atomicCommand') {\n return buildAtomicCommandNodeBody(node, side);\n }\n if (node.kind === 'atomicOperatorCommand') {\n return buildAtomicOperatorCommandNodeBody(node, side);\n }\n return buildBaseNodeBody(node, digitForm);\n}\n\nexport { buildNodeScripts };\nexport { DELIMITER_CSS } from './delimiter.js';\nexport { FRAC_CSS } from './frac.js';\nexport { SQRT_CSS } from './sqrt.js';\nexport { MATRIX_ENV_CSS } from './env.js';\nexport { ATOMIC_COMMAND_CSS } from './atomicCommand.js';\nexport { ATOMIC_OPERATOR_COMMAND_CSS } from './atomicCommandsOperators.js';\n","import { buildNodeBody, buildNodeScripts } from './display/index.js';\nimport { spacingTooltipForSide } from './display/atomicCommand.js';\nimport { BUTEX_FRAGMENT_MIME, deserializeFragment, fragmentToPlainText } from './clipboard.js';\nimport { activeTreeKey } from './traversal.js';\nimport { createUndoRedoStacks, pushUndoRedoSnapshot, restoreRedo, restoreUndo, undoRedoCanRedo, undoRedoCanUndo } from './history.js';\nimport {\n activeSideLabel,\n addSub,\n addSup,\n breakLeafTyping,\n copySelection,\n createStarterSession,\n cutSelection,\n deleteBackward,\n deleteForward,\n deleteStructure,\n insertAlignedEnv,\n insertArrayEnv,\n insertChar,\n insertDelimiterPair,\n insertFraction,\n insertMatrixEnv,\n insertSqrt,\n insertAtomicCommand,\n insertAtomicOperatorCommand,\n insertNumber,\n insertOperator,\n horizontalCaretDelta,\n moveCaretHorizontal,\n moveCaretVertical,\n pasteFragment,\n pasteText,\n removeSub,\n removeSup,\n addMatrixColumn,\n addMatrixRow,\n removeMatrixColumn,\n removeMatrixRow,\n selectNode,\n setArrayColumnAlignment,\n setCaret,\n setMatrixEnvStyle,\n setSplitLeafTyping,\n setArabicReverseNumberTyping,\n setCurrentCharacterFont,\n setCurrentDigitForm,\n toggleTakweenCharacterFont,\n switchSide,\n syncStateSummary,\n} from './state.js';\nimport { clearSelection, extendSelectionByStep, setSelectionFromMouse } from './selection.js';\nimport type { CharacterFontId, DigitFormId, EditorChain, EditorNode, EditorSession, EnvColumnAlignment, MatrixEnvStyle } from './types.js';\nimport { atomicCommandSpec, isSpacingCommandSpec, type AtomicCommandId } from './atomicCommands.js';\nimport type { AtomicOperatorCommandId } from './atomicCommandsOperators.js';\n\ntype SessionUpdater = (session: EditorSession) => EditorSession;\n\ntype RuntimeButtonElements = {\n undoBtn?: HTMLButtonElement | null;\n redoBtn?: HTMLButtonElement | null;\n copyBtn?: HTMLButtonElement | null;\n cutBtn?: HTMLButtonElement | null;\n splitTypingBtn?: HTMLButtonElement | null;\n characterFontBtn?: HTMLButtonElement | null;\n digitFormBtn?: HTMLButtonElement | null;\n};\n\nexport type EditorRuntimeOptions = {\n surfaceEl: HTMLElement;\n initialSession?: EditorSession;\n buttonElements?: RuntimeButtonElements;\n outsidePointerIgnoreSelectors?: string[];\n onSessionChange?: (session: EditorSession) => void;\n};\n\nexport type EditorRuntimeApi = {\n render: () => void;\n destroy: () => void;\n getSession: () => EditorSession;\n setSession: (next: EditorSession) => void;\n performUndo: () => void;\n performRedo: () => void;\n performCopy: () => Promise<void>;\n performCut: () => Promise<void>;\n performPaste: () => Promise<void>;\n toggleSide: () => void;\n toggleSplitLeafTyping: () => void;\n toggleArabicReverseNumberTyping: () => void;\n toggleTakweenCharacterFont: () => void;\n setCurrentCharacterFont: (fontId: CharacterFontId) => void;\n setCurrentDigitForm: (digitForm: DigitFormId) => void;\n insertDelimiterByKind: (kind: 'paren' | 'bracket' | 'brace') => void;\n insertFraction: () => void;\n insertMatrixEnv: (style: MatrixEnvStyle, rows: number, columns: number) => void;\n insertArrayEnv: (rows: number, columns: number) => void;\n insertAlignedEnv: (rows: number, columns: number) => void;\n insertSqrt: () => void;\n insertAtomicCommand: (commandId: AtomicCommandId) => void;\n insertAtomicOperatorCommand: (commandId: AtomicOperatorCommandId) => void;\n addSup: () => void;\n addSub: () => void;\n removeSup: () => void;\n removeSub: () => void;\n setMatrixEnvStyle: (style: MatrixEnvStyle) => void;\n setArrayColumnAlignment: (columnIndex: number, alignment: EnvColumnAlignment) => void;\n addMatrixRow: () => void;\n removeMatrixRow: () => void;\n addMatrixColumn: () => void;\n removeMatrixColumn: () => void;\n deleteStructure: () => void;\n};\n\nexport function createEditorRuntime(options: EditorRuntimeOptions): EditorRuntimeApi {\n const { surfaceEl } = options;\n const buttonElements = options.buttonElements ?? {};\n const outsidePointerIgnoreSelectors = options.outsidePointerIgnoreSelectors ?? [];\n let session = options.initialSession ?? createStarterSession();\n const undoRedo = createUndoRedoStacks();\n let lastInternalFragment: unknown = null;\n let initialKeyboardFocusPending = true;\n let dragSelecting = false;\n let dragChainId: string | null = null;\n let dragChanged = false;\n\n function notifySessionChange(): void {\n options.onSessionChange?.(session);\n }\n\n function isOperator(char: string): boolean {\n return ['+', '-', '*', '/', '=', '<', '>', '.'].includes(char);\n }\n\n function isSlotInSelection(chainId: string, index: number): boolean {\n const sel = session.selection;\n if (!sel || sel.chainId !== chainId || sel.anchorIndex === sel.focusIndex) {\n return false;\n }\n const start = Math.min(sel.anchorIndex, sel.focusIndex);\n const end = Math.max(sel.anchorIndex, sel.focusIndex);\n return index >= start && index <= end;\n }\n\n function isNodeInSelection(chainId: string, index: number): boolean {\n const sel = session.selection;\n if (!sel || sel.chainId !== chainId || sel.anchorIndex === sel.focusIndex) {\n return false;\n }\n const start = Math.min(sel.anchorIndex, sel.focusIndex);\n const end = Math.max(sel.anchorIndex, sel.focusIndex);\n return index >= start && index < end;\n }\n\n function refreshUndoRedoButtons(): void {\n if (buttonElements.undoBtn) {\n buttonElements.undoBtn.disabled = !undoRedoCanUndo(undoRedo);\n const arabicEquation = session.activeSide === 'arabic';\n const undoArrow = arabicEquation ? '\\u21B7' : '\\u21B6';\n const vs = '\\uFE0E';\n buttonElements.undoBtn.textContent = `${undoArrow}${vs}`;\n buttonElements.undoBtn.title = 'تراجع';\n buttonElements.undoBtn.setAttribute('aria-label', 'تراجع');\n }\n if (buttonElements.redoBtn) {\n buttonElements.redoBtn.disabled = !undoRedoCanRedo(undoRedo);\n const arabicEquation = session.activeSide === 'arabic';\n const redoArrow = arabicEquation ? '\\u21B6' : '\\u21B7';\n const vs = '\\uFE0E';\n buttonElements.redoBtn.textContent = `${redoArrow}${vs}`;\n buttonElements.redoBtn.title = 'إعادة';\n buttonElements.redoBtn.setAttribute('aria-label', 'إعادة');\n }\n }\n\n function refreshClipboardButtons(): void {\n const hasSelection = Boolean(\n session.selection && session.selection.anchorIndex !== session.selection.focusIndex,\n );\n if (buttonElements.copyBtn) {\n buttonElements.copyBtn.disabled = !hasSelection;\n }\n if (buttonElements.cutBtn) {\n buttonElements.cutBtn.disabled = !hasSelection;\n }\n }\n\n function refreshSplitTypingButton(): void {\n if (!buttonElements.splitTypingBtn) {\n return;\n }\n const mergeOn = !session.splitLeafTyping;\n buttonElements.splitTypingBtn.textContent = mergeOn ? 'سصع' : 'س ص ع';\n buttonElements.splitTypingBtn.title = mergeOn ? 'تعطيل دمج الحروف' : 'تفعيل دمج الحروف';\n buttonElements.splitTypingBtn.setAttribute('aria-label', mergeOn ? 'تعطيل دمج الحروف' : 'تفعيل دمج الحروف');\n buttonElements.splitTypingBtn.setAttribute('aria-pressed', mergeOn ? 'true' : 'false');\n buttonElements.splitTypingBtn.classList.toggle('accent', mergeOn);\n }\n\n function refreshCharacterFontButton(): void {\n if (!buttonElements.characterFontBtn) {\n return;\n }\n const takweenOn = (session.currentCharacterFont ?? 'default') === 'takween';\n buttonElements.characterFontBtn.textContent = 'تك';\n buttonElements.characterFontBtn.title = takweenOn ? 'الكتابة بالخط الافتراضي' : 'الكتابة بخط تكوين';\n buttonElements.characterFontBtn.setAttribute('aria-label', takweenOn ? 'الكتابة بالخط الافتراضي' : 'الكتابة بخط تكوين');\n buttonElements.characterFontBtn.setAttribute('aria-pressed', takweenOn ? 'true' : 'false');\n buttonElements.characterFontBtn.classList.toggle('accent', takweenOn);\n }\n\n function refreshDigitFormSelect(): void {\n if (!buttonElements.digitFormBtn) {\n return;\n }\n const digitForm = session.currentDigitForm ?? 'western';\n const label = digitForm === 'arabicIndic' ? '٤٥٦' : digitForm === 'persianIndic' ? '۴۵۶' : '456';\n buttonElements.digitFormBtn.textContent = label;\n buttonElements.digitFormBtn.title = 'اختيار شكل الأرقام';\n buttonElements.digitFormBtn.setAttribute('aria-label', 'اختيار شكل الأرقام');\n buttonElements.digitFormBtn.dataset.digitForm = digitForm;\n }\n\n function applyStructural(updater: SessionUpdater): void {\n pushUndoRedoSnapshot(undoRedo, session);\n session = updater(session);\n render();\n }\n\n function applyTransient(updater: SessionUpdater): void {\n session = updater(session);\n render();\n }\n\n async function writeFragmentToClipboard(fragment: unknown): Promise<void> {\n lastInternalFragment = fragment;\n const json = JSON.stringify(fragment);\n const text = fragmentToPlainText(fragment as never, session.activeSide);\n try {\n if (typeof ClipboardItem !== 'undefined' && navigator.clipboard && navigator.clipboard.write) {\n const item = new ClipboardItem({\n [BUTEX_FRAGMENT_MIME]: new Blob([json], { type: BUTEX_FRAGMENT_MIME }),\n 'text/plain': new Blob([text], { type: 'text/plain' }),\n });\n await navigator.clipboard.write([item]);\n return;\n }\n } catch {\n /* fall through to text-only */\n }\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n /* clipboard not available; lastInternalFragment still allows in-app paste */\n }\n }\n\n async function readClipboardForPaste(): Promise<{ kind: 'fragment'; fragment: unknown } | { kind: 'text'; text: string } | null> {\n try {\n if (navigator.clipboard && navigator.clipboard.read) {\n const items = await navigator.clipboard.read();\n for (const item of items) {\n if (item.types.includes(BUTEX_FRAGMENT_MIME)) {\n const blob = await item.getType(BUTEX_FRAGMENT_MIME);\n const raw = await blob.text();\n const frag = deserializeFragment(raw);\n if (frag) {\n return { kind: 'fragment', fragment: frag };\n }\n }\n }\n }\n } catch {\n /* fall through */\n }\n if (lastInternalFragment) {\n return { kind: 'fragment', fragment: lastInternalFragment };\n }\n try {\n const text = await navigator.clipboard.readText();\n if (text) {\n const frag = deserializeFragment(text);\n if (frag) {\n return { kind: 'fragment', fragment: frag };\n }\n return { kind: 'text', text };\n }\n } catch {\n /* nothing available */\n }\n return null;\n }\n\n function clearSelectionAndNodeHighlights(): void {\n applyTransient((prev) => selectNode(clearSelection(prev), null));\n }\n\n function selectAllInActiveRoot(prev: EditorSession): EditorSession {\n const activeTree = prev[activeTreeKey(prev.activeSide)];\n if (activeTree.nodes.length === 0) {\n return setCaret(prev, activeTree.id, 0);\n }\n const anchored = setSelectionFromMouse(prev, activeTree.id, 0, 'anchor');\n return setSelectionFromMouse(anchored, activeTree.id, activeTree.nodes.length, 'focus');\n }\n\n function startDragSelection(chainId: string, slotIndex: number): void {\n dragSelecting = true;\n dragChainId = chainId;\n dragChanged = false;\n applyTransient((prev) => setSelectionFromMouse(prev, chainId, slotIndex, 'anchor'));\n }\n\n function updateDragFocus(chainId: string, slotIndex: number): void {\n if (!dragSelecting || chainId !== dragChainId) {\n return;\n }\n dragChanged = true;\n applyTransient((prev) => setSelectionFromMouse(prev, chainId, slotIndex, 'focus'));\n }\n\n function endDragSelection(): void {\n dragSelecting = false;\n dragChainId = null;\n }\n\n function resolveRootSlotFromX(clientX: number): { chainId: string; slotIndex: number } {\n const activeTree = session[activeTreeKey(session.activeSide)];\n const rootSlots = Array.from(surfaceEl.querySelectorAll('.slot')).filter(\n (slot) => slot instanceof HTMLElement && slot.dataset.chainId === activeTree.id,\n );\n let nearest: { chainId: string; slotIndex: number } | null = null;\n let nearestDistance = Number.POSITIVE_INFINITY;\n for (const slot of rootSlots) {\n if (!(slot instanceof HTMLElement) || !slot.dataset.index) {\n continue;\n }\n const rect = slot.getBoundingClientRect();\n const center = rect.left + rect.width / 2;\n const distance = Math.abs(clientX - center);\n if (distance < nearestDistance) {\n nearestDistance = distance;\n nearest = {\n chainId: activeTree.id,\n slotIndex: Number(slot.dataset.index),\n };\n }\n }\n if (nearest) {\n return nearest;\n }\n return {\n chainId: activeTree.id,\n slotIndex: activeTree.nodes.length,\n };\n }\n\n function resolveSelectionSlotFromPoint(clientX: number, clientY: number): { chainId: string; slotIndex: number } | null {\n const hit = document.elementFromPoint(clientX, clientY);\n if (!hit) {\n return null;\n }\n const slot = hit.closest('.slot');\n if (slot && slot instanceof HTMLElement && slot.dataset.chainId && slot.dataset.index) {\n return {\n chainId: slot.dataset.chainId,\n slotIndex: Number(slot.dataset.index),\n };\n }\n const node = hit.closest('.node');\n if (node && node instanceof HTMLElement && node.dataset.chainId && node.dataset.nodeIndex) {\n const nodeIndex = Number(node.dataset.nodeIndex);\n const rect = node.getBoundingClientRect();\n const afterNode = clientX >= rect.left + rect.width / 2;\n return {\n chainId: node.dataset.chainId,\n slotIndex: afterNode ? nodeIndex + 1 : nodeIndex,\n };\n }\n if (!surfaceEl.contains(hit)) {\n return null;\n }\n return resolveRootSlotFromX(clientX);\n }\n\n function updateDragFocusFromPoint(clientX: number, clientY: number): void {\n if (!dragSelecting) {\n return;\n }\n const resolved = resolveSelectionSlotFromPoint(clientX, clientY);\n if (!resolved) {\n return;\n }\n updateDragFocus(resolved.chainId, resolved.slotIndex);\n }\n\n function renderSlot(chainId: string, index: number): HTMLElement {\n const slot = document.createElement('span');\n slot.className = 'slot';\n slot.dataset.chainId = chainId;\n slot.dataset.index = String(index);\n if (isSlotInSelection(chainId, index)) {\n slot.classList.add('range-highlight');\n }\n slot.addEventListener('mousedown', (event) => {\n if (event.button !== 0) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n startDragSelection(chainId, index);\n surfaceEl.focus();\n });\n slot.addEventListener('click', (event) => {\n if (dragChanged) {\n event.preventDefault();\n event.stopPropagation();\n dragChanged = false;\n return;\n }\n applyTransient((prev) => setCaret(prev, chainId, index));\n surfaceEl.focus();\n });\n if (session.caret.chainId === chainId && session.caret.index === index) {\n const caret = document.createElement('span');\n caret.className = 'caret';\n slot.appendChild(caret);\n }\n return slot;\n }\n\n function buildNode(node: EditorNode, chainId: string, indexInChain: number): HTMLElement {\n const nodeEl = document.createElement('span');\n nodeEl.className = 'node';\n nodeEl.dataset.chainId = chainId;\n nodeEl.dataset.nodeIndex = String(indexInChain);\n const atomicSpec = node.kind === 'atomicCommand' ? atomicCommandSpec(node.expr) : null;\n if (isSpacingCommandSpec(atomicSpec)) {\n nodeEl.classList.add('node--atomic-spacing');\n nodeEl.title = spacingTooltipForSide(atomicSpec, session.activeSide);\n }\n if (session.selectedNodeId === node.id || session.selectedStructureNodeId === node.id) {\n nodeEl.classList.add('selected');\n }\n if (isNodeInSelection(chainId, indexInChain)) {\n nodeEl.classList.add('range-highlight');\n }\n nodeEl.addEventListener('mousedown', (event) => {\n if (event.button !== 0) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n startDragSelection(chainId, indexInChain);\n surfaceEl.focus();\n });\n nodeEl.addEventListener('click', (event) => {\n if (dragChanged) {\n event.preventDefault();\n event.stopPropagation();\n dragChanged = false;\n return;\n }\n event.stopPropagation();\n applyTransient((prev) => selectNode(prev, node.id));\n surfaceEl.focus();\n });\n\n const body = document.createElement('span');\n body.className = 'node-body';\n body.appendChild(buildNodeBody(node, buildChain, session.activeSide, session.currentDigitForm ?? 'western'));\n nodeEl.appendChild(body);\n\n const scripts = buildNodeScripts(node, buildChain);\n if (scripts) {\n nodeEl.appendChild(scripts);\n }\n return nodeEl;\n }\n\n function buildChain(chain: EditorChain): HTMLElement {\n const chainEl = document.createElement('span');\n chainEl.className = 'chain';\n for (let i = 0; i <= chain.nodes.length; i += 1) {\n chainEl.appendChild(renderSlot(chain.id, i));\n if (i < chain.nodes.length) {\n chainEl.appendChild(buildNode(chain.nodes[i], chain.id, i));\n }\n }\n return chainEl;\n }\n\n function render(): void {\n refreshSplitTypingButton();\n refreshCharacterFontButton();\n refreshDigitFormSelect();\n refreshUndoRedoButtons();\n refreshClipboardButtons();\n surfaceEl.classList.remove('surface--arabic', 'surface--english');\n surfaceEl.classList.add(session.activeSide === 'english' ? 'surface--english' : 'surface--arabic');\n surfaceEl.innerHTML = '';\n const activeTree = session[activeTreeKey(session.activeSide)];\n surfaceEl.appendChild(buildChain(activeTree));\n if (initialKeyboardFocusPending) {\n requestAnimationFrame(() => surfaceEl.focus());\n initialKeyboardFocusPending = false;\n }\n notifySessionChange();\n }\n\n async function performCopy(): Promise<void> {\n const fragment = copySelection(session);\n if (!fragment) {\n return;\n }\n await writeFragmentToClipboard(fragment);\n }\n\n async function performCut(): Promise<void> {\n const fragment = copySelection(session);\n if (!fragment) {\n return;\n }\n applyStructural((prev) => cutSelection(prev).session);\n await writeFragmentToClipboard(fragment);\n }\n\n async function performPaste(): Promise<void> {\n const payload = await readClipboardForPaste();\n if (!payload) {\n return;\n }\n if (payload.kind === 'fragment') {\n applyStructural((prev) => pasteFragment(prev, payload.fragment as never));\n return;\n }\n applyStructural((prev) => pasteText(prev, payload.text));\n }\n\n function performUndo(): void {\n const restored = restoreUndo(undoRedo, session);\n if (!restored) {\n return;\n }\n session = restored;\n render();\n surfaceEl.focus();\n }\n\n function performRedo(): void {\n const restored = restoreRedo(undoRedo, session);\n if (!restored) {\n return;\n }\n session = restored;\n render();\n surfaceEl.focus();\n }\n\n function onKeyDown(event: KeyboardEvent): void {\n const shortcutMod = event.ctrlKey || event.metaKey;\n const keyLower = typeof event.key === 'string' ? event.key.toLowerCase() : '';\n if (shortcutMod && !event.altKey && keyLower === 'z') {\n event.preventDefault();\n if (event.shiftKey) {\n performRedo();\n } else {\n performUndo();\n }\n return;\n }\n if (shortcutMod && !event.altKey && !event.shiftKey && keyLower === 'y') {\n event.preventDefault();\n performRedo();\n return;\n }\n if (shortcutMod && !event.altKey && !event.shiftKey && keyLower === 'c') {\n event.preventDefault();\n void performCopy();\n return;\n }\n if (shortcutMod && !event.altKey && !event.shiftKey && keyLower === 'x') {\n event.preventDefault();\n void performCut();\n return;\n }\n if (shortcutMod && !event.altKey && !event.shiftKey && keyLower === 'v') {\n event.preventDefault();\n void performPaste();\n return;\n }\n if (shortcutMod && !event.altKey && !event.shiftKey && keyLower === 'a') {\n event.preventDefault();\n applyTransient((prev) => selectAllInActiveRoot(prev));\n return;\n }\n\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n if (event.shiftKey) {\n applyTransient((prev) => extendSelectionByStep(prev, horizontalCaretDelta(prev, 'left')));\n } else {\n applyTransient((prev) => moveCaretHorizontal(prev, 'left'));\n }\n return;\n }\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n if (event.shiftKey) {\n applyTransient((prev) => extendSelectionByStep(prev, horizontalCaretDelta(prev, 'right')));\n } else {\n applyTransient((prev) => moveCaretHorizontal(prev, 'right'));\n }\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n applyTransient((prev) => moveCaretVertical(prev, 'up'));\n return;\n }\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n applyTransient((prev) => moveCaretVertical(prev, 'down'));\n return;\n }\n if (event.key === 'Backspace') {\n event.preventDefault();\n applyStructural((prev) => deleteBackward(prev));\n return;\n }\n if (event.key === 'Delete') {\n event.preventDefault();\n applyStructural((prev) => deleteForward(prev));\n return;\n }\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n const char = event.key;\n if (char === ' ') {\n if (!session.splitLeafTyping) {\n applyStructural((prev) => breakLeafTyping(prev));\n }\n return;\n }\n if (/^[0-9]$/.test(char)) {\n applyStructural((prev) => insertNumber(prev, char));\n return;\n }\n if (isOperator(char)) {\n applyStructural((prev) => insertOperator(prev, char));\n return;\n }\n applyStructural((prev) => insertChar(prev, char));\n }\n }\n\n function isShortcutOnlyEvent(event: KeyboardEvent): boolean {\n if (!(event.ctrlKey || event.metaKey) || event.altKey) {\n return false;\n }\n const keyLower = typeof event.key === 'string' ? event.key.toLowerCase() : '';\n return (\n keyLower === 'c' ||\n keyLower === 'x' ||\n keyLower === 'v' ||\n keyLower === 'z' ||\n keyLower === 'y' ||\n keyLower === 'a'\n );\n }\n\n function shouldIgnoreDocumentShortcutTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n if (target.isContentEditable) {\n return true;\n }\n const tag = target.tagName.toLowerCase();\n return tag === 'input' || tag === 'textarea' || tag === 'select';\n }\n\n function onDocumentKeyDown(event: KeyboardEvent): void {\n if (event.defaultPrevented) {\n return;\n }\n if (!isShortcutOnlyEvent(event)) {\n return;\n }\n if (shouldIgnoreDocumentShortcutTarget(event.target)) {\n return;\n }\n onKeyDown(event);\n }\n\n function onDocumentMouseMove(event: MouseEvent): void {\n if (!dragSelecting) {\n return;\n }\n if ((event.buttons & 1) !== 1) {\n endDragSelection();\n return;\n }\n updateDragFocusFromPoint(event.clientX, event.clientY);\n }\n\n function onSurfaceMouseDown(event: MouseEvent): void {\n if (event.button !== 0) {\n return;\n }\n const resolved = resolveSelectionSlotFromPoint(event.clientX, event.clientY);\n if (!resolved) {\n return;\n }\n event.preventDefault();\n startDragSelection(resolved.chainId, resolved.slotIndex);\n surfaceEl.focus();\n }\n\n function onSurfaceClick(event: MouseEvent): void {\n if (dragChanged) {\n event.preventDefault();\n dragChanged = false;\n return;\n }\n if (event.target instanceof HTMLElement && event.target.closest('.slot, .node')) {\n return;\n }\n const resolved = resolveSelectionSlotFromPoint(event.clientX, event.clientY);\n if (resolved) {\n applyTransient((prev) => setCaret(prev, resolved.chainId, resolved.slotIndex));\n } else {\n clearSelectionAndNodeHighlights();\n }\n surfaceEl.focus();\n }\n\n function onDocumentPointerDown(event: PointerEvent): void {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n if (surfaceEl.contains(target)) {\n return;\n }\n if (outsidePointerIgnoreSelectors.some((selector) => target.closest(selector))) {\n return;\n }\n clearSelectionAndNodeHighlights();\n }\n\n surfaceEl.addEventListener('keydown', onKeyDown);\n document.addEventListener('keydown', onDocumentKeyDown);\n document.addEventListener('mouseup', endDragSelection);\n document.addEventListener('mouseleave', endDragSelection);\n document.addEventListener('mousemove', onDocumentMouseMove);\n surfaceEl.addEventListener('mousedown', onSurfaceMouseDown);\n surfaceEl.addEventListener('click', onSurfaceClick);\n document.addEventListener('pointerdown', onDocumentPointerDown);\n\n const api: EditorRuntimeApi = {\n render,\n destroy: () => {\n surfaceEl.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('keydown', onDocumentKeyDown);\n document.removeEventListener('mouseup', endDragSelection);\n document.removeEventListener('mouseleave', endDragSelection);\n document.removeEventListener('mousemove', onDocumentMouseMove);\n surfaceEl.removeEventListener('mousedown', onSurfaceMouseDown);\n surfaceEl.removeEventListener('click', onSurfaceClick);\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n },\n getSession: () => session,\n setSession: (next) => {\n session = next;\n render();\n },\n performUndo,\n performRedo,\n performCopy,\n performCut,\n performPaste,\n toggleSide: () => {\n applyTransient((prev) => switchSide(prev));\n surfaceEl.focus();\n },\n toggleSplitLeafTyping: () => {\n applyStructural((prev) => setSplitLeafTyping(prev, !prev.splitLeafTyping));\n surfaceEl.focus();\n },\n toggleArabicReverseNumberTyping: () => {\n applyStructural((prev) => setArabicReverseNumberTyping(prev, !prev.arabicReverseNumberTyping));\n surfaceEl.focus();\n },\n toggleTakweenCharacterFont: () => {\n applyTransient((prev) => toggleTakweenCharacterFont(prev));\n surfaceEl.focus();\n },\n setCurrentCharacterFont: (fontId) => {\n applyTransient((prev) => setCurrentCharacterFont(prev, fontId));\n surfaceEl.focus();\n },\n setCurrentDigitForm: (digitForm) => {\n applyStructural((prev) => setCurrentDigitForm(prev, digitForm));\n surfaceEl.focus();\n },\n insertDelimiterByKind: (kind) => {\n if (kind === 'paren') {\n applyStructural((prev) => insertDelimiterPair(prev, '\\\\left(', '\\\\right)'));\n } else if (kind === 'bracket') {\n applyStructural((prev) => insertDelimiterPair(prev, '\\\\left[', '\\\\right]'));\n } else {\n applyStructural((prev) => insertDelimiterPair(prev, '\\\\left\\\\{', '\\\\right\\\\}'));\n }\n surfaceEl.focus();\n },\n insertFraction: () => {\n applyStructural((prev) => insertFraction(prev));\n surfaceEl.focus();\n },\n insertMatrixEnv: (style, rows, columns) => {\n applyStructural((prev) => insertMatrixEnv(prev, style, rows, columns));\n surfaceEl.focus();\n },\n insertArrayEnv: (rows, columns) => {\n applyStructural((prev) => insertArrayEnv(prev, rows, columns));\n surfaceEl.focus();\n },\n insertAlignedEnv: (rows, columns) => {\n applyStructural((prev) => insertAlignedEnv(prev, rows, columns));\n surfaceEl.focus();\n },\n insertSqrt: () => {\n applyStructural((prev) => insertSqrt(prev));\n surfaceEl.focus();\n },\n insertAtomicCommand: (commandId) => {\n applyStructural((prev) => insertAtomicCommand(prev, commandId));\n surfaceEl.focus();\n },\n insertAtomicOperatorCommand: (commandId) => {\n applyStructural((prev) => insertAtomicOperatorCommand(prev, commandId));\n surfaceEl.focus();\n },\n addSup: () => {\n applyStructural((prev) => addSup(prev));\n surfaceEl.focus();\n },\n addSub: () => {\n applyStructural((prev) => addSub(prev));\n surfaceEl.focus();\n },\n removeSup: () => {\n applyStructural((prev) => removeSup(prev));\n surfaceEl.focus();\n },\n removeSub: () => {\n applyStructural((prev) => removeSub(prev));\n surfaceEl.focus();\n },\n setMatrixEnvStyle: (style) => {\n applyStructural((prev) => setMatrixEnvStyle(prev, style));\n },\n setArrayColumnAlignment: (columnIndex, alignment) => {\n applyStructural((prev) => setArrayColumnAlignment(prev, columnIndex, alignment));\n },\n addMatrixRow: () => {\n applyStructural((prev) => addMatrixRow(prev));\n },\n removeMatrixRow: () => {\n applyStructural((prev) => removeMatrixRow(prev));\n },\n addMatrixColumn: () => {\n applyStructural((prev) => addMatrixColumn(prev));\n },\n removeMatrixColumn: () => {\n applyStructural((prev) => removeMatrixColumn(prev));\n },\n deleteStructure: () => {\n applyStructural((prev) => deleteStructure(prev));\n surfaceEl.focus();\n },\n };\n\n render();\n return api;\n}\n\nexport function runtimeStatusText(session: EditorSession): { activeSide: string; sync: string } {\n return {\n activeSide: `الجانب النشط: ${activeSideLabel(session.activeSide)}`,\n sync: `حالة المزامنة: ${syncStateSummary(session)}`,\n };\n}\n","/**\n * Typed error from {@link parseBuTeX} when known Arabic commands are malformed.\n */\nexport class BuTeXParserError extends Error {\n constructor(\n message: string,\n public readonly offset: number\n ) {\n super(message);\n this.name = 'BuTeXParserError';\n }\n}\n","/** MVP Arabic surface commands mapped by normalized parser dispatch */\n\nimport { ATOMIC_COMMANDS } from '../editor/atomicCommands.js';\n\nexport const CMD_ROOT_AR = 'جذر';\nexport const CMD_FRAC_AR = 'كسر';\nexport const CMD_COS_AR = 'جتا';\n\nexport const ARABIC_ATOMIC_COMMAND_TEX: Record<string, string> = Object.fromEntries(\n Object.values(ATOMIC_COMMANDS).map((command) => [command.arabicLabel, command.arabicTex])\n);\n\nexport function arabicAtomicCommandTex(name: string): string | null {\n return ARABIC_ATOMIC_COMMAND_TEX[name] ?? null;\n}\n","/**\n * Wrap a literal segment if it consists only of Arabic script letters (no digits/Latin/backslash).\n * Used for bare identifiers like `س` inside `{...}`.\n */\nexport function wrapArabicLiteralSegment(segment: string): string {\n if (segment.length === 0) {\n return segment;\n }\n // Unicode Script=Arabic (covers presentation forms used by Arabic text)\n if (/^\\p{Script=Arabic}+$/u.test(segment)) {\n return `\\\\text{${segment}}`;\n }\n return segment;\n}\n","/**\n * Character-level helpers for BuTeX parsing (expand later into full tokenizer).\n */\n\nexport function readLatinCommandLetters(s: string, start: number): { end: number; value: string } {\n let i = start;\n while (i < s.length && /[a-zA-Z]/.test(s[i]!)) {\n i++;\n }\n return { end: i, value: s.slice(start, i) };\n}\n\nexport function readArabicCommandLetters(s: string, start: number): { end: number; value: string } {\n let i = start;\n while (\n i < s.length &&\n /^\\p{Script=Arabic}$/u.test(s[i]!)\n ) {\n i++;\n }\n return { end: i, value: s.slice(start, i) };\n}\n","import { arabicAtomicCommandTex, CMD_FRAC_AR, CMD_ROOT_AR } from './commands.js';\nimport { BuTeXParserError } from './errors.js';\nimport { wrapArabicLiteralSegment } from './emit.js';\nimport { readArabicCommandLetters, readLatinCommandLetters } from './tokenizer.js';\n\nexport interface ParserState {\n s: string;\n i: number;\n}\n\nfunction peek(st: ParserState): string {\n return st.s[st.i] ?? '';\n}\n\nfunction readCommandName(st: ParserState): string {\n const c = peek(st);\n if (/[a-zA-Z]/.test(c)) {\n const { end, value } = readLatinCommandLetters(st.s, st.i);\n st.i = end;\n return value;\n }\n if (/^\\p{Script=Arabic}$/u.test(c)) {\n const { end, value } = readArabicCommandLetters(st.s, st.i);\n st.i = end;\n return value;\n }\n return '';\n}\n\nfunction readBracketContent(st: ParserState): string {\n const start = st.i;\n while (st.i < st.s.length && st.s[st.i] !== ']') {\n st.i++;\n }\n if (st.i >= st.s.length) {\n throw new BuTeXParserError('Unclosed \"[\" in optional argument', start);\n }\n const inner = st.s.slice(start, st.i);\n st.i++;\n return inner;\n}\n\nfunction parseJuthr(st: ParserState): string {\n let optional = '';\n if (peek(st) === '[') {\n st.i++;\n optional = `[${readBracketContent(st)}]`;\n }\n if (peek(st) !== '{') {\n throw new BuTeXParserError('\\\\جذر expects \"{\" radicand', st.i);\n }\n st.i++;\n const rad = parseSequence(st, '}');\n return `\\\\arabsqrt${optional}{${rad}}`;\n}\n\nfunction parseKasr(st: ParserState): string {\n if (peek(st) !== '{') {\n throw new BuTeXParserError('\\\\كسر expects first \"{\" argument', st.i);\n }\n st.i++;\n const num = parseSequence(st, '}');\n if (peek(st) !== '{') {\n throw new BuTeXParserError('\\\\كسر expects second \"{\" argument', st.i);\n }\n st.i++;\n const den = parseSequence(st, '}');\n return `\\\\frac{${num}}{${den}}`;\n}\n\n/**\n * Commands not handled above may be followed by TeX-style `{...}` groups (possibly several).\n * Consume those groups so `\\sin{x}` stays `\\sin{x}` instead of `\\sin` + literal `x`.\n */\nfunction emitUnknownCommandWithBraceArgs(st: ParserState, name: string): string {\n let out = `\\\\${name}`;\n while (peek(st) === '{') {\n st.i++;\n out += `{${parseSequence(st, '}')}}`;\n }\n return out;\n}\n\nfunction parseCommand(st: ParserState): string {\n const name = readCommandName(st);\n if (name === '') {\n const ch = peek(st);\n if (ch === '') {\n return '\\\\';\n }\n st.i++;\n return `\\\\${ch}`;\n }\n\n if (name === CMD_ROOT_AR) {\n return parseJuthr(st);\n }\n if (name === CMD_FRAC_AR) {\n return parseKasr(st);\n }\n const atomicCommandTex = arabicAtomicCommandTex(name);\n if (atomicCommandTex !== null) {\n return atomicCommandTex;\n }\n\n return emitUnknownCommandWithBraceArgs(st, name);\n}\n\n/**\n * Parse nested `{ ... }`, `\\commands`, and literal Arabic segments; wrap pure Arabic literals as `\\text{...}`.\n */\nexport function parseSequence(st: ParserState, end: '}' | null): string {\n const chunks: string[] = [];\n while (st.i < st.s.length) {\n const c = peek(st);\n if (end !== null && c === '}') {\n st.i++;\n return wrapArabicLiteralSegment(chunks.join(''));\n }\n if (c === '\\\\') {\n st.i++;\n chunks.push(parseCommand(st));\n continue;\n }\n if (c === '{') {\n st.i++;\n chunks.push(parseSequence(st, '}'));\n continue;\n }\n if (c === '}') {\n throw new BuTeXParserError('Unexpected \"}\"', st.i);\n }\n st.i++;\n chunks.push(c);\n }\n if (end !== null) {\n throw new BuTeXParserError('Unclosed \"{\"', st.i);\n }\n return wrapArabicLiteralSegment(chunks.join(''));\n}\n\n/**\n * Normalize Arabic-friendly BuTeX surface syntax to MathJax-compatible TeX.\n * Pure string transform — no MathJax dependency.\n */\nexport function parseBuTeX(input: string): string {\n const st: ParserState = { s: input.trim(), i: 0 };\n return parseSequence(st, null);\n}\n","const SVG_ARABSQRT_SELECTOR = 'mjx-container[jax=\"SVG\"] svg .mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]';\nconst ARABSQRT_SELECTOR = '.mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]';\nconst PATCHED_ATTR = 'data-butex-svg-arabsqrt';\nconst ROOT_INDEX_SCALE = 0.72;\nconst ROOT_INDEX_GAP_FACTOR = 0.08;\nconst ROOT_INDEX_MIN_GAP = 2;\nconst ROOT_INDEX_Y_RAISE = 18;\nconst ROOT_INDEX_LEFT_SHIFT = 360;\nconst VIEWBOX_PADDING = 20;\n\ntype SvgBox = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\ntype SvgPlacement = SvgBox & {\n visualX: number;\n visualY: number;\n translateX: number;\n translateY: number;\n};\n\nfunction closestArabSqrtRoot(element: Element): Element | null {\n return element.closest('.mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]');\n}\n\nfunction rootDepth(root: Element): number {\n let depth = 0;\n let parent = root.parentElement;\n while (parent) {\n if (parent.matches('.mjx-rtl-mirror[data-mjx-rtl-root=\"true\"]')) {\n depth += 1;\n }\n parent = parent.parentElement;\n }\n return depth;\n}\n\nfunction directSvgElementChildren(element: Element): Element[] {\n return Array.from(element.children).filter((child) => child instanceof SVGElement);\n}\n\nfunction boxFor(element: Element): SvgBox | null {\n if (!(element instanceof SVGGraphicsElement) || typeof element.getBBox !== 'function') {\n return null;\n }\n try {\n const box = element.getBBox();\n return {\n x: box.x,\n y: box.y,\n width: box.width,\n height: box.height,\n };\n } catch {\n return null;\n }\n}\n\nfunction placementFor(element: Element): SvgPlacement | null {\n const box = boxFor(element);\n if (!box) {\n return null;\n }\n const [translateX, translateY] = readTranslate(element);\n return {\n ...box,\n translateX,\n translateY,\n visualX: box.x + translateX,\n visualY: box.y + translateY,\n };\n}\n\nfunction readTranslate(element: Element): [number, number] {\n const transform = element.getAttribute('transform') ?? '';\n const match = transform.match(/translate\\(\\s*([-+.\\d]+)(?:[,\\s]+([-+.\\d]+))?\\s*\\)/);\n if (!match) {\n return [0, 0];\n }\n return [Number(match[1]) || 0, Number(match[2]) || 0];\n}\n\nfunction setTranslate(element: Element, x: number, y: number): void {\n replaceTransform(element, `translate(${roundSvg(x)},${roundSvg(y)})`);\n}\n\nfunction setMirroredTranslate(element: Element, x: number, y: number, width: number): void {\n replaceTransform(element, `translate(${roundSvg(x + width)},${roundSvg(y)}) scale(-1,1)`);\n}\n\nfunction setRootIndexTranslate(element: Element, x: number, y: number): void {\n const current = element.getAttribute('transform') ?? '';\n const rest = current\n .replace(/translate\\(\\s*[-+.\\d]+(?:[,\\s]+[-+.\\d]+)?\\s*\\)/g, '')\n .replace(/matrix\\([^)]*\\)/g, '')\n .replace(/scale\\([^)]*\\)/g, '')\n .trim();\n const transform = `translate(${roundSvg(x)},${roundSvg(y)}) scale(${ROOT_INDEX_SCALE})`;\n element.setAttribute('transform', rest ? `${transform} ${rest}` : transform);\n}\n\nfunction setRootIndexVisualX(element: Element, placement: SvgPlacement, visualX: number): void {\n const x = visualX - placement.x * ROOT_INDEX_SCALE;\n setRootIndexTranslate(element, x, placement.translateY + ROOT_INDEX_Y_RAISE);\n}\n\nfunction replaceTransform(element: Element, transform: string): void {\n const current = element.getAttribute('transform') ?? '';\n const rest = current\n .replace(/translate\\(\\s*[-+.\\d]+(?:[,\\s]+[-+.\\d]+)?\\s*\\)/g, '')\n .replace(/matrix\\([^)]*\\)/g, '')\n .replace(/scale\\(\\s*-1(?:[,\\s]+1)?\\s*\\)/g, '')\n .trim();\n element.setAttribute('transform', rest ? `${transform} ${rest}` : transform);\n}\n\nfunction roundSvg(value: number): string {\n return Number.isFinite(value) ? value.toFixed(2).replace(/\\.?0+$/, '') : '0';\n}\n\nfunction findRootNode(root: Element): Element | null {\n const candidates = Array.from(root.querySelectorAll('[data-mml-node=\"msqrt\"], [data-mml-node=\"mroot\"]'));\n return candidates.find((candidate) => closestArabSqrtRoot(candidate) === root) ?? null;\n}\n\nfunction findSurd(rootNode: Element): Element | null {\n return directSvgElementChildren(rootNode).find((child) => child.getAttribute('data-mml-node') === 'mo') ?? null;\n}\n\nfunction findRootIndex(rootNode: Element): Element | null {\n const marked = rootNode.querySelector('[data-butex-arabsqrt-part=\"index\"]');\n if (marked?.parentElement === rootNode) {\n return marked;\n }\n if (marked?.parentElement?.parentElement === rootNode) {\n return marked.parentElement;\n }\n return directSvgElementChildren(rootNode).find((child) => {\n return child.classList.contains('mjx-rtl-root-index') || child.querySelector('.mjx-rtl-root-index') != null;\n }) ?? null;\n}\n\nfunction findBase(rootNode: Element, surd: Element | null, rootIndex: Element | null): Element | null {\n const marked = rootNode.querySelector('[data-butex-arabsqrt-part=\"base\"]');\n if (marked?.parentElement === rootNode) {\n return marked;\n }\n if (marked?.parentElement?.parentElement === rootNode) {\n return marked.parentElement;\n }\n return directSvgElementChildren(rootNode).find((child) => {\n if (child === surd || child === rootIndex || child.tagName.toLowerCase() === 'rect') {\n return false;\n }\n return child.querySelector('.mjx-rtl-unmirror:not(.mjx-rtl-root-index)') != null;\n }) ?? null;\n}\n\nfunction findOverbar(rootNode: Element): SVGRectElement | null {\n const directRects = directSvgElementChildren(rootNode).filter((child) => child.tagName.toLowerCase() === 'rect');\n return (directRects[directRects.length - 1] as SVGRectElement | undefined) ?? null;\n}\n\nfunction visualExtent(parts: Array<Element | null>): { left: number; right: number } | null {\n const placements = parts\n .filter((part): part is Element => part != null)\n .map((part) => placementFor(part))\n .filter((placement): placement is SvgPlacement => placement != null && placement.width > 0);\n if (!placements.length) {\n return null;\n }\n return placements.reduce(\n (extent, placement) => {\n return {\n left: Math.min(extent.left, placement.visualX),\n right: Math.max(extent.right, placement.visualX + placement.width),\n };\n },\n { left: Infinity, right: -Infinity }\n );\n}\n\nfunction mirroredVisualX(placement: SvgPlacement, extent: { left: number; right: number }): number {\n return extent.left + extent.right - (placement.visualX + placement.width);\n}\n\nfunction moveToVisualX(element: Element, placement: SvgPlacement, visualX: number): void {\n setTranslate(element, placement.translateX + visualX - placement.visualX, placement.translateY);\n}\n\nfunction mirrorToVisualX(element: Element, placement: SvgPlacement, visualX: number): void {\n const translateX = visualX + placement.x + placement.width;\n setMirroredTranslate(element, translateX - placement.width, placement.translateY, placement.width);\n}\n\nfunction findSvg(element: Element): SVGSVGElement | null {\n const svg = element.closest('svg');\n return svg instanceof SVGSVGElement ? svg : null;\n}\n\nfunction parseViewBox(svg: SVGSVGElement): [number, number, number, number] | null {\n const viewBox = svg.getAttribute('viewBox');\n if (!viewBox) {\n return null;\n }\n const values = viewBox.trim().split(/[\\s,]+/).map(Number);\n if (values.length !== 4 || values.some((value) => !Number.isFinite(value))) {\n return null;\n }\n return values as [number, number, number, number];\n}\n\nfunction parseEx(value: string | null): number | null {\n const match = value?.match(/^([-+.\\d]+)ex$/);\n if (!match) {\n return null;\n }\n const n = Number(match[1]);\n return Number.isFinite(n) ? n : null;\n}\n\nfunction expandSvgViewBox(root: Element, contentLeft: number, contentRight: number): void {\n const svg = findSvg(root);\n if (!svg) {\n return;\n }\n const box = parseViewBox(svg);\n if (!box) {\n return;\n }\n const [minX, minY, width, height] = box;\n const oldRight = minX + width;\n const nextLeft = Math.min(minX, contentLeft - VIEWBOX_PADDING);\n const nextRight = Math.max(oldRight, contentRight + VIEWBOX_PADDING);\n const nextWidth = nextRight - nextLeft;\n if (nextLeft === minX && nextWidth === width) {\n return;\n }\n svg.setAttribute('viewBox', [roundSvg(nextLeft), roundSvg(minY), roundSvg(nextWidth), roundSvg(height)].join(' '));\n\n const widthEx = parseEx(svg.getAttribute('width'));\n if (widthEx && width > 0) {\n svg.setAttribute('width', `${roundSvg(widthEx * (nextWidth / width))}ex`);\n }\n}\n\nfunction patchArabSqrtRoot(root: Element): void {\n if (root.getAttribute(PATCHED_ATTR) === 'patched') {\n return;\n }\n\n const rootNode = findRootNode(root);\n if (!rootNode) {\n return;\n }\n\n const surd = findSurd(rootNode);\n const rootIndex = findRootIndex(rootNode);\n const base = findBase(rootNode, surd, rootIndex);\n const overbar = findOverbar(rootNode);\n if (!surd || !base || !overbar) {\n return;\n }\n\n const surdPlacement = placementFor(surd);\n const basePlacement = placementFor(base);\n const indexPlacement = rootIndex ? placementFor(rootIndex) : null;\n if (!surdPlacement || !basePlacement || !surdPlacement.width || !basePlacement.width) {\n return;\n }\n\n const extent = visualExtent([surd, base, overbar]);\n if (!extent) {\n return;\n }\n\n let targetBaseX = mirroredVisualX(basePlacement, extent);\n let targetSurdX = mirroredVisualX(surdPlacement, extent);\n let targetOverbarX: number | null = null;\n\n const overbarBox = boxFor(overbar);\n if (overbarBox) {\n targetOverbarX = mirroredVisualX({ ...overbarBox, translateX: 0, translateY: 0, visualX: overbarBox.x, visualY: overbarBox.y }, extent);\n }\n\n let targetIndexX: number | null = null;\n let indexVisualWidth = 0;\n if (rootIndex && indexPlacement) {\n const indexGap = Math.max(surdPlacement.width * ROOT_INDEX_GAP_FACTOR, ROOT_INDEX_MIN_GAP);\n indexVisualWidth = indexPlacement.width * ROOT_INDEX_SCALE;\n targetIndexX = targetSurdX + surdPlacement.width + indexGap - ROOT_INDEX_LEFT_SHIFT;\n\n const bodyRight = Math.max(\n targetSurdX + surdPlacement.width,\n targetBaseX + basePlacement.width,\n targetOverbarX == null || !overbarBox ? -Infinity : targetOverbarX + overbarBox.width\n );\n const bodyShift = Math.max(0, targetIndexX + indexVisualWidth - bodyRight);\n if (bodyShift) {\n targetBaseX -= bodyShift;\n targetSurdX -= bodyShift;\n targetIndexX -= bodyShift;\n if (targetOverbarX != null) {\n targetOverbarX -= bodyShift;\n }\n }\n }\n\n moveToVisualX(base, basePlacement, targetBaseX);\n mirrorToVisualX(surd, surdPlacement, targetSurdX);\n\n if (overbarBox && targetOverbarX != null) {\n overbar.setAttribute('x', roundSvg(targetOverbarX));\n overbar.setAttribute('width', roundSvg(overbarBox.width));\n }\n\n if (rootIndex && indexPlacement && targetIndexX != null) {\n setRootIndexVisualX(rootIndex, indexPlacement, targetIndexX);\n }\n\n const contentLeft = Math.min(\n targetSurdX,\n targetBaseX,\n targetOverbarX ?? targetBaseX,\n targetIndexX ?? targetBaseX\n );\n const contentRight = Math.max(\n targetSurdX + surdPlacement.width,\n targetBaseX + basePlacement.width,\n targetOverbarX == null || !overbarBox ? targetBaseX + basePlacement.width : targetOverbarX + overbarBox.width,\n targetIndexX == null ? targetBaseX + basePlacement.width : targetIndexX + indexVisualWidth\n );\n expandSvgViewBox(root, contentLeft, contentRight);\n\n root.setAttribute(PATCHED_ATTR, 'patched');\n rootNode.setAttribute(PATCHED_ATTR, 'patched');\n}\n\nexport function patchBuTeXSvgMath(root: ParentNode): void {\n if (typeof root.querySelectorAll !== 'function') {\n return;\n }\n let roots = Array.from(root.querySelectorAll(SVG_ARABSQRT_SELECTOR));\n if (!roots.length) {\n roots = Array.from(root.querySelectorAll(ARABSQRT_SELECTOR)).filter((candidate) => {\n return candidate.closest('mjx-container[jax=\"SVG\"]') != null;\n });\n }\n roots\n .sort((a, b) => rootDepth(b) - rootDepth(a))\n .forEach((arabSqrtRoot) => patchArabSqrtRoot(arabSqrtRoot));\n}\n","import { patchBuTeXSvgMath } from './svgPatcher.js';\nimport { mirrorBuTeXOperatorsInTex } from '../editor/atomicCommandsOperators.js';\n\nexport { patchBuTeXSvgMath } from './svgPatcher.js';\n\nexport type BuTeXMathOutput = 'chtml' | 'svg';\n\nexport type RenderBuTeXMathIslandOptions = {\n display?: boolean;\n mirrorOperators?: boolean;\n output?: BuTeXMathOutput;\n};\n\ntype MathJaxRenderApi = {\n typesetPromise?: (nodes: HTMLElement[]) => Promise<void>;\n typesetClear?: (nodes: HTMLElement[]) => void;\n tex2chtml?: (input: string, options?: { display?: boolean }) => HTMLElement;\n tex2chtmlPromise?: (input: string, options?: { display?: boolean }) => Promise<HTMLElement>;\n tex2svg?: (input: string, options?: { display?: boolean }) => HTMLElement;\n tex2svgPromise?: (input: string, options?: { display?: boolean }) => Promise<HTMLElement>;\n startup?: {\n promise?: Promise<void>;\n document?: { updateDocument?: () => void };\n };\n};\n\nexport type RenderBuTeXMathTypesetOptions = {\n display?: boolean;\n mirrorOperators?: boolean;\n};\n\nexport function patchBuTeXSvgMathAfterLayout(root: ParentNode): void {\n const run = () => patchBuTeXSvgMath(root);\n const raf =\n typeof globalThis !== 'undefined'\n ? (globalThis as { requestAnimationFrame?: (callback: FrameRequestCallback) => number }).requestAnimationFrame\n : undefined;\n\n if (typeof raf === 'function') {\n raf(run);\n return;\n }\n\n if (typeof queueMicrotask === 'function') {\n queueMicrotask(run);\n return;\n }\n\n run();\n}\n\nfunction mathJaxApi(): MathJaxRenderApi | undefined {\n if (typeof globalThis === 'undefined') {\n return undefined;\n }\n return (globalThis as { MathJax?: MathJaxRenderApi }).MathJax;\n}\n\n/** Convert delimited source text to `\\(...\\)` / `\\[...\\]` form. */\nexport function normalizePreviewMathForMathJax(tex: string): string {\n if (tex.startsWith('$$') && tex.endsWith('$$')) {\n return `\\\\[${tex.slice(2, -2)}\\\\]`;\n }\n if (tex.startsWith('$') && tex.endsWith('$')) {\n return `\\\\(${tex.slice(1, -1)}\\\\)`;\n }\n return tex;\n}\n\n/** Normalize delimited TeX for direct MathJax island conversion. */\nexport function normalizeBuTeXMathInput(\n tex: string,\n output: BuTeXMathOutput = 'chtml',\n): { tex: string; display: boolean } {\n const inline = (inner: string) => ({\n tex: output === 'chtml' ? `\\\\displaystyle ${inner}` : inner,\n display: false,\n });\n\n if (tex.startsWith('$$') && tex.endsWith('$$')) {\n return { tex: tex.slice(2, -2), display: true };\n }\n if (tex.startsWith('$') && tex.endsWith('$')) {\n return inline(tex.slice(1, -1));\n }\n if (tex.startsWith('\\\\[') && tex.endsWith('\\\\]')) {\n return { tex: tex.slice(2, -2), display: true };\n }\n if (tex.startsWith('\\\\(') && tex.endsWith('\\\\)')) {\n return inline(tex.slice(2, -2));\n }\n return tex.startsWith('\\\\begin{') ? { tex, display: true } : inline(tex);\n}\n\nasync function renderWithOutput(\n mathJax: MathJaxRenderApi,\n tex: string,\n display: boolean,\n output: BuTeXMathOutput,\n): Promise<HTMLElement> {\n if (output === 'svg') {\n const node = mathJax.tex2svg?.(tex, { display }) ?? (await mathJax.tex2svgPromise?.(tex, { display }));\n if (!node) {\n throw new Error('BuTeX: tex2svg is not available. Load mathjax/tex-svg.js.');\n }\n patchBuTeXSvgMath(node);\n return node;\n }\n\n const node = mathJax.tex2chtml?.(tex, { display }) ?? (await mathJax.tex2chtmlPromise?.(tex, { display }));\n if (!node) {\n throw new Error('BuTeX: tex2chtml is not available. Load mathjax/tex-chtml.js.');\n }\n return node;\n}\n\nexport async function renderBuTeXMathIsland(\n tex: string,\n options: RenderBuTeXMathIslandOptions = {},\n): Promise<HTMLElement> {\n const output = options.output ?? 'chtml';\n const mathJax = mathJaxApi();\n if (!mathJax) {\n throw new Error('BuTeX: MathJax is not loaded.');\n }\n\n await (mathJax.startup?.promise ?? Promise.resolve());\n const normalized = normalizeBuTeXMathInput(tex, output);\n const display = options.display ?? normalized.display;\n const renderTex = options.mirrorOperators\n ? mirrorBuTeXOperatorsInTex(normalized.tex)\n : normalized.tex;\n const node = await renderWithOutput(mathJax, renderTex, display, output);\n mathJax.startup?.document?.updateDocument?.();\n return node;\n}\n\nexport async function mountBuTeXMathIsland(\n host: HTMLElement,\n tex: string,\n options: RenderBuTeXMathIslandOptions = {},\n): Promise<void> {\n try {\n const node = await renderBuTeXMathIsland(tex, options);\n host.replaceChildren(node);\n if ((options.output ?? 'chtml') === 'svg') {\n patchBuTeXSvgMathAfterLayout(host);\n }\n } catch {\n host.replaceChildren(document.createTextNode(tex));\n }\n}\n\n/**\n * Render via MathJax's document typesetter (`typesetPromise`).\n * Use for equation-editor preview of raw AST TeX (display `\\[...\\]` by default).\n */\nexport async function mountBuTeXMathTypeset(\n host: HTMLElement,\n tex: string,\n options: RenderBuTeXMathTypesetOptions = {},\n): Promise<void> {\n const mathJax = mathJaxApi();\n await (mathJax?.startup?.promise ?? Promise.resolve());\n const body = tex || '\\\\, ';\n const renderBody = options.mirrorOperators\n ? mirrorBuTeXOperatorsInTex(body)\n : body;\n const display = options.display ?? true;\n mathJax?.typesetClear?.([host]);\n host.innerHTML = display ? `\\\\[ ${renderBody} \\\\]` : `\\\\( ${renderBody} \\\\)`;\n if (!mathJax?.typesetPromise) {\n return;\n }\n await mathJax.typesetPromise([host]);\n patchBuTeXSvgMath(host);\n}\n\n/** @deprecated Use normalizeBuTeXMathInput instead. */\nexport function mathJaxInputFromPreviewTex(tex: string): { tex: string; display: boolean } {\n return normalizeBuTeXMathInput(tex, 'chtml');\n}\n","import {\n BUTEX_DIWANI_FONT_STACK,\n BUTEX_DIWANI_OUTLINE_FONT_STACK,\n BUTEX_TAKWEEN_FONT_STACK,\n} from '../diwani-font.js';\nimport type { GlobalMathJax } from '../mathjax-types.js';\n\n/**\n * BuTeX SVG custom-font text.\n *\n * MathJax's SVG output renders `mtext` with its own math fonts. The BuTeX\n * decorative Arabic fonts (Takween / Diwani / Diwani outline) are not part of\n * those fonts, and their visual glyph extents are far larger than a math box.\n *\n * The strategy here keeps two boxes separate:\n *\n * - LAYOUT box (what MathJax uses to place `x`, `+`, `y` around the text):\n * width is the measured horizontal advance of the real font; height/depth are\n * FIXED, math-sized constants per font. We never feed glyph visual height /\n * depth into the layout box, so siblings never get pushed around.\n *\n * - VISUAL drawing (the real glyphs): drawn with an `<text>` element in the\n * real font. It may visually overflow the layout box; clipping is avoided with\n * `overflow: visible` CSS (see `src/rtl-css.ts`), never by moving siblings.\n */\n\nconst SVG_TEXT_ATTR = 'data-butex-svg-text';\nconst SVG_FONT_ATTR = 'data-butex-svg-font';\n\n/** SVG user units per em in MathJax SVG output (font size used to measure/draw). */\nconst EM = 1000;\nconst FALLBACK_CHAR_WIDTH = 0.72;\n\ntype FontKey = 'takween' | 'diwani' | 'diwani-outline';\n\ntype FontLayout = {\n key: FontKey;\n stack: string;\n /** Fixed math-sized layout height (em). Stable; not derived from glyphs. */\n height: number;\n /** Fixed math-sized layout depth (em). Stable; not derived from glyphs. */\n depth: number;\n /** Visual draw scale. Tames decorative fonts; does not move siblings. */\n drawScale: number;\n /** Visual baseline lift (em, pre-flip). Positive raises the glyphs. */\n baselineShift: number;\n};\n\n/**\n * Explicit, documented per-font constants. Height/depth are MathJax-like fixed\n * math metrics (h ~= 0.75, d ~= 0.25). Only `drawScale` / `baselineShift` are\n * font-specific visual tweaks. Keep these small and obvious.\n */\nconst FONT_LAYOUTS: Record<FontKey, FontLayout> = {\n takween: {\n key: 'takween',\n stack: BUTEX_TAKWEEN_FONT_STACK,\n height: 0.75,\n depth: 0.25,\n drawScale: 1,\n baselineShift: 0,\n },\n diwani: {\n key: 'diwani',\n stack: BUTEX_DIWANI_FONT_STACK,\n height: 0.75,\n depth: 0.25,\n drawScale: 1,\n baselineShift: 0,\n },\n 'diwani-outline': {\n key: 'diwani-outline',\n stack: BUTEX_DIWANI_OUTLINE_FONT_STACK,\n height: 0.75,\n depth: 0.25,\n // Diwani outline glyphs are decorative and visually huge; shrink the draw\n // so it reads at math size. Layout width below is scaled to match.\n drawScale: 0.72,\n baselineShift: 0,\n },\n};\n\ntype SvgTextMetrics = {\n /** Layout box used by MathJax (em). */\n height: number;\n depth: number;\n width: number;\n /** `text-anchor=\"end\"` x position in user units, measured at font-size EM. */\n anchorUnits: number;\n font: FontLayout;\n};\n\ntype SvgAdaptor = {\n document?: unknown;\n append(parent: unknown, child: unknown): unknown;\n body(document: unknown): unknown;\n remove(node: unknown): unknown;\n setAttribute(node: unknown, name: string, value: unknown, namespace?: string | null): void;\n};\n\ntype SvgOutputJax = {\n adaptor: SvgAdaptor;\n svg(kind: string, properties?: Record<string, unknown>, children?: unknown[]): unknown;\n text(text: string): unknown;\n};\n\ntype SvgWrapperFactory = {\n jax: SvgOutputJax;\n setNodeClass?(kind: string, nodeClass: unknown): void;\n};\n\ntype SvgWrapperInstance = {\n adaptor: SvgAdaptor;\n bbox: {\n h: number;\n d: number;\n w: number;\n empty?(): void;\n clean?(): void;\n };\n computeBBox(bbox: SvgWrapperInstance['bbox']): void;\n fixed(value: number, digits?: number): string;\n jax: SvgOutputJax;\n node: {\n attributes: {\n get(name: string): unknown;\n };\n };\n standardSvgNodes(parents: unknown[]): unknown[];\n svg(kind: string, properties?: Record<string, unknown>, children?: unknown[]): unknown;\n text(text: string): unknown;\n toSVG(parents: unknown[]): void;\n};\n\ntype SvgWrapperConstructor = {\n new (factory: SvgWrapperFactory, node: unknown, parent?: unknown): SvgWrapperInstance;\n kind: string;\n};\n\ntype SvgWrapperStatics = {\n defaultNodes?: Record<string, unknown>;\n};\n\nfunction fontLayoutForClass(className: string): FontLayout | null {\n const classes = className.split(/\\s+/);\n if (classes.includes('butex-takween-text')) {\n return FONT_LAYOUTS.takween;\n }\n if (classes.includes('butex-diwani-text') || classes.includes('butex-diwani-command')) {\n return FONT_LAYOUTS.diwani;\n }\n if (\n classes.includes('butex-diwani-outline-text') ||\n classes.includes('butex-diwani-outline-command')\n ) {\n return FONT_LAYOUTS['diwani-outline'];\n }\n return null;\n}\n\nfunction sourceTextForWrapper(wrapper: SvgWrapperInstance): string | null {\n const text = wrapper.node.attributes.get(SVG_TEXT_ATTR);\n return typeof text === 'string' && text ? text : null;\n}\n\nfunction fontLayoutForWrapper(wrapper: SvgWrapperInstance): FontLayout | null {\n const className = wrapper.node.attributes.get('class');\n return typeof className === 'string' ? fontLayoutForClass(className) : null;\n}\n\nfunction isBuTeXSvgText(wrapper: SvgWrapperInstance): boolean {\n return sourceTextForWrapper(wrapper) != null && fontLayoutForWrapper(wrapper) != null;\n}\n\nfunction getSvgGraphicsBox(node: unknown): DOMRect | null {\n const candidate = node as SVGGraphicsElement | null;\n if (!candidate || typeof candidate.getBBox !== 'function') {\n return null;\n }\n try {\n return candidate.getBBox();\n } catch {\n return null;\n }\n}\n\nfunction formatSvgNumber(value: number): string {\n return Number.isFinite(value) ? value.toFixed(3).replace(/\\.?0+$/, '') : '0';\n}\n\n/**\n * Measure only the horizontal advance of `text` in the real font, in SVG user\n * units (font-size EM). Vertical extents are intentionally ignored: the layout\n * height/depth come from the fixed per-font constants, not the glyphs.\n */\nfunction measureAdvance(\n wrapper: SvgWrapperInstance,\n text: string,\n fontStack: string\n): { anchorUnits: number; widthUnits: number } | null {\n const jax = wrapper.jax;\n const adaptor = jax.adaptor;\n const body = adaptor.document == null ? null : adaptor.body(adaptor.document);\n if (!body) {\n return null;\n }\n\n const textNode = jax.svg(\n 'text',\n {\n x: 0,\n y: 0,\n 'font-family': fontStack,\n 'font-size': EM,\n 'text-anchor': 'end',\n direction: 'rtl',\n 'unicode-bidi': 'isolate',\n 'dominant-baseline': 'alphabetic',\n style: {\n 'font-family': fontStack,\n direction: 'rtl',\n 'unicode-bidi': 'isolate',\n },\n },\n [jax.text(text)]\n );\n const svg = jax.svg(\n 'svg',\n {\n position: 'absolute',\n visibility: 'hidden',\n width: '1ex',\n height: '1ex',\n top: 0,\n left: 0,\n viewBox: `0 0 ${EM} ${EM}`,\n },\n [textNode]\n );\n\n try {\n adaptor.append(body, svg);\n const firstBox = getSvgGraphicsBox(textNode);\n if (!firstBox || firstBox.width <= 0) {\n return null;\n }\n // Shift the anchor so the visual left edge sits at x = 0.\n const anchorUnits = Math.max(0, -firstBox.x);\n adaptor.setAttribute(textNode, 'x', anchorUnits);\n const finalBox = getSvgGraphicsBox(textNode) ?? firstBox;\n const left = Math.min(0, finalBox.x);\n const right = Math.max(anchorUnits, finalBox.x + finalBox.width);\n const widthUnits = Math.max(right - left, finalBox.width, anchorUnits);\n return { anchorUnits, widthUnits };\n } finally {\n adaptor.remove(svg);\n }\n}\n\nfunction metricsFor(wrapper: SvgWrapperInstance): SvgTextMetrics | null {\n const text = sourceTextForWrapper(wrapper);\n const font = fontLayoutForWrapper(wrapper);\n if (!text || !font) {\n return null;\n }\n\n const measured = measureAdvance(wrapper, text, font.stack);\n const charCount = Math.max(1, Array.from(text).length);\n const anchorUnits = measured ? measured.anchorUnits : charCount * FALLBACK_CHAR_WIDTH * EM;\n const widthUnits = measured ? measured.widthUnits : charCount * FALLBACK_CHAR_WIDTH * EM;\n\n return {\n height: font.height,\n depth: font.depth,\n // Layout width follows the drawn size (drawScale is applied via transform).\n width: (widthUnits / EM) * font.drawScale,\n anchorUnits,\n font,\n };\n}\n\nfunction createBuTeXSvgMtextClass(OriginalMtext: SvgWrapperConstructor): SvgWrapperConstructor {\n return class BuTeXSvgMtext extends OriginalMtext {\n public static kind = OriginalMtext.kind;\n\n private butexMetrics: SvgTextMetrics | null = null;\n private butexMetricsResolved = false;\n\n private getBuTeXMetrics(): SvgTextMetrics | null {\n if (!isBuTeXSvgText(this)) {\n return null;\n }\n if (!this.butexMetricsResolved) {\n this.butexMetrics = metricsFor(this);\n this.butexMetricsResolved = true;\n }\n return this.butexMetrics;\n }\n\n public computeBBox(bbox: SvgWrapperInstance['bbox']): void {\n const metrics = this.getBuTeXMetrics();\n if (!metrics) {\n super.computeBBox(bbox);\n return;\n }\n bbox.empty?.();\n bbox.h = metrics.height;\n bbox.d = metrics.depth;\n bbox.w = metrics.width;\n bbox.clean?.();\n }\n\n public toSVG(parents: unknown[]): void {\n const metrics = this.getBuTeXMetrics();\n const text = sourceTextForWrapper(this);\n if (!metrics || !text) {\n super.toSVG(parents);\n return;\n }\n\n const svg = this.standardSvgNodes(parents);\n const font = metrics.font;\n // Draw at font-size EM, then scale by drawScale and flip the y axis\n // (MathJax SVG space is y-up). Scaling about the origin keeps the left\n // edge at x = 0 and the baseline at y = 0.\n const textNode = this.svg(\n 'text',\n {\n x: formatSvgNumber(metrics.anchorUnits),\n y: formatSvgNumber(-font.baselineShift * EM),\n transform: `scale(${formatSvgNumber(font.drawScale)},${formatSvgNumber(-font.drawScale)})`,\n 'font-family': font.stack,\n 'font-size': EM,\n 'text-anchor': 'end',\n direction: 'rtl',\n 'unicode-bidi': 'isolate',\n 'dominant-baseline': 'alphabetic',\n [SVG_TEXT_ATTR]: text,\n [SVG_FONT_ATTR]: font.key,\n style: {\n 'font-family': font.stack,\n direction: 'rtl',\n 'unicode-bidi': 'isolate',\n },\n },\n [this.text(text)]\n );\n this.adaptor.append(svg[0], textNode);\n }\n };\n}\n\n/** The live SVG wrapper factory on the running output jax. */\ntype LiveSvgWrapperFactory = {\n getNodeClass?(kind: string): unknown;\n setNodeClass?(kind: string, nodeClass: unknown): void;\n node?: Record<string, unknown>;\n};\n\nfunction svgWrapperFactoryClass(mathJax: GlobalMathJax): SvgWrapperStatics | null {\n const factory = mathJax._.output?.svg?.WrapperFactory?.SvgWrapperFactory;\n return typeof factory === 'function' ? (factory as SvgWrapperStatics) : null;\n}\n\nfunction liveOutputFactory(mathJax: GlobalMathJax): LiveSvgWrapperFactory | null {\n const factory = mathJax.startup?.output?.factory as LiveSvgWrapperFactory | undefined;\n if (!factory) {\n return null;\n }\n return typeof factory.setNodeClass === 'function' || factory.node ? factory : null;\n}\n\nfunction currentMtextClass(factory: LiveSvgWrapperFactory | null): unknown {\n if (factory && typeof factory.getNodeClass === 'function') {\n const fromGetter = factory.getNodeClass('mtext');\n if (typeof fromGetter === 'function') {\n return fromGetter;\n }\n }\n return factory?.node?.mtext;\n}\n\n/**\n * Find the SVG `mtext` wrapper class currently in use. Prefer the live output\n * factory; fall back to the module export (`Wrappers.mtext.SvgMtext`).\n */\nfunction originalMtextClass(\n mathJax: GlobalMathJax,\n factory: LiveSvgWrapperFactory | null\n): SvgWrapperConstructor | null {\n const candidate = currentMtextClass(factory) ?? mathJax._.output?.svg?.Wrappers?.mtext?.SvgMtext;\n return typeof candidate === 'function' ? (candidate as SvgWrapperConstructor) : null;\n}\n\n/**\n * Swap MathJax's SVG `mtext` wrapper for the BuTeX-aware one. Call once, after\n * the SVG output jax exists (e.g. after `MathJax.startup.defaultReady()`).\n * No-op if SVG output internals are missing or already patched.\n */\nexport function registerBuTeXSvgTextWrapper(mathJax: GlobalMathJax): void {\n const factory = liveOutputFactory(mathJax);\n const factoryClass = svgWrapperFactoryClass(mathJax);\n const OriginalMtext = originalMtextClass(mathJax, factory);\n if (!OriginalMtext) {\n return;\n }\n\n const existing = currentMtextClass(factory) as (SvgWrapperConstructor & { butexSvgTextWrapper?: boolean }) | undefined;\n if (existing?.butexSvgTextWrapper) {\n return;\n }\n\n const BuTeXSvgMtext = createBuTeXSvgMtextClass(OriginalMtext) as SvgWrapperConstructor & {\n butexSvgTextWrapper?: boolean;\n };\n BuTeXSvgMtext.butexSvgTextWrapper = true;\n\n if (factory && typeof factory.setNodeClass === 'function') {\n factory.setNodeClass('mtext', BuTeXSvgMtext);\n } else if (factory?.node) {\n factory.node.mtext = BuTeXSvgMtext;\n }\n // Persist for any future jax instances created from the factory class.\n if (factoryClass?.defaultNodes) {\n factoryClass.defaultNodes.mtext = BuTeXSvgMtext;\n }\n}\n","import { BUTEX_CHROME_CSS } from './rtl-css.js';\n\nexport { registerBuTeX, BUTEX_TEX_PACKAGE } from './register.js';\nexport { BUTEX_CHROME_CSS };\nexport { BUTEX_EDITOR_CSS, injectBuTeXEditorStyles } from './editor/styles.js';\n\nexport * as Editor from './editor/index.js';\nexport { mirrorBuTeXOperatorsInTex } from './editor/atomicCommandsOperators.js';\n\nexport {\n BuTeXParserError,\n CMD_COS_AR,\n CMD_FRAC_AR,\n CMD_ROOT_AR,\n parseBuTeX,\n wrapArabicLiteralSegment,\n} from './parser/index.js';\n\nexport {\n mountBuTeXMathIsland,\n mountBuTeXMathTypeset,\n normalizeBuTeXMathInput,\n normalizePreviewMathForMathJax,\n patchBuTeXSvgMathAfterLayout,\n renderBuTeXMathIsland,\n mathJaxInputFromPreviewTex,\n} from './mathjax/renderIsland.js';\nexport type { BuTeXMathOutput, RenderBuTeXMathIslandOptions, RenderBuTeXMathTypesetOptions } from './mathjax/renderIsland.js';\nexport { patchBuTeXSvgMath } from './mathjax/svgPatcher.js';\nexport { registerBuTeXSvgTextWrapper } from './mathjax/svgTextWrapper.js';\n\n/**\n * Injects BuTeX CommonHTML styles into `document.head` if not already present.\n * Browser-only; no-op if `document` is undefined (Node).\n */\nexport function injectBuTeXStyles(doc?: Document): void {\n const d = doc ?? (typeof document !== 'undefined' ? document : undefined);\n if (!d) {\n return;\n }\n const id = 'butex-chrome-styles';\n if (d.getElementById(id)) {\n return;\n }\n const style = d.createElement('style');\n style.id = id;\n style.textContent = BUTEX_CHROME_CSS;\n d.head.appendChild(style);\n}\n"],"mappings":"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","names":["COMMAND_MAP","COMMAND_MAP","COMMAND_MAP","COMMAND_MAP","COMMAND_MAP","clamp","clamp","value","targetRow","next","node"]}