@khanacademy/perseus 10.0.1 → 10.1.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
@@ -17566,7 +17566,8 @@ class Zoomable extends React.Component {
17566
17566
  zoomed
17567
17567
  } = this.state;
17568
17568
  const {
17569
- animateHeight
17569
+ animateHeight,
17570
+ disableEntranceAnimation
17570
17571
  } = this.props;
17571
17572
  const property = animateHeight ? "opacity transform height" : "opacity transform";
17572
17573
 
@@ -17578,7 +17579,9 @@ class Zoomable extends React.Component {
17578
17579
  } : {};
17579
17580
 
17580
17581
  // Do a fancy little slide as we fade the contents in the first time.
17581
- const translateOffset = visible ? "" : " translate(0, 8px)";
17582
+ const shouldSlide = !disableEntranceAnimation && !visible;
17583
+ const translateOffset = shouldSlide ? " translate(0, 8px)" : "";
17584
+ const opacity = shouldSlide ? 0 : 1;
17582
17585
  const scaleString = (scale != null ? scale : 1).toString();
17583
17586
  const transform = zoomed ? `scale(1, 1) ${translateOffset}` : `scale(${scaleString}, ${scaleString}) ${translateOffset}`;
17584
17587
  const style = _extends({
@@ -17587,7 +17590,7 @@ class Zoomable extends React.Component {
17587
17590
  height: zoomed ? expandedHeight : compactHeight,
17588
17591
  transform: transform,
17589
17592
  transformOrigin: "0 0",
17590
- opacity: visible ? 1 : 0,
17593
+ opacity: opacity,
17591
17594
  WebkitTapHighlightColor: "transparent"
17592
17595
  }, transitionStyle);
17593
17596
  return /*#__PURE__*/React.createElement("span", {
@@ -17605,6 +17608,7 @@ class Zoomable extends React.Component {
17605
17608
  Zoomable.defaultProps = {
17606
17609
  animateHeight: false,
17607
17610
  readyToMeasure: true,
17611
+ disableEntranceAnimation: false,
17608
17612
  computeChildBounds: parentNode => {
17609
17613
  const firstChild = parentNode.firstElementChild;
17610
17614
  return {
@@ -17655,7 +17659,9 @@ class ZoomableTeX extends React.Component {
17655
17659
  render() {
17656
17660
  return /*#__PURE__*/React.createElement(Zoomable, {
17657
17661
  readyToMeasure: this.state.isRendered,
17658
- computeChildBounds: computeMathBounds
17662
+ computeChildBounds: computeMathBounds,
17663
+ animateHeight: false,
17664
+ disableEntranceAnimation: true
17659
17665
  }, /*#__PURE__*/React.createElement(context$1.Consumer, null, ({
17660
17666
  setAssetStatus
17661
17667
  }) => /*#__PURE__*/React.createElement(Tex, {
@@ -17899,33 +17905,33 @@ class Lint extends React.Component {
17899
17905
  let warningText;
17900
17906
  let warningTextStyle;
17901
17907
  if (this.props.severity === Severity.Error) {
17902
- severityStyle = styles$A.indicatorError;
17908
+ severityStyle = styles$z.indicatorError;
17903
17909
  warningText = "Error";
17904
- warningTextStyle = styles$A.publishBlockingError;
17910
+ warningTextStyle = styles$z.publishBlockingError;
17905
17911
  } else if (this.props.severity === Severity.Warning) {
17906
- severityStyle = styles$A.indicatorWarning;
17912
+ severityStyle = styles$z.indicatorWarning;
17907
17913
  warningText = "Warning";
17908
- warningTextStyle = styles$A.warning;
17914
+ warningTextStyle = styles$z.warning;
17909
17915
  } else {
17910
- severityStyle = styles$A.indicatorGuideline;
17916
+ severityStyle = styles$z.indicatorGuideline;
17911
17917
  warningText = "Recommendation";
17912
- warningTextStyle = styles$A.warning;
17918
+ warningTextStyle = styles$z.warning;
17913
17919
  }
17914
17920
  return /*#__PURE__*/React.createElement("a", {
17915
17921
  href: `https://khanacademy.org/r/linter-rules#${this.props.ruleName}`,
17916
17922
  target: "lint-help-window",
17917
17923
  className: css(style)
17918
17924
  }, /*#__PURE__*/React.createElement("span", {
17919
- className: css(styles$A.indicator, severityStyle)
17925
+ className: css(styles$z.indicator, severityStyle)
17920
17926
  }, this.props.severity === 1 && /*#__PURE__*/React.createElement(InlineIcon, exclamationIcon)), /*#__PURE__*/React.createElement("div", {
17921
- className: css(styles$A.tooltip, tooltipAbove && styles$A.tooltipAbove)
17927
+ className: css(styles$z.tooltip, tooltipAbove && styles$z.tooltipAbove)
17922
17928
  }, this.props.message.split("\n\n").map((m, i) => /*#__PURE__*/React.createElement("p", {
17923
17929
  key: i,
17924
- className: css(styles$A.tooltipParagraph)
17930
+ className: css(styles$z.tooltipParagraph)
17925
17931
  }, /*#__PURE__*/React.createElement("span", {
17926
17932
  className: css(warningTextStyle)
17927
17933
  }, warningText, ":", " "), m)), /*#__PURE__*/React.createElement("div", {
17928
- className: css(styles$A.tail, tooltipAbove && styles$A.tailAbove)
17934
+ className: css(styles$z.tail, tooltipAbove && styles$z.tailAbove)
17929
17935
  })));
17930
17936
  };
17931
17937
  }
@@ -17969,20 +17975,20 @@ class Lint extends React.Component {
17969
17975
  }
17970
17976
  if (blockHighlight) {
17971
17977
  return /*#__PURE__*/React.createElement("span", {
17972
- className: css(styles$A.lintContainer, styles$A.lintContainerBlock)
17973
- }, this.renderLink(styles$A.radioWidgetHoverTarget), /*#__PURE__*/React.createElement("span", null, children));
17978
+ className: css(styles$z.lintContainer, styles$z.lintContainerBlock)
17979
+ }, this.renderLink(styles$z.radioWidgetHoverTarget), /*#__PURE__*/React.createElement("span", null, children));
17974
17980
  }
17975
17981
  if (inline) {
17976
17982
  return /*#__PURE__*/React.createElement("span", {
17977
- className: css(styles$A.lintContainer)
17978
- }, this.renderLink(styles$A.inlineHoverTarget), /*#__PURE__*/React.createElement("span", null, children));
17983
+ className: css(styles$z.lintContainer)
17984
+ }, this.renderLink(styles$z.inlineHoverTarget), /*#__PURE__*/React.createElement("span", null, children));
17979
17985
  }
17980
17986
  return /*#__PURE__*/React.createElement("div", {
17981
- className: css(styles$A.lintContainer)
17982
- }, this.renderLink(styles$A.hoverTarget), /*#__PURE__*/React.createElement("div", null, children));
17987
+ className: css(styles$z.lintContainer)
17988
+ }, this.renderLink(styles$z.hoverTarget), /*#__PURE__*/React.createElement("div", null, children));
17983
17989
  }
17984
17990
  }
17985
- const styles$A = StyleSheet.create({
17991
+ const styles$z = StyleSheet.create({
17986
17992
  // This is the class of the outermost element.
17987
17993
  // We use relative positioning so that the lint indicator can be
17988
17994
  // positioned absolutely relative to the position of the linty container.
@@ -19730,7 +19736,7 @@ class Renderer extends React.Component {
19730
19736
  paddingLeft: margin,
19731
19737
  paddingRight: margin
19732
19738
  };
19733
- const mobileInnerStyle = _extends({}, innerStyle, styles$z.mobileZoomableParentFix);
19739
+ const mobileInnerStyle = _extends({}, innerStyle, styles$y.mobileZoomableParentFix);
19734
19740
  return /*#__PURE__*/React.createElement("div", {
19735
19741
  key: state.key,
19736
19742
  className: "perseus-block-math",
@@ -19851,7 +19857,7 @@ class Renderer extends React.Component {
19851
19857
  paddingLeft: 0,
19852
19858
  paddingRight: 0
19853
19859
  };
19854
- const mobileInnerStyle = _extends({}, innerStyle, styles$z.mobileZoomableParentFix);
19860
+ const mobileInnerStyle = _extends({}, innerStyle, styles$y.mobileZoomableParentFix);
19855
19861
  const wrappedOutput = /*#__PURE__*/React.createElement("div", {
19856
19862
  style: _extends({}, mobileInnerStyle, {
19857
19863
  overflowX: "auto"
@@ -20467,7 +20473,7 @@ Renderer.defaultProps = {
20467
20473
  onSerializedStateUpdated: () => {},
20468
20474
  linterContext: PerseusLinter.linterContextDefault
20469
20475
  };
20470
- const styles$z = {
20476
+ const styles$y = {
20471
20477
  mobileZoomableParentFix: {
20472
20478
  // NOTE(abdul): There is an issue where transform animations will
20473
20479
  // cause the Zoomable component to disappear when running on the
@@ -21245,10 +21251,10 @@ class InputNumber extends React.Component {
21245
21251
  // Note: This is _very_ similar to what `numeric-input.jsx` does. If
21246
21252
  // you modify this, double-check if you also need to modify that
21247
21253
  // component.
21248
- const inputStyles = [styles$y.default, this.props.size === "small" ? styles$y.small : null, this.props.rightAlign ? styles$y.rightAlign : styles$y.leftAlign];
21254
+ const inputStyles = [styles$x.default, this.props.size === "small" ? styles$x.small : null, this.props.rightAlign ? styles$x.rightAlign : styles$x.leftAlign];
21249
21255
  // Unanswered
21250
21256
  if (rubric && !this.props.currentValue) {
21251
- inputStyles.push(styles$y.answerStateUnanswered);
21257
+ inputStyles.push(styles$x.answerStateUnanswered);
21252
21258
  }
21253
21259
  return /*#__PURE__*/React.createElement(InputWithExamples
21254
21260
  // eslint-disable-next-line react/no-string-refs
@@ -21333,7 +21339,7 @@ InputNumber.defaultProps = {
21333
21339
  apiOptions: ApiOptions.defaults,
21334
21340
  linterContext: linterContextDefault
21335
21341
  };
21336
- const styles$y = StyleSheet.create({
21342
+ const styles$x = StyleSheet.create({
21337
21343
  default: {
21338
21344
  width: 80,
21339
21345
  height: "auto"
@@ -22322,7 +22328,7 @@ const FocusRing = function FocusRing(props) {
22322
22328
  };
22323
22329
  return /*#__PURE__*/React.createElement("span", {
22324
22330
  "data-test-id": "focus-ring",
22325
- className: css(styles$x.ring),
22331
+ className: css(styles$w.ring),
22326
22332
  style: style
22327
22333
  }, children);
22328
22334
  };
@@ -22331,7 +22337,7 @@ FocusRing.defaultProps = {
22331
22337
  color: kaGreen$1,
22332
22338
  multipleSelect: false
22333
22339
  };
22334
- const styles$x = StyleSheet.create({
22340
+ const styles$w = StyleSheet.create({
22335
22341
  ring: {
22336
22342
  margin: "auto",
22337
22343
  display: "inline-block",
@@ -22368,7 +22374,7 @@ function getChoiceLetter(pos) {
22368
22374
  }
22369
22375
 
22370
22376
  const CHOICE_ICON_SIZE = 24;
22371
- const styles$w = StyleSheet.create({
22377
+ const styles$v = StyleSheet.create({
22372
22378
  iconWrapper: {
22373
22379
  display: "inline-block",
22374
22380
  position: "relative"
@@ -22391,7 +22397,7 @@ const CrossOutLine = function CrossOutLine(props) {
22391
22397
  width: CROSS_OUT_LINE_SIZE,
22392
22398
  height: CROSS_OUT_LINE_SIZE,
22393
22399
  viewBox: `0 0 ${CROSS_OUT_LINE_SIZE} ${CROSS_OUT_LINE_SIZE}`,
22394
- className: css(styles$v.crossOutLine),
22400
+ className: css(styles$u.crossOutLine),
22395
22401
  "data-test-id": "choice-icon__cross-out-line"
22396
22402
  }, /*#__PURE__*/React.createElement("line", {
22397
22403
  // The line stretches from the bottom-left to top-right.
@@ -22406,7 +22412,7 @@ const CrossOutLine = function CrossOutLine(props) {
22406
22412
  strokeLinecap: "round"
22407
22413
  }));
22408
22414
  };
22409
- const styles$v = StyleSheet.create({
22415
+ const styles$u = StyleSheet.create({
22410
22416
  crossOutLine: {
22411
22417
  // Center the icon within the container.
22412
22418
  position: "absolute",
@@ -22487,7 +22493,7 @@ const ChoiceIcon = function ChoiceIcon(props) {
22487
22493
  } = props;
22488
22494
  const dynamicStyles = getDynamicStyles(checked, showCorrectness, pressed, multipleSelect, correct);
22489
22495
  return /*#__PURE__*/React.createElement("div", {
22490
- className: css(styles$w.iconWrapper)
22496
+ className: css(styles$v.iconWrapper)
22491
22497
  }, /*#__PURE__*/React.createElement(FocusRing, {
22492
22498
  color: Color.blue,
22493
22499
  visible: focused || hovered,
@@ -22496,13 +22502,13 @@ const ChoiceIcon = function ChoiceIcon(props) {
22496
22502
  // @ts-expect-error - TS2322 - Type '{ backgroundColor: string | null | undefined; borderColor: string; color: string; borderRadius: number; }' is not assignable to type 'Properties<string | number, string & {}>'.
22497
22503
  style: dynamicStyles,
22498
22504
  "data-test-id": "choice-icon__library-choice-icon",
22499
- className: css(styles$u.circle, showCorrectness && correct && styles$u.circleCorrect, showCorrectness && !correct && styles$u.circleIncorrect, showCorrectness && !correct && (checked || previouslyAnswered) && styles$u.circleIncorrectAnswered)
22505
+ className: css(styles$t.circle, showCorrectness && correct && styles$t.circleCorrect, showCorrectness && !correct && styles$t.circleIncorrect, showCorrectness && !correct && (checked || previouslyAnswered) && styles$t.circleIncorrectAnswered)
22500
22506
  // used in BaseRadio editMode to check
22501
22507
  // if we actually clicked on the radio icon
22502
22508
  ,
22503
22509
  "data-is-radio-icon": true
22504
22510
  }, /*#__PURE__*/React.createElement("div", {
22505
- className: css(styles$u.innerWrapper)
22511
+ className: css(styles$t.innerWrapper)
22506
22512
  }, /*#__PURE__*/React.createElement(ChoiceInner, {
22507
22513
  pos: pos,
22508
22514
  showCorrectness: showCorrectness,
@@ -22511,7 +22517,7 @@ const ChoiceIcon = function ChoiceIcon(props) {
22511
22517
  color: dynamicStyles.borderColor
22512
22518
  }));
22513
22519
  };
22514
- const styles$u = StyleSheet.create({
22520
+ const styles$t = StyleSheet.create({
22515
22521
  innerWrapper: {
22516
22522
  width: CHOICE_ICON_SIZE,
22517
22523
  height: CHOICE_ICON_SIZE,
@@ -22603,19 +22609,19 @@ const OptionStatus = function OptionStatus(props) {
22603
22609
  }
22604
22610
  let textStyle;
22605
22611
  if (correct) {
22606
- textStyle = styles$t.correct;
22612
+ textStyle = styles$s.correct;
22607
22613
  } else {
22608
22614
  if (checked || previouslyAnswered) {
22609
- textStyle = styles$t.incorrectAnswered;
22615
+ textStyle = styles$s.incorrectAnswered;
22610
22616
  } else {
22611
- textStyle = styles$t.incorrect;
22617
+ textStyle = styles$s.incorrect;
22612
22618
  }
22613
22619
  }
22614
22620
  return /*#__PURE__*/React.createElement("div", {
22615
- className: css(styles$t.text, textStyle)
22621
+ className: css(styles$s.text, textStyle)
22616
22622
  }, renderText(checked, correct, crossedOut));
22617
22623
  };
22618
- const styles$t = StyleSheet.create({
22624
+ const styles$s = StyleSheet.create({
22619
22625
  text: {
22620
22626
  alignItems: "center",
22621
22627
  display: "flex",
@@ -22690,8 +22696,8 @@ const Choice = function Choice(props) {
22690
22696
  crossedOut: updatedCrossedOut
22691
22697
  });
22692
22698
  }
22693
- const descriptionClassName = classNames("description", css(styles$s.description));
22694
- const rationaleClassName = classNames("perseus-radio-rationale-content", css(styles$s.rationale));
22699
+ const descriptionClassName = classNames("description", css(styles$r.description));
22700
+ const rationaleClassName = classNames("perseus-radio-rationale-content", css(styles$r.rationale));
22695
22701
 
22696
22702
  // We want to show the choices as dimmed out when the choices are disabled.
22697
22703
  // However, we don't want to do this when we're in review mode in the
@@ -22850,7 +22856,7 @@ const Choice = function Choice(props) {
22850
22856
  "data-test-id": `perseus-radio-rationale-content-${pos}`
22851
22857
  }, rationale));
22852
22858
  };
22853
- const styles$s = StyleSheet.create({
22859
+ const styles$r = StyleSheet.create({
22854
22860
  description: {
22855
22861
  display: "inline-block",
22856
22862
  width: "100%"
@@ -23041,10 +23047,10 @@ const BaseRadio = function BaseRadio(props) {
23041
23047
  const isMobile = apiOptions.isMobile;
23042
23048
  const firstChoiceHighlighted = choices[0].highlighted;
23043
23049
  const lastChoiceHighlighted = choices[choices.length - 1].highlighted;
23044
- const className = classNames("perseus-widget-radio", !editMode && "perseus-rendered-radio", css(styles$r.radio, styles$r.responsiveRadioContainer, firstChoiceHighlighted && isMobile && styles$r.radioContainerFirstHighlighted, lastChoiceHighlighted && isMobile && styles$r.radioContainerLastHighlighted));
23045
- const instructionsClassName = classNames("instructions", css(styles$r.instructions, isMobile && styles$r.instructionsMobile));
23050
+ const className = classNames("perseus-widget-radio", !editMode && "perseus-rendered-radio", css(styles$q.radio, styles$q.responsiveRadioContainer, firstChoiceHighlighted && isMobile && styles$q.radioContainerFirstHighlighted, lastChoiceHighlighted && isMobile && styles$q.radioContainerLastHighlighted));
23051
+ const instructionsClassName = classNames("instructions", css(styles$q.instructions, isMobile && styles$q.instructionsMobile));
23046
23052
  const instructions = getInstructionsText(multipleSelect, countChoices, numCorrect);
23047
- const responsiveClassName = css(styles$r.responsiveFieldset);
23053
+ const responsiveClassName = css(styles$q.responsiveFieldset);
23048
23054
  const fieldset = /*#__PURE__*/React.createElement("fieldset", {
23049
23055
  className: `perseus-widget-radio-fieldset ${responsiveClassName}`
23050
23056
  }, /*#__PURE__*/React.createElement("legend", {
@@ -23095,7 +23101,7 @@ const BaseRadio = function BaseRadio(props) {
23095
23101
  const aphroditeClassName = checked => {
23096
23102
  // Whether or not to show correctness borders
23097
23103
  // for this choice and the next choice.
23098
- return css(sharedStyles.aboveScratchpad, styles$r.item, styles$r.responsiveItem, checked && styles$r.selectedItem, checked && choice.highlighted && styles$r.aboveBackdrop, checked && choice.highlighted && apiOptions.isMobile && styles$r.aboveBackdropMobile, nextChoiceHighlighted && apiOptions.isMobile && styles$r.nextHighlighted);
23104
+ return css(sharedStyles.aboveScratchpad, styles$q.item, styles$q.responsiveItem, checked && styles$q.selectedItem, checked && choice.highlighted && styles$q.aboveBackdrop, checked && choice.highlighted && apiOptions.isMobile && styles$q.aboveBackdropMobile, nextChoiceHighlighted && apiOptions.isMobile && styles$q.nextHighlighted);
23099
23105
  };
23100
23106
 
23101
23107
  // HACK(abdulrahman): Preloads the selection-state
@@ -23169,14 +23175,14 @@ const BaseRadio = function BaseRadio(props) {
23169
23175
  // Allow for horizontal scrolling if content is too wide, which may be
23170
23176
  // an issue especially on phones.
23171
23177
  return /*#__PURE__*/React.createElement("div", {
23172
- className: css(styles$r.responsiveContainer)
23178
+ className: css(styles$q.responsiveContainer)
23173
23179
  }, fieldset);
23174
23180
  };
23175
23181
  BaseRadio.defaultProps = {
23176
23182
  editMode: false,
23177
23183
  multipleSelect: false
23178
23184
  };
23179
- const styles$r = StyleSheet.create({
23185
+ const styles$q = StyleSheet.create({
23180
23186
  instructions: {
23181
23187
  display: "block",
23182
23188
  color: gray17,
@@ -23815,9 +23821,9 @@ class Categorizer extends React.Component {
23815
23821
  indexedItems = Util.shuffle(indexedItems, this.props.problemNum);
23816
23822
  }
23817
23823
  const table = /*#__PURE__*/React.createElement("table", {
23818
- className: "categorizer-table " + css(styles$q.mobileTable)
23824
+ className: "categorizer-table " + css(styles$p.mobileTable)
23819
23825
  }, /*#__PURE__*/React.createElement("thead", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", {
23820
- className: css(styles$q.emptyHeaderCell)
23826
+ className: css(styles$p.emptyHeaderCell)
23821
23827
  }), this.props.categories.map((category, i) => {
23822
23828
  // Array index is the correct key here, as that's
23823
23829
  // how category grading actually works -- no way
@@ -23825,7 +23831,7 @@ class Categorizer extends React.Component {
23825
23831
  // middle. (If we later add that, this should be
23826
23832
  // fixed.)
23827
23833
  return /*#__PURE__*/React.createElement("th", {
23828
- className: css(styles$q.header),
23834
+ className: css(styles$p.header),
23829
23835
  key: i
23830
23836
  }, /*#__PURE__*/React.createElement(Renderer, {
23831
23837
  content: category,
@@ -23845,7 +23851,7 @@ class Categorizer extends React.Component {
23845
23851
  })), self.props.categories.map((catName, catNum) => {
23846
23852
  const selected = self.props.values[itemNum] === catNum;
23847
23853
  return /*#__PURE__*/React.createElement("td", {
23848
- className: "category " + css(styles$q.cell),
23854
+ className: "category " + css(styles$p.cell),
23849
23855
  key: catNum
23850
23856
  }, /*#__PURE__*/React.createElement("div", {
23851
23857
  className: ClassNames.INTERACTIVE,
@@ -23864,7 +23870,7 @@ class Categorizer extends React.Component {
23864
23870
  onChange: this.onChange.bind(this, itemNum, catNum),
23865
23871
  onClick: e => e.stopPropagation()
23866
23872
  }), !isMobile && /*#__PURE__*/React.createElement("span", {
23867
- className: css(styles$q.radioSpan, selected && styles$q.checkedRadioSpan, this.props.static && selected && styles$q.staticCheckedRadioSpan)
23873
+ className: css(styles$p.radioSpan, selected && styles$p.checkedRadioSpan, this.props.static && selected && styles$p.staticCheckedRadioSpan)
23868
23874
  }, selected ? /*#__PURE__*/React.createElement(InlineIcon, iconCircle) : /*#__PURE__*/React.createElement(InlineIcon, iconCircleThin))));
23869
23875
  }));
23870
23876
  /* eslint-enable max-len */
@@ -23876,7 +23882,7 @@ class Categorizer extends React.Component {
23876
23882
  "categorizer-container": true,
23877
23883
  "static-mode": this.props.static
23878
23884
  });
23879
- const inlineStyles = this.props.apiOptions.isMobile ? [styles$q.fullBleedContainer] : [];
23885
+ const inlineStyles = this.props.apiOptions.isMobile ? [styles$p.fullBleedContainer] : [];
23880
23886
  return /*#__PURE__*/React.createElement("div", {
23881
23887
  className: extraClassNames + " " + css(...inlineStyles)
23882
23888
  }, table);
@@ -23921,7 +23927,7 @@ const pageMargin = 16;
23921
23927
 
23922
23928
  // Stylesheets aren't directly testable
23923
23929
  /* c8 ignore next */
23924
- const styles$q = StyleSheet.create({
23930
+ const styles$p = StyleSheet.create({
23925
23931
  mobileTable: {
23926
23932
  [mediaQueries.smOrSmaller]: {
23927
23933
  minWidth: "auto"
@@ -24157,7 +24163,7 @@ class CSProgram extends React.Component {
24157
24163
  // creator "went wild".
24158
24164
  // http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/
24159
24165
  return /*#__PURE__*/React.createElement("div", {
24160
- className: css(styles$p.widthOverride, styleContainer && styles$p.container)
24166
+ className: css(styles$o.widthOverride, styleContainer && styles$o.container)
24161
24167
  }, /*#__PURE__*/React.createElement("iframe", {
24162
24168
  sandbox: sandboxOptions,
24163
24169
  src: url,
@@ -24186,7 +24192,7 @@ CSProgram.defaultProps = {
24186
24192
  // optional message
24187
24193
  message: null
24188
24194
  };
24189
- const styles$p = StyleSheet.create({
24195
+ const styles$o = StyleSheet.create({
24190
24196
  // Override the inherited width from the perseus paragraph class
24191
24197
  // 820 is minimum width for 420px editor and 400px canvas
24192
24198
  widthOverride: {
@@ -24229,7 +24235,7 @@ class Definition extends React.Component {
24229
24235
  }) => /*#__PURE__*/React.createElement(Popover, {
24230
24236
  content: /*#__PURE__*/React.createElement(PopoverContentCore, {
24231
24237
  color: "white",
24232
- style: styles$o.tooltipBody,
24238
+ style: styles$n.tooltipBody,
24233
24239
  closeButtonVisible: true
24234
24240
  }, /*#__PURE__*/React.createElement(Renderer, {
24235
24241
  apiOptions: this.props.apiOptions,
@@ -24260,7 +24266,7 @@ Definition.defaultProps = {
24260
24266
  togglePrompt: "define me",
24261
24267
  definition: "definition goes here"
24262
24268
  };
24263
- const styles$o = {
24269
+ const styles$n = {
24264
24270
  tooltipBody: {
24265
24271
  color: Color.offBlack,
24266
24272
  fontSize: 20,
@@ -24419,15 +24425,15 @@ class Explanation extends React.Component {
24419
24425
  const onClick = this._onClick;
24420
24426
  if (isMobile) {
24421
24427
  linkContainer = /*#__PURE__*/React.createElement("div", {
24422
- className: css(styles$n.linkContainer)
24428
+ className: css(styles$m.linkContainer)
24423
24429
  }, /*#__PURE__*/React.createElement("a", {
24424
- className: css(styles$n.mobileExplanationLink),
24430
+ className: css(styles$m.mobileExplanationLink),
24425
24431
  href: href,
24426
24432
  onClick: onClick,
24427
24433
  role: "button",
24428
24434
  "aria-expanded": this.state.expanded
24429
24435
  }, linkAnchor), this.state.expanded && /*#__PURE__*/React.createElement("svg", {
24430
- className: css(styles$n.disclosureArrow)
24436
+ className: css(styles$m.disclosureArrow)
24431
24437
  }, /*#__PURE__*/React.createElement("polygon", {
24432
24438
  style: {
24433
24439
  fill: backgroundColor
@@ -24440,13 +24446,13 @@ class Explanation extends React.Component {
24440
24446
  // an anchor tag (if rendered in a modal) or a Wonder Blocks
24441
24447
  // link component in lesson page, see: `article-page.jsx`.
24442
24448
  linkContainer = /*#__PURE__*/React.createElement("div", {
24443
- className: css(styles$n.linkContainer, styles$n.articleLink)
24449
+ className: css(styles$m.linkContainer, styles$m.articleLink)
24444
24450
  }, /*#__PURE__*/React.createElement(Link, {
24445
- className: css(styles$n.explanationLink)
24451
+ className: css(styles$m.explanationLink)
24446
24452
  // HACK(michaelpolyak): WB Link doesn't passthrough
24447
24453
  // class name.
24448
24454
  ,
24449
- style: styles$n.explanationLink,
24455
+ style: styles$m.explanationLink,
24450
24456
  href: href,
24451
24457
  onClick: onClick,
24452
24458
  role: "button",
@@ -24456,9 +24462,9 @@ class Explanation extends React.Component {
24456
24462
  // NOTE: For exercises, the baseElements `Link` is an
24457
24463
  // anchor tag, see: `perseus-api.jsx`.
24458
24464
  linkContainer = /*#__PURE__*/React.createElement("div", {
24459
- className: css(styles$n.linkContainer, styles$n.exerciseLink)
24465
+ className: css(styles$m.linkContainer, styles$m.exerciseLink)
24460
24466
  }, /*#__PURE__*/React.createElement(Link, {
24461
- className: css(styles$n.explanationLink),
24467
+ className: css(styles$m.explanationLink),
24462
24468
  href: href,
24463
24469
  onClick: onClick,
24464
24470
  role: "button",
@@ -24466,11 +24472,11 @@ class Explanation extends React.Component {
24466
24472
  }, `[${linkAnchor}]`));
24467
24473
  }
24468
24474
  }
24469
- const expandedStyle = isMobile ? styles$n.contentExpandedMobile : styles$n.contentExpanded;
24475
+ const expandedStyle = isMobile ? styles$m.contentExpandedMobile : styles$m.contentExpanded;
24470
24476
  return /*#__PURE__*/React.createElement("div", {
24471
- className: css(styles$n.container)
24477
+ className: css(styles$m.container)
24472
24478
  }, linkContainer, this.state.expanded && /*#__PURE__*/React.createElement("div", {
24473
- className: css(styles$n.content, isMobile && styles$n.contentMobile, this.state.expanded && expandedStyle)
24479
+ className: css(styles$m.content, isMobile && styles$m.contentMobile, this.state.expanded && expandedStyle)
24474
24480
  // eslint-disable-next-line react/no-string-refs
24475
24481
  ,
24476
24482
  ref: "content"
@@ -24494,7 +24500,7 @@ const verticalContentPadding = 10;
24494
24500
  const arrowWidth = 30;
24495
24501
  const arrowHeight = 14;
24496
24502
  const backgroundColor = gray95;
24497
- const styles$n = StyleSheet.create({
24503
+ const styles$m = StyleSheet.create({
24498
24504
  container: {
24499
24505
  display: "inline",
24500
24506
  position: "relative"
@@ -24619,15 +24625,15 @@ class GradedGroupAnswerBar extends React.Component {
24619
24625
  onCheckAnswer,
24620
24626
  onNextQuestion
24621
24627
  } = this.props;
24622
- const answerBarStyle = _extends({}, styles$m.answerBar, {
24628
+ const answerBarStyle = _extends({}, styles$l.answerBar, {
24623
24629
  backgroundColor: answerBarState === "CORRECT" ? Color.offWhite : "white",
24624
24630
  // Center the "Correct!" message only when there's no next question
24625
24631
  justifyContent: answerBarState === "CORRECT" && !onNextQuestion ? "center" : "space-between"
24626
24632
  });
24627
24633
  const message = answerBarState === "INCORRECT" ? /*#__PURE__*/React.createElement("span", {
24628
- style: styles$m.text
24634
+ style: styles$l.text
24629
24635
  }, /*#__PURE__*/React.createElement("span", {
24630
- style: styles$m.tryAgainIcon
24636
+ style: styles$l.tryAgainIcon
24631
24637
  }, /*#__PURE__*/React.createElement(InlineIcon, iconTryAgain)), /*#__PURE__*/React.createElement("span", {
24632
24638
  style: {
24633
24639
  marginLeft: 8
@@ -24646,7 +24652,7 @@ class GradedGroupAnswerBar extends React.Component {
24646
24652
  return /*#__PURE__*/React.createElement("div", {
24647
24653
  style: answerBarStyle
24648
24654
  }, /*#__PURE__*/React.createElement("span", {
24649
- style: styles$m.text
24655
+ style: styles$l.text
24650
24656
  }, /*#__PURE__*/React.createElement("span", {
24651
24657
  style: {
24652
24658
  fontSize: 28,
@@ -24668,7 +24674,7 @@ class GradedGroupAnswerBar extends React.Component {
24668
24674
  }
24669
24675
  }
24670
24676
  const fontSize = 17;
24671
- const styles$m = {
24677
+ const styles$l = {
24672
24678
  answerBar: {
24673
24679
  display: "flex",
24674
24680
  alignItems: "center",
@@ -24845,7 +24851,7 @@ class GradedGroup extends React.Component {
24845
24851
  // @ts-expect-error - TS2322 - Type 'string' is not assignable to type 'null'.
24846
24852
  gradeStatus = i18n._("Incorrect");
24847
24853
  }
24848
- const mobileClass = this.props.inGradedGroupSet ? css(styles$l.gradedGroupInSet) : css(styles$l.gradedGroup);
24854
+ const mobileClass = this.props.inGradedGroupSet ? css(styles$k.gradedGroupInSet) : css(styles$k.gradedGroup);
24849
24855
  const classes = classNames({
24850
24856
  [mobileClass]: apiOptions.isMobile,
24851
24857
  "perseus-graded-group": true,
@@ -24864,7 +24870,7 @@ class GradedGroup extends React.Component {
24864
24870
  return /*#__PURE__*/React.createElement("div", {
24865
24871
  className: classes
24866
24872
  }, !!this.props.title && /*#__PURE__*/React.createElement("div", {
24867
- className: css(styles$l.title)
24873
+ className: css(styles$k.title)
24868
24874
  }, this.props.title), /*#__PURE__*/React.createElement(Renderer, _extends({}, this.props, {
24869
24875
  // eslint-disable-next-line react/no-string-refs
24870
24876
  ref: "renderer",
@@ -24896,7 +24902,7 @@ class GradedGroup extends React.Component {
24896
24902
  }, i18n._("Next question")), this.props.hint && this.props.hint.content && (this.state.showHint ? /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("button", {
24897
24903
  // @ts-expect-error - TS2322 - Type 'string' is not assignable to type 'number | undefined'.
24898
24904
  tabIndex: "0",
24899
- className: css(styles$l.explanationTitle),
24905
+ className: css(styles$k.explanationTitle),
24900
24906
  onClick: () => this.setState({
24901
24907
  showHint: false
24902
24908
  }),
@@ -24928,7 +24934,7 @@ class GradedGroup extends React.Component {
24928
24934
  showHint: true
24929
24935
  });
24930
24936
  },
24931
- className: css(styles$l.showHintLink)
24937
+ className: css(styles$k.showHintLink)
24932
24938
  }, i18n._("Explain"))), apiOptions.isMobile && answerBarState !== "HIDDEN" && /*#__PURE__*/React.createElement(GradedGroupAnswerBar, {
24933
24939
  apiOptions: apiOptions,
24934
24940
  answerBarState: answerBarState,
@@ -24949,7 +24955,7 @@ GradedGroup.defaultProps = {
24949
24955
  const traverseChildWidgets$3 = function traverseChildWidgets(props, traverseRenderer) {
24950
24956
  return _.extend({}, props, traverseRenderer(props));
24951
24957
  };
24952
- const styles$l = StyleSheet.create({
24958
+ const styles$k = StyleSheet.create({
24953
24959
  gradedGroupInSet: {
24954
24960
  // Reset a few desktop-only styles that come from graded-group.less
24955
24961
  marginLeft: 0,
@@ -25020,7 +25026,7 @@ class Indicators extends React.Component {
25020
25026
  }
25021
25027
  render() {
25022
25028
  return /*#__PURE__*/React.createElement("ul", {
25023
- className: css(styles$k.indicatorContainer)
25029
+ className: css(styles$j.indicatorContainer)
25024
25030
  }, this.props.gradedGroups.map(({
25025
25031
  title
25026
25032
  }, i) => /*#__PURE__*/React.createElement("li", {
@@ -25029,7 +25035,7 @@ class Indicators extends React.Component {
25029
25035
  title
25030
25036
  }),
25031
25037
  key: title,
25032
- className: css(styles$k.indicator, i === this.props.currentGroup && styles$k.selectedIndicator),
25038
+ className: css(styles$j.indicator, i === this.props.currentGroup && styles$j.selectedIndicator),
25033
25039
  tabIndex: 0,
25034
25040
  onClick: () => this.props.onChangeCurrentGroup(i),
25035
25041
  onKeyDown: e => this.handleKeyDown(e, i)
@@ -25093,7 +25099,7 @@ class GradedGroupSet extends React.Component {
25093
25099
  } = getDependencies();
25094
25100
  if (JIPT.useJIPT && this.props.gradedGroups.length > 1) {
25095
25101
  return /*#__PURE__*/React.createElement("div", {
25096
- className: css(styles$k.container)
25102
+ className: css(styles$j.container)
25097
25103
  }, this.props.gradedGroups.map((gradedGroup, i) => {
25098
25104
  return (
25099
25105
  /*#__PURE__*/
@@ -25116,13 +25122,13 @@ class GradedGroupSet extends React.Component {
25116
25122
  const numGroups = this.props.gradedGroups.length;
25117
25123
  const handleNextQuestion = this.state.currentGroup < numGroups - 1 ? this.handleNextQuestion : null;
25118
25124
  return /*#__PURE__*/React.createElement("div", {
25119
- className: css(styles$k.container)
25125
+ className: css(styles$j.container)
25120
25126
  }, /*#__PURE__*/React.createElement("div", {
25121
- className: css(styles$k.top)
25127
+ className: css(styles$j.top)
25122
25128
  }, /*#__PURE__*/React.createElement("div", {
25123
- className: css(styles$k.title)
25129
+ className: css(styles$j.title)
25124
25130
  }, currentGroup.title), /*#__PURE__*/React.createElement("div", {
25125
- className: css(styles$k.spacer)
25131
+ className: css(styles$j.spacer)
25126
25132
  }), /*#__PURE__*/React.createElement(Indicators, {
25127
25133
  currentGroup: this.state.currentGroup,
25128
25134
  gradedGroups: this.props.gradedGroups,
@@ -25164,7 +25170,7 @@ var GradedGroupSet$1 = {
25164
25170
  tracking: "all",
25165
25171
  isLintable: true
25166
25172
  };
25167
- const styles$k = StyleSheet.create({
25173
+ const styles$j = StyleSheet.create({
25168
25174
  top: {
25169
25175
  display: "flex",
25170
25176
  flexDirection: "row"
@@ -25246,7 +25252,7 @@ class ButtonGroup extends React.Component {
25246
25252
  id: "" + i,
25247
25253
  ref: "button" + i,
25248
25254
  key: "" + i,
25249
- className: css(styles$j.buttonStyle, button.value === value && styles$j.selectedStyle),
25255
+ className: css(styles$i.buttonStyle, button.value === value && styles$i.selectedStyle),
25250
25256
  onClick: () => this.toggleSelect(button.value)
25251
25257
  }, button.content || "" + button.value);
25252
25258
  });
@@ -25263,7 +25269,7 @@ ButtonGroup.defaultProps = {
25263
25269
  value: null,
25264
25270
  allowEmpty: true
25265
25271
  };
25266
- const styles$j = StyleSheet.create({
25272
+ const styles$i = StyleSheet.create({
25267
25273
  buttonStyle: {
25268
25274
  backgroundColor: "white",
25269
25275
  border: "1px solid #ccc",
@@ -26698,10 +26704,9 @@ class ImageWidget extends React.Component {
26698
26704
  // This minWidth takes precedence over minWidth applied via
26699
26705
  // Aphrodite.
26700
26706
  const minWidth = isImageFullWidth ? null : "0 !important";
26701
- titleAndCaption = /*#__PURE__*/React.createElement("div", {
26707
+ titleAndCaption = /*#__PURE__*/React.createElement("figcaption", {
26702
26708
  className: className
26703
26709
  }, /*#__PURE__*/React.createElement("div", {
26704
- className: css(styles$i.caption),
26705
26710
  style: {
26706
26711
  // @ts-expect-error - TS2322 - Type 'string | null' is not assignable to type 'MinWidth<string | number> | undefined'.
26707
26712
  minWidth: minWidth
@@ -26712,7 +26717,7 @@ class ImageWidget extends React.Component {
26712
26717
  linterContext: this.props.linterContext
26713
26718
  })));
26714
26719
  }
26715
- return /*#__PURE__*/React.createElement("div", {
26720
+ return /*#__PURE__*/React.createElement("figure", {
26716
26721
  className: "perseus-image-widget"
26717
26722
  }, image, alt, titleAndCaption);
26718
26723
  }
@@ -26728,7 +26733,7 @@ class ImageWidget extends React.Component {
26728
26733
  }));
26729
26734
  }
26730
26735
  if (this.props.caption) {
26731
- caption = /*#__PURE__*/React.createElement("div", {
26736
+ caption = /*#__PURE__*/React.createElement("figcaption", {
26732
26737
  className: "perseus-image-caption"
26733
26738
  }, /*#__PURE__*/React.createElement(Renderer, {
26734
26739
  content: this.props.caption,
@@ -26736,7 +26741,7 @@ class ImageWidget extends React.Component {
26736
26741
  linterContext: this.props.linterContext
26737
26742
  }));
26738
26743
  }
26739
- return /*#__PURE__*/React.createElement("div", {
26744
+ return /*#__PURE__*/React.createElement("figure", {
26740
26745
  className: "perseus-image-widget"
26741
26746
  }, title, image, alt, caption);
26742
26747
  }
@@ -26760,22 +26765,6 @@ ImageWidget.defaultProps = {
26760
26765
  caption: "",
26761
26766
  linterContext: linterContextDefault
26762
26767
  };
26763
- const styles$i = StyleSheet.create({
26764
- caption: {
26765
- display: "inline-block",
26766
- marginTop: baseUnitPx,
26767
- maxWidth: 640,
26768
- [mediaQueries.lgOrSmaller]: {
26769
- // TODO(david): This maxWidth is not being used because
26770
- // it's overriden by the 512px max-width we have on
26771
- // paragraphs.
26772
- maxWidth: 540
26773
- },
26774
- [mediaQueries.smOrSmaller]: {
26775
- maxWidth: 450
26776
- }
26777
- }
26778
- });
26779
26768
  var Image$1 = {
26780
26769
  name: "image",
26781
26770
  // This widget's accessibility depends on its contents: if the image has