@pie-lib/math-input-mathlive 1.0.12 → 1.0.13

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":"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","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 } 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 // 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","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 } 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 '& 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":[]}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.0.12",
6
+ "version": "1.0.13",
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",
@@ -88,6 +88,79 @@ describe('keypad label display normalisation', () => {
88
88
  expect(placeholderStyles['& .ML__center:has(.ML__stretchy)'].marginLeft).toEqual('0 !important');
89
89
  });
90
90
 
91
+ // MathLive sets the index of \sqrt[n]{x} in scriptscriptstyle - an inline
92
+ // `font-size: 50%` - which is too small to read on the nth-root key and in
93
+ // authored radicals. It is scaled up to 80%.
94
+ describe('radical index size', () => {
95
+ // Real MathLive 0.110 output for `\sqrt[1]{2}`, trimmed to the index. The
96
+ // selector walks this exact chain, so this fixture is what pins it down.
97
+ const INDEX_MARKUP = `
98
+ <span class="ML__base">
99
+ <span class="ML__sqrt-index">
100
+ <span class="ML__vlist-t"><span class="ML__vlist-r"><span class="ML__vlist" style="height:0.78em">
101
+ <span style="top:-3.45em">
102
+ <span class="ML__pstrut" style="height:3em"></span>
103
+ <span id="index-size" style="height:0.33em;display:inline-block;font-size: 50%">
104
+ <span class="ML__cmr">1</span>
105
+ <span id="nested-size" style="font-size: 50%">nested</span>
106
+ </span>
107
+ </span>
108
+ </span></span></span>
109
+ </span>
110
+ <span class="ML__sqrt-sign"><span class="ML__delim-size1">&#8730;</span></span>
111
+ </span>`;
112
+
113
+ const rule = () => {
114
+ // eslint-disable-next-line global-require
115
+ const { rootIndexStyles } = require('../mf/common-styles');
116
+ const selectors = Object.keys(rootIndexStyles);
117
+
118
+ expect(selectors).toHaveLength(1);
119
+
120
+ return { selector: selectors[0], value: rootIndexStyles[selectors[0]].fontSize };
121
+ };
122
+
123
+ it("scales the index glyph to 80%, up from MathLive's 50%", () => {
124
+ // !important: the 50% is an inline style, which a class cannot override.
125
+ expect(rule().value).toEqual('80% !important');
126
+ });
127
+
128
+ it('targets the span MathLive puts the inline font-size on', () => {
129
+ const holder = document.createElement('div');
130
+
131
+ holder.innerHTML = INDEX_MARKUP;
132
+
133
+ const matched = holder.querySelectorAll(rule().selector.replace(/^&\s*/, ''));
134
+
135
+ expect(Array.from(matched).map((el) => el.id)).toEqual(['index-size']);
136
+ });
137
+
138
+ it('leaves the radical index box itself unscaled', () => {
139
+ // Scaling `.ML__sqrt-index` would scale the em-based top/height offsets
140
+ // that tuck the index into the radical, lifting it clear of the crook.
141
+ const { selector } = rule();
142
+
143
+ expect(selector).not.toMatch(/\.ML__sqrt-index\s*\{?$/);
144
+ expect(selector.startsWith('& .ML__sqrt-index >')).toBe(true);
145
+ });
146
+
147
+ it('applies wherever math renders - keypad labels, static math, mathfield', () => {
148
+ // eslint-disable-next-line global-require
149
+ const cs = require('../mf/common-styles');
150
+ const { selector } = rule();
151
+
152
+ ['commonKeyboardStyles', 'commonMathLiveStyles', 'supsubStyles'].forEach((name) => {
153
+ expect(cs[name][selector]).toBeDefined();
154
+ });
155
+
156
+ // The live mathfield renders in a shadow root, which host styles cannot
157
+ // reach, so the same rule ships as plain CSS for `applyShadowStyles`.
158
+ expect(cs.ROOT_INDEX_CSS).toContain('.ML__sqrt-index >');
159
+ // Derived, so the size lives in one place: the two copies cannot drift.
160
+ expect(cs.ROOT_INDEX_CSS).toContain(`font-size:${rule().value}`);
161
+ });
162
+ });
163
+
91
164
  it('applies those rules wherever static math renders', () => {
92
165
  // eslint-disable-next-line global-require
93
166
  const cs = require('../mf/common-styles');
@@ -371,6 +371,28 @@ describe('mathlive-instance', () => {
371
371
  }
372
372
  });
373
373
 
374
+ it('injects the radical index size fix', () => {
375
+ const el = host();
376
+
377
+ instance.applyShadowStyles(el);
378
+
379
+ const viaStyle = el.shadowRoot.querySelector('style[data-pie-accent]');
380
+
381
+ if (viaStyle) {
382
+ const css = viaStyle.textContent;
383
+
384
+ // MathLive's scriptscriptstyle index (an inline 50%) reads too small in
385
+ // the authoring UI; a mathfield's shadow root needs its own copy of the
386
+ // rule, since host styles do not cross the boundary. Compared against
387
+ // the exported rule, so the size stays defined in one place.
388
+ // eslint-disable-next-line global-require
389
+ const { ROOT_INDEX_CSS } = require('../mf/common-styles');
390
+
391
+ expect(ROOT_INDEX_CSS).toContain('.ML__sqrt-index >');
392
+ expect(css).toContain(ROOT_INDEX_CSS);
393
+ }
394
+ });
395
+
374
396
  it('does not inject twice', () => {
375
397
  const el = host();
376
398
 
@@ -9,7 +9,7 @@ import { color } from '@pie-lib/render-ui';
9
9
 
10
10
  import { baseSet } from '../keys';
11
11
  import { sortKeys } from './keys-layout';
12
- import { commonKeyboardStyles } from '../mf/common-styles';
12
+ import { commonKeyboardStyles, rootIndexStyles } from '../mf/common-styles';
13
13
  import { loadMathLive, latexToMarkup } from '../mathlive-instance';
14
14
 
15
15
  const log = debug('pie-lib:math-input-mathlive:keypad');
@@ -53,6 +53,9 @@ const LabelHolder = styled('span')(() => ({
53
53
  '& [data-pie-empty]': {
54
54
  opacity: 0.5,
55
55
  },
56
+ // A readable index on the nth-root key. Carried by the label itself, not only
57
+ // by the keypad container, so it holds wherever a LatexLabel is mounted.
58
+ ...rootIndexStyles,
56
59
  }));
57
60
 
58
61
  export class LatexLabel extends React.Component {
@@ -1,5 +1,6 @@
1
1
  import debug from 'debug';
2
2
  import { NEWLINE_EMBED, toMathLive, withVisibleEmptySlots } from './latex-bridge';
3
+ import { ROOT_INDEX_CSS } from './mf/common-styles';
3
4
 
4
5
  const log = debug('pie-lib:math-input-mathlive:instance');
5
6
 
@@ -231,7 +232,11 @@ const PLACEHOLDER_CARET_CSS = [
231
232
  'animation:ML__caret-blink 1.05s step-end forwards infinite}',
232
233
  ].join('');
233
234
 
234
- const SHADOW_CSS = '.ML__latex .ML__center:has(.ML__stretchy){margin-left:0 !important}' + PLACEHOLDER_CARET_CSS;
235
+ // A live mathfield needs the readable radical index too: `rootIndexStyles` is
236
+ // written for static markup in the host page, which cannot cross the shadow
237
+ // boundary.
238
+ const SHADOW_CSS =
239
+ '.ML__latex .ML__center:has(.ML__stretchy){margin-left:0 !important}' + ROOT_INDEX_CSS + PLACEHOLDER_CARET_CSS;
235
240
 
236
241
  /**
237
242
  * Keep {@link PLACEHOLDER_CARET_CLASS} in step with the selection.
@@ -13,7 +13,9 @@
13
13
  * Most are intentionally near-empty: MathLive sizes scripts, radicals and
14
14
  * fences correctly on its own, so the MathQuill-era corrections are not needed.
15
15
  * They stay as documented extension points rather than being deleted, so the
16
- * destructuring above keeps working.
16
+ * destructuring above keeps working. The exception is the radical index, which
17
+ * MathLive sizes to TeX metrics that read too small here - see
18
+ * `rootIndexStyles`.
17
19
  */
18
20
 
19
21
  /**
@@ -40,10 +42,47 @@ export const longdivStyles = {
40
42
  };
41
43
 
42
44
  /**
43
- * Superscript/subscript sizing. MathLive follows TeX metrics, so no overrides
44
- * are required.
45
+ * How the index of a radical is sized.
46
+ *
47
+ * MathLive follows TeX and sets the index of `\sqrt[n]{x}` in scriptscriptstyle,
48
+ * which it emits as an inline `font-size: 50%` on the span wrapping the index's
49
+ * glyphs. At authoring sizes that leaves the index - on the nth-root key, and in
50
+ * any radical the author types - too small to read next to the radicand, so it is
51
+ * scaled up to 80% - 1.6x what MathLive asks for.
52
+ *
53
+ * Only that innermost span is resized. `.ML__sqrt-index` itself keeps its font
54
+ * size on purpose: the vlist inside it tucks the index into the radical's crook
55
+ * with em-based `top`/`height` offsets, and scaling those lifts the index clear
56
+ * of the radical instead of just enlarging it.
57
+ *
58
+ * The child chain is spelled out so that nothing nested deeper inside the index
59
+ * (a fraction's numerator, another radical) is caught by the same rule, and
60
+ * `!important` is required because the 50% is an INLINE style.
45
61
  */
46
- export const supsubStyles = {};
62
+ const ROOT_INDEX_SELECTOR = '.ML__sqrt-index > .ML__vlist-t > .ML__vlist-r > .ML__vlist > span > [style*="font-size"]';
63
+ const ROOT_INDEX_FONT_SIZE = '80%';
64
+
65
+ export const rootIndexStyles = {
66
+ [`& ${ROOT_INDEX_SELECTOR}`]: {
67
+ fontSize: `${ROOT_INDEX_FONT_SIZE} !important`,
68
+ },
69
+ };
70
+
71
+ /**
72
+ * The same rule as a CSS string, for a live mathfield's shadow root - see
73
+ * `SHADOW_CSS` in mathlive-instance.js. Static markup is styled by
74
+ * {@link rootIndexStyles}.
75
+ */
76
+ export const ROOT_INDEX_CSS = `${ROOT_INDEX_SELECTOR}{font-size:${ROOT_INDEX_FONT_SIZE} !important}`;
77
+
78
+ /**
79
+ * Superscript/subscript sizing. MathLive follows TeX metrics for scripts, so the
80
+ * MathQuill-era corrections are gone; the radical index is the one place where a
81
+ * TeX-correct size reads too small in the authoring UI.
82
+ */
83
+ export const supsubStyles = {
84
+ ...rootIndexStyles,
85
+ };
47
86
 
48
87
  /** Empty placeholder boxes (answer blocks / open slots). */
49
88
  export const placeholderStyles = {
@@ -102,6 +141,7 @@ export const placeholderStyles = {
102
141
  export const commonMqKeyboardStyles = {
103
142
  ...commonMqFontStyles,
104
143
  ...longdivStyles,
144
+ ...rootIndexStyles,
105
145
  ...placeholderStyles,
106
146
  touchAction: 'manipulation',
107
147
  '& math-field': {
@@ -143,6 +183,7 @@ export const commonKeyboardStyles = commonMqKeyboardStyles;
143
183
  export default {
144
184
  commonMqFontStyles,
145
185
  longdivStyles,
186
+ rootIndexStyles,
146
187
  supsubStyles,
147
188
  commonMqKeyboardStyles,
148
189
  placeholderStyles,
package/src/mf/index.js CHANGED
@@ -6,6 +6,7 @@ import CommonMqStyles, {
6
6
  commonMqFontStyles,
7
7
  commonMqKeyboardStyles,
8
8
  longdivStyles,
9
+ rootIndexStyles,
9
10
  supsubStyles,
10
11
  placeholderStyles,
11
12
  } from './common-styles';
@@ -21,6 +22,7 @@ export {
21
22
  commonMqFontStyles,
22
23
  commonMqKeyboardStyles,
23
24
  longdivStyles,
25
+ rootIndexStyles,
24
26
  supsubStyles,
25
27
  placeholderStyles,
26
28
  };
package/src/mf/static.jsx CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  trackPlaceholderCaret,
12
12
  } from '../mathlive-instance';
13
13
  import { toMathLive, fromMathLive, fieldIds } from '../latex-bridge';
14
- import { placeholderStyles } from './common-styles';
14
+ import { placeholderStyles, rootIndexStyles } from './common-styles';
15
15
 
16
16
  const log = debug('pie-lib:math-input-mathlive:static');
17
17
 
@@ -19,6 +19,9 @@ const Holder = styled('span')({
19
19
  display: 'inline-block',
20
20
  // Shared static-math rules: muted empty-slot glyphs and svg containment.
21
21
  ...placeholderStyles,
22
+ // Readable radical index - display mode renders in the light DOM, so the
23
+ // shadow-root copy of this rule does not reach it.
24
+ ...rootIndexStyles,
22
25
  '& math-field': {
23
26
  display: 'inline-block',
24
27
  border: 'none',