@pie-lib/math-input-mathlive 1.1.5-beta.5 → 1.1.5-beta.7

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.
@@ -1 +1 @@
1
- {"version":3,"file":"latex-bridge.js","names":["NEWLINE_EMBED","exports","NEWLINE_EMBED_REGEX","DISPLAYLINES_REGEX","MQ_FIELD_REGEX","PLACEHOLDER_REGEX","BARE_PLACEHOLDER_REGEX","BARE_PLACEHOLDER_NO_ARG_REGEX","DEFAULT_FIELD_ID","EMPTY_SLOT","EMPTY_GROUP_REGEX","EMPTY_FENCE_REGEX","EMPTY_FENCE_SLOT","withVisibleEmptySlots","latex","replace","concat","_m","open","close","toNativeCommands","out","replaceAbs","escapeBareComments","indexOf","backslashes","i","length","ch","idx","depth","inner","slice","fieldIds","match","lastIndex","exec","push","toMathLive","id","content","split","join","MATHQUILL_ALIASES","MATHQUILL_ALIAS_REGEX","PRIME_SUPERSCRIPT_REGEX","BARE_DOUBLEPRIME_REGEX","primesToApostrophes","primes","repeat","toCanonicalCommands","m","fromMathLive","trim","map","s","COMMANDS_WITH_ARGS","_","KEYSTROKES","Left","Right","Backspace","Delete","Up","Down","keyToAction","key","undefined","command","type","value","write","parts","Array","isArray","c","keystroke","selector"],"sources":["../src/latex-bridge.js"],"sourcesContent":["/**\n * LaTeX translation layer between the MathQuill-era content model and MathLive.\n *\n * Two independent concerns live here:\n *\n * 1. Newlines. MathQuill had no line break, so pie-lib registered a custom\n * `newLine` embed that serialises to `\\embed{newLine}[]`. MathLive has no\n * embed system but supports real multiline environments, so we translate\n * `\\embed{newLine}[]` <-> `\\\\` inside `\\displaylines{}`.\n *\n * Authored content keeps its `\\embed{newLine}[]` on-disk form (that is what\n * @pie-lib/math-rendering already normalises for MathJax), so each renderer\n * normalises at its own boundary and stored items stay compatible.\n *\n * 2. Keypad key -> MathLive action. MathQuill keys carry `write`/`command`/\n * `keystroke` built for `mf.write()` / `mf.cmd()` / `mf.keystroke()`.\n * MathLive has `insert()` and `executeCommand()` instead.\n */\n\nexport const NEWLINE_EMBED = '\\\\embed{newLine}[]';\nconst NEWLINE_EMBED_REGEX = /\\\\embed\\{newLine\\}\\[\\]/g;\nconst DISPLAYLINES_REGEX = /^\\\\displaylines\\{([\\s\\S]*)\\}$/;\n\n/**\n * MathQuill's editable sub-field syntax, e.g. `\\MathQuillMathField[r1]{}`.\n * These are the answer blocks in templated math items; MathLive expresses the\n * same idea as `\\placeholder[id]{}` and reads them back via the prompts API.\n */\nconst MQ_FIELD_REGEX = /\\\\MathQuillMathField\\[([^\\]]*)\\]\\{([^{}]*)\\}/g;\nconst PLACEHOLDER_REGEX = /\\\\placeholder\\[([^\\]]*)\\]\\{([^{}]*)\\}/g;\n\n/**\n * Unnamed placeholders, which MathLive inserts on its own.\n *\n * Typing a command with empty arguments (`\\longdiv{}`, `\\frac{}{}`) makes\n * MathLive serialise the empty slots as `\\placeholder{}`. That token is\n * MathLive-specific: MathJax - which @pie-lib/math-rendering uses to render\n * prompts and previews - has no such command and renders it as red error text.\n * Stored latex must therefore keep plain empty groups.\n */\nconst BARE_PLACEHOLDER_REGEX = /\\\\placeholder\\{([^{}]*)\\}/g;\nconst BARE_PLACEHOLDER_NO_ARG_REGEX = /\\\\placeholder(?![[{a-zA-Z])/g;\n\n/** Default id used when stored latex has an unnamed field. */\nexport const DEFAULT_FIELD_ID = 'r1';\n\n/**\n * A visible stand-in for an empty argument slot, used for STATIC rendering only.\n *\n * Stored latex legitimately contains empty groups - `\\longdiv{}`, `\\frac{}{}`,\n * `x^{}` - to express a command's shape. MathQuill drew those as a shaded box\n * (`.mq-empty`); MathLive renders `{}` as nothing, so `convertLatexToMarkup`\n * output comes out completely blank (not even the surrounding bracket, in the\n * case of `\\enclose{longdiv}{}`).\n *\n * `\\placeholder{}` is not usable here: in static markup it renders as a\n * non-breaking space, because its editable box only exists inside a live\n * mathfield. So something with real width is required.\n *\n * It must be a `\\rule`, not a unicode glyph. A glyph's width comes from font\n * metrics, and U+25AB is not in the KaTeX fonts - the browser substitutes a\n * wider fallback while MathLive still sizes surrounding accents from its own\n * metrics. That left stretchy accents (`\\overarc`, `\\overleftrightarrow`)\n * visibly narrower than the box they were meant to span. A rule carries an\n * explicit em width, so accents size correctly - and a filled box is closer to\n * MathQuill's `.mq-empty` anyway.\n *\n * Live mathfields need none of this - MathLive manages empty slots itself.\n */\nconst EMPTY_SLOT = '\\\\htmlData{pie-empty=1}{\\\\rule{0.55em}{0.55em}}';\nconst EMPTY_GROUP_REGEX = /\\{\\s*\\}/g;\n// Empty delimiter pairs: `\\abs{}` is converted to `\\left|\\right|`, and the\n// parenthesis / bracket keys are `\\left(\\right)` / `\\left[\\right]`. None has a\n// `{}` group for the rule above to catch, so they would render as bare fences.\nconst EMPTY_FENCE_REGEX = /\\\\left([(\\[|])\\s*\\\\right([)\\]|])/g;\n// The same muted fill as the other slots (`pie-empty`), but a tall rectangle\n// rather than a square. It also sets the fences' height: `\\left...\\right` stretch\n// to their content, so a taller slot gives taller parentheses.\nconst EMPTY_FENCE_SLOT = '\\\\htmlData{pie-empty=1}{\\\\rule{0.55em}{1em}}';\n\n/**\n * Make empty argument slots visible, for static rendering.\n *\n * Display-only: never feed the result to a mathfield or to storage - the\n * original latex is what gets typed and saved.\n *\n * @param {string} latex\n * @returns {string}\n */\nexport const withVisibleEmptySlots = (latex) =>\n (latex || '')\n .replace(EMPTY_GROUP_REGEX, `{${EMPTY_SLOT}}`)\n .replace(EMPTY_FENCE_REGEX, (_m, open, close) => `\\\\left${open}${EMPTY_FENCE_SLOT}\\\\right${close}`);\n\n/**\n * Pie commands that take an argument, and their native MathLive equivalents.\n *\n * These MUST NOT be handled as MathLive macros. A macro is serialised from the\n * arguments it was created with, so text typed inside its expansion never makes\n * it back out: `getValue('latex')` keeps returning `\\longdiv{\\placeholder{}}`\n * while `getValue('ascii-math')` shows the typed content. Setting\n * `captureSelection: false` lets the cursor in but does not change\n * serialisation.\n *\n * Expanding to native constructs instead gives real, editable atoms that\n * round-trip. All three targets are understood by MathJax too, so stored latex\n * still renders in @pie-lib/math-rendering without a reverse mapping.\n */\n/**\n * Rewrite argument-taking pie commands into native MathLive latex.\n * Applied on the way *into* a mathfield.\n *\n * @param {string} latex\n * @returns {string}\n */\nexport const toNativeCommands = (latex) => {\n if (typeof latex !== 'string' || !latex) {\n return latex || '';\n }\n\n let out = latex;\n\n // \\abs{x} -> \\left|x\\right| needs brace-aware handling, the rest are prefix\n // swaps.\n out = replaceAbs(out);\n out = out.replace(/\\\\longdiv\\{/g, '\\\\enclose{longdiv}{');\n out = out.replace(/\\\\overarc\\{/g, '\\\\overparen{');\n out = escapeBareComments(out);\n\n return out;\n};\n\n/**\n * Escape an unescaped `%`.\n *\n * In real LaTeX `%` starts a comment, so MathLive discards it *and everything\n * after it*: `50%` renders as `50`, and `x%y` as just `x`. MathQuill had no\n * such notion - it treated `%` as a symbol - so latex from anywhere outside the\n * keypad may still carry a bare one.\n *\n * Only a `%` preceded by an even number of backslashes is bare: `\\%` is already\n * escaped, while the `%` in `\\\\%` (a line break, then a comment) is not.\n *\n * @param {string} latex\n * @returns {string}\n */\nconst escapeBareComments = (latex) => {\n if (latex.indexOf('%') === -1) {\n return latex;\n }\n\n let out = '';\n // Consecutive backslashes immediately before the current character.\n let backslashes = 0;\n\n for (let i = 0; i < latex.length; i++) {\n const ch = latex[i];\n\n out += ch === '%' && backslashes % 2 === 0 ? '\\\\%' : ch;\n backslashes = ch === '\\\\' ? backslashes + 1 : 0;\n }\n\n return out;\n};\n\n/** `\\abs{x}` -> `\\left|x\\right|`, matching balanced braces. */\nconst replaceAbs = (latex) => {\n let out = latex;\n let idx = out.indexOf('\\\\abs{');\n\n while (idx !== -1) {\n const open = idx + '\\\\abs{'.length - 1;\n let depth = 0;\n let close = -1;\n\n for (let i = open; i < out.length; i++) {\n if (out[i] === '{') depth++;\n else if (out[i] === '}') {\n depth--;\n if (depth === 0) {\n close = i;\n break;\n }\n }\n }\n\n if (close === -1) {\n break;\n }\n\n const inner = out.slice(open + 1, close);\n\n out = `${out.slice(0, idx)}\\\\left|${inner}\\\\right|${out.slice(close + 1)}`;\n idx = out.indexOf('\\\\abs{');\n }\n\n return out;\n};\n\n/**\n * Ids of the answer blocks in a piece of stored latex, in document order.\n *\n * @param {string} latex\n * @returns {string[]}\n */\nexport const fieldIds = (latex) => {\n if (typeof latex !== 'string') {\n return [];\n }\n\n const out = [];\n let match;\n\n MQ_FIELD_REGEX.lastIndex = 0;\n\n while ((match = MQ_FIELD_REGEX.exec(latex)) !== null) {\n out.push(match[1] || DEFAULT_FIELD_ID);\n }\n\n return out;\n};\n\n/**\n * Convert stored latex (which may contain `\\embed{newLine}[]`) into latex that\n * MathLive can parse and render as multiple lines.\n *\n * @param {string} latex\n * @returns {string}\n */\nexport const toMathLive = (latex) => {\n if (typeof latex !== 'string' || !latex) {\n return latex || '';\n }\n\n // Argument-taking pie commands -> native constructs, so their content stays\n // editable and serialises back correctly (see toNativeCommands).\n let out = toNativeCommands(latex);\n\n // Answer blocks: \\MathQuillMathField[id]{x} -> \\placeholder[id]{x}\n out = out.replace(MQ_FIELD_REGEX, (_m, id, content) => `\\\\placeholder[${id || DEFAULT_FIELD_ID}]{${content}}`);\n\n // Newlines: \\embed{newLine}[] -> a multiline environment\n if (out.indexOf(NEWLINE_EMBED) !== -1) {\n out = `\\\\displaylines{${out.split(NEWLINE_EMBED_REGEX).join(' \\\\\\\\ ')}}`;\n }\n\n return out;\n};\n\n/**\n * Keypad command names that MathQuill treated as ALIASES of a different command.\n *\n * MathQuill registered `\\\\divide` as another name for `\\\\div` (and\n * `\\\\perpendicular` for `\\\\perp`), so pressing the key stored the real command.\n * MathLive only knows these names through `PIE_MACROS`, and serialises a macro\n * under its own name - so `\\\\divide` reached storage verbatim, where MathJax\n * (@pie-lib/math-rendering) has no such command and renders it as red text.\n *\n * Every other keypad command already matches what MathQuill stored (`\\\\degree`,\n * `\\\\nsim`, `\\\\ncong`, `\\\\nparallel`, `\\\\square`, `\\\\napprox`,\n * `\\\\parallelogram`), and MathJax understands those.\n */\nconst MATHQUILL_ALIASES = {\n '\\\\divide': '\\\\div',\n '\\\\perpendicular': '\\\\perp',\n};\n\n// Whole command names only: `\\\\divideontimes` is a real AMS symbol.\nconst MATHQUILL_ALIAS_REGEX = /\\\\(divide|perpendicular)(?![a-zA-Z])/g;\n\n/**\n * Primes. MathLive turns a prime that follows a base into a superscript atom and\n * serialises it as `^{\\\\prime}`, or `^{\\\\doubleprime}` for the keypad's double\n * prime key (`5''` comes back out as `5^{\\\\doubleprime}`). MathJax has no\n * `\\\\doubleprime`, and two adjacent `^{\\\\prime}` groups - what typing `'` twice\n * produces - are a \"double exponent\" error. MathQuill stored plain apostrophes,\n * which both MathJax and MathLive read as primes, so store those.\n *\n * Only a superscript made of primes alone is rewritten: `x^{\\\\prime 2}` keeps\n * its group, since it holds more than primes.\n */\nconst PRIME_SUPERSCRIPT_REGEX = /\\^\\{((?:\\s*\\\\(?:prime|doubleprime)(?![a-zA-Z]))+)\\s*\\}/g;\nconst BARE_DOUBLEPRIME_REGEX = /\\\\doubleprime(?![a-zA-Z])/g;\n\nconst primesToApostrophes = (primes) =>\n // eslint-disable-next-line quotes\n \"'\".repeat(\n (primes.match(/\\\\prime(?![a-zA-Z])/g) || []).length + 2 * (primes.match(BARE_DOUBLEPRIME_REGEX) || []).length,\n );\n\n/**\n * Rewrite what MathLive serialises into the form MathQuill stored: alias\n * command names, and primes.\n *\n * @param {string} latex\n * @returns {string}\n */\nexport const toCanonicalCommands = (latex) =>\n typeof latex === 'string'\n ? latex\n .replace(MATHQUILL_ALIAS_REGEX, (m) => MATHQUILL_ALIASES[m])\n .replace(PRIME_SUPERSCRIPT_REGEX, (_m, primes) => primesToApostrophes(primes))\n // eslint-disable-next-line quotes\n .replace(BARE_DOUBLEPRIME_REGEX, \"''\")\n : latex;\n\n/**\n * Convert latex out of MathLive back into the stored form, so items authored\n * with the MathLive editor remain readable by @pie-lib/math-rendering and by\n * the existing MathQuill implementation.\n *\n * @param {string} latex\n * @returns {string}\n */\nexport const fromMathLive = (latex) => {\n if (typeof latex !== 'string' || !latex) {\n return latex || '';\n }\n\n const match = latex.trim().match(DISPLAYLINES_REGEX);\n let out = match ? match[1] : latex;\n\n // `\\\\` is the line separator inside a multiline environment.\n if (out.indexOf('\\\\\\\\') !== -1) {\n out = out\n .split(/\\s*\\\\\\\\\\s*/)\n .map((s) => s.trim())\n .join(NEWLINE_EMBED);\n }\n\n // Answer blocks: \\placeholder[id]{x} -> \\MathQuillMathField[id]{x}\n out = out.replace(\n PLACEHOLDER_REGEX,\n (_m, id, content) => `\\\\MathQuillMathField[${id || DEFAULT_FIELD_ID}]{${content}}`,\n );\n\n // Unnamed placeholders are MathLive's own representation of an empty slot and\n // must not reach storage or MathJax. Unwrap them: keep any content, drop the\n // command itself (the surrounding braces are already part of the host latex,\n // so re-adding them here would produce `\\longdiv{{}}`).\n out = out.replace(BARE_PLACEHOLDER_REGEX, (_m, content) => content);\n out = out.replace(BARE_PLACEHOLDER_NO_ARG_REGEX, '');\n\n // Store the command MathQuill stored, not the alias - also heals latex that was\n // saved with `\\\\divide` before the keypad resolved it.\n return toCanonicalCommands(out);\n};\n\n/**\n * MathQuill `cmd()` semantics: commands that take arguments should land the\n * cursor inside the first argument. MathLive expresses that with `#?`\n * placeholders in the inserted latex.\n */\nconst COMMANDS_WITH_ARGS = {\n // An explicit \"blank over blank\" key: both slots start empty.\n '\\\\frac': '\\\\frac{#?}{#?}',\n // Division, which must behave like MathQuill's `/`: whatever precedes the\n // cursor becomes the numerator and the caret lands in the denominator. `#@`\n // is MathLive's token for \"the selection, or the item before the cursor\" -\n // this is exactly the template MathLive binds to the `/` key itself. Using\n // `#?` here instead produced an empty fraction and left the typed number\n // stranded outside it.\n '/': '\\\\frac{#@}{#?}',\n '\\\\sqrt': '\\\\sqrt{#?}',\n '\\\\nthroot': '\\\\sqrt[#?]{#?}',\n '\\\\overline': '\\\\overline{#?}',\n '\\\\overrightarrow': '\\\\overrightarrow{#?}',\n '\\\\overleftrightarrow': '\\\\overleftrightarrow{#?}',\n // Native forms, not the pie macros: a macro would not serialise the user's\n // typed content back out (see toNativeCommands).\n '\\\\overarc': '\\\\overparen{#?}',\n '\\\\longdiv': '\\\\enclose{longdiv}{#?}',\n '^': '^{#?}',\n _: '_{#?}',\n '(': '\\\\left(#?\\\\right)',\n '[': '\\\\left[#?\\\\right]',\n '|': '\\\\left|#?\\\\right|',\n};\n\n/**\n * MathQuill keystroke names -> MathLive command selectors.\n */\nconst KEYSTROKES = {\n Left: 'moveToPreviousChar',\n Right: 'moveToNextChar',\n Backspace: 'deleteBackward',\n Delete: 'deleteForward',\n Up: 'moveUp',\n Down: 'moveDown',\n};\n\n/**\n * Translate a keypad key definition into a MathLive action.\n *\n * Mirrors the precedence in @pie-lib/math-input's MathInput.keypadPress:\n * latex (unless a command is present) -> write -> command -> keystroke.\n *\n * @param {object} key\n * @returns {{type: 'insert'|'command', value: string}|undefined}\n */\nexport const keyToAction = (key) => {\n if (!key) {\n return undefined;\n }\n\n if (key.latex && !key.command) {\n return { type: 'insert', value: key.latex };\n }\n\n if (key.write) {\n return { type: 'insert', value: key.write };\n }\n\n if (key.command) {\n // Some keys carry an array of commands (e.g. Measured Angle is\n // ['m', '\\\\angle'], log-base-n is ['\\\\log', '_']). MathQuill's `cmd()`\n // applied them in sequence; MathLive inserts one latex string, so expand\n // each part and concatenate.\n const parts = Array.isArray(key.command) ? key.command : [key.command];\n const value = parts.map((c) => COMMANDS_WITH_ARGS[c] || MATHQUILL_ALIASES[c] || c).join('');\n\n return { type: 'insert', value };\n }\n\n if (key.keystroke) {\n const selector = KEYSTROKES[key.keystroke];\n\n return selector ? { type: 'command', value: selector } : undefined;\n }\n\n return undefined;\n};\n\nexport { COMMANDS_WITH_ARGS, KEYSTROKES, MATHQUILL_ALIASES };\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"latex-bridge.js","names":["NEWLINE_EMBED","exports","NEWLINE_EMBED_REGEX","DISPLAYLINES_REGEX","MQ_FIELD_REGEX","PLACEHOLDER_REGEX","BARE_PLACEHOLDER_REGEX","BARE_PLACEHOLDER_NO_ARG_REGEX","DEFAULT_FIELD_ID","EMPTY_SLOT","EMPTY_GROUP_REGEX","EMPTY_FENCE_REGEX","EMPTY_FENCE_SLOT","withVisibleEmptySlots","latex","replace","concat","_m","open","close","toNativeCommands","out","replaceAbs","escapeBareComments","indexOf","backslashes","i","length","ch","idx","depth","inner","slice","fieldIds","match","lastIndex","exec","push","toMathLive","id","content","split","join","MATHQUILL_ALIASES","MATHQUILL_ALIAS_REGEX","PRIME_SUPERSCRIPT_REGEX","BARE_DOUBLEPRIME_REGEX","primesToApostrophes","primes","repeat","toCanonicalCommands","m","fromMathLive","trim","map","s","COMMANDS_WITH_ARGS","_","KEYSTROKES","Left","Right","Backspace","Delete","Up","Down","keyToAction","key","undefined","command","type","value","write","parts","Array","isArray","c","keystroke","selector"],"sources":["../src/latex-bridge.js"],"sourcesContent":["/**\n * LaTeX translation layer between the MathQuill-era content model and MathLive.\n *\n * Two independent concerns live here:\n *\n * 1. Newlines. MathQuill had no line break, so pie-lib registered a custom\n * `newLine` embed that serialises to `\\embed{newLine}[]`. MathLive has no\n * embed system but supports real multiline environments, so we translate\n * `\\embed{newLine}[]` <-> `\\\\` inside `\\displaylines{}`.\n *\n * Authored content keeps its `\\embed{newLine}[]` on-disk form (that is what\n * @pie-lib/math-rendering already normalises for MathJax), so each renderer\n * normalises at its own boundary and stored items stay compatible.\n *\n * 2. Keypad key -> MathLive action. MathQuill keys carry `write`/`command`/\n * `keystroke` built for `mf.write()` / `mf.cmd()` / `mf.keystroke()`.\n * MathLive has `insert()` and `executeCommand()` instead.\n */\n\nexport const NEWLINE_EMBED = '\\\\embed{newLine}[]';\nconst NEWLINE_EMBED_REGEX = /\\\\embed\\{newLine\\}\\[\\]/g;\nconst DISPLAYLINES_REGEX = /^\\\\displaylines\\{([\\s\\S]*)\\}$/;\n\n/**\n * MathQuill's editable sub-field syntax, e.g. `\\MathQuillMathField[r1]{}`.\n * These are the answer blocks in templated math items; MathLive expresses the\n * same idea as `\\placeholder[id]{}` and reads them back via the prompts API.\n */\nconst MQ_FIELD_REGEX = /\\\\MathQuillMathField\\[([^\\]]*)\\]\\{([^{}]*)\\}/g;\nconst PLACEHOLDER_REGEX = /\\\\placeholder\\[([^\\]]*)\\]\\{([^{}]*)\\}/g;\n\n/**\n * Unnamed placeholders, which MathLive inserts on its own.\n *\n * Typing a command with empty arguments (`\\longdiv{}`, `\\frac{}{}`) makes\n * MathLive serialise the empty slots as `\\placeholder{}`. That token is\n * MathLive-specific: MathJax - which @pie-lib/math-rendering uses to render\n * prompts and previews - has no such command and renders it as red error text.\n * Stored latex must therefore keep plain empty groups.\n */\nconst BARE_PLACEHOLDER_REGEX = /\\\\placeholder\\{([^{}]*)\\}/g;\nconst BARE_PLACEHOLDER_NO_ARG_REGEX = /\\\\placeholder(?![[{a-zA-Z])/g;\n\n/** Default id used when stored latex has an unnamed field. */\nexport const DEFAULT_FIELD_ID = 'r1';\n\n/**\n * A visible stand-in for an empty argument slot, used for STATIC rendering only.\n *\n * Stored latex legitimately contains empty groups - `\\longdiv{}`, `\\frac{}{}`,\n * `x^{}` - to express a command's shape. MathQuill drew those as a shaded box\n * (`.mq-empty`); MathLive renders `{}` as nothing, so `convertLatexToMarkup`\n * output comes out completely blank (not even the surrounding bracket, in the\n * case of `\\enclose{longdiv}{}`).\n *\n * `\\placeholder{}` is not usable here: in static markup it renders as a\n * non-breaking space, because its editable box only exists inside a live\n * mathfield. So something with real width is required.\n *\n * It must be a `\\rule`, not a unicode glyph. A glyph's width comes from font\n * metrics, and U+25AB is not in the KaTeX fonts - the browser substitutes a\n * wider fallback while MathLive still sizes surrounding accents from its own\n * metrics. That left stretchy accents (`\\overarc`, `\\overleftrightarrow`)\n * visibly narrower than the box they were meant to span. A rule carries an\n * explicit em width, so accents size correctly - and a filled box is closer to\n * MathQuill's `.mq-empty` anyway.\n *\n * Live mathfields need none of this - MathLive manages empty slots itself.\n */\nconst EMPTY_SLOT = '\\\\htmlData{pie-empty=1}{\\\\rule{0.55em}{0.55em}}';\nconst EMPTY_GROUP_REGEX = /\\{\\s*\\}/g;\n// Empty delimiter pairs: `\\abs{}` is converted to `\\left|\\right|`, and the\n// parenthesis / bracket keys are `\\left(\\right)` / `\\left[\\right]`. None has a\n// `{}` group for the rule above to catch, so they would render as bare fences.\nconst EMPTY_FENCE_REGEX = /\\\\left([([|])\\s*\\\\right([)\\]|])/g;\n// The same muted fill as the other slots (`pie-empty`), but a tall rectangle\n// rather than a square. It also sets the fences' height: `\\left...\\right` stretch\n// to their content, so a taller slot gives taller parentheses.\n//\n// A `\\rule` stands on the baseline, but the fences are centred on the math axis\n// (0.25em above it), so an un-lifted box sat high between them. `[-0.25em]`\n// lowers it by (axis - height / 2) = 0.25 - 1 / 2, centring it on the axis.\n//\n// Lowering it alone also shrinks the fences, which size themselves to their\n// content (MathLive switches to short bars). The zero-width `\\rule{0em}{1em}`\n// strut keeps the content as tall as before, so the bars keep their height and\n// only the box moves.\nconst EMPTY_FENCE_SLOT = '\\\\rule{0em}{1em}\\\\htmlData{pie-empty=1}{\\\\rule[-0.25em]{0.55em}{1em}}';\n\n/**\n * Make empty argument slots visible, for static rendering.\n *\n * Display-only: never feed the result to a mathfield or to storage - the\n * original latex is what gets typed and saved.\n *\n * @param {string} latex\n * @returns {string}\n */\nexport const withVisibleEmptySlots = (latex) =>\n (latex || '')\n .replace(EMPTY_GROUP_REGEX, `{${EMPTY_SLOT}}`)\n .replace(EMPTY_FENCE_REGEX, (_m, open, close) => `\\\\left${open}${EMPTY_FENCE_SLOT}\\\\right${close}`);\n\n/**\n * Pie commands that take an argument, and their native MathLive equivalents.\n *\n * These MUST NOT be handled as MathLive macros. A macro is serialised from the\n * arguments it was created with, so text typed inside its expansion never makes\n * it back out: `getValue('latex')` keeps returning `\\longdiv{\\placeholder{}}`\n * while `getValue('ascii-math')` shows the typed content. Setting\n * `captureSelection: false` lets the cursor in but does not change\n * serialisation.\n *\n * Expanding to native constructs instead gives real, editable atoms that\n * round-trip. All three targets are understood by MathJax too, so stored latex\n * still renders in @pie-lib/math-rendering without a reverse mapping.\n */\n/**\n * Rewrite argument-taking pie commands into native MathLive latex.\n * Applied on the way *into* a mathfield.\n *\n * @param {string} latex\n * @returns {string}\n */\nexport const toNativeCommands = (latex) => {\n if (typeof latex !== 'string' || !latex) {\n return latex || '';\n }\n\n let out = latex;\n\n // \\abs{x} -> \\left|x\\right| needs brace-aware handling, the rest are prefix\n // swaps.\n out = replaceAbs(out);\n out = out.replace(/\\\\longdiv\\{/g, '\\\\enclose{longdiv}{');\n out = out.replace(/\\\\overarc\\{/g, '\\\\overparen{');\n out = escapeBareComments(out);\n\n return out;\n};\n\n/**\n * Escape an unescaped `%`.\n *\n * In real LaTeX `%` starts a comment, so MathLive discards it *and everything\n * after it*: `50%` renders as `50`, and `x%y` as just `x`. MathQuill had no\n * such notion - it treated `%` as a symbol - so latex from anywhere outside the\n * keypad may still carry a bare one.\n *\n * Only a `%` preceded by an even number of backslashes is bare: `\\%` is already\n * escaped, while the `%` in `\\\\%` (a line break, then a comment) is not.\n *\n * @param {string} latex\n * @returns {string}\n */\nconst escapeBareComments = (latex) => {\n if (latex.indexOf('%') === -1) {\n return latex;\n }\n\n let out = '';\n // Consecutive backslashes immediately before the current character.\n let backslashes = 0;\n\n for (let i = 0; i < latex.length; i++) {\n const ch = latex[i];\n\n out += ch === '%' && backslashes % 2 === 0 ? '\\\\%' : ch;\n backslashes = ch === '\\\\' ? backslashes + 1 : 0;\n }\n\n return out;\n};\n\n/** `\\abs{x}` -> `\\left|x\\right|`, matching balanced braces. */\nconst replaceAbs = (latex) => {\n let out = latex;\n let idx = out.indexOf('\\\\abs{');\n\n while (idx !== -1) {\n const open = idx + '\\\\abs{'.length - 1;\n let depth = 0;\n let close = -1;\n\n for (let i = open; i < out.length; i++) {\n if (out[i] === '{') depth++;\n else if (out[i] === '}') {\n depth--;\n if (depth === 0) {\n close = i;\n break;\n }\n }\n }\n\n if (close === -1) {\n break;\n }\n\n const inner = out.slice(open + 1, close);\n\n out = `${out.slice(0, idx)}\\\\left|${inner}\\\\right|${out.slice(close + 1)}`;\n idx = out.indexOf('\\\\abs{');\n }\n\n return out;\n};\n\n/**\n * Ids of the answer blocks in a piece of stored latex, in document order.\n *\n * @param {string} latex\n * @returns {string[]}\n */\nexport const fieldIds = (latex) => {\n if (typeof latex !== 'string') {\n return [];\n }\n\n const out = [];\n let match;\n\n MQ_FIELD_REGEX.lastIndex = 0;\n\n while ((match = MQ_FIELD_REGEX.exec(latex)) !== null) {\n out.push(match[1] || DEFAULT_FIELD_ID);\n }\n\n return out;\n};\n\n/**\n * Convert stored latex (which may contain `\\embed{newLine}[]`) into latex that\n * MathLive can parse and render as multiple lines.\n *\n * @param {string} latex\n * @returns {string}\n */\nexport const toMathLive = (latex) => {\n if (typeof latex !== 'string' || !latex) {\n return latex || '';\n }\n\n // Argument-taking pie commands -> native constructs, so their content stays\n // editable and serialises back correctly (see toNativeCommands).\n let out = toNativeCommands(latex);\n\n // Answer blocks: \\MathQuillMathField[id]{x} -> \\placeholder[id]{x}\n out = out.replace(MQ_FIELD_REGEX, (_m, id, content) => `\\\\placeholder[${id || DEFAULT_FIELD_ID}]{${content}}`);\n\n // Newlines: \\embed{newLine}[] -> a multiline environment\n if (out.indexOf(NEWLINE_EMBED) !== -1) {\n out = `\\\\displaylines{${out.split(NEWLINE_EMBED_REGEX).join(' \\\\\\\\ ')}}`;\n }\n\n return out;\n};\n\n/**\n * Keypad command names that MathQuill treated as ALIASES of a different command.\n *\n * MathQuill registered `\\\\divide` as another name for `\\\\div` (and\n * `\\\\perpendicular` for `\\\\perp`), so pressing the key stored the real command.\n * MathLive only knows these names through `PIE_MACROS`, and serialises a macro\n * under its own name - so `\\\\divide` reached storage verbatim, where MathJax\n * (@pie-lib/math-rendering) has no such command and renders it as red text.\n *\n * Every other keypad command already matches what MathQuill stored (`\\\\degree`,\n * `\\\\nsim`, `\\\\ncong`, `\\\\nparallel`, `\\\\square`, `\\\\napprox`,\n * `\\\\parallelogram`), and MathJax understands those.\n */\nconst MATHQUILL_ALIASES = {\n '\\\\divide': '\\\\div',\n '\\\\perpendicular': '\\\\perp',\n};\n\n// Whole command names only: `\\\\divideontimes` is a real AMS symbol.\nconst MATHQUILL_ALIAS_REGEX = /\\\\(divide|perpendicular)(?![a-zA-Z])/g;\n\n/**\n * Primes. MathLive turns a prime that follows a base into a superscript atom and\n * serialises it as `^{\\\\prime}`, or `^{\\\\doubleprime}` for the keypad's double\n * prime key (`5''` comes back out as `5^{\\\\doubleprime}`). MathJax has no\n * `\\\\doubleprime`, and two adjacent `^{\\\\prime}` groups - what typing `'` twice\n * produces - are a \"double exponent\" error. MathQuill stored plain apostrophes,\n * which both MathJax and MathLive read as primes, so store those.\n *\n * Only a superscript made of primes alone is rewritten: `x^{\\\\prime 2}` keeps\n * its group, since it holds more than primes.\n */\nconst PRIME_SUPERSCRIPT_REGEX = /\\^\\{((?:\\s*\\\\(?:prime|doubleprime)(?![a-zA-Z]))+)\\s*\\}/g;\nconst BARE_DOUBLEPRIME_REGEX = /\\\\doubleprime(?![a-zA-Z])/g;\n\nconst primesToApostrophes = (primes) =>\n // eslint-disable-next-line quotes\n \"'\".repeat(\n (primes.match(/\\\\prime(?![a-zA-Z])/g) || []).length + 2 * (primes.match(BARE_DOUBLEPRIME_REGEX) || []).length,\n );\n\n/**\n * Rewrite what MathLive serialises into the form MathQuill stored: alias\n * command names, and primes.\n *\n * @param {string} latex\n * @returns {string}\n */\nexport const toCanonicalCommands = (latex) =>\n typeof latex === 'string'\n ? latex\n .replace(MATHQUILL_ALIAS_REGEX, (m) => MATHQUILL_ALIASES[m])\n .replace(PRIME_SUPERSCRIPT_REGEX, (_m, primes) => primesToApostrophes(primes))\n // eslint-disable-next-line quotes\n .replace(BARE_DOUBLEPRIME_REGEX, \"''\")\n : latex;\n\n/**\n * Convert latex out of MathLive back into the stored form, so items authored\n * with the MathLive editor remain readable by @pie-lib/math-rendering and by\n * the existing MathQuill implementation.\n *\n * @param {string} latex\n * @returns {string}\n */\nexport const fromMathLive = (latex) => {\n if (typeof latex !== 'string' || !latex) {\n return latex || '';\n }\n\n const match = latex.trim().match(DISPLAYLINES_REGEX);\n let out = match ? match[1] : latex;\n\n // `\\\\` is the line separator inside a multiline environment.\n if (out.indexOf('\\\\\\\\') !== -1) {\n out = out\n .split(/\\s*\\\\\\\\\\s*/)\n .map((s) => s.trim())\n .join(NEWLINE_EMBED);\n }\n\n // Answer blocks: \\placeholder[id]{x} -> \\MathQuillMathField[id]{x}\n out = out.replace(\n PLACEHOLDER_REGEX,\n (_m, id, content) => `\\\\MathQuillMathField[${id || DEFAULT_FIELD_ID}]{${content}}`,\n );\n\n // Unnamed placeholders are MathLive's own representation of an empty slot and\n // must not reach storage or MathJax. Unwrap them: keep any content, drop the\n // command itself (the surrounding braces are already part of the host latex,\n // so re-adding them here would produce `\\longdiv{{}}`).\n out = out.replace(BARE_PLACEHOLDER_REGEX, (_m, content) => content);\n out = out.replace(BARE_PLACEHOLDER_NO_ARG_REGEX, '');\n\n // Store the command MathQuill stored, not the alias - also heals latex that was\n // saved with `\\\\divide` before the keypad resolved it.\n return toCanonicalCommands(out);\n};\n\n/**\n * MathQuill `cmd()` semantics: commands that take arguments should land the\n * cursor inside the first argument. MathLive expresses that with `#?`\n * placeholders in the inserted latex.\n */\nconst COMMANDS_WITH_ARGS = {\n // An explicit \"blank over blank\" key: both slots start empty.\n '\\\\frac': '\\\\frac{#?}{#?}',\n // Division, which must behave like MathQuill's `/`: whatever precedes the\n // cursor becomes the numerator and the caret lands in the denominator. `#@`\n // is MathLive's token for \"the selection, or the item before the cursor\" -\n // this is exactly the template MathLive binds to the `/` key itself. Using\n // `#?` here instead produced an empty fraction and left the typed number\n // stranded outside it.\n '/': '\\\\frac{#@}{#?}',\n '\\\\sqrt': '\\\\sqrt{#?}',\n '\\\\nthroot': '\\\\sqrt[#?]{#?}',\n '\\\\overline': '\\\\overline{#?}',\n '\\\\overrightarrow': '\\\\overrightarrow{#?}',\n '\\\\overleftrightarrow': '\\\\overleftrightarrow{#?}',\n // Native forms, not the pie macros: a macro would not serialise the user's\n // typed content back out (see toNativeCommands).\n '\\\\overarc': '\\\\overparen{#?}',\n '\\\\longdiv': '\\\\enclose{longdiv}{#?}',\n '^': '^{#?}',\n _: '_{#?}',\n '(': '\\\\left(#?\\\\right)',\n '[': '\\\\left[#?\\\\right]',\n '|': '\\\\left|#?\\\\right|',\n};\n\n/**\n * MathQuill keystroke names -> MathLive command selectors.\n */\nconst KEYSTROKES = {\n Left: 'moveToPreviousChar',\n Right: 'moveToNextChar',\n Backspace: 'deleteBackward',\n Delete: 'deleteForward',\n Up: 'moveUp',\n Down: 'moveDown',\n};\n\n/**\n * Translate a keypad key definition into a MathLive action.\n *\n * Mirrors the precedence in @pie-lib/math-input's MathInput.keypadPress:\n * latex (unless a command is present) -> write -> command -> keystroke.\n *\n * @param {object} key\n * @returns {{type: 'insert'|'command', value: string}|undefined}\n */\nexport const keyToAction = (key) => {\n if (!key) {\n return undefined;\n }\n\n if (key.latex && !key.command) {\n return { type: 'insert', value: key.latex };\n }\n\n if (key.write) {\n return { type: 'insert', value: key.write };\n }\n\n if (key.command) {\n // Some keys carry an array of commands (e.g. Measured Angle is\n // ['m', '\\\\angle'], log-base-n is ['\\\\log', '_']). MathQuill's `cmd()`\n // applied them in sequence; MathLive inserts one latex string, so expand\n // each part and concatenate.\n const parts = Array.isArray(key.command) ? key.command : [key.command];\n const value = parts.map((c) => COMMANDS_WITH_ARGS[c] || MATHQUILL_ALIASES[c] || c).join('');\n\n return { type: 'insert', value };\n }\n\n if (key.keystroke) {\n const selector = KEYSTROKES[key.keystroke];\n\n return selector ? { type: 'command', value: selector } : undefined;\n }\n\n return undefined;\n};\n\nexport { COMMANDS_WITH_ARGS, KEYSTROKES, MATHQUILL_ALIASES };\n"],"mappings":"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","ignoreList":[]}
package/lib/mf/input.js CHANGED
@@ -114,6 +114,11 @@ var Input = exports.Input = /*#__PURE__*/function (_React$Component) {
114
114
  // Without this the spacebar does nothing: MathLive's mathModeSpace
115
115
  // defaults to an empty string.
116
116
  this.mathField.mathModeSpace = _mathliveInstance.MATH_MODE_SPACE;
117
+ // After the exponent key the cursor must stay in the exponent until it is moved
118
+ // MathLive's `smartSuperscript` (on by
119
+ // default) jumps out of an empty superscript after a single digit, which breaks
120
+ // typing x^23 or 10^6 and is inconsistent with non-digit exponents.
121
+ this.mathField.smartSuperscript = false;
117
122
 
118
123
  // The mathfield renders in shadow DOM, so page CSS cannot reach it - the
119
124
  // stretchy-accent fix has to be injected there directly.
@@ -1 +1 @@
1
- {"version":3,"file":"input.js","names":["_react","_interopRequireDefault","require","_propTypes","_styles","_debug","_mathliveInstance","_latexBridge","_callSuper","t","o","e","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","apply","Boolean","prototype","valueOf","call","log","debug","Holder","styled","display","width","Input","exports","_React$Component","props","_this","_classCallCheck2","_defineProperty2","onChange","mathField","latex","fromMathLive","getValue","lastEmitted","event","key","preventDefault","holderRef","React","createRef","undefined","_inherits2","_createClass2","value","_componentDidMount","_asyncToGenerator2","_regenerator","mark","_callee","generation","ml","wrap","_context","prev","next","mountGeneration","loadMathLive","sent","current","abrupt","MathfieldElement","macros","getMacros","toMathLive","readOnly","mathVirtualKeyboardPolicy","mathModeSpace","MATH_MODE_SPACE","applyShadowStyles","untrackCaret","trackPlaceholderCaret","addEventListener","onInputEdit","replaceChildren","innerRef","stop","componentDidMount","arguments","componentDidUpdate","prevProps","_this$props","componentWillUnmount","removeEventListener","remove","get","_this2","v","setLatex","el","focus","blur","clear","command","action","keyToAction","insert","keystroke","selector","KEYSTROKES","executeCommand","message","write","_this3","values","Array","isArray","forEach","vv","render","_this$props2","className","onFocus","onBlur","onClick","createElement","onKeyDown","ref","Component","PropTypes","string","func","bool","_default"],"sources":["../../src/mf/input.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { styled } from '@mui/material/styles';\nimport debug from 'debug';\nimport {\n loadMathLive,\n getMacros,\n MATH_MODE_SPACE,\n applyShadowStyles,\n trackPlaceholderCaret,\n} from '../mathlive-instance';\nimport { toMathLive, fromMathLive, keyToAction, KEYSTROKES } from '../latex-bridge';\n\nconst log = debug('pie-lib:math-input-mathlive:input');\n\nconst Holder = styled('span')({\n display: 'inline-block',\n '& math-field': {\n display: 'block',\n width: '100%',\n },\n // MathLive ships its own virtual keyboard toggle; pie supplies its own keypad.\n '& math-field::part(virtual-keyboard-toggle)': {\n display: 'none',\n },\n '& math-field::part(menu-toggle)': {\n display: 'none',\n },\n});\n\n/**\n * Editable math field. Drop-in replacement for @pie-lib/math-input's `mq.Input`.\n *\n * Keeps the same imperative surface used by MathInput's keypad\n * (`write`, `command`, `keystroke`, `clear`, `focus`, `blur`) so callers do not\n * change, and the same `latex` / `onChange` props.\n */\nexport class Input extends React.Component {\n static propTypes = {\n className: PropTypes.string,\n latex: PropTypes.string,\n onChange: PropTypes.func,\n onClick: PropTypes.func,\n onFocus: PropTypes.func,\n onBlur: PropTypes.func,\n readOnly: PropTypes.bool,\n innerRef: PropTypes.func,\n };\n\n constructor(props) {\n super(props);\n this.holderRef = React.createRef();\n // Tracks the last latex we emitted, so prop echoes don't reset the cursor.\n this.lastEmitted = undefined;\n }\n\n async componentDidMount() {\n // MathLive loads asynchronously, so this method resumes after an await and\n // has to know whether it is still the current mount. React StrictMode calls\n // mount -> unmount -> mount on the SAME instance in dev, so a boolean\n // \"unmounted\" flag would latch and block the remount from ever creating a\n // field. A generation counter identifies the live mount instead: only the\n // newest one proceeds, and a real unmount invalidates all pending ones.\n const generation = (this.mountGeneration = (this.mountGeneration || 0) + 1);\n const ml = await loadMathLive();\n\n if (generation !== this.mountGeneration || !ml || !this.holderRef.current || this.mathField) {\n return;\n }\n\n this.mathField = new ml.MathfieldElement({ macros: getMacros() });\n this.mathField.value = toMathLive(this.props.latex || '');\n\n if (this.props.readOnly) {\n this.mathField.readOnly = true;\n }\n\n // pie drives input through its own keypad, so suppress MathLive's.\n this.mathField.mathVirtualKeyboardPolicy = 'manual';\n // Without this the spacebar does nothing: MathLive's mathModeSpace\n // defaults to an empty string.\n this.mathField.mathModeSpace = MATH_MODE_SPACE;\n\n // The mathfield renders in shadow DOM, so page CSS cannot reach it - the\n // stretchy-accent fix has to be injected there directly.\n applyShadowStyles(this.mathField);\n\n // A selected `\\placeholder{}` gets no MathLive caret; draw one.\n this.untrackCaret = trackPlaceholderCaret(this.mathField);\n\n this.mathField.addEventListener('input', this.onInputEdit);\n\n // Belt and braces: drop anything a previous mount may have left behind.\n this.holderRef.current.replaceChildren(this.mathField);\n\n if (this.props.innerRef) {\n this.props.innerRef(this);\n }\n }\n\n componentDidUpdate(prevProps) {\n if (!this.mathField) {\n return;\n }\n\n const { latex, readOnly } = this.props;\n\n if (readOnly !== prevProps.readOnly) {\n this.mathField.readOnly = !!readOnly;\n }\n\n // Only push the prop back into the field when it genuinely differs from\n // what the field already holds. This is the analogue of the old\n // shouldComponentUpdate latex-equality guard and prevents cursor thrash.\n if (latex !== undefined && latex !== null && latex !== this.lastEmitted) {\n const next = toMathLive(latex);\n\n if (next !== this.mathField.value) {\n this.mathField.value = next;\n }\n }\n }\n\n componentWillUnmount() {\n // Invalidate any mount still awaiting the MathLive load, so it does not\n // append a field into a holder that is going away.\n this.mountGeneration = (this.mountGeneration || 0) + 1;\n\n if (this.untrackCaret) {\n this.untrackCaret();\n this.untrackCaret = undefined;\n }\n\n if (this.mathField) {\n this.mathField.removeEventListener('input', this.onInputEdit);\n this.mathField.remove();\n this.mathField = undefined;\n }\n\n if (this.props.innerRef) {\n this.props.innerRef(null);\n }\n }\n\n onInputEdit = () => {\n const { onChange } = this.props;\n\n if (!this.mathField) {\n return;\n }\n\n const latex = fromMathLive(this.mathField.getValue('latex'));\n\n this.lastEmitted = latex;\n\n if (onChange) {\n onChange(latex);\n }\n };\n\n /** Current latex, in stored (MathQuill-compatible) form. */\n latex() {\n return this.mathField ? fromMathLive(this.mathField.getValue('latex')) : '';\n }\n\n /**\n * The underlying `<math-field>` element, or undefined until MathLive has\n * finished loading. Exposed for callers that need the real element.\n *\n * NOTE: this is NOT a MathQuill field. Code written against\n * `@pie-lib/math-input` often did `input.mathField.latex()`; that shape is\n * provided by `mqCompat` below, and `latex()` on this component is the\n * supported replacement.\n */\n get element() {\n return this.mathField;\n }\n\n /**\n * MathQuill-shaped facade, so existing `input.mathField.latex()` /\n * `.el()` call sites keep working instead of throwing. Only the members that\n * consumers actually used are provided; MathQuill internals such as\n * `__controller` have no MathLive equivalent and are deliberately absent.\n */\n get mqCompat() {\n return {\n latex: (v) => (v === undefined ? this.latex() : (this.setLatex(v), v)),\n el: () => this.mathField,\n focus: () => this.focus(),\n blur: () => this.blur(),\n };\n }\n\n /** Programmatically replace the content. */\n setLatex(v) {\n if (this.mathField) {\n this.mathField.value = toMathLive(v || '');\n }\n }\n\n clear() {\n if (this.mathField) {\n this.mathField.value = '';\n }\n\n return '';\n }\n\n blur() {\n log('blur mathfield');\n this.mathField && this.mathField.blur();\n }\n\n focus() {\n log('focus mathfield...');\n this.mathField && this.mathField.focus();\n }\n\n /**\n * MathQuill `cmd()` equivalent.\n *\n * Callers pass MathQuill command names (`'\\\\frac'`, `'\\\\sqrt'`, `'^'`, or an\n * array of them). Those must be expanded into latex with `#?` placeholders,\n * otherwise inserting a bare `\\frac` produces no editable slots.\n */\n command(v) {\n log('command: ', v);\n\n if (!this.mathField) {\n return '';\n }\n\n const action = keyToAction({ command: v });\n\n if (action) {\n this.mathField.insert(action.value, { focus: true });\n }\n\n this.mathField.focus();\n\n return this.latex();\n }\n\n /**\n * MathQuill `keystroke()` equivalent.\n *\n * Accepts MathQuill keystroke names (`'Left'`, `'Right'`, `'Backspace'`) as\n * the keypad emits them, and passes anything else through as a MathLive\n * selector.\n */\n keystroke(v) {\n log('keystroke: ', v);\n\n if (!this.mathField) {\n return '';\n }\n\n const selector = KEYSTROKES[v] || v;\n\n try {\n this.mathField.executeCommand(selector);\n } catch (e) {\n log('unknown keystroke/selector \"%s\": %s', v, e && e.message);\n }\n\n this.mathField.focus();\n\n return this.latex();\n }\n\n /** MathQuill `write()` equivalent. Accepts an array, as `cmd()` did. */\n write(v) {\n log('write: ', v);\n\n if (!this.mathField) {\n return '';\n }\n\n const values = Array.isArray(v) ? v : [v];\n\n values.forEach((vv) => this.mathField.insert(vv, { focus: true }));\n this.mathField.focus();\n\n return this.latex();\n }\n\n /**\n * Enter must not insert a line break: math input is single-expression, and\n * the MathQuill version swallowed charCode 13 for the same reason. Newlines\n * are authored explicitly through the newLine embed, not the Enter key.\n */\n onKeyDown = (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n }\n };\n\n render() {\n const { className, onFocus, onBlur, onClick } = this.props;\n\n return (\n <Holder\n className={className}\n onFocus={onFocus}\n onBlur={onBlur}\n onClick={onClick}\n onKeyDown={this.onKeyDown}\n ref={this.holderRef}\n />\n );\n }\n}\n\nexport default Input;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"input.js","names":["_react","_interopRequireDefault","require","_propTypes","_styles","_debug","_mathliveInstance","_latexBridge","_callSuper","t","o","e","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","apply","Boolean","prototype","valueOf","call","log","debug","Holder","styled","display","width","Input","exports","_React$Component","props","_this","_classCallCheck2","_defineProperty2","onChange","mathField","latex","fromMathLive","getValue","lastEmitted","event","key","preventDefault","holderRef","React","createRef","undefined","_inherits2","_createClass2","value","_componentDidMount","_asyncToGenerator2","_regenerator","mark","_callee","generation","ml","wrap","_context","prev","next","mountGeneration","loadMathLive","sent","current","abrupt","MathfieldElement","macros","getMacros","toMathLive","readOnly","mathVirtualKeyboardPolicy","mathModeSpace","MATH_MODE_SPACE","smartSuperscript","applyShadowStyles","untrackCaret","trackPlaceholderCaret","addEventListener","onInputEdit","replaceChildren","innerRef","stop","componentDidMount","arguments","componentDidUpdate","prevProps","_this$props","componentWillUnmount","removeEventListener","remove","get","_this2","v","setLatex","el","focus","blur","clear","command","action","keyToAction","insert","keystroke","selector","KEYSTROKES","executeCommand","message","write","_this3","values","Array","isArray","forEach","vv","render","_this$props2","className","onFocus","onBlur","onClick","createElement","onKeyDown","ref","Component","PropTypes","string","func","bool","_default"],"sources":["../../src/mf/input.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { styled } from '@mui/material/styles';\nimport debug from 'debug';\nimport {\n loadMathLive,\n getMacros,\n MATH_MODE_SPACE,\n applyShadowStyles,\n trackPlaceholderCaret,\n} from '../mathlive-instance';\nimport { toMathLive, fromMathLive, keyToAction, KEYSTROKES } from '../latex-bridge';\n\nconst log = debug('pie-lib:math-input-mathlive:input');\n\nconst Holder = styled('span')({\n display: 'inline-block',\n '& math-field': {\n display: 'block',\n width: '100%',\n },\n // MathLive ships its own virtual keyboard toggle; pie supplies its own keypad.\n '& math-field::part(virtual-keyboard-toggle)': {\n display: 'none',\n },\n '& math-field::part(menu-toggle)': {\n display: 'none',\n },\n});\n\n/**\n * Editable math field. Drop-in replacement for @pie-lib/math-input's `mq.Input`.\n *\n * Keeps the same imperative surface used by MathInput's keypad\n * (`write`, `command`, `keystroke`, `clear`, `focus`, `blur`) so callers do not\n * change, and the same `latex` / `onChange` props.\n */\nexport class Input extends React.Component {\n static propTypes = {\n className: PropTypes.string,\n latex: PropTypes.string,\n onChange: PropTypes.func,\n onClick: PropTypes.func,\n onFocus: PropTypes.func,\n onBlur: PropTypes.func,\n readOnly: PropTypes.bool,\n innerRef: PropTypes.func,\n };\n\n constructor(props) {\n super(props);\n this.holderRef = React.createRef();\n // Tracks the last latex we emitted, so prop echoes don't reset the cursor.\n this.lastEmitted = undefined;\n }\n\n async componentDidMount() {\n // MathLive loads asynchronously, so this method resumes after an await and\n // has to know whether it is still the current mount. React StrictMode calls\n // mount -> unmount -> mount on the SAME instance in dev, so a boolean\n // \"unmounted\" flag would latch and block the remount from ever creating a\n // field. A generation counter identifies the live mount instead: only the\n // newest one proceeds, and a real unmount invalidates all pending ones.\n const generation = (this.mountGeneration = (this.mountGeneration || 0) + 1);\n const ml = await loadMathLive();\n\n if (generation !== this.mountGeneration || !ml || !this.holderRef.current || this.mathField) {\n return;\n }\n\n this.mathField = new ml.MathfieldElement({ macros: getMacros() });\n this.mathField.value = toMathLive(this.props.latex || '');\n\n if (this.props.readOnly) {\n this.mathField.readOnly = true;\n }\n\n // pie drives input through its own keypad, so suppress MathLive's.\n this.mathField.mathVirtualKeyboardPolicy = 'manual';\n // Without this the spacebar does nothing: MathLive's mathModeSpace\n // defaults to an empty string.\n this.mathField.mathModeSpace = MATH_MODE_SPACE;\n // After the exponent key the cursor must stay in the exponent until it is moved\n // MathLive's `smartSuperscript` (on by\n // default) jumps out of an empty superscript after a single digit, which breaks\n // typing x^23 or 10^6 and is inconsistent with non-digit exponents.\n this.mathField.smartSuperscript = false;\n\n // The mathfield renders in shadow DOM, so page CSS cannot reach it - the\n // stretchy-accent fix has to be injected there directly.\n applyShadowStyles(this.mathField);\n\n // A selected `\\placeholder{}` gets no MathLive caret; draw one.\n this.untrackCaret = trackPlaceholderCaret(this.mathField);\n\n this.mathField.addEventListener('input', this.onInputEdit);\n\n // Belt and braces: drop anything a previous mount may have left behind.\n this.holderRef.current.replaceChildren(this.mathField);\n\n if (this.props.innerRef) {\n this.props.innerRef(this);\n }\n }\n\n componentDidUpdate(prevProps) {\n if (!this.mathField) {\n return;\n }\n\n const { latex, readOnly } = this.props;\n\n if (readOnly !== prevProps.readOnly) {\n this.mathField.readOnly = !!readOnly;\n }\n\n // Only push the prop back into the field when it genuinely differs from\n // what the field already holds. This is the analogue of the old\n // shouldComponentUpdate latex-equality guard and prevents cursor thrash.\n if (latex !== undefined && latex !== null && latex !== this.lastEmitted) {\n const next = toMathLive(latex);\n\n if (next !== this.mathField.value) {\n this.mathField.value = next;\n }\n }\n }\n\n componentWillUnmount() {\n // Invalidate any mount still awaiting the MathLive load, so it does not\n // append a field into a holder that is going away.\n this.mountGeneration = (this.mountGeneration || 0) + 1;\n\n if (this.untrackCaret) {\n this.untrackCaret();\n this.untrackCaret = undefined;\n }\n\n if (this.mathField) {\n this.mathField.removeEventListener('input', this.onInputEdit);\n this.mathField.remove();\n this.mathField = undefined;\n }\n\n if (this.props.innerRef) {\n this.props.innerRef(null);\n }\n }\n\n onInputEdit = () => {\n const { onChange } = this.props;\n\n if (!this.mathField) {\n return;\n }\n\n const latex = fromMathLive(this.mathField.getValue('latex'));\n\n this.lastEmitted = latex;\n\n if (onChange) {\n onChange(latex);\n }\n };\n\n /** Current latex, in stored (MathQuill-compatible) form. */\n latex() {\n return this.mathField ? fromMathLive(this.mathField.getValue('latex')) : '';\n }\n\n /**\n * The underlying `<math-field>` element, or undefined until MathLive has\n * finished loading. Exposed for callers that need the real element.\n *\n * NOTE: this is NOT a MathQuill field. Code written against\n * `@pie-lib/math-input` often did `input.mathField.latex()`; that shape is\n * provided by `mqCompat` below, and `latex()` on this component is the\n * supported replacement.\n */\n get element() {\n return this.mathField;\n }\n\n /**\n * MathQuill-shaped facade, so existing `input.mathField.latex()` /\n * `.el()` call sites keep working instead of throwing. Only the members that\n * consumers actually used are provided; MathQuill internals such as\n * `__controller` have no MathLive equivalent and are deliberately absent.\n */\n get mqCompat() {\n return {\n latex: (v) => (v === undefined ? this.latex() : (this.setLatex(v), v)),\n el: () => this.mathField,\n focus: () => this.focus(),\n blur: () => this.blur(),\n };\n }\n\n /** Programmatically replace the content. */\n setLatex(v) {\n if (this.mathField) {\n this.mathField.value = toMathLive(v || '');\n }\n }\n\n clear() {\n if (this.mathField) {\n this.mathField.value = '';\n }\n\n return '';\n }\n\n blur() {\n log('blur mathfield');\n this.mathField && this.mathField.blur();\n }\n\n focus() {\n log('focus mathfield...');\n this.mathField && this.mathField.focus();\n }\n\n /**\n * MathQuill `cmd()` equivalent.\n *\n * Callers pass MathQuill command names (`'\\\\frac'`, `'\\\\sqrt'`, `'^'`, or an\n * array of them). Those must be expanded into latex with `#?` placeholders,\n * otherwise inserting a bare `\\frac` produces no editable slots.\n */\n command(v) {\n log('command: ', v);\n\n if (!this.mathField) {\n return '';\n }\n\n const action = keyToAction({ command: v });\n\n if (action) {\n this.mathField.insert(action.value, { focus: true });\n }\n\n this.mathField.focus();\n\n return this.latex();\n }\n\n /**\n * MathQuill `keystroke()` equivalent.\n *\n * Accepts MathQuill keystroke names (`'Left'`, `'Right'`, `'Backspace'`) as\n * the keypad emits them, and passes anything else through as a MathLive\n * selector.\n */\n keystroke(v) {\n log('keystroke: ', v);\n\n if (!this.mathField) {\n return '';\n }\n\n const selector = KEYSTROKES[v] || v;\n\n try {\n this.mathField.executeCommand(selector);\n } catch (e) {\n log('unknown keystroke/selector \"%s\": %s', v, e && e.message);\n }\n\n this.mathField.focus();\n\n return this.latex();\n }\n\n /** MathQuill `write()` equivalent. Accepts an array, as `cmd()` did. */\n write(v) {\n log('write: ', v);\n\n if (!this.mathField) {\n return '';\n }\n\n const values = Array.isArray(v) ? v : [v];\n\n values.forEach((vv) => this.mathField.insert(vv, { focus: true }));\n this.mathField.focus();\n\n return this.latex();\n }\n\n /**\n * Enter must not insert a line break: math input is single-expression, and\n * the MathQuill version swallowed charCode 13 for the same reason. Newlines\n * are authored explicitly through the newLine embed, not the Enter key.\n */\n onKeyDown = (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n }\n };\n\n render() {\n const { className, onFocus, onBlur, onClick } = this.props;\n\n return (\n <Holder\n className={className}\n onFocus={onFocus}\n onBlur={onBlur}\n onClick={onClick}\n onKeyDown={this.onKeyDown}\n ref={this.holderRef}\n />\n );\n }\n}\n\nexport default Input;\n"],"mappings":";;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,UAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,iBAAA,GAAAJ,OAAA;AAOA,IAAAK,YAAA,GAAAL,OAAA;AAAoF,SAAAM,WAAAC,CAAA,EAAAC,CAAA,EAAAC,CAAA,WAAAD,CAAA,OAAAE,gBAAA,aAAAF,CAAA,OAAAG,2BAAA,aAAAJ,CAAA,EAAAK,yBAAA,KAAAC,OAAA,CAAAC,SAAA,CAAAN,CAAA,EAAAC,CAAA,YAAAC,gBAAA,aAAAH,CAAA,EAAAQ,WAAA,IAAAP,CAAA,CAAAQ,KAAA,CAAAT,CAAA,EAAAE,CAAA;AAAA,SAAAG,0BAAA,cAAAL,CAAA,IAAAU,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAP,OAAA,CAAAC,SAAA,CAAAG,OAAA,iCAAAV,CAAA,aAAAK,yBAAA,YAAAA,0BAAA,aAAAL,CAAA;AAEpF,IAAMc,GAAG,GAAG,IAAAC,iBAAK,EAAC,mCAAmC,CAAC;AAEtD,IAAMC,MAAM,GAAG,IAAAC,cAAM,EAAC,MAAM,CAAC,CAAC;EAC5BC,OAAO,EAAE,cAAc;EACvB,cAAc,EAAE;IACdA,OAAO,EAAE,OAAO;IAChBC,KAAK,EAAE;EACT,CAAC;EACD;EACA,6CAA6C,EAAE;IAC7CD,OAAO,EAAE;EACX,CAAC;EACD,iCAAiC,EAAE;IACjCA,OAAO,EAAE;EACX;AACF,CAAC,CAAC;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOaE,KAAK,GAAAC,OAAA,CAAAD,KAAA,0BAAAE,gBAAA;EAYhB,SAAAF,MAAYG,KAAK,EAAE;IAAA,IAAAC,KAAA;IAAA,IAAAC,gBAAA,mBAAAL,KAAA;IACjBI,KAAA,GAAAzB,UAAA,OAAAqB,KAAA,GAAMG,KAAK;IAAE,IAAAG,gBAAA,aAAAF,KAAA,iBAmGD,YAAM;MAClB,IAAQG,QAAQ,GAAKH,KAAA,CAAKD,KAAK,CAAvBI,QAAQ;MAEhB,IAAI,CAACH,KAAA,CAAKI,SAAS,EAAE;QACnB;MACF;MAEA,IAAMC,KAAK,GAAG,IAAAC,yBAAY,EAACN,KAAA,CAAKI,SAAS,CAACG,QAAQ,CAAC,OAAO,CAAC,CAAC;MAE5DP,KAAA,CAAKQ,WAAW,GAAGH,KAAK;MAExB,IAAIF,QAAQ,EAAE;QACZA,QAAQ,CAACE,KAAK,CAAC;MACjB;IACF,CAAC;IAgID;AACF;AACA;AACA;AACA;IAJE,IAAAH,gBAAA,aAAAF,KAAA,eAKY,UAACS,KAAK,EAAK;MACrB,IAAIA,KAAK,CAACC,GAAG,KAAK,OAAO,EAAE;QACzBD,KAAK,CAACE,cAAc,CAAC,CAAC;MACxB;IACF,CAAC;IAzPCX,KAAA,CAAKY,SAAS,gBAAGC,iBAAK,CAACC,SAAS,CAAC,CAAC;IAClC;IACAd,KAAA,CAAKQ,WAAW,GAAGO,SAAS;IAAC,OAAAf,KAAA;EAC/B;EAAC,IAAAgB,UAAA,aAAApB,KAAA,EAAAE,gBAAA;EAAA,WAAAmB,aAAA,aAAArB,KAAA;IAAAc,GAAA;IAAAQ,KAAA;MAAA,IAAAC,kBAAA,OAAAC,kBAAA,0BAAAC,YAAA,YAAAC,IAAA,CAED,SAAAC,QAAA;QAAA,IAAAC,UAAA,EAAAC,EAAA;QAAA,OAAAJ,YAAA,YAAAK,IAAA,WAAAC,QAAA;UAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;YAAA;cACE;cACA;cACA;cACA;cACA;cACA;cACML,UAAU,GAAI,IAAI,CAACM,eAAe,GAAG,CAAC,IAAI,CAACA,eAAe,IAAI,CAAC,IAAI,CAAC;cAAAH,QAAA,CAAAE,IAAA;cAAA,OACzD,IAAAE,8BAAY,EAAC,CAAC;YAAA;cAAzBN,EAAE,GAAAE,QAAA,CAAAK,IAAA;cAAA,MAEJR,UAAU,KAAK,IAAI,CAACM,eAAe,IAAI,CAACL,EAAE,IAAI,CAAC,IAAI,CAACb,SAAS,CAACqB,OAAO,IAAI,IAAI,CAAC7B,SAAS;gBAAAuB,QAAA,CAAAE,IAAA;gBAAA;cAAA;cAAA,OAAAF,QAAA,CAAAO,MAAA;YAAA;cAI3F,IAAI,CAAC9B,SAAS,GAAG,IAAIqB,EAAE,CAACU,gBAAgB,CAAC;gBAAEC,MAAM,EAAE,IAAAC,2BAAS,EAAC;cAAE,CAAC,CAAC;cACjE,IAAI,CAACjC,SAAS,CAACc,KAAK,GAAG,IAAAoB,uBAAU,EAAC,IAAI,CAACvC,KAAK,CAACM,KAAK,IAAI,EAAE,CAAC;cAEzD,IAAI,IAAI,CAACN,KAAK,CAACwC,QAAQ,EAAE;gBACvB,IAAI,CAACnC,SAAS,CAACmC,QAAQ,GAAG,IAAI;cAChC;;cAEA;cACA,IAAI,CAACnC,SAAS,CAACoC,yBAAyB,GAAG,QAAQ;cACnD;cACA;cACA,IAAI,CAACpC,SAAS,CAACqC,aAAa,GAAGC,iCAAe;cAC9C;cACA;cACA;cACA;cACA,IAAI,CAACtC,SAAS,CAACuC,gBAAgB,GAAG,KAAK;;cAEvC;cACA;cACA,IAAAC,mCAAiB,EAAC,IAAI,CAACxC,SAAS,CAAC;;cAEjC;cACA,IAAI,CAACyC,YAAY,GAAG,IAAAC,uCAAqB,EAAC,IAAI,CAAC1C,SAAS,CAAC;cAEzD,IAAI,CAACA,SAAS,CAAC2C,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACC,WAAW,CAAC;;cAE1D;cACA,IAAI,CAACpC,SAAS,CAACqB,OAAO,CAACgB,eAAe,CAAC,IAAI,CAAC7C,SAAS,CAAC;cAEtD,IAAI,IAAI,CAACL,KAAK,CAACmD,QAAQ,EAAE;gBACvB,IAAI,CAACnD,KAAK,CAACmD,QAAQ,CAAC,IAAI,CAAC;cAC3B;YAAC;YAAA;cAAA,OAAAvB,QAAA,CAAAwB,IAAA;UAAA;QAAA,GAAA5B,OAAA;MAAA,CACF;MAAA,SA/CK6B,iBAAiBA,CAAA;QAAA,OAAAjC,kBAAA,CAAAlC,KAAA,OAAAoE,SAAA;MAAA;MAAA,OAAjBD,iBAAiB;IAAA;EAAA;IAAA1C,GAAA;IAAAQ,KAAA,EAiDvB,SAAAoC,kBAAkBA,CAACC,SAAS,EAAE;MAC5B,IAAI,CAAC,IAAI,CAACnD,SAAS,EAAE;QACnB;MACF;MAEA,IAAAoD,WAAA,GAA4B,IAAI,CAACzD,KAAK;QAA9BM,KAAK,GAAAmD,WAAA,CAALnD,KAAK;QAAEkC,QAAQ,GAAAiB,WAAA,CAARjB,QAAQ;MAEvB,IAAIA,QAAQ,KAAKgB,SAAS,CAAChB,QAAQ,EAAE;QACnC,IAAI,CAACnC,SAAS,CAACmC,QAAQ,GAAG,CAAC,CAACA,QAAQ;MACtC;;MAEA;MACA;MACA;MACA,IAAIlC,KAAK,KAAKU,SAAS,IAAIV,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAK,IAAI,CAACG,WAAW,EAAE;QACvE,IAAMqB,IAAI,GAAG,IAAAS,uBAAU,EAACjC,KAAK,CAAC;QAE9B,IAAIwB,IAAI,KAAK,IAAI,CAACzB,SAAS,CAACc,KAAK,EAAE;UACjC,IAAI,CAACd,SAAS,CAACc,KAAK,GAAGW,IAAI;QAC7B;MACF;IACF;EAAC;IAAAnB,GAAA;IAAAQ,KAAA,EAED,SAAAuC,oBAAoBA,CAAA,EAAG;MACrB;MACA;MACA,IAAI,CAAC3B,eAAe,GAAG,CAAC,IAAI,CAACA,eAAe,IAAI,CAAC,IAAI,CAAC;MAEtD,IAAI,IAAI,CAACe,YAAY,EAAE;QACrB,IAAI,CAACA,YAAY,CAAC,CAAC;QACnB,IAAI,CAACA,YAAY,GAAG9B,SAAS;MAC/B;MAEA,IAAI,IAAI,CAACX,SAAS,EAAE;QAClB,IAAI,CAACA,SAAS,CAACsD,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAACV,WAAW,CAAC;QAC7D,IAAI,CAAC5C,SAAS,CAACuD,MAAM,CAAC,CAAC;QACvB,IAAI,CAACvD,SAAS,GAAGW,SAAS;MAC5B;MAEA,IAAI,IAAI,CAAChB,KAAK,CAACmD,QAAQ,EAAE;QACvB,IAAI,CAACnD,KAAK,CAACmD,QAAQ,CAAC,IAAI,CAAC;MAC3B;IACF;EAAC;IAAAxC,GAAA;IAAAQ,KAAA,EAkBD;IACA,SAAAb,KAAKA,CAAA,EAAG;MACN,OAAO,IAAI,CAACD,SAAS,GAAG,IAAAE,yBAAY,EAAC,IAAI,CAACF,SAAS,CAACG,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE;IAC7E;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EARE;IAAAG,GAAA;IAAAkD,GAAA,EASA,SAAAA,IAAA,EAAc;MACZ,OAAO,IAAI,CAACxD,SAAS;IACvB;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAM,GAAA;IAAAkD,GAAA,EAMA,SAAAA,IAAA,EAAe;MAAA,IAAAC,MAAA;MACb,OAAO;QACLxD,KAAK,EAAE,SAAPA,KAAKA,CAAGyD,CAAC;UAAA,OAAMA,CAAC,KAAK/C,SAAS,GAAG8C,MAAI,CAACxD,KAAK,CAAC,CAAC,IAAIwD,MAAI,CAACE,QAAQ,CAACD,CAAC,CAAC,EAAEA,CAAC,CAAC;QAAA,CAAC;QACtEE,EAAE,EAAE,SAAJA,EAAEA,CAAA;UAAA,OAAQH,MAAI,CAACzD,SAAS;QAAA;QACxB6D,KAAK,EAAE,SAAPA,KAAKA,CAAA;UAAA,OAAQJ,MAAI,CAACI,KAAK,CAAC,CAAC;QAAA;QACzBC,IAAI,EAAE,SAANA,IAAIA,CAAA;UAAA,OAAQL,MAAI,CAACK,IAAI,CAAC,CAAC;QAAA;MACzB,CAAC;IACH;;IAEA;EAAA;IAAAxD,GAAA;IAAAQ,KAAA,EACA,SAAA6C,QAAQA,CAACD,CAAC,EAAE;MACV,IAAI,IAAI,CAAC1D,SAAS,EAAE;QAClB,IAAI,CAACA,SAAS,CAACc,KAAK,GAAG,IAAAoB,uBAAU,EAACwB,CAAC,IAAI,EAAE,CAAC;MAC5C;IACF;EAAC;IAAApD,GAAA;IAAAQ,KAAA,EAED,SAAAiD,KAAKA,CAAA,EAAG;MACN,IAAI,IAAI,CAAC/D,SAAS,EAAE;QAClB,IAAI,CAACA,SAAS,CAACc,KAAK,GAAG,EAAE;MAC3B;MAEA,OAAO,EAAE;IACX;EAAC;IAAAR,GAAA;IAAAQ,KAAA,EAED,SAAAgD,IAAIA,CAAA,EAAG;MACL5E,GAAG,CAAC,gBAAgB,CAAC;MACrB,IAAI,CAACc,SAAS,IAAI,IAAI,CAACA,SAAS,CAAC8D,IAAI,CAAC,CAAC;IACzC;EAAC;IAAAxD,GAAA;IAAAQ,KAAA,EAED,SAAA+C,KAAKA,CAAA,EAAG;MACN3E,GAAG,CAAC,oBAAoB,CAAC;MACzB,IAAI,CAACc,SAAS,IAAI,IAAI,CAACA,SAAS,CAAC6D,KAAK,CAAC,CAAC;IAC1C;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAvD,GAAA;IAAAQ,KAAA,EAOA,SAAAkD,OAAOA,CAACN,CAAC,EAAE;MACTxE,GAAG,CAAC,WAAW,EAAEwE,CAAC,CAAC;MAEnB,IAAI,CAAC,IAAI,CAAC1D,SAAS,EAAE;QACnB,OAAO,EAAE;MACX;MAEA,IAAMiE,MAAM,GAAG,IAAAC,wBAAW,EAAC;QAAEF,OAAO,EAAEN;MAAE,CAAC,CAAC;MAE1C,IAAIO,MAAM,EAAE;QACV,IAAI,CAACjE,SAAS,CAACmE,MAAM,CAACF,MAAM,CAACnD,KAAK,EAAE;UAAE+C,KAAK,EAAE;QAAK,CAAC,CAAC;MACtD;MAEA,IAAI,CAAC7D,SAAS,CAAC6D,KAAK,CAAC,CAAC;MAEtB,OAAO,IAAI,CAAC5D,KAAK,CAAC,CAAC;IACrB;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAK,GAAA;IAAAQ,KAAA,EAOA,SAAAsD,SAASA,CAACV,CAAC,EAAE;MACXxE,GAAG,CAAC,aAAa,EAAEwE,CAAC,CAAC;MAErB,IAAI,CAAC,IAAI,CAAC1D,SAAS,EAAE;QACnB,OAAO,EAAE;MACX;MAEA,IAAMqE,QAAQ,GAAGC,uBAAU,CAACZ,CAAC,CAAC,IAAIA,CAAC;MAEnC,IAAI;QACF,IAAI,CAAC1D,SAAS,CAACuE,cAAc,CAACF,QAAQ,CAAC;MACzC,CAAC,CAAC,OAAO/F,CAAC,EAAE;QACVY,GAAG,CAAC,qCAAqC,EAAEwE,CAAC,EAAEpF,CAAC,IAAIA,CAAC,CAACkG,OAAO,CAAC;MAC/D;MAEA,IAAI,CAACxE,SAAS,CAAC6D,KAAK,CAAC,CAAC;MAEtB,OAAO,IAAI,CAAC5D,KAAK,CAAC,CAAC;IACrB;;IAEA;EAAA;IAAAK,GAAA;IAAAQ,KAAA,EACA,SAAA2D,KAAKA,CAACf,CAAC,EAAE;MAAA,IAAAgB,MAAA;MACPxF,GAAG,CAAC,SAAS,EAAEwE,CAAC,CAAC;MAEjB,IAAI,CAAC,IAAI,CAAC1D,SAAS,EAAE;QACnB,OAAO,EAAE;MACX;MAEA,IAAM2E,MAAM,GAAGC,KAAK,CAACC,OAAO,CAACnB,CAAC,CAAC,GAAGA,CAAC,GAAG,CAACA,CAAC,CAAC;MAEzCiB,MAAM,CAACG,OAAO,CAAC,UAACC,EAAE;QAAA,OAAKL,MAAI,CAAC1E,SAAS,CAACmE,MAAM,CAACY,EAAE,EAAE;UAAElB,KAAK,EAAE;QAAK,CAAC,CAAC;MAAA,EAAC;MAClE,IAAI,CAAC7D,SAAS,CAAC6D,KAAK,CAAC,CAAC;MAEtB,OAAO,IAAI,CAAC5D,KAAK,CAAC,CAAC;IACrB;EAAC;IAAAK,GAAA;IAAAQ,KAAA,EAaD,SAAAkE,MAAMA,CAAA,EAAG;MACP,IAAAC,YAAA,GAAgD,IAAI,CAACtF,KAAK;QAAlDuF,SAAS,GAAAD,YAAA,CAATC,SAAS;QAAEC,OAAO,GAAAF,YAAA,CAAPE,OAAO;QAAEC,MAAM,GAAAH,YAAA,CAANG,MAAM;QAAEC,OAAO,GAAAJ,YAAA,CAAPI,OAAO;MAE3C,oBACE1H,MAAA,YAAA2H,aAAA,CAAClG,MAAM;QACL8F,SAAS,EAAEA,SAAU;QACrBC,OAAO,EAAEA,OAAQ;QACjBC,MAAM,EAAEA,MAAO;QACfC,OAAO,EAAEA,OAAQ;QACjBE,SAAS,EAAE,IAAI,CAACA,SAAU;QAC1BC,GAAG,EAAE,IAAI,CAAChF;MAAU,CACrB,CAAC;IAEN;EAAC;AAAA,EAtRwBC,iBAAK,CAACgF,SAAS;AAAA,IAAA3F,gBAAA,aAA7BN,KAAK,eACG;EACjB0F,SAAS,EAAEQ,qBAAS,CAACC,MAAM;EAC3B1F,KAAK,EAAEyF,qBAAS,CAACC,MAAM;EACvB5F,QAAQ,EAAE2F,qBAAS,CAACE,IAAI;EACxBP,OAAO,EAAEK,qBAAS,CAACE,IAAI;EACvBT,OAAO,EAAEO,qBAAS,CAACE,IAAI;EACvBR,MAAM,EAAEM,qBAAS,CAACE,IAAI;EACtBzD,QAAQ,EAAEuD,qBAAS,CAACG,IAAI;EACxB/C,QAAQ,EAAE4C,qBAAS,CAACE;AACtB,CAAC;AAAA,IAAAE,QAAA,GAAArG,OAAA,cA+QYD,KAAK","ignoreList":[]}
package/lib/mf/static.js CHANGED
@@ -240,6 +240,8 @@ var Static = exports["default"] = /*#__PURE__*/function (_React$Component) {
240
240
  // Without this the spacebar does nothing: MathLive's mathModeSpace
241
241
  // defaults to an empty string.
242
242
  this.mathField.mathModeSpace = _mathliveInstance.MATH_MODE_SPACE;
243
+ // Same as the editor: stay in the exponent after a digit (see mf/input.jsx).
244
+ this.mathField.smartSuperscript = false;
243
245
  this.mathField.value = (0, _latexBridge.toMathLive)(this.props.latex);
244
246
 
245
247
  // The mathfield renders in shadow DOM, so page CSS cannot reach it - the
@@ -1 +1 @@
1
- {"version":3,"file":"static.js","names":["_react","_interopRequireDefault","require","_propTypes","_styles","_debug","_mathliveInstance","_latexBridge","_commonStyles","_callSuper","t","o","e","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","apply","Boolean","prototype","valueOf","call","ownKeys","r","Object","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","enumerable","push","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","log","debug","Holder","styled","display","placeholderStyles","rootIndexStyles","parallelStyles","border","background","Static","exports","_React$Component","props","_this","_classCallCheck2","document","liveRegion","createElement","assign","style","position","width","height","marginTop","clip","overflow","setAttribute","body","appendChild","parentNode","removeChild","undefined","message","textContent","clearTimeout","announceTimeout","setTimeout","event","isDeleting","key","next","converted","some","id","before","promptValues","after","test","slice","announce","_this$props","onSubFieldChange","getFieldName","mathField","values","announceConversion","fields","innerFields","name","promptHandle","_this$props2","onSubFieldFocus","ids","getPrompts","focused","find","range","getPromptRange","selection","ranges","_range","_slicedToArray2","start","end","_selection$ranges$","selStart","handle","setInput","holderRef","React","createRef","state","markup","_inherits2","_createClass2","value","_componentDidMount","_asyncToGenerator2","_regenerator","mark","_callee","generation","ml","wrap","_context","prev","mountGeneration","isInteractive","loadMathLive","renderMarkup","abrupt","sent","current","MathfieldElement","macros","getMacros","readOnly","mathVirtualKeyboardPolicy","mathModeSpace","MATH_MODE_SPACE","toMathLive","latex","applyShadowStyles","untrackCaret","trackPlaceholderCaret","addEventListener","onPromptInput","onPromptFocus","onKeyDown","replaceChildren","createLiveRegion","stop","componentDidMount","componentDidUpdate","prevProps","componentWillUnmount","removeEventListener","remove","removeLiveRegion","fieldIds","indexOf","latexToMarkup","setState","_this2","out","fromMathLive","getPromptValue","_this3","focus","focusPrompt","setPromptValue","get","_this4","map","promptContaining","_this5","target","executeCommand","blur","render","_this$props3","className","onFocus","onBlur","ref","dangerouslySetInnerHTML","__html","Component","PropTypes","string","isRequired","func"],"sources":["../../src/mf/static.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { styled } from '@mui/material/styles';\nimport debug from 'debug';\nimport {\n loadMathLive,\n getMacros,\n latexToMarkup,\n MATH_MODE_SPACE,\n applyShadowStyles,\n trackPlaceholderCaret,\n} from '../mathlive-instance';\nimport { toMathLive, fromMathLive, fieldIds } from '../latex-bridge';\nimport { placeholderStyles, rootIndexStyles, parallelStyles } from './common-styles';\n\nconst log = debug('pie-lib:math-input-mathlive:static');\n\nconst Holder = styled('span')({\n display: 'inline-block',\n // Shared static-math rules: muted empty-slot glyphs and svg containment.\n ...placeholderStyles,\n // Readable radical index - display mode renders in the light DOM, so the\n // shadow-root copy of this rule does not reach it.\n ...rootIndexStyles,\n ...parallelStyles,\n '& math-field': {\n display: 'inline-block',\n border: 'none',\n background: 'transparent',\n },\n '& math-field::part(virtual-keyboard-toggle)': {\n display: 'none',\n },\n '& math-field::part(menu-toggle)': {\n display: 'none',\n },\n});\n\n/**\n * Static math. Drop-in replacement for @pie-lib/math-input's `mq.Static`.\n *\n * Two modes, chosen automatically:\n *\n * - **display** (no answer blocks in the latex): rendered with\n * `convertLatexToMarkup`. No mathfield instance, so it is cheap enough for\n * keypad labels - the old implementation created a full MathQuill\n * StaticMath per button.\n *\n * - **interactive** (latex contains `\\MathQuillMathField[..]{}` /\n * `\\placeholder[..]{}`): a read-only `<math-field>` whose placeholders stay\n * editable. Sub-field values are surfaced through the prompts API, replacing\n * MathQuill's `innerFields`.\n */\nexport default class Static extends React.Component {\n static propTypes = {\n latex: PropTypes.string.isRequired,\n className: PropTypes.string,\n onFocus: PropTypes.func,\n onBlur: PropTypes.func,\n getFieldName: PropTypes.func,\n onSubFieldChange: PropTypes.func,\n onSubFieldFocus: PropTypes.func,\n setInput: PropTypes.func,\n };\n\n static defaultProps = {\n getFieldName: () => {},\n };\n\n constructor(props) {\n super(props);\n this.holderRef = React.createRef();\n this.state = { markup: '' };\n this.promptValues = {};\n }\n\n async componentDidMount() {\n // See the note in mf/input.jsx: a generation counter, not a boolean, so a\n // StrictMode mount -> unmount -> mount on the same instance still ends up\n // with exactly one field.\n const generation = (this.mountGeneration = (this.mountGeneration || 0) + 1);\n\n if (!this.isInteractive()) {\n await loadMathLive();\n\n if (generation === this.mountGeneration) {\n this.renderMarkup();\n }\n\n return;\n }\n\n const ml = await loadMathLive();\n\n if (generation !== this.mountGeneration || !ml || !this.holderRef.current || this.mathField) {\n return;\n }\n\n this.mathField = new ml.MathfieldElement({ macros: getMacros() });\n this.mathField.readOnly = true;\n this.mathField.mathVirtualKeyboardPolicy = 'manual';\n // Without this the spacebar does nothing: MathLive's mathModeSpace\n // defaults to an empty string.\n this.mathField.mathModeSpace = MATH_MODE_SPACE;\n this.mathField.value = toMathLive(this.props.latex);\n\n // The mathfield renders in shadow DOM, so page CSS cannot reach it - the\n // stretchy-accent fix has to be injected there directly.\n applyShadowStyles(this.mathField);\n\n // A selected `\\placeholder{}` gets no MathLive caret; draw one. Answer\n // blocks are typed into with the same keypad, so they grow placeholders too.\n this.untrackCaret = trackPlaceholderCaret(this.mathField);\n\n this.mathField.addEventListener('input', this.onPromptInput);\n this.mathField.addEventListener('focusin', this.onPromptFocus);\n this.mathField.addEventListener('keydown', this.onKeyDown);\n\n // Belt and braces: drop anything a previous mount may have left behind.\n this.holderRef.current.replaceChildren(this.mathField);\n\n this.createLiveRegion();\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.latex === this.props.latex) {\n return;\n }\n\n if (this.mathField) {\n this.mathField.value = toMathLive(this.props.latex);\n } else {\n this.renderMarkup();\n }\n }\n\n componentWillUnmount() {\n // Invalidate any mount still awaiting the MathLive load.\n this.mountGeneration = (this.mountGeneration || 0) + 1;\n\n if (this.untrackCaret) {\n this.untrackCaret();\n this.untrackCaret = undefined;\n }\n\n if (this.mathField) {\n this.mathField.removeEventListener('input', this.onPromptInput);\n this.mathField.removeEventListener('focusin', this.onPromptFocus);\n this.mathField.removeEventListener('keydown', this.onKeyDown);\n this.mathField.remove();\n this.mathField = undefined;\n }\n\n this.removeLiveRegion();\n }\n\n /**\n * Off-screen aria-live region, ported from @pie-lib/math-input's Static.\n *\n * MathLive has its own accessibility layer, but it does not announce that\n * typed input was converted into a math symbol, which screen-reader users\n * relied on in the MathQuill implementation.\n */\n createLiveRegion = () => {\n if (typeof document === 'undefined' || this.liveRegion) {\n return;\n }\n\n this.liveRegion = document.createElement('div');\n Object.assign(this.liveRegion.style, {\n position: 'absolute',\n width: '1px',\n height: '1px',\n marginTop: '-1px',\n clip: 'rect(1px, 1px, 1px, 1px)',\n overflow: 'hidden',\n });\n this.liveRegion.setAttribute('aria-live', 'polite');\n this.liveRegion.setAttribute('aria-atomic', 'true');\n\n document.body.appendChild(this.liveRegion);\n };\n\n removeLiveRegion = () => {\n if (this.liveRegion && this.liveRegion.parentNode) {\n this.liveRegion.parentNode.removeChild(this.liveRegion);\n }\n\n this.liveRegion = undefined;\n };\n\n announce = (message) => {\n if (!this.liveRegion) {\n return;\n }\n\n this.liveRegion.textContent = message;\n\n // Clear once announced, so the same message can be announced again.\n clearTimeout(this.announceTimeout);\n this.announceTimeout = setTimeout(() => {\n if (this.liveRegion) {\n this.liveRegion.textContent = '';\n }\n }, 500);\n };\n\n onKeyDown = (event) => {\n // Deletions should not be announced as conversions.\n this.isDeleting = event?.key === 'Backspace' || event?.key === 'Delete';\n };\n\n /**\n * Announce when typed input became a math symbol. The MathQuill version\n * inferred this by counting braces; here a prompt whose latex grew by more\n * than the single character typed means a command was expanded.\n */\n announceConversion = (next) => {\n if (this.isDeleting) {\n this.isDeleting = false;\n return;\n }\n\n const converted = Object.keys(next).some((id) => {\n const before = this.promptValues[id] || '';\n const after = next[id] || '';\n\n return after.length > before.length + 1 && /\\\\/.test(after.slice(before.length));\n });\n\n if (converted) {\n this.announce('Converted to math symbol');\n }\n };\n\n /** Does this latex contain answer blocks? */\n isInteractive() {\n const latex = this.props.latex || '';\n\n return fieldIds(latex).length > 0 || latex.indexOf('\\\\placeholder') !== -1;\n }\n\n renderMarkup() {\n const markup = latexToMarkup(this.props.latex);\n\n if (markup !== this.state.markup) {\n this.setState({ markup });\n }\n }\n\n /** MathQuill's `innerFields` equivalent, keyed by prompt id. */\n values() {\n if (!this.mathField) {\n return {};\n }\n\n const out = {};\n\n (this.mathField.getPrompts() || []).forEach((id) => {\n out[id] = fromMathLive(this.mathField.getPromptValue(id));\n });\n\n return out;\n }\n\n /**\n * A MathQuill-inner-field-like handle for a prompt.\n *\n * The old API handed callers a MathQuill field object, and consumers commonly\n * called `field.latex()` on it. There is no equivalent object in MathLive -\n * prompts are addressed by id - so this adapter exposes the parts that were\n * actually used: `id` and a get/set `latex()`.\n */\n promptHandle(id) {\n return {\n id,\n // MathQuill's inner fields could be focused directly; keep that.\n focus: () => {\n if (this.mathField) {\n this.mathField.focus();\n this.focusPrompt(id);\n }\n },\n latex: (value) => {\n if (!this.mathField) {\n return '';\n }\n\n if (value === undefined) {\n return fromMathLive(this.mathField.getPromptValue(id));\n }\n\n this.mathField.setPromptValue(id, toMathLive(value), {});\n\n return value;\n },\n };\n }\n\n /** All prompt handles, the analogue of `mathField.innerFields`. */\n get innerFields() {\n if (!this.mathField) {\n return [];\n }\n\n return (this.mathField.getPrompts() || []).map((id) => this.promptHandle(id));\n }\n\n onPromptInput = () => {\n const { onSubFieldChange, getFieldName } = this.props;\n\n if (!this.mathField) {\n return;\n }\n\n const next = this.values();\n\n this.announceConversion(next);\n\n if (!onSubFieldChange) {\n this.promptValues = next;\n return;\n }\n\n const fields = this.innerFields;\n\n // Emit only the prompts whose value actually changed, mirroring the\n // per-field granularity of the old onSubFieldChange(name, latex).\n Object.keys(next).forEach((id) => {\n if (next[id] === this.promptValues[id]) {\n return;\n }\n\n const name = getFieldName(this.promptHandle(id), fields) || id;\n\n onSubFieldChange(name, next[id]);\n });\n\n this.promptValues = next;\n };\n\n onPromptFocus = () => {\n const { onSubFieldFocus, getFieldName } = this.props;\n\n if (!this.mathField || !onSubFieldFocus) {\n return;\n }\n\n try {\n const ids = this.mathField.getPrompts() || [];\n // The focused prompt is the one containing the current selection.\n const focused = ids.find((id) => {\n const range = this.mathField.getPromptRange(id);\n const selection = this.mathField.selection;\n\n if (!range || !selection || !selection.ranges || !selection.ranges.length) {\n return false;\n }\n\n const [start, end] = range;\n const [selStart] = selection.ranges[0];\n\n return selStart >= start && selStart <= end;\n });\n\n if (focused) {\n const handle = this.promptHandle(focused);\n const name = getFieldName(handle, this.innerFields) || focused;\n\n if (this.props.setInput) {\n this.props.setInput(handle);\n }\n\n onSubFieldFocus(name, handle);\n }\n } catch (e) {\n log('error resolving focused prompt: %s', e.message);\n }\n };\n\n /** The id of the prompt whose range contains `position`, if any. */\n promptContaining(position) {\n if (!this.mathField || typeof position !== 'number') {\n return undefined;\n }\n\n return (this.mathField.getPrompts() || []).find((id) => {\n const range = this.mathField.getPromptRange(id);\n\n return range && position >= range[0] && position <= range[1];\n });\n }\n\n /**\n * Put a blinking caret inside an answer block.\n *\n * MathLive only makes the caret visible while the field element carries the\n * `ML__focused` class, and it adds that class during a *render*, gated on\n * `isSelectionEditable && hasFocus()`. In a read-only field only prompt\n * interiors are editable, so the two things both have to be true:\n *\n * - the selection must sit inside a prompt, and\n * - a render must run afterwards.\n *\n * Assigning `selection` satisfies the first but not the second - it updates\n * the model without re-rendering, so the class stays off and the caret span\n * remains `visibility: hidden`. Executing any command does trigger the\n * render, and `scrollIntoView` is the one with no other effect: it keeps the\n * caret on screen, which the preceding `focus()` already does anyway.\n *\n * @param {string} [id] prompt to focus; defaults to the first one\n */\n focusPrompt(id) {\n if (!this.mathField) {\n return;\n }\n\n const ids = this.mathField.getPrompts() || [];\n const target = id && ids.indexOf(id) !== -1 ? id : ids[0];\n\n if (!target) {\n return;\n }\n\n const range = this.mathField.getPromptRange(target);\n\n if (!range) {\n return;\n }\n\n this.mathField.selection = { ranges: [[range[0], range[0]]] };\n\n if (typeof this.mathField.executeCommand === 'function') {\n this.mathField.executeCommand('scrollIntoView');\n }\n }\n\n focus() {\n if (!this.mathField) {\n return;\n }\n\n this.mathField.focus();\n\n // A bare focus() leaves the selection outside every prompt, which in a\n // read-only field is not editable - the block looked focused but had no\n // cursor. Clicking a prompt already works, because MathLive's own pointer\n // handling moves the selection and re-renders.\n if (!this.promptContaining(this.mathField.position)) {\n this.focusPrompt();\n }\n }\n\n blur() {\n this.mathField && this.mathField.blur();\n }\n\n render() {\n const { className, onFocus, onBlur } = this.props;\n const { markup } = this.state;\n\n if (this.mathField || this.isInteractive()) {\n return <Holder className={className} onFocus={onFocus} onBlur={onBlur} ref={this.holderRef} />;\n }\n\n return (\n <Holder\n className={className}\n onFocus={onFocus}\n onBlur={onBlur}\n ref={this.holderRef}\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: markup }}\n />\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"static.js","names":["_react","_interopRequireDefault","require","_propTypes","_styles","_debug","_mathliveInstance","_latexBridge","_commonStyles","_callSuper","t","o","e","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","apply","Boolean","prototype","valueOf","call","ownKeys","r","Object","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","enumerable","push","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","log","debug","Holder","styled","display","placeholderStyles","rootIndexStyles","parallelStyles","border","background","Static","exports","_React$Component","props","_this","_classCallCheck2","document","liveRegion","createElement","assign","style","position","width","height","marginTop","clip","overflow","setAttribute","body","appendChild","parentNode","removeChild","undefined","message","textContent","clearTimeout","announceTimeout","setTimeout","event","isDeleting","key","next","converted","some","id","before","promptValues","after","test","slice","announce","_this$props","onSubFieldChange","getFieldName","mathField","values","announceConversion","fields","innerFields","name","promptHandle","_this$props2","onSubFieldFocus","ids","getPrompts","focused","find","range","getPromptRange","selection","ranges","_range","_slicedToArray2","start","end","_selection$ranges$","selStart","handle","setInput","holderRef","React","createRef","state","markup","_inherits2","_createClass2","value","_componentDidMount","_asyncToGenerator2","_regenerator","mark","_callee","generation","ml","wrap","_context","prev","mountGeneration","isInteractive","loadMathLive","renderMarkup","abrupt","sent","current","MathfieldElement","macros","getMacros","readOnly","mathVirtualKeyboardPolicy","mathModeSpace","MATH_MODE_SPACE","smartSuperscript","toMathLive","latex","applyShadowStyles","untrackCaret","trackPlaceholderCaret","addEventListener","onPromptInput","onPromptFocus","onKeyDown","replaceChildren","createLiveRegion","stop","componentDidMount","componentDidUpdate","prevProps","componentWillUnmount","removeEventListener","remove","removeLiveRegion","fieldIds","indexOf","latexToMarkup","setState","_this2","out","fromMathLive","getPromptValue","_this3","focus","focusPrompt","setPromptValue","get","_this4","map","promptContaining","_this5","target","executeCommand","blur","render","_this$props3","className","onFocus","onBlur","ref","dangerouslySetInnerHTML","__html","Component","PropTypes","string","isRequired","func"],"sources":["../../src/mf/static.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { styled } from '@mui/material/styles';\nimport debug from 'debug';\nimport {\n loadMathLive,\n getMacros,\n latexToMarkup,\n MATH_MODE_SPACE,\n applyShadowStyles,\n trackPlaceholderCaret,\n} from '../mathlive-instance';\nimport { toMathLive, fromMathLive, fieldIds } from '../latex-bridge';\nimport { placeholderStyles, rootIndexStyles, parallelStyles } from './common-styles';\n\nconst log = debug('pie-lib:math-input-mathlive:static');\n\nconst Holder = styled('span')({\n display: 'inline-block',\n // Shared static-math rules: muted empty-slot glyphs and svg containment.\n ...placeholderStyles,\n // Readable radical index - display mode renders in the light DOM, so the\n // shadow-root copy of this rule does not reach it.\n ...rootIndexStyles,\n ...parallelStyles,\n '& math-field': {\n display: 'inline-block',\n border: 'none',\n background: 'transparent',\n },\n '& math-field::part(virtual-keyboard-toggle)': {\n display: 'none',\n },\n '& math-field::part(menu-toggle)': {\n display: 'none',\n },\n});\n\n/**\n * Static math. Drop-in replacement for @pie-lib/math-input's `mq.Static`.\n *\n * Two modes, chosen automatically:\n *\n * - **display** (no answer blocks in the latex): rendered with\n * `convertLatexToMarkup`. No mathfield instance, so it is cheap enough for\n * keypad labels - the old implementation created a full MathQuill\n * StaticMath per button.\n *\n * - **interactive** (latex contains `\\MathQuillMathField[..]{}` /\n * `\\placeholder[..]{}`): a read-only `<math-field>` whose placeholders stay\n * editable. Sub-field values are surfaced through the prompts API, replacing\n * MathQuill's `innerFields`.\n */\nexport default class Static extends React.Component {\n static propTypes = {\n latex: PropTypes.string.isRequired,\n className: PropTypes.string,\n onFocus: PropTypes.func,\n onBlur: PropTypes.func,\n getFieldName: PropTypes.func,\n onSubFieldChange: PropTypes.func,\n onSubFieldFocus: PropTypes.func,\n setInput: PropTypes.func,\n };\n\n static defaultProps = {\n getFieldName: () => {},\n };\n\n constructor(props) {\n super(props);\n this.holderRef = React.createRef();\n this.state = { markup: '' };\n this.promptValues = {};\n }\n\n async componentDidMount() {\n // See the note in mf/input.jsx: a generation counter, not a boolean, so a\n // StrictMode mount -> unmount -> mount on the same instance still ends up\n // with exactly one field.\n const generation = (this.mountGeneration = (this.mountGeneration || 0) + 1);\n\n if (!this.isInteractive()) {\n await loadMathLive();\n\n if (generation === this.mountGeneration) {\n this.renderMarkup();\n }\n\n return;\n }\n\n const ml = await loadMathLive();\n\n if (generation !== this.mountGeneration || !ml || !this.holderRef.current || this.mathField) {\n return;\n }\n\n this.mathField = new ml.MathfieldElement({ macros: getMacros() });\n this.mathField.readOnly = true;\n this.mathField.mathVirtualKeyboardPolicy = 'manual';\n // Without this the spacebar does nothing: MathLive's mathModeSpace\n // defaults to an empty string.\n this.mathField.mathModeSpace = MATH_MODE_SPACE;\n // Same as the editor: stay in the exponent after a digit (see mf/input.jsx).\n this.mathField.smartSuperscript = false;\n this.mathField.value = toMathLive(this.props.latex);\n\n // The mathfield renders in shadow DOM, so page CSS cannot reach it - the\n // stretchy-accent fix has to be injected there directly.\n applyShadowStyles(this.mathField);\n\n // A selected `\\placeholder{}` gets no MathLive caret; draw one. Answer\n // blocks are typed into with the same keypad, so they grow placeholders too.\n this.untrackCaret = trackPlaceholderCaret(this.mathField);\n\n this.mathField.addEventListener('input', this.onPromptInput);\n this.mathField.addEventListener('focusin', this.onPromptFocus);\n this.mathField.addEventListener('keydown', this.onKeyDown);\n\n // Belt and braces: drop anything a previous mount may have left behind.\n this.holderRef.current.replaceChildren(this.mathField);\n\n this.createLiveRegion();\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.latex === this.props.latex) {\n return;\n }\n\n if (this.mathField) {\n this.mathField.value = toMathLive(this.props.latex);\n } else {\n this.renderMarkup();\n }\n }\n\n componentWillUnmount() {\n // Invalidate any mount still awaiting the MathLive load.\n this.mountGeneration = (this.mountGeneration || 0) + 1;\n\n if (this.untrackCaret) {\n this.untrackCaret();\n this.untrackCaret = undefined;\n }\n\n if (this.mathField) {\n this.mathField.removeEventListener('input', this.onPromptInput);\n this.mathField.removeEventListener('focusin', this.onPromptFocus);\n this.mathField.removeEventListener('keydown', this.onKeyDown);\n this.mathField.remove();\n this.mathField = undefined;\n }\n\n this.removeLiveRegion();\n }\n\n /**\n * Off-screen aria-live region, ported from @pie-lib/math-input's Static.\n *\n * MathLive has its own accessibility layer, but it does not announce that\n * typed input was converted into a math symbol, which screen-reader users\n * relied on in the MathQuill implementation.\n */\n createLiveRegion = () => {\n if (typeof document === 'undefined' || this.liveRegion) {\n return;\n }\n\n this.liveRegion = document.createElement('div');\n Object.assign(this.liveRegion.style, {\n position: 'absolute',\n width: '1px',\n height: '1px',\n marginTop: '-1px',\n clip: 'rect(1px, 1px, 1px, 1px)',\n overflow: 'hidden',\n });\n this.liveRegion.setAttribute('aria-live', 'polite');\n this.liveRegion.setAttribute('aria-atomic', 'true');\n\n document.body.appendChild(this.liveRegion);\n };\n\n removeLiveRegion = () => {\n if (this.liveRegion && this.liveRegion.parentNode) {\n this.liveRegion.parentNode.removeChild(this.liveRegion);\n }\n\n this.liveRegion = undefined;\n };\n\n announce = (message) => {\n if (!this.liveRegion) {\n return;\n }\n\n this.liveRegion.textContent = message;\n\n // Clear once announced, so the same message can be announced again.\n clearTimeout(this.announceTimeout);\n this.announceTimeout = setTimeout(() => {\n if (this.liveRegion) {\n this.liveRegion.textContent = '';\n }\n }, 500);\n };\n\n onKeyDown = (event) => {\n // Deletions should not be announced as conversions.\n this.isDeleting = event?.key === 'Backspace' || event?.key === 'Delete';\n };\n\n /**\n * Announce when typed input became a math symbol. The MathQuill version\n * inferred this by counting braces; here a prompt whose latex grew by more\n * than the single character typed means a command was expanded.\n */\n announceConversion = (next) => {\n if (this.isDeleting) {\n this.isDeleting = false;\n return;\n }\n\n const converted = Object.keys(next).some((id) => {\n const before = this.promptValues[id] || '';\n const after = next[id] || '';\n\n return after.length > before.length + 1 && /\\\\/.test(after.slice(before.length));\n });\n\n if (converted) {\n this.announce('Converted to math symbol');\n }\n };\n\n /** Does this latex contain answer blocks? */\n isInteractive() {\n const latex = this.props.latex || '';\n\n return fieldIds(latex).length > 0 || latex.indexOf('\\\\placeholder') !== -1;\n }\n\n renderMarkup() {\n const markup = latexToMarkup(this.props.latex);\n\n if (markup !== this.state.markup) {\n this.setState({ markup });\n }\n }\n\n /** MathQuill's `innerFields` equivalent, keyed by prompt id. */\n values() {\n if (!this.mathField) {\n return {};\n }\n\n const out = {};\n\n (this.mathField.getPrompts() || []).forEach((id) => {\n out[id] = fromMathLive(this.mathField.getPromptValue(id));\n });\n\n return out;\n }\n\n /**\n * A MathQuill-inner-field-like handle for a prompt.\n *\n * The old API handed callers a MathQuill field object, and consumers commonly\n * called `field.latex()` on it. There is no equivalent object in MathLive -\n * prompts are addressed by id - so this adapter exposes the parts that were\n * actually used: `id` and a get/set `latex()`.\n */\n promptHandle(id) {\n return {\n id,\n // MathQuill's inner fields could be focused directly; keep that.\n focus: () => {\n if (this.mathField) {\n this.mathField.focus();\n this.focusPrompt(id);\n }\n },\n latex: (value) => {\n if (!this.mathField) {\n return '';\n }\n\n if (value === undefined) {\n return fromMathLive(this.mathField.getPromptValue(id));\n }\n\n this.mathField.setPromptValue(id, toMathLive(value), {});\n\n return value;\n },\n };\n }\n\n /** All prompt handles, the analogue of `mathField.innerFields`. */\n get innerFields() {\n if (!this.mathField) {\n return [];\n }\n\n return (this.mathField.getPrompts() || []).map((id) => this.promptHandle(id));\n }\n\n onPromptInput = () => {\n const { onSubFieldChange, getFieldName } = this.props;\n\n if (!this.mathField) {\n return;\n }\n\n const next = this.values();\n\n this.announceConversion(next);\n\n if (!onSubFieldChange) {\n this.promptValues = next;\n return;\n }\n\n const fields = this.innerFields;\n\n // Emit only the prompts whose value actually changed, mirroring the\n // per-field granularity of the old onSubFieldChange(name, latex).\n Object.keys(next).forEach((id) => {\n if (next[id] === this.promptValues[id]) {\n return;\n }\n\n const name = getFieldName(this.promptHandle(id), fields) || id;\n\n onSubFieldChange(name, next[id]);\n });\n\n this.promptValues = next;\n };\n\n onPromptFocus = () => {\n const { onSubFieldFocus, getFieldName } = this.props;\n\n if (!this.mathField || !onSubFieldFocus) {\n return;\n }\n\n try {\n const ids = this.mathField.getPrompts() || [];\n // The focused prompt is the one containing the current selection.\n const focused = ids.find((id) => {\n const range = this.mathField.getPromptRange(id);\n const selection = this.mathField.selection;\n\n if (!range || !selection || !selection.ranges || !selection.ranges.length) {\n return false;\n }\n\n const [start, end] = range;\n const [selStart] = selection.ranges[0];\n\n return selStart >= start && selStart <= end;\n });\n\n if (focused) {\n const handle = this.promptHandle(focused);\n const name = getFieldName(handle, this.innerFields) || focused;\n\n if (this.props.setInput) {\n this.props.setInput(handle);\n }\n\n onSubFieldFocus(name, handle);\n }\n } catch (e) {\n log('error resolving focused prompt: %s', e.message);\n }\n };\n\n /** The id of the prompt whose range contains `position`, if any. */\n promptContaining(position) {\n if (!this.mathField || typeof position !== 'number') {\n return undefined;\n }\n\n return (this.mathField.getPrompts() || []).find((id) => {\n const range = this.mathField.getPromptRange(id);\n\n return range && position >= range[0] && position <= range[1];\n });\n }\n\n /**\n * Put a blinking caret inside an answer block.\n *\n * MathLive only makes the caret visible while the field element carries the\n * `ML__focused` class, and it adds that class during a *render*, gated on\n * `isSelectionEditable && hasFocus()`. In a read-only field only prompt\n * interiors are editable, so the two things both have to be true:\n *\n * - the selection must sit inside a prompt, and\n * - a render must run afterwards.\n *\n * Assigning `selection` satisfies the first but not the second - it updates\n * the model without re-rendering, so the class stays off and the caret span\n * remains `visibility: hidden`. Executing any command does trigger the\n * render, and `scrollIntoView` is the one with no other effect: it keeps the\n * caret on screen, which the preceding `focus()` already does anyway.\n *\n * @param {string} [id] prompt to focus; defaults to the first one\n */\n focusPrompt(id) {\n if (!this.mathField) {\n return;\n }\n\n const ids = this.mathField.getPrompts() || [];\n const target = id && ids.indexOf(id) !== -1 ? id : ids[0];\n\n if (!target) {\n return;\n }\n\n const range = this.mathField.getPromptRange(target);\n\n if (!range) {\n return;\n }\n\n this.mathField.selection = { ranges: [[range[0], range[0]]] };\n\n if (typeof this.mathField.executeCommand === 'function') {\n this.mathField.executeCommand('scrollIntoView');\n }\n }\n\n focus() {\n if (!this.mathField) {\n return;\n }\n\n this.mathField.focus();\n\n // A bare focus() leaves the selection outside every prompt, which in a\n // read-only field is not editable - the block looked focused but had no\n // cursor. Clicking a prompt already works, because MathLive's own pointer\n // handling moves the selection and re-renders.\n if (!this.promptContaining(this.mathField.position)) {\n this.focusPrompt();\n }\n }\n\n blur() {\n this.mathField && this.mathField.blur();\n }\n\n render() {\n const { className, onFocus, onBlur } = this.props;\n const { markup } = this.state;\n\n if (this.mathField || this.isInteractive()) {\n return <Holder className={className} onFocus={onFocus} onBlur={onBlur} ref={this.holderRef} />;\n }\n\n return (\n <Holder\n className={className}\n onFocus={onFocus}\n onBlur={onBlur}\n ref={this.holderRef}\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: markup }}\n />\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,UAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,iBAAA,GAAAJ,OAAA;AAQA,IAAAK,YAAA,GAAAL,OAAA;AACA,IAAAM,aAAA,GAAAN,OAAA;AAAqF,SAAAO,WAAAC,CAAA,EAAAC,CAAA,EAAAC,CAAA,WAAAD,CAAA,OAAAE,gBAAA,aAAAF,CAAA,OAAAG,2BAAA,aAAAJ,CAAA,EAAAK,yBAAA,KAAAC,OAAA,CAAAC,SAAA,CAAAN,CAAA,EAAAC,CAAA,YAAAC,gBAAA,aAAAH,CAAA,EAAAQ,WAAA,IAAAP,CAAA,CAAAQ,KAAA,CAAAT,CAAA,EAAAE,CAAA;AAAA,SAAAG,0BAAA,cAAAL,CAAA,IAAAU,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAP,OAAA,CAAAC,SAAA,CAAAG,OAAA,iCAAAV,CAAA,aAAAK,yBAAA,YAAAA,0BAAA,aAAAL,CAAA;AAAA,SAAAc,QAAAZ,CAAA,EAAAa,CAAA,QAAAf,CAAA,GAAAgB,MAAA,CAAAC,IAAA,CAAAf,CAAA,OAAAc,MAAA,CAAAE,qBAAA,QAAAjB,CAAA,GAAAe,MAAA,CAAAE,qBAAA,CAAAhB,CAAA,GAAAa,CAAA,KAAAd,CAAA,GAAAA,CAAA,CAAAkB,MAAA,WAAAJ,CAAA,WAAAC,MAAA,CAAAI,wBAAA,CAAAlB,CAAA,EAAAa,CAAA,EAAAM,UAAA,OAAArB,CAAA,CAAAsB,IAAA,CAAAb,KAAA,CAAAT,CAAA,EAAAC,CAAA,YAAAD,CAAA;AAAA,SAAAuB,cAAArB,CAAA,aAAAa,CAAA,MAAAA,CAAA,GAAAS,SAAA,CAAAC,MAAA,EAAAV,CAAA,UAAAf,CAAA,WAAAwB,SAAA,CAAAT,CAAA,IAAAS,SAAA,CAAAT,CAAA,QAAAA,CAAA,OAAAD,OAAA,CAAAE,MAAA,CAAAhB,CAAA,OAAA0B,OAAA,WAAAX,CAAA,QAAAY,gBAAA,aAAAzB,CAAA,EAAAa,CAAA,EAAAf,CAAA,CAAAe,CAAA,SAAAC,MAAA,CAAAY,yBAAA,GAAAZ,MAAA,CAAAa,gBAAA,CAAA3B,CAAA,EAAAc,MAAA,CAAAY,yBAAA,CAAA5B,CAAA,KAAAc,OAAA,CAAAE,MAAA,CAAAhB,CAAA,GAAA0B,OAAA,WAAAX,CAAA,IAAAC,MAAA,CAAAc,cAAA,CAAA5B,CAAA,EAAAa,CAAA,EAAAC,MAAA,CAAAI,wBAAA,CAAApB,CAAA,EAAAe,CAAA,iBAAAb,CAAA;AAErF,IAAM6B,GAAG,GAAG,IAAAC,iBAAK,EAAC,oCAAoC,CAAC;AAEvD,IAAMC,MAAM,GAAG,IAAAC,cAAM,EAAC,MAAM,CAAC,CAAAX,aAAA,CAAAA,aAAA,CAAAA,aAAA,CAAAA,aAAA;EAC3BY,OAAO,EAAE;AAAc,GAEpBC,+BAAiB,GAGjBC,6BAAe,GACfC,4BAAc;EACjB,cAAc,EAAE;IACdH,OAAO,EAAE,cAAc;IACvBI,MAAM,EAAE,MAAM;IACdC,UAAU,EAAE;EACd,CAAC;EACD,6CAA6C,EAAE;IAC7CL,OAAO,EAAE;EACX,CAAC;EACD,iCAAiC,EAAE;IACjCA,OAAO,EAAE;EACX;AAAC,EACF,CAAC;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAdA,IAeqBM,MAAM,GAAAC,OAAA,qCAAAC,gBAAA;EAgBzB,SAAAF,OAAYG,KAAK,EAAE;IAAA,IAAAC,KAAA;IAAA,IAAAC,gBAAA,mBAAAL,MAAA;IACjBI,KAAA,GAAA9C,UAAA,OAAA0C,MAAA,GAAMG,KAAK;IAwFb;AACF;AACA;AACA;AACA;AACA;AACA;IANE,IAAAjB,gBAAA,aAAAkB,KAAA,sBAOmB,YAAM;MACvB,IAAI,OAAOE,QAAQ,KAAK,WAAW,IAAIF,KAAA,CAAKG,UAAU,EAAE;QACtD;MACF;MAEAH,KAAA,CAAKG,UAAU,GAAGD,QAAQ,CAACE,aAAa,CAAC,KAAK,CAAC;MAC/CjC,MAAM,CAACkC,MAAM,CAACL,KAAA,CAAKG,UAAU,CAACG,KAAK,EAAE;QACnCC,QAAQ,EAAE,UAAU;QACpBC,KAAK,EAAE,KAAK;QACZC,MAAM,EAAE,KAAK;QACbC,SAAS,EAAE,MAAM;QACjBC,IAAI,EAAE,0BAA0B;QAChCC,QAAQ,EAAE;MACZ,CAAC,CAAC;MACFZ,KAAA,CAAKG,UAAU,CAACU,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC;MACnDb,KAAA,CAAKG,UAAU,CAACU,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;MAEnDX,QAAQ,CAACY,IAAI,CAACC,WAAW,CAACf,KAAA,CAAKG,UAAU,CAAC;IAC5C,CAAC;IAAA,IAAArB,gBAAA,aAAAkB,KAAA,sBAEkB,YAAM;MACvB,IAAIA,KAAA,CAAKG,UAAU,IAAIH,KAAA,CAAKG,UAAU,CAACa,UAAU,EAAE;QACjDhB,KAAA,CAAKG,UAAU,CAACa,UAAU,CAACC,WAAW,CAACjB,KAAA,CAAKG,UAAU,CAAC;MACzD;MAEAH,KAAA,CAAKG,UAAU,GAAGe,SAAS;IAC7B,CAAC;IAAA,IAAApC,gBAAA,aAAAkB,KAAA,cAEU,UAACmB,OAAO,EAAK;MACtB,IAAI,CAACnB,KAAA,CAAKG,UAAU,EAAE;QACpB;MACF;MAEAH,KAAA,CAAKG,UAAU,CAACiB,WAAW,GAAGD,OAAO;;MAErC;MACAE,YAAY,CAACrB,KAAA,CAAKsB,eAAe,CAAC;MAClCtB,KAAA,CAAKsB,eAAe,GAAGC,UAAU,CAAC,YAAM;QACtC,IAAIvB,KAAA,CAAKG,UAAU,EAAE;UACnBH,KAAA,CAAKG,UAAU,CAACiB,WAAW,GAAG,EAAE;QAClC;MACF,CAAC,EAAE,GAAG,CAAC;IACT,CAAC;IAAA,IAAAtC,gBAAA,aAAAkB,KAAA,eAEW,UAACwB,KAAK,EAAK;MACrB;MACAxB,KAAA,CAAKyB,UAAU,GAAG,CAAAD,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEE,GAAG,MAAK,WAAW,IAAI,CAAAF,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEE,GAAG,MAAK,QAAQ;IACzE,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAA5C,gBAAA,aAAAkB,KAAA,wBAKqB,UAAC2B,IAAI,EAAK;MAC7B,IAAI3B,KAAA,CAAKyB,UAAU,EAAE;QACnBzB,KAAA,CAAKyB,UAAU,GAAG,KAAK;QACvB;MACF;MAEA,IAAMG,SAAS,GAAGzD,MAAM,CAACC,IAAI,CAACuD,IAAI,CAAC,CAACE,IAAI,CAAC,UAACC,EAAE,EAAK;QAC/C,IAAMC,MAAM,GAAG/B,KAAA,CAAKgC,YAAY,CAACF,EAAE,CAAC,IAAI,EAAE;QAC1C,IAAMG,KAAK,GAAGN,IAAI,CAACG,EAAE,CAAC,IAAI,EAAE;QAE5B,OAAOG,KAAK,CAACrD,MAAM,GAAGmD,MAAM,CAACnD,MAAM,GAAG,CAAC,IAAI,IAAI,CAACsD,IAAI,CAACD,KAAK,CAACE,KAAK,CAACJ,MAAM,CAACnD,MAAM,CAAC,CAAC;MAClF,CAAC,CAAC;MAEF,IAAIgD,SAAS,EAAE;QACb5B,KAAA,CAAKoC,QAAQ,CAAC,0BAA0B,CAAC;MAC3C;IACF,CAAC;IAAA,IAAAtD,gBAAA,aAAAkB,KAAA,mBA2Ee,YAAM;MACpB,IAAAqC,WAAA,GAA2CrC,KAAA,CAAKD,KAAK;QAA7CuC,gBAAgB,GAAAD,WAAA,CAAhBC,gBAAgB;QAAEC,YAAY,GAAAF,WAAA,CAAZE,YAAY;MAEtC,IAAI,CAACvC,KAAA,CAAKwC,SAAS,EAAE;QACnB;MACF;MAEA,IAAMb,IAAI,GAAG3B,KAAA,CAAKyC,MAAM,CAAC,CAAC;MAE1BzC,KAAA,CAAK0C,kBAAkB,CAACf,IAAI,CAAC;MAE7B,IAAI,CAACW,gBAAgB,EAAE;QACrBtC,KAAA,CAAKgC,YAAY,GAAGL,IAAI;QACxB;MACF;MAEA,IAAMgB,MAAM,GAAG3C,KAAA,CAAK4C,WAAW;;MAE/B;MACA;MACAzE,MAAM,CAACC,IAAI,CAACuD,IAAI,CAAC,CAAC9C,OAAO,CAAC,UAACiD,EAAE,EAAK;QAChC,IAAIH,IAAI,CAACG,EAAE,CAAC,KAAK9B,KAAA,CAAKgC,YAAY,CAACF,EAAE,CAAC,EAAE;UACtC;QACF;QAEA,IAAMe,IAAI,GAAGN,YAAY,CAACvC,KAAA,CAAK8C,YAAY,CAAChB,EAAE,CAAC,EAAEa,MAAM,CAAC,IAAIb,EAAE;QAE9DQ,gBAAgB,CAACO,IAAI,EAAElB,IAAI,CAACG,EAAE,CAAC,CAAC;MAClC,CAAC,CAAC;MAEF9B,KAAA,CAAKgC,YAAY,GAAGL,IAAI;IAC1B,CAAC;IAAA,IAAA7C,gBAAA,aAAAkB,KAAA,mBAEe,YAAM;MACpB,IAAA+C,YAAA,GAA0C/C,KAAA,CAAKD,KAAK;QAA5CiD,eAAe,GAAAD,YAAA,CAAfC,eAAe;QAAET,YAAY,GAAAQ,YAAA,CAAZR,YAAY;MAErC,IAAI,CAACvC,KAAA,CAAKwC,SAAS,IAAI,CAACQ,eAAe,EAAE;QACvC;MACF;MAEA,IAAI;QACF,IAAMC,GAAG,GAAGjD,KAAA,CAAKwC,SAAS,CAACU,UAAU,CAAC,CAAC,IAAI,EAAE;QAC7C;QACA,IAAMC,OAAO,GAAGF,GAAG,CAACG,IAAI,CAAC,UAACtB,EAAE,EAAK;UAC/B,IAAMuB,KAAK,GAAGrD,KAAA,CAAKwC,SAAS,CAACc,cAAc,CAACxB,EAAE,CAAC;UAC/C,IAAMyB,SAAS,GAAGvD,KAAA,CAAKwC,SAAS,CAACe,SAAS;UAE1C,IAAI,CAACF,KAAK,IAAI,CAACE,SAAS,IAAI,CAACA,SAAS,CAACC,MAAM,IAAI,CAACD,SAAS,CAACC,MAAM,CAAC5E,MAAM,EAAE;YACzE,OAAO,KAAK;UACd;UAEA,IAAA6E,MAAA,OAAAC,eAAA,aAAqBL,KAAK;YAAnBM,KAAK,GAAAF,MAAA;YAAEG,GAAG,GAAAH,MAAA;UACjB,IAAAI,kBAAA,OAAAH,eAAA,aAAmBH,SAAS,CAACC,MAAM,CAAC,CAAC,CAAC;YAA/BM,QAAQ,GAAAD,kBAAA;UAEf,OAAOC,QAAQ,IAAIH,KAAK,IAAIG,QAAQ,IAAIF,GAAG;QAC7C,CAAC,CAAC;QAEF,IAAIT,OAAO,EAAE;UACX,IAAMY,MAAM,GAAG/D,KAAA,CAAK8C,YAAY,CAACK,OAAO,CAAC;UACzC,IAAMN,IAAI,GAAGN,YAAY,CAACwB,MAAM,EAAE/D,KAAA,CAAK4C,WAAW,CAAC,IAAIO,OAAO;UAE9D,IAAInD,KAAA,CAAKD,KAAK,CAACiE,QAAQ,EAAE;YACvBhE,KAAA,CAAKD,KAAK,CAACiE,QAAQ,CAACD,MAAM,CAAC;UAC7B;UAEAf,eAAe,CAACH,IAAI,EAAEkB,MAAM,CAAC;QAC/B;MACF,CAAC,CAAC,OAAO1G,CAAC,EAAE;QACV6B,GAAG,CAAC,oCAAoC,EAAE7B,CAAC,CAAC8D,OAAO,CAAC;MACtD;IACF,CAAC;IArTCnB,KAAA,CAAKiE,SAAS,gBAAGC,iBAAK,CAACC,SAAS,CAAC,CAAC;IAClCnE,KAAA,CAAKoE,KAAK,GAAG;MAAEC,MAAM,EAAE;IAAG,CAAC;IAC3BrE,KAAA,CAAKgC,YAAY,GAAG,CAAC,CAAC;IAAC,OAAAhC,KAAA;EACzB;EAAC,IAAAsE,UAAA,aAAA1E,MAAA,EAAAE,gBAAA;EAAA,WAAAyE,aAAA,aAAA3E,MAAA;IAAA8B,GAAA;IAAA8C,KAAA;MAAA,IAAAC,kBAAA,OAAAC,kBAAA,0BAAAC,YAAA,YAAAC,IAAA,CAED,SAAAC,QAAA;QAAA,IAAAC,UAAA,EAAAC,EAAA;QAAA,OAAAJ,YAAA,YAAAK,IAAA,WAAAC,QAAA;UAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAtD,IAAA;YAAA;cACE;cACA;cACA;cACMmD,UAAU,GAAI,IAAI,CAACK,eAAe,GAAG,CAAC,IAAI,CAACA,eAAe,IAAI,CAAC,IAAI,CAAC;cAAA,IAErE,IAAI,CAACC,aAAa,CAAC,CAAC;gBAAAH,QAAA,CAAAtD,IAAA;gBAAA;cAAA;cAAAsD,QAAA,CAAAtD,IAAA;cAAA,OACjB,IAAA0D,8BAAY,EAAC,CAAC;YAAA;cAEpB,IAAIP,UAAU,KAAK,IAAI,CAACK,eAAe,EAAE;gBACvC,IAAI,CAACG,YAAY,CAAC,CAAC;cACrB;cAAC,OAAAL,QAAA,CAAAM,MAAA;YAAA;cAAAN,QAAA,CAAAtD,IAAA;cAAA,OAKc,IAAA0D,8BAAY,EAAC,CAAC;YAAA;cAAzBN,EAAE,GAAAE,QAAA,CAAAO,IAAA;cAAA,MAEJV,UAAU,KAAK,IAAI,CAACK,eAAe,IAAI,CAACJ,EAAE,IAAI,CAAC,IAAI,CAACd,SAAS,CAACwB,OAAO,IAAI,IAAI,CAACjD,SAAS;gBAAAyC,QAAA,CAAAtD,IAAA;gBAAA;cAAA;cAAA,OAAAsD,QAAA,CAAAM,MAAA;YAAA;cAI3F,IAAI,CAAC/C,SAAS,GAAG,IAAIuC,EAAE,CAACW,gBAAgB,CAAC;gBAAEC,MAAM,EAAE,IAAAC,2BAAS,EAAC;cAAE,CAAC,CAAC;cACjE,IAAI,CAACpD,SAAS,CAACqD,QAAQ,GAAG,IAAI;cAC9B,IAAI,CAACrD,SAAS,CAACsD,yBAAyB,GAAG,QAAQ;cACnD;cACA;cACA,IAAI,CAACtD,SAAS,CAACuD,aAAa,GAAGC,iCAAe;cAC9C;cACA,IAAI,CAACxD,SAAS,CAACyD,gBAAgB,GAAG,KAAK;cACvC,IAAI,CAACzD,SAAS,CAACgC,KAAK,GAAG,IAAA0B,uBAAU,EAAC,IAAI,CAACnG,KAAK,CAACoG,KAAK,CAAC;;cAEnD;cACA;cACA,IAAAC,mCAAiB,EAAC,IAAI,CAAC5D,SAAS,CAAC;;cAEjC;cACA;cACA,IAAI,CAAC6D,YAAY,GAAG,IAAAC,uCAAqB,EAAC,IAAI,CAAC9D,SAAS,CAAC;cAEzD,IAAI,CAACA,SAAS,CAAC+D,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACC,aAAa,CAAC;cAC5D,IAAI,CAAChE,SAAS,CAAC+D,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAACE,aAAa,CAAC;cAC9D,IAAI,CAACjE,SAAS,CAAC+D,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAACG,SAAS,CAAC;;cAE1D;cACA,IAAI,CAACzC,SAAS,CAACwB,OAAO,CAACkB,eAAe,CAAC,IAAI,CAACnE,SAAS,CAAC;cAEtD,IAAI,CAACoE,gBAAgB,CAAC,CAAC;YAAC;YAAA;cAAA,OAAA3B,QAAA,CAAA4B,IAAA;UAAA;QAAA,GAAAhC,OAAA;MAAA,CACzB;MAAA,SAhDKiC,iBAAiBA,CAAA;QAAA,OAAArC,kBAAA,CAAA7G,KAAA,OAAAe,SAAA;MAAA;MAAA,OAAjBmI,iBAAiB;IAAA;EAAA;IAAApF,GAAA;IAAA8C,KAAA,EAkDvB,SAAAuC,kBAAkBA,CAACC,SAAS,EAAE;MAC5B,IAAIA,SAAS,CAACb,KAAK,KAAK,IAAI,CAACpG,KAAK,CAACoG,KAAK,EAAE;QACxC;MACF;MAEA,IAAI,IAAI,CAAC3D,SAAS,EAAE;QAClB,IAAI,CAACA,SAAS,CAACgC,KAAK,GAAG,IAAA0B,uBAAU,EAAC,IAAI,CAACnG,KAAK,CAACoG,KAAK,CAAC;MACrD,CAAC,MAAM;QACL,IAAI,CAACb,YAAY,CAAC,CAAC;MACrB;IACF;EAAC;IAAA5D,GAAA;IAAA8C,KAAA,EAED,SAAAyC,oBAAoBA,CAAA,EAAG;MACrB;MACA,IAAI,CAAC9B,eAAe,GAAG,CAAC,IAAI,CAACA,eAAe,IAAI,CAAC,IAAI,CAAC;MAEtD,IAAI,IAAI,CAACkB,YAAY,EAAE;QACrB,IAAI,CAACA,YAAY,CAAC,CAAC;QACnB,IAAI,CAACA,YAAY,GAAGnF,SAAS;MAC/B;MAEA,IAAI,IAAI,CAACsB,SAAS,EAAE;QAClB,IAAI,CAACA,SAAS,CAAC0E,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAACV,aAAa,CAAC;QAC/D,IAAI,CAAChE,SAAS,CAAC0E,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAACT,aAAa,CAAC;QACjE,IAAI,CAACjE,SAAS,CAAC0E,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAACR,SAAS,CAAC;QAC7D,IAAI,CAAClE,SAAS,CAAC2E,MAAM,CAAC,CAAC;QACvB,IAAI,CAAC3E,SAAS,GAAGtB,SAAS;MAC5B;MAEA,IAAI,CAACkG,gBAAgB,CAAC,CAAC;IACzB;EAAC;IAAA1F,GAAA;IAAA8C,KAAA,EAiFD;IACA,SAAAY,aAAaA,CAAA,EAAG;MACd,IAAMe,KAAK,GAAG,IAAI,CAACpG,KAAK,CAACoG,KAAK,IAAI,EAAE;MAEpC,OAAO,IAAAkB,qBAAQ,EAAClB,KAAK,CAAC,CAACvH,MAAM,GAAG,CAAC,IAAIuH,KAAK,CAACmB,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC5E;EAAC;IAAA5F,GAAA;IAAA8C,KAAA,EAED,SAAAc,YAAYA,CAAA,EAAG;MACb,IAAMjB,MAAM,GAAG,IAAAkD,+BAAa,EAAC,IAAI,CAACxH,KAAK,CAACoG,KAAK,CAAC;MAE9C,IAAI9B,MAAM,KAAK,IAAI,CAACD,KAAK,CAACC,MAAM,EAAE;QAChC,IAAI,CAACmD,QAAQ,CAAC;UAAEnD,MAAM,EAANA;QAAO,CAAC,CAAC;MAC3B;IACF;;IAEA;EAAA;IAAA3C,GAAA;IAAA8C,KAAA,EACA,SAAA/B,MAAMA,CAAA,EAAG;MAAA,IAAAgF,MAAA;MACP,IAAI,CAAC,IAAI,CAACjF,SAAS,EAAE;QACnB,OAAO,CAAC,CAAC;MACX;MAEA,IAAMkF,GAAG,GAAG,CAAC,CAAC;MAEd,CAAC,IAAI,CAAClF,SAAS,CAACU,UAAU,CAAC,CAAC,IAAI,EAAE,EAAErE,OAAO,CAAC,UAACiD,EAAE,EAAK;QAClD4F,GAAG,CAAC5F,EAAE,CAAC,GAAG,IAAA6F,yBAAY,EAACF,MAAI,CAACjF,SAAS,CAACoF,cAAc,CAAC9F,EAAE,CAAC,CAAC;MAC3D,CAAC,CAAC;MAEF,OAAO4F,GAAG;IACZ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAAhG,GAAA;IAAA8C,KAAA,EAQA,SAAA1B,YAAYA,CAAChB,EAAE,EAAE;MAAA,IAAA+F,MAAA;MACf,OAAO;QACL/F,EAAE,EAAFA,EAAE;QACF;QACAgG,KAAK,EAAE,SAAPA,KAAKA,CAAA,EAAQ;UACX,IAAID,MAAI,CAACrF,SAAS,EAAE;YAClBqF,MAAI,CAACrF,SAAS,CAACsF,KAAK,CAAC,CAAC;YACtBD,MAAI,CAACE,WAAW,CAACjG,EAAE,CAAC;UACtB;QACF,CAAC;QACDqE,KAAK,EAAE,SAAPA,KAAKA,CAAG3B,KAAK,EAAK;UAChB,IAAI,CAACqD,MAAI,CAACrF,SAAS,EAAE;YACnB,OAAO,EAAE;UACX;UAEA,IAAIgC,KAAK,KAAKtD,SAAS,EAAE;YACvB,OAAO,IAAAyG,yBAAY,EAACE,MAAI,CAACrF,SAAS,CAACoF,cAAc,CAAC9F,EAAE,CAAC,CAAC;UACxD;UAEA+F,MAAI,CAACrF,SAAS,CAACwF,cAAc,CAAClG,EAAE,EAAE,IAAAoE,uBAAU,EAAC1B,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;UAExD,OAAOA,KAAK;QACd;MACF,CAAC;IACH;;IAEA;EAAA;IAAA9C,GAAA;IAAAuG,GAAA,EACA,SAAAA,IAAA,EAAkB;MAAA,IAAAC,MAAA;MAChB,IAAI,CAAC,IAAI,CAAC1F,SAAS,EAAE;QACnB,OAAO,EAAE;MACX;MAEA,OAAO,CAAC,IAAI,CAACA,SAAS,CAACU,UAAU,CAAC,CAAC,IAAI,EAAE,EAAEiF,GAAG,CAAC,UAACrG,EAAE;QAAA,OAAKoG,MAAI,CAACpF,YAAY,CAAChB,EAAE,CAAC;MAAA,EAAC;IAC/E;EAAC;IAAAJ,GAAA;IAAA8C,KAAA,EA0ED;IACA,SAAA4D,gBAAgBA,CAAC7H,QAAQ,EAAE;MAAA,IAAA8H,MAAA;MACzB,IAAI,CAAC,IAAI,CAAC7F,SAAS,IAAI,OAAOjC,QAAQ,KAAK,QAAQ,EAAE;QACnD,OAAOW,SAAS;MAClB;MAEA,OAAO,CAAC,IAAI,CAACsB,SAAS,CAACU,UAAU,CAAC,CAAC,IAAI,EAAE,EAAEE,IAAI,CAAC,UAACtB,EAAE,EAAK;QACtD,IAAMuB,KAAK,GAAGgF,MAAI,CAAC7F,SAAS,CAACc,cAAc,CAACxB,EAAE,CAAC;QAE/C,OAAOuB,KAAK,IAAI9C,QAAQ,IAAI8C,KAAK,CAAC,CAAC,CAAC,IAAI9C,QAAQ,IAAI8C,KAAK,CAAC,CAAC,CAAC;MAC9D,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EAlBE;IAAA3B,GAAA;IAAA8C,KAAA,EAmBA,SAAAuD,WAAWA,CAACjG,EAAE,EAAE;MACd,IAAI,CAAC,IAAI,CAACU,SAAS,EAAE;QACnB;MACF;MAEA,IAAMS,GAAG,GAAG,IAAI,CAACT,SAAS,CAACU,UAAU,CAAC,CAAC,IAAI,EAAE;MAC7C,IAAMoF,MAAM,GAAGxG,EAAE,IAAImB,GAAG,CAACqE,OAAO,CAACxF,EAAE,CAAC,KAAK,CAAC,CAAC,GAAGA,EAAE,GAAGmB,GAAG,CAAC,CAAC,CAAC;MAEzD,IAAI,CAACqF,MAAM,EAAE;QACX;MACF;MAEA,IAAMjF,KAAK,GAAG,IAAI,CAACb,SAAS,CAACc,cAAc,CAACgF,MAAM,CAAC;MAEnD,IAAI,CAACjF,KAAK,EAAE;QACV;MACF;MAEA,IAAI,CAACb,SAAS,CAACe,SAAS,GAAG;QAAEC,MAAM,EAAE,CAAC,CAACH,KAAK,CAAC,CAAC,CAAC,EAAEA,KAAK,CAAC,CAAC,CAAC,CAAC;MAAE,CAAC;MAE7D,IAAI,OAAO,IAAI,CAACb,SAAS,CAAC+F,cAAc,KAAK,UAAU,EAAE;QACvD,IAAI,CAAC/F,SAAS,CAAC+F,cAAc,CAAC,gBAAgB,CAAC;MACjD;IACF;EAAC;IAAA7G,GAAA;IAAA8C,KAAA,EAED,SAAAsD,KAAKA,CAAA,EAAG;MACN,IAAI,CAAC,IAAI,CAACtF,SAAS,EAAE;QACnB;MACF;MAEA,IAAI,CAACA,SAAS,CAACsF,KAAK,CAAC,CAAC;;MAEtB;MACA;MACA;MACA;MACA,IAAI,CAAC,IAAI,CAACM,gBAAgB,CAAC,IAAI,CAAC5F,SAAS,CAACjC,QAAQ,CAAC,EAAE;QACnD,IAAI,CAACwH,WAAW,CAAC,CAAC;MACpB;IACF;EAAC;IAAArG,GAAA;IAAA8C,KAAA,EAED,SAAAgE,IAAIA,CAAA,EAAG;MACL,IAAI,CAAChG,SAAS,IAAI,IAAI,CAACA,SAAS,CAACgG,IAAI,CAAC,CAAC;IACzC;EAAC;IAAA9G,GAAA;IAAA8C,KAAA,EAED,SAAAiE,MAAMA,CAAA,EAAG;MACP,IAAAC,YAAA,GAAuC,IAAI,CAAC3I,KAAK;QAAzC4I,SAAS,GAAAD,YAAA,CAATC,SAAS;QAAEC,OAAO,GAAAF,YAAA,CAAPE,OAAO;QAAEC,MAAM,GAAAH,YAAA,CAANG,MAAM;MAClC,IAAQxE,MAAM,GAAK,IAAI,CAACD,KAAK,CAArBC,MAAM;MAEd,IAAI,IAAI,CAAC7B,SAAS,IAAI,IAAI,CAAC4C,aAAa,CAAC,CAAC,EAAE;QAC1C,oBAAO3I,MAAA,YAAA2D,aAAA,CAAChB,MAAM;UAACuJ,SAAS,EAAEA,SAAU;UAACC,OAAO,EAAEA,OAAQ;UAACC,MAAM,EAAEA,MAAO;UAACC,GAAG,EAAE,IAAI,CAAC7E;QAAU,CAAE,CAAC;MAChG;MAEA,oBACExH,MAAA,YAAA2D,aAAA,CAAChB,MAAM;QACLuJ,SAAS,EAAEA,SAAU;QACrBC,OAAO,EAAEA,OAAQ;QACjBC,MAAM,EAAEA,MAAO;QACfC,GAAG,EAAE,IAAI,CAAC7E;QACV;QAAA;QACA8E,uBAAuB,EAAE;UAAEC,MAAM,EAAE3E;QAAO;MAAE,CAC7C,CAAC;IAEN;EAAC;AAAA,EAxaiCH,iBAAK,CAAC+E,SAAS;AAAA,IAAAnK,gBAAA,aAA9Bc,MAAM,eACN;EACjBuG,KAAK,EAAE+C,qBAAS,CAACC,MAAM,CAACC,UAAU;EAClCT,SAAS,EAAEO,qBAAS,CAACC,MAAM;EAC3BP,OAAO,EAAEM,qBAAS,CAACG,IAAI;EACvBR,MAAM,EAAEK,qBAAS,CAACG,IAAI;EACtB9G,YAAY,EAAE2G,qBAAS,CAACG,IAAI;EAC5B/G,gBAAgB,EAAE4G,qBAAS,CAACG,IAAI;EAChCrG,eAAe,EAAEkG,qBAAS,CAACG,IAAI;EAC/BrF,QAAQ,EAAEkF,qBAAS,CAACG;AACtB,CAAC;AAAA,IAAAvK,gBAAA,aAVkBc,MAAM,kBAYH;EACpB2C,YAAY,EAAE,SAAdA,YAAYA,CAAA,EAAQ,CAAC;AACvB,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.1.5-beta.5",
6
+ "version": "1.1.5-beta.7",
7
7
  "description": "MathLive-based math input (drop-in alternative to @pie-lib/math-input)",
8
8
  "main": "lib/index.js",
9
9
  "module": "src/index.jsx",