@pie-lib/math-input-mathlive 1.0.9-next.6637 → 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.
Files changed (51) hide show
  1. package/README.md +14 -5
  2. package/lib/__tests__/composites.test.js +255 -0
  3. package/lib/__tests__/composites.test.js.map +1 -0
  4. package/lib/__tests__/drop-in-compat.test.js +133 -0
  5. package/lib/__tests__/drop-in-compat.test.js.map +1 -0
  6. package/lib/__tests__/index.test.js +118 -0
  7. package/lib/__tests__/index.test.js.map +1 -0
  8. package/lib/__tests__/input-imperative.test.js +155 -0
  9. package/lib/__tests__/input-imperative.test.js.map +1 -0
  10. package/lib/__tests__/keypad-label.test.js +118 -0
  11. package/lib/__tests__/keypad-label.test.js.map +1 -0
  12. package/lib/__tests__/keypad-render.test.js +206 -0
  13. package/lib/__tests__/keypad-render.test.js.map +1 -0
  14. package/lib/__tests__/latex-bridge.test.js +280 -0
  15. package/lib/__tests__/latex-bridge.test.js.map +1 -0
  16. package/lib/__tests__/mathlive-instance.test.js +279 -0
  17. package/lib/__tests__/mathlive-instance.test.js.map +1 -0
  18. package/lib/__tests__/mount-race.test.js +195 -0
  19. package/lib/__tests__/mount-race.test.js.map +1 -0
  20. package/lib/__tests__/static-prompts.test.js +282 -0
  21. package/lib/__tests__/static-prompts.test.js.map +1 -0
  22. package/lib/keypad/index.js +11 -13
  23. package/lib/keypad/index.js.map +1 -1
  24. package/lib/keys/geometry.js +7 -4
  25. package/lib/keys/geometry.js.map +1 -1
  26. package/lib/latex-bridge.js +18 -3
  27. package/lib/latex-bridge.js.map +1 -1
  28. package/lib/mathlive-instance.js +103 -11
  29. package/lib/mathlive-instance.js.map +1 -1
  30. package/lib/mf/common-styles.js +33 -4
  31. package/lib/mf/common-styles.js.map +1 -1
  32. package/lib/mf/input.js +22 -5
  33. package/lib/mf/input.js.map +1 -1
  34. package/lib/mf/static.js +21 -4
  35. package/lib/mf/static.js.map +1 -1
  36. package/package.json +3 -4
  37. package/src/__tests__/composites.test.jsx +220 -0
  38. package/src/__tests__/keypad-label.test.jsx +81 -14
  39. package/src/__tests__/keypad-render.test.jsx +123 -0
  40. package/src/__tests__/latex-bridge.test.js +21 -0
  41. package/src/__tests__/mathlive-instance.test.js +87 -0
  42. package/src/__tests__/mount-race.test.jsx +130 -0
  43. package/src/__tests__/static-prompts.test.jsx +251 -0
  44. package/src/keypad/index.jsx +11 -13
  45. package/src/keys/geometry.js +7 -2
  46. package/src/latex-bridge.js +18 -3
  47. package/src/mathlive-instance.js +111 -11
  48. package/src/mf/common-styles.js +33 -4
  49. package/src/mf/input.jsx +23 -5
  50. package/src/mf/static.jsx +24 -4
  51. package/LICENSE.md +0 -5
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _latexBridge = require("../latex-bridge");
5
+ var _input = _interopRequireDefault(require("../mf/input"));
6
+ /**
7
+ * The imperative surface that @pie-lib/math-toolbar drives
8
+ * (editor-and-pad.jsx: clear/command/keystroke/write/latex).
9
+ *
10
+ * These call the methods against a stub mathfield, because a real
11
+ * <math-field> needs a browser. What matters here is the *translation*:
12
+ * MathQuill-era arguments must become valid MathLive operations.
13
+ */
14
+ var stubField = function stubField() {
15
+ var calls = {
16
+ insert: [],
17
+ executeCommand: [],
18
+ focus: 0
19
+ };
20
+ return {
21
+ calls: calls,
22
+ value: '',
23
+ getValue: function getValue() {
24
+ return '';
25
+ },
26
+ insert: function insert(v) {
27
+ calls.insert.push(v);
28
+ },
29
+ executeCommand: function executeCommand(v) {
30
+ calls.executeCommand.push(v);
31
+ },
32
+ focus: function focus() {
33
+ calls.focus++;
34
+ },
35
+ blur: function blur() {}
36
+ };
37
+ };
38
+ var withField = function withField() {
39
+ var input = new _input["default"]({});
40
+ var f = stubField();
41
+ input.mathField = f;
42
+ return {
43
+ input: input,
44
+ f: f
45
+ };
46
+ };
47
+ describe('Input imperative API (drives math-toolbar)', function () {
48
+ describe('keystroke', function () {
49
+ it('maps MathQuill keystroke names to MathLive selectors', function () {
50
+ var _withField = withField(),
51
+ input = _withField.input,
52
+ f = _withField.f;
53
+ input.keystroke('Left');
54
+ input.keystroke('Right');
55
+ input.keystroke('Backspace');
56
+ expect(f.calls.executeCommand).toEqual(['moveToPreviousChar', 'moveToNextChar', 'deleteBackward']);
57
+ });
58
+ it('passes an unknown value through as a selector', function () {
59
+ var _withField2 = withField(),
60
+ input = _withField2.input,
61
+ f = _withField2.f;
62
+ input.keystroke('deleteForward');
63
+ expect(f.calls.executeCommand).toEqual(['deleteForward']);
64
+ });
65
+ it('does not throw when the engine rejects the selector', function () {
66
+ var _withField3 = withField(),
67
+ input = _withField3.input;
68
+ input.mathField.executeCommand = function () {
69
+ throw new Error('unknown command');
70
+ };
71
+ expect(function () {
72
+ return input.keystroke('Nonsense');
73
+ }).not.toThrow();
74
+ });
75
+ it('covers every keystroke the keypad emits', function () {
76
+ // navigation.js / edit.js only produce these three
77
+ ['Left', 'Right', 'Backspace'].forEach(function (k) {
78
+ return expect(_latexBridge.KEYSTROKES[k]).toBeDefined();
79
+ });
80
+ });
81
+ });
82
+ describe('command', function () {
83
+ it('expands argument-taking commands into placeholders', function () {
84
+ var _withField4 = withField(),
85
+ input = _withField4.input,
86
+ f = _withField4.f;
87
+ input.command('\\frac');
88
+
89
+ // a bare \frac would give no editable slots
90
+ expect(f.calls.insert).toEqual(['\\frac{#?}{#?}']);
91
+ });
92
+ it('handles array commands', function () {
93
+ var _withField5 = withField(),
94
+ input = _withField5.input,
95
+ f = _withField5.f;
96
+ input.command(['\\log', '_']);
97
+ expect(f.calls.insert).toEqual(['\\log_{#?}']);
98
+ });
99
+ it('passes argument-less commands through', function () {
100
+ var _withField6 = withField(),
101
+ input = _withField6.input,
102
+ f = _withField6.f;
103
+ input.command('\\pi');
104
+ expect(f.calls.insert).toEqual(['\\pi']);
105
+ });
106
+ it('agrees with keyToAction', function () {
107
+ expect((0, _latexBridge.keyToAction)({
108
+ command: '\\sqrt'
109
+ }).value).toEqual('\\sqrt{#?}');
110
+ });
111
+ });
112
+ describe('safety before MathLive loads', function () {
113
+ it('every method is a no-op rather than a crash', function () {
114
+ var input = new _input["default"]({});
115
+
116
+ // mathField is undefined until loadMathLive() resolves
117
+ expect(input.latex()).toEqual('');
118
+ expect(input.clear()).toEqual('');
119
+ expect(input.command('\\frac')).toEqual('');
120
+ expect(input.keystroke('Left')).toEqual('');
121
+ expect(input.write('x')).toEqual('');
122
+ expect(function () {
123
+ return input.focus();
124
+ }).not.toThrow();
125
+ expect(function () {
126
+ return input.blur();
127
+ }).not.toThrow();
128
+ expect(function () {
129
+ return input.setLatex('x');
130
+ }).not.toThrow();
131
+ expect(input.element).toBeUndefined();
132
+ });
133
+ });
134
+ describe('mqCompat facade', function () {
135
+ // math-toolbar used to call this.input.mathField.latex(); external
136
+ // consumers may still do the same.
137
+ it('exposes latex() as a getter', function () {
138
+ var _withField7 = withField(),
139
+ input = _withField7.input;
140
+ input.mathField.getValue = function () {
141
+ return '\\frac{1}{2}';
142
+ };
143
+ expect(input.mqCompat.latex()).toEqual('\\frac{1}{2}');
144
+ });
145
+ it('exposes latex(v) as a setter and el()', function () {
146
+ var _withField8 = withField(),
147
+ input = _withField8.input,
148
+ f = _withField8.f;
149
+ input.mqCompat.latex('x+1');
150
+ expect(f.value).toEqual('x+1');
151
+ expect(input.mqCompat.el()).toBe(f);
152
+ });
153
+ });
154
+ });
155
+ //# sourceMappingURL=input-imperative.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-imperative.test.js","names":["_latexBridge","require","_input","_interopRequireDefault","stubField","calls","insert","executeCommand","focus","value","getValue","v","push","blur","withField","input","Input","f","mathField","describe","it","_withField","keystroke","expect","toEqual","_withField2","_withField3","Error","not","toThrow","forEach","k","KEYSTROKES","toBeDefined","_withField4","command","_withField5","_withField6","keyToAction","latex","clear","write","setLatex","element","toBeUndefined","_withField7","mqCompat","_withField8","el","toBe"],"sources":["../../src/__tests__/input-imperative.test.jsx"],"sourcesContent":["import { KEYSTROKES, keyToAction } from '../latex-bridge';\nimport Input from '../mf/input';\n\n/**\n * The imperative surface that @pie-lib/math-toolbar drives\n * (editor-and-pad.jsx: clear/command/keystroke/write/latex).\n *\n * These call the methods against a stub mathfield, because a real\n * <math-field> needs a browser. What matters here is the *translation*:\n * MathQuill-era arguments must become valid MathLive operations.\n */\nconst stubField = () => {\n const calls = { insert: [], executeCommand: [], focus: 0 };\n\n return {\n calls,\n value: '',\n getValue: () => '',\n insert(v) {\n calls.insert.push(v);\n },\n executeCommand(v) {\n calls.executeCommand.push(v);\n },\n focus() {\n calls.focus++;\n },\n blur() {},\n };\n};\n\nconst withField = () => {\n const input = new Input({});\n const f = stubField();\n\n input.mathField = f;\n\n return { input, f };\n};\n\ndescribe('Input imperative API (drives math-toolbar)', () => {\n describe('keystroke', () => {\n it('maps MathQuill keystroke names to MathLive selectors', () => {\n const { input, f } = withField();\n\n input.keystroke('Left');\n input.keystroke('Right');\n input.keystroke('Backspace');\n\n expect(f.calls.executeCommand).toEqual(['moveToPreviousChar', 'moveToNextChar', 'deleteBackward']);\n });\n\n it('passes an unknown value through as a selector', () => {\n const { input, f } = withField();\n\n input.keystroke('deleteForward');\n\n expect(f.calls.executeCommand).toEqual(['deleteForward']);\n });\n\n it('does not throw when the engine rejects the selector', () => {\n const { input } = withField();\n\n input.mathField.executeCommand = () => {\n throw new Error('unknown command');\n };\n\n expect(() => input.keystroke('Nonsense')).not.toThrow();\n });\n\n it('covers every keystroke the keypad emits', () => {\n // navigation.js / edit.js only produce these three\n ['Left', 'Right', 'Backspace'].forEach((k) => expect(KEYSTROKES[k]).toBeDefined());\n });\n });\n\n describe('command', () => {\n it('expands argument-taking commands into placeholders', () => {\n const { input, f } = withField();\n\n input.command('\\\\frac');\n\n // a bare \\frac would give no editable slots\n expect(f.calls.insert).toEqual(['\\\\frac{#?}{#?}']);\n });\n\n it('handles array commands', () => {\n const { input, f } = withField();\n\n input.command(['\\\\log', '_']);\n\n expect(f.calls.insert).toEqual(['\\\\log_{#?}']);\n });\n\n it('passes argument-less commands through', () => {\n const { input, f } = withField();\n\n input.command('\\\\pi');\n\n expect(f.calls.insert).toEqual(['\\\\pi']);\n });\n\n it('agrees with keyToAction', () => {\n expect(keyToAction({ command: '\\\\sqrt' }).value).toEqual('\\\\sqrt{#?}');\n });\n });\n\n describe('safety before MathLive loads', () => {\n it('every method is a no-op rather than a crash', () => {\n const input = new Input({});\n\n // mathField is undefined until loadMathLive() resolves\n expect(input.latex()).toEqual('');\n expect(input.clear()).toEqual('');\n expect(input.command('\\\\frac')).toEqual('');\n expect(input.keystroke('Left')).toEqual('');\n expect(input.write('x')).toEqual('');\n expect(() => input.focus()).not.toThrow();\n expect(() => input.blur()).not.toThrow();\n expect(() => input.setLatex('x')).not.toThrow();\n expect(input.element).toBeUndefined();\n });\n });\n\n describe('mqCompat facade', () => {\n // math-toolbar used to call this.input.mathField.latex(); external\n // consumers may still do the same.\n it('exposes latex() as a getter', () => {\n const { input } = withField();\n\n input.mathField.getValue = () => '\\\\frac{1}{2}';\n\n expect(input.mqCompat.latex()).toEqual('\\\\frac{1}{2}');\n });\n\n it('exposes latex(v) as a setter and el()', () => {\n const { input, f } = withField();\n\n input.mqCompat.latex('x+1');\n expect(f.value).toEqual('x+1');\n expect(input.mqCompat.el()).toBe(f);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
5
+ var _latexBridge = require("../latex-bridge");
6
+ /**
7
+ * Keys use empty groups to show a command's shape (`\frac{}{}`, `x^{}`).
8
+ * MathLive renders `{}` as nothing, so labels need a visible stand-in - but the
9
+ * value that gets *inserted* must stay untouched.
10
+ */
11
+ describe('keypad label display normalisation', function () {
12
+ it('gives empty groups a visible glyph', function () {
13
+ var out = (0, _latexBridge.withVisibleEmptySlots)('\\frac{}{}');
14
+ expect(out).not.toEqual('\\frac{}{}');
15
+ // a \rule, not a glyph: font metrics for a substituted glyph do not match
16
+ // MathLive's, which left stretchy accents narrower than the box
17
+ expect(out).toContain('\\rule');
18
+ expect(out).toContain('pie-empty');
19
+ });
20
+ it('handles every empty-group key shape', function () {
21
+ ['\\frac{}{}', '\\overline{}', 'x^{}', 'x_{}', '\\sqrt{}', '\\sqrt[{}]{}', '\\abs{}', '\\log_{}', '\\longdiv{}'].forEach(function (latex) {
22
+ expect((0, _latexBridge.withVisibleEmptySlots)(latex)).not.toContain('{}');
23
+ });
24
+ });
25
+ it('treats a whitespace-only group as empty', function () {
26
+ // e.g. \frac{x}{ }
27
+ expect((0, _latexBridge.withVisibleEmptySlots)('\\frac{x}{ }')).toContain('pie-empty');
28
+ });
29
+
30
+ // MathQuill needed a nested \overline{} to draw the empty box. MathLive
31
+ // renders that as a real line, so those labels showed a spurious bar (a line
32
+ // under the arrows, and a straight line instead of the arc).
33
+ it('accent keys do not carry the nested-overline box hack', function () {
34
+ // eslint-disable-next-line global-require
35
+ var geometry = require('../keys/geometry');
36
+ Object.values(geometry).forEach(function (key) {
37
+ if (key && typeof key.latex === 'string') {
38
+ expect(key.latex).not.toContain('\\overline{}}');
39
+ }
40
+ });
41
+ });
42
+ it('an accent over an empty slot still gets a visible box', function () {
43
+ ['\\overleftrightarrow{}', '\\overarc{}'].forEach(function (latex) {
44
+ var out = (0, _latexBridge.withVisibleEmptySlots)(latex);
45
+ expect(out).toContain('pie-empty');
46
+ expect(out).not.toContain('\\overline');
47
+ });
48
+ });
49
+
50
+ // A glyph's width comes from font metrics; U+25AB is not in the KaTeX fonts,
51
+ // so the browser substituted a wider one and stretchy accents came out
52
+ // narrower than the box. A rule has an explicit width.
53
+ it('the empty slot has an explicit width, not font-dependent metrics', function () {
54
+ var out = (0, _latexBridge.withVisibleEmptySlots)('\\overarc{}');
55
+ expect(out).toContain('\\rule');
56
+ expect(out).toMatch(/rule\{[\d.]+em\}\{[\d.]+em\}/);
57
+ expect(out).not.toContain('unicode');
58
+ });
59
+
60
+ // Measured in the browser: the accent's immediate wrapper computes to 0px
61
+ // (its .ML__stretchy child is absolutely positioned), so the svg width has to
62
+ // resolve against .ML__base - whose width equals the content. Without pinning
63
+ // that, the arc collapsed to a spike and sat right of the box.
64
+ it('pins the accent containing block and drops the centering shift', function () {
65
+ // eslint-disable-next-line global-require
66
+ var _require = require('../mf/common-styles'),
67
+ placeholderStyles = _require.placeholderStyles;
68
+ expect(placeholderStyles['& .ML__base'].position).toEqual('relative');
69
+ expect(placeholderStyles['& .ML__stretchy']).toEqual({
70
+ position: 'absolute',
71
+ left: 0,
72
+ width: '100%'
73
+ });
74
+ // must be !important: MathLive writes margin-left as an inline style, and a
75
+ // class cannot override that. Leaving it un-important also halved the arc's
76
+ // width, because .ML__center is the stretchy's containing block.
77
+ expect(placeholderStyles['& .ML__center:has(.ML__stretchy)'].marginLeft).toEqual('0 !important');
78
+ });
79
+ it('applies those rules wherever static math renders', function () {
80
+ // eslint-disable-next-line global-require
81
+ var cs = require('../mf/common-styles');
82
+ ['commonKeyboardStyles', 'commonMathLiveStyles'].forEach(function (name) {
83
+ expect(cs[name]['& .ML__stretchy']).toBeDefined();
84
+ expect(cs[name]['& .ML__base']).toBeDefined();
85
+ });
86
+ });
87
+
88
+ // A bare `& svg` rule re-parents every svg in the subtree; MathLive's own rule
89
+ // is descendant-scoped to .ML__latex .ML__stretchy svg.
90
+ it('does not use a blanket svg rule', function () {
91
+ // eslint-disable-next-line global-require
92
+ var cs = require('../mf/common-styles');
93
+ Object.values(cs).forEach(function (style) {
94
+ if (style && (0, _typeof2["default"])(style) === 'object') {
95
+ expect(Object.keys(style)).not.toContain('& svg');
96
+ }
97
+ });
98
+ });
99
+ it('leaves latex without empty groups alone', function () {
100
+ ['\\pi', '\\sin', 'x^2', '\\overline{AB}'].forEach(function (latex) {
101
+ expect((0, _latexBridge.withVisibleEmptySlots)(latex)).toEqual(latex);
102
+ });
103
+ });
104
+ it('handles nullish input', function () {
105
+ expect((0, _latexBridge.withVisibleEmptySlots)(undefined)).toEqual('');
106
+ expect((0, _latexBridge.withVisibleEmptySlots)('')).toEqual('');
107
+ });
108
+ it('does NOT affect what gets inserted into the field', function () {
109
+ // the action must use the key's own latex, never the display form
110
+ var key = {
111
+ name: 'frac',
112
+ latex: '\\frac{}{}'
113
+ };
114
+ expect((0, _latexBridge.keyToAction)(key).value).toEqual('\\frac{}{}');
115
+ expect((0, _latexBridge.keyToAction)(key).value).not.toContain('pie-empty');
116
+ });
117
+ });
118
+ //# sourceMappingURL=keypad-label.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keypad-label.test.js","names":["_latexBridge","require","describe","it","out","latexForDisplay","expect","not","toEqual","toContain","forEach","latex","geometry","Object","values","key","toMatch","_require","placeholderStyles","position","left","width","marginLeft","cs","name","toBeDefined","style","_typeof2","keys","undefined","keyToAction","value"],"sources":["../../src/__tests__/keypad-label.test.jsx"],"sourcesContent":["import { withVisibleEmptySlots as latexForDisplay } from '../latex-bridge';\nimport { keyToAction } from '../latex-bridge';\n\n/**\n * Keys use empty groups to show a command's shape (`\\frac{}{}`, `x^{}`).\n * MathLive renders `{}` as nothing, so labels need a visible stand-in - but the\n * value that gets *inserted* must stay untouched.\n */\ndescribe('keypad label display normalisation', () => {\n it('gives empty groups a visible glyph', () => {\n const out = latexForDisplay('\\\\frac{}{}');\n\n expect(out).not.toEqual('\\\\frac{}{}');\n // a \\rule, not a glyph: font metrics for a substituted glyph do not match\n // MathLive's, which left stretchy accents narrower than the box\n expect(out).toContain('\\\\rule');\n expect(out).toContain('pie-empty');\n });\n\n it('handles every empty-group key shape', () => {\n ['\\\\frac{}{}', '\\\\overline{}', 'x^{}', 'x_{}', '\\\\sqrt{}', '\\\\sqrt[{}]{}', '\\\\abs{}', '\\\\log_{}', '\\\\longdiv{}'].forEach(\n (latex) => {\n expect(latexForDisplay(latex)).not.toContain('{}');\n },\n );\n });\n\n it('treats a whitespace-only group as empty', () => {\n // e.g. \\frac{x}{ }\n expect(latexForDisplay('\\\\frac{x}{ }')).toContain('pie-empty');\n });\n\n // MathQuill needed a nested \\overline{} to draw the empty box. MathLive\n // renders that as a real line, so those labels showed a spurious bar (a line\n // under the arrows, and a straight line instead of the arc).\n it('accent keys do not carry the nested-overline box hack', () => {\n // eslint-disable-next-line global-require\n const geometry = require('../keys/geometry');\n\n Object.values(geometry).forEach((key) => {\n if (key && typeof key.latex === 'string') {\n expect(key.latex).not.toContain('\\\\overline{}}');\n }\n });\n });\n\n it('an accent over an empty slot still gets a visible box', () => {\n ['\\\\overleftrightarrow{}', '\\\\overarc{}'].forEach((latex) => {\n const out = latexForDisplay(latex);\n\n expect(out).toContain('pie-empty');\n expect(out).not.toContain('\\\\overline');\n });\n });\n\n // A glyph's width comes from font metrics; U+25AB is not in the KaTeX fonts,\n // so the browser substituted a wider one and stretchy accents came out\n // narrower than the box. A rule has an explicit width.\n it('the empty slot has an explicit width, not font-dependent metrics', () => {\n const out = latexForDisplay('\\\\overarc{}');\n\n expect(out).toContain('\\\\rule');\n expect(out).toMatch(/rule\\{[\\d.]+em\\}\\{[\\d.]+em\\}/);\n expect(out).not.toContain('unicode');\n });\n\n // Measured in the browser: the accent's immediate wrapper computes to 0px\n // (its .ML__stretchy child is absolutely positioned), so the svg width has to\n // resolve against .ML__base - whose width equals the content. Without pinning\n // that, the arc collapsed to a spike and sat right of the box.\n it('pins the accent containing block and drops the centering shift', () => {\n // eslint-disable-next-line global-require\n const { placeholderStyles } = require('../mf/common-styles');\n\n expect(placeholderStyles['& .ML__base'].position).toEqual('relative');\n expect(placeholderStyles['& .ML__stretchy']).toEqual({ position: 'absolute', left: 0, width: '100%' });\n // must be !important: MathLive writes margin-left as an inline style, and a\n // class cannot override that. Leaving it un-important also halved the arc's\n // width, because .ML__center is the stretchy's containing block.\n expect(placeholderStyles['& .ML__center:has(.ML__stretchy)'].marginLeft).toEqual('0 !important');\n });\n\n it('applies those rules wherever static math renders', () => {\n // eslint-disable-next-line global-require\n const cs = require('../mf/common-styles');\n\n ['commonKeyboardStyles', 'commonMathLiveStyles'].forEach((name) => {\n expect(cs[name]['& .ML__stretchy']).toBeDefined();\n expect(cs[name]['& .ML__base']).toBeDefined();\n });\n });\n\n // A bare `& svg` rule re-parents every svg in the subtree; MathLive's own rule\n // is descendant-scoped to .ML__latex .ML__stretchy svg.\n it('does not use a blanket svg rule', () => {\n // eslint-disable-next-line global-require\n const cs = require('../mf/common-styles');\n\n Object.values(cs).forEach((style) => {\n if (style && typeof style === 'object') {\n expect(Object.keys(style)).not.toContain('& svg');\n }\n });\n });\n\n it('leaves latex without empty groups alone', () => {\n ['\\\\pi', '\\\\sin', 'x^2', '\\\\overline{AB}'].forEach((latex) => {\n expect(latexForDisplay(latex)).toEqual(latex);\n });\n });\n\n it('handles nullish input', () => {\n expect(latexForDisplay(undefined)).toEqual('');\n expect(latexForDisplay('')).toEqual('');\n });\n\n it('does NOT affect what gets inserted into the field', () => {\n // the action must use the key's own latex, never the display form\n const key = { name: 'frac', latex: '\\\\frac{}{}' };\n\n expect(keyToAction(key).value).toEqual('\\\\frac{}{}');\n expect(keyToAction(key).value).not.toContain('pie-empty');\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
7
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _react2 = require("@testing-library/react");
10
+ var _keypad = _interopRequireWildcard(require("../keypad"));
11
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
12
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
13
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
14
+ /**
15
+ * Keypad behaviour that is new in this package: labels are static markup from
16
+ * convertLatexToMarkup (the MathQuill version created a live StaticMath per
17
+ * button), with a raw-latex fallback when the engine is unavailable.
18
+ */
19
+ describe('LatexLabel', function () {
20
+ it('falls back to raw latex when MathLive is unavailable', function () {
21
+ // jsdom cannot load MathLive, so latexToMarkup returns '' - the button must
22
+ // still show something rather than render blank.
23
+ var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad.LatexLabel, {
24
+ latex: '\\pi'
25
+ })),
26
+ container = _render.container;
27
+ expect(container.textContent).toContain('\\pi');
28
+ });
29
+ it('re-renders when the latex prop changes', function () {
30
+ var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad.LatexLabel, {
31
+ latex: '\\pi'
32
+ })),
33
+ container = _render2.container,
34
+ rerender = _render2.rerender;
35
+ rerender(/*#__PURE__*/_react["default"].createElement(_keypad.LatexLabel, {
36
+ latex: '\\theta'
37
+ }));
38
+ expect(container.textContent).toContain('\\theta');
39
+ });
40
+ it('does not warn more than once about a missing engine', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
41
+ var a, b;
42
+ return _regenerator["default"].wrap(function (_context) {
43
+ while (1) switch (_context.prev = _context.next) {
44
+ case 0:
45
+ _keypad.LatexLabel.warned = false;
46
+ a = new _keypad.LatexLabel({
47
+ latex: '\\pi'
48
+ });
49
+ b = new _keypad.LatexLabel({
50
+ latex: '\\theta'
51
+ });
52
+ a.state = {
53
+ markup: ''
54
+ };
55
+ b.state = {
56
+ markup: ''
57
+ };
58
+ a.setState = function () {};
59
+ b.setState = function () {};
60
+ _context.next = 1;
61
+ return a.componentDidMount();
62
+ case 1:
63
+ _context.next = 2;
64
+ return b.componentDidMount();
65
+ case 2:
66
+ expect(_keypad.LatexLabel.warned).toBe(true);
67
+ case 3:
68
+ case "end":
69
+ return _context.stop();
70
+ }
71
+ }, _callee);
72
+ })));
73
+ });
74
+ describe('KeyPad', function () {
75
+ var key = function key() {
76
+ var over = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
77
+ return _objectSpread({
78
+ name: 'x',
79
+ label: 'x',
80
+ write: 'x',
81
+ category: 'vars'
82
+ }, over);
83
+ };
84
+ it('renders a button per key', function () {
85
+ var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
86
+ onPress: function onPress() {},
87
+ baseSet: [[key(), key({
88
+ name: 'y',
89
+ label: 'y'
90
+ })]]
91
+ })),
92
+ container = _render3.container;
93
+ expect(container.querySelectorAll('button').length).toBe(2);
94
+ });
95
+ it('calls onPress with the whole key definition', function () {
96
+ var onPress = jest.fn();
97
+ var k = key();
98
+ var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
99
+ onPress: onPress,
100
+ baseSet: [[k]]
101
+ })),
102
+ container = _render4.container;
103
+ container.querySelector('button').click();
104
+ expect(onPress).toHaveBeenCalledWith(k);
105
+ });
106
+ it('renders a latex key through LatexLabel', function () {
107
+ var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
108
+ onPress: function onPress() {},
109
+ baseSet: [[{
110
+ name: 'pi',
111
+ latex: '\\pi'
112
+ }]]
113
+ })),
114
+ container = _render5.container;
115
+ expect(container.textContent).toContain('\\pi');
116
+ });
117
+ it('disables the decimal separators when noDecimal is set', function () {
118
+ var dot = key({
119
+ name: '.',
120
+ label: '.',
121
+ write: '.'
122
+ });
123
+ var comma = key({
124
+ name: ',',
125
+ label: ',',
126
+ write: ','
127
+ });
128
+ var _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
129
+ onPress: function onPress() {},
130
+ noDecimal: true,
131
+ baseSet: [[dot, comma]]
132
+ })),
133
+ container = _render6.container;
134
+ var disabled = Array.from(container.querySelectorAll('button')).filter(function (b) {
135
+ return b.disabled;
136
+ });
137
+ expect(disabled.length).toBe(2);
138
+ });
139
+ it('leaves the separators enabled otherwise', function () {
140
+ var dot = key({
141
+ name: '.',
142
+ label: '.',
143
+ write: '.'
144
+ });
145
+ var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
146
+ onPress: function onPress() {},
147
+ baseSet: [[dot]]
148
+ })),
149
+ container = _render7.container;
150
+ expect(container.querySelector('button').disabled).toBe(false);
151
+ });
152
+ it('renders a placeholder for empty grid slots', function () {
153
+ expect(function () {
154
+ return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
155
+ onPress: function onPress() {},
156
+ baseSet: [[null]]
157
+ }));
158
+ }).not.toThrow();
159
+ });
160
+ it('notifies setKeypadInteraction on pointer interaction', function () {
161
+ var setKeypadInteraction = jest.fn();
162
+ var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
163
+ onPress: function onPress() {},
164
+ setKeypadInteraction: setKeypadInteraction,
165
+ baseSet: [[key()]]
166
+ })),
167
+ container = _render8.container;
168
+ container.firstChild.dispatchEvent(new MouseEvent('mousedown', {
169
+ bubbles: true
170
+ }));
171
+ expect(setKeypadInteraction).toHaveBeenCalledWith(true);
172
+ });
173
+ it('uses the mode as a class so mode-specific styling applies', function () {
174
+ var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
175
+ onPress: function onPress() {},
176
+ mode: "language",
177
+ baseSet: [[key()]]
178
+ })),
179
+ container = _render9.container;
180
+ expect(container.firstChild.className).toContain('language');
181
+ });
182
+ it('drops the base set for the modes that supply their own keys', function () {
183
+ var _render0 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
184
+ onPress: function onPress() {},
185
+ mode: "language",
186
+ baseSet: [[key(), key()]],
187
+ additionalKeys: [[key()]]
188
+ })),
189
+ container = _render0.container;
190
+
191
+ // base set ignored, only the additional key renders
192
+ expect(container.querySelectorAll('button').length).toBe(1);
193
+ });
194
+ it('unmounts without throwing', function () {
195
+ var _render1 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
196
+ onPress: function onPress() {},
197
+ controlledKeypadMode: true,
198
+ baseSet: [[key()]]
199
+ })),
200
+ unmount = _render1.unmount;
201
+ expect(function () {
202
+ return unmount();
203
+ }).not.toThrow();
204
+ });
205
+ });
206
+ //# sourceMappingURL=keypad-render.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keypad-render.test.js","names":["_react","_interopRequireDefault","require","_react2","_keypad","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","describe","it","_render","render","createElement","LatexLabel","latex","container","expect","textContent","toContain","_render2","rerender","_asyncToGenerator2","_regenerator","mark","_callee","a","b","wrap","_context","prev","next","warned","state","markup","setState","componentDidMount","toBe","stop","key","over","undefined","name","label","write","category","_render3","onPress","baseSet","querySelectorAll","jest","fn","k","_render4","querySelector","click","toHaveBeenCalledWith","_render5","dot","comma","_render6","noDecimal","disabled","Array","from","_render7","not","toThrow","setKeypadInteraction","_render8","firstChild","dispatchEvent","MouseEvent","bubbles","_render9","mode","className","_render0","additionalKeys","_render1","controlledKeypadMode","unmount"],"sources":["../../src/__tests__/keypad-render.test.jsx"],"sourcesContent":["import React from 'react';\nimport { render } from '@testing-library/react';\n\nimport KeyPad, { LatexLabel } from '../keypad';\n\n/**\n * Keypad behaviour that is new in this package: labels are static markup from\n * convertLatexToMarkup (the MathQuill version created a live StaticMath per\n * button), with a raw-latex fallback when the engine is unavailable.\n */\ndescribe('LatexLabel', () => {\n it('falls back to raw latex when MathLive is unavailable', () => {\n // jsdom cannot load MathLive, so latexToMarkup returns '' - the button must\n // still show something rather than render blank.\n const { container } = render(<LatexLabel latex={'\\\\pi'} />);\n\n expect(container.textContent).toContain('\\\\pi');\n });\n\n it('re-renders when the latex prop changes', () => {\n const { container, rerender } = render(<LatexLabel latex={'\\\\pi'} />);\n\n rerender(<LatexLabel latex={'\\\\theta'} />);\n\n expect(container.textContent).toContain('\\\\theta');\n });\n\n it('does not warn more than once about a missing engine', async () => {\n LatexLabel.warned = false;\n\n const a = new LatexLabel({ latex: '\\\\pi' });\n const b = new LatexLabel({ latex: '\\\\theta' });\n\n a.state = { markup: '' };\n b.state = { markup: '' };\n a.setState = () => {};\n b.setState = () => {};\n\n await a.componentDidMount();\n await b.componentDidMount();\n\n expect(LatexLabel.warned).toBe(true);\n });\n});\n\ndescribe('KeyPad', () => {\n const key = (over = {}) => ({ name: 'x', label: 'x', write: 'x', category: 'vars', ...over });\n\n it('renders a button per key', () => {\n const { container } = render(<KeyPad onPress={() => {}} baseSet={[[key(), key({ name: 'y', label: 'y' })]]} />);\n\n expect(container.querySelectorAll('button').length).toBe(2);\n });\n\n it('calls onPress with the whole key definition', () => {\n const onPress = jest.fn();\n const k = key();\n const { container } = render(<KeyPad onPress={onPress} baseSet={[[k]]} />);\n\n container.querySelector('button').click();\n\n expect(onPress).toHaveBeenCalledWith(k);\n });\n\n it('renders a latex key through LatexLabel', () => {\n const { container } = render(<KeyPad onPress={() => {}} baseSet={[[{ name: 'pi', latex: '\\\\pi' }]]} />);\n\n expect(container.textContent).toContain('\\\\pi');\n });\n\n it('disables the decimal separators when noDecimal is set', () => {\n const dot = key({ name: '.', label: '.', write: '.' });\n const comma = key({ name: ',', label: ',', write: ',' });\n const { container } = render(<KeyPad onPress={() => {}} noDecimal baseSet={[[dot, comma]]} />);\n\n const disabled = Array.from(container.querySelectorAll('button')).filter((b) => b.disabled);\n\n expect(disabled.length).toBe(2);\n });\n\n it('leaves the separators enabled otherwise', () => {\n const dot = key({ name: '.', label: '.', write: '.' });\n const { container } = render(<KeyPad onPress={() => {}} baseSet={[[dot]]} />);\n\n expect(container.querySelector('button').disabled).toBe(false);\n });\n\n it('renders a placeholder for empty grid slots', () => {\n expect(() => render(<KeyPad onPress={() => {}} baseSet={[[null]]} />)).not.toThrow();\n });\n\n it('notifies setKeypadInteraction on pointer interaction', () => {\n const setKeypadInteraction = jest.fn();\n const { container } = render(\n <KeyPad onPress={() => {}} setKeypadInteraction={setKeypadInteraction} baseSet={[[key()]]} />,\n );\n\n container.firstChild.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));\n\n expect(setKeypadInteraction).toHaveBeenCalledWith(true);\n });\n\n it('uses the mode as a class so mode-specific styling applies', () => {\n const { container } = render(<KeyPad onPress={() => {}} mode=\"language\" baseSet={[[key()]]} />);\n\n expect(container.firstChild.className).toContain('language');\n });\n\n it('drops the base set for the modes that supply their own keys', () => {\n const { container } = render(\n <KeyPad onPress={() => {}} mode=\"language\" baseSet={[[key(), key()]]} additionalKeys={[[key()]]} />,\n );\n\n // base set ignored, only the additional key renders\n expect(container.querySelectorAll('button').length).toBe(1);\n });\n\n it('unmounts without throwing', () => {\n const { unmount } = render(<KeyPad onPress={() => {}} controlledKeypadMode baseSet={[[key()]]} />);\n\n expect(() => unmount()).not.toThrow();\n });\n});\n"],"mappings":"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","ignoreList":[]}