@pie-lib/math-input-mathlive 1.0.9 → 1.0.10

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.
@@ -67,12 +67,41 @@ var placeholderStyles = exports.placeholderStyles = {
67
67
  '& [data-pie-empty]': {
68
68
  opacity: 0.5
69
69
  },
70
- // Stretchy accents render an <svg>; mathlive-static.css positions it
71
- // absolutely at width:100%. Repeated here so static math cannot blow out its
72
- // container if that stylesheet is missing.
73
- '& svg': {
70
+ // Stretchy accents (\overarc, \overleftrightarrow, \overrightarrow) render an
71
+ // <svg width="100%" preserveAspectRatio="none"> inside a `.ML__stretchy`. That
72
+ // span is absolutely positioned, so its immediate wrapper computes to 0px and
73
+ // the width has to resolve against a *positioned* ancestor. Pin that to
74
+ // `.ML__base`, whose width already equals the accent's content (measured:
75
+ // 9.85px for a 0.56em slot), so the arc spans exactly its content.
76
+ //
77
+ // Do NOT write a bare `& svg` rule instead: MathLive's own rule is
78
+ // descendant-scoped (`.ML__latex .ML__stretchy svg`), and a global one
79
+ // re-parents every svg in the subtree.
80
+ '& .ML__base': {
81
+ position: 'relative'
82
+ },
83
+ '& .ML__stretchy': {
74
84
  position: 'absolute',
85
+ left: 0,
75
86
  width: '100%'
87
+ },
88
+ // MathLive centres an accent by shifting it right half the content width -
89
+ // `margin-left: 0.28em` for a 0.56em slot - which assumes a glyph with its own
90
+ // side bearings. Over a synthetic empty slot it just pushes the arc right.
91
+ //
92
+ // `!important` is required: MathLive writes this as an INLINE style
93
+ // (`style="top:-3.4em;margin-left:0.28em"`), which a class cannot override.
94
+ //
95
+ // It also fixes the width. `.ML__center` is the stretchy's containing block
96
+ // (MathLive gives `.ML__vlist > span` position:relative), and its width is the
97
+ // base minus that margin - measured 9.85px - 4.93px = 4.93px, exactly half,
98
+ // which is why the arc came out half-width AND offset right.
99
+ //
100
+ // Scoped with `:has(.ML__stretchy)`: only stretchy accents are affected.
101
+ // A single-glyph accent (`\hat{x}`, `\vec{x}`) genuinely needs its centring
102
+ // offset, and must keep it.
103
+ '& .ML__center:has(.ML__stretchy)': {
104
+ marginLeft: '0 !important'
76
105
  }
77
106
  };
78
107
 
@@ -1 +1 @@
1
- {"version":3,"file":"common-styles.js","names":["commonMqFontStyles","exports","fontFamily","longdivStyles","display","supsubStyles","placeholderStyles","borderBottom","minWidth","opacity","position","width","commonMqKeyboardStyles","_objectSpread","touchAction","fontSize","outline","commonMathLiveStyles","commonKeyboardStyles","_default"],"sources":["../../src/mf/common-styles.js"],"sourcesContent":["/**\n * Shared MathLive styling.\n *\n * Replaces @pie-lib/math-input's `common-mq-styles.js`. That file was built\n * around MathQuill's `.mq-*` class names, none of which exist in MathLive\n * output, so the selectors here target MathLive's own structure instead.\n *\n * The four named groups are kept because consumers destructure them:\n *\n * const { commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles }\n * = mq.CommonMqStyles; // math-toolbar/src/editor-and-pad.jsx, math-preview.jsx\n *\n * Most are intentionally near-empty: MathLive sizes scripts, radicals and\n * fences correctly on its own, so the MathQuill-era corrections are not needed.\n * They stay as documented extension points rather than being deleted, so the\n * destructuring above keeps working.\n */\n\n/**\n * Font styling. MathQuill needed explicit MathJax font families to match the\n * static renderer; MathLive ships the KaTeX fonts it renders with, so this only\n * smooths rendering and lets the host override the family.\n */\nexport const commonMqFontStyles = {\n '-webkit-font-smoothing': 'antialiased',\n '& math-field': {\n fontFamily: 'inherit',\n },\n};\n\n/**\n * Long division. The MathQuill fork drew this with nested `.mq-longdiv-*`\n * elements that needed manual offsets; here it comes from the `\\longdiv` macro\n * (see `PIE_MACROS`), tagged with `data-pie-macro=\"longdiv\"`.\n */\nexport const longdivStyles = {\n '& [data-pie-macro=\"longdiv\"]': {\n display: 'inline-flex',\n },\n};\n\n/**\n * Superscript/subscript sizing. MathLive follows TeX metrics, so no overrides\n * are required.\n */\nexport const supsubStyles = {};\n\n/** Empty placeholder boxes (answer blocks / open slots). */\nexport const placeholderStyles = {\n '& .ML__placeholder': {\n borderBottom: '1px solid currentColor',\n minWidth: '1em',\n },\n // Stand-in glyph for an empty argument slot in STATIC math (see\n // `withVisibleEmptySlots`). Muted so it reads as \"a slot goes here\" rather\n // than as part of the symbol, matching how MathQuill shaded `.mq-empty`.\n '& [data-pie-empty]': {\n opacity: 0.5,\n },\n // Stretchy accents render an <svg>; mathlive-static.css positions it\n // absolutely at width:100%. Repeated here so static math cannot blow out its\n // container if that stylesheet is missing.\n '& svg': {\n position: 'absolute',\n width: '100%',\n },\n};\n\n/**\n * Styling for the on-screen keyboard and any container rendering math labels.\n * Also hides MathLive's own affordances, since pie supplies its own keypad.\n */\nexport const commonMqKeyboardStyles = {\n ...commonMqFontStyles,\n ...longdivStyles,\n ...placeholderStyles,\n touchAction: 'manipulation',\n '& math-field': {\n fontSize: 'inherit',\n outline: 'none',\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/** Everything combined - the common case for a container of math. */\nexport const commonMathLiveStyles = {\n ...commonMqFontStyles,\n ...longdivStyles,\n ...supsubStyles,\n ...placeholderStyles,\n '& math-field': {\n fontSize: 'inherit',\n outline: 'none',\n },\n '& math-field::part(virtual-keyboard-toggle)': {\n display: 'none',\n },\n '& math-field::part(menu-toggle)': {\n display: 'none',\n },\n};\n\nexport const commonKeyboardStyles = commonMqKeyboardStyles;\n\n/**\n * Default export mirrors @pie-lib/math-input's `CommonMqStyles` object so\n * existing destructuring keeps working.\n */\nexport default {\n commonMqFontStyles,\n longdivStyles,\n supsubStyles,\n commonMqKeyboardStyles,\n placeholderStyles,\n commonMathLiveStyles,\n};\n"],"mappings":";;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO,IAAMA,kBAAkB,GAAAC,OAAA,CAAAD,kBAAA,GAAG;EAChC,wBAAwB,EAAE,aAAa;EACvC,cAAc,EAAE;IACdE,UAAU,EAAE;EACd;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACO,IAAMC,aAAa,GAAAF,OAAA,CAAAE,aAAA,GAAG;EAC3B,8BAA8B,EAAE;IAC9BC,OAAO,EAAE;EACX;AACF,CAAC;;AAED;AACA;AACA;AACA;AACO,IAAMC,YAAY,GAAAJ,OAAA,CAAAI,YAAA,GAAG,CAAC,CAAC;;AAE9B;AACO,IAAMC,iBAAiB,GAAAL,OAAA,CAAAK,iBAAA,GAAG;EAC/B,oBAAoB,EAAE;IACpBC,YAAY,EAAE,wBAAwB;IACtCC,QAAQ,EAAE;EACZ,CAAC;EACD;EACA;EACA;EACA,oBAAoB,EAAE;IACpBC,OAAO,EAAE;EACX,CAAC;EACD;EACA;EACA;EACA,OAAO,EAAE;IACPC,QAAQ,EAAE,UAAU;IACpBC,KAAK,EAAE;EACT;AACF,CAAC;;AAED;AACA;AACA;AACA;AACO,IAAMC,sBAAsB,GAAAX,OAAA,CAAAW,sBAAA,GAAAC,aAAA,CAAAA,aAAA,CAAAA,aAAA,CAAAA,aAAA,KAC9Bb,kBAAkB,GAClBG,aAAa,GACbG,iBAAiB;EACpBQ,WAAW,EAAE,cAAc;EAC3B,cAAc,EAAE;IACdC,QAAQ,EAAE,SAAS;IACnBC,OAAO,EAAE;EACX,CAAC;EACD,6CAA6C,EAAE;IAC7CZ,OAAO,EAAE;EACX,CAAC;EACD,iCAAiC,EAAE;IACjCA,OAAO,EAAE;EACX;AAAC,EACF;;AAED;AACO,IAAMa,oBAAoB,GAAAhB,OAAA,CAAAgB,oBAAA,GAAAJ,aAAA,CAAAA,aAAA,CAAAA,aAAA,CAAAA,aAAA,CAAAA,aAAA,KAC5Bb,kBAAkB,GAClBG,aAAa,GACbE,YAAY,GACZC,iBAAiB;EACpB,cAAc,EAAE;IACdS,QAAQ,EAAE,SAAS;IACnBC,OAAO,EAAE;EACX,CAAC;EACD,6CAA6C,EAAE;IAC7CZ,OAAO,EAAE;EACX,CAAC;EACD,iCAAiC,EAAE;IACjCA,OAAO,EAAE;EACX;AAAC,EACF;AAEM,IAAMc,oBAAoB,GAAAjB,OAAA,CAAAiB,oBAAA,GAAGN,sBAAsB;;AAE1D;AACA;AACA;AACA;AAHA,IAAAO,QAAA,GAAAlB,OAAA,cAIe;EACbD,kBAAkB,EAAlBA,kBAAkB;EAClBG,aAAa,EAAbA,aAAa;EACbE,YAAY,EAAZA,YAAY;EACZO,sBAAsB,EAAtBA,sBAAsB;EACtBN,iBAAiB,EAAjBA,iBAAiB;EACjBW,oBAAoB,EAApBA;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"common-styles.js","names":["commonMqFontStyles","exports","fontFamily","longdivStyles","display","supsubStyles","placeholderStyles","borderBottom","minWidth","opacity","position","left","width","marginLeft","commonMqKeyboardStyles","_objectSpread","touchAction","fontSize","outline","commonMathLiveStyles","commonKeyboardStyles","_default"],"sources":["../../src/mf/common-styles.js"],"sourcesContent":["/**\n * Shared MathLive styling.\n *\n * Replaces @pie-lib/math-input's `common-mq-styles.js`. That file was built\n * around MathQuill's `.mq-*` class names, none of which exist in MathLive\n * output, so the selectors here target MathLive's own structure instead.\n *\n * The four named groups are kept because consumers destructure them:\n *\n * const { commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles }\n * = mq.CommonMqStyles; // math-toolbar/src/editor-and-pad.jsx, math-preview.jsx\n *\n * Most are intentionally near-empty: MathLive sizes scripts, radicals and\n * fences correctly on its own, so the MathQuill-era corrections are not needed.\n * They stay as documented extension points rather than being deleted, so the\n * destructuring above keeps working.\n */\n\n/**\n * Font styling. MathQuill needed explicit MathJax font families to match the\n * static renderer; MathLive ships the KaTeX fonts it renders with, so this only\n * smooths rendering and lets the host override the family.\n */\nexport const commonMqFontStyles = {\n '-webkit-font-smoothing': 'antialiased',\n '& math-field': {\n fontFamily: 'inherit',\n },\n};\n\n/**\n * Long division. The MathQuill fork drew this with nested `.mq-longdiv-*`\n * elements that needed manual offsets; here it comes from the `\\longdiv` macro\n * (see `PIE_MACROS`), tagged with `data-pie-macro=\"longdiv\"`.\n */\nexport const longdivStyles = {\n '& [data-pie-macro=\"longdiv\"]': {\n display: 'inline-flex',\n },\n};\n\n/**\n * Superscript/subscript sizing. MathLive follows TeX metrics, so no overrides\n * are required.\n */\nexport const supsubStyles = {};\n\n/** Empty placeholder boxes (answer blocks / open slots). */\nexport const placeholderStyles = {\n '& .ML__placeholder': {\n borderBottom: '1px solid currentColor',\n minWidth: '1em',\n },\n // Stand-in glyph for an empty argument slot in STATIC math (see\n // `withVisibleEmptySlots`). Muted so it reads as \"a slot goes here\" rather\n // than as part of the symbol, matching how MathQuill shaded `.mq-empty`.\n '& [data-pie-empty]': {\n opacity: 0.5,\n },\n // Stretchy accents (\\overarc, \\overleftrightarrow, \\overrightarrow) render an\n // <svg width=\"100%\" preserveAspectRatio=\"none\"> inside a `.ML__stretchy`. That\n // span is absolutely positioned, so its immediate wrapper computes to 0px and\n // the width has to resolve against a *positioned* ancestor. Pin that to\n // `.ML__base`, whose width already equals the accent's content (measured:\n // 9.85px for a 0.56em slot), so the arc spans exactly its content.\n //\n // Do NOT write a bare `& svg` rule instead: MathLive's own rule is\n // descendant-scoped (`.ML__latex .ML__stretchy svg`), and a global one\n // re-parents every svg in the subtree.\n '& .ML__base': {\n position: 'relative',\n },\n '& .ML__stretchy': {\n position: 'absolute',\n left: 0,\n width: '100%',\n },\n // MathLive centres an accent by shifting it right half the content width -\n // `margin-left: 0.28em` for a 0.56em slot - which assumes a glyph with its own\n // side bearings. Over a synthetic empty slot it just pushes the arc right.\n //\n // `!important` is required: MathLive writes this as an INLINE style\n // (`style=\"top:-3.4em;margin-left:0.28em\"`), which a class cannot override.\n //\n // It also fixes the width. `.ML__center` is the stretchy's containing block\n // (MathLive gives `.ML__vlist > span` position:relative), and its width is the\n // base minus that margin - measured 9.85px - 4.93px = 4.93px, exactly half,\n // which is why the arc came out half-width AND offset right.\n //\n // Scoped with `:has(.ML__stretchy)`: only stretchy accents are affected.\n // A single-glyph accent (`\\hat{x}`, `\\vec{x}`) genuinely needs its centring\n // offset, and must keep it.\n '& .ML__center:has(.ML__stretchy)': {\n marginLeft: '0 !important',\n },\n};\n\n/**\n * Styling for the on-screen keyboard and any container rendering math labels.\n * Also hides MathLive's own affordances, since pie supplies its own keypad.\n */\nexport const commonMqKeyboardStyles = {\n ...commonMqFontStyles,\n ...longdivStyles,\n ...placeholderStyles,\n touchAction: 'manipulation',\n '& math-field': {\n fontSize: 'inherit',\n outline: 'none',\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/** Everything combined - the common case for a container of math. */\nexport const commonMathLiveStyles = {\n ...commonMqFontStyles,\n ...longdivStyles,\n ...supsubStyles,\n ...placeholderStyles,\n '& math-field': {\n fontSize: 'inherit',\n outline: 'none',\n },\n '& math-field::part(virtual-keyboard-toggle)': {\n display: 'none',\n },\n '& math-field::part(menu-toggle)': {\n display: 'none',\n },\n};\n\nexport const commonKeyboardStyles = commonMqKeyboardStyles;\n\n/**\n * Default export mirrors @pie-lib/math-input's `CommonMqStyles` object so\n * existing destructuring keeps working.\n */\nexport default {\n commonMqFontStyles,\n longdivStyles,\n supsubStyles,\n commonMqKeyboardStyles,\n placeholderStyles,\n commonMathLiveStyles,\n};\n"],"mappings":";;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO,IAAMA,kBAAkB,GAAAC,OAAA,CAAAD,kBAAA,GAAG;EAChC,wBAAwB,EAAE,aAAa;EACvC,cAAc,EAAE;IACdE,UAAU,EAAE;EACd;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACO,IAAMC,aAAa,GAAAF,OAAA,CAAAE,aAAA,GAAG;EAC3B,8BAA8B,EAAE;IAC9BC,OAAO,EAAE;EACX;AACF,CAAC;;AAED;AACA;AACA;AACA;AACO,IAAMC,YAAY,GAAAJ,OAAA,CAAAI,YAAA,GAAG,CAAC,CAAC;;AAE9B;AACO,IAAMC,iBAAiB,GAAAL,OAAA,CAAAK,iBAAA,GAAG;EAC/B,oBAAoB,EAAE;IACpBC,YAAY,EAAE,wBAAwB;IACtCC,QAAQ,EAAE;EACZ,CAAC;EACD;EACA;EACA;EACA,oBAAoB,EAAE;IACpBC,OAAO,EAAE;EACX,CAAC;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,aAAa,EAAE;IACbC,QAAQ,EAAE;EACZ,CAAC;EACD,iBAAiB,EAAE;IACjBA,QAAQ,EAAE,UAAU;IACpBC,IAAI,EAAE,CAAC;IACPC,KAAK,EAAE;EACT,CAAC;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kCAAkC,EAAE;IAClCC,UAAU,EAAE;EACd;AACF,CAAC;;AAED;AACA;AACA;AACA;AACO,IAAMC,sBAAsB,GAAAb,OAAA,CAAAa,sBAAA,GAAAC,aAAA,CAAAA,aAAA,CAAAA,aAAA,CAAAA,aAAA,KAC9Bf,kBAAkB,GAClBG,aAAa,GACbG,iBAAiB;EACpBU,WAAW,EAAE,cAAc;EAC3B,cAAc,EAAE;IACdC,QAAQ,EAAE,SAAS;IACnBC,OAAO,EAAE;EACX,CAAC;EACD,6CAA6C,EAAE;IAC7Cd,OAAO,EAAE;EACX,CAAC;EACD,iCAAiC,EAAE;IACjCA,OAAO,EAAE;EACX;AAAC,EACF;;AAED;AACO,IAAMe,oBAAoB,GAAAlB,OAAA,CAAAkB,oBAAA,GAAAJ,aAAA,CAAAA,aAAA,CAAAA,aAAA,CAAAA,aAAA,CAAAA,aAAA,KAC5Bf,kBAAkB,GAClBG,aAAa,GACbE,YAAY,GACZC,iBAAiB;EACpB,cAAc,EAAE;IACdW,QAAQ,EAAE,SAAS;IACnBC,OAAO,EAAE;EACX,CAAC;EACD,6CAA6C,EAAE;IAC7Cd,OAAO,EAAE;EACX,CAAC;EACD,iCAAiC,EAAE;IACjCA,OAAO,EAAE;EACX;AAAC,EACF;AAEM,IAAMgB,oBAAoB,GAAAnB,OAAA,CAAAmB,oBAAA,GAAGN,sBAAsB;;AAE1D;AACA;AACA;AACA;AAHA,IAAAO,QAAA,GAAApB,OAAA,cAIe;EACbD,kBAAkB,EAAlBA,kBAAkB;EAClBG,aAAa,EAAbA,aAAa;EACbE,YAAY,EAAZA,YAAY;EACZS,sBAAsB,EAAtBA,sBAAsB;EACtBR,iBAAiB,EAAjBA,iBAAiB;EACjBa,oBAAoB,EAApBA;AACF,CAAC","ignoreList":[]}
package/lib/mf/input.js CHANGED
@@ -114,6 +114,10 @@ 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
+
118
+ // The mathfield renders in shadow DOM, so page CSS cannot reach it - the
119
+ // stretchy-accent fix has to be injected there directly.
120
+ (0, _mathliveInstance.applyShadowStyles)(this.mathField);
117
121
  this.mathField.addEventListener('input', this.onInputEdit);
118
122
 
119
123
  // Belt and braces: drop anything a previous mount may have left behind.
@@ -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","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 { loadMathLive, getMacros, MATH_MODE_SPACE } 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 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.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","applyShadowStyles","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 { loadMathLive, getMacros, MATH_MODE_SPACE, applyShadowStyles } 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 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.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;AACA,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,iBAsFD,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;IA5OCX,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;;cAE9C;cACA;cACA,IAAAC,mCAAiB,EAAC,IAAI,CAACvC,SAAS,CAAC;cAEjC,IAAI,CAACA,SAAS,CAACwC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACC,WAAW,CAAC;;cAE1D;cACA,IAAI,CAACjC,SAAS,CAACqB,OAAO,CAACa,eAAe,CAAC,IAAI,CAAC1C,SAAS,CAAC;cAEtD,IAAI,IAAI,CAACL,KAAK,CAACgD,QAAQ,EAAE;gBACvB,IAAI,CAAChD,KAAK,CAACgD,QAAQ,CAAC,IAAI,CAAC;cAC3B;YAAC;YAAA;cAAA,OAAApB,QAAA,CAAAqB,IAAA;UAAA;QAAA,GAAAzB,OAAA;MAAA,CACF;MAAA,SAvCK0B,iBAAiBA,CAAA;QAAA,OAAA9B,kBAAA,CAAAlC,KAAA,OAAAiE,SAAA;MAAA;MAAA,OAAjBD,iBAAiB;IAAA;EAAA;IAAAvC,GAAA;IAAAQ,KAAA,EAyCvB,SAAAiC,kBAAkBA,CAACC,SAAS,EAAE;MAC5B,IAAI,CAAC,IAAI,CAAChD,SAAS,EAAE;QACnB;MACF;MAEA,IAAAiD,WAAA,GAA4B,IAAI,CAACtD,KAAK;QAA9BM,KAAK,GAAAgD,WAAA,CAALhD,KAAK;QAAEkC,QAAQ,GAAAc,WAAA,CAARd,QAAQ;MAEvB,IAAIA,QAAQ,KAAKa,SAAS,CAACb,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,SAAAoC,oBAAoBA,CAAA,EAAG;MACrB;MACA;MACA,IAAI,CAACxB,eAAe,GAAG,CAAC,IAAI,CAACA,eAAe,IAAI,CAAC,IAAI,CAAC;MAEtD,IAAI,IAAI,CAAC1B,SAAS,EAAE;QAClB,IAAI,CAACA,SAAS,CAACmD,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAACV,WAAW,CAAC;QAC7D,IAAI,CAACzC,SAAS,CAACoD,MAAM,CAAC,CAAC;QACvB,IAAI,CAACpD,SAAS,GAAGW,SAAS;MAC5B;MAEA,IAAI,IAAI,CAAChB,KAAK,CAACgD,QAAQ,EAAE;QACvB,IAAI,CAAChD,KAAK,CAACgD,QAAQ,CAAC,IAAI,CAAC;MAC3B;IACF;EAAC;IAAArC,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;IAAA+C,GAAA,EASA,SAAAA,IAAA,EAAc;MACZ,OAAO,IAAI,CAACrD,SAAS;IACvB;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAM,GAAA;IAAA+C,GAAA,EAMA,SAAAA,IAAA,EAAe;MAAA,IAAAC,MAAA;MACb,OAAO;QACLrD,KAAK,EAAE,SAAPA,KAAKA,CAAGsD,CAAC;UAAA,OAAMA,CAAC,KAAK5C,SAAS,GAAG2C,MAAI,CAACrD,KAAK,CAAC,CAAC,IAAIqD,MAAI,CAACE,QAAQ,CAACD,CAAC,CAAC,EAAEA,CAAC,CAAC;QAAA,CAAC;QACtEE,EAAE,EAAE,SAAJA,EAAEA,CAAA;UAAA,OAAQH,MAAI,CAACtD,SAAS;QAAA;QACxB0D,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;IAAArD,GAAA;IAAAQ,KAAA,EACA,SAAA0C,QAAQA,CAACD,CAAC,EAAE;MACV,IAAI,IAAI,CAACvD,SAAS,EAAE;QAClB,IAAI,CAACA,SAAS,CAACc,KAAK,GAAG,IAAAoB,uBAAU,EAACqB,CAAC,IAAI,EAAE,CAAC;MAC5C;IACF;EAAC;IAAAjD,GAAA;IAAAQ,KAAA,EAED,SAAA8C,KAAKA,CAAA,EAAG;MACN,IAAI,IAAI,CAAC5D,SAAS,EAAE;QAClB,IAAI,CAACA,SAAS,CAACc,KAAK,GAAG,EAAE;MAC3B;MAEA,OAAO,EAAE;IACX;EAAC;IAAAR,GAAA;IAAAQ,KAAA,EAED,SAAA6C,IAAIA,CAAA,EAAG;MACLzE,GAAG,CAAC,gBAAgB,CAAC;MACrB,IAAI,CAACc,SAAS,IAAI,IAAI,CAACA,SAAS,CAAC2D,IAAI,CAAC,CAAC;IACzC;EAAC;IAAArD,GAAA;IAAAQ,KAAA,EAED,SAAA4C,KAAKA,CAAA,EAAG;MACNxE,GAAG,CAAC,oBAAoB,CAAC;MACzB,IAAI,CAACc,SAAS,IAAI,IAAI,CAACA,SAAS,CAAC0D,KAAK,CAAC,CAAC;IAC1C;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAApD,GAAA;IAAAQ,KAAA,EAOA,SAAA+C,OAAOA,CAACN,CAAC,EAAE;MACTrE,GAAG,CAAC,WAAW,EAAEqE,CAAC,CAAC;MAEnB,IAAI,CAAC,IAAI,CAACvD,SAAS,EAAE;QACnB,OAAO,EAAE;MACX;MAEA,IAAM8D,MAAM,GAAG,IAAAC,wBAAW,EAAC;QAAEF,OAAO,EAAEN;MAAE,CAAC,CAAC;MAE1C,IAAIO,MAAM,EAAE;QACV,IAAI,CAAC9D,SAAS,CAACgE,MAAM,CAACF,MAAM,CAAChD,KAAK,EAAE;UAAE4C,KAAK,EAAE;QAAK,CAAC,CAAC;MACtD;MAEA,IAAI,CAAC1D,SAAS,CAAC0D,KAAK,CAAC,CAAC;MAEtB,OAAO,IAAI,CAACzD,KAAK,CAAC,CAAC;IACrB;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAK,GAAA;IAAAQ,KAAA,EAOA,SAAAmD,SAASA,CAACV,CAAC,EAAE;MACXrE,GAAG,CAAC,aAAa,EAAEqE,CAAC,CAAC;MAErB,IAAI,CAAC,IAAI,CAACvD,SAAS,EAAE;QACnB,OAAO,EAAE;MACX;MAEA,IAAMkE,QAAQ,GAAGC,uBAAU,CAACZ,CAAC,CAAC,IAAIA,CAAC;MAEnC,IAAI;QACF,IAAI,CAACvD,SAAS,CAACoE,cAAc,CAACF,QAAQ,CAAC;MACzC,CAAC,CAAC,OAAO5F,CAAC,EAAE;QACVY,GAAG,CAAC,qCAAqC,EAAEqE,CAAC,EAAEjF,CAAC,IAAIA,CAAC,CAAC+F,OAAO,CAAC;MAC/D;MAEA,IAAI,CAACrE,SAAS,CAAC0D,KAAK,CAAC,CAAC;MAEtB,OAAO,IAAI,CAACzD,KAAK,CAAC,CAAC;IACrB;;IAEA;EAAA;IAAAK,GAAA;IAAAQ,KAAA,EACA,SAAAwD,KAAKA,CAACf,CAAC,EAAE;MAAA,IAAAgB,MAAA;MACPrF,GAAG,CAAC,SAAS,EAAEqE,CAAC,CAAC;MAEjB,IAAI,CAAC,IAAI,CAACvD,SAAS,EAAE;QACnB,OAAO,EAAE;MACX;MAEA,IAAMwE,MAAM,GAAGC,KAAK,CAACC,OAAO,CAACnB,CAAC,CAAC,GAAGA,CAAC,GAAG,CAACA,CAAC,CAAC;MAEzCiB,MAAM,CAACG,OAAO,CAAC,UAACC,EAAE;QAAA,OAAKL,MAAI,CAACvE,SAAS,CAACgE,MAAM,CAACY,EAAE,EAAE;UAAElB,KAAK,EAAE;QAAK,CAAC,CAAC;MAAA,EAAC;MAClE,IAAI,CAAC1D,SAAS,CAAC0D,KAAK,CAAC,CAAC;MAEtB,OAAO,IAAI,CAACzD,KAAK,CAAC,CAAC;IACrB;EAAC;IAAAK,GAAA;IAAAQ,KAAA,EAaD,SAAA+D,MAAMA,CAAA,EAAG;MACP,IAAAC,YAAA,GAAgD,IAAI,CAACnF,KAAK;QAAlDoF,SAAS,GAAAD,YAAA,CAATC,SAAS;QAAEC,OAAO,GAAAF,YAAA,CAAPE,OAAO;QAAEC,MAAM,GAAAH,YAAA,CAANG,MAAM;QAAEC,OAAO,GAAAJ,YAAA,CAAPI,OAAO;MAE3C,oBACEvH,MAAA,YAAAwH,aAAA,CAAC/F,MAAM;QACL2F,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,CAAC7E;MAAU,CACrB,CAAC;IAEN;EAAC;AAAA,EAzQwBC,iBAAK,CAAC6E,SAAS;AAAA,IAAAxF,gBAAA,aAA7BN,KAAK,eACG;EACjBuF,SAAS,EAAEQ,qBAAS,CAACC,MAAM;EAC3BvF,KAAK,EAAEsF,qBAAS,CAACC,MAAM;EACvBzF,QAAQ,EAAEwF,qBAAS,CAACE,IAAI;EACxBP,OAAO,EAAEK,qBAAS,CAACE,IAAI;EACvBT,OAAO,EAAEO,qBAAS,CAACE,IAAI;EACvBR,MAAM,EAAEM,qBAAS,CAACE,IAAI;EACtBtD,QAAQ,EAAEoD,qBAAS,CAACG,IAAI;EACxB/C,QAAQ,EAAE4C,qBAAS,CAACE;AACtB,CAAC;AAAA,IAAAE,QAAA,GAAAlG,OAAA,cAkQYD,KAAK","ignoreList":[]}
package/lib/mf/static.js CHANGED
@@ -241,6 +241,10 @@ var Static = exports["default"] = /*#__PURE__*/function (_React$Component) {
241
241
  // defaults to an empty string.
242
242
  this.mathField.mathModeSpace = _mathliveInstance.MATH_MODE_SPACE;
243
243
  this.mathField.value = (0, _latexBridge.toMathLive)(this.props.latex);
244
+
245
+ // The mathfield renders in shadow DOM, so page CSS cannot reach it - the
246
+ // stretchy-accent fix has to be injected there directly.
247
+ (0, _mathliveInstance.applyShadowStyles)(this.mathField);
244
248
  this.mathField.addEventListener('input', this.onPromptInput);
245
249
  this.mathField.addEventListener('focusin', this.onPromptFocus);
246
250
  this.mathField.addEventListener('keydown', this.onKeyDown);
@@ -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","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","addEventListener","onPromptInput","onPromptFocus","onKeyDown","replaceChildren","createLiveRegion","stop","componentDidMount","componentDidUpdate","prevProps","componentWillUnmount","removeEventListener","remove","removeLiveRegion","fieldIds","indexOf","latexToMarkup","setState","_this2","out","fromMathLive","getPromptValue","_this3","setPromptValue","get","_this4","map","focus","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 { loadMathLive, getMacros, latexToMarkup, MATH_MODE_SPACE } from '../mathlive-instance';\nimport { toMathLive, fromMathLive, fieldIds } from '../latex-bridge';\nimport { placeholderStyles } 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 '& 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 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.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 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 focus() {\n this.mathField && this.mathField.focus();\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","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","addEventListener","onPromptInput","onPromptFocus","onKeyDown","replaceChildren","createLiveRegion","stop","componentDidMount","componentDidUpdate","prevProps","componentWillUnmount","removeEventListener","remove","removeLiveRegion","fieldIds","indexOf","latexToMarkup","setState","_this2","out","fromMathLive","getPromptValue","_this3","setPromptValue","get","_this4","map","focus","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 { loadMathLive, getMacros, latexToMarkup, MATH_MODE_SPACE, applyShadowStyles } from '../mathlive-instance';\nimport { toMathLive, fromMathLive, fieldIds } from '../latex-bridge';\nimport { placeholderStyles } 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 '& 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 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.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 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 focus() {\n this.mathField && this.mathField.focus();\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":[]}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.0.9",
6
+ "version": "1.0.10",
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",
@@ -11,7 +11,9 @@ describe('keypad label display normalisation', () => {
11
11
  const out = latexForDisplay('\\frac{}{}');
12
12
 
13
13
  expect(out).not.toEqual('\\frac{}{}');
14
- expect(out).toContain('25AB'); // white small square
14
+ // a \rule, not a glyph: font metrics for a substituted glyph do not match
15
+ // MathLive's, which left stretchy accents narrower than the box
16
+ expect(out).toContain('\\rule');
15
17
  expect(out).toContain('pie-empty');
16
18
  });
17
19
 
@@ -28,6 +30,79 @@ describe('keypad label display normalisation', () => {
28
30
  expect(latexForDisplay('\\frac{x}{ }')).toContain('pie-empty');
29
31
  });
30
32
 
33
+ // MathQuill needed a nested \overline{} to draw the empty box. MathLive
34
+ // renders that as a real line, so those labels showed a spurious bar (a line
35
+ // under the arrows, and a straight line instead of the arc).
36
+ it('accent keys do not carry the nested-overline box hack', () => {
37
+ // eslint-disable-next-line global-require
38
+ const geometry = require('../keys/geometry');
39
+
40
+ Object.values(geometry).forEach((key) => {
41
+ if (key && typeof key.latex === 'string') {
42
+ expect(key.latex).not.toContain('\\overline{}}');
43
+ }
44
+ });
45
+ });
46
+
47
+ it('an accent over an empty slot still gets a visible box', () => {
48
+ ['\\overleftrightarrow{}', '\\overarc{}'].forEach((latex) => {
49
+ const out = latexForDisplay(latex);
50
+
51
+ expect(out).toContain('pie-empty');
52
+ expect(out).not.toContain('\\overline');
53
+ });
54
+ });
55
+
56
+ // A glyph's width comes from font metrics; U+25AB is not in the KaTeX fonts,
57
+ // so the browser substituted a wider one and stretchy accents came out
58
+ // narrower than the box. A rule has an explicit width.
59
+ it('the empty slot has an explicit width, not font-dependent metrics', () => {
60
+ const out = latexForDisplay('\\overarc{}');
61
+
62
+ expect(out).toContain('\\rule');
63
+ expect(out).toMatch(/rule\{[\d.]+em\}\{[\d.]+em\}/);
64
+ expect(out).not.toContain('unicode');
65
+ });
66
+
67
+ // Measured in the browser: the accent's immediate wrapper computes to 0px
68
+ // (its .ML__stretchy child is absolutely positioned), so the svg width has to
69
+ // resolve against .ML__base - whose width equals the content. Without pinning
70
+ // that, the arc collapsed to a spike and sat right of the box.
71
+ it('pins the accent containing block and drops the centering shift', () => {
72
+ // eslint-disable-next-line global-require
73
+ const { placeholderStyles } = require('../mf/common-styles');
74
+
75
+ expect(placeholderStyles['& .ML__base'].position).toEqual('relative');
76
+ expect(placeholderStyles['& .ML__stretchy']).toEqual({ position: 'absolute', left: 0, width: '100%' });
77
+ // must be !important: MathLive writes margin-left as an inline style, and a
78
+ // class cannot override that. Leaving it un-important also halved the arc's
79
+ // width, because .ML__center is the stretchy's containing block.
80
+ expect(placeholderStyles['& .ML__center:has(.ML__stretchy)'].marginLeft).toEqual('0 !important');
81
+ });
82
+
83
+ it('applies those rules wherever static math renders', () => {
84
+ // eslint-disable-next-line global-require
85
+ const cs = require('../mf/common-styles');
86
+
87
+ ['commonKeyboardStyles', 'commonMathLiveStyles'].forEach((name) => {
88
+ expect(cs[name]['& .ML__stretchy']).toBeDefined();
89
+ expect(cs[name]['& .ML__base']).toBeDefined();
90
+ });
91
+ });
92
+
93
+ // A bare `& svg` rule re-parents every svg in the subtree; MathLive's own rule
94
+ // is descendant-scoped to .ML__latex .ML__stretchy svg.
95
+ it('does not use a blanket svg rule', () => {
96
+ // eslint-disable-next-line global-require
97
+ const cs = require('../mf/common-styles');
98
+
99
+ Object.values(cs).forEach((style) => {
100
+ if (style && typeof style === 'object') {
101
+ expect(Object.keys(style)).not.toContain('& svg');
102
+ }
103
+ });
104
+ });
105
+
31
106
  it('leaves latex without empty groups alone', () => {
32
107
  ['\\pi', '\\sin', 'x^2', '\\overline{AB}'].forEach((latex) => {
33
108
  expect(latexForDisplay(latex)).toEqual(latex);
@@ -190,6 +190,27 @@ describe('latex-bridge', () => {
190
190
  expect(keyToAction({ command: '^' })).toEqual({ type: 'insert', value: '^{#?}' });
191
191
  });
192
192
 
193
+ // MathQuill's `/` turned the preceding expression into the numerator: type
194
+ // 5, press the key, get 5/_ with the caret in the denominator. `#@` is
195
+ // MathLive's "selection, or the item before the cursor" token, and is what
196
+ // MathLive binds to `/` itself.
197
+ it('division takes the preceding item as the numerator', () => {
198
+ expect(keyToAction({ command: '/' })).toEqual({ type: 'insert', value: '\\frac{#@}{#?}' });
199
+ });
200
+
201
+ it('an explicit blank-over-blank fraction stays empty', () => {
202
+ // distinct from `/`: this key is meant to insert two empty slots
203
+ expect(keyToAction({ command: '\\frac' })).toEqual({ type: 'insert', value: '\\frac{#?}{#?}' });
204
+ });
205
+
206
+ it('the x-over-blank key routes through division', () => {
207
+ // eslint-disable-next-line global-require
208
+ const { xOverBlank } = require('../keys/fractions');
209
+
210
+ expect(xOverBlank.command).toEqual('/');
211
+ expect(keyToAction(xOverBlank).value).toEqual('\\frac{#@}{#?}');
212
+ });
213
+
193
214
  it('passes argument-less commands through', () => {
194
215
  expect(keyToAction({ command: '\\pi' })).toEqual({ type: 'insert', value: '\\pi' });
195
216
  });
@@ -209,6 +209,53 @@ describe('mathlive-instance', () => {
209
209
  });
210
210
  });
211
211
 
212
+ // A live <math-field> renders in shadow DOM, so nothing in the page's
213
+ // stylesheets reaches it - the stretchy-accent fix has to be injected there.
214
+ describe('applyShadowStyles', () => {
215
+ const host = () => {
216
+ const el = document.createElement('div');
217
+
218
+ el.attachShadow({ mode: 'open' });
219
+
220
+ return el;
221
+ };
222
+
223
+ it('is a no-op without a shadow root', () => {
224
+ expect(() => instance.applyShadowStyles(undefined)).not.toThrow();
225
+ expect(() => instance.applyShadowStyles(document.createElement('div'))).not.toThrow();
226
+ });
227
+
228
+ it('injects the accent fix into the shadow root', () => {
229
+ const el = host();
230
+
231
+ instance.applyShadowStyles(el);
232
+
233
+ const viaSheet = el.shadowRoot.__pieAccentSheet;
234
+ const viaStyle = el.shadowRoot.querySelector('style[data-pie-accent]');
235
+ const css = viaSheet ? 'adopted' : (viaStyle && viaStyle.textContent) || '';
236
+
237
+ expect(viaSheet || viaStyle).toBeTruthy();
238
+
239
+ if (viaStyle) {
240
+ expect(css).toContain('margin-left:0 !important');
241
+ // scoped so single-glyph accents keep their centring offset
242
+ expect(css).toContain(':has(.ML__stretchy)');
243
+ }
244
+ });
245
+
246
+ it('does not inject twice', () => {
247
+ const el = host();
248
+
249
+ instance.applyShadowStyles(el);
250
+ instance.applyShadowStyles(el);
251
+
252
+ const styles = el.shadowRoot.querySelectorAll('style[data-pie-accent]');
253
+
254
+ // either one adopted sheet, or exactly one style node
255
+ expect(el.shadowRoot.__pieAccentSheet ? 1 : styles.length).toBe(1);
256
+ });
257
+ });
258
+
212
259
  describe('latexToMarkup', () => {
213
260
  it('returns empty string when MathLive is not loaded', () => {
214
261
  expect(instance.latexToMarkup('\\pi')).toEqual('');
@@ -33,6 +33,7 @@ jest.mock('../mathlive-instance', () => {
33
33
  getMacros: () => ({}),
34
34
  // must mirror the real export, otherwise the component sets `undefined`
35
35
  MATH_MODE_SPACE: '\\ ',
36
+ applyShadowStyles: () => {},
36
37
  latexToMarkup: (l) => `<span>${l}</span>`,
37
38
  };
38
39
  });
@@ -29,22 +29,20 @@ const LabelHolder = styled('span')(() => ({
29
29
  pointerEvents: 'none',
30
30
  textTransform: 'none',
31
31
  color: color.text(),
32
- display: 'inline-flex',
33
- alignItems: 'center',
34
- justifyContent: 'center',
32
+ // Deliberately inline-block, NOT inline-flex: MathLive's markup relies on
33
+ // normal inline flow. Making its spans flex items collapses their width, and
34
+ // stretchy accents render an <svg width="100%" preserveAspectRatio="none">
35
+ // that then squeezes into a spike instead of spanning the content.
36
+ display: 'inline-block',
37
+ textAlign: 'center',
35
38
  lineHeight: 1,
36
- // Never let a label size its grid column. Stretchy accents
37
- // (\overrightarrow, \overleftrightarrow, \overarc) render an <svg> that
38
- // mathlive-static.css positions absolutely at width:100%; if that stylesheet
39
- // is missing the svg lays out statically and expands without bound, dragging
40
- // the whole column across the screen. `overflow: hidden` also collapses the
41
- // label's min-content contribution, so the grid can't blow out either way.
39
+ // Keep a label from sizing its grid column. `overflow: hidden` also collapses
40
+ // the label's min-content contribution, so a wide accent cannot drag the
41
+ // column across the screen. The svg's own positioning is left to
42
+ // mathlive-static.css (injected by the package) - duplicating it here broke
43
+ // the accent's containing block.
42
44
  maxWidth: '100%',
43
45
  overflow: 'hidden',
44
- '& svg': {
45
- position: 'absolute',
46
- width: '100%',
47
- },
48
46
  // Answer-block / empty-slot boxes inside a label.
49
47
  '& .ML__placeholder': {
50
48
  backgroundColor: color.keypadEmptyPlaceholder ? color.keypadEmptyPlaceholder() : undefined,
@@ -14,7 +14,10 @@ export const overRightArrow = set({
14
14
 
15
15
  export const overLeftRightArrow = set({
16
16
  name: 'Segment',
17
- latex: '\\overleftrightarrow{\\overline{}}', // used this notation to display the pink box
17
+ // MathQuill needed a nested \overline{} to draw the empty box; MathLive
18
+ // renders that as a real line, so the label showed a spurious bar under the
19
+ // arrows. `withVisibleEmptySlots` supplies the box for `{}` instead.
20
+ latex: '\\overleftrightarrow{}',
18
21
  symbol: 'AB',
19
22
  command: '\\overleftrightarrow',
20
23
  });
@@ -51,7 +54,9 @@ export const angle = set({
51
54
  });
52
55
  export const overArc = set({
53
56
  name: 'Over arc',
54
- latex: '\\overarc{\\overline{}}', // used this notation to display the pink box
57
+ // See the note on Segment above: the nested \overline{} drew a straight line
58
+ // instead of leaving the arc visible.
59
+ latex: '\\overarc{}',
55
60
  command: '\\overarc',
56
61
  });
57
62
  export const measureOfAngle = set({