@khanacademy/perseus 11.6.0 → 12.0.0

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 (36) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/components/math-input.d.ts +38 -11
  3. package/dist/components/tex-buttons.d.ts +2 -1
  4. package/dist/es/index.css +5 -6
  5. package/dist/es/index.js +1454 -1371
  6. package/dist/es/index.js.map +1 -1
  7. package/dist/index.css +5 -6
  8. package/dist/index.d.ts +2 -8
  9. package/dist/index.js +1475 -1390
  10. package/dist/index.js.map +1 -1
  11. package/dist/item-renderer.d.ts +3 -0
  12. package/dist/perseus-types.d.ts +2 -1
  13. package/dist/perseus-version.d.ts +8 -0
  14. package/dist/strings.js +3 -0
  15. package/dist/version.d.ts +1 -11
  16. package/dist/widgets/expression.d.ts +15 -14
  17. package/package.json +9 -9
  18. package/src/__tests__/mock-asset-loading-widget.tsx +1 -2
  19. package/src/components/__stories__/graphie.stories.tsx +2 -2
  20. package/src/components/__stories__/math-input.stories.tsx +17 -4
  21. package/src/components/__tests__/math-input.test.tsx +95 -8
  22. package/src/components/math-input.tsx +274 -96
  23. package/src/components/tex-buttons.tsx +2 -2
  24. package/src/index.ts +2 -5
  25. package/src/item-renderer.tsx +3 -0
  26. package/src/item-version.ts +2 -2
  27. package/src/perseus-types.ts +11 -1
  28. package/src/perseus-version.ts +9 -0
  29. package/src/styles/perseus-renderer.less +5 -6
  30. package/src/styles/widgets/expression.less +0 -6
  31. package/src/version.ts +9 -10
  32. package/src/widgets/__stories__/expression.stories.tsx +24 -13
  33. package/src/widgets/__tests__/expression.test.tsx +4 -77
  34. package/src/widgets/expression.tsx +99 -94
  35. package/tsconfig-build.json +1 -0
  36. package/tsconfig-build.tsbuildinfo +1 -1
package/dist/es/index.js CHANGED
@@ -1,45 +1,35 @@
1
1
  import * as KAS from '@khanacademy/kas';
2
- import { keyTranslator, createMathField, mathQuillInstance, KeypadInput, KeypadType, keypadElementPropType, MobileKeypad } from '@khanacademy/math-input';
2
+ import { keyTranslator, CursorContext, createMathField, mathQuillInstance, getCursorContext, DesktopKeypad, KeypadInput, KeypadType, KeyArray, keypadElementPropType, MobileKeypad } from '@khanacademy/math-input';
3
3
  import * as PerseusLinter from '@khanacademy/perseus-linter';
4
4
  import { linterContextDefault, Rule, linterContextProps } from '@khanacademy/perseus-linter';
5
+ import { View, RenderStateRoot, Text } from '@khanacademy/wonder-blocks-core';
5
6
  import * as i18n from '@khanacademy/wonder-blocks-i18n';
7
+ import Tooltip$1 from '@khanacademy/wonder-blocks-tooltip';
6
8
  import classNames from 'classnames';
7
9
  import * as React from 'react';
8
10
  import { useState, useEffect, useRef } from 'react';
9
11
  import _, { debounce } from 'underscore';
12
+ import Clickable from '@khanacademy/wonder-blocks-clickable';
13
+ import Color, { fade } from '@khanacademy/wonder-blocks-color';
14
+ import { Popover, PopoverContentCore, PopoverContent } from '@khanacademy/wonder-blocks-popover';
15
+ import Spacing from '@khanacademy/wonder-blocks-spacing';
16
+ import { StyleSheet, css } from 'aphrodite';
10
17
  import $ from 'jquery';
18
+ import PropTypes from 'prop-types';
11
19
  import * as ReactDOM from 'react-dom';
12
20
  import ReactDOM__default from 'react-dom';
13
- import PropTypes from 'prop-types';
14
21
  import { number, point, vector as vector$1, line, ray } from '@khanacademy/kmath';
15
- import Spacing from '@khanacademy/wonder-blocks-spacing';
16
- import { StyleSheet, css } from 'aphrodite';
17
22
  import { CircularSpinner } from '@khanacademy/wonder-blocks-progress-spinner';
18
- import { RenderStateRoot, View, Text } from '@khanacademy/wonder-blocks-core';
19
23
  import SimpleMarkdown from '@khanacademy/simple-markdown';
20
24
  import { pureMarkdownRules } from '@khanacademy/pure-markdown';
21
25
  import { TextField } from '@khanacademy/wonder-blocks-form';
22
26
  import Button from '@khanacademy/wonder-blocks-button';
23
- import Clickable from '@khanacademy/wonder-blocks-clickable';
24
- import Color from '@khanacademy/wonder-blocks-color';
25
27
  import { Strut } from '@khanacademy/wonder-blocks-layout';
26
- import { Popover, PopoverContent, PopoverContentCore } from '@khanacademy/wonder-blocks-popover';
27
28
  import { OptionItem, SingleSelect } from '@khanacademy/wonder-blocks-dropdown';
28
29
  import debounce$1 from 'lodash.debounce';
29
30
  import createReactClass from 'create-react-class';
30
- import Tooltip$1 from '@khanacademy/wonder-blocks-tooltip';
31
31
  import Link from '@khanacademy/wonder-blocks-link';
32
-
33
- var version = {
34
- apiVersion: {
35
- major: 12,
36
- minor: 0
37
- },
38
- itemDataVersion: {
39
- major: 0,
40
- minor: 1
41
- }
42
- };
32
+ import { addLibraryVersionToPerseusDebug } from '@khanacademy/perseus-core';
43
33
 
44
34
  function _extends() {
45
35
  _extends = Object.assign || function (target) {
@@ -59,317 +49,6 @@ function _extends() {
59
49
  return _extends.apply(this, arguments);
60
50
  }
61
51
 
62
- /**
63
- * A stripped version of Icon.jsx from webapp. Takes an SVG icon and renders it
64
- * inline like Font Awesome did.
65
- *
66
- * If you are looking for an icon that we've used before you should look in
67
- * webapp's `icon-paths.js` which is a reference file for all the SVG paths
68
- * that we've used. You'll need to copy the object from that file into
69
- * whichever file you're using the icon and explicitly pass it in to the
70
- * <InlineIcon/> React component.
71
- *
72
- * We assume that the viewBox is cropped and aligned to (0, 0), but icons can
73
- * be defined differently. At some point we might want to add these attributes
74
- * to `icon-paths.js`, but for now this is a fairly safe assumption.
75
- *
76
- * Sample usage:
77
- *
78
- * const editIcon = {
79
- * path: "M41.209 53.753l5.39 0l0 5.39l3.136 0l6.468-6.517-8.477-8.526-6.517 6.517l0 3.136zm33.173-34.937q-.882-.882-1.862.049l-19.6 19.6q-.931.98-.049 1.862t1.862-.049l19.6-19.6q.931-.98.049-1.862zm-38.563 45.668l0-16.121l37.632-37.632 16.17 16.121-37.632 37.632l-16.17 0zm43.022-12.397l0 10.633q-.049 6.713-4.753 11.417t-11.368 4.704l-46.599 0q-6.713 0-11.417-4.753t-4.704-11.368l0-46.599q0-6.664 4.753-11.417t11.368-4.704l46.599 0q3.528 0 6.566 1.372.833.392.98 1.323t-.49 1.617l-2.744 2.744q-.784.784-1.96.441t-2.352-.343l-46.599 0q-3.675 0-6.321 2.646t-2.646 6.321l0 46.599q0 3.675 2.646 6.321t6.321 2.646l46.599 0q3.675 0 6.321-2.646t2.646-6.321l0-7.056q0-.735.49-1.225l3.577-3.577q.833-.833 1.96-.392t1.127 1.617zm7.203-51.646q2.254 0 3.773 1.568l8.526 8.526q1.568 1.568 1.568 3.822t-1.568 3.773l-5.145 5.145-16.121-16.121 5.145-5.145q1.568-1.568 3.822-1.568z",
80
- * width: 100,
81
- * height: 78.912,
82
- * };
83
- * <InlineIcon {...editIcon} />
84
- *
85
- */
86
- const InlineIcon = ({
87
- path,
88
- width,
89
- height,
90
- style: _style = {},
91
- title
92
- }) => /*#__PURE__*/React.createElement("svg", {
93
- role: "img",
94
- "aria-hidden": !title,
95
- style: _extends({
96
- verticalAlign: "middle"
97
- }, _style),
98
- width: `${width / height}em`,
99
- height: "1em",
100
- viewBox: `0 0 ${width} ${height}`
101
- }, !!title && /*#__PURE__*/React.createElement("title", null, title), /*#__PURE__*/React.createElement("path", {
102
- d: path,
103
- fill: "currentColor"
104
- }));
105
-
106
- let _dependencies = null;
107
- const setDependencies = dependencies => {
108
- _dependencies = dependencies;
109
- };
110
- const getDependencies = () => {
111
- if (_dependencies) {
112
- return _dependencies;
113
- }
114
- throw new Error(["Perseus has not been provided required dependencies.", "setDependencies(dependencies) must be called first.", "Make sure Perseus is being imported from javascript/perseus/perseus.js."].join("\n"));
115
- };
116
- const DependenciesContext = /*#__PURE__*/React.createContext({
117
- analytics: {
118
- onAnalyticsEvent: async () => {}
119
- }
120
- });
121
-
122
- /**
123
- * useDependencies provides easy access to the current Perseus dependencies.
124
- */
125
- const useDependencies = () => {
126
- const deps = React.useContext(DependenciesContext);
127
- return deps;
128
- };
129
-
130
- var dependencies = /*#__PURE__*/Object.freeze({
131
- __proto__: null,
132
- setDependencies: setDependencies,
133
- getDependencies: getDependencies,
134
- DependenciesContext: DependenciesContext,
135
- useDependencies: useDependencies
136
- });
137
-
138
- /* eslint-disable @khanacademy/ts-no-error-suppressions */
139
- const prettyBig = {
140
- fontSize: "150%"
141
- };
142
- const slightlyBig = {
143
- fontSize: "120%"
144
- };
145
- const symbStyle = {
146
- fontSize: "130%"
147
- };
148
- // These are functions because we want to generate a new component for each use
149
- // on the page rather than reusing an instance (which will cause an error).
150
- // Also, it's useful for things which might look different depending on the
151
- // props.
152
-
153
- const basic = [() => [/*#__PURE__*/React.createElement("span", {
154
- key: "plus",
155
- style: slightlyBig
156
- }, "+"), "PLUS", i18n._("Plus")], () => [/*#__PURE__*/React.createElement("span", {
157
- key: "minus",
158
- style: prettyBig
159
- }, "-"), "MINUS", i18n._("Minus")],
160
- // TODO(joel) - display as \cdot when appropriate
161
- props => {
162
- const {
163
- TeX
164
- } = getDependencies();
165
- if (props.convertDotToTimes) {
166
- return [/*#__PURE__*/React.createElement(TeX, {
167
- key: "times",
168
- style: prettyBig
169
- }, i18n.doNotTranslate("\\times")), "TIMES", i18n._("Multiply")];
170
- }
171
- return [/*#__PURE__*/React.createElement(TeX, {
172
- key: "times",
173
- style: prettyBig
174
- }, i18n.doNotTranslate("\\cdot")), "CDOT", i18n._("Multiply")];
175
- }, () => {
176
- const {
177
- TeX
178
- } = getDependencies();
179
- return [/*#__PURE__*/React.createElement(TeX, {
180
- key: "frac",
181
- style: prettyBig
182
- }, i18n.doNotTranslate("\\frac{x}{y}")), "FRAC", i18n._("Fraction, excluding the current expression")];
183
- }];
184
- const buttonSets = {
185
- basic,
186
- "basic+div": basic.concat([() => {
187
- const {
188
- TeX
189
- } = getDependencies();
190
- return [/*#__PURE__*/React.createElement(TeX, {
191
- key: "div"
192
- }, i18n.doNotTranslate("\\div")), "DIVIDE", i18n._("Divide")];
193
- }]),
194
- trig: [() => {
195
- const {
196
- TeX
197
- } = getDependencies();
198
- return [/*#__PURE__*/React.createElement(TeX, {
199
- key: "sin"
200
- }, i18n.doNotTranslate("\\sin")), "SIN", i18n._("Sine")];
201
- }, () => {
202
- const {
203
- TeX
204
- } = getDependencies();
205
- return [/*#__PURE__*/React.createElement(TeX, {
206
- key: "cos"
207
- }, i18n.doNotTranslate("\\cos")), "COS", i18n._("Cosine")];
208
- }, () => {
209
- const {
210
- TeX
211
- } = getDependencies();
212
- return [/*#__PURE__*/React.createElement(TeX, {
213
- key: "tan"
214
- }, i18n.doNotTranslate("\\tan")), "TAN", i18n._("Tangent")];
215
- }, () => {
216
- const {
217
- TeX
218
- } = getDependencies();
219
- return [/*#__PURE__*/React.createElement(TeX, {
220
- key: "theta",
221
- style: symbStyle
222
- }, i18n.doNotTranslate("\\theta")), "THETA", i18n._("Theta")];
223
- }, () => {
224
- const {
225
- TeX
226
- } = getDependencies();
227
- return [/*#__PURE__*/React.createElement("span", {
228
- key: "phi"
229
- }, /*#__PURE__*/React.createElement("span", {
230
- className: "perseus-sr-only"
231
- }, i18n.doNotTranslate("phi")), /*#__PURE__*/React.createElement(TeX, {
232
- key: "pi",
233
- style: symbStyle
234
- }, i18n.doNotTranslate("\\phi"))), "PHI", i18n._("Phi")];
235
- }],
236
- prealgebra: [() => {
237
- const {
238
- TeX
239
- } = getDependencies();
240
- return [/*#__PURE__*/React.createElement(TeX, {
241
- key: "sqrt"
242
- }, i18n.doNotTranslate("\\sqrt{x}")), "SQRT", i18n._("Square root")];
243
- },
244
- // TODO(joel) - how does desmos do this?
245
- () => {
246
- const {
247
- TeX
248
- } = getDependencies();
249
- return [/*#__PURE__*/React.createElement(TeX, {
250
- key: "nthroot"
251
- }, i18n.doNotTranslate("\\sqrt[3]{x}")), "NTHROOT3", i18n._("Cube root")];
252
- }, () => {
253
- const {
254
- TeX
255
- } = getDependencies();
256
- return [/*#__PURE__*/React.createElement(TeX, {
257
- key: "pow",
258
- style: slightlyBig
259
- }, i18n.doNotTranslate("a^b")), "POW", i18n._("Exponent")];
260
- }, () => {
261
- const {
262
- TeX
263
- } = getDependencies();
264
- return [/*#__PURE__*/React.createElement(TeX, {
265
- key: "pi",
266
- style: slightlyBig
267
- }, i18n.doNotTranslate("\\pi")), "PI", i18n._("Pi")];
268
- }],
269
- logarithms: [() => {
270
- const {
271
- TeX
272
- } = getDependencies();
273
- return [/*#__PURE__*/React.createElement(TeX, {
274
- key: "log"
275
- }, i18n.doNotTranslate("\\log")), "LOG", i18n._("Logarithm with base 10")];
276
- }, () => {
277
- const {
278
- TeX
279
- } = getDependencies();
280
- return [/*#__PURE__*/React.createElement(TeX, {
281
- key: "ln"
282
- }, i18n.doNotTranslate("\\ln")), "LN", i18n._("Natural logarithm")];
283
- }, () => {
284
- const {
285
- TeX
286
- } = getDependencies();
287
- return [/*#__PURE__*/React.createElement(TeX, {
288
- key: "log_b"
289
- }, i18n.doNotTranslate("\\log_b")), "LOG_B", i18n._("Logarithm with custom base")];
290
- }],
291
- "basic relations": [() => {
292
- const {
293
- TeX
294
- } = getDependencies();
295
- return [/*#__PURE__*/React.createElement(TeX, {
296
- key: "eq"
297
- }, "="), "EQUAL", i18n._("Equals sign")];
298
- }, () => {
299
- const {
300
- TeX
301
- } = getDependencies();
302
- return [/*#__PURE__*/React.createElement(TeX, {
303
- key: "lt"
304
- }, i18n.doNotTranslate("\\lt")), "LT", i18n._("Less than sign")];
305
- }, () => {
306
- const {
307
- TeX
308
- } = getDependencies();
309
- return [/*#__PURE__*/React.createElement(TeX, {
310
- key: "gt"
311
- }, i18n.doNotTranslate("\\gt")), "GT", i18n._("Greater than sign")];
312
- }],
313
- "advanced relations": [() => {
314
- const {
315
- TeX
316
- } = getDependencies();
317
- return [/*#__PURE__*/React.createElement(TeX, {
318
- key: "neq"
319
- }, i18n.doNotTranslate("\\neq")), "NEQ", i18n._("Not-equals sign")];
320
- }, () => {
321
- const {
322
- TeX
323
- } = getDependencies();
324
- return [/*#__PURE__*/React.createElement(TeX, {
325
- key: "leq"
326
- }, i18n.doNotTranslate("\\leq")), "LEQ", i18n._("Less than or equal to sign")];
327
- }, () => {
328
- const {
329
- TeX
330
- } = getDependencies();
331
- return [/*#__PURE__*/React.createElement(TeX, {
332
- key: "geq"
333
- }, i18n.doNotTranslate("\\geq")), "GEQ", i18n._("Greater than or equal to sign")];
334
- }]
335
- };
336
- const buttonSetsPropType = PropTypes.arrayOf(PropTypes.oneOf(_(buttonSets).keys()));
337
- class TexButtons extends React.Component {
338
- render() {
339
- // Always show buttonSets in the same order. Note: Technically it's ok
340
- // for _.keys() to return the keys in an arbitrary order, but in
341
- // practice, they will be ordered as listed above.
342
- const sortedButtonSets = _.sortBy(this.props.sets, setName =>
343
- // @ts-expect-error - TS2345 - Argument of type 'string | number' is not assignable to parameter of type 'string'.
344
- _.keys(buttonSets).indexOf(setName));
345
- const buttons = _(sortedButtonSets).map(setName => buttonSets[setName]);
346
- const buttonRows = _(buttons).map(row => row.map(symbGen => {
347
- // create a (component, thing we should send to mathquill) pair
348
- const symbol = symbGen(this.props);
349
- return /*#__PURE__*/React.createElement("button", {
350
- onClick: () => this.props.onInsert(symbol[1]),
351
- className: "tex-button"
352
- // @ts-expect-error - TS2533 - Object is possibly 'null' or 'undefined'. | TS2339 - Property 'key' does not exist on type 'boolean | ReactChild | ReactFragment | ReactPortal'.
353
- ,
354
- key: symbol[0].key,
355
- type: "button",
356
- "aria-label": symbol[2]
357
- }, symbol[0]);
358
- }));
359
- const buttonPopup = _(buttonRows).map((row, i) => {
360
- return /*#__PURE__*/React.createElement("div", {
361
- className: "clearfix tex-button-row",
362
- key: this.props.sets[i]
363
- }, row);
364
- });
365
- return /*#__PURE__*/React.createElement("div", {
366
- className: `${this.props.className || ""} preview-measure`
367
- }, buttonPopup);
368
- }
369
- }
370
- TexButtons.buttonSets = buttonSets;
371
- TexButtons.buttonSetsType = buttonSetsPropType;
372
-
373
52
  const customKeyTranslator = _extends({}, keyTranslator, {
374
53
  // If there's something in the input that can become part of a
375
54
  // fraction, typing "/" puts it in the numerator. If not, typing
@@ -391,57 +70,9 @@ class MathInput extends React.Component {
391
70
  this.__mathFieldWrapperRef = null;
392
71
  this.__mathField = null;
393
72
  this.state = {
394
- focused: false
395
- };
396
- this.handleFocus = () => {
397
- this.setState({
398
- focused: true
399
- });
400
- // TODO(joel) fix properly - we should probably allow onFocus handlers
401
- // to this property, but we need to work correctly with them.
402
- // if (this.props.onFocus) {
403
- // this.props.onFocus();
404
- // }
405
- };
406
- this.handleMouseDown = event => {
407
- // @ts-expect-error - TS2531 - Object is possibly 'null'. | TS2345 - Argument of type 'EventTarget | null' is not assignable to parameter of type 'Node | null'.
408
- const focused = ReactDOM__default.findDOMNode(this).contains(event.target);
409
- this.mouseDown = focused;
410
- if (!focused) {
411
- this.setState({
412
- focused: false
413
- });
414
- }
415
- };
416
- this.handleMouseUp = () => {
417
- // this mouse click started in the buttons div so we should focus the
418
- // input
419
- if (this.mouseDown) {
420
- this.focus();
421
- }
422
- this.mouseDown = false;
423
- };
424
- this.handleBlur = e => {
425
- // TODO(michaelpolyak): Consider trapping focus within the button group.
426
- // Focusing back on the input when TAB out of the last button in the
427
- // group. This will probably require ESCAPE key handling to enable to
428
- // close (blur) the button group in order to focus on next page element.
429
- if (!this.mouseDown &&
430
- // @ts-expect-error - TS2531 - Object is possibly 'null'.
431
- !ReactDOM__default.findDOMNode(this).contains(e.relatedTarget)) {
432
- this.setState({
433
- focused: false
434
- });
435
- }
436
- };
437
- this._shouldShowButtons = () => {
438
- if (this.props.buttonsVisible === "always") {
439
- return true;
440
- }
441
- if (this.props.buttonsVisible === "never") {
442
- return false;
443
- }
444
- return this.state.focused;
73
+ focused: false,
74
+ keypadOpen: this.props.buttonsVisible === "always" ? true : false,
75
+ cursorContext: CursorContext.NONE
445
76
  };
446
77
  this.insert = value => {
447
78
  const input = this.mathField();
@@ -503,6 +134,9 @@ class MathInput extends React.Component {
503
134
  if (this.props.value !== value) {
504
135
  this.props.onChange(value);
505
136
  }
137
+ this.setState({
138
+ cursorContext: getCursorContext(mathField)
139
+ });
506
140
  },
507
141
  enter: () => {
508
142
  // NOTE(kevinb): This isn't how answers to exercises are
@@ -535,34 +169,50 @@ class MathInput extends React.Component {
535
169
  focused: true
536
170
  });
537
171
  };
538
- this.blur = () => {
539
- var _this$mathField2;
540
- (_this$mathField2 = this.mathField()) == null ? void 0 : _this$mathField2.blur();
541
- this.setState({
542
- focused: false
543
- });
172
+ this.blur = () => this.setState({
173
+ focused: false
174
+ });
175
+ this.handleKeypadPress = (key, e) => {
176
+ const translator = keyTranslator[key];
177
+ const mathField = this.mathField();
178
+ if (mathField) {
179
+ if (translator) {
180
+ translator(mathField, key);
181
+ }
182
+ this.setState({
183
+ cursorContext: getCursorContext(mathField)
184
+ });
185
+ }
186
+
187
+ // We want to prevent taking focus from input when clicking on keypad
188
+ // Clickable handles "onClick" differently than react;
189
+ // a keyboard event is "keydown" type.
190
+ // In react without WonderBlocks, "enter" or "space" keydown events
191
+ // are also "click" events, differentiated by "detail".
192
+ if (e.type === "click") {
193
+ this.focus();
194
+ }
544
195
  };
545
196
  }
546
197
  componentDidMount() {
547
- var _this$mathField3;
548
- window.addEventListener("mousedown", this.handleMouseDown);
549
- window.addEventListener("mouseup", this.handleMouseUp);
550
-
198
+ var _this$mathField2;
551
199
  // Ideally, we would be able to pass an initial value directly into
552
200
  // the constructor
553
- (_this$mathField3 = this.mathField()) == null ? void 0 : _this$mathField3.latex(this.props.value);
201
+ (_this$mathField2 = this.mathField()) == null ? void 0 : _this$mathField2.latex(this.props.value);
554
202
  }
555
- componentWillUnmount() {
556
- window.removeEventListener("mousedown", this.handleMouseDown);
557
- window.removeEventListener("mouseup", this.handleMouseUp);
203
+ openKeypad() {
204
+ if (this.props.buttonsVisible === "never") {
205
+ return;
206
+ }
207
+ this.setState({
208
+ keypadOpen: true
209
+ });
210
+ }
211
+ closeKeypad() {
212
+ this.setState({
213
+ keypadOpen: false
214
+ });
558
215
  }
559
-
560
- // handlers:
561
- // keep track of two related bits of state:
562
- // * this.state.focused - whether the buttons are currently shown
563
- // * this.mouseDown - whether a mouse click is active that started in the
564
- // buttons div
565
-
566
216
  render() {
567
217
  let className = classNames({
568
218
  "perseus-math-input": true,
@@ -574,440 +224,195 @@ class MathInput extends React.Component {
574
224
  if (this.props.className) {
575
225
  className = className + " " + this.props.className;
576
226
  }
577
- let buttons = null;
578
- if (this._shouldShowButtons()) {
579
- // @ts-expect-error - TS2322 - Type 'Element' is not assignable to type 'null'.
580
- buttons = /*#__PURE__*/React.createElement(TexButtons, {
581
- sets: this.props.buttonSets,
582
- className: "math-input-buttons absolute",
583
- convertDotToTimes: this.props.convertDotToTimes,
584
- onInsert: this.insert
585
- });
586
- }
587
- return /*#__PURE__*/React.createElement("div", {
588
- style: {
589
- display: "inline-block"
590
- }
227
+ return /*#__PURE__*/React.createElement(View, {
228
+ style: [styles$A.outerWrapper, this.state.focused && styles$A.wrapperFocused, this.props.hasError && styles$A.wrapperError]
591
229
  }, /*#__PURE__*/React.createElement("div", {
592
230
  style: {
593
- display: "inline-block"
231
+ display: "flex",
232
+ padding: 1
233
+ },
234
+ onClick: () => {
235
+ const mathField = this.mathField();
236
+ if (!mathField) {
237
+ return;
238
+ }
239
+ this.setState({
240
+ cursorContext: getCursorContext(mathField)
241
+ });
594
242
  }
595
243
  }, /*#__PURE__*/React.createElement("span", {
596
244
  className: className,
597
245
  ref: ref => this.__mathFieldWrapperRef = ref,
598
246
  "aria-label": this.props.labelText,
599
- onFocus: this.handleFocus,
600
- onBlur: this.handleBlur
601
- })), /*#__PURE__*/React.createElement("div", {
602
- style: {
603
- position: "relative"
604
- },
605
- onBlur: this.handleBlur
606
- }, buttons));
247
+ onFocus: () => this.focus(),
248
+ onBlur: () => this.blur()
249
+ }), /*#__PURE__*/React.createElement(Popover, {
250
+ opened: this.state.keypadOpen,
251
+ onClose: () => this.closeKeypad(),
252
+ dismissEnabled: true,
253
+ content: () => {
254
+ var _this$props$keypadBut, _this$props;
255
+ return /*#__PURE__*/React.createElement(PopoverContentCore, {
256
+ closeButtonVisible: true,
257
+ style: styles$A.popoverContent
258
+ }, /*#__PURE__*/React.createElement(DesktopKeypad, _extends({
259
+ onAnalyticsEvent: this.props.analytics.onAnalyticsEvent,
260
+ extraKeys: this.props.extraKeys,
261
+ onClickKey: this.handleKeypadPress,
262
+ cursorContext: this.state.cursorContext,
263
+ convertDotToTimes: this.props.convertDotToTimes
264
+ }, (_this$props$keypadBut = this.props.keypadButtonSets) != null ? _this$props$keypadBut : mapButtonSets((_this$props = this.props) == null ? void 0 : _this$props.buttonSets))));
265
+ }
266
+ }, this.props.buttonsVisible === "never" ? /*#__PURE__*/React.createElement(MathInputIcon, {
267
+ hovered: false,
268
+ focused: false,
269
+ active: false
270
+ }) : /*#__PURE__*/React.createElement(Clickable, {
271
+ "aria-label": this.state.keypadOpen ? i18n._("close math keypad") : i18n._("open math keypad"),
272
+ "aria-checked": this.state.keypadOpen,
273
+ role: "switch",
274
+ onClick: () => this.state.keypadOpen ? this.closeKeypad() : this.openKeypad()
275
+ }, props => /*#__PURE__*/React.createElement(MathInputIcon, _extends({
276
+ active: this.state.keypadOpen
277
+ }, props))))));
607
278
  }
608
279
  }
609
280
  MathInput.defaultProps = {
610
281
  value: "",
611
- convertDotToTimes: false,
612
- buttonsVisible: "focused"
282
+ convertDotToTimes: false
613
283
  };
614
-
615
- /* eslint-disable react/no-unsafe */
616
- const zIndex = 10;
617
- let HorizontalDirection = /*#__PURE__*/function (HorizontalDirection) {
618
- HorizontalDirection["Left"] = "left";
619
- HorizontalDirection["Right"] = "right";
620
- return HorizontalDirection;
621
- }({});
622
- let VerticalDirection = /*#__PURE__*/function (VerticalDirection) {
623
- VerticalDirection["Top"] = "top";
624
- VerticalDirection["Bottom"] = "bottom";
625
- return VerticalDirection;
626
- }({});
627
- const Triangle = props => {
628
- let borderLeft;
629
- let borderRight;
630
- let borderTop;
631
- let borderBottom;
632
- const hBorder = `${props.width}px solid transparent`;
633
- if (props.horizontalDirection === "right") {
634
- borderLeft = hBorder;
635
- } else {
636
- borderRight = hBorder;
637
- }
638
- const vBorder = `${props.height}px solid ${props.color}`;
639
- if (props.verticalDirection === "top") {
640
- borderTop = vBorder;
641
- } else {
642
- borderBottom = vBorder;
284
+ const MathInputIcon = ({
285
+ hovered,
286
+ focused,
287
+ active
288
+ }) => {
289
+ let color;
290
+ switch (true) {
291
+ case focused || active:
292
+ color = Color.white;
293
+ break;
294
+ case hovered:
295
+ color = Color.blue;
296
+ break;
297
+ default:
298
+ color = Color.offBlack;
299
+ break;
300
+ }
301
+ const dynamicClass = active || focused ? styles$A.iconActive : styles$A.iconInactive;
302
+ return /*#__PURE__*/React.createElement(View, {
303
+ style: [styles$A.iconContainer, dynamicClass]
304
+ }, /*#__PURE__*/React.createElement("svg", {
305
+ xmlns: "http://www.w3.org/2000/svg",
306
+ width: "16",
307
+ height: "16",
308
+ fill: color,
309
+ viewBox: "0 0 256 256"
310
+ }, /*#__PURE__*/React.createElement("path", {
311
+ d: "M112,72a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16h64A8,8,0,0,1,112,72Zm-8,104H80V152a8,8,0,0,0-16,0v24H40a8,8,0,0,0,0,16H64v24a8,8,0,0,0,16,0V192h24a8,8,0,0,0,0-16Zm48,0h64a8,8,0,0,0,0-16H152a8,8,0,0,0,0,16Zm64,16H152a8,8,0,0,0,0,16h64a8,8,0,0,0,0-16Zm-61.66-90.34a8,8,0,0,0,11.32,0L184,83.31l18.34,18.35a8,8,0,0,0,11.32-11.32L195.31,72l18.35-18.34a8,8,0,0,0-11.32-11.32L184,60.69,165.66,42.34a8,8,0,0,0-11.32,11.32L172.69,72,154.34,90.34A8,8,0,0,0,154.34,101.66Z"
312
+ })));
313
+ };
314
+ const mapButtonSets = buttonSets => {
315
+ const keypadButtonSets = {};
316
+ if (!buttonSets) {
317
+ return keypadButtonSets;
643
318
  }
644
- return /*#__PURE__*/React.createElement("div", {
645
- style: {
646
- display: "block",
647
- height: 0,
648
- width: 0,
649
- position: "absolute",
650
- left: props.left,
651
- top: props["top"],
652
- borderLeft: borderLeft,
653
- borderRight: borderRight,
654
- borderTop: borderTop,
655
- borderBottom: borderBottom
319
+ buttonSets.forEach(buttonSet => {
320
+ switch (buttonSet) {
321
+ case "advanced relations":
322
+ keypadButtonSets.advancedRelations = true;
323
+ break;
324
+ case "basic relations":
325
+ keypadButtonSets.basicRelations = true;
326
+ break;
327
+ case "basic+div":
328
+ keypadButtonSets.divisionKey = true;
329
+ break;
330
+ case "logarithms":
331
+ keypadButtonSets.logarithms = true;
332
+ break;
333
+ case "prealgebra":
334
+ keypadButtonSets.preAlgebra = true;
335
+ break;
336
+ case "trig":
337
+ keypadButtonSets.trigonometry = true;
338
+ break;
656
339
  }
657
340
  });
341
+ return keypadButtonSets;
658
342
  };
659
- const TooltipArrow = props => {
660
- // TODO(aria): Think about adding a box-shadow to the triangle here
661
- // See http://css-tricks.com/triangle-with-shadow/
662
-
663
- //const isRight = (this.props.horizontalDirection === "right");
664
- const isTop = props.verticalDirection === "top";
665
- const frontTopOffset = isTop ? 0 : 1;
666
- const borderTopOffset = isTop ? 0 : -1;
667
- return /*#__PURE__*/React.createElement("div", {
668
- style: {
669
- display: "block",
670
- position: props.position,
671
- visibility: props.visibility,
672
- left: props.left,
673
- top: props["top"],
674
- width: props.width + 2,
675
- height: props.height + 1,
676
- marginTop: -1,
677
- marginBottom: -2,
678
- zIndex: zIndex
679
- }
680
- }, /*#__PURE__*/React.createElement(Triangle, {
681
- horizontalDirection: props.horizontalDirection,
682
- verticalDirection: props.verticalDirection,
683
- color: props.border,
684
- left: 0,
685
- top: borderTopOffset,
686
- width: props.width + 2 // one extra for the diagonal
687
- ,
688
- height: props.height + 2
689
- }), /*#__PURE__*/React.createElement(Triangle, {
690
- horizontalDirection: props.horizontalDirection,
691
- verticalDirection: props.verticalDirection,
692
- color: props.color,
693
- left: 1,
694
- top: frontTopOffset,
695
- width: props.width,
696
- height: props.height
697
- }));
698
- };
699
- TooltipArrow.defaultProps = {
700
- position: "relative",
701
- visibility: "visible",
702
- left: 0,
703
- top: 0
343
+ const inputFocused = {
344
+ borderWidth: 2,
345
+ borderColor: Color.blue,
346
+ margin: -1
704
347
  };
705
- const VERTICAL_CORNERS = {
706
- top: {
707
- top: "-100%"
348
+ const styles$A = StyleSheet.create({
349
+ iconContainer: {
350
+ display: "flex",
351
+ justifyContent: "center",
352
+ height: "100%",
353
+ padding: Spacing.xxxSmall_4,
354
+ borderRadius: 1
708
355
  },
709
- bottom: {
710
- top: 0
711
- }
712
- };
713
- const HORIZONTAL_CORNERS = {
714
- left: {
715
- targetLeft: 0
356
+ iconInactive: {
357
+ backgroundColor: Color.offBlack8
716
358
  },
717
- right: {
718
- targetLeft: "100%"
719
- }
720
- };
721
- const HORIZONTAL_ALIGNMNENTS = {
722
- left: {
723
- tooltipLeft: 0,
724
- arrowLeft: arrowSize => 0
359
+ iconActive: {
360
+ backgroundColor: Color.offBlack64
725
361
  },
726
- right: {
727
- tooltipLeft: "-100%",
728
- arrowLeft: arrowSize => -arrowSize - 2
729
- }
730
- };
731
- class Tooltip extends React.Component {
732
- constructor(...args) {
733
- super(...args);
734
- this.state = {
735
- height: null // used for offsetting "top" positioned tooltips
736
- };
737
- }
738
-
739
- componentDidMount() {
740
- this._updateHeight();
741
- }
742
- UNSAFE_componentWillReceiveProps() {
743
- // If the contents have changed, reset our measure of the height
744
- this.setState({
745
- height: null
746
- });
747
- }
748
- componentDidUpdate() {
749
- this._updateHeight();
750
- }
751
- _renderToolTipDiv(isTooltipAbove) {
752
- const settings = Object.assign({}, HORIZONTAL_CORNERS[this.props.horizontalPosition], HORIZONTAL_ALIGNMNENTS[this.props.horizontalAlign], VERTICAL_CORNERS[this.props.verticalPosition]);
753
- let arrowAbove;
754
- let arrowBelow;
755
- if (isTooltipAbove) {
756
- // We put an absolutely positioned arrow in the correct place
757
- arrowAbove = /*#__PURE__*/React.createElement(TooltipArrow, {
758
- verticalDirection: VerticalDirection.Top,
759
- horizontalDirection: this.props.horizontalAlign,
760
- position: "absolute",
761
- color: "white",
762
- border: this.props.borderColor,
763
- left: settings.arrowLeft(this.props.arrowSize),
764
- top: -this.props.arrowSize + 2,
765
- width: this.props.arrowSize,
766
- height: this.props.arrowSize,
767
- zIndex: zIndex
768
- });
769
-
770
- // And we use a visibility: hidden arrow below to shift up the
771
- // content by the correct amount
772
- arrowBelow = /*#__PURE__*/React.createElement(TooltipArrow, {
773
- verticalDirection: VerticalDirection.Top,
774
- horizontalDirection: this.props.horizontalAlign,
775
- visibility: "hidden",
776
- color: "white",
777
- border: this.props.borderColor,
778
- left: settings.arrowLeft(this.props.arrowSize),
779
- top: -1,
780
- width: this.props.arrowSize,
781
- height: this.props.arrowSize,
782
- zIndex: zIndex
783
- });
784
- } else {
785
- arrowAbove = /*#__PURE__*/React.createElement(TooltipArrow, {
786
- verticalDirection: VerticalDirection.Bottom,
787
- horizontalDirection: this.props.horizontalAlign,
788
- color: "white",
789
- border: this.props.borderColor,
790
- left: settings.arrowLeft(this.props.arrowSize),
791
- top: -1,
792
- width: this.props.arrowSize,
793
- height: this.props.arrowSize,
794
- zIndex: zIndex
795
- });
796
- arrowBelow = null;
797
- }
798
-
799
- /* A positioned div below the input to be the parent for our
800
- tooltip */
801
- return /*#__PURE__*/React.createElement("div", {
802
- style: {
803
- position: "relative",
804
- height: 0,
805
- display: this.props.show ? "block" : "none"
806
- }
807
- }, /*#__PURE__*/React.createElement("div", {
808
- // eslint-disable-next-line react/no-string-refs
809
- ref: "tooltipContainer",
810
- className: "tooltipContainer",
811
- style: {
812
- position: "absolute",
813
- // height must start out undefined, not null, so that
814
- // we can measure the actual height with jquery.
815
- // This is used to position the tooltip with top: -100%
816
- // when in verticalPosition: "top" mode
817
- height: this.state.height || undefined,
818
- left: settings.targetLeft
819
- }
820
- }, arrowAbove, /*#__PURE__*/React.createElement("div", {
821
- className: this.props.className
822
- // eslint-disable-next-line react/no-string-refs
823
- ,
824
- ref: "tooltipContent",
825
- style: {
826
- position: "relative",
827
- top: settings["top"],
828
- left: settings.tooltipLeft,
829
- border: "1px solid " + this.props.borderColor,
830
- boxShadow: "0 1px 3px " + this.props.borderColor,
831
- zIndex: zIndex - 1
832
- }
833
- }, this.props.children.slice(1)), arrowBelow));
834
- }
835
- _updateHeight() {
836
- const tooltipContainer = ReactDOM__default.findDOMNode(
837
- // eslint-disable-next-line react/no-string-refs
838
- this.refs.tooltipContainer);
839
- const height = tooltipContainer.offsetHeight;
840
- if (height !== this.state.height) {
841
- this.setState({
842
- height
843
- });
362
+ outerWrapper: {
363
+ display: "inline-block",
364
+ borderStyle: "solid",
365
+ borderWidth: 1,
366
+ borderColor: Color.offBlack50,
367
+ borderRadius: 3,
368
+ background: Color.white,
369
+ ":hover": inputFocused
370
+ },
371
+ wrapperFocused: inputFocused,
372
+ wrapperError: {
373
+ borderColor: Color.red,
374
+ background: fade(Color.red, 0.08),
375
+ ":hover": {
376
+ borderColor: Color.red
844
377
  }
378
+ },
379
+ popoverContent: {
380
+ padding: 0,
381
+ paddingBottom: Spacing.xxSmall_6,
382
+ maxWidth: "initial"
845
383
  }
846
- render() {
847
- const isTooltipAbove = this.props.verticalPosition === "top";
384
+ });
848
385
 
849
- /* We wrap the entire output in a span so that it displays inline */
850
- return /*#__PURE__*/React.createElement("span", null, isTooltipAbove && this._renderToolTipDiv(isTooltipAbove), /*#__PURE__*/React.createElement("div", {
851
- style: this.props.targetContainerStyle
852
- }, this.props.children[0]), !isTooltipAbove && this._renderToolTipDiv());
386
+ let _dependencies = null;
387
+ const setDependencies = dependencies => {
388
+ _dependencies = dependencies;
389
+ };
390
+ const getDependencies = () => {
391
+ if (_dependencies) {
392
+ return _dependencies;
853
393
  }
854
- }
855
-
856
- // Sorry. // Apology-Oriented-Programming
857
- Tooltip.defaultProps = {
858
- className: "",
859
- arrowSize: 10,
860
- borderColor: "#ccc",
861
- verticalPosition: VerticalDirection.Bottom,
862
- horizontalPosition: HorizontalDirection.Left,
863
- horizontalAlign: HorizontalDirection.Left,
864
- targetContainerStyle: {}
394
+ throw new Error(["Perseus has not been provided required dependencies.", "setDependencies(dependencies) must be called first.", "Make sure Perseus is being imported from javascript/perseus/perseus.js."].join("\n"));
865
395
  };
396
+ const DependenciesContext = /*#__PURE__*/React.createContext({
397
+ analytics: {
398
+ onAnalyticsEvent: async () => {}
399
+ }
400
+ });
866
401
 
867
402
  /**
868
- * Icon paths to be used with `inline-icon.jsx`.
869
- *
870
- * These paths are taken directly from webapp's `icon-paths.js`. Unlike the
871
- * webapp equivalent, these can be directly required within Perseus files since
872
- * this is all bundled together anyway.
403
+ * useDependencies provides easy access to the current Perseus dependencies.
873
404
  */
874
-
875
- const iconCheck = {
876
- path: `M8.70710678,12.2928932 C8.31658249,11.9023689 7.68341751,11.9023689 7.29289322,12.2928932 C6.90236893,12.6834175 6.90236893,13.3165825 7.29289322,13.7071068 L9.82842712,16.2426407 C10.2207367,16.6349502 10.8574274,16.6328935 11.2471942,16.2380576 L16.7116603,10.7025237 C17.0996535,10.3094846 17.0955629,9.67633279 16.7025237,9.28833966 C16.3094846,8.90034653 15.6763328,8.90443714 15.2883397,9.29747629 L10.5309507,14.1167372 L8.70710678,12.2928932 Z`,
877
- width: 24,
878
- height: 24
879
- };
880
- const iconCheckMedium = {
881
- path: "M6.072 10.4l6.175-7.058a1 1 0 1 1 1.506 1.317L6.769 12.64a1 1 0 0 1-1.55-.054L2.203 8.604a1 1 0 1 1 1.594-1.208L6.072 10.4z",
882
- width: 16,
883
- height: 16
884
- };
885
- const iconChevronDown = {
886
- path: "M99.669 13.048q0 3.36-2.352 5.712l-41.664 41.664q-2.408 2.408-5.88 2.408t-5.712-2.408l-41.664-41.664q-2.408-2.24-2.408-5.712t2.408-5.88l4.76-4.816q2.52-2.352 5.88-2.352t5.656 2.352l31.136 31.136 31.08-31.136q2.352-2.352 5.712-2.352t5.88 2.352l4.816 4.816q2.352 2.52 2.352 5.88z",
887
- width: 100,
888
- height: 63.034
889
- };
890
- const iconChevronRight = {
891
- path: "M62.808 49.728q0 3.36-2.352 5.88l-41.72 41.664q-2.352 2.408-5.768 2.408t-5.768-2.408l-4.872-4.76q-2.352-2.52-2.352-5.88t2.352-5.712l31.08-31.136-31.08-31.024q-2.352-2.52-2.352-5.88t2.352-5.712l4.872-4.76q2.296-2.408 5.768-2.408t5.768 2.408l41.72 41.664q2.352 2.296 2.352 5.656z",
892
- width: 63.034,
893
- height: 100
894
- };
895
- const iconCircle = {
896
- path: "M100.035 50.046q.057 13.623-6.669 25.137t-18.24 18.183-25.08 6.669-25.137-6.726q-11.514-6.726-18.183-18.183-6.726-11.571-6.726-25.137t6.726-25.08 18.24-18.24 25.08-6.669q13.566 0 25.08 6.726 11.514 6.669 18.24 18.183t6.669 25.137z",
897
- width: 100,
898
- height: 100
899
- };
900
- const iconCircleArrowDown = {
901
- path: "M50.046 83.676q1.767 0 2.907-1.14l29.526-29.526q1.197-1.197 1.197-2.907t-1.197-2.964l-5.928-5.928q-1.197-1.14-2.964-1.14t-2.907 1.14l-12.312 12.312l0-32.661q0-1.71-1.254-2.964t-2.907-1.254l-8.322 0q-1.71 0-2.964 1.254t-1.254 2.964l0 32.661l-12.312-12.312q-1.197-1.254-2.907-1.254t-2.907 1.254l-5.928 5.928q-1.197 1.197-1.197 2.964t1.197 2.907l29.469 29.526q1.197 1.14 2.964 1.14zm49.989-33.63q.057 13.623-6.669 25.137t-18.24 18.183-25.08 6.669-25.137-6.726q-11.514-6.726-18.183-18.183-6.726-11.571-6.726-25.137t6.726-25.08 18.24-18.24 25.08-6.669q13.566 0 25.08 6.726 11.514 6.669 18.24 18.183t6.669 25.137z",
902
- width: 100,
903
- height: 100
904
- };
905
- const iconCircleArrowUp = {
906
- path: "M54.207 83.391q1.653 0 2.907-1.254t1.254-2.907l0-32.718l12.312 12.312q1.254 1.254 2.964 1.254t2.907-1.254l5.928-5.928q1.197-1.197 1.14-2.964 0-1.767-1.14-2.907l-29.526-29.526q-1.197-1.14-2.907-1.14t-2.964 1.14l-29.469 29.526q-1.197 1.254-1.197 2.964t1.197 2.907l5.928 5.928q1.197 1.197 2.907 1.197t2.907-1.197l12.312-12.312l0 32.718q0 1.653 1.254 2.907t2.964 1.254l8.322 0zm45.828-33.345q.057 13.623-6.669 25.137t-18.24 18.183-25.08 6.669-25.137-6.726q-11.514-6.726-18.183-18.183-6.726-11.571-6.726-25.137t6.726-25.08 18.24-18.24 25.08-6.669q13.566 0 25.08 6.726 11.514 6.669 18.24 18.183t6.669 25.137z",
907
- width: 100,
908
- height: 100
909
- };
910
- const iconCircleThin = {
911
- path: "M50.046 8.322q-8.493 0-16.188 3.306-15.561 6.669-22.173 22.23-3.363 7.695-3.363 16.188t3.306 16.188 8.949 13.281q5.586 5.586 13.281 8.892t16.188 3.306 16.188-3.306 13.281-8.892 8.892-13.281 3.306-16.188-3.306-16.188-8.892-13.281-13.281-8.949q-7.695-3.306-16.188-3.306zm0 91.713q-13.623 0-25.137-6.726t-18.183-18.183q-6.726-11.571-6.726-25.137t6.726-25.08 18.24-18.24 25.08-6.669q13.566 0 25.08 6.726 11.514 6.669 18.24 18.183t6.726 25.137-6.726 25.137-18.24 18.126q-11.514 6.726-25.08 6.726z",
912
- width: 100,
913
- height: 99.944
914
- };
915
- const iconDesktop = {
916
- path: "M94.208 52.119l0-43.746q0-.69-.506-1.15t-1.196-.506l-84.088 0q-.69 0-1.196.506t-.506 1.15l0 43.746q0 .69.506 1.196t1.196.506l84.088 0q.69 0 1.196-.506t.506-1.196zm6.716-43.746l0 57.224q0 3.45-2.484 5.934t-5.934 2.484l-28.566 0q0 3.128 2.53 7.774.828 1.61.828 2.622t-1.012 2.07q-1.012 1.012-2.346.966l-26.91 0q-1.38 0-2.392-1.012t-1.012-2.024q0-1.058 1.656-4.14t1.748-6.256l-28.612 0q-3.45 0-5.934-2.484t-2.484-5.934l0-57.224q0-3.45 2.484-5.934t5.934-2.438l84.088 0q3.45 0 5.98 2.438 2.438 2.484 2.438 5.934z",
917
- width: 100,
918
- height: 86.648
919
- };
920
- const iconDropdownArrow = {
921
- path: "M9 9.8c0 .5.7 1.7 1.5 2.8 1.5 1.9 1.5 1.9 3 0C15.7 9.7 15.4 9 12 9c-1.6 0-3 .4-3 .8z",
922
- width: 24,
923
- height: 24
924
- };
925
- const iconExclamationSign = {
926
- path: "M58.368 81.225l0-12.369q0-.912-.57-1.539t-1.425-.627l-12.54 0q-.855-.057-1.482.627t-.684 1.539l0 12.369q-.057.855.627 1.482t1.539.684l12.54 0q.855 0 1.425-.627t.57-1.539zm1.026-62.871q0-1.596-2.223-1.71l-14.307 0q-2.109 0-2.223 1.71l1.14 40.47q0 .627.627 1.14t1.539.456l12.084 0q.912-.057 1.539-.513t.684-1.083zm-9.348-18.354q13.566 0 25.08 6.726 11.514 6.669 18.24 18.183t6.726 25.137-6.726 25.137-18.24 18.183-25.08 6.669-25.137-6.726q-11.514-6.726-18.183-18.183-6.726-11.571-6.726-25.137t6.726-25.08 18.24-18.24 25.08-6.669z",
927
- width: 100,
928
- height: 99.944
929
- };
930
- // Grabbed from https://github.com/encharm/Font-Awesome-SVG-PNG
931
- const iconGear = {
932
- path: "M1152 896q0-106-75-181t-181-75-181 75-75 181 75 181 181 75 181-75 75-181zm512-109v222q0 12-8 23t-20 13l-185 28q-19 54-39 91 35 50 107 138 10 12 10 25t-9 23q-27 37-99 108t-94 71q-12 0-26-9l-138-108q-44 23-91 38-16 136-29 186-7 28-36 28h-222q-14 0-24.5-8.5t-11.5-21.5l-28-184q-49-16-90-37l-141 107q-10 9-25 9-14 0-25-11-126-114-165-168-7-10-7-23 0-12 8-23 15-21 51-66.5t54-70.5q-27-50-41-99l-183-27q-13-2-21-12.5t-8-23.5v-222q0-12 8-23t19-13l186-28q14-46 39-92-40-57-107-138-10-12-10-24 0-10 9-23 26-36 98.5-107.5t94.5-71.5q13 0 26 10l138 107q44-23 91-38 16-136 29-186 7-28 36-28h222q14 0 24.5 8.5t11.5 21.5l28 184q49 16 90 37l142-107q9-9 24-9 13 0 25 10 129 119 165 170 7 8 7 22 0 12-8 23-15 21-51 66.5t-54 70.5q26 50 41 98l183 28q13 2 21 12.5t8 23.5z",
933
- width: 1792,
934
- height: 1792
935
- };
936
- const iconMobilePhone = {
937
- path: "M36.04 89.557q0-2.584-1.836-4.42t-4.42-1.836-4.352 1.836q-1.836 1.836-1.836 4.42t1.836 4.352 4.42 1.836q2.652-.068 4.42-1.836t1.768-4.352zm16.184-12.444l0-54.74q0-1.088-.748-1.768t-1.768-.68l-39.78 0q-1.088 0-1.768.748t-.68 1.7l0 54.74q0 1.02.748 1.768t1.7.68l39.78 0q1.02-.068 1.768-.748t.748-1.7zm-14.892-65.892q0-1.224-1.292-1.292l-12.444 0q-1.224.068-1.224 1.292t1.224 1.224l12.444 0q1.292 0 1.292-1.224zm22.372-1.292l0 79.628q0 3.944-2.992 6.936t-7.004 2.992l-39.78 0q-4.012 0-7.004-2.924-2.924-2.924-2.924-7.004l0-79.628q0-4.012 2.924-6.936t7.004-2.992l39.78 0q4.012-.068 7.004 2.924t2.992 7.004z",
938
- width: 60.013,
939
- height: 100
940
- };
941
- const iconOk = {
942
- path: "M37.964 76.048q-2.576 0-4.368-1.792l-31.864-31.864q-1.792-1.792-1.792-4.368t1.792-4.368l8.736-8.68q1.792-1.792 4.368-1.792t4.312 1.792l18.816 18.872 42-42.056q1.792-1.792 4.368-1.792t4.312 1.792l8.736 8.736q1.792 1.792 1.792 4.368t-1.792 4.312l-55.048 55.048q-1.792 1.792-4.368 1.792z",
943
- width: 100,
944
- height: 76.637
945
- };
946
- const iconPlus = {
947
- path: "M99.758 43.09l0 13.578q0 2.852-1.984 4.836t-4.836 1.984l-29.45 0l0 29.45q0 2.852-1.984 4.836t-4.836 1.984l-13.578 0q-2.852 0-4.836-1.984t-1.984-4.836l0-29.45l-29.45 0q-2.852 0-4.836-1.984t-1.984-4.836l0-13.578q0-2.852 1.984-4.836t4.836-1.984l29.45 0l0-29.45q0-2.852 1.984-4.836t4.836-1.984l13.578 0q2.852 0 4.836 1.984t1.984 4.836l0 29.45l29.45 0q2.852 0 4.836 1.984t1.984 4.836z",
948
- width: 100,
949
- height: 100
950
- };
951
- const iconRemove = {
952
- path: "M100.464 80.808q0 3.404-2.368 5.772l-11.47 11.544q-2.368 2.368-5.772 2.368t-5.698-2.368l-24.864-24.864-24.864 24.864q-2.368 2.368-5.772 2.368t-5.772-2.368l-11.47-11.544q-2.368-2.368-2.368-5.772t2.368-5.698l24.864-24.864-24.864-24.864q-2.368-2.368-2.368-5.772t2.368-5.772l11.47-11.47q2.368-2.368 5.772-2.368t5.772 2.368l24.864 24.864 24.864-24.864q2.294-2.368 5.698-2.368t5.772 2.368l11.47 11.47q2.368 2.368 2.368 5.772t-2.368 5.772l-24.864 24.864 24.864 24.864q2.368 2.294 2.368 5.698z",
953
- width: 100,
954
- height: 100
955
- };
956
- const iconStar = {
957
- path: "M15.1052249,9.55978547 L22.0028147,9.55978545 C23.6568673,9.55978545 23.9349557,10.3753626 22.6181351,11.3858845 L16.9943688,15.7015366 L19.2518801,22.8294455 C19.7526645,24.4106317 19.0984455,24.8825885 17.769353,23.8673293 L12.0490577,19.4977438 L6.5116497,23.8422153 C5.20921411,24.8640642 4.53299569,24.4067544 5.00266927,22.8160582 L7.10332364,15.7015366 L1.42794544,11.3634306 C0.110226041,10.3562014 0.383967283,9.54239221 2.0409646,9.54574013 L8.9924676,9.55978547 L11.1485117,2.72669438 C11.6458693,1.15043244 12.4548928,1.15900049 12.9494787,2.72669438 L15.1052249,9.55978547 Z",
958
- width: 24,
959
- height: 24
960
- };
961
- const iconTryAgain = {
962
- path: "M3.74890556,17.9799506 C2.19251241,16.1970909 1.10103636,13.4971457 1.13090903,11.1491783 C1.17160478,7.95052637 4.01704076,0.865059407 11.7028044,0.865059407 C19.388568,0.865059407 22.3026521,7.35203035 22.3026521,11.5879453 C22.3026521,15.8238603 19.386629,20.5574509 13.6832464,21.7131548 L13.6757539,17.3722171 C17.0812986,16.2190517 18.331158,14.1944123 18.3311578,11.5879451 C18.3311574,8.16554692 15.6664205,5.03476549 11.7028048,5.20494205 C7.73918903,5.37511861 5.59244567,8.66930079 5.59244567,11.1491783 C5.59244567,12.9090077 6.11128139,14.1753512 6.93640437,15.3053215 L8.14052356,14.2949456 C8.98559348,13.5858477 9.6994861,13.9070448 9.73489556,15.0076413 L9.91284941,20.5388014 C9.94832683,21.6415103 9.09967118,22.3514475 8.02194403,22.1254594 L2.60571602,20.9897332 C1.5259204,20.7633114 1.34338662,19.9984207 2.18070755,19.295825 L3.74890556,17.9799506 Z",
963
- width: 23,
964
- height: 23
965
- };
966
- const iconTablet = {
967
- path: "M45.322 90.706q0-1.86-1.302-3.224-1.364-1.364-3.224-1.364t-3.224 1.364-1.302 3.224q0 1.86 1.364 3.224 1.302 1.364 3.162 1.302 1.86.062 3.224-1.302t1.302-3.224zm27.218-11.346l0-68.014q0-.93-.682-1.612t-1.55-.682l-58.962 0q-.93 0-1.612.682t-.682 1.612l0 68.014q0 .93.682 1.612t1.612.62l58.962 0q.992-.062 1.612-.682t.62-1.55zm9.114-68.014l0 77.066q0 4.65-3.348 7.998t-7.998 3.348l-58.962 0q-4.65 0-7.998-3.348t-3.348-7.998l0-77.066q0-4.65 3.348-7.998t7.998-3.348l58.962 0q4.65 0 7.998 3.348t3.348 7.998z",
968
- width: 81.852,
969
- height: 100
970
- };
971
- const iconTrash = {
972
- path: "M31.293 37.506q2.052 0 2.052 2.109l0 37.506q0 1.995-2.052 2.109l-4.218 0q-.912-.057-1.482-.627t-.57-1.482l0-37.506q0-2.109 2.052-2.109l4.218 0zm18.753 2.109l0 37.506q0 .912-.57 1.482t-1.539.627l-4.161 0q-1.995 0-2.109-2.109l0-37.506q.057-.912.627-1.482t1.482-.627l4.161 0q.969.057 1.539.627t.57 1.482zm14.592-2.109q2.052 0 2.052 2.109l0 37.506q0 1.995-2.052 2.109l-4.161 0q-.969-.057-1.539-.627t-.57-1.482l0-37.506q0-2.109 2.109-2.109l4.161 0zm10.431 49.248l0-61.731l-58.368 0l0 61.731q.057 2.679.969 3.819t1.083 1.14l54.207 0q.171 0 1.14-1.083t.969-3.876zm-43.776-70.11l29.184 0l-3.135-7.581q-.456-.57-1.14-.741l-20.634 0q-.627.114-1.083.741zm-31.293 2.109q0-1.995 2.109-2.109l20.121 0l4.56-10.83q.969-2.394 3.477-4.104 2.565-1.71 5.187-1.71l20.805 0q2.622 0 5.187 1.71t3.477 4.104l4.56 10.83l20.178 0q.912.057 1.482.627t.57 1.482l0 4.161q0 1.995-2.052 2.109l-6.27 0l0 61.731q0 5.415-3.078 9.348t-7.353 3.933l-54.207 0q-4.275 0-7.353-3.819t-3.078-9.177l0-62.016l-6.213 0q-.969 0-1.539-.57t-.57-1.539l0-4.161z",
973
- width: 91.681,
974
- height: 100
975
- };
976
- const iconUndo = {
977
- path: "M10,6.6C10,7.2,9.8,8,9.3,9.1c0,0,0,0.1-0.1,0.1S9.2,9.3,9.2,9.4c0,0,0,0.1-0.1,0.1C9,9.6,9,9.6,8.9,9.6 c-0.1,0-0.1,0-0.1-0.1c0,0,0-0.1,0-0.1c0,0,0-0.1,0-0.1s0-0.1,0-0.1c0-0.3,0-0.5,0-0.7c0-0.4,0-0.7-0.1-1C8.6,7.1,8.5,6.9,8.4,6.7S8.2,6.3,8,6.1C7.8,5.9,7.6,5.8,7.4,5.7S6.9,5.5,6.7,5.5S6.1,5.4,5.8,5.4c-0.3,0-0.6,0-1,0H3.6v1.4c0,0.1,0,0.2-0.1,0.3C3.4,7.1,3.3,7.1,3.2,7.1C3.1,7.1,3,7.1,3,7L0.1,4.1C0,4.1,0,4,0,3.9s0-0.2,0.1-0.3L3,0.8C3,0.7,3.1,0.7,3.2,0.7c0.1,0,0.2,0,0.3,0.1C3.5,0.9,3.6,0.9,3.6,1v1.4h1.2c2.6,0,4.3,0.7,4.9,2.2C9.9,5.2,10,5.8,10,6.6z",
978
- width: 10,
979
- height: 10
980
- };
981
- const iconMinus = {
982
- path: `M8,13 L16,13 C16.5522847,13 17,12.5522847 17,12 C17,11.4477153 16.5522847,11 16,11 L8,11 C7.44771525,11 7,11.4477153 7,12 C7,12.5522847 7.44771525,13 8,13 Z`,
983
- width: 24,
984
- height: 24
405
+ const useDependencies = () => {
406
+ const deps = React.useContext(DependenciesContext);
407
+ return deps;
985
408
  };
986
409
 
987
- var iconPaths = /*#__PURE__*/Object.freeze({
988
- __proto__: null,
989
- iconCheck: iconCheck,
990
- iconCheckMedium: iconCheckMedium,
991
- iconChevronDown: iconChevronDown,
992
- iconChevronRight: iconChevronRight,
993
- iconCircle: iconCircle,
994
- iconCircleArrowDown: iconCircleArrowDown,
995
- iconCircleArrowUp: iconCircleArrowUp,
996
- iconCircleThin: iconCircleThin,
997
- iconDesktop: iconDesktop,
998
- iconDropdownArrow: iconDropdownArrow,
999
- iconExclamationSign: iconExclamationSign,
1000
- iconGear: iconGear,
1001
- iconMobilePhone: iconMobilePhone,
1002
- iconOk: iconOk,
1003
- iconPlus: iconPlus,
1004
- iconRemove: iconRemove,
1005
- iconStar: iconStar,
1006
- iconTryAgain: iconTryAgain,
1007
- iconTablet: iconTablet,
1008
- iconTrash: iconTrash,
1009
- iconUndo: iconUndo,
1010
- iconMinus: iconMinus
410
+ var dependencies = /*#__PURE__*/Object.freeze({
411
+ __proto__: null,
412
+ setDependencies: setDependencies,
413
+ getDependencies: getDependencies,
414
+ DependenciesContext: DependenciesContext,
415
+ useDependencies: useDependencies
1011
416
  });
1012
417
 
1013
418
  // TODO(LP-11481): Change the primary API we use for logging in Perseus to use
@@ -1187,9 +592,9 @@ const propTypes = {
1187
592
  };
1188
593
 
1189
594
  var changeable = /*#__PURE__*/Object.freeze({
1190
- __proto__: null,
1191
- change: change,
1192
- propTypes: propTypes
595
+ __proto__: null,
596
+ change: change,
597
+ propTypes: propTypes
1193
598
  });
1194
599
 
1195
600
  /* eslint-disable @khanacademy/ts-no-error-suppressions */
@@ -1531,6 +936,26 @@ const ClassNames = {
1531
936
  MOBILE: "perseus-mobile"
1532
937
  };
1533
938
 
939
+ /*
940
+ * A11y (Accessibility) style rules
941
+ * These are used to mark up areas on the site that should only be readable
942
+ * when using a screen reader.
943
+ */
944
+ var a11y = StyleSheet.create({
945
+ // Make content only visible to screen readers.
946
+ // Both collegeboard.org and Bootstrap 3 use this exact implementation.
947
+ srOnly: {
948
+ border: 0,
949
+ clip: "rect(0,0,0,0)",
950
+ height: 1,
951
+ margin: -1,
952
+ overflow: "hidden",
953
+ padding: 0,
954
+ position: "absolute",
955
+ width: 1
956
+ }
957
+ });
958
+
1534
959
  const KhanMath = {
1535
960
  // Simplify formulas before display
1536
961
  cleanMath: function (expr) {
@@ -2445,6 +1870,7 @@ const KhanAnswerTypes = {
2445
1870
  }
2446
1871
  };
2447
1872
 
1873
+ const ERROR_TITLE = i18n._("Oops!");
2448
1874
  const ERROR_MESSAGE = i18n._("Sorry, I don't understand that!");
2449
1875
  const insertBraces = value => {
2450
1876
  // HACK(alex): Make sure that all LaTeX super/subscripts are wrapped
@@ -2479,53 +1905,48 @@ class Expression extends React.Component {
2479
1905
  constructor(..._args) {
2480
1906
  super(..._args);
2481
1907
  this._isMounted = false;
2482
- this.errorTimeout = null;
2483
1908
  this.displayName = "Expression";
2484
1909
  this.state = {
1910
+ invalid: false,
2485
1911
  showErrorTooltip: false,
2486
- showErrorText: false
1912
+ showErrorStyle: false
2487
1913
  };
2488
1914
  this.componentDidMount = () => {
1915
+ document.addEventListener("mousedown", this._handleMouseDown);
1916
+
2489
1917
  // TODO(scottgrant): This is a hack to remove the deprecated call to
2490
1918
  // this.isMounted() but is still considered an anti-pattern.
2491
1919
  this._isMounted = true;
2492
1920
  };
2493
1921
  this.componentDidUpdate = prevProps => {
2494
1922
  if (!_.isEqual(this.props.value, prevProps.value) || !_.isEqual(this.props.functions, prevProps.functions)) {
2495
- // TODO(jeff, CP-3128): Use Wonder Blocks Timing API.
2496
- // eslint-disable-next-line no-restricted-syntax
2497
- // @ts-expect-error - TS2769 - No overload matches this call.
2498
- clearTimeout(this.errorTimeout);
2499
- if (this.parse(this.props.value, this.props).parsed) {
2500
- // eslint-disable-next-line react/no-did-update-set-state
2501
- this.setState({
2502
- showErrorTooltip: false
2503
- });
2504
- } else {
2505
- // Store timeout ID so that we can clear it above
2506
- // TODO(jeff, CP-3128): Use Wonder Blocks Timing API.
2507
- // eslint-disable-next-line no-restricted-syntax
2508
- // @ts-expect-error - TS2322 - Type 'Timeout' is not assignable to type 'number'.
2509
- this.errorTimeout = setTimeout(() => {
2510
- const apiResult = this.props.apiOptions.onInputError(null,
2511
- // reserved for some widget identifier
2512
- this.props.value, ERROR_MESSAGE);
2513
- if (apiResult !== false) {
2514
- this.setState({
2515
- showErrorTooltip: true
2516
- });
2517
- }
2518
- }, 2000);
1923
+ this.setState({
1924
+ invalid: false,
1925
+ showErrorTooltip: false,
1926
+ showErrorStyle: false
1927
+ });
1928
+ if (!this.parse(this.props.value, this.props).parsed) {
1929
+ const apiResult = this.props.apiOptions.onInputError(null,
1930
+ // reserved for some widget identifier
1931
+ this.props.value, ERROR_MESSAGE);
1932
+ if (apiResult !== false) {
1933
+ this.setState({
1934
+ invalid: true
1935
+ });
1936
+ }
2519
1937
  }
2520
1938
  }
2521
1939
  };
2522
1940
  this.componentWillUnmount = () => {
2523
- // TODO(jeff, CP-3128): Use Wonder Blocks Timing API.
2524
- // eslint-disable-next-line no-restricted-syntax
2525
- // @ts-expect-error - TS2769 - No overload matches this call.
2526
- clearTimeout(this.errorTimeout);
2527
1941
  this._isMounted = false;
2528
1942
  };
1943
+ this._handleMouseDown = () => {
1944
+ if (this._isMounted && this.state.showErrorTooltip) {
1945
+ this.setState({
1946
+ showErrorTooltip: false
1947
+ });
1948
+ }
1949
+ };
2529
1950
  this.simpleValidate = (rubric, onInputError) => {
2530
1951
  onInputError = onInputError || function () {};
2531
1952
  const result = Expression.validate(this.getUserInput(), rubric, onInputError);
@@ -2552,7 +1973,8 @@ class Expression extends React.Component {
2552
1973
  this.props.trackInteraction();
2553
1974
  };
2554
1975
  this._handleFocus = () => {
2555
- this.props.analytics.onAnalyticsEvent({
1976
+ var _this$props$analytics;
1977
+ (_this$props$analytics = this.props.analytics) == null ? void 0 : _this$props$analytics.onAnalyticsEvent({
2556
1978
  type: "perseus:expression-focused",
2557
1979
  payload: null
2558
1980
  });
@@ -2761,7 +2183,8 @@ class Expression extends React.Component {
2761
2183
  this.refs.input.insert(keyPressed);
2762
2184
  }
2763
2185
  sendExpressionEvaluatedEvent(result) {
2764
- this.props.analytics.onAnalyticsEvent({
2186
+ var _this$props$analytics2;
2187
+ (_this$props$analytics2 = this.props.analytics) == null ? void 0 : _this$props$analytics2.onAnalyticsEvent({
2765
2188
  type: "perseus:expression-evaluated",
2766
2189
  payload: {
2767
2190
  result,
@@ -2770,6 +2193,7 @@ class Expression extends React.Component {
2770
2193
  });
2771
2194
  }
2772
2195
  render() {
2196
+ var _this$props$keypadCon, _this$props$analytics3;
2773
2197
  if (this.props.apiOptions.customKeypad) {
2774
2198
  return /*#__PURE__*/React.createElement(KeypadInput
2775
2199
  // eslint-disable-next-line react/no-string-refs
@@ -2792,47 +2216,27 @@ class Expression extends React.Component {
2792
2216
  onBlur: this._handleBlur
2793
2217
  });
2794
2218
  }
2795
- // TODO(alex): Style this tooltip to be more consistent with other
2796
- // tooltips on the site; align to left middle (once possible)
2797
- const errorTooltip = /*#__PURE__*/React.createElement("span", {
2798
- className: "error-tooltip",
2799
- role: "tooltip"
2800
- }, /*#__PURE__*/React.createElement(Tooltip, {
2801
- className: "error-text-container",
2802
- horizontalPosition: HorizontalDirection.Right,
2803
- horizontalAlign: HorizontalDirection.Left,
2804
- verticalPosition: VerticalDirection.Top,
2805
- arrowSize: 10,
2806
- borderColor: "#fcc335",
2807
- show: this.state.showErrorText
2808
- }, /*#__PURE__*/React.createElement("span", {
2809
- className: "error-icon",
2810
- "data-test-id": "test-error-icon",
2811
- onMouseEnter: () => {
2812
- this.setState({
2813
- showErrorText: true
2814
- });
2815
- },
2816
- onMouseLeave: () => {
2817
- this.setState({
2818
- showErrorText: false
2819
- });
2820
- },
2821
- onClick: () => {
2822
- // TODO(alex): Better error feedback for mobile
2823
- this.setState({
2824
- showErrorText: !this.state.showErrorText
2825
- });
2826
- }
2827
- }, /*#__PURE__*/React.createElement(InlineIcon, iconExclamationSign)), /*#__PURE__*/React.createElement("div", {
2828
- className: "error-text"
2829
- }, ERROR_MESSAGE)));
2830
2219
  const className = classNames({
2831
2220
  "perseus-widget-expression": true,
2832
2221
  "show-error-tooltip": this.state.showErrorTooltip
2833
2222
  });
2834
2223
  return /*#__PURE__*/React.createElement("div", {
2835
- className: className
2224
+ className: className,
2225
+ onBlur: () => this.state.invalid && this.setState({
2226
+ showErrorTooltip: true,
2227
+ showErrorStyle: true
2228
+ }),
2229
+ onFocus: () => this.setState({
2230
+ showErrorTooltip: false
2231
+ })
2232
+ }, /*#__PURE__*/React.createElement(View, {
2233
+ style: a11y.srOnly,
2234
+ role: "alert"
2235
+ }, this.state.showErrorTooltip && ERROR_TITLE + " " + ERROR_MESSAGE), /*#__PURE__*/React.createElement(Tooltip$1, {
2236
+ forceAnchorFocusivity: false,
2237
+ opened: this.state.showErrorTooltip,
2238
+ title: ERROR_TITLE,
2239
+ content: ERROR_MESSAGE
2836
2240
  }, /*#__PURE__*/React.createElement(MathInput
2837
2241
  // eslint-disable-next-line react/no-string-refs
2838
2242
  , {
@@ -2841,11 +2245,15 @@ class Expression extends React.Component {
2841
2245
  value: this.props.value,
2842
2246
  onChange: this.changeAndTrack,
2843
2247
  convertDotToTimes: this.props.times,
2844
- buttonsVisible: this.props.buttonsVisible || "focused",
2845
2248
  buttonSets: this.props.buttonSets,
2846
2249
  onFocus: this._handleFocus,
2847
- onBlur: this._handleBlur
2848
- }), this.state.showErrorTooltip && errorTooltip);
2250
+ onBlur: this._handleBlur,
2251
+ hasError: this.state.showErrorStyle,
2252
+ extraKeys: (_this$props$keypadCon = this.props.keypadConfiguration) == null ? void 0 : _this$props$keypadCon.extraKeys,
2253
+ analytics: (_this$props$analytics3 = this.props.analytics) != null ? _this$props$analytics3 : {
2254
+ onAnalyticsEvent: async function () {}
2255
+ }
2256
+ })));
2849
2257
  }
2850
2258
  }
2851
2259
 
@@ -2888,11 +2296,18 @@ const keypadConfigurationForProps = widgetOptions => {
2888
2296
  // and Theta, so we special-case.
2889
2297
  const isGreek = symbol => symbol === "pi" || symbol === "theta";
2890
2298
  const toKey = symbol => isGreek(symbol) ? symbol.toUpperCase() : symbol;
2299
+ const isKey = key => KeyArray.includes(key);
2891
2300
  for (const variable of expr.getVars()) {
2892
- uniqueExtraVariables[toKey(variable)] = true;
2301
+ const maybeKey = toKey(variable);
2302
+ if (isKey(maybeKey)) {
2303
+ uniqueExtraVariables[maybeKey] = true;
2304
+ }
2893
2305
  }
2894
2306
  for (const constant of expr.getConsts()) {
2895
- uniqueExtraConstants[toKey(constant)] = true;
2307
+ const maybeKey = toKey(constant);
2308
+ if (isKey(maybeKey)) {
2309
+ uniqueExtraConstants[maybeKey] = true;
2310
+ }
2896
2311
  }
2897
2312
  }
2898
2313
  }
@@ -4352,60 +3767,60 @@ const articleMaxWidthInPx = 688;
4352
3767
  const articleMaxWidthTableInPx = 512;
4353
3768
 
4354
3769
  var constants$1 = /*#__PURE__*/Object.freeze({
4355
- __proto__: null,
4356
- baseFontFamily: baseFontFamily$1,
4357
- boldFontFamily: boldFontFamily,
4358
- green: green$1,
4359
- kaGreen: kaGreen$1,
4360
- blue: blue$1,
4361
- gray: gray$1,
4362
- red: red$1,
4363
- grayLight: grayLight$1,
4364
- grayLighter: grayLighter$1,
4365
- learnstormBlue: learnstormBlue$1,
4366
- white: white$1,
4367
- gray98: gray98,
4368
- gray97: gray97,
4369
- gray95: gray95,
4370
- gray90: gray90,
4371
- gray85: gray85,
4372
- gray76: gray76,
4373
- gray68: gray68,
4374
- gray41: gray41,
4375
- gray25: gray25,
4376
- gray17: gray17,
4377
- black: black$1,
4378
- warning1: warning1,
4379
- warning3: warning3,
4380
- pureSmMin: pureSmMin$2,
4381
- pureMdMin: pureMdMin$2,
4382
- pureLgMin: pureLgMin$2,
4383
- pureXlMin: pureXlMin$2,
4384
- pureXsMax: pureXsMax$2,
4385
- pureSmMax: pureSmMax$2,
4386
- pureMdMax: pureMdMax$2,
4387
- pureLgMax: pureLgMax$2,
4388
- tableBackgroundAccent: tableBackgroundAccent$1,
4389
- zIndexScratchPad: zIndexScratchPad,
4390
- zIndexAboveScratchpad: zIndexAboveScratchpad$1,
4391
- zIndexInteractiveComponent: zIndexInteractiveComponent$1,
4392
- zIndexCurrentlyDragging: zIndexCurrentlyDragging,
4393
- zIndexCalculator: zIndexCalculator,
4394
- phoneMargin: phoneMargin,
4395
- negativePhoneMargin: negativePhoneMargin,
4396
- hintBorderWidth: hintBorderWidth,
4397
- baseUnitPx: baseUnitPx,
4398
- interactiveSizes: interactiveSizes$1,
4399
- circleSize: circleSize$1,
4400
- radioMarginWidth: radioMarginWidth$1,
4401
- warningColor: warningColor,
4402
- warningColorHover: warningColorHover,
4403
- warningColorActive: warningColorActive,
4404
- publishBlockingErrorColor: publishBlockingErrorColor,
4405
- radioBorderColor: radioBorderColor$1,
4406
- checkedColor: checkedColor$1,
4407
- articleMaxWidthInPx: articleMaxWidthInPx,
4408
- articleMaxWidthTableInPx: articleMaxWidthTableInPx
3770
+ __proto__: null,
3771
+ baseFontFamily: baseFontFamily$1,
3772
+ boldFontFamily: boldFontFamily,
3773
+ green: green$1,
3774
+ kaGreen: kaGreen$1,
3775
+ blue: blue$1,
3776
+ gray: gray$1,
3777
+ red: red$1,
3778
+ grayLight: grayLight$1,
3779
+ grayLighter: grayLighter$1,
3780
+ learnstormBlue: learnstormBlue$1,
3781
+ white: white$1,
3782
+ gray98: gray98,
3783
+ gray97: gray97,
3784
+ gray95: gray95,
3785
+ gray90: gray90,
3786
+ gray85: gray85,
3787
+ gray76: gray76,
3788
+ gray68: gray68,
3789
+ gray41: gray41,
3790
+ gray25: gray25,
3791
+ gray17: gray17,
3792
+ black: black$1,
3793
+ warning1: warning1,
3794
+ warning3: warning3,
3795
+ pureSmMin: pureSmMin$2,
3796
+ pureMdMin: pureMdMin$2,
3797
+ pureLgMin: pureLgMin$2,
3798
+ pureXlMin: pureXlMin$2,
3799
+ pureXsMax: pureXsMax$2,
3800
+ pureSmMax: pureSmMax$2,
3801
+ pureMdMax: pureMdMax$2,
3802
+ pureLgMax: pureLgMax$2,
3803
+ tableBackgroundAccent: tableBackgroundAccent$1,
3804
+ zIndexScratchPad: zIndexScratchPad,
3805
+ zIndexAboveScratchpad: zIndexAboveScratchpad$1,
3806
+ zIndexInteractiveComponent: zIndexInteractiveComponent$1,
3807
+ zIndexCurrentlyDragging: zIndexCurrentlyDragging,
3808
+ zIndexCalculator: zIndexCalculator,
3809
+ phoneMargin: phoneMargin,
3810
+ negativePhoneMargin: negativePhoneMargin,
3811
+ hintBorderWidth: hintBorderWidth,
3812
+ baseUnitPx: baseUnitPx,
3813
+ interactiveSizes: interactiveSizes$1,
3814
+ circleSize: circleSize$1,
3815
+ radioMarginWidth: radioMarginWidth$1,
3816
+ warningColor: warningColor,
3817
+ warningColorHover: warningColorHover,
3818
+ warningColorActive: warningColorActive,
3819
+ publishBlockingErrorColor: publishBlockingErrorColor,
3820
+ radioBorderColor: radioBorderColor$1,
3821
+ checkedColor: checkedColor$1,
3822
+ articleMaxWidthInPx: articleMaxWidthInPx,
3823
+ articleMaxWidthTableInPx: articleMaxWidthTableInPx
4409
3824
  });
4410
3825
 
4411
3826
  /**
@@ -14959,6 +14374,196 @@ _.extend(MovableLine$4.prototype, {
14959
14374
  }
14960
14375
  });
14961
14376
 
14377
+ /**
14378
+ * A stripped version of Icon.jsx from webapp. Takes an SVG icon and renders it
14379
+ * inline like Font Awesome did.
14380
+ *
14381
+ * If you are looking for an icon that we've used before you should look in
14382
+ * webapp's `icon-paths.js` which is a reference file for all the SVG paths
14383
+ * that we've used. You'll need to copy the object from that file into
14384
+ * whichever file you're using the icon and explicitly pass it in to the
14385
+ * <InlineIcon/> React component.
14386
+ *
14387
+ * We assume that the viewBox is cropped and aligned to (0, 0), but icons can
14388
+ * be defined differently. At some point we might want to add these attributes
14389
+ * to `icon-paths.js`, but for now this is a fairly safe assumption.
14390
+ *
14391
+ * Sample usage:
14392
+ *
14393
+ * const editIcon = {
14394
+ * path: "M41.209 53.753l5.39 0l0 5.39l3.136 0l6.468-6.517-8.477-8.526-6.517 6.517l0 3.136zm33.173-34.937q-.882-.882-1.862.049l-19.6 19.6q-.931.98-.049 1.862t1.862-.049l19.6-19.6q.931-.98.049-1.862zm-38.563 45.668l0-16.121l37.632-37.632 16.17 16.121-37.632 37.632l-16.17 0zm43.022-12.397l0 10.633q-.049 6.713-4.753 11.417t-11.368 4.704l-46.599 0q-6.713 0-11.417-4.753t-4.704-11.368l0-46.599q0-6.664 4.753-11.417t11.368-4.704l46.599 0q3.528 0 6.566 1.372.833.392.98 1.323t-.49 1.617l-2.744 2.744q-.784.784-1.96.441t-2.352-.343l-46.599 0q-3.675 0-6.321 2.646t-2.646 6.321l0 46.599q0 3.675 2.646 6.321t6.321 2.646l46.599 0q3.675 0 6.321-2.646t2.646-6.321l0-7.056q0-.735.49-1.225l3.577-3.577q.833-.833 1.96-.392t1.127 1.617zm7.203-51.646q2.254 0 3.773 1.568l8.526 8.526q1.568 1.568 1.568 3.822t-1.568 3.773l-5.145 5.145-16.121-16.121 5.145-5.145q1.568-1.568 3.822-1.568z",
14395
+ * width: 100,
14396
+ * height: 78.912,
14397
+ * };
14398
+ * <InlineIcon {...editIcon} />
14399
+ *
14400
+ */
14401
+ const InlineIcon = ({
14402
+ path,
14403
+ width,
14404
+ height,
14405
+ style: _style = {},
14406
+ title
14407
+ }) => /*#__PURE__*/React.createElement("svg", {
14408
+ role: "img",
14409
+ "aria-hidden": !title,
14410
+ style: _extends({
14411
+ verticalAlign: "middle"
14412
+ }, _style),
14413
+ width: `${width / height}em`,
14414
+ height: "1em",
14415
+ viewBox: `0 0 ${width} ${height}`
14416
+ }, !!title && /*#__PURE__*/React.createElement("title", null, title), /*#__PURE__*/React.createElement("path", {
14417
+ d: path,
14418
+ fill: "currentColor"
14419
+ }));
14420
+
14421
+ /**
14422
+ * Icon paths to be used with `inline-icon.jsx`.
14423
+ *
14424
+ * These paths are taken directly from webapp's `icon-paths.js`. Unlike the
14425
+ * webapp equivalent, these can be directly required within Perseus files since
14426
+ * this is all bundled together anyway.
14427
+ */
14428
+
14429
+ const iconCheck = {
14430
+ path: `M8.70710678,12.2928932 C8.31658249,11.9023689 7.68341751,11.9023689 7.29289322,12.2928932 C6.90236893,12.6834175 6.90236893,13.3165825 7.29289322,13.7071068 L9.82842712,16.2426407 C10.2207367,16.6349502 10.8574274,16.6328935 11.2471942,16.2380576 L16.7116603,10.7025237 C17.0996535,10.3094846 17.0955629,9.67633279 16.7025237,9.28833966 C16.3094846,8.90034653 15.6763328,8.90443714 15.2883397,9.29747629 L10.5309507,14.1167372 L8.70710678,12.2928932 Z`,
14431
+ width: 24,
14432
+ height: 24
14433
+ };
14434
+ const iconCheckMedium = {
14435
+ path: "M6.072 10.4l6.175-7.058a1 1 0 1 1 1.506 1.317L6.769 12.64a1 1 0 0 1-1.55-.054L2.203 8.604a1 1 0 1 1 1.594-1.208L6.072 10.4z",
14436
+ width: 16,
14437
+ height: 16
14438
+ };
14439
+ const iconChevronDown = {
14440
+ path: "M99.669 13.048q0 3.36-2.352 5.712l-41.664 41.664q-2.408 2.408-5.88 2.408t-5.712-2.408l-41.664-41.664q-2.408-2.24-2.408-5.712t2.408-5.88l4.76-4.816q2.52-2.352 5.88-2.352t5.656 2.352l31.136 31.136 31.08-31.136q2.352-2.352 5.712-2.352t5.88 2.352l4.816 4.816q2.352 2.52 2.352 5.88z",
14441
+ width: 100,
14442
+ height: 63.034
14443
+ };
14444
+ const iconChevronRight = {
14445
+ path: "M62.808 49.728q0 3.36-2.352 5.88l-41.72 41.664q-2.352 2.408-5.768 2.408t-5.768-2.408l-4.872-4.76q-2.352-2.52-2.352-5.88t2.352-5.712l31.08-31.136-31.08-31.024q-2.352-2.52-2.352-5.88t2.352-5.712l4.872-4.76q2.296-2.408 5.768-2.408t5.768 2.408l41.72 41.664q2.352 2.296 2.352 5.656z",
14446
+ width: 63.034,
14447
+ height: 100
14448
+ };
14449
+ const iconCircle = {
14450
+ path: "M100.035 50.046q.057 13.623-6.669 25.137t-18.24 18.183-25.08 6.669-25.137-6.726q-11.514-6.726-18.183-18.183-6.726-11.571-6.726-25.137t6.726-25.08 18.24-18.24 25.08-6.669q13.566 0 25.08 6.726 11.514 6.669 18.24 18.183t6.669 25.137z",
14451
+ width: 100,
14452
+ height: 100
14453
+ };
14454
+ const iconCircleArrowDown = {
14455
+ path: "M50.046 83.676q1.767 0 2.907-1.14l29.526-29.526q1.197-1.197 1.197-2.907t-1.197-2.964l-5.928-5.928q-1.197-1.14-2.964-1.14t-2.907 1.14l-12.312 12.312l0-32.661q0-1.71-1.254-2.964t-2.907-1.254l-8.322 0q-1.71 0-2.964 1.254t-1.254 2.964l0 32.661l-12.312-12.312q-1.197-1.254-2.907-1.254t-2.907 1.254l-5.928 5.928q-1.197 1.197-1.197 2.964t1.197 2.907l29.469 29.526q1.197 1.14 2.964 1.14zm49.989-33.63q.057 13.623-6.669 25.137t-18.24 18.183-25.08 6.669-25.137-6.726q-11.514-6.726-18.183-18.183-6.726-11.571-6.726-25.137t6.726-25.08 18.24-18.24 25.08-6.669q13.566 0 25.08 6.726 11.514 6.669 18.24 18.183t6.669 25.137z",
14456
+ width: 100,
14457
+ height: 100
14458
+ };
14459
+ const iconCircleArrowUp = {
14460
+ path: "M54.207 83.391q1.653 0 2.907-1.254t1.254-2.907l0-32.718l12.312 12.312q1.254 1.254 2.964 1.254t2.907-1.254l5.928-5.928q1.197-1.197 1.14-2.964 0-1.767-1.14-2.907l-29.526-29.526q-1.197-1.14-2.907-1.14t-2.964 1.14l-29.469 29.526q-1.197 1.254-1.197 2.964t1.197 2.907l5.928 5.928q1.197 1.197 2.907 1.197t2.907-1.197l12.312-12.312l0 32.718q0 1.653 1.254 2.907t2.964 1.254l8.322 0zm45.828-33.345q.057 13.623-6.669 25.137t-18.24 18.183-25.08 6.669-25.137-6.726q-11.514-6.726-18.183-18.183-6.726-11.571-6.726-25.137t6.726-25.08 18.24-18.24 25.08-6.669q13.566 0 25.08 6.726 11.514 6.669 18.24 18.183t6.669 25.137z",
14461
+ width: 100,
14462
+ height: 100
14463
+ };
14464
+ const iconCircleThin = {
14465
+ path: "M50.046 8.322q-8.493 0-16.188 3.306-15.561 6.669-22.173 22.23-3.363 7.695-3.363 16.188t3.306 16.188 8.949 13.281q5.586 5.586 13.281 8.892t16.188 3.306 16.188-3.306 13.281-8.892 8.892-13.281 3.306-16.188-3.306-16.188-8.892-13.281-13.281-8.949q-7.695-3.306-16.188-3.306zm0 91.713q-13.623 0-25.137-6.726t-18.183-18.183q-6.726-11.571-6.726-25.137t6.726-25.08 18.24-18.24 25.08-6.669q13.566 0 25.08 6.726 11.514 6.669 18.24 18.183t6.726 25.137-6.726 25.137-18.24 18.126q-11.514 6.726-25.08 6.726z",
14466
+ width: 100,
14467
+ height: 99.944
14468
+ };
14469
+ const iconDesktop = {
14470
+ path: "M94.208 52.119l0-43.746q0-.69-.506-1.15t-1.196-.506l-84.088 0q-.69 0-1.196.506t-.506 1.15l0 43.746q0 .69.506 1.196t1.196.506l84.088 0q.69 0 1.196-.506t.506-1.196zm6.716-43.746l0 57.224q0 3.45-2.484 5.934t-5.934 2.484l-28.566 0q0 3.128 2.53 7.774.828 1.61.828 2.622t-1.012 2.07q-1.012 1.012-2.346.966l-26.91 0q-1.38 0-2.392-1.012t-1.012-2.024q0-1.058 1.656-4.14t1.748-6.256l-28.612 0q-3.45 0-5.934-2.484t-2.484-5.934l0-57.224q0-3.45 2.484-5.934t5.934-2.438l84.088 0q3.45 0 5.98 2.438 2.438 2.484 2.438 5.934z",
14471
+ width: 100,
14472
+ height: 86.648
14473
+ };
14474
+ const iconDropdownArrow = {
14475
+ path: "M9 9.8c0 .5.7 1.7 1.5 2.8 1.5 1.9 1.5 1.9 3 0C15.7 9.7 15.4 9 12 9c-1.6 0-3 .4-3 .8z",
14476
+ width: 24,
14477
+ height: 24
14478
+ };
14479
+ const iconExclamationSign = {
14480
+ path: "M58.368 81.225l0-12.369q0-.912-.57-1.539t-1.425-.627l-12.54 0q-.855-.057-1.482.627t-.684 1.539l0 12.369q-.057.855.627 1.482t1.539.684l12.54 0q.855 0 1.425-.627t.57-1.539zm1.026-62.871q0-1.596-2.223-1.71l-14.307 0q-2.109 0-2.223 1.71l1.14 40.47q0 .627.627 1.14t1.539.456l12.084 0q.912-.057 1.539-.513t.684-1.083zm-9.348-18.354q13.566 0 25.08 6.726 11.514 6.669 18.24 18.183t6.726 25.137-6.726 25.137-18.24 18.183-25.08 6.669-25.137-6.726q-11.514-6.726-18.183-18.183-6.726-11.571-6.726-25.137t6.726-25.08 18.24-18.24 25.08-6.669z",
14481
+ width: 100,
14482
+ height: 99.944
14483
+ };
14484
+ // Grabbed from https://github.com/encharm/Font-Awesome-SVG-PNG
14485
+ const iconGear = {
14486
+ path: "M1152 896q0-106-75-181t-181-75-181 75-75 181 75 181 181 75 181-75 75-181zm512-109v222q0 12-8 23t-20 13l-185 28q-19 54-39 91 35 50 107 138 10 12 10 25t-9 23q-27 37-99 108t-94 71q-12 0-26-9l-138-108q-44 23-91 38-16 136-29 186-7 28-36 28h-222q-14 0-24.5-8.5t-11.5-21.5l-28-184q-49-16-90-37l-141 107q-10 9-25 9-14 0-25-11-126-114-165-168-7-10-7-23 0-12 8-23 15-21 51-66.5t54-70.5q-27-50-41-99l-183-27q-13-2-21-12.5t-8-23.5v-222q0-12 8-23t19-13l186-28q14-46 39-92-40-57-107-138-10-12-10-24 0-10 9-23 26-36 98.5-107.5t94.5-71.5q13 0 26 10l138 107q44-23 91-38 16-136 29-186 7-28 36-28h222q14 0 24.5 8.5t11.5 21.5l28 184q49 16 90 37l142-107q9-9 24-9 13 0 25 10 129 119 165 170 7 8 7 22 0 12-8 23-15 21-51 66.5t-54 70.5q26 50 41 98l183 28q13 2 21 12.5t8 23.5z",
14487
+ width: 1792,
14488
+ height: 1792
14489
+ };
14490
+ const iconMobilePhone = {
14491
+ path: "M36.04 89.557q0-2.584-1.836-4.42t-4.42-1.836-4.352 1.836q-1.836 1.836-1.836 4.42t1.836 4.352 4.42 1.836q2.652-.068 4.42-1.836t1.768-4.352zm16.184-12.444l0-54.74q0-1.088-.748-1.768t-1.768-.68l-39.78 0q-1.088 0-1.768.748t-.68 1.7l0 54.74q0 1.02.748 1.768t1.7.68l39.78 0q1.02-.068 1.768-.748t.748-1.7zm-14.892-65.892q0-1.224-1.292-1.292l-12.444 0q-1.224.068-1.224 1.292t1.224 1.224l12.444 0q1.292 0 1.292-1.224zm22.372-1.292l0 79.628q0 3.944-2.992 6.936t-7.004 2.992l-39.78 0q-4.012 0-7.004-2.924-2.924-2.924-2.924-7.004l0-79.628q0-4.012 2.924-6.936t7.004-2.992l39.78 0q4.012-.068 7.004 2.924t2.992 7.004z",
14492
+ width: 60.013,
14493
+ height: 100
14494
+ };
14495
+ const iconOk = {
14496
+ path: "M37.964 76.048q-2.576 0-4.368-1.792l-31.864-31.864q-1.792-1.792-1.792-4.368t1.792-4.368l8.736-8.68q1.792-1.792 4.368-1.792t4.312 1.792l18.816 18.872 42-42.056q1.792-1.792 4.368-1.792t4.312 1.792l8.736 8.736q1.792 1.792 1.792 4.368t-1.792 4.312l-55.048 55.048q-1.792 1.792-4.368 1.792z",
14497
+ width: 100,
14498
+ height: 76.637
14499
+ };
14500
+ const iconPlus = {
14501
+ path: "M99.758 43.09l0 13.578q0 2.852-1.984 4.836t-4.836 1.984l-29.45 0l0 29.45q0 2.852-1.984 4.836t-4.836 1.984l-13.578 0q-2.852 0-4.836-1.984t-1.984-4.836l0-29.45l-29.45 0q-2.852 0-4.836-1.984t-1.984-4.836l0-13.578q0-2.852 1.984-4.836t4.836-1.984l29.45 0l0-29.45q0-2.852 1.984-4.836t4.836-1.984l13.578 0q2.852 0 4.836 1.984t1.984 4.836l0 29.45l29.45 0q2.852 0 4.836 1.984t1.984 4.836z",
14502
+ width: 100,
14503
+ height: 100
14504
+ };
14505
+ const iconRemove = {
14506
+ path: "M100.464 80.808q0 3.404-2.368 5.772l-11.47 11.544q-2.368 2.368-5.772 2.368t-5.698-2.368l-24.864-24.864-24.864 24.864q-2.368 2.368-5.772 2.368t-5.772-2.368l-11.47-11.544q-2.368-2.368-2.368-5.772t2.368-5.698l24.864-24.864-24.864-24.864q-2.368-2.368-2.368-5.772t2.368-5.772l11.47-11.47q2.368-2.368 5.772-2.368t5.772 2.368l24.864 24.864 24.864-24.864q2.294-2.368 5.698-2.368t5.772 2.368l11.47 11.47q2.368 2.368 2.368 5.772t-2.368 5.772l-24.864 24.864 24.864 24.864q2.368 2.294 2.368 5.698z",
14507
+ width: 100,
14508
+ height: 100
14509
+ };
14510
+ const iconStar = {
14511
+ path: "M15.1052249,9.55978547 L22.0028147,9.55978545 C23.6568673,9.55978545 23.9349557,10.3753626 22.6181351,11.3858845 L16.9943688,15.7015366 L19.2518801,22.8294455 C19.7526645,24.4106317 19.0984455,24.8825885 17.769353,23.8673293 L12.0490577,19.4977438 L6.5116497,23.8422153 C5.20921411,24.8640642 4.53299569,24.4067544 5.00266927,22.8160582 L7.10332364,15.7015366 L1.42794544,11.3634306 C0.110226041,10.3562014 0.383967283,9.54239221 2.0409646,9.54574013 L8.9924676,9.55978547 L11.1485117,2.72669438 C11.6458693,1.15043244 12.4548928,1.15900049 12.9494787,2.72669438 L15.1052249,9.55978547 Z",
14512
+ width: 24,
14513
+ height: 24
14514
+ };
14515
+ const iconTryAgain = {
14516
+ path: "M3.74890556,17.9799506 C2.19251241,16.1970909 1.10103636,13.4971457 1.13090903,11.1491783 C1.17160478,7.95052637 4.01704076,0.865059407 11.7028044,0.865059407 C19.388568,0.865059407 22.3026521,7.35203035 22.3026521,11.5879453 C22.3026521,15.8238603 19.386629,20.5574509 13.6832464,21.7131548 L13.6757539,17.3722171 C17.0812986,16.2190517 18.331158,14.1944123 18.3311578,11.5879451 C18.3311574,8.16554692 15.6664205,5.03476549 11.7028048,5.20494205 C7.73918903,5.37511861 5.59244567,8.66930079 5.59244567,11.1491783 C5.59244567,12.9090077 6.11128139,14.1753512 6.93640437,15.3053215 L8.14052356,14.2949456 C8.98559348,13.5858477 9.6994861,13.9070448 9.73489556,15.0076413 L9.91284941,20.5388014 C9.94832683,21.6415103 9.09967118,22.3514475 8.02194403,22.1254594 L2.60571602,20.9897332 C1.5259204,20.7633114 1.34338662,19.9984207 2.18070755,19.295825 L3.74890556,17.9799506 Z",
14517
+ width: 23,
14518
+ height: 23
14519
+ };
14520
+ const iconTablet = {
14521
+ path: "M45.322 90.706q0-1.86-1.302-3.224-1.364-1.364-3.224-1.364t-3.224 1.364-1.302 3.224q0 1.86 1.364 3.224 1.302 1.364 3.162 1.302 1.86.062 3.224-1.302t1.302-3.224zm27.218-11.346l0-68.014q0-.93-.682-1.612t-1.55-.682l-58.962 0q-.93 0-1.612.682t-.682 1.612l0 68.014q0 .93.682 1.612t1.612.62l58.962 0q.992-.062 1.612-.682t.62-1.55zm9.114-68.014l0 77.066q0 4.65-3.348 7.998t-7.998 3.348l-58.962 0q-4.65 0-7.998-3.348t-3.348-7.998l0-77.066q0-4.65 3.348-7.998t7.998-3.348l58.962 0q4.65 0 7.998 3.348t3.348 7.998z",
14522
+ width: 81.852,
14523
+ height: 100
14524
+ };
14525
+ const iconTrash = {
14526
+ path: "M31.293 37.506q2.052 0 2.052 2.109l0 37.506q0 1.995-2.052 2.109l-4.218 0q-.912-.057-1.482-.627t-.57-1.482l0-37.506q0-2.109 2.052-2.109l4.218 0zm18.753 2.109l0 37.506q0 .912-.57 1.482t-1.539.627l-4.161 0q-1.995 0-2.109-2.109l0-37.506q.057-.912.627-1.482t1.482-.627l4.161 0q.969.057 1.539.627t.57 1.482zm14.592-2.109q2.052 0 2.052 2.109l0 37.506q0 1.995-2.052 2.109l-4.161 0q-.969-.057-1.539-.627t-.57-1.482l0-37.506q0-2.109 2.109-2.109l4.161 0zm10.431 49.248l0-61.731l-58.368 0l0 61.731q.057 2.679.969 3.819t1.083 1.14l54.207 0q.171 0 1.14-1.083t.969-3.876zm-43.776-70.11l29.184 0l-3.135-7.581q-.456-.57-1.14-.741l-20.634 0q-.627.114-1.083.741zm-31.293 2.109q0-1.995 2.109-2.109l20.121 0l4.56-10.83q.969-2.394 3.477-4.104 2.565-1.71 5.187-1.71l20.805 0q2.622 0 5.187 1.71t3.477 4.104l4.56 10.83l20.178 0q.912.057 1.482.627t.57 1.482l0 4.161q0 1.995-2.052 2.109l-6.27 0l0 61.731q0 5.415-3.078 9.348t-7.353 3.933l-54.207 0q-4.275 0-7.353-3.819t-3.078-9.177l0-62.016l-6.213 0q-.969 0-1.539-.57t-.57-1.539l0-4.161z",
14527
+ width: 91.681,
14528
+ height: 100
14529
+ };
14530
+ const iconUndo = {
14531
+ path: "M10,6.6C10,7.2,9.8,8,9.3,9.1c0,0,0,0.1-0.1,0.1S9.2,9.3,9.2,9.4c0,0,0,0.1-0.1,0.1C9,9.6,9,9.6,8.9,9.6 c-0.1,0-0.1,0-0.1-0.1c0,0,0-0.1,0-0.1c0,0,0-0.1,0-0.1s0-0.1,0-0.1c0-0.3,0-0.5,0-0.7c0-0.4,0-0.7-0.1-1C8.6,7.1,8.5,6.9,8.4,6.7S8.2,6.3,8,6.1C7.8,5.9,7.6,5.8,7.4,5.7S6.9,5.5,6.7,5.5S6.1,5.4,5.8,5.4c-0.3,0-0.6,0-1,0H3.6v1.4c0,0.1,0,0.2-0.1,0.3C3.4,7.1,3.3,7.1,3.2,7.1C3.1,7.1,3,7.1,3,7L0.1,4.1C0,4.1,0,4,0,3.9s0-0.2,0.1-0.3L3,0.8C3,0.7,3.1,0.7,3.2,0.7c0.1,0,0.2,0,0.3,0.1C3.5,0.9,3.6,0.9,3.6,1v1.4h1.2c2.6,0,4.3,0.7,4.9,2.2C9.9,5.2,10,5.8,10,6.6z",
14532
+ width: 10,
14533
+ height: 10
14534
+ };
14535
+ const iconMinus = {
14536
+ path: `M8,13 L16,13 C16.5522847,13 17,12.5522847 17,12 C17,11.4477153 16.5522847,11 16,11 L8,11 C7.44771525,11 7,11.4477153 7,12 C7,12.5522847 7.44771525,13 8,13 Z`,
14537
+ width: 24,
14538
+ height: 24
14539
+ };
14540
+
14541
+ var iconPaths = /*#__PURE__*/Object.freeze({
14542
+ __proto__: null,
14543
+ iconCheck: iconCheck,
14544
+ iconCheckMedium: iconCheckMedium,
14545
+ iconChevronDown: iconChevronDown,
14546
+ iconChevronRight: iconChevronRight,
14547
+ iconCircle: iconCircle,
14548
+ iconCircleArrowDown: iconCircleArrowDown,
14549
+ iconCircleArrowUp: iconCircleArrowUp,
14550
+ iconCircleThin: iconCircleThin,
14551
+ iconDesktop: iconDesktop,
14552
+ iconDropdownArrow: iconDropdownArrow,
14553
+ iconExclamationSign: iconExclamationSign,
14554
+ iconGear: iconGear,
14555
+ iconMobilePhone: iconMobilePhone,
14556
+ iconOk: iconOk,
14557
+ iconPlus: iconPlus,
14558
+ iconRemove: iconRemove,
14559
+ iconStar: iconStar,
14560
+ iconTryAgain: iconTryAgain,
14561
+ iconTablet: iconTablet,
14562
+ iconTrash: iconTrash,
14563
+ iconUndo: iconUndo,
14564
+ iconMinus: iconMinus
14565
+ });
14566
+
14962
14567
  /* eslint-disable @babel/no-invalid-this */
14963
14568
  const add$1 = {
14964
14569
  constrain: function () {
@@ -18703,10 +18308,10 @@ const getInteractiveBoxFromSizeClass = sizeClass => {
18703
18308
  };
18704
18309
 
18705
18310
  var sizingUtils = /*#__PURE__*/Object.freeze({
18706
- __proto__: null,
18707
- containerSizeClass: containerSizeClass,
18708
- getClassFromWidth: getClassFromWidth,
18709
- getInteractiveBoxFromSizeClass: getInteractiveBoxFromSizeClass
18311
+ __proto__: null,
18312
+ containerSizeClass: containerSizeClass,
18313
+ getClassFromWidth: getClassFromWidth,
18314
+ getInteractiveBoxFromSizeClass: getInteractiveBoxFromSizeClass
18710
18315
  });
18711
18316
 
18712
18317
  const DEFAULT_ALIGNMENT$1 = "block";
@@ -19043,28 +18648,28 @@ const isLintable = type => {
19043
18648
  };
19044
18649
 
19045
18650
  var widgets$1 = /*#__PURE__*/Object.freeze({
19046
- __proto__: null,
19047
- registerWidget: registerWidget,
19048
- registerWidgets: registerWidgets,
19049
- registerEditors: registerEditors,
19050
- getWidget: getWidget,
19051
- getEditor: getEditor,
19052
- getTransform: getTransform,
19053
- getVersion: getVersion,
19054
- getVersionVector: getVersionVector,
19055
- getPublicWidgets: getPublicWidgets,
19056
- isAccessible: isAccessible,
19057
- getAllWidgetTypes: getAllWidgetTypes,
19058
- upgradeWidgetInfoToLatestVersion: upgradeWidgetInfoToLatestVersion,
19059
- getRendererPropsForWidgetInfo: getRendererPropsForWidgetInfo,
19060
- traverseChildWidgets: traverseChildWidgets$4,
19061
- getSupportedAlignments: getSupportedAlignments,
19062
- getDefaultAlignment: getDefaultAlignment,
19063
- validateAlignments: validateAlignments,
19064
- supportsStaticMode: supportsStaticMode,
19065
- getStaticTransform: getStaticTransform,
19066
- getTracking: getTracking,
19067
- isLintable: isLintable
18651
+ __proto__: null,
18652
+ registerWidget: registerWidget,
18653
+ registerWidgets: registerWidgets,
18654
+ registerEditors: registerEditors,
18655
+ getWidget: getWidget,
18656
+ getEditor: getEditor,
18657
+ getTransform: getTransform,
18658
+ getVersion: getVersion,
18659
+ getVersionVector: getVersionVector,
18660
+ getPublicWidgets: getPublicWidgets,
18661
+ isAccessible: isAccessible,
18662
+ getAllWidgetTypes: getAllWidgetTypes,
18663
+ upgradeWidgetInfoToLatestVersion: upgradeWidgetInfoToLatestVersion,
18664
+ getRendererPropsForWidgetInfo: getRendererPropsForWidgetInfo,
18665
+ traverseChildWidgets: traverseChildWidgets$4,
18666
+ getSupportedAlignments: getSupportedAlignments,
18667
+ getDefaultAlignment: getDefaultAlignment,
18668
+ validateAlignments: validateAlignments,
18669
+ supportsStaticMode: supportsStaticMode,
18670
+ getStaticTransform: getStaticTransform,
18671
+ getTracking: getTracking,
18672
+ isLintable: isLintable
19068
18673
  });
19069
18674
 
19070
18675
  class WidgetContainer extends React.Component {
@@ -20829,6 +20434,258 @@ TextInput.defaultProps = {
20829
20434
  disabled: false
20830
20435
  };
20831
20436
 
20437
+ /* eslint-disable react/no-unsafe */
20438
+ const zIndex = 10;
20439
+ let HorizontalDirection = /*#__PURE__*/function (HorizontalDirection) {
20440
+ HorizontalDirection["Left"] = "left";
20441
+ HorizontalDirection["Right"] = "right";
20442
+ return HorizontalDirection;
20443
+ }({});
20444
+ let VerticalDirection = /*#__PURE__*/function (VerticalDirection) {
20445
+ VerticalDirection["Top"] = "top";
20446
+ VerticalDirection["Bottom"] = "bottom";
20447
+ return VerticalDirection;
20448
+ }({});
20449
+ const Triangle = props => {
20450
+ let borderLeft;
20451
+ let borderRight;
20452
+ let borderTop;
20453
+ let borderBottom;
20454
+ const hBorder = `${props.width}px solid transparent`;
20455
+ if (props.horizontalDirection === "right") {
20456
+ borderLeft = hBorder;
20457
+ } else {
20458
+ borderRight = hBorder;
20459
+ }
20460
+ const vBorder = `${props.height}px solid ${props.color}`;
20461
+ if (props.verticalDirection === "top") {
20462
+ borderTop = vBorder;
20463
+ } else {
20464
+ borderBottom = vBorder;
20465
+ }
20466
+ return /*#__PURE__*/React.createElement("div", {
20467
+ style: {
20468
+ display: "block",
20469
+ height: 0,
20470
+ width: 0,
20471
+ position: "absolute",
20472
+ left: props.left,
20473
+ top: props["top"],
20474
+ borderLeft: borderLeft,
20475
+ borderRight: borderRight,
20476
+ borderTop: borderTop,
20477
+ borderBottom: borderBottom
20478
+ }
20479
+ });
20480
+ };
20481
+ const TooltipArrow = props => {
20482
+ // TODO(aria): Think about adding a box-shadow to the triangle here
20483
+ // See http://css-tricks.com/triangle-with-shadow/
20484
+
20485
+ //const isRight = (this.props.horizontalDirection === "right");
20486
+ const isTop = props.verticalDirection === "top";
20487
+ const frontTopOffset = isTop ? 0 : 1;
20488
+ const borderTopOffset = isTop ? 0 : -1;
20489
+ return /*#__PURE__*/React.createElement("div", {
20490
+ style: {
20491
+ display: "block",
20492
+ position: props.position,
20493
+ visibility: props.visibility,
20494
+ left: props.left,
20495
+ top: props["top"],
20496
+ width: props.width + 2,
20497
+ height: props.height + 1,
20498
+ marginTop: -1,
20499
+ marginBottom: -2,
20500
+ zIndex: zIndex
20501
+ }
20502
+ }, /*#__PURE__*/React.createElement(Triangle, {
20503
+ horizontalDirection: props.horizontalDirection,
20504
+ verticalDirection: props.verticalDirection,
20505
+ color: props.border,
20506
+ left: 0,
20507
+ top: borderTopOffset,
20508
+ width: props.width + 2 // one extra for the diagonal
20509
+ ,
20510
+ height: props.height + 2
20511
+ }), /*#__PURE__*/React.createElement(Triangle, {
20512
+ horizontalDirection: props.horizontalDirection,
20513
+ verticalDirection: props.verticalDirection,
20514
+ color: props.color,
20515
+ left: 1,
20516
+ top: frontTopOffset,
20517
+ width: props.width,
20518
+ height: props.height
20519
+ }));
20520
+ };
20521
+ TooltipArrow.defaultProps = {
20522
+ position: "relative",
20523
+ visibility: "visible",
20524
+ left: 0,
20525
+ top: 0
20526
+ };
20527
+ const VERTICAL_CORNERS = {
20528
+ top: {
20529
+ top: "-100%"
20530
+ },
20531
+ bottom: {
20532
+ top: 0
20533
+ }
20534
+ };
20535
+ const HORIZONTAL_CORNERS = {
20536
+ left: {
20537
+ targetLeft: 0
20538
+ },
20539
+ right: {
20540
+ targetLeft: "100%"
20541
+ }
20542
+ };
20543
+ const HORIZONTAL_ALIGNMNENTS = {
20544
+ left: {
20545
+ tooltipLeft: 0,
20546
+ arrowLeft: arrowSize => 0
20547
+ },
20548
+ right: {
20549
+ tooltipLeft: "-100%",
20550
+ arrowLeft: arrowSize => -arrowSize - 2
20551
+ }
20552
+ };
20553
+ class Tooltip extends React.Component {
20554
+ constructor(...args) {
20555
+ super(...args);
20556
+ this.state = {
20557
+ height: null // used for offsetting "top" positioned tooltips
20558
+ };
20559
+ }
20560
+
20561
+ componentDidMount() {
20562
+ this._updateHeight();
20563
+ }
20564
+ UNSAFE_componentWillReceiveProps() {
20565
+ // If the contents have changed, reset our measure of the height
20566
+ this.setState({
20567
+ height: null
20568
+ });
20569
+ }
20570
+ componentDidUpdate() {
20571
+ this._updateHeight();
20572
+ }
20573
+ _renderToolTipDiv(isTooltipAbove) {
20574
+ const settings = Object.assign({}, HORIZONTAL_CORNERS[this.props.horizontalPosition], HORIZONTAL_ALIGNMNENTS[this.props.horizontalAlign], VERTICAL_CORNERS[this.props.verticalPosition]);
20575
+ let arrowAbove;
20576
+ let arrowBelow;
20577
+ if (isTooltipAbove) {
20578
+ // We put an absolutely positioned arrow in the correct place
20579
+ arrowAbove = /*#__PURE__*/React.createElement(TooltipArrow, {
20580
+ verticalDirection: VerticalDirection.Top,
20581
+ horizontalDirection: this.props.horizontalAlign,
20582
+ position: "absolute",
20583
+ color: "white",
20584
+ border: this.props.borderColor,
20585
+ left: settings.arrowLeft(this.props.arrowSize),
20586
+ top: -this.props.arrowSize + 2,
20587
+ width: this.props.arrowSize,
20588
+ height: this.props.arrowSize,
20589
+ zIndex: zIndex
20590
+ });
20591
+
20592
+ // And we use a visibility: hidden arrow below to shift up the
20593
+ // content by the correct amount
20594
+ arrowBelow = /*#__PURE__*/React.createElement(TooltipArrow, {
20595
+ verticalDirection: VerticalDirection.Top,
20596
+ horizontalDirection: this.props.horizontalAlign,
20597
+ visibility: "hidden",
20598
+ color: "white",
20599
+ border: this.props.borderColor,
20600
+ left: settings.arrowLeft(this.props.arrowSize),
20601
+ top: -1,
20602
+ width: this.props.arrowSize,
20603
+ height: this.props.arrowSize,
20604
+ zIndex: zIndex
20605
+ });
20606
+ } else {
20607
+ arrowAbove = /*#__PURE__*/React.createElement(TooltipArrow, {
20608
+ verticalDirection: VerticalDirection.Bottom,
20609
+ horizontalDirection: this.props.horizontalAlign,
20610
+ color: "white",
20611
+ border: this.props.borderColor,
20612
+ left: settings.arrowLeft(this.props.arrowSize),
20613
+ top: -1,
20614
+ width: this.props.arrowSize,
20615
+ height: this.props.arrowSize,
20616
+ zIndex: zIndex
20617
+ });
20618
+ arrowBelow = null;
20619
+ }
20620
+
20621
+ /* A positioned div below the input to be the parent for our
20622
+ tooltip */
20623
+ return /*#__PURE__*/React.createElement("div", {
20624
+ style: {
20625
+ position: "relative",
20626
+ height: 0,
20627
+ display: this.props.show ? "block" : "none"
20628
+ }
20629
+ }, /*#__PURE__*/React.createElement("div", {
20630
+ // eslint-disable-next-line react/no-string-refs
20631
+ ref: "tooltipContainer",
20632
+ className: "tooltipContainer",
20633
+ style: {
20634
+ position: "absolute",
20635
+ // height must start out undefined, not null, so that
20636
+ // we can measure the actual height with jquery.
20637
+ // This is used to position the tooltip with top: -100%
20638
+ // when in verticalPosition: "top" mode
20639
+ height: this.state.height || undefined,
20640
+ left: settings.targetLeft
20641
+ }
20642
+ }, arrowAbove, /*#__PURE__*/React.createElement("div", {
20643
+ className: this.props.className
20644
+ // eslint-disable-next-line react/no-string-refs
20645
+ ,
20646
+ ref: "tooltipContent",
20647
+ style: {
20648
+ position: "relative",
20649
+ top: settings["top"],
20650
+ left: settings.tooltipLeft,
20651
+ border: "1px solid " + this.props.borderColor,
20652
+ boxShadow: "0 1px 3px " + this.props.borderColor,
20653
+ zIndex: zIndex - 1
20654
+ }
20655
+ }, this.props.children.slice(1)), arrowBelow));
20656
+ }
20657
+ _updateHeight() {
20658
+ const tooltipContainer = ReactDOM__default.findDOMNode(
20659
+ // eslint-disable-next-line react/no-string-refs
20660
+ this.refs.tooltipContainer);
20661
+ const height = tooltipContainer.offsetHeight;
20662
+ if (height !== this.state.height) {
20663
+ this.setState({
20664
+ height
20665
+ });
20666
+ }
20667
+ }
20668
+ render() {
20669
+ const isTooltipAbove = this.props.verticalPosition === "top";
20670
+
20671
+ /* We wrap the entire output in a span so that it displays inline */
20672
+ return /*#__PURE__*/React.createElement("span", null, isTooltipAbove && this._renderToolTipDiv(isTooltipAbove), /*#__PURE__*/React.createElement("div", {
20673
+ style: this.props.targetContainerStyle
20674
+ }, this.props.children[0]), !isTooltipAbove && this._renderToolTipDiv());
20675
+ }
20676
+ }
20677
+
20678
+ // Sorry. // Apology-Oriented-Programming
20679
+ Tooltip.defaultProps = {
20680
+ className: "",
20681
+ arrowSize: 10,
20682
+ borderColor: "#ccc",
20683
+ verticalPosition: VerticalDirection.Bottom,
20684
+ horizontalPosition: HorizontalDirection.Left,
20685
+ horizontalAlign: HorizontalDirection.Left,
20686
+ targetContainerStyle: {}
20687
+ };
20688
+
20832
20689
  /* eslint-disable react/sort-comp */
20833
20690
  const {
20834
20691
  captureScratchpadTouchStart: captureScratchpadTouchStart$3
@@ -24618,26 +24475,6 @@ var Explanation$1 = {
24618
24475
  isLintable: true
24619
24476
  };
24620
24477
 
24621
- /*
24622
- * A11y (Accessibility) style rules
24623
- * These are used to mark up areas on the site that should only be readable
24624
- * when using a screen reader.
24625
- */
24626
- var a11y = StyleSheet.create({
24627
- // Make content only visible to screen readers.
24628
- // Both collegeboard.org and Bootstrap 3 use this exact implementation.
24629
- srOnly: {
24630
- border: 0,
24631
- clip: "rect(0,0,0,0)",
24632
- height: 1,
24633
- margin: -1,
24634
- overflow: "hidden",
24635
- padding: 0,
24636
- position: "absolute",
24637
- width: 1
24638
- }
24639
- });
24640
-
24641
24478
  class GradedGroupAnswerBar extends React.Component {
24642
24479
  render() {
24643
24480
  const {
@@ -25878,19 +25715,19 @@ const typeToButton = type => {
25878
25715
  };
25879
25716
 
25880
25717
  var util = /*#__PURE__*/Object.freeze({
25881
- __proto__: null,
25882
- DEFAULT_BACKGROUND_IMAGE: DEFAULT_BACKGROUND_IMAGE,
25883
- allTypes: allTypes,
25884
- functionForType: functionForType,
25885
- validate: validate$2,
25886
- getEquationString: getEquationString,
25887
- pointsFromNormalized: pointsFromNormalized,
25888
- maybePointsFromNormalized: maybePointsFromNormalized,
25889
- defaultPlotProps: defaultPlotProps,
25890
- chooseType: chooseType,
25891
- getGridAndSnapSteps: getGridAndSnapSteps,
25892
- DEFAULT_GRAPHER_PROPS: DEFAULT_GRAPHER_PROPS,
25893
- typeToButton: typeToButton
25718
+ __proto__: null,
25719
+ DEFAULT_BACKGROUND_IMAGE: DEFAULT_BACKGROUND_IMAGE,
25720
+ allTypes: allTypes,
25721
+ functionForType: functionForType,
25722
+ validate: validate$2,
25723
+ getEquationString: getEquationString,
25724
+ pointsFromNormalized: pointsFromNormalized,
25725
+ maybePointsFromNormalized: maybePointsFromNormalized,
25726
+ defaultPlotProps: defaultPlotProps,
25727
+ chooseType: chooseType,
25728
+ getGridAndSnapSteps: getGridAndSnapSteps,
25729
+ DEFAULT_GRAPHER_PROPS: DEFAULT_GRAPHER_PROPS,
25730
+ typeToButton: typeToButton
25894
25731
  });
25895
25732
 
25896
25733
  // @ts-expect-error - TS2339 - Property 'MovablePoint' does not exist on type 'typeof Graphie'.
@@ -30119,349 +29956,349 @@ const pureMdMax = "1023px";
30119
29956
  const pureLgMax = "1199px";
30120
29957
 
30121
29958
  var globalConstants = /*#__PURE__*/Object.freeze({
30122
- __proto__: null,
30123
- black: black,
30124
- grayDarker: grayDarker,
30125
- grayDark: grayDark,
30126
- gray: gray,
30127
- grayLight: grayLight,
30128
- grayLighter: grayLighter,
30129
- white: white,
30130
- blue: blue,
30131
- blueDark: blueDark,
30132
- green: green,
30133
- red: red,
30134
- yellow: yellow,
30135
- orange: orange,
30136
- pink: pink,
30137
- purple: purple,
30138
- bodyBackground: bodyBackground,
30139
- textColor: textColor,
30140
- linkColor: linkColor,
30141
- linkColorHover: linkColorHover,
30142
- sansFontFamily: sansFontFamily,
30143
- serifFontFamily: serifFontFamily,
30144
- monoFontFamily: monoFontFamily,
30145
- baseFontSize: baseFontSize,
30146
- baseFontFamily: baseFontFamily,
30147
- baseLineHeight: baseLineHeight,
30148
- altFontFamily: altFontFamily,
30149
- headingsFontFamily: headingsFontFamily,
30150
- headingsFontWeight: headingsFontWeight,
30151
- headingsColor: headingsColor,
30152
- fontSizeLarge: fontSizeLarge,
30153
- fontSizeSmall: fontSizeSmall,
30154
- fontSizeMini: fontSizeMini,
30155
- paddingLarge: paddingLarge,
30156
- paddingSmall: paddingSmall,
30157
- paddingMini: paddingMini,
30158
- baseBorderRadius: baseBorderRadius,
30159
- borderRadiusLarge: borderRadiusLarge,
30160
- borderRadiusSmall: borderRadiusSmall,
30161
- tableBackground: tableBackground,
30162
- tableBackgroundAccent: tableBackgroundAccent,
30163
- tableBackgroundHover: tableBackgroundHover,
30164
- tableBorder: tableBorder,
30165
- btnBackground: btnBackground,
30166
- btnBackgroundHighlight: btnBackgroundHighlight,
30167
- btnBorder: btnBorder,
30168
- btnPrimaryBackground: btnPrimaryBackground,
30169
- btnPrimaryBackgroundHighlight: btnPrimaryBackgroundHighlight,
30170
- btnInfoBackground: btnInfoBackground,
30171
- btnInfoBackgroundHighlight: btnInfoBackgroundHighlight,
30172
- btnSuccessBackground: btnSuccessBackground,
30173
- btnSuccessBackgroundHighlight: btnSuccessBackgroundHighlight,
30174
- btnWarningBackground: btnWarningBackground,
30175
- btnWarningBackgroundHighlight: btnWarningBackgroundHighlight,
30176
- btnDangerBackground: btnDangerBackground,
30177
- btnDangerBackgroundHighlight: btnDangerBackgroundHighlight,
30178
- btnInverseBackground: btnInverseBackground,
30179
- btnInverseBackgroundHighlight: btnInverseBackgroundHighlight,
30180
- inputBackground: inputBackground,
30181
- inputBorder: inputBorder,
30182
- inputBorderRadius: inputBorderRadius,
30183
- inputDisabledBackground: inputDisabledBackground,
30184
- formActionsBackground: formActionsBackground,
30185
- inputHeight: inputHeight,
30186
- dropdownBackground: dropdownBackground,
30187
- dropdownBorder: dropdownBorder,
30188
- dropdownDividerTop: dropdownDividerTop,
30189
- dropdownDividerBottom: dropdownDividerBottom,
30190
- dropdownLinkColor: dropdownLinkColor,
30191
- dropdownLinkColorHover: dropdownLinkColorHover,
30192
- dropdownLinkColorActive: dropdownLinkColorActive,
30193
- dropdownLinkBackgroundActive: dropdownLinkBackgroundActive,
30194
- dropdownLinkBackgroundHover: dropdownLinkBackgroundHover,
30195
- zindexDropdown: zindexDropdown,
30196
- zindexPopover: zindexPopover,
30197
- zindexTooltip: zindexTooltip,
30198
- zindexFixedNavbar: zindexFixedNavbar,
30199
- zindexHeader: zindexHeader,
30200
- zindexModalBackdrop: zindexModalBackdrop,
30201
- zindexModal: zindexModal,
30202
- zindexAboveModal: zindexAboveModal,
30203
- iconSpritePath: iconSpritePath,
30204
- iconWhiteSpritePath: iconWhiteSpritePath,
30205
- placeholderText: placeholderText,
30206
- hrBorder: hrBorder,
30207
- horizontalComponentOffset: horizontalComponentOffset,
30208
- wellBackground: wellBackground,
30209
- navbarCollapseWidth: navbarCollapseWidth,
30210
- navbarCollapseDesktopWidth: navbarCollapseDesktopWidth,
30211
- navbarHeight: navbarHeight,
30212
- navbarBackgroundHighlight: navbarBackgroundHighlight,
30213
- navbarBackground: navbarBackground,
30214
- navbarBorder: navbarBorder,
30215
- navbarText: navbarText,
30216
- navbarLinkColor: navbarLinkColor,
30217
- navbarLinkColorHover: navbarLinkColorHover,
30218
- navbarLinkColorActive: navbarLinkColorActive,
30219
- navbarLinkBackgroundHover: navbarLinkBackgroundHover,
30220
- navbarLinkBackgroundActive: navbarLinkBackgroundActive,
30221
- navbarBrandColor: navbarBrandColor,
30222
- navbarInverseBackground: navbarInverseBackground,
30223
- navbarInverseBackgroundHighlight: navbarInverseBackgroundHighlight,
30224
- navbarInverseBorder: navbarInverseBorder,
30225
- navbarInverseText: navbarInverseText,
30226
- navbarInverseLinkColor: navbarInverseLinkColor,
30227
- navbarInverseLinkColorHover: navbarInverseLinkColorHover,
30228
- navbarInverseLinkColorActive: navbarInverseLinkColorActive,
30229
- navbarInverseLinkBackgroundHover: navbarInverseLinkBackgroundHover,
30230
- navbarInverseLinkBackgroundActive: navbarInverseLinkBackgroundActive,
30231
- navbarInverseSearchBackground: navbarInverseSearchBackground,
30232
- navbarInverseSearchBackgroundFocus: navbarInverseSearchBackgroundFocus,
30233
- navbarInverseSearchBorder: navbarInverseSearchBorder,
30234
- navbarInverseSearchPlaceholderColor: navbarInverseSearchPlaceholderColor,
30235
- navbarInverseBrandColor: navbarInverseBrandColor,
30236
- paginationBackground: paginationBackground,
30237
- paginationBorder: paginationBorder,
30238
- paginationActiveBackground: paginationActiveBackground,
30239
- heroUnitBackground: heroUnitBackground,
30240
- heroUnitHeadingColor: heroUnitHeadingColor,
30241
- heroUnitLeadColor: heroUnitLeadColor,
30242
- warningText: warningText,
30243
- warningBackground: warningBackground,
30244
- warningBorder: warningBorder,
30245
- errorText: errorText,
30246
- errorBackground: errorBackground,
30247
- errorBorder: errorBorder,
30248
- successText: successText,
30249
- successBackground: successBackground,
30250
- successBorder: successBorder,
30251
- infoText: infoText,
30252
- infoBackground: infoBackground,
30253
- infoBorder: infoBorder,
30254
- tooltipColor: tooltipColor,
30255
- tooltipBackground: tooltipBackground,
30256
- tooltipArrowWidth: tooltipArrowWidth,
30257
- tooltipArrowColor: tooltipArrowColor,
30258
- popoverBackground: popoverBackground,
30259
- popoverArrowWidth: popoverArrowWidth,
30260
- popoverArrowColor: popoverArrowColor,
30261
- popoverTitleBackground: popoverTitleBackground,
30262
- popoverArrowOuterWidth: popoverArrowOuterWidth,
30263
- popoverArrowOuterColor: popoverArrowOuterColor,
30264
- gridColumns: gridColumns,
30265
- gridColumnWidth: gridColumnWidth,
30266
- gridGutterWidth: gridGutterWidth,
30267
- gridRowWidth: gridRowWidth,
30268
- gridColumnWidth1200: gridColumnWidth1200,
30269
- gridGutterWidth1200: gridGutterWidth1200,
30270
- gridRowWidth1200: gridRowWidth1200,
30271
- gridColumnWidth768: gridColumnWidth768,
30272
- gridGutterWidth768: gridGutterWidth768,
30273
- gridRowWidth768: gridRowWidth768,
30274
- fluidGridColumnWidth: fluidGridColumnWidth,
30275
- fluidGridGutterWidth: fluidGridGutterWidth,
30276
- fluidGridColumnWidth1200: fluidGridColumnWidth1200,
30277
- fluidGridGutterWidth1200: fluidGridGutterWidth1200,
30278
- fluidGridColumnWidth768: fluidGridColumnWidth768,
30279
- fluidGridGutterWidth768: fluidGridGutterWidth768,
30280
- kaGreen: kaGreen,
30281
- kaGreenLight: kaGreenLight,
30282
- kaBlue: kaBlue,
30283
- kaBlueLight: kaBlueLight,
30284
- grayExtraDark: grayExtraDark,
30285
- grayExtraLight: grayExtraLight,
30286
- graySuperLight: graySuperLight,
30287
- whiteDark: whiteDark,
30288
- dark: dark,
30289
- blueDarkUnsaturated: blueDarkUnsaturated,
30290
- blueDarkSaturated: blueDarkSaturated,
30291
- blueLight: blueLight,
30292
- greenLight: greenLight,
30293
- greenDark: greenDark,
30294
- yellowGreen: yellowGreen,
30295
- okGreen: okGreen,
30296
- alertRed: alertRed,
30297
- coral: coral,
30298
- grayBlue: grayBlue,
30299
- lightPageBackground: lightPageBackground,
30300
- yclaBlue: yclaBlue,
30301
- yclaTeal: yclaTeal,
30302
- yclaTealDark: yclaTealDark,
30303
- yclaGreenDark: yclaGreenDark,
30304
- yclaGreen: yclaGreen,
30305
- learnstormBlue: learnstormBlue,
30306
- homepageBlue: homepageBlue,
30307
- backgroundBlue: backgroundBlue,
30308
- teacherSignupBlue: teacherSignupBlue,
30309
- homepageGreen: homepageGreen,
30310
- streakColor: streakColor,
30311
- facebookColor: facebookColor,
30312
- blueGoogleColor: blueGoogleColor,
30313
- redGoogleColor: redGoogleColor,
30314
- homepageColor: homepageColor,
30315
- lightTextColor: lightTextColor,
30316
- fontSizeTiny: fontSizeTiny,
30317
- fontSizeNormal: fontSizeNormal,
30318
- fontSizeMedium: fontSizeMedium,
30319
- fontSizeExtraLarge: fontSizeExtraLarge,
30320
- fontSizeHuge: fontSizeHuge,
30321
- fontSizeBakana: fontSizeBakana,
30322
- fontSizeBananas: fontSizeBananas,
30323
- fixedWidthFontFamily: fixedWidthFontFamily,
30324
- contentPadding: contentPadding,
30325
- primaryButtonBackground: primaryButtonBackground,
30326
- primaryButtonBorder: primaryButtonBorder,
30327
- buttonTextColor: buttonTextColor,
30328
- buttonBorderRadius: buttonBorderRadius,
30329
- basicBorderColor: basicBorderColor,
30330
- minContainerWidth: minContainerWidth,
30331
- maxContainerWidth: maxContainerWidth,
30332
- formHintColor: formHintColor,
30333
- guidelineExampleText: guidelineExampleText,
30334
- hoverCardWidth: hoverCardWidth,
30335
- menuHighlightColor: menuHighlightColor,
30336
- menuHighlightBorderColor: menuHighlightBorderColor,
30337
- menuActiveTextColor: menuActiveTextColor,
30338
- menuInactiveTextColor: menuInactiveTextColor,
30339
- menuSubheaderTextColor: menuSubheaderTextColor,
30340
- menuBorderColor: menuBorderColor,
30341
- unreadBackgroundColor: unreadBackgroundColor,
30342
- menuLineHeight: menuLineHeight,
30343
- menuSubheaderLineHeight: menuSubheaderLineHeight,
30344
- menuSubheaderFontSize: menuSubheaderFontSize,
30345
- notificationBarColor: notificationBarColor,
30346
- modalBodyTopPadding: modalBodyTopPadding,
30347
- modalDialogPadding: modalDialogPadding,
30348
- modalSectionPadding: modalSectionPadding,
30349
- mathDomain1: mathDomain1,
30350
- mathDomain2: mathDomain2,
30351
- mathDomain3: mathDomain3,
30352
- mathDomain4: mathDomain4,
30353
- partnerContentDomain1: partnerContentDomain1,
30354
- partnerContentDomain2: partnerContentDomain2,
30355
- partnerContentDomain3: partnerContentDomain3,
30356
- partnerContentDomain4: partnerContentDomain4,
30357
- csDomain1: csDomain1,
30358
- csDomain2: csDomain2,
30359
- csDomain3: csDomain3,
30360
- csDomain4: csDomain4,
30361
- economicsDomain1: economicsDomain1,
30362
- economicsDomain2: economicsDomain2,
30363
- economicsDomain3: economicsDomain3,
30364
- economicsDomain4: economicsDomain4,
30365
- collegeCareersMoreDomain1: collegeCareersMoreDomain1,
30366
- collegeCareersMoreDomain2: collegeCareersMoreDomain2,
30367
- collegeCareersMoreDomain3: collegeCareersMoreDomain3,
30368
- collegeCareersMoreDomain4: collegeCareersMoreDomain4,
30369
- humanitiesDomain1: humanitiesDomain1,
30370
- humanitiesDomain2: humanitiesDomain2,
30371
- humanitiesDomain3: humanitiesDomain3,
30372
- humanitiesDomain4: humanitiesDomain4,
30373
- gtpDomain1: gtpDomain1,
30374
- gtpDomain2: gtpDomain2,
30375
- gtpDomain3: gtpDomain3,
30376
- gtpDomain4: gtpDomain4,
30377
- scienceDomain1: scienceDomain1,
30378
- scienceDomain2: scienceDomain2,
30379
- scienceDomain3: scienceDomain3,
30380
- scienceDomain4: scienceDomain4,
30381
- testPrepDomain1: testPrepDomain1,
30382
- testPrepDomain2: testPrepDomain2,
30383
- testPrepDomain3: testPrepDomain3,
30384
- testPrepDomain4: testPrepDomain4,
30385
- defaultDomain1: defaultDomain1,
30386
- defaultDomain2: defaultDomain2,
30387
- defaultDomain3: defaultDomain3,
30388
- defaultDomain4: defaultDomain4,
30389
- defaultDomainColor: defaultDomainColor,
30390
- defaultSubjectColor: defaultSubjectColor,
30391
- defaultTopicColor: defaultTopicColor,
30392
- defaultHoverColor: defaultHoverColor,
30393
- defaultLinkColor: defaultLinkColor,
30394
- defaultLinkHoverColor: defaultLinkHoverColor,
30395
- scienceDomainColor: scienceDomainColor,
30396
- scienceSubjectColor: scienceSubjectColor,
30397
- scienceTopicColor: scienceTopicColor,
30398
- scienceHoverColor: scienceHoverColor,
30399
- scienceLinkColor: scienceLinkColor,
30400
- scienceLinkHoverColor: scienceLinkHoverColor,
30401
- humanitiesDomainColor: humanitiesDomainColor,
30402
- humanitiesSubjectColor: humanitiesSubjectColor,
30403
- humanitiesTopicColor: humanitiesTopicColor,
30404
- humanitiesHoverColor: humanitiesHoverColor,
30405
- humanitiesLinkColor: humanitiesLinkColor,
30406
- humanitiesLinkHoverColor: humanitiesLinkHoverColor,
30407
- economicsDomainColor: economicsDomainColor,
30408
- economicsSubjectColor: economicsSubjectColor,
30409
- economicsTopicColor: economicsTopicColor,
30410
- economicsHoverColor: economicsHoverColor,
30411
- economicsLinkColor: economicsLinkColor,
30412
- economicsLinkHoverColor: economicsLinkHoverColor,
30413
- csDomainColor: csDomainColor,
30414
- csSubjectColor: csSubjectColor,
30415
- csTopicColor: csTopicColor,
30416
- csHoverColor: csHoverColor,
30417
- csLinkColor: csLinkColor,
30418
- csLinkHoverColor: csLinkHoverColor,
30419
- partnerContentDomainColor: partnerContentDomainColor,
30420
- partnerContentSubjectColor: partnerContentSubjectColor,
30421
- partnerContentTopicColor: partnerContentTopicColor,
30422
- partnerContentHoverColor: partnerContentHoverColor,
30423
- partnerContentLinkColor: partnerContentLinkColor,
30424
- partnerContentLinkHoverColor: partnerContentLinkHoverColor,
30425
- essayDomainColor: essayDomainColor,
30426
- mathDomainColor: mathDomainColor,
30427
- mathSubjectColor: mathSubjectColor,
30428
- mathTopicColor: mathTopicColor,
30429
- mathHoverColor: mathHoverColor,
30430
- mathLinkColor: mathLinkColor,
30431
- mathLinkHoverColor: mathLinkHoverColor,
30432
- testPrepDomainColor: testPrepDomainColor,
30433
- testPrepSubjectColor: testPrepSubjectColor,
30434
- testPrepTopicColor: testPrepTopicColor,
30435
- testPrepHoverColor: testPrepHoverColor,
30436
- testPrepLinkColor: testPrepLinkColor,
30437
- testPrepLinkHoverColor: testPrepLinkHoverColor,
30438
- collegeCareersMoreDomainColor: collegeCareersMoreDomainColor,
30439
- collegeCareersMoreSubjectColor: collegeCareersMoreSubjectColor,
30440
- collegeCareersMoreTopicColor: collegeCareersMoreTopicColor,
30441
- collegeCareersMoreHoverColor: collegeCareersMoreHoverColor,
30442
- collegeCareersMoreLinkColor: collegeCareersMoreLinkColor,
30443
- collegeCareersMoreLinkHoverColor: collegeCareersMoreLinkHoverColor,
30444
- colorProficient: colorProficient,
30445
- colorPracticed: colorPracticed,
30446
- colorMastery1: colorMastery1,
30447
- colorMastery2: colorMastery2,
30448
- colorMastery3: colorMastery3,
30449
- colorSuggested: colorSuggested,
30450
- colorReview: colorReview,
30451
- colorNotStarted: colorNotStarted,
30452
- colorStarted: colorStarted,
30453
- colorStruggling: colorStruggling,
30454
- colorPersonal: colorPersonal,
30455
- colorPractice: colorPractice,
30456
- colorEnergyPoints: colorEnergyPoints,
30457
- pureSmMin: pureSmMin,
30458
- pureMdMin: pureMdMin,
30459
- pureLgMin: pureLgMin,
30460
- pureXlMin: pureXlMin,
30461
- pureXsMax: pureXsMax,
30462
- pureSmMax: pureSmMax,
30463
- pureMdMax: pureMdMax,
30464
- pureLgMax: pureLgMax
29959
+ __proto__: null,
29960
+ black: black,
29961
+ grayDarker: grayDarker,
29962
+ grayDark: grayDark,
29963
+ gray: gray,
29964
+ grayLight: grayLight,
29965
+ grayLighter: grayLighter,
29966
+ white: white,
29967
+ blue: blue,
29968
+ blueDark: blueDark,
29969
+ green: green,
29970
+ red: red,
29971
+ yellow: yellow,
29972
+ orange: orange,
29973
+ pink: pink,
29974
+ purple: purple,
29975
+ bodyBackground: bodyBackground,
29976
+ textColor: textColor,
29977
+ linkColor: linkColor,
29978
+ linkColorHover: linkColorHover,
29979
+ sansFontFamily: sansFontFamily,
29980
+ serifFontFamily: serifFontFamily,
29981
+ monoFontFamily: monoFontFamily,
29982
+ baseFontSize: baseFontSize,
29983
+ baseFontFamily: baseFontFamily,
29984
+ baseLineHeight: baseLineHeight,
29985
+ altFontFamily: altFontFamily,
29986
+ headingsFontFamily: headingsFontFamily,
29987
+ headingsFontWeight: headingsFontWeight,
29988
+ headingsColor: headingsColor,
29989
+ fontSizeLarge: fontSizeLarge,
29990
+ fontSizeSmall: fontSizeSmall,
29991
+ fontSizeMini: fontSizeMini,
29992
+ paddingLarge: paddingLarge,
29993
+ paddingSmall: paddingSmall,
29994
+ paddingMini: paddingMini,
29995
+ baseBorderRadius: baseBorderRadius,
29996
+ borderRadiusLarge: borderRadiusLarge,
29997
+ borderRadiusSmall: borderRadiusSmall,
29998
+ tableBackground: tableBackground,
29999
+ tableBackgroundAccent: tableBackgroundAccent,
30000
+ tableBackgroundHover: tableBackgroundHover,
30001
+ tableBorder: tableBorder,
30002
+ btnBackground: btnBackground,
30003
+ btnBackgroundHighlight: btnBackgroundHighlight,
30004
+ btnBorder: btnBorder,
30005
+ btnPrimaryBackground: btnPrimaryBackground,
30006
+ btnPrimaryBackgroundHighlight: btnPrimaryBackgroundHighlight,
30007
+ btnInfoBackground: btnInfoBackground,
30008
+ btnInfoBackgroundHighlight: btnInfoBackgroundHighlight,
30009
+ btnSuccessBackground: btnSuccessBackground,
30010
+ btnSuccessBackgroundHighlight: btnSuccessBackgroundHighlight,
30011
+ btnWarningBackground: btnWarningBackground,
30012
+ btnWarningBackgroundHighlight: btnWarningBackgroundHighlight,
30013
+ btnDangerBackground: btnDangerBackground,
30014
+ btnDangerBackgroundHighlight: btnDangerBackgroundHighlight,
30015
+ btnInverseBackground: btnInverseBackground,
30016
+ btnInverseBackgroundHighlight: btnInverseBackgroundHighlight,
30017
+ inputBackground: inputBackground,
30018
+ inputBorder: inputBorder,
30019
+ inputBorderRadius: inputBorderRadius,
30020
+ inputDisabledBackground: inputDisabledBackground,
30021
+ formActionsBackground: formActionsBackground,
30022
+ inputHeight: inputHeight,
30023
+ dropdownBackground: dropdownBackground,
30024
+ dropdownBorder: dropdownBorder,
30025
+ dropdownDividerTop: dropdownDividerTop,
30026
+ dropdownDividerBottom: dropdownDividerBottom,
30027
+ dropdownLinkColor: dropdownLinkColor,
30028
+ dropdownLinkColorHover: dropdownLinkColorHover,
30029
+ dropdownLinkColorActive: dropdownLinkColorActive,
30030
+ dropdownLinkBackgroundActive: dropdownLinkBackgroundActive,
30031
+ dropdownLinkBackgroundHover: dropdownLinkBackgroundHover,
30032
+ zindexDropdown: zindexDropdown,
30033
+ zindexPopover: zindexPopover,
30034
+ zindexTooltip: zindexTooltip,
30035
+ zindexFixedNavbar: zindexFixedNavbar,
30036
+ zindexHeader: zindexHeader,
30037
+ zindexModalBackdrop: zindexModalBackdrop,
30038
+ zindexModal: zindexModal,
30039
+ zindexAboveModal: zindexAboveModal,
30040
+ iconSpritePath: iconSpritePath,
30041
+ iconWhiteSpritePath: iconWhiteSpritePath,
30042
+ placeholderText: placeholderText,
30043
+ hrBorder: hrBorder,
30044
+ horizontalComponentOffset: horizontalComponentOffset,
30045
+ wellBackground: wellBackground,
30046
+ navbarCollapseWidth: navbarCollapseWidth,
30047
+ navbarCollapseDesktopWidth: navbarCollapseDesktopWidth,
30048
+ navbarHeight: navbarHeight,
30049
+ navbarBackgroundHighlight: navbarBackgroundHighlight,
30050
+ navbarBackground: navbarBackground,
30051
+ navbarBorder: navbarBorder,
30052
+ navbarText: navbarText,
30053
+ navbarLinkColor: navbarLinkColor,
30054
+ navbarLinkColorHover: navbarLinkColorHover,
30055
+ navbarLinkColorActive: navbarLinkColorActive,
30056
+ navbarLinkBackgroundHover: navbarLinkBackgroundHover,
30057
+ navbarLinkBackgroundActive: navbarLinkBackgroundActive,
30058
+ navbarBrandColor: navbarBrandColor,
30059
+ navbarInverseBackground: navbarInverseBackground,
30060
+ navbarInverseBackgroundHighlight: navbarInverseBackgroundHighlight,
30061
+ navbarInverseBorder: navbarInverseBorder,
30062
+ navbarInverseText: navbarInverseText,
30063
+ navbarInverseLinkColor: navbarInverseLinkColor,
30064
+ navbarInverseLinkColorHover: navbarInverseLinkColorHover,
30065
+ navbarInverseLinkColorActive: navbarInverseLinkColorActive,
30066
+ navbarInverseLinkBackgroundHover: navbarInverseLinkBackgroundHover,
30067
+ navbarInverseLinkBackgroundActive: navbarInverseLinkBackgroundActive,
30068
+ navbarInverseSearchBackground: navbarInverseSearchBackground,
30069
+ navbarInverseSearchBackgroundFocus: navbarInverseSearchBackgroundFocus,
30070
+ navbarInverseSearchBorder: navbarInverseSearchBorder,
30071
+ navbarInverseSearchPlaceholderColor: navbarInverseSearchPlaceholderColor,
30072
+ navbarInverseBrandColor: navbarInverseBrandColor,
30073
+ paginationBackground: paginationBackground,
30074
+ paginationBorder: paginationBorder,
30075
+ paginationActiveBackground: paginationActiveBackground,
30076
+ heroUnitBackground: heroUnitBackground,
30077
+ heroUnitHeadingColor: heroUnitHeadingColor,
30078
+ heroUnitLeadColor: heroUnitLeadColor,
30079
+ warningText: warningText,
30080
+ warningBackground: warningBackground,
30081
+ warningBorder: warningBorder,
30082
+ errorText: errorText,
30083
+ errorBackground: errorBackground,
30084
+ errorBorder: errorBorder,
30085
+ successText: successText,
30086
+ successBackground: successBackground,
30087
+ successBorder: successBorder,
30088
+ infoText: infoText,
30089
+ infoBackground: infoBackground,
30090
+ infoBorder: infoBorder,
30091
+ tooltipColor: tooltipColor,
30092
+ tooltipBackground: tooltipBackground,
30093
+ tooltipArrowWidth: tooltipArrowWidth,
30094
+ tooltipArrowColor: tooltipArrowColor,
30095
+ popoverBackground: popoverBackground,
30096
+ popoverArrowWidth: popoverArrowWidth,
30097
+ popoverArrowColor: popoverArrowColor,
30098
+ popoverTitleBackground: popoverTitleBackground,
30099
+ popoverArrowOuterWidth: popoverArrowOuterWidth,
30100
+ popoverArrowOuterColor: popoverArrowOuterColor,
30101
+ gridColumns: gridColumns,
30102
+ gridColumnWidth: gridColumnWidth,
30103
+ gridGutterWidth: gridGutterWidth,
30104
+ gridRowWidth: gridRowWidth,
30105
+ gridColumnWidth1200: gridColumnWidth1200,
30106
+ gridGutterWidth1200: gridGutterWidth1200,
30107
+ gridRowWidth1200: gridRowWidth1200,
30108
+ gridColumnWidth768: gridColumnWidth768,
30109
+ gridGutterWidth768: gridGutterWidth768,
30110
+ gridRowWidth768: gridRowWidth768,
30111
+ fluidGridColumnWidth: fluidGridColumnWidth,
30112
+ fluidGridGutterWidth: fluidGridGutterWidth,
30113
+ fluidGridColumnWidth1200: fluidGridColumnWidth1200,
30114
+ fluidGridGutterWidth1200: fluidGridGutterWidth1200,
30115
+ fluidGridColumnWidth768: fluidGridColumnWidth768,
30116
+ fluidGridGutterWidth768: fluidGridGutterWidth768,
30117
+ kaGreen: kaGreen,
30118
+ kaGreenLight: kaGreenLight,
30119
+ kaBlue: kaBlue,
30120
+ kaBlueLight: kaBlueLight,
30121
+ grayExtraDark: grayExtraDark,
30122
+ grayExtraLight: grayExtraLight,
30123
+ graySuperLight: graySuperLight,
30124
+ whiteDark: whiteDark,
30125
+ dark: dark,
30126
+ blueDarkUnsaturated: blueDarkUnsaturated,
30127
+ blueDarkSaturated: blueDarkSaturated,
30128
+ blueLight: blueLight,
30129
+ greenLight: greenLight,
30130
+ greenDark: greenDark,
30131
+ yellowGreen: yellowGreen,
30132
+ okGreen: okGreen,
30133
+ alertRed: alertRed,
30134
+ coral: coral,
30135
+ grayBlue: grayBlue,
30136
+ lightPageBackground: lightPageBackground,
30137
+ yclaBlue: yclaBlue,
30138
+ yclaTeal: yclaTeal,
30139
+ yclaTealDark: yclaTealDark,
30140
+ yclaGreenDark: yclaGreenDark,
30141
+ yclaGreen: yclaGreen,
30142
+ learnstormBlue: learnstormBlue,
30143
+ homepageBlue: homepageBlue,
30144
+ backgroundBlue: backgroundBlue,
30145
+ teacherSignupBlue: teacherSignupBlue,
30146
+ homepageGreen: homepageGreen,
30147
+ streakColor: streakColor,
30148
+ facebookColor: facebookColor,
30149
+ blueGoogleColor: blueGoogleColor,
30150
+ redGoogleColor: redGoogleColor,
30151
+ homepageColor: homepageColor,
30152
+ lightTextColor: lightTextColor,
30153
+ fontSizeTiny: fontSizeTiny,
30154
+ fontSizeNormal: fontSizeNormal,
30155
+ fontSizeMedium: fontSizeMedium,
30156
+ fontSizeExtraLarge: fontSizeExtraLarge,
30157
+ fontSizeHuge: fontSizeHuge,
30158
+ fontSizeBakana: fontSizeBakana,
30159
+ fontSizeBananas: fontSizeBananas,
30160
+ fixedWidthFontFamily: fixedWidthFontFamily,
30161
+ contentPadding: contentPadding,
30162
+ primaryButtonBackground: primaryButtonBackground,
30163
+ primaryButtonBorder: primaryButtonBorder,
30164
+ buttonTextColor: buttonTextColor,
30165
+ buttonBorderRadius: buttonBorderRadius,
30166
+ basicBorderColor: basicBorderColor,
30167
+ minContainerWidth: minContainerWidth,
30168
+ maxContainerWidth: maxContainerWidth,
30169
+ formHintColor: formHintColor,
30170
+ guidelineExampleText: guidelineExampleText,
30171
+ hoverCardWidth: hoverCardWidth,
30172
+ menuHighlightColor: menuHighlightColor,
30173
+ menuHighlightBorderColor: menuHighlightBorderColor,
30174
+ menuActiveTextColor: menuActiveTextColor,
30175
+ menuInactiveTextColor: menuInactiveTextColor,
30176
+ menuSubheaderTextColor: menuSubheaderTextColor,
30177
+ menuBorderColor: menuBorderColor,
30178
+ unreadBackgroundColor: unreadBackgroundColor,
30179
+ menuLineHeight: menuLineHeight,
30180
+ menuSubheaderLineHeight: menuSubheaderLineHeight,
30181
+ menuSubheaderFontSize: menuSubheaderFontSize,
30182
+ notificationBarColor: notificationBarColor,
30183
+ modalBodyTopPadding: modalBodyTopPadding,
30184
+ modalDialogPadding: modalDialogPadding,
30185
+ modalSectionPadding: modalSectionPadding,
30186
+ mathDomain1: mathDomain1,
30187
+ mathDomain2: mathDomain2,
30188
+ mathDomain3: mathDomain3,
30189
+ mathDomain4: mathDomain4,
30190
+ partnerContentDomain1: partnerContentDomain1,
30191
+ partnerContentDomain2: partnerContentDomain2,
30192
+ partnerContentDomain3: partnerContentDomain3,
30193
+ partnerContentDomain4: partnerContentDomain4,
30194
+ csDomain1: csDomain1,
30195
+ csDomain2: csDomain2,
30196
+ csDomain3: csDomain3,
30197
+ csDomain4: csDomain4,
30198
+ economicsDomain1: economicsDomain1,
30199
+ economicsDomain2: economicsDomain2,
30200
+ economicsDomain3: economicsDomain3,
30201
+ economicsDomain4: economicsDomain4,
30202
+ collegeCareersMoreDomain1: collegeCareersMoreDomain1,
30203
+ collegeCareersMoreDomain2: collegeCareersMoreDomain2,
30204
+ collegeCareersMoreDomain3: collegeCareersMoreDomain3,
30205
+ collegeCareersMoreDomain4: collegeCareersMoreDomain4,
30206
+ humanitiesDomain1: humanitiesDomain1,
30207
+ humanitiesDomain2: humanitiesDomain2,
30208
+ humanitiesDomain3: humanitiesDomain3,
30209
+ humanitiesDomain4: humanitiesDomain4,
30210
+ gtpDomain1: gtpDomain1,
30211
+ gtpDomain2: gtpDomain2,
30212
+ gtpDomain3: gtpDomain3,
30213
+ gtpDomain4: gtpDomain4,
30214
+ scienceDomain1: scienceDomain1,
30215
+ scienceDomain2: scienceDomain2,
30216
+ scienceDomain3: scienceDomain3,
30217
+ scienceDomain4: scienceDomain4,
30218
+ testPrepDomain1: testPrepDomain1,
30219
+ testPrepDomain2: testPrepDomain2,
30220
+ testPrepDomain3: testPrepDomain3,
30221
+ testPrepDomain4: testPrepDomain4,
30222
+ defaultDomain1: defaultDomain1,
30223
+ defaultDomain2: defaultDomain2,
30224
+ defaultDomain3: defaultDomain3,
30225
+ defaultDomain4: defaultDomain4,
30226
+ defaultDomainColor: defaultDomainColor,
30227
+ defaultSubjectColor: defaultSubjectColor,
30228
+ defaultTopicColor: defaultTopicColor,
30229
+ defaultHoverColor: defaultHoverColor,
30230
+ defaultLinkColor: defaultLinkColor,
30231
+ defaultLinkHoverColor: defaultLinkHoverColor,
30232
+ scienceDomainColor: scienceDomainColor,
30233
+ scienceSubjectColor: scienceSubjectColor,
30234
+ scienceTopicColor: scienceTopicColor,
30235
+ scienceHoverColor: scienceHoverColor,
30236
+ scienceLinkColor: scienceLinkColor,
30237
+ scienceLinkHoverColor: scienceLinkHoverColor,
30238
+ humanitiesDomainColor: humanitiesDomainColor,
30239
+ humanitiesSubjectColor: humanitiesSubjectColor,
30240
+ humanitiesTopicColor: humanitiesTopicColor,
30241
+ humanitiesHoverColor: humanitiesHoverColor,
30242
+ humanitiesLinkColor: humanitiesLinkColor,
30243
+ humanitiesLinkHoverColor: humanitiesLinkHoverColor,
30244
+ economicsDomainColor: economicsDomainColor,
30245
+ economicsSubjectColor: economicsSubjectColor,
30246
+ economicsTopicColor: economicsTopicColor,
30247
+ economicsHoverColor: economicsHoverColor,
30248
+ economicsLinkColor: economicsLinkColor,
30249
+ economicsLinkHoverColor: economicsLinkHoverColor,
30250
+ csDomainColor: csDomainColor,
30251
+ csSubjectColor: csSubjectColor,
30252
+ csTopicColor: csTopicColor,
30253
+ csHoverColor: csHoverColor,
30254
+ csLinkColor: csLinkColor,
30255
+ csLinkHoverColor: csLinkHoverColor,
30256
+ partnerContentDomainColor: partnerContentDomainColor,
30257
+ partnerContentSubjectColor: partnerContentSubjectColor,
30258
+ partnerContentTopicColor: partnerContentTopicColor,
30259
+ partnerContentHoverColor: partnerContentHoverColor,
30260
+ partnerContentLinkColor: partnerContentLinkColor,
30261
+ partnerContentLinkHoverColor: partnerContentLinkHoverColor,
30262
+ essayDomainColor: essayDomainColor,
30263
+ mathDomainColor: mathDomainColor,
30264
+ mathSubjectColor: mathSubjectColor,
30265
+ mathTopicColor: mathTopicColor,
30266
+ mathHoverColor: mathHoverColor,
30267
+ mathLinkColor: mathLinkColor,
30268
+ mathLinkHoverColor: mathLinkHoverColor,
30269
+ testPrepDomainColor: testPrepDomainColor,
30270
+ testPrepSubjectColor: testPrepSubjectColor,
30271
+ testPrepTopicColor: testPrepTopicColor,
30272
+ testPrepHoverColor: testPrepHoverColor,
30273
+ testPrepLinkColor: testPrepLinkColor,
30274
+ testPrepLinkHoverColor: testPrepLinkHoverColor,
30275
+ collegeCareersMoreDomainColor: collegeCareersMoreDomainColor,
30276
+ collegeCareersMoreSubjectColor: collegeCareersMoreSubjectColor,
30277
+ collegeCareersMoreTopicColor: collegeCareersMoreTopicColor,
30278
+ collegeCareersMoreHoverColor: collegeCareersMoreHoverColor,
30279
+ collegeCareersMoreLinkColor: collegeCareersMoreLinkColor,
30280
+ collegeCareersMoreLinkHoverColor: collegeCareersMoreLinkHoverColor,
30281
+ colorProficient: colorProficient,
30282
+ colorPracticed: colorPracticed,
30283
+ colorMastery1: colorMastery1,
30284
+ colorMastery2: colorMastery2,
30285
+ colorMastery3: colorMastery3,
30286
+ colorSuggested: colorSuggested,
30287
+ colorReview: colorReview,
30288
+ colorNotStarted: colorNotStarted,
30289
+ colorStarted: colorStarted,
30290
+ colorStruggling: colorStruggling,
30291
+ colorPersonal: colorPersonal,
30292
+ colorPractice: colorPractice,
30293
+ colorEnergyPoints: colorEnergyPoints,
30294
+ pureSmMin: pureSmMin,
30295
+ pureMdMin: pureMdMin,
30296
+ pureLgMin: pureLgMin,
30297
+ pureXlMin: pureXlMin,
30298
+ pureXsMax: pureXsMax,
30299
+ pureSmMax: pureSmMax,
30300
+ pureMdMax: pureMdMax,
30301
+ pureLgMax: pureLgMax
30465
30302
  });
30466
30303
 
30467
30304
  const colors$1 = {
@@ -30736,11 +30573,11 @@ const typography = {
30736
30573
  };
30737
30574
 
30738
30575
  var globalStyles = /*#__PURE__*/Object.freeze({
30739
- __proto__: null,
30740
- colors: colors$1,
30741
- borderRadius: borderRadius,
30742
- fonts: fonts,
30743
- typography: typography
30576
+ __proto__: null,
30577
+ colors: colors$1,
30578
+ borderRadius: borderRadius,
30579
+ fonts: fonts,
30580
+ typography: typography
30744
30581
  });
30745
30582
 
30746
30583
  class AnswerChoice extends React.Component {
@@ -43903,11 +43740,25 @@ const init = function init(options) {
43903
43740
  });
43904
43741
  };
43905
43742
 
43743
+ // This file is processed by a Rollup plugin (replace) to inject the production
43744
+ const libName = "@khanacademy/perseus";
43745
+ const libVersion = "12.0.0";
43746
+ addLibraryVersionToPerseusDebug(libName, libVersion);
43747
+
43748
+ const apiVersion = {
43749
+ major: 12,
43750
+ minor: 0
43751
+ };
43752
+ const itemDataVersion = {
43753
+ major: 0,
43754
+ minor: 1
43755
+ };
43756
+
43906
43757
  var allWidgets = [...basicWidgets, ...extraWidgets];
43907
43758
 
43908
43759
  registerWidgets(allWidgets);
43909
43760
  const ItemVersion = getVersionVector();
43910
- ItemVersion["::renderer::"] = version.itemDataVersion;
43761
+ ItemVersion["::renderer::"] = itemDataVersion;
43911
43762
 
43912
43763
  class ArticleRenderer extends React.Component {
43913
43764
  constructor(props) {
@@ -44462,6 +44313,9 @@ const ProvideKeypad = {
44462
44313
  const {
44463
44314
  mapObject: mapObject$1
44464
44315
  } = objective_;
44316
+ /**
44317
+ * @depreciated use ServerItemRenderer
44318
+ */
44465
44319
  class ItemRenderer extends React.Component {
44466
44320
  // @ts-expect-error - TS2564 - Property 'questionRenderer' has no initializer and is not definitely assigned in the constructor.
44467
44321
 
@@ -45604,24 +45458,257 @@ RangeInput.defaultProps = {
45604
45458
  placeholder: [null, null]
45605
45459
  };
45606
45460
 
45461
+ /* eslint-disable @khanacademy/ts-no-error-suppressions */
45462
+ const prettyBig = {
45463
+ fontSize: "150%"
45464
+ };
45465
+ const slightlyBig = {
45466
+ fontSize: "120%"
45467
+ };
45468
+ const symbStyle = {
45469
+ fontSize: "130%"
45470
+ };
45471
+ // These are functions because we want to generate a new component for each use
45472
+ // on the page rather than reusing an instance (which will cause an error).
45473
+ // Also, it's useful for things which might look different depending on the
45474
+ // props.
45475
+
45476
+ const basic = [() => [/*#__PURE__*/React.createElement("span", {
45477
+ key: "plus",
45478
+ style: slightlyBig
45479
+ }, "+"), "PLUS", i18n._("Plus")], () => [/*#__PURE__*/React.createElement("span", {
45480
+ key: "minus",
45481
+ style: prettyBig
45482
+ }, "-"), "MINUS", i18n._("Minus")],
45483
+ // TODO(joel) - display as \cdot when appropriate
45484
+ props => {
45485
+ const {
45486
+ TeX
45487
+ } = getDependencies();
45488
+ if (props.convertDotToTimes) {
45489
+ return [/*#__PURE__*/React.createElement(TeX, {
45490
+ key: "times",
45491
+ style: prettyBig
45492
+ }, i18n.doNotTranslate("\\times")), "TIMES", i18n._("Multiply")];
45493
+ }
45494
+ return [/*#__PURE__*/React.createElement(TeX, {
45495
+ key: "times",
45496
+ style: prettyBig
45497
+ }, i18n.doNotTranslate("\\cdot")), "CDOT", i18n._("Multiply")];
45498
+ }, () => {
45499
+ const {
45500
+ TeX
45501
+ } = getDependencies();
45502
+ return [/*#__PURE__*/React.createElement(TeX, {
45503
+ key: "frac",
45504
+ style: prettyBig
45505
+ }, i18n.doNotTranslate("\\frac{x}{y}")), "FRAC", i18n._("Fraction, excluding the current expression")];
45506
+ }];
45507
+ const buttonSets = {
45508
+ basic,
45509
+ "basic+div": basic.concat([() => {
45510
+ const {
45511
+ TeX
45512
+ } = getDependencies();
45513
+ return [/*#__PURE__*/React.createElement(TeX, {
45514
+ key: "div"
45515
+ }, i18n.doNotTranslate("\\div")), "DIVIDE", i18n._("Divide")];
45516
+ }]),
45517
+ trig: [() => {
45518
+ const {
45519
+ TeX
45520
+ } = getDependencies();
45521
+ return [/*#__PURE__*/React.createElement(TeX, {
45522
+ key: "sin"
45523
+ }, i18n.doNotTranslate("\\sin")), "SIN", i18n._("Sine")];
45524
+ }, () => {
45525
+ const {
45526
+ TeX
45527
+ } = getDependencies();
45528
+ return [/*#__PURE__*/React.createElement(TeX, {
45529
+ key: "cos"
45530
+ }, i18n.doNotTranslate("\\cos")), "COS", i18n._("Cosine")];
45531
+ }, () => {
45532
+ const {
45533
+ TeX
45534
+ } = getDependencies();
45535
+ return [/*#__PURE__*/React.createElement(TeX, {
45536
+ key: "tan"
45537
+ }, i18n.doNotTranslate("\\tan")), "TAN", i18n._("Tangent")];
45538
+ }, () => {
45539
+ const {
45540
+ TeX
45541
+ } = getDependencies();
45542
+ return [/*#__PURE__*/React.createElement(TeX, {
45543
+ key: "theta",
45544
+ style: symbStyle
45545
+ }, i18n.doNotTranslate("\\theta")), "THETA", i18n._("Theta")];
45546
+ }, () => {
45547
+ const {
45548
+ TeX
45549
+ } = getDependencies();
45550
+ return [/*#__PURE__*/React.createElement("span", {
45551
+ key: "phi"
45552
+ }, /*#__PURE__*/React.createElement("span", {
45553
+ className: "perseus-sr-only"
45554
+ }, i18n.doNotTranslate("phi")), /*#__PURE__*/React.createElement(TeX, {
45555
+ key: "pi",
45556
+ style: symbStyle
45557
+ }, i18n.doNotTranslate("\\phi"))), "PHI", i18n._("Phi")];
45558
+ }],
45559
+ prealgebra: [() => {
45560
+ const {
45561
+ TeX
45562
+ } = getDependencies();
45563
+ return [/*#__PURE__*/React.createElement(TeX, {
45564
+ key: "sqrt"
45565
+ }, i18n.doNotTranslate("\\sqrt{x}")), "SQRT", i18n._("Square root")];
45566
+ },
45567
+ // TODO(joel) - how does desmos do this?
45568
+ () => {
45569
+ const {
45570
+ TeX
45571
+ } = getDependencies();
45572
+ return [/*#__PURE__*/React.createElement(TeX, {
45573
+ key: "nthroot"
45574
+ }, i18n.doNotTranslate("\\sqrt[3]{x}")), "NTHROOT3", i18n._("Cube root")];
45575
+ }, () => {
45576
+ const {
45577
+ TeX
45578
+ } = getDependencies();
45579
+ return [/*#__PURE__*/React.createElement(TeX, {
45580
+ key: "pow",
45581
+ style: slightlyBig
45582
+ }, i18n.doNotTranslate("a^b")), "POW", i18n._("Exponent")];
45583
+ }, () => {
45584
+ const {
45585
+ TeX
45586
+ } = getDependencies();
45587
+ return [/*#__PURE__*/React.createElement(TeX, {
45588
+ key: "pi",
45589
+ style: slightlyBig
45590
+ }, i18n.doNotTranslate("\\pi")), "PI", i18n._("Pi")];
45591
+ }],
45592
+ logarithms: [() => {
45593
+ const {
45594
+ TeX
45595
+ } = getDependencies();
45596
+ return [/*#__PURE__*/React.createElement(TeX, {
45597
+ key: "log"
45598
+ }, i18n.doNotTranslate("\\log")), "LOG", i18n._("Logarithm with base 10")];
45599
+ }, () => {
45600
+ const {
45601
+ TeX
45602
+ } = getDependencies();
45603
+ return [/*#__PURE__*/React.createElement(TeX, {
45604
+ key: "ln"
45605
+ }, i18n.doNotTranslate("\\ln")), "LN", i18n._("Natural logarithm")];
45606
+ }, () => {
45607
+ const {
45608
+ TeX
45609
+ } = getDependencies();
45610
+ return [/*#__PURE__*/React.createElement(TeX, {
45611
+ key: "log_b"
45612
+ }, i18n.doNotTranslate("\\log_b")), "LOG_B", i18n._("Logarithm with custom base")];
45613
+ }],
45614
+ "basic relations": [() => {
45615
+ const {
45616
+ TeX
45617
+ } = getDependencies();
45618
+ return [/*#__PURE__*/React.createElement(TeX, {
45619
+ key: "eq"
45620
+ }, "="), "EQUAL", i18n._("Equals sign")];
45621
+ }, () => {
45622
+ const {
45623
+ TeX
45624
+ } = getDependencies();
45625
+ return [/*#__PURE__*/React.createElement(TeX, {
45626
+ key: "lt"
45627
+ }, i18n.doNotTranslate("\\lt")), "LT", i18n._("Less than sign")];
45628
+ }, () => {
45629
+ const {
45630
+ TeX
45631
+ } = getDependencies();
45632
+ return [/*#__PURE__*/React.createElement(TeX, {
45633
+ key: "gt"
45634
+ }, i18n.doNotTranslate("\\gt")), "GT", i18n._("Greater than sign")];
45635
+ }],
45636
+ "advanced relations": [() => {
45637
+ const {
45638
+ TeX
45639
+ } = getDependencies();
45640
+ return [/*#__PURE__*/React.createElement(TeX, {
45641
+ key: "neq"
45642
+ }, i18n.doNotTranslate("\\neq")), "NEQ", i18n._("Not-equals sign")];
45643
+ }, () => {
45644
+ const {
45645
+ TeX
45646
+ } = getDependencies();
45647
+ return [/*#__PURE__*/React.createElement(TeX, {
45648
+ key: "leq"
45649
+ }, i18n.doNotTranslate("\\leq")), "LEQ", i18n._("Less than or equal to sign")];
45650
+ }, () => {
45651
+ const {
45652
+ TeX
45653
+ } = getDependencies();
45654
+ return [/*#__PURE__*/React.createElement(TeX, {
45655
+ key: "geq"
45656
+ }, i18n.doNotTranslate("\\geq")), "GEQ", i18n._("Greater than or equal to sign")];
45657
+ }]
45658
+ };
45659
+ const buttonSetsPropType = PropTypes.arrayOf(PropTypes.oneOf(_(buttonSets).keys()));
45660
+ class TexButtons extends React.Component {
45661
+ render() {
45662
+ // Always show buttonSets in the same order. Note: Technically it's ok
45663
+ // for _.keys() to return the keys in an arbitrary order, but in
45664
+ // practice, they will be ordered as listed above.
45665
+ const sortedButtonSets = _.sortBy(this.props.sets, setName => _.keys(buttonSets).indexOf(setName));
45666
+ const buttons = _(sortedButtonSets).map(setName => buttonSets[setName]);
45667
+ const buttonRows = _(buttons).map(row => row.map(symbGen => {
45668
+ // create a (component, thing we should send to mathquill) pair
45669
+ const symbol = symbGen(this.props);
45670
+ return /*#__PURE__*/React.createElement("button", {
45671
+ onClick: () => this.props.onInsert(symbol[1]),
45672
+ className: "tex-button"
45673
+ // @ts-expect-error - TS2533 - Object is possibly 'null' or 'undefined'. | TS2339 - Property 'key' does not exist on type 'boolean | ReactChild | ReactFragment | ReactPortal'.
45674
+ ,
45675
+ key: symbol[0].key,
45676
+ type: "button",
45677
+ "aria-label": symbol[2]
45678
+ }, symbol[0]);
45679
+ }));
45680
+ const buttonPopup = _(buttonRows).map((row, i) => {
45681
+ return /*#__PURE__*/React.createElement("div", {
45682
+ className: "clearfix tex-button-row",
45683
+ key: this.props.sets[i]
45684
+ }, row);
45685
+ });
45686
+ return /*#__PURE__*/React.createElement("div", {
45687
+ className: `${this.props.className || ""} preview-measure`
45688
+ }, buttonPopup);
45689
+ }
45690
+ }
45691
+ TexButtons.buttonSets = buttonSets;
45692
+ TexButtons.buttonSetsType = buttonSetsPropType;
45693
+
45607
45694
  var components = /*#__PURE__*/Object.freeze({
45608
- __proto__: null,
45609
- ButtonGroup: ButtonGroup,
45610
- Graph: Graph,
45611
- Graphie: Graphie,
45612
- HUD: HUD,
45613
- Icon: Icon,
45614
- InfoTip: InfoTip,
45615
- InlineIcon: InlineIcon,
45616
- MathInput: MathInput,
45617
- MultiButtonGroup: MultiButtonGroup,
45618
- NumberInput: NumberInput,
45619
- PropCheckBox: PropCheckBox,
45620
- RangeInput: RangeInput,
45621
- SvgImage: SvgImage,
45622
- TextInput: TextInput,
45623
- TexButtons: TexButtons,
45624
- TextListEditor: TextListEditor
45695
+ __proto__: null,
45696
+ ButtonGroup: ButtonGroup,
45697
+ Graph: Graph,
45698
+ Graphie: Graphie,
45699
+ HUD: HUD,
45700
+ Icon: Icon,
45701
+ InfoTip: InfoTip,
45702
+ InlineIcon: InlineIcon,
45703
+ MathInput: MathInput,
45704
+ MultiButtonGroup: MultiButtonGroup,
45705
+ NumberInput: NumberInput,
45706
+ PropCheckBox: PropCheckBox,
45707
+ RangeInput: RangeInput,
45708
+ SvgImage: SvgImage,
45709
+ TextInput: TextInput,
45710
+ TexButtons: TexButtons,
45711
+ TextListEditor: TextListEditor
45625
45712
  });
45626
45713
 
45627
45714
  const devices = {
@@ -45640,10 +45727,10 @@ const lintGutterWidth = 36;
45640
45727
  const perseusFrameBorderWidth = 1;
45641
45728
 
45642
45729
  var constants = /*#__PURE__*/Object.freeze({
45643
- __proto__: null,
45644
- devices: devices,
45645
- lintGutterWidth: lintGutterWidth,
45646
- perseusFrameBorderWidth: perseusFrameBorderWidth
45730
+ __proto__: null,
45731
+ devices: devices,
45732
+ lintGutterWidth: lintGutterWidth,
45733
+ perseusFrameBorderWidth: perseusFrameBorderWidth
45647
45734
  });
45648
45735
 
45649
45736
  // TODO(FEI-4010): Remove `Perseus` prefix for all types here
@@ -46808,9 +46895,5 @@ const EditorJsonify = {
46808
46895
  }
46809
46896
  };
46810
46897
 
46811
- /* eslint-disable @khanacademy/ts-no-error-suppressions */
46812
- const apiVersion = version.apiVersion;
46813
- const itemDataVersion = version.itemDataVersion;
46814
-
46815
- export { ApiOptions, ArrowPicker, ArticleRenderer, BaseRadio, Categorizer$1 as Categorizer, changeable as Changeable, ClassNames, ColorPicker, DashPicker, dependencies as Dependencies, EditorJsonify, ElementContainer, Errors, Expression, util as GrapherUtil, Grapher$1 as GrapherWidget, HintRenderer, HintsRenderer, InputNumber$1 as InputNumber, InteractiveGraph$1 as InteractiveGraphWidget, ItemRenderer, JiptParagraphs, KhanColors, KhanMath, context as LoadingContext, Log, Matrix$1 as MatrixWidget, MultiItems, NumericInput$1 as NumericInput, PerseusError, PerseusExpressionAnswerFormConsidered, PerseusMarkdown, Plotter$1 as PlotterWidget, Radio, Renderer, ref as ServerItemRenderer, sizingUtils as SizingUtils, Table$1 as TableWidget, Transformer$1 as TransformerWidget, Util, denylist as WIDGET_PROP_DENYLIST, WidgetJsonifyDeprecated, widgets$1 as Widgets, apiVersion, buildEmptyItemTreeForShape, buildMapper, components, constants, displaySigFigs, globalConstants, globalStyles, iconPaths as icons, init, interactiveSizes$1 as interactiveSizes, isItemRenderableByVersion, itemDataVersion, itemToTree, ItemVersion as itemVersion, mediaQueries, preprocessTex, registerAllWidgetsForTesting, shapes, traverse, violatingWidgets, allWidgets as widgets };
46898
+ export { ApiOptions, ArrowPicker, ArticleRenderer, BaseRadio, Categorizer$1 as Categorizer, changeable as Changeable, ClassNames, ColorPicker, DashPicker, dependencies as Dependencies, EditorJsonify, ElementContainer, Errors, Expression, util as GrapherUtil, Grapher$1 as GrapherWidget, HintRenderer, HintsRenderer, InputNumber$1 as InputNumber, InteractiveGraph$1 as InteractiveGraphWidget, ItemRenderer, JiptParagraphs, KhanColors, KhanMath, context as LoadingContext, Log, Matrix$1 as MatrixWidget, MultiItems, NumericInput$1 as NumericInput, PerseusError, PerseusExpressionAnswerFormConsidered, PerseusMarkdown, Plotter$1 as PlotterWidget, Radio, Renderer, ref as ServerItemRenderer, sizingUtils as SizingUtils, Table$1 as TableWidget, Transformer$1 as TransformerWidget, Util, denylist as WIDGET_PROP_DENYLIST, WidgetJsonifyDeprecated, widgets$1 as Widgets, apiVersion, buildEmptyItemTreeForShape, buildMapper, components, constants, displaySigFigs, globalConstants, globalStyles, iconPaths as icons, init, interactiveSizes$1 as interactiveSizes, isItemRenderableByVersion, itemDataVersion, itemToTree, ItemVersion as itemVersion, libVersion, mediaQueries, preprocessTex, registerAllWidgetsForTesting, shapes, traverse, violatingWidgets, allWidgets as widgets };
46816
46899
  //# sourceMappingURL=index.js.map