@khanacademy/perseus 32.0.0 → 33.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.
package/dist/es/index.js CHANGED
@@ -3161,45 +3161,6 @@ function constrainedTickStepsFromTickSteps(tickSteps, ranges) {
3161
3161
  return [constrainTickStep(tickSteps[0], ranges[0]), constrainTickStep(tickSteps[1], ranges[1])];
3162
3162
  }
3163
3163
 
3164
- /**
3165
- * Transparently update deprecated props so that the code to deal
3166
- * with them only lives in one place: (Widget).deprecatedProps
3167
- *
3168
- * For example, if a boolean `foo` was deprecated in favor of a
3169
- * number 'bar':
3170
- * deprecatedProps: {
3171
- * foo: function(props) {
3172
- * return {bar: props.foo ? 1 : 0};
3173
- * }
3174
- * }
3175
- */
3176
- const DeprecationMixin$1 = {
3177
- // This lifecycle stage is only called before first render
3178
- // TODO(jangmi, CP-3288): Remove usage of `UNSAFE_componentWillMount`
3179
- UNSAFE_componentWillMount: function () {
3180
- const newProps = {};
3181
- _.each(this.deprecatedProps, function (func, prop) {
3182
- // @ts-expect-error - TS2683 - 'this' implicitly has type 'any' because it does not have a type annotation.
3183
- if (_.has(this.props, prop)) {
3184
- // @ts-expect-error - TS2683 - 'this' implicitly has type 'any' because it does not have a type annotation.
3185
- _.extend(newProps, func(this.props));
3186
- }
3187
- }, this);
3188
- if (!_.isEmpty(newProps)) {
3189
- // Set new props directly so that widget renders correctly
3190
- // when it first mounts, even though these will be overwritten
3191
- // almost immediately afterwards...
3192
- _.extend(this.props, newProps);
3193
-
3194
- // ...when we propagate the new props upwards and they come
3195
- // back down again.
3196
- // TODO(jeff, CP-3128): Use Wonder Blocks Timing API
3197
- // eslint-disable-next-line no-restricted-syntax
3198
- setTimeout(this.props.onChange, 0, newProps);
3199
- }
3200
- }
3201
- };
3202
-
3203
3164
  /**
3204
3165
  * Approximate equality on numbers and primitives.
3205
3166
  */
@@ -3547,7 +3508,6 @@ const Util = {
3547
3508
  gridStepFromTickStep,
3548
3509
  tickStepFromNumTicks,
3549
3510
  constrainedTickStepsFromTickSteps,
3550
- DeprecationMixin: DeprecationMixin$1,
3551
3511
  eq: eq$3,
3552
3512
  deepEq: deepEq$5,
3553
3513
  parseQueryString,
@@ -10075,11 +10035,36 @@ const setLabelMargins = function setLabelMargins(span, size) {
10075
10035
  marginTop: -height / 2 - y * scale
10076
10036
  });
10077
10037
  } else {
10038
+ var _$container$css, _$container$width, _$span$css;
10039
+ const $container = $span.closest(".svg-image");
10040
+ // Ensuring that the line-height of the text doesn't throw off placement of the text element.
10041
+ // Inherited line-height values can really mess up placement.
10042
+ $container.css("line-height", "normal");
10043
+
10044
+ // The 'max-width' value is the same as the expected (100% scale) width of the graphie.
10045
+ // We are using jQuery to get this information since we don't have a way to pass it to this function.
10046
+ const expectedWidth = (_$container$css = $container.css("max-width")) != null ? _$container$css : "0px";
10047
+ // We can calculate the true scale of the graphie by taking actual width and dividing by the expected width.
10048
+ // NOTE: Using 'slice' to remove the "px" unit from the end of the expected width value.
10049
+ const scale = ((_$container$width = $container.width()) != null ? _$container$width : 0) / parseInt(expectedWidth.replace(/px$/, "")) * 100;
10050
+
10051
+ // Any padding needs to be scaled accordingly.
10052
+ const currentPadding = (_$span$css = $span.css("padding")) != null ? _$span$css : "0px";
10053
+ const newPadding = Math.round(parseInt(currentPadding.slice(0, -2)) * scale) / 100;
10054
+
10055
+ // "multipliers" basically move the position of the text by using 1, 0, -1
10056
+ // 'margin-left' and 'margin-top' are used to position the text.
10057
+ // Margin and font size need to be scaled accordingly.
10078
10058
  const multipliers = labelDirections[direction || "center"];
10079
- $span.css({
10080
- marginLeft: Math.round(width * multipliers[0]),
10081
- marginTop: Math.round(height * multipliers[1])
10082
- });
10059
+ const styling = {
10060
+ marginLeft: Math.round(width * multipliers[0] * scale) / 100,
10061
+ marginTop: Math.round(height * multipliers[1] * scale) / 100,
10062
+ padding: `${newPadding}px`
10063
+ };
10064
+ if (scale !== 1) {
10065
+ styling["fontSize"] = `${Math.round(scale * 100) / 100}%`;
10066
+ }
10067
+ $span.css(styling);
10083
10068
  }
10084
10069
  };
10085
10070
  const GraphUtils = {
@@ -17271,9 +17256,16 @@ class SvgImage extends React.Component {
17271
17256
  // without coordinates. They don't seem to have any content, so
17272
17257
  // it seems fine to just ignore them (rather than error), but
17273
17258
  // we should figure out why this is happening.
17274
- const label = graphie.label(labelData.coordinates, labelData.content, labelData.alignment, labelData.typesetAsMath, {
17259
+
17260
+ // 'styling' - When a default scale (1) is used,
17261
+ // setting the font size to 100% is redundant.
17262
+ // Also, setting the font size to 100% can counteract other scale-based styling.
17263
+ // Therefore, when the scale is not applicable,
17264
+ // we set the value to 'null' so that no additional styling will be set.
17265
+ const styling = this.props.scale !== 1 ? {
17275
17266
  "font-size": 100 * this.props.scale + "%"
17276
- });
17267
+ } : null;
17268
+ const label = graphie.label(labelData.coordinates, labelData.content, labelData.alignment, labelData.typesetAsMath, styling);
17277
17269
 
17278
17270
  // Convert absolute positioning css from pixels to percentages
17279
17271
  // TODO(alex): Dynamically resize font-size as well. This
@@ -32034,10 +32026,14 @@ const MafsGraph = props => {
32034
32026
  state,
32035
32027
  dispatch,
32036
32028
  labels,
32037
- readOnly
32029
+ readOnly,
32030
+ fullGraphAriaLabel,
32031
+ fullGraphAriaDescription
32038
32032
  } = props;
32039
32033
  const [width, height] = props.box;
32040
32034
  const tickStep = props.step;
32035
+ const uniqueId = React.useId();
32036
+ const descriptionId = `interactive-graph-description-${uniqueId}`;
32041
32037
  const graphRef = React.useRef(null);
32042
32038
  return /*#__PURE__*/React.createElement(GraphConfigContext.Provider, {
32043
32039
  value: {
@@ -32073,9 +32069,19 @@ const MafsGraph = props => {
32073
32069
  (_graphRef$current = graphRef.current) == null || _graphRef$current.focus();
32074
32070
  }
32075
32071
  },
32072
+ "aria-label": fullGraphAriaLabel,
32073
+ "aria-describedby": fullGraphAriaDescription ? descriptionId : undefined,
32076
32074
  ref: graphRef,
32077
32075
  tabIndex: 0
32078
- }, /*#__PURE__*/React.createElement(LegacyGrid, {
32076
+ }, fullGraphAriaDescription && /*#__PURE__*/React.createElement(View, {
32077
+ id: descriptionId,
32078
+ tabIndex: -1,
32079
+ style: {
32080
+ width: 0,
32081
+ height: 0,
32082
+ overflow: "hidden"
32083
+ }
32084
+ }, fullGraphAriaDescription), /*#__PURE__*/React.createElement(LegacyGrid, {
32079
32085
  box: props.box,
32080
32086
  backgroundImage: props.backgroundImage
32081
32087
  }), props.showLabelsFlag && props.lockedFigures && /*#__PURE__*/React.createElement(GraphLockedLabelsLayer, {
@@ -33316,9 +33322,6 @@ const StatefulMafsGraph = /*#__PURE__*/React.forwardRef((props, ref) => {
33316
33322
  }));
33317
33323
  });
33318
33324
 
33319
- const {
33320
- DeprecationMixin
33321
- } = Util;
33322
33325
  const TRASH_ICON_URI = "https://ka-perseus-graphie.s3.amazonaws.com/b1452c0d79fd0f7ff4c3af9488474a0a0decb361.png";
33323
33326
  const defaultBackgroundImage = {
33324
33327
  url: null
@@ -33347,13 +33350,6 @@ function capitalize(str) {
33347
33350
  function numSteps(range, step) {
33348
33351
  return Math.floor((range[1] - range[0]) / step);
33349
33352
  }
33350
- const deprecatedProps = {
33351
- showGraph: function (props) {
33352
- return {
33353
- markings: props.showGraph ? "graph" : "none"
33354
- };
33355
- }
33356
- };
33357
33353
  const _getShouldShowInstructions = props => {
33358
33354
  return _isClickToAddPoints(props) && (
33359
33355
  // @ts-expect-error - TS2339 - Property 'coords' does not exist on type 'PerseusGraphType'. | TS2339 - Property 'coords' does not exist on type 'PerseusGraphType'.
@@ -33406,7 +33402,6 @@ class LegacyInteractiveGraph extends React.Component {
33406
33402
  // @ts-expect-error - TS2339 - Property 'coords' does not exist on type 'PerseusGraphType'. | TS2339 - Property 'coords' does not exist on type 'PerseusGraphType'.
33407
33403
  props.graph.coords == null || props.graph.coords.length === 0);
33408
33404
  };
33409
- this.deprecatedProps = deprecatedProps;
33410
33405
  this.setGraphie = newGraphie => {
33411
33406
  this.graphie = newGraphie;
33412
33407
  this.setupGraphie();
@@ -34479,10 +34474,6 @@ class LegacyInteractiveGraph extends React.Component {
34479
34474
  };
34480
34475
  this.focus = $.noop;
34481
34476
  }
34482
- // TODO(jangmi, CP-3288): Remove usage of `UNSAFE_componentWillMount`
34483
- UNSAFE_componentWillMount() {
34484
- DeprecationMixin.UNSAFE_componentWillMount.call(this);
34485
- }
34486
34477
  componentDidMount() {
34487
34478
  if (this.refs.graph) {
34488
34479
  // eslint-disable-next-line react/no-string-refs
@@ -43161,7 +43152,7 @@ class PhetSimulation extends React.Component {
43161
43152
  // http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/
43162
43153
  const sandboxProperties = "allow-same-origin allow-scripts";
43163
43154
  return /*#__PURE__*/React.createElement(View, {
43164
- style: styles$6.container
43155
+ style: styles$6.widgetContainer
43165
43156
  }, this.state.banner !== null &&
43166
43157
  /*#__PURE__*/
43167
43158
  // TODO(anna): Make this banner focusable
@@ -43173,18 +43164,16 @@ class PhetSimulation extends React.Component {
43173
43164
  layout: "floating",
43174
43165
  kind: this.state.banner.kind,
43175
43166
  text: this.state.banner.message
43176
- })), /*#__PURE__*/React.createElement("iframe", {
43167
+ })), /*#__PURE__*/React.createElement(View, {
43168
+ style: styles$6.iframeContainer
43169
+ }, /*#__PURE__*/React.createElement("iframe", {
43177
43170
  ref: this.iframeRef,
43178
43171
  title: this.props.description,
43179
43172
  sandbox: sandboxProperties,
43180
- style: {
43181
- height: 225,
43182
- width: "100%",
43183
- borderWidth: 0
43184
- },
43173
+ className: css(styles$6.iframeResponsive),
43185
43174
  src: (_this$state$url = this.state.url) == null ? void 0 : _this$state$url.toString(),
43186
43175
  allow: "fullscreen"
43187
- }), /*#__PURE__*/React.createElement(IconButton, {
43176
+ })), /*#__PURE__*/React.createElement(IconButton, {
43188
43177
  icon: cornersOutIcon,
43189
43178
  onClick: () => {
43190
43179
  var _this$iframeRef$curre;
@@ -43216,14 +43205,29 @@ const makeSafeUrl = (urlString, locale) => {
43216
43205
  return url;
43217
43206
  };
43218
43207
  const styles$6 = StyleSheet.create({
43219
- container: {
43208
+ widgetContainer: {
43220
43209
  borderRadius: borderRadiusLarge,
43221
43210
  borderWidth: 1,
43222
43211
  borderColor: basicBorderColor,
43223
43212
  padding: spacing.medium_16,
43224
- paddingBottom: 0,
43225
- // Include space for medium_16 padding on each side
43226
- width: 400 + spacing.xLarge_32
43213
+ paddingBottom: 0
43214
+ },
43215
+ iframeContainer: {
43216
+ position: "relative",
43217
+ overflow: "hidden",
43218
+ width: "100%",
43219
+ // 16:9 aspect ratio
43220
+ paddingTop: "56.25%"
43221
+ },
43222
+ iframeResponsive: {
43223
+ borderWidth: 0,
43224
+ position: "absolute",
43225
+ top: 0,
43226
+ left: 0,
43227
+ bottom: 0,
43228
+ right: 0,
43229
+ width: "100%",
43230
+ height: "100%"
43227
43231
  }
43228
43232
  });
43229
43233
  var PhetSimulation$1 = {
@@ -44737,7 +44741,7 @@ const init = function init(options) {
44737
44741
 
44738
44742
  // This file is processed by a Rollup plugin (replace) to inject the production
44739
44743
  const libName = "@khanacademy/perseus";
44740
- const libVersion = "32.0.0";
44744
+ const libVersion = "33.0.0";
44741
44745
  addLibraryVersionToPerseusDebug(libName, libVersion);
44742
44746
 
44743
44747
  const apiVersion = {
@@ -45621,128 +45625,6 @@ const ref = /*#__PURE__*/React.forwardRef((props, ref) => /*#__PURE__*/React.cre
45621
45625
  ref: ref
45622
45626
  }))));
45623
45627
 
45624
- class ArrowPicker extends React.Component {
45625
- render() {
45626
- return /*#__PURE__*/React.createElement(ButtonGroup, {
45627
- value: this.props.value,
45628
- allowEmpty: false,
45629
- buttons: [{
45630
- value: "",
45631
- content: /*#__PURE__*/React.createElement("span", null, "\u2014")
45632
- }, {
45633
- value: "->",
45634
- content: /*#__PURE__*/React.createElement("span", null, "\u2192")
45635
- }
45636
- /*
45637
- TODO(eater): fix khan-exercises so these are supported
45638
- {value: "<-", content: <span>&#x2190;</span>},
45639
- {value: "<->", content: <span>&#x2194;</span>}
45640
- */],
45641
-
45642
- onChange: this.props.onChange
45643
- });
45644
- }
45645
- }
45646
- ArrowPicker.defaultProps = {
45647
- value: ""
45648
- };
45649
-
45650
- const COLORS = [KhanColors.BLACK, KhanColors.BLUE, KhanColors.GREEN, KhanColors.PINK, KhanColors.PURPLE, KhanColors.RED, KhanColors.GRAY];
45651
- const LIGHT_COLORS = [KhanColors.LIGHT_BLUE, KhanColors.LIGHT_ORANGE, KhanColors.LIGHT_PINK, KhanColors.LIGHT_GREEN, KhanColors.LIGHT_PURPLE, KhanColors.LIGHT_RED, "#fff"];
45652
- class ColorPicker extends React.Component {
45653
- render() {
45654
- const colors = this.props.lightColors ? LIGHT_COLORS : COLORS;
45655
- return /*#__PURE__*/React.createElement(ButtonGroup, {
45656
- value: this.props.value,
45657
- allowEmpty: false,
45658
- buttons: _.map(colors, color => {
45659
- return {
45660
- value: color,
45661
- content: /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement("span", {
45662
- className: "colorpicker-circle",
45663
- style: {
45664
- background: color
45665
- }
45666
- }), "\xA0")
45667
- };
45668
- }),
45669
- onChange: this.props.onChange
45670
- });
45671
- }
45672
- }
45673
- ColorPicker.defaultProps = {
45674
- value: KhanColors.BLACK,
45675
- lightColors: false
45676
- };
45677
-
45678
- class DashPicker extends React.Component {
45679
- render() {
45680
- return /*#__PURE__*/React.createElement(ButtonGroup, {
45681
- value: this.props.value,
45682
- allowEmpty: false,
45683
- buttons: [{
45684
- value: "",
45685
- content: /*#__PURE__*/React.createElement("span", null, "\u2014")
45686
- }, {
45687
- value: "-",
45688
- content: /*#__PURE__*/React.createElement("span", null, "\u2013\u2013\u2013")
45689
- }, {
45690
- value: "- ",
45691
- content: /*#__PURE__*/React.createElement("span", null, "\u2013\xA0\xA0\u2013")
45692
- }, {
45693
- value: ".",
45694
- content: /*#__PURE__*/React.createElement("span", null, "\xB7\xB7\xB7\xB7")
45695
- }, {
45696
- value: ". ",
45697
- content: /*#__PURE__*/React.createElement("span", null, "\xB7 \xB7 \xB7")
45698
- }],
45699
- onChange: this.props.onChange
45700
- });
45701
- }
45702
- }
45703
- DashPicker.defaultProps = {
45704
- value: ""
45705
- };
45706
-
45707
- /* eslint-disable jsx-a11y/anchor-is-valid */
45708
- class ElementContainer extends React.Component {
45709
- constructor(props) {
45710
- super(props);
45711
- this.toggle = e => {
45712
- e.preventDefault();
45713
- this.setState({
45714
- show: !this.state.show
45715
- });
45716
- };
45717
- this.state = {
45718
- show: props.initiallyVisible
45719
- };
45720
- }
45721
- render() {
45722
- return /*#__PURE__*/React.createElement("div", {
45723
- className: "perseus-interaction-element"
45724
- }, /*#__PURE__*/React.createElement("a", {
45725
- href: "#",
45726
- className: "perseus-interaction-element-title " + (this.state.show ? "open" : "closed"),
45727
- onClick: this.toggle
45728
- }, this.state.show ? /*#__PURE__*/React.createElement(InlineIcon, iconChevronDown) : /*#__PURE__*/React.createElement(InlineIcon, iconChevronRight), this.props.title), /*#__PURE__*/React.createElement("div", {
45729
- className: "perseus-interaction-element-content " + (this.state.show ? "enter" : "leave")
45730
- }, this.props.children, (this.props.onUp != null || this.props.onDown != null || this.props.onDelete != null) && /*#__PURE__*/React.createElement("div", {
45731
- className: "edit-controls"
45732
- }, this.props.onUp != null && /*#__PURE__*/React.createElement("button", {
45733
- onClick: this.props.onUp
45734
- }, /*#__PURE__*/React.createElement(InlineIcon, iconCircleArrowUp)), this.props.onDown != null && /*#__PURE__*/React.createElement("button", {
45735
- onClick: this.props.onDown
45736
- }, /*#__PURE__*/React.createElement(InlineIcon, iconCircleArrowDown)), this.props.onDelete != null && /*#__PURE__*/React.createElement("button", {
45737
- onClick: this.props.onDelete
45738
- }, /*#__PURE__*/React.createElement(InlineIcon, iconTrash)))));
45739
- }
45740
- }
45741
- ElementContainer.defaultProps = {
45742
- initiallyVisible: false,
45743
- title: "More"
45744
- };
45745
-
45746
45628
  const devices = {
45747
45629
  PHONE: "phone",
45748
45630
  TABLET: "tablet",
@@ -48322,5 +48204,5 @@ const EditorJsonify = {
48322
48204
  }
48323
48205
  };
48324
48206
 
48325
- export { ApiOptions, ArrowPicker, ArticleRenderer, BaseRadio, Categorizer$1 as Categorizer, changeable as Changeable, ClassNames, ColorPicker, DashPicker, dependencies as Dependencies, EditorJsonify, ElementContainer, Expression, util as GrapherUtil, Grapher$1 as GrapherWidget, HintRenderer, HintsRenderer, InputNumber$1 as InputNumber, InteractiveGraph$1 as InteractiveGraphWidget, ItemExtras, JiptParagraphs, KhanColors, KhanMath, context as LoadingContext, Log, Matrix$1 as MatrixWidget, MultiItems, NumericInput$1 as NumericInput, PerseusExpressionAnswerFormConsidered, PerseusI18nContext, PerseusI18nContextProvider, PerseusMarkdown, Plotter$1 as PlotterWidget, QUESTION_WIDGETS, Radio, Renderer, ref as ServerItemRenderer, sizingUtils as SizingUtils, Table$1 as TableWidget, Util, denylist as WIDGET_PROP_DENYLIST, WidgetJsonifyDeprecated, widgets$1 as Widgets, addWidget, apiVersion, buildEmptyItemTreeForShape, buildMapper, components, constants, contentHasWidgetType, convertWidgetNameToEnum, displaySigFigs, generateTestCategorizerWidget, generateTestExpressionWidget, generateTestInteractiveGraphWidget, generateTestNumericInputWidget, generateTestPerseusItem, generateTestRadioWidget, genericPerseusItemData, getAngleCoords, getAnswerFromUserInput, getAnswersFromWidgets, getCircleCoords, getCorrectAnswerForWidgetId, getLineCoords, getLinearSystemCoords, getPointCoords, getPolygonCoords, getQuadraticCoords, getSegmentCoords, getSinusoidCoords, getValidWidgetIds, getWidgetFromWidgetMap, getWidgetIdsFromContent, getWidgetIdsFromContentByType, getWidgetTypeByWidgetId, getWidgetsFromWidgetMap, getWidgetsMapFromItemData, globalConstants, globalStyles, iconPaths as icons, init, injectWidgets, interactiveSizes$1 as interactiveSizes, isItemRenderableByVersion, isWidgetIdInContent, isWrongAnswerSupported, itemDataVersion, itemToTree, ItemVersion as itemVersion, libVersion, lockedFigureColors, lockedFigureFillStyles, makeSafeUrl, mediaQueries, parsePerseusItem, plotterPlotTypes, preprocessTex, registerAllWidgetsForTesting, shapes, shouldHaveIndividualAnswer, traverse, usePerseusI18n, violatingWidgets, allWidgets as widgets };
48207
+ export { ApiOptions, ArticleRenderer, BaseRadio, Categorizer$1 as Categorizer, changeable as Changeable, ClassNames, dependencies as Dependencies, EditorJsonify, Expression, util as GrapherUtil, Grapher$1 as GrapherWidget, HintRenderer, HintsRenderer, InputNumber$1 as InputNumber, InteractiveGraph$1 as InteractiveGraphWidget, ItemExtras, JiptParagraphs, KhanColors, KhanMath, context as LoadingContext, Log, Matrix$1 as MatrixWidget, MultiItems, NumericInput$1 as NumericInput, PerseusExpressionAnswerFormConsidered, PerseusI18nContext, PerseusI18nContextProvider, PerseusMarkdown, Plotter$1 as PlotterWidget, QUESTION_WIDGETS, Radio, Renderer, ref as ServerItemRenderer, sizingUtils as SizingUtils, Table$1 as TableWidget, Util, denylist as WIDGET_PROP_DENYLIST, WidgetJsonifyDeprecated, widgets$1 as Widgets, addWidget, apiVersion, buildEmptyItemTreeForShape, buildMapper, components, constants, contentHasWidgetType, convertWidgetNameToEnum, displaySigFigs, generateTestCategorizerWidget, generateTestExpressionWidget, generateTestInteractiveGraphWidget, generateTestNumericInputWidget, generateTestPerseusItem, generateTestRadioWidget, genericPerseusItemData, getAngleCoords, getAnswerFromUserInput, getAnswersFromWidgets, getCircleCoords, getCorrectAnswerForWidgetId, getLineCoords, getLinearSystemCoords, getPointCoords, getPolygonCoords, getQuadraticCoords, getSegmentCoords, getSinusoidCoords, getValidWidgetIds, getWidgetFromWidgetMap, getWidgetIdsFromContent, getWidgetIdsFromContentByType, getWidgetTypeByWidgetId, getWidgetsFromWidgetMap, getWidgetsMapFromItemData, globalConstants, globalStyles, iconPaths as icons, init, injectWidgets, interactiveSizes$1 as interactiveSizes, isItemRenderableByVersion, isWidgetIdInContent, isWrongAnswerSupported, itemDataVersion, itemToTree, ItemVersion as itemVersion, libVersion, lockedFigureColors, lockedFigureFillStyles, makeSafeUrl, mediaQueries, parsePerseusItem, plotterPlotTypes, preprocessTex, registerAllWidgetsForTesting, shapes, shouldHaveIndividualAnswer, traverse, usePerseusI18n, violatingWidgets, allWidgets as widgets };
48326
48208
  //# sourceMappingURL=index.js.map