@pie-lib/math-input-mathlive 1.1.5-beta.11 → 1.1.5-beta.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.
- package/lib/__tests__/input-selection.test.js +103 -0
- package/lib/__tests__/keypad-label.test.js +13 -1
- package/lib/__tests__/latex-bridge.test.js +29 -1
- package/lib/__tests__/longdiv-wiring.test.js +215 -0
- package/lib/__tests__/longdiv.test.js +281 -0
- package/lib/__tests__/selection.test.js +195 -0
- package/lib/keypad/index.js +31 -1
- package/lib/keypad/index.js.map +1 -1
- package/lib/latex-bridge.js +16 -1
- package/lib/latex-bridge.js.map +1 -1
- package/lib/longdiv.js +173 -0
- package/lib/longdiv.js.map +1 -0
- package/lib/mathlive-instance.js +19 -1
- package/lib/mathlive-instance.js.map +1 -1
- package/lib/mf/common-styles.js +19 -0
- package/lib/mf/common-styles.js.map +1 -1
- package/lib/mf/input.js +8 -0
- package/lib/mf/input.js.map +1 -1
- package/lib/mf/static.js +13 -1
- package/lib/mf/static.js.map +1 -1
- package/lib/selection.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/longdiv-wiring.test.jsx +137 -0
- package/src/__tests__/longdiv.test.js +259 -0
- package/src/__tests__/selection.test.js +39 -4
- package/src/keypad/index.jsx +36 -2
- package/src/latex-bridge.js +18 -0
- package/src/longdiv.js +172 -0
- package/src/mathlive-instance.js +22 -0
- package/src/mf/common-styles.js +19 -0
- package/src/mf/input.jsx +9 -0
- package/src/mf/static.jsx +15 -1
- package/src/selection.js +1 -6
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _selection = require("../selection");
|
|
4
|
+
/**
|
|
5
|
+
* Offset tables captured from MathLive 0.110.0 `getElementInfo(i)` in Chrome,
|
|
6
|
+
* as [depth, latex] per offset. Offset `i` is the atom ending at caret `i`.
|
|
7
|
+
*/
|
|
8
|
+
var table = function table(rows) {
|
|
9
|
+
return function (i) {
|
|
10
|
+
return rows[i] ? {
|
|
11
|
+
depth: rows[i][0],
|
|
12
|
+
latex: rows[i][1]
|
|
13
|
+
} : undefined;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// 5x^2+2x+\frac{\pi}{2}-4
|
|
18
|
+
var POLY = table([[0, ''], [0, '5'], [0, 'x'], [1, ''], [1, '2'], [0, '^2'], [0, '+'], [0, '2'], [0, 'x'], [0, '+'], [1, ''], [1, '\\pi'], [1, ''], [1, '2'], [0, '\\frac{\\pi}{2}'], [0, '-'], [0, '4']]);
|
|
19
|
+
var POLY_LAST = 16;
|
|
20
|
+
|
|
21
|
+
// a+\sqrt{x+1}+b
|
|
22
|
+
var ROOT = table([[0, ''], [0, 'a'], [0, '+'], [1, ''], [1, 'x'], [1, '+'], [1, '1'], [0, '\\sqrt{x+1}'], [0, '+'], [0, 'b']]);
|
|
23
|
+
|
|
24
|
+
// \frac{\frac{a}{b}}{c}
|
|
25
|
+
var NESTED = table([[0, ''], [1, ''], [2, ''], [2, 'a'], [2, ''], [2, 'b'], [1, '\\frac{a}{b}'], [1, ''], [1, 'c'], [0, '\\frac{\\frac{a}{b}}{c}']]);
|
|
26
|
+
describe('expandRange', function () {
|
|
27
|
+
var poly = function poly(a, b) {
|
|
28
|
+
return (0, _selection.expandRange)(a, b, POLY, POLY_LAST);
|
|
29
|
+
};
|
|
30
|
+
it('leaves a selection of whole sibling atoms alone', function () {
|
|
31
|
+
expect(poly(6, 7)).toEqual([6, 7]); // 2
|
|
32
|
+
expect(poly(6, 9)).toEqual([6, 9]); // 2x+
|
|
33
|
+
expect(poly(6, 15)).toEqual([6, 15]); // 2x+\frac{\pi}{2}-
|
|
34
|
+
expect(poly(0, 16)).toEqual([0, 16]);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// The reported case: five Shift+Right presses from before `2x` gave `2x+\pi`.
|
|
38
|
+
it('takes the whole fraction when the selection reaches into it', function () {
|
|
39
|
+
expect(poly(6, 10)).toEqual([6, 14]);
|
|
40
|
+
expect(poly(6, 11)).toEqual([6, 14]);
|
|
41
|
+
expect(poly(6, 13)).toEqual([6, 14]);
|
|
42
|
+
});
|
|
43
|
+
it('takes the whole fraction when the selection leaves it', function () {
|
|
44
|
+
expect(poly(11, 15)).toEqual([9, 15]); // from the pi to after the minus
|
|
45
|
+
});
|
|
46
|
+
it('crossing from numerator to denominator selects the fraction', function () {
|
|
47
|
+
expect(poly(11, 13)).toEqual([9, 14]);
|
|
48
|
+
expect(poly(11, 12)).toEqual([9, 14]);
|
|
49
|
+
});
|
|
50
|
+
it('a selection inside one branch stays inside it', function () {
|
|
51
|
+
expect(poly(10, 11)).toEqual([10, 11]); // \pi
|
|
52
|
+
expect(poly(12, 13)).toEqual([12, 13]); // the 2 of the denominator
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// MathLive stores x^2 as `x` then a separate `^2` atom.
|
|
56
|
+
it('keeps a superscript with its base', function () {
|
|
57
|
+
expect(poly(3, 7)).toEqual([1, 7]); // x^2+2, not ^2+2
|
|
58
|
+
expect(poly(4, 6)).toEqual([1, 6]); // x^2+
|
|
59
|
+
});
|
|
60
|
+
it('accepts a reversed range', function () {
|
|
61
|
+
expect(poly(11, 6)).toEqual([6, 14]);
|
|
62
|
+
});
|
|
63
|
+
it('leaves a collapsed range alone', function () {
|
|
64
|
+
expect(poly(11, 11)).toEqual([11, 11]);
|
|
65
|
+
});
|
|
66
|
+
it('handles roots the same way', function () {
|
|
67
|
+
expect((0, _selection.expandRange)(2, 4, ROOT, 9)).toEqual([2, 7]);
|
|
68
|
+
expect((0, _selection.expandRange)(4, 6, ROOT, 9)).toEqual([4, 6]); // +1 inside the radicand
|
|
69
|
+
});
|
|
70
|
+
it('climbs as many levels as needed in nested fractions', function () {
|
|
71
|
+
expect((0, _selection.expandRange)(2, 3, NESTED, 9)).toEqual([2, 3]); // a
|
|
72
|
+
expect((0, _selection.expandRange)(3, 5, NESTED, 9)).toEqual([1, 6]); // a/b crossing -> inner fraction
|
|
73
|
+
expect((0, _selection.expandRange)(6, 7, NESTED, 9)).toEqual([0, 9]); // inner -> outer denominator
|
|
74
|
+
});
|
|
75
|
+
it('tolerates missing info', function () {
|
|
76
|
+
expect((0, _selection.expandRange)(1, 3, function () {
|
|
77
|
+
return undefined;
|
|
78
|
+
}, 5)).toEqual([1, 3]);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('trackWholeAtomSelection', function () {
|
|
82
|
+
var stubField = function stubField(range) {
|
|
83
|
+
var direction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'forward';
|
|
84
|
+
var listeners = {};
|
|
85
|
+
return {
|
|
86
|
+
selection: {
|
|
87
|
+
ranges: [range],
|
|
88
|
+
direction: direction
|
|
89
|
+
},
|
|
90
|
+
get selectionIsCollapsed() {
|
|
91
|
+
return this.selection.ranges[0][0] === this.selection.ranges[0][1];
|
|
92
|
+
},
|
|
93
|
+
lastOffset: POLY_LAST,
|
|
94
|
+
getElementInfo: POLY,
|
|
95
|
+
sets: 0,
|
|
96
|
+
addEventListener: function addEventListener(type, fn) {
|
|
97
|
+
listeners[type] = fn;
|
|
98
|
+
},
|
|
99
|
+
removeEventListener: function removeEventListener(type, fn) {
|
|
100
|
+
if (listeners[type] === fn) {
|
|
101
|
+
delete listeners[type];
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
fire: function fire(type) {
|
|
105
|
+
if (listeners[type]) {
|
|
106
|
+
listeners[type]();
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
has: function has(type) {
|
|
110
|
+
return !!listeners[type];
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
var track = function track(field) {
|
|
115
|
+
// count assignments without breaking the getter
|
|
116
|
+
var current = field.selection;
|
|
117
|
+
Object.defineProperty(field, 'selection', {
|
|
118
|
+
get: function get() {
|
|
119
|
+
return current;
|
|
120
|
+
},
|
|
121
|
+
set: function set(v) {
|
|
122
|
+
field.sets += 1;
|
|
123
|
+
current = v;
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
return (0, _selection.trackWholeAtomSelection)(field);
|
|
127
|
+
};
|
|
128
|
+
it('widens the selection on selection-change', function () {
|
|
129
|
+
var field = stubField([6, 11]);
|
|
130
|
+
track(field);
|
|
131
|
+
field.fire('selection-change');
|
|
132
|
+
expect(field.selection.ranges).toEqual([[6, 14]]);
|
|
133
|
+
});
|
|
134
|
+
it('preserves the direction, so Shift+Arrow keeps extending the same end', function () {
|
|
135
|
+
var field = stubField([11, 16], 'backward');
|
|
136
|
+
track(field);
|
|
137
|
+
field.fire('selection-change');
|
|
138
|
+
expect(field.selection).toEqual({
|
|
139
|
+
ranges: [[9, 16]],
|
|
140
|
+
direction: 'backward'
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
it('does not touch a selection that is already whole', function () {
|
|
144
|
+
var field = stubField([6, 9]);
|
|
145
|
+
track(field);
|
|
146
|
+
field.fire('selection-change');
|
|
147
|
+
expect(field.sets).toBe(0);
|
|
148
|
+
});
|
|
149
|
+
it('ignores a collapsed caret', function () {
|
|
150
|
+
var field = stubField([11, 11]);
|
|
151
|
+
track(field);
|
|
152
|
+
field.fire('selection-change');
|
|
153
|
+
expect(field.sets).toBe(0);
|
|
154
|
+
});
|
|
155
|
+
it('does not recurse when its own assignment fires selection-change', function () {
|
|
156
|
+
var field = stubField([6, 11]);
|
|
157
|
+
var current = field.selection;
|
|
158
|
+
Object.defineProperty(field, 'selection', {
|
|
159
|
+
get: function get() {
|
|
160
|
+
return current;
|
|
161
|
+
},
|
|
162
|
+
set: function set(v) {
|
|
163
|
+
field.sets += 1;
|
|
164
|
+
current = v;
|
|
165
|
+
field.fire('selection-change');
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
(0, _selection.trackWholeAtomSelection)(field);
|
|
169
|
+
field.fire('selection-change');
|
|
170
|
+
expect(field.sets).toBe(1);
|
|
171
|
+
expect(field.selection.ranges).toEqual([[6, 14]]);
|
|
172
|
+
});
|
|
173
|
+
it('survives a field that throws', function () {
|
|
174
|
+
var field = stubField([6, 11]);
|
|
175
|
+
field.getElementInfo = function () {
|
|
176
|
+
throw new Error('boom');
|
|
177
|
+
};
|
|
178
|
+
track(field);
|
|
179
|
+
expect(function () {
|
|
180
|
+
return field.fire('selection-change');
|
|
181
|
+
}).not.toThrow();
|
|
182
|
+
});
|
|
183
|
+
it('tears down its listener', function () {
|
|
184
|
+
var field = stubField([6, 11]);
|
|
185
|
+
var untrack = track(field);
|
|
186
|
+
expect(field.has('selection-change')).toBe(true);
|
|
187
|
+
untrack();
|
|
188
|
+
expect(field.has('selection-change')).toBe(false);
|
|
189
|
+
});
|
|
190
|
+
it('is a no-op without a field', function () {
|
|
191
|
+
expect((0, _selection.trackWholeAtomSelection)(undefined)).toBeUndefined();
|
|
192
|
+
expect((0, _selection.trackWholeAtomSelection)({})).toBeUndefined();
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc2VsZWN0aW9uIiwicmVxdWlyZSIsInRhYmxlIiwicm93cyIsImkiLCJkZXB0aCIsImxhdGV4IiwidW5kZWZpbmVkIiwiUE9MWSIsIlBPTFlfTEFTVCIsIlJPT1QiLCJORVNURUQiLCJkZXNjcmliZSIsInBvbHkiLCJhIiwiYiIsImV4cGFuZFJhbmdlIiwiaXQiLCJleHBlY3QiLCJ0b0VxdWFsIiwic3R1YkZpZWxkIiwicmFuZ2UiLCJkaXJlY3Rpb24iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJsaXN0ZW5lcnMiLCJzZWxlY3Rpb24iLCJyYW5nZXMiLCJzZWxlY3Rpb25Jc0NvbGxhcHNlZCIsImxhc3RPZmZzZXQiLCJnZXRFbGVtZW50SW5mbyIsInNldHMiLCJhZGRFdmVudExpc3RlbmVyIiwidHlwZSIsImZuIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImZpcmUiLCJoYXMiLCJ0cmFjayIsImZpZWxkIiwiY3VycmVudCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0Iiwic2V0IiwidiIsInRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uIiwidG9CZSIsIkVycm9yIiwibm90IiwidG9UaHJvdyIsInVudHJhY2siLCJ0b0JlVW5kZWZpbmVkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9zZWxlY3Rpb24udGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHBhbmRSYW5nZSwgdHJhY2tXaG9sZUF0b21TZWxlY3Rpb24gfSBmcm9tICcuLi9zZWxlY3Rpb24nO1xuXG4vKipcbiAqIE9mZnNldCB0YWJsZXMgY2FwdHVyZWQgZnJvbSBNYXRoTGl2ZSAwLjExMC4wIGBnZXRFbGVtZW50SW5mbyhpKWAgaW4gQ2hyb21lLFxuICogYXMgW2RlcHRoLCBsYXRleF0gcGVyIG9mZnNldC4gT2Zmc2V0IGBpYCBpcyB0aGUgYXRvbSBlbmRpbmcgYXQgY2FyZXQgYGlgLlxuICovXG5jb25zdCB0YWJsZSA9IChyb3dzKSA9PiAoaSkgPT4gKHJvd3NbaV0gPyB7IGRlcHRoOiByb3dzW2ldWzBdLCBsYXRleDogcm93c1tpXVsxXSB9IDogdW5kZWZpbmVkKTtcblxuLy8gNXheMisyeCtcXGZyYWN7XFxwaX17Mn0tNFxuY29uc3QgUE9MWSA9IHRhYmxlKFtcbiAgWzAsICcnXSxcbiAgWzAsICc1J10sXG4gIFswLCAneCddLFxuICBbMSwgJyddLFxuICBbMSwgJzInXSxcbiAgWzAsICdeMiddLFxuICBbMCwgJysnXSxcbiAgWzAsICcyJ10sXG4gIFswLCAneCddLFxuICBbMCwgJysnXSxcbiAgWzEsICcnXSxcbiAgWzEsICdcXFxccGknXSxcbiAgWzEsICcnXSxcbiAgWzEsICcyJ10sXG4gIFswLCAnXFxcXGZyYWN7XFxcXHBpfXsyfSddLFxuICBbMCwgJy0nXSxcbiAgWzAsICc0J10sXG5dKTtcbmNvbnN0IFBPTFlfTEFTVCA9IDE2O1xuXG4vLyBhK1xcc3FydHt4KzF9K2JcbmNvbnN0IFJPT1QgPSB0YWJsZShbXG4gIFswLCAnJ10sXG4gIFswLCAnYSddLFxuICBbMCwgJysnXSxcbiAgWzEsICcnXSxcbiAgWzEsICd4J10sXG4gIFsxLCAnKyddLFxuICBbMSwgJzEnXSxcbiAgWzAsICdcXFxcc3FydHt4KzF9J10sXG4gIFswLCAnKyddLFxuICBbMCwgJ2InXSxcbl0pO1xuXG4vLyBcXGZyYWN7XFxmcmFje2F9e2J9fXtjfVxuY29uc3QgTkVTVEVEID0gdGFibGUoW1xuICBbMCwgJyddLFxuICBbMSwgJyddLFxuICBbMiwgJyddLFxuICBbMiwgJ2EnXSxcbiAgWzIsICcnXSxcbiAgWzIsICdiJ10sXG4gIFsxLCAnXFxcXGZyYWN7YX17Yn0nXSxcbiAgWzEsICcnXSxcbiAgWzEsICdjJ10sXG4gIFswLCAnXFxcXGZyYWN7XFxcXGZyYWN7YX17Yn19e2N9J10sXG5dKTtcblxuZGVzY3JpYmUoJ2V4cGFuZFJhbmdlJywgKCkgPT4ge1xuICBjb25zdCBwb2x5ID0gKGEsIGIpID0+IGV4cGFuZFJhbmdlKGEsIGIsIFBPTFksIFBPTFlfTEFTVCk7XG5cbiAgaXQoJ2xlYXZlcyBhIHNlbGVjdGlvbiBvZiB3aG9sZSBzaWJsaW5nIGF0b21zIGFsb25lJywgKCkgPT4ge1xuICAgIGV4cGVjdChwb2x5KDYsIDcpKS50b0VxdWFsKFs2LCA3XSk7IC8vIDJcbiAgICBleHBlY3QocG9seSg2LCA5KSkudG9FcXVhbChbNiwgOV0pOyAvLyAyeCtcbiAgICBleHBlY3QocG9seSg2LCAxNSkpLnRvRXF1YWwoWzYsIDE1XSk7IC8vIDJ4K1xcZnJhY3tcXHBpfXsyfS1cbiAgICBleHBlY3QocG9seSgwLCAxNikpLnRvRXF1YWwoWzAsIDE2XSk7XG4gIH0pO1xuXG4gIC8vIFRoZSByZXBvcnRlZCBjYXNlOiBmaXZlIFNoaWZ0K1JpZ2h0IHByZXNzZXMgZnJvbSBiZWZvcmUgYDJ4YCBnYXZlIGAyeCtcXHBpYC5cbiAgaXQoJ3Rha2VzIHRoZSB3aG9sZSBmcmFjdGlvbiB3aGVuIHRoZSBzZWxlY3Rpb24gcmVhY2hlcyBpbnRvIGl0JywgKCkgPT4ge1xuICAgIGV4cGVjdChwb2x5KDYsIDEwKSkudG9FcXVhbChbNiwgMTRdKTtcbiAgICBleHBlY3QocG9seSg2LCAxMSkpLnRvRXF1YWwoWzYsIDE0XSk7XG4gICAgZXhwZWN0KHBvbHkoNiwgMTMpKS50b0VxdWFsKFs2LCAxNF0pO1xuICB9KTtcblxuICBpdCgndGFrZXMgdGhlIHdob2xlIGZyYWN0aW9uIHdoZW4gdGhlIHNlbGVjdGlvbiBsZWF2ZXMgaXQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBvbHkoMTEsIDE1KSkudG9FcXVhbChbOSwgMTVdKTsgLy8gZnJvbSB0aGUgcGkgdG8gYWZ0ZXIgdGhlIG1pbnVzXG4gIH0pO1xuXG4gIGl0KCdjcm9zc2luZyBmcm9tIG51bWVyYXRvciB0byBkZW5vbWluYXRvciBzZWxlY3RzIHRoZSBmcmFjdGlvbicsICgpID0+IHtcbiAgICBleHBlY3QocG9seSgxMSwgMTMpKS50b0VxdWFsKFs5LCAxNF0pO1xuICAgIGV4cGVjdChwb2x5KDExLCAxMikpLnRvRXF1YWwoWzksIDE0XSk7XG4gIH0pO1xuXG4gIGl0KCdhIHNlbGVjdGlvbiBpbnNpZGUgb25lIGJyYW5jaCBzdGF5cyBpbnNpZGUgaXQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBvbHkoMTAsIDExKSkudG9FcXVhbChbMTAsIDExXSk7IC8vIFxccGlcbiAgICBleHBlY3QocG9seSgxMiwgMTMpKS50b0VxdWFsKFsxMiwgMTNdKTsgLy8gdGhlIDIgb2YgdGhlIGRlbm9taW5hdG9yXG4gIH0pO1xuXG4gIC8vIE1hdGhMaXZlIHN0b3JlcyB4XjIgYXMgYHhgIHRoZW4gYSBzZXBhcmF0ZSBgXjJgIGF0b20uXG4gIGl0KCdrZWVwcyBhIHN1cGVyc2NyaXB0IHdpdGggaXRzIGJhc2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBvbHkoMywgNykpLnRvRXF1YWwoWzEsIDddKTsgLy8geF4yKzIsIG5vdCBeMisyXG4gICAgZXhwZWN0KHBvbHkoNCwgNikpLnRvRXF1YWwoWzEsIDZdKTsgLy8geF4yK1xuICB9KTtcblxuICBpdCgnYWNjZXB0cyBhIHJldmVyc2VkIHJhbmdlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwb2x5KDExLCA2KSkudG9FcXVhbChbNiwgMTRdKTtcbiAgfSk7XG5cbiAgaXQoJ2xlYXZlcyBhIGNvbGxhcHNlZCByYW5nZSBhbG9uZScsICgpID0+IHtcbiAgICBleHBlY3QocG9seSgxMSwgMTEpKS50b0VxdWFsKFsxMSwgMTFdKTtcbiAgfSk7XG5cbiAgaXQoJ2hhbmRsZXMgcm9vdHMgdGhlIHNhbWUgd2F5JywgKCkgPT4ge1xuICAgIGV4cGVjdChleHBhbmRSYW5nZSgyLCA0LCBST09ULCA5KSkudG9FcXVhbChbMiwgN10pO1xuICAgIGV4cGVjdChleHBhbmRSYW5nZSg0LCA2LCBST09ULCA5KSkudG9FcXVhbChbNCwgNl0pOyAvLyArMSBpbnNpZGUgdGhlIHJhZGljYW5kXG4gIH0pO1xuXG4gIGl0KCdjbGltYnMgYXMgbWFueSBsZXZlbHMgYXMgbmVlZGVkIGluIG5lc3RlZCBmcmFjdGlvbnMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGV4cGFuZFJhbmdlKDIsIDMsIE5FU1RFRCwgOSkpLnRvRXF1YWwoWzIsIDNdKTsgLy8gYVxuICAgIGV4cGVjdChleHBhbmRSYW5nZSgzLCA1LCBORVNURUQsIDkpKS50b0VxdWFsKFsxLCA2XSk7IC8vIGEvYiBjcm9zc2luZyAtPiBpbm5lciBmcmFjdGlvblxuICAgIGV4cGVjdChleHBhbmRSYW5nZSg2LCA3LCBORVNURUQsIDkpKS50b0VxdWFsKFswLCA5XSk7IC8vIGlubmVyIC0+IG91dGVyIGRlbm9taW5hdG9yXG4gIH0pO1xuXG4gIGl0KCd0b2xlcmF0ZXMgbWlzc2luZyBpbmZvJywgKCkgPT4ge1xuICAgIGV4cGVjdChleHBhbmRSYW5nZSgxLCAzLCAoKSA9PiB1bmRlZmluZWQsIDUpKS50b0VxdWFsKFsxLCAzXSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCd0cmFja1dob2xlQXRvbVNlbGVjdGlvbicsICgpID0+IHtcbiAgY29uc3Qgc3R1YkZpZWxkID0gKHJhbmdlLCBkaXJlY3Rpb24gPSAnZm9yd2FyZCcpID0+IHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB7fTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3Rpb246IHsgcmFuZ2VzOiBbcmFuZ2VdLCBkaXJlY3Rpb24gfSxcbiAgICAgIGdldCBzZWxlY3Rpb25Jc0NvbGxhcHNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLnJhbmdlc1swXVswXSA9PT0gdGhpcy5zZWxlY3Rpb24ucmFuZ2VzWzBdWzFdO1xuICAgICAgfSxcbiAgICAgIGxhc3RPZmZzZXQ6IFBPTFlfTEFTVCxcbiAgICAgIGdldEVsZW1lbnRJbmZvOiBQT0xZLFxuICAgICAgc2V0czogMCxcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZm4pIHtcbiAgICAgICAgbGlzdGVuZXJzW3R5cGVdID0gZm47XG4gICAgICB9LFxuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBmbikge1xuICAgICAgICBpZiAobGlzdGVuZXJzW3R5cGVdID09PSBmbikge1xuICAgICAgICAgIGRlbGV0ZSBsaXN0ZW5lcnNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmaXJlKHR5cGUpIHtcbiAgICAgICAgaWYgKGxpc3RlbmVyc1t0eXBlXSkge1xuICAgICAgICAgIGxpc3RlbmVyc1t0eXBlXSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFzKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuICEhbGlzdGVuZXJzW3R5cGVdO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IHRyYWNrID0gKGZpZWxkKSA9PiB7XG4gICAgLy8gY291bnQgYXNzaWdubWVudHMgd2l0aG91dCBicmVha2luZyB0aGUgZ2V0dGVyXG4gICAgbGV0IGN1cnJlbnQgPSBmaWVsZC5zZWxlY3Rpb247XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmllbGQsICdzZWxlY3Rpb24nLCB7XG4gICAgICBnZXQ6ICgpID0+IGN1cnJlbnQsXG4gICAgICBzZXQ6ICh2KSA9PiB7XG4gICAgICAgIGZpZWxkLnNldHMgKz0gMTtcbiAgICAgICAgY3VycmVudCA9IHY7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uKGZpZWxkKTtcbiAgfTtcblxuICBpdCgnd2lkZW5zIHRoZSBzZWxlY3Rpb24gb24gc2VsZWN0aW9uLWNoYW5nZScsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHN0dWJGaWVsZChbNiwgMTFdKTtcblxuICAgIHRyYWNrKGZpZWxkKTtcbiAgICBmaWVsZC5maXJlKCdzZWxlY3Rpb24tY2hhbmdlJyk7XG5cbiAgICBleHBlY3QoZmllbGQuc2VsZWN0aW9uLnJhbmdlcykudG9FcXVhbChbWzYsIDE0XV0pO1xuICB9KTtcblxuICBpdCgncHJlc2VydmVzIHRoZSBkaXJlY3Rpb24sIHNvIFNoaWZ0K0Fycm93IGtlZXBzIGV4dGVuZGluZyB0aGUgc2FtZSBlbmQnLCAoKSA9PiB7XG4gICAgY29uc3QgZmllbGQgPSBzdHViRmllbGQoWzExLCAxNl0sICdiYWNrd2FyZCcpO1xuXG4gICAgdHJhY2soZmllbGQpO1xuICAgIGZpZWxkLmZpcmUoJ3NlbGVjdGlvbi1jaGFuZ2UnKTtcblxuICAgIGV4cGVjdChmaWVsZC5zZWxlY3Rpb24pLnRvRXF1YWwoeyByYW5nZXM6IFtbOSwgMTZdXSwgZGlyZWN0aW9uOiAnYmFja3dhcmQnIH0pO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgdG91Y2ggYSBzZWxlY3Rpb24gdGhhdCBpcyBhbHJlYWR5IHdob2xlJywgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkID0gc3R1YkZpZWxkKFs2LCA5XSk7XG5cbiAgICB0cmFjayhmaWVsZCk7XG4gICAgZmllbGQuZmlyZSgnc2VsZWN0aW9uLWNoYW5nZScpO1xuXG4gICAgZXhwZWN0KGZpZWxkLnNldHMpLnRvQmUoMCk7XG4gIH0pO1xuXG4gIGl0KCdpZ25vcmVzIGEgY29sbGFwc2VkIGNhcmV0JywgKCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkID0gc3R1YkZpZWxkKFsxMSwgMTFdKTtcblxuICAgIHRyYWNrKGZpZWxkKTtcbiAgICBmaWVsZC5maXJlKCdzZWxlY3Rpb24tY2hhbmdlJyk7XG5cbiAgICBleHBlY3QoZmllbGQuc2V0cykudG9CZSgwKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IHJlY3Vyc2Ugd2hlbiBpdHMgb3duIGFzc2lnbm1lbnQgZmlyZXMgc2VsZWN0aW9uLWNoYW5nZScsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHN0dWJGaWVsZChbNiwgMTFdKTtcbiAgICBsZXQgY3VycmVudCA9IGZpZWxkLnNlbGVjdGlvbjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmaWVsZCwgJ3NlbGVjdGlvbicsIHtcbiAgICAgIGdldDogKCkgPT4gY3VycmVudCxcbiAgICAgIHNldDogKHYpID0+IHtcbiAgICAgICAgZmllbGQuc2V0cyArPSAxO1xuICAgICAgICBjdXJyZW50ID0gdjtcbiAgICAgICAgZmllbGQuZmlyZSgnc2VsZWN0aW9uLWNoYW5nZScpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uKGZpZWxkKTtcbiAgICBmaWVsZC5maXJlKCdzZWxlY3Rpb24tY2hhbmdlJyk7XG5cbiAgICBleHBlY3QoZmllbGQuc2V0cykudG9CZSgxKTtcbiAgICBleHBlY3QoZmllbGQuc2VsZWN0aW9uLnJhbmdlcykudG9FcXVhbChbWzYsIDE0XV0pO1xuICB9KTtcblxuICBpdCgnc3Vydml2ZXMgYSBmaWVsZCB0aGF0IHRocm93cycsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHN0dWJGaWVsZChbNiwgMTFdKTtcblxuICAgIGZpZWxkLmdldEVsZW1lbnRJbmZvID0gKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdib29tJyk7XG4gICAgfTtcblxuICAgIHRyYWNrKGZpZWxkKTtcblxuICAgIGV4cGVjdCgoKSA9PiBmaWVsZC5maXJlKCdzZWxlY3Rpb24tY2hhbmdlJykpLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIGl0KCd0ZWFycyBkb3duIGl0cyBsaXN0ZW5lcicsICgpID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHN0dWJGaWVsZChbNiwgMTFdKTtcbiAgICBjb25zdCB1bnRyYWNrID0gdHJhY2soZmllbGQpO1xuXG4gICAgZXhwZWN0KGZpZWxkLmhhcygnc2VsZWN0aW9uLWNoYW5nZScpKS50b0JlKHRydWUpO1xuICAgIHVudHJhY2soKTtcbiAgICBleHBlY3QoZmllbGQuaGFzKCdzZWxlY3Rpb24tY2hhbmdlJykpLnRvQmUoZmFsc2UpO1xuICB9KTtcblxuICBpdCgnaXMgYSBuby1vcCB3aXRob3V0IGEgZmllbGQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHRyYWNrV2hvbGVBdG9tU2VsZWN0aW9uKHVuZGVmaW5lZCkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3QodHJhY2tXaG9sZUF0b21TZWxlY3Rpb24oe30pKS50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
|
package/lib/keypad/index.js
CHANGED
|
@@ -27,6 +27,7 @@ var _keys = require("../keys");
|
|
|
27
27
|
var _keysLayout = require("./keys-layout");
|
|
28
28
|
var _commonStyles = require("../mf/common-styles");
|
|
29
29
|
var _mathliveInstance = require("../mathlive-instance");
|
|
30
|
+
var _longdiv = require("../longdiv");
|
|
30
31
|
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
|
|
31
32
|
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
32
33
|
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; }
|
|
@@ -93,6 +94,28 @@ var LabelHolder = (0, _styles.styled)('span', {
|
|
|
93
94
|
// MathQuill shaded `.mq-empty`.
|
|
94
95
|
'& [data-pie-empty]': {
|
|
95
96
|
opacity: 0.5
|
|
97
|
+
},
|
|
98
|
+
// A fraction is taller than the label's 1em line box, so its numerator sat
|
|
99
|
+
// flush against (and was clipped by) the top edge. Extra room above it grows
|
|
100
|
+
// the box, which the keypad then centres, so the fraction moves down a little.
|
|
101
|
+
'&:has(.ML__mfrac)': {
|
|
102
|
+
paddingTop: '0.25em'
|
|
103
|
+
},
|
|
104
|
+
// Centre a fraction's bar between its empty slots (see `placeholderStyles`).
|
|
105
|
+
'& .ML__mfrac:has([data-pie-empty]) .ML__frac-line': {
|
|
106
|
+
position: 'relative',
|
|
107
|
+
top: '0.16em'
|
|
108
|
+
},
|
|
109
|
+
// A real numerator (`x`) is lighter than an empty box and its ink ends at the
|
|
110
|
+
// baseline, so the full drop overshoots: it needs a smaller drop. The numerator is
|
|
111
|
+
// the second `.ML__center` (MathLive emits the denominator first).
|
|
112
|
+
'& .ML__mfrac:has([data-pie-empty]):not(:has(.ML__center ~ .ML__center [data-pie-empty])) .ML__frac-line': {
|
|
113
|
+
top: '0.13em'
|
|
114
|
+
},
|
|
115
|
+
// Same for a mixed number (`x` then the fraction): the leading `x` is a sibling
|
|
116
|
+
// of the fraction, which a lone `\frac{}{}` does not have.
|
|
117
|
+
'& .ML__mfrac:has([data-pie-empty]):not(:only-child) .ML__frac-line': {
|
|
118
|
+
top: '0.13em'
|
|
96
119
|
}
|
|
97
120
|
}, _commonStyles.rootIndexStyles);
|
|
98
121
|
});
|
|
@@ -104,6 +127,7 @@ var LatexLabel = exports.LatexLabel = /*#__PURE__*/function (_React$Component) {
|
|
|
104
127
|
_this.state = {
|
|
105
128
|
markup: (0, _mathliveInstance.latexToMarkup)(props.latex)
|
|
106
129
|
};
|
|
130
|
+
_this.labelRef = /*#__PURE__*/_react["default"].createRef();
|
|
107
131
|
return _this;
|
|
108
132
|
}
|
|
109
133
|
(0, _inherits2["default"])(LatexLabel, _React$Component);
|
|
@@ -119,6 +143,8 @@ var LatexLabel = exports.LatexLabel = /*#__PURE__*/function (_React$Component) {
|
|
|
119
143
|
_context.next = 1;
|
|
120
144
|
break;
|
|
121
145
|
}
|
|
146
|
+
// The long-division key's label needs MathLive's drawing corrected.
|
|
147
|
+
(0, _longdiv.fixLongDivisionWhenReady)(this.labelRef.current);
|
|
122
148
|
return _context.abrupt("return");
|
|
123
149
|
case 1:
|
|
124
150
|
_context.next = 2;
|
|
@@ -160,12 +186,15 @@ var LatexLabel = exports.LatexLabel = /*#__PURE__*/function (_React$Component) {
|
|
|
160
186
|
}()
|
|
161
187
|
}, {
|
|
162
188
|
key: "componentDidUpdate",
|
|
163
|
-
value: function componentDidUpdate(prevProps) {
|
|
189
|
+
value: function componentDidUpdate(prevProps, prevState) {
|
|
164
190
|
if (prevProps.latex !== this.props.latex) {
|
|
165
191
|
this.setState({
|
|
166
192
|
markup: (0, _mathliveInstance.latexToMarkup)(this.props.latex)
|
|
167
193
|
});
|
|
168
194
|
}
|
|
195
|
+
if (this.state.markup !== (prevState && prevState.markup)) {
|
|
196
|
+
(0, _longdiv.fixLongDivisionWhenReady)(this.labelRef.current);
|
|
197
|
+
}
|
|
169
198
|
}
|
|
170
199
|
}, {
|
|
171
200
|
key: "componentWillUnmount",
|
|
@@ -182,6 +211,7 @@ var LatexLabel = exports.LatexLabel = /*#__PURE__*/function (_React$Component) {
|
|
|
182
211
|
/*#__PURE__*/
|
|
183
212
|
// eslint-disable-next-line react/no-danger
|
|
184
213
|
_react["default"].createElement(LabelHolder, {
|
|
214
|
+
ref: this.labelRef,
|
|
185
215
|
slanted: SLANTED_LABELS.includes(this.props.latex),
|
|
186
216
|
dangerouslySetInnerHTML: {
|
|
187
217
|
__html: markup
|
package/lib/keypad/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_react","_interopRequireDefault","require","_propTypes","_Button","_IconButton","_styles","_debug","_lodashEs","_renderUi","_keys","_keysLayout","_commonStyles","_mathliveInstance","_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","SLANTED_LABELS","SLANT","SLANTED_STROKE","SLANTED_SCALE_Y","LabelHolder","styled","shouldForwardProp","prop","_ref","slanted","transform","concat","WebkitTextStroke","pointerEvents","textTransform","color","text","display","textAlign","lineHeight","maxWidth","overflow","backgroundColor","keypadEmptyPlaceholder","undefined","opacity","rootIndexStyles","LatexLabel","exports","_React$Component","props","_this","_classCallCheck2","state","markup","latexToMarkup","latex","_inherits2","_createClass2","key","value","_componentDidMount","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_context","prev","next","abrupt","loadMathLive","unmounted","setState","warned","stop","componentDidMount","componentDidUpdate","prevProps","componentWillUnmount","render","createElement","includes","dangerouslySetInnerHTML","__html","React","Component","PropTypes","string","isRequired","createCustomLayout","layoutObj","gridTemplateColumns","columns","gridTemplateRows","rows","gridAutoFlow","KeyPadContainer","commonKeyboardStyles","width","gridRowGap","gridColumnGap","fontFamily","buttonBackground","category","keypadButtonOperator","keypadButton","keypadButtonOperatorHover","keypadButtonHover","StyledButton","Button","_ref2","isDelete","isComma","isDot","minWidth","fontSize","borderRadius","StyledLatexButtonWrapper","_ref3","padding","margin","StyledIconButton","IconButton","_ref4","height","KeyPad","_React$Component2","_this2","setKeypadInteraction","onPress","base","extras","flatten","_toConsumableArray2","sortKeys","noDecimal","write","label","keypadRef","createRef","_this$keypadRef","keyPadElement","current","mainContainer","closest","currentToolbar","controlledKeypadMode","mainContainerPosition","getBoundingClientRect","currentToolbarPosition","difference","top","totalHeight","style","addEventListener","handleKeypadInteraction","_this$keypadRef2","removeEventListener","_this3","_this$props","className","baseSet","additionalKeys","layoutForKeyPad","onFocus","mode","noBaseSet","keysWithoutBaseSet","allKeys","flowKeys","shift","Math","floor","ref","join","map","k","index","command","extra","actions","extraProps","onClick","buttonClick","bind","disabled","keyIsNotAllowed","ariaLabel","name","_extends2","Icon","icon","tabIndex","size","bool","array","object","func","oneOfType","number","_default"],"sources":["../../src/keypad/index.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport { styled } from '@mui/material/styles';\nimport debug from 'debug';\nimport { flatten } from 'lodash-es';\nimport { color } from '@pie-lib/render-ui';\n\nimport { baseSet } from '../keys';\nimport { sortKeys } from './keys-layout';\nimport { commonKeyboardStyles, rootIndexStyles } from '../mf/common-styles';\nimport { loadMathLive, latexToMarkup } from '../mathlive-instance';\n\nconst log = debug('pie-lib:math-input-mathlive:keypad');\n\n/**\n * A LaTeX keypad label.\n *\n * The MathQuill implementation rendered every LaTeX label as its own\n * `MQ.StaticMath` instance. Here each label is static HTML produced once by\n * `convertLatexToMarkup`, so a 40-key keypad no longer creates 40 live math\n * instances.\n */\n// Labels that the legacy keypad drew slanted. MathQuill styled `\\parallel` as\n// italic, which slants the two bars; MathLive draws it upright. A skew is used\n// rather than `font-style: italic` so the slant does not depend on the font\n// having an italic face for this glyph.\nconst SLANTED_LABELS = ['\\\\parallel'];\nconst SLANT = 'skewX(-15deg)';\n// MathLive's `∥` has hairline bars next to the radical sign and the other keys, so\n// they are thickened with a text stroke and stretched a little taller.\nconst SLANTED_STROKE = '0.03em currentColor';\nconst SLANTED_SCALE_Y = 1.25;\n\n// The `color.*()` helpers must be called lazily, inside the styled callback.\n// Evaluating them in a plain object literal runs them at module load, which\n// breaks any consumer that mocks a subset of @pie-lib/render-ui.\nconst LabelHolder = styled('span', { shouldForwardProp: (prop) => prop !== 'slanted' })(({ slanted }) => ({\n ...(slanted && {\n transform: `${SLANT} scaleY(${SLANTED_SCALE_Y})`,\n '& *': { WebkitTextStroke: SLANTED_STROKE },\n }),\n pointerEvents: 'none',\n textTransform: 'none',\n color: color.text(),\n // Deliberately inline-block, NOT inline-flex: MathLive's markup relies on\n // normal inline flow. Making its spans flex items collapses their width, and\n // stretchy accents render an <svg width=\"100%\" preserveAspectRatio=\"none\">\n // that then squeezes into a spike instead of spanning the content.\n display: 'inline-block',\n textAlign: 'center',\n lineHeight: 1,\n // Keep a label from sizing its grid column. `overflow: hidden` also collapses\n // the label's min-content contribution, so a wide accent cannot drag the\n // column across the screen. The svg's own positioning is left to\n // mathlive-static.css (injected by the package) - duplicating it here broke\n // the accent's containing block.\n maxWidth: '100%',\n overflow: 'hidden',\n // Answer-block / empty-slot boxes inside a label.\n '& .ML__placeholder': {\n backgroundColor: color.keypadEmptyPlaceholder ? color.keypadEmptyPlaceholder() : undefined,\n },\n // The stand-in glyph for an empty argument slot (see EMPTY_SLOT). Muted so it\n // reads as \"a slot goes here\" rather than as part of the symbol, matching how\n // MathQuill shaded `.mq-empty`.\n '& [data-pie-empty]': {\n opacity: 0.5,\n },\n // A readable index on the nth-root key. Carried by the label itself, not only\n // by the keypad container, so it holds wherever a LatexLabel is mounted.\n ...rootIndexStyles,\n}));\n\nexport class LatexLabel extends React.Component {\n static propTypes = {\n latex: PropTypes.string.isRequired,\n };\n\n constructor(props) {\n super(props);\n this.state = { markup: latexToMarkup(props.latex) };\n }\n\n async componentDidMount() {\n // MathLive may not have finished loading when the keypad first mounts.\n if (this.state.markup) {\n return;\n }\n\n await loadMathLive();\n\n if (this.unmounted) {\n return;\n }\n\n const markup = latexToMarkup(this.props.latex);\n\n if (markup) {\n this.setState({ markup });\n return;\n }\n\n // Still nothing: the engine is genuinely unavailable (a missing chunk, a\n // blocked request). Keep the raw-latex fallback visible rather than an\n // empty button, and log once so this is diagnosable.\n if (!LatexLabel.warned) {\n LatexLabel.warned = true;\n log('MathLive unavailable - keypad labels are falling back to raw latex');\n }\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.latex !== this.props.latex) {\n this.setState({ markup: latexToMarkup(this.props.latex) });\n }\n }\n\n componentWillUnmount() {\n this.unmounted = true;\n }\n\n render() {\n const { markup } = this.state;\n\n // Fall back to the raw latex so a button is never blank.\n return markup ? (\n // eslint-disable-next-line react/no-danger\n <LabelHolder slanted={SLANTED_LABELS.includes(this.props.latex)} dangerouslySetInnerHTML={{ __html: markup }} />\n ) : (\n <LabelHolder slanted={SLANTED_LABELS.includes(this.props.latex)}>{this.props.latex}</LabelHolder>\n );\n }\n}\n\nconst createCustomLayout = (layoutObj) => {\n if (layoutObj) {\n return {\n gridTemplateColumns: `repeat(${layoutObj.columns}, minmax(min-content, 150px))`,\n gridTemplateRows: `repeat(${layoutObj.rows}, minmax(40px, 60px))`,\n gridAutoFlow: 'initial',\n };\n }\n\n return {};\n};\n\nconst KeyPadContainer = styled('div')(() => ({\n ...commonKeyboardStyles,\n width: '100%',\n display: 'grid',\n gridTemplateRows: 'repeat(5, minmax(40px, 60px))',\n gridRowGap: '0px',\n gridColumnGap: '0px',\n gridAutoFlow: 'column',\n '&.character': {\n textTransform: 'initial !important',\n gridTemplateRows: 'repeat(5, minmax(40px, 50px)) !important',\n },\n '&.language': {\n gridTemplateRows: 'repeat(4, minmax(40px, 50px)) !important',\n '& *': {\n fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important',\n },\n },\n}));\n\nconst buttonBackground = (category) => ({\n backgroundColor: category === 'operators' ? color.keypadButtonOperator() : color.keypadButton(),\n '&:hover': {\n backgroundColor: category === 'operators' ? color.keypadButtonOperatorHover() : color.keypadButtonHover(),\n },\n});\n\nconst StyledButton = styled(Button)(({ category, isDelete, isComma, isDot }) => ({\n minWidth: 'auto',\n textTransform: 'none',\n fontSize: isComma || isDot ? '200% !important' : '140% !important',\n lineHeight: isComma || isDot ? '100%' : 'normal',\n color: color.text(),\n ...buttonBackground(category),\n borderRadius: 0,\n ...(isDelete && {\n fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important',\n }),\n}));\n\nconst StyledLatexButtonWrapper = styled(Button)(({ category }) => ({\n textTransform: 'none',\n padding: 0,\n margin: 0,\n fontSize: '110% !important',\n minWidth: 'auto',\n borderRadius: 0,\n ...buttonBackground(category),\n}));\n\nconst StyledIconButton = styled(IconButton)(({ category }) => ({\n minWidth: 'auto',\n ...buttonBackground(category),\n borderRadius: 0,\n '& .icon': {\n height: '30px',\n },\n}));\n\nexport class KeyPad extends React.Component {\n static propTypes = {\n className: PropTypes.string,\n controlledKeypadMode: PropTypes.bool,\n baseSet: PropTypes.array,\n additionalKeys: PropTypes.array,\n layoutForKeyPad: PropTypes.object,\n onPress: PropTypes.func.isRequired,\n onFocus: PropTypes.func,\n noDecimal: PropTypes.bool,\n setKeypadInteraction: PropTypes.func,\n mode: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n };\n\n static defaultProps = {\n baseSet: baseSet,\n noDecimal: false,\n };\n\n constructor(props) {\n super(props);\n this.keypadRef = React.createRef();\n }\n\n componentDidMount() {\n // Ensure MathLive is available for the LaTeX labels.\n loadMathLive();\n\n const keyPadElement = this.keypadRef?.current;\n const mainContainer = keyPadElement?.closest('.main-container');\n const currentToolbar = keyPadElement?.closest('.pie-toolbar');\n\n // need only for math keyboard so we need also controlledKeypadMode\n if (this.props.controlledKeypadMode && mainContainer && currentToolbar) {\n const mainContainerPosition = mainContainer.getBoundingClientRect();\n const currentToolbarPosition = currentToolbar.getBoundingClientRect();\n const difference =\n mainContainerPosition.top +\n mainContainerPosition.height -\n (currentToolbarPosition.top + currentToolbarPosition.height);\n\n if (difference < 0) {\n const totalHeight = mainContainerPosition.height + mainContainerPosition.top - difference;\n\n mainContainer.style.height = `${totalHeight}px`;\n }\n }\n\n if (keyPadElement) {\n keyPadElement.addEventListener('touchstart', this.handleKeypadInteraction, true);\n keyPadElement.addEventListener('mousedown', this.handleKeypadInteraction, true);\n }\n }\n\n componentWillUnmount() {\n const keyPadElement = this.keypadRef?.current;\n\n if (this.props.controlledKeypadMode && keyPadElement) {\n const mainContainer = keyPadElement.closest('.main-container');\n\n if (mainContainer) {\n mainContainer.style.height = 'unset';\n }\n }\n\n if (keyPadElement) {\n keyPadElement.removeEventListener('touchstart', this.handleKeypadInteraction, true);\n keyPadElement.removeEventListener('mousedown', this.handleKeypadInteraction, true);\n }\n }\n\n handleKeypadInteraction = () => {\n if (this.props.setKeypadInteraction) {\n this.props.setKeypadInteraction(true);\n }\n };\n\n buttonClick = (key) => {\n log('[buttonClick]', key);\n this.props.onPress(key);\n };\n\n flowKeys = (base, extras) => flatten([...sortKeys(base), ...sortKeys(extras)]);\n\n keyIsNotAllowed = (key) => {\n const { noDecimal } = this.props;\n\n return !!(((key.write === '.' && key.label === '.') || (key.write === ',' && key.label === ',')) && noDecimal);\n };\n\n render() {\n const { className, baseSet: base, additionalKeys, layoutForKeyPad, onFocus, mode } = this.props;\n\n const noBaseSet = ['non-negative-integers', 'integers', 'decimals', 'fractions', 'item-authoring', 'language'];\n const keysWithoutBaseSet = noBaseSet.includes(mode);\n const allKeys = keysWithoutBaseSet\n ? this.flowKeys([], additionalKeys || [])\n : this.flowKeys(base, additionalKeys || []);\n\n const shift = allKeys.length % 5 ? 1 : 0;\n const style = {\n gridTemplateColumns: `repeat(${Math.floor(allKeys.length / 5) + shift}, minmax(min-content, 150px))`,\n ...createCustomLayout(layoutForKeyPad),\n };\n\n return (\n <KeyPadContainer\n ref={this.keypadRef}\n className={[className, mode].filter(Boolean).join(' ')}\n style={style}\n onFocus={onFocus}\n >\n {allKeys.map((k, index) => {\n if (!k) {\n return <span key={`empty-${index}`} />;\n }\n\n const key = `${k.label || k.latex || k.command}-${index}`;\n const category = !keysWithoutBaseSet ? k.category : undefined;\n const extra = { ...(k.actions || {}), ...(k.extraProps || {}) };\n const onClick = this.buttonClick.bind(this, k);\n const disabled = this.keyIsNotAllowed(k);\n const ariaLabel = k.ariaLabel ? k.ariaLabel : k.name || k.label;\n\n if (k.latex) {\n return (\n <StyledLatexButtonWrapper\n key={key}\n onClick={onClick}\n disabled={disabled}\n category={category}\n aria-label={ariaLabel}\n {...extra}\n >\n <LatexLabel latex={k.latex} />\n </StyledLatexButtonWrapper>\n );\n }\n\n if (k.label) {\n return (\n <StyledButton\n key={key}\n onClick={onClick}\n disabled={disabled}\n category={category}\n isDelete={k.label === '⌫'}\n isComma={k.label === ','}\n isDot={k.label === '.'}\n aria-label={ariaLabel}\n {...extra}\n >\n {k.label}\n </StyledButton>\n );\n }\n\n const Icon = k.icon ? k.icon : 'div';\n\n return (\n <StyledIconButton\n key={key}\n tabIndex={'-1'}\n onClick={onClick}\n disabled={disabled}\n category={category}\n size=\"large\"\n {...extra}\n >\n <Icon className=\"icon\" />\n </StyledIconButton>\n );\n })}\n </KeyPadContainer>\n );\n }\n}\n\nexport default KeyPad;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_react","_interopRequireDefault","require","_propTypes","_Button","_IconButton","_styles","_debug","_lodashEs","_renderUi","_keys","_keysLayout","_commonStyles","_mathliveInstance","_longdiv","_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","SLANTED_LABELS","SLANT","SLANTED_STROKE","SLANTED_SCALE_Y","LabelHolder","styled","shouldForwardProp","prop","_ref","slanted","transform","concat","WebkitTextStroke","pointerEvents","textTransform","color","text","display","textAlign","lineHeight","maxWidth","overflow","backgroundColor","keypadEmptyPlaceholder","undefined","opacity","paddingTop","position","top","rootIndexStyles","LatexLabel","exports","_React$Component","props","_this","_classCallCheck2","state","markup","latexToMarkup","latex","labelRef","React","createRef","_inherits2","_createClass2","key","value","_componentDidMount","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_context","prev","next","fixLongDivisionWhenReady","current","abrupt","loadMathLive","unmounted","setState","warned","stop","componentDidMount","componentDidUpdate","prevProps","prevState","componentWillUnmount","render","createElement","ref","includes","dangerouslySetInnerHTML","__html","Component","PropTypes","string","isRequired","createCustomLayout","layoutObj","gridTemplateColumns","columns","gridTemplateRows","rows","gridAutoFlow","KeyPadContainer","commonKeyboardStyles","width","gridRowGap","gridColumnGap","fontFamily","buttonBackground","category","keypadButtonOperator","keypadButton","keypadButtonOperatorHover","keypadButtonHover","StyledButton","Button","_ref2","isDelete","isComma","isDot","minWidth","fontSize","borderRadius","StyledLatexButtonWrapper","_ref3","padding","margin","StyledIconButton","IconButton","_ref4","height","KeyPad","_React$Component2","_this2","setKeypadInteraction","onPress","base","extras","flatten","_toConsumableArray2","sortKeys","noDecimal","write","label","keypadRef","_this$keypadRef","keyPadElement","mainContainer","closest","currentToolbar","controlledKeypadMode","mainContainerPosition","getBoundingClientRect","currentToolbarPosition","difference","totalHeight","style","addEventListener","handleKeypadInteraction","_this$keypadRef2","removeEventListener","_this3","_this$props","className","baseSet","additionalKeys","layoutForKeyPad","onFocus","mode","noBaseSet","keysWithoutBaseSet","allKeys","flowKeys","shift","Math","floor","join","map","k","index","command","extra","actions","extraProps","onClick","buttonClick","bind","disabled","keyIsNotAllowed","ariaLabel","name","_extends2","Icon","icon","tabIndex","size","bool","array","object","func","oneOfType","number","_default"],"sources":["../../src/keypad/index.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport { styled } from '@mui/material/styles';\nimport debug from 'debug';\nimport { flatten } from 'lodash-es';\nimport { color } from '@pie-lib/render-ui';\n\nimport { baseSet } from '../keys';\nimport { sortKeys } from './keys-layout';\nimport { commonKeyboardStyles, rootIndexStyles } from '../mf/common-styles';\nimport { loadMathLive, latexToMarkup } from '../mathlive-instance';\nimport { fixLongDivisionWhenReady } from '../longdiv';\n\nconst log = debug('pie-lib:math-input-mathlive:keypad');\n\n/**\n * A LaTeX keypad label.\n *\n * The MathQuill implementation rendered every LaTeX label as its own\n * `MQ.StaticMath` instance. Here each label is static HTML produced once by\n * `convertLatexToMarkup`, so a 40-key keypad no longer creates 40 live math\n * instances.\n */\n// Labels that the legacy keypad drew slanted. MathQuill styled `\\parallel` as\n// italic, which slants the two bars; MathLive draws it upright. A skew is used\n// rather than `font-style: italic` so the slant does not depend on the font\n// having an italic face for this glyph.\nconst SLANTED_LABELS = ['\\\\parallel'];\nconst SLANT = 'skewX(-15deg)';\n// MathLive's `∥` has hairline bars next to the radical sign and the other keys, so\n// they are thickened with a text stroke and stretched a little taller.\nconst SLANTED_STROKE = '0.03em currentColor';\nconst SLANTED_SCALE_Y = 1.25;\n\n// The `color.*()` helpers must be called lazily, inside the styled callback.\n// Evaluating them in a plain object literal runs them at module load, which\n// breaks any consumer that mocks a subset of @pie-lib/render-ui.\nconst LabelHolder = styled('span', { shouldForwardProp: (prop) => prop !== 'slanted' })(({ slanted }) => ({\n ...(slanted && {\n transform: `${SLANT} scaleY(${SLANTED_SCALE_Y})`,\n '& *': { WebkitTextStroke: SLANTED_STROKE },\n }),\n pointerEvents: 'none',\n textTransform: 'none',\n color: color.text(),\n // Deliberately inline-block, NOT inline-flex: MathLive's markup relies on\n // normal inline flow. Making its spans flex items collapses their width, and\n // stretchy accents render an <svg width=\"100%\" preserveAspectRatio=\"none\">\n // that then squeezes into a spike instead of spanning the content.\n display: 'inline-block',\n textAlign: 'center',\n lineHeight: 1,\n // Keep a label from sizing its grid column. `overflow: hidden` also collapses\n // the label's min-content contribution, so a wide accent cannot drag the\n // column across the screen. The svg's own positioning is left to\n // mathlive-static.css (injected by the package) - duplicating it here broke\n // the accent's containing block.\n maxWidth: '100%',\n overflow: 'hidden',\n // Answer-block / empty-slot boxes inside a label.\n '& .ML__placeholder': {\n backgroundColor: color.keypadEmptyPlaceholder ? color.keypadEmptyPlaceholder() : undefined,\n },\n // The stand-in glyph for an empty argument slot (see EMPTY_SLOT). Muted so it\n // reads as \"a slot goes here\" rather than as part of the symbol, matching how\n // MathQuill shaded `.mq-empty`.\n '& [data-pie-empty]': {\n opacity: 0.5,\n },\n // A fraction is taller than the label's 1em line box, so its numerator sat\n // flush against (and was clipped by) the top edge. Extra room above it grows\n // the box, which the keypad then centres, so the fraction moves down a little.\n '&:has(.ML__mfrac)': {\n paddingTop: '0.25em',\n },\n // Centre a fraction's bar between its empty slots (see `placeholderStyles`).\n '& .ML__mfrac:has([data-pie-empty]) .ML__frac-line': {\n position: 'relative',\n top: '0.16em',\n },\n // A real numerator (`x`) is lighter than an empty box and its ink ends at the\n // baseline, so the full drop overshoots: it needs a smaller drop. The numerator is\n // the second `.ML__center` (MathLive emits the denominator first).\n '& .ML__mfrac:has([data-pie-empty]):not(:has(.ML__center ~ .ML__center [data-pie-empty])) .ML__frac-line': {\n top: '0.13em',\n },\n // Same for a mixed number (`x` then the fraction): the leading `x` is a sibling\n // of the fraction, which a lone `\\frac{}{}` does not have.\n '& .ML__mfrac:has([data-pie-empty]):not(:only-child) .ML__frac-line': {\n top: '0.13em',\n },\n // A readable index on the nth-root key. Carried by the label itself, not only\n // by the keypad container, so it holds wherever a LatexLabel is mounted.\n ...rootIndexStyles,\n}));\n\nexport class LatexLabel extends React.Component {\n static propTypes = {\n latex: PropTypes.string.isRequired,\n };\n\n constructor(props) {\n super(props);\n this.state = { markup: latexToMarkup(props.latex) };\n this.labelRef = React.createRef();\n }\n\n async componentDidMount() {\n // MathLive may not have finished loading when the keypad first mounts.\n if (this.state.markup) {\n // The long-division key's label needs MathLive's drawing corrected.\n fixLongDivisionWhenReady(this.labelRef.current);\n return;\n }\n\n await loadMathLive();\n\n if (this.unmounted) {\n return;\n }\n\n const markup = latexToMarkup(this.props.latex);\n\n if (markup) {\n this.setState({ markup });\n return;\n }\n\n // Still nothing: the engine is genuinely unavailable (a missing chunk, a\n // blocked request). Keep the raw-latex fallback visible rather than an\n // empty button, and log once so this is diagnosable.\n if (!LatexLabel.warned) {\n LatexLabel.warned = true;\n log('MathLive unavailable - keypad labels are falling back to raw latex');\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.latex !== this.props.latex) {\n this.setState({ markup: latexToMarkup(this.props.latex) });\n }\n\n if (this.state.markup !== (prevState && prevState.markup)) {\n fixLongDivisionWhenReady(this.labelRef.current);\n }\n }\n\n componentWillUnmount() {\n this.unmounted = true;\n }\n\n render() {\n const { markup } = this.state;\n\n // Fall back to the raw latex so a button is never blank.\n return markup ? (\n // eslint-disable-next-line react/no-danger\n <LabelHolder\n ref={this.labelRef}\n slanted={SLANTED_LABELS.includes(this.props.latex)}\n dangerouslySetInnerHTML={{ __html: markup }}\n />\n ) : (\n <LabelHolder slanted={SLANTED_LABELS.includes(this.props.latex)}>{this.props.latex}</LabelHolder>\n );\n }\n}\n\nconst createCustomLayout = (layoutObj) => {\n if (layoutObj) {\n return {\n gridTemplateColumns: `repeat(${layoutObj.columns}, minmax(min-content, 150px))`,\n gridTemplateRows: `repeat(${layoutObj.rows}, minmax(40px, 60px))`,\n gridAutoFlow: 'initial',\n };\n }\n\n return {};\n};\n\nconst KeyPadContainer = styled('div')(() => ({\n ...commonKeyboardStyles,\n width: '100%',\n display: 'grid',\n gridTemplateRows: 'repeat(5, minmax(40px, 60px))',\n gridRowGap: '0px',\n gridColumnGap: '0px',\n gridAutoFlow: 'column',\n '&.character': {\n textTransform: 'initial !important',\n gridTemplateRows: 'repeat(5, minmax(40px, 50px)) !important',\n },\n '&.language': {\n gridTemplateRows: 'repeat(4, minmax(40px, 50px)) !important',\n '& *': {\n fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important',\n },\n },\n}));\n\nconst buttonBackground = (category) => ({\n backgroundColor: category === 'operators' ? color.keypadButtonOperator() : color.keypadButton(),\n '&:hover': {\n backgroundColor: category === 'operators' ? color.keypadButtonOperatorHover() : color.keypadButtonHover(),\n },\n});\n\nconst StyledButton = styled(Button)(({ category, isDelete, isComma, isDot }) => ({\n minWidth: 'auto',\n textTransform: 'none',\n fontSize: isComma || isDot ? '200% !important' : '140% !important',\n lineHeight: isComma || isDot ? '100%' : 'normal',\n color: color.text(),\n ...buttonBackground(category),\n borderRadius: 0,\n ...(isDelete && {\n fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important',\n }),\n}));\n\nconst StyledLatexButtonWrapper = styled(Button)(({ category }) => ({\n textTransform: 'none',\n padding: 0,\n margin: 0,\n fontSize: '110% !important',\n minWidth: 'auto',\n borderRadius: 0,\n ...buttonBackground(category),\n}));\n\nconst StyledIconButton = styled(IconButton)(({ category }) => ({\n minWidth: 'auto',\n ...buttonBackground(category),\n borderRadius: 0,\n '& .icon': {\n height: '30px',\n },\n}));\n\nexport class KeyPad extends React.Component {\n static propTypes = {\n className: PropTypes.string,\n controlledKeypadMode: PropTypes.bool,\n baseSet: PropTypes.array,\n additionalKeys: PropTypes.array,\n layoutForKeyPad: PropTypes.object,\n onPress: PropTypes.func.isRequired,\n onFocus: PropTypes.func,\n noDecimal: PropTypes.bool,\n setKeypadInteraction: PropTypes.func,\n mode: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n };\n\n static defaultProps = {\n baseSet: baseSet,\n noDecimal: false,\n };\n\n constructor(props) {\n super(props);\n this.keypadRef = React.createRef();\n }\n\n componentDidMount() {\n // Ensure MathLive is available for the LaTeX labels.\n loadMathLive();\n\n const keyPadElement = this.keypadRef?.current;\n const mainContainer = keyPadElement?.closest('.main-container');\n const currentToolbar = keyPadElement?.closest('.pie-toolbar');\n\n // need only for math keyboard so we need also controlledKeypadMode\n if (this.props.controlledKeypadMode && mainContainer && currentToolbar) {\n const mainContainerPosition = mainContainer.getBoundingClientRect();\n const currentToolbarPosition = currentToolbar.getBoundingClientRect();\n const difference =\n mainContainerPosition.top +\n mainContainerPosition.height -\n (currentToolbarPosition.top + currentToolbarPosition.height);\n\n if (difference < 0) {\n const totalHeight = mainContainerPosition.height + mainContainerPosition.top - difference;\n\n mainContainer.style.height = `${totalHeight}px`;\n }\n }\n\n if (keyPadElement) {\n keyPadElement.addEventListener('touchstart', this.handleKeypadInteraction, true);\n keyPadElement.addEventListener('mousedown', this.handleKeypadInteraction, true);\n }\n }\n\n componentWillUnmount() {\n const keyPadElement = this.keypadRef?.current;\n\n if (this.props.controlledKeypadMode && keyPadElement) {\n const mainContainer = keyPadElement.closest('.main-container');\n\n if (mainContainer) {\n mainContainer.style.height = 'unset';\n }\n }\n\n if (keyPadElement) {\n keyPadElement.removeEventListener('touchstart', this.handleKeypadInteraction, true);\n keyPadElement.removeEventListener('mousedown', this.handleKeypadInteraction, true);\n }\n }\n\n handleKeypadInteraction = () => {\n if (this.props.setKeypadInteraction) {\n this.props.setKeypadInteraction(true);\n }\n };\n\n buttonClick = (key) => {\n log('[buttonClick]', key);\n this.props.onPress(key);\n };\n\n flowKeys = (base, extras) => flatten([...sortKeys(base), ...sortKeys(extras)]);\n\n keyIsNotAllowed = (key) => {\n const { noDecimal } = this.props;\n\n return !!(((key.write === '.' && key.label === '.') || (key.write === ',' && key.label === ',')) && noDecimal);\n };\n\n render() {\n const { className, baseSet: base, additionalKeys, layoutForKeyPad, onFocus, mode } = this.props;\n\n const noBaseSet = ['non-negative-integers', 'integers', 'decimals', 'fractions', 'item-authoring', 'language'];\n const keysWithoutBaseSet = noBaseSet.includes(mode);\n const allKeys = keysWithoutBaseSet\n ? this.flowKeys([], additionalKeys || [])\n : this.flowKeys(base, additionalKeys || []);\n\n const shift = allKeys.length % 5 ? 1 : 0;\n const style = {\n gridTemplateColumns: `repeat(${Math.floor(allKeys.length / 5) + shift}, minmax(min-content, 150px))`,\n ...createCustomLayout(layoutForKeyPad),\n };\n\n return (\n <KeyPadContainer\n ref={this.keypadRef}\n className={[className, mode].filter(Boolean).join(' ')}\n style={style}\n onFocus={onFocus}\n >\n {allKeys.map((k, index) => {\n if (!k) {\n return <span key={`empty-${index}`} />;\n }\n\n const key = `${k.label || k.latex || k.command}-${index}`;\n const category = !keysWithoutBaseSet ? k.category : undefined;\n const extra = { ...(k.actions || {}), ...(k.extraProps || {}) };\n const onClick = this.buttonClick.bind(this, k);\n const disabled = this.keyIsNotAllowed(k);\n const ariaLabel = k.ariaLabel ? k.ariaLabel : k.name || k.label;\n\n if (k.latex) {\n return (\n <StyledLatexButtonWrapper\n key={key}\n onClick={onClick}\n disabled={disabled}\n category={category}\n aria-label={ariaLabel}\n {...extra}\n >\n <LatexLabel latex={k.latex} />\n </StyledLatexButtonWrapper>\n );\n }\n\n if (k.label) {\n return (\n <StyledButton\n key={key}\n onClick={onClick}\n disabled={disabled}\n category={category}\n isDelete={k.label === '⌫'}\n isComma={k.label === ','}\n isDot={k.label === '.'}\n aria-label={ariaLabel}\n {...extra}\n >\n {k.label}\n </StyledButton>\n );\n }\n\n const Icon = k.icon ? k.icon : 'div';\n\n return (\n <StyledIconButton\n key={key}\n tabIndex={'-1'}\n onClick={onClick}\n disabled={disabled}\n category={category}\n size=\"large\"\n {...extra}\n >\n <Icon className=\"icon\" />\n </StyledIconButton>\n );\n })}\n </KeyPadContainer>\n );\n }\n}\n\nexport default KeyPad;\n"],"mappings":"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","ignoreList":[]}
|
package/lib/latex-bridge.js
CHANGED
|
@@ -75,6 +75,18 @@ var DEFAULT_FIELD_ID = exports.DEFAULT_FIELD_ID = 'r1';
|
|
|
75
75
|
*/
|
|
76
76
|
var EMPTY_SLOT = '\\htmlData{pie-empty=1}{\\rule{0.55em}{0.55em}}';
|
|
77
77
|
var EMPTY_GROUP_REGEX = /\{\s*\}/g;
|
|
78
|
+
// The smallest boxes are the ones in a subscript (`x_{}`, `\log_{}`) or exponent
|
|
79
|
+
// (`x^{}`): they sit at script size, so the 0.55em square reads cramped. They get
|
|
80
|
+
// 0.4em more height, and `\rule[-d]` decides which side it grows on:
|
|
81
|
+
// - subscript / log base: all of it goes below, the top edge stays put;
|
|
82
|
+
// - exponent: 0.3em goes above, plus 0.1em below.
|
|
83
|
+
var EMPTY_SUBSCRIPT_REGEX = /_\{\s*\}/g;
|
|
84
|
+
var EMPTY_SUPERSCRIPT_REGEX = /\^\{\s*\}/g;
|
|
85
|
+
var EMPTY_SUBSCRIPT_SLOT = '\\htmlData{pie-empty=1}{\\rule[-0.4em]{0.55em}{0.95em}}';
|
|
86
|
+
// The label clips what hangs below its line box (`overflow: hidden`), so the lowered
|
|
87
|
+
// box needs a zero-width strut after it to make room, or its bottom is cut off.
|
|
88
|
+
var EMPTY_SUBSCRIPT_STRUT = '\\rule[-0.5em]{0em}{0.5em}';
|
|
89
|
+
var EMPTY_SUPERSCRIPT_SLOT = '\\htmlData{pie-empty=1}{\\rule[-0.1em]{0.55em}{0.95em}}';
|
|
78
90
|
// The segment key (`\overline{}`). The keypad centres every label in its cell, and
|
|
79
91
|
// a thin bar is a much shorter label than the ray and line keys' stretchy arrows,
|
|
80
92
|
// so by default both its bar and its box sit off from theirs: the bar is lower
|
|
@@ -115,7 +127,7 @@ var EMPTY_FENCE_SLOT = '\\rule{0em}{1em}\\htmlData{pie-empty=1}{\\rule[-0.25em]{
|
|
|
115
127
|
* @returns {string}
|
|
116
128
|
*/
|
|
117
129
|
var withVisibleEmptySlots = exports.withVisibleEmptySlots = function withVisibleEmptySlots(latex) {
|
|
118
|
-
return (latex || '').replace(EMPTY_OVERLINE_REGEX, "".concat(EMPTY_OVERLINE_LABEL_STRUT, "\\overline{").concat(EMPTY_OVERLINE_BAR_STRUT).concat(EMPTY_SLOT, "}")).replace(EMPTY_GROUP_REGEX, "{".concat(EMPTY_SLOT, "}")).replace(EMPTY_FENCE_REGEX, function (_m, open, close) {
|
|
130
|
+
return (latex || '').replace(EMPTY_OVERLINE_REGEX, "".concat(EMPTY_OVERLINE_LABEL_STRUT, "\\overline{").concat(EMPTY_OVERLINE_BAR_STRUT).concat(EMPTY_SLOT, "}")).replace(EMPTY_SUBSCRIPT_REGEX, "_{".concat(EMPTY_SUBSCRIPT_SLOT, "}").concat(EMPTY_SUBSCRIPT_STRUT)).replace(EMPTY_SUPERSCRIPT_REGEX, "^{".concat(EMPTY_SUPERSCRIPT_SLOT, "}")).replace(EMPTY_GROUP_REGEX, "{".concat(EMPTY_SLOT, "}")).replace(EMPTY_FENCE_REGEX, function (_m, open, close) {
|
|
119
131
|
return "\\left".concat(open).concat(EMPTY_FENCE_SLOT, "\\right").concat(close);
|
|
120
132
|
});
|
|
121
133
|
};
|
|
@@ -512,4 +524,7 @@ var keyToAction = exports.keyToAction = function keyToAction(key) {
|
|
|
512
524
|
}
|
|
513
525
|
return undefined;
|
|
514
526
|
};
|
|
527
|
+
// TEMP: remove once confirmed that pie-elements picks up this build.
|
|
528
|
+
// eslint-disable-next-line no-console
|
|
529
|
+
console.log('[math-input-mathlive] latex-bridge loaded - taller sub/sup slots (PIE-1135 v2)');
|
|
515
530
|
//# sourceMappingURL=latex-bridge.js.map
|