@khanacademy/perseus 4.0.2 → 6.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 (249) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/dist/components/fixed-to-responsive.d.ts +27 -1
  3. package/dist/components/fixed-to-responsive.js.flow +27 -1
  4. package/dist/components/graph.d.ts +42 -26
  5. package/dist/components/graph.js.flow +42 -28
  6. package/dist/components/graphie.d.ts +34 -22
  7. package/dist/components/graphie.js.flow +37 -24
  8. package/dist/components/highlighting/highlightable-content.d.ts +4 -4
  9. package/dist/components/highlighting/highlightable-content.js.flow +4 -7
  10. package/dist/components/highlighting/ui/highlight-renderer.d.ts +6 -6
  11. package/dist/components/highlighting/ui/highlight-renderer.js.flow +6 -8
  12. package/dist/components/highlighting/ui/highlight-set-renderer.d.ts +5 -5
  13. package/dist/components/highlighting/ui/highlight-set-renderer.js.flow +5 -8
  14. package/dist/components/highlighting/ui/highlight-tooltip.d.ts +2 -2
  15. package/dist/components/highlighting/ui/highlight-tooltip.js.flow +2 -4
  16. package/dist/components/highlighting/ui/highlighting-ui.d.ts +2 -2
  17. package/dist/components/highlighting/ui/highlighting-ui.js.flow +2 -2
  18. package/dist/components/highlighting/ui/selection-tracker.d.ts +5 -5
  19. package/dist/components/highlighting/ui/selection-tracker.js.flow +5 -7
  20. package/dist/components/highlighting/word-indexer.d.ts +2 -2
  21. package/dist/components/highlighting/word-indexer.js.flow +2 -2
  22. package/dist/components/hud.d.ts +8 -14
  23. package/dist/components/hud.js.flow +7 -14
  24. package/dist/components/inline-icon.d.ts +27 -3
  25. package/dist/components/inline-icon.js.flow +26 -3
  26. package/dist/components/lint.d.ts +41 -13
  27. package/dist/components/lint.js.flow +42 -13
  28. package/dist/components/math-output.d.ts +15 -11
  29. package/dist/components/math-output.js.flow +15 -11
  30. package/dist/components/simple-keypad-input.d.ts +1 -1
  31. package/dist/components/simple-keypad-input.js.flow +1 -1
  32. package/dist/components/sortable.d.ts +17 -9
  33. package/dist/components/sortable.js.flow +22 -9
  34. package/dist/components/svg-image.d.ts +5 -3
  35. package/dist/components/svg-image.js.flow +5 -3
  36. package/dist/components/tex-buttons.d.ts +2 -2
  37. package/dist/components/tex-buttons.js.flow +2 -2
  38. package/dist/components/tooltip.d.ts +45 -4
  39. package/dist/components/tooltip.js.flow +44 -31
  40. package/dist/error-boundary.d.ts +4 -4
  41. package/dist/error-boundary.js.flow +4 -6
  42. package/dist/es/index.css +0 -3
  43. package/dist/es/index.js +484 -658
  44. package/dist/es/index.js.map +1 -1
  45. package/dist/index.css +0 -3
  46. package/dist/index.js +488 -655
  47. package/dist/index.js.map +1 -1
  48. package/dist/perseus-types.d.ts +11 -10
  49. package/dist/perseus-types.js.flow +11 -10
  50. package/dist/renderer.d.ts +2 -2
  51. package/dist/renderer.js.flow +1 -3
  52. package/dist/styles/shared.d.ts +0 -1
  53. package/dist/styles/shared.js.flow +0 -1
  54. package/dist/types.d.ts +0 -10
  55. package/dist/types.js.flow +0 -13
  56. package/dist/util/a11y.d.ts +0 -1
  57. package/dist/util/a11y.js.flow +0 -1
  58. package/dist/util/interactive.d.ts +2 -0
  59. package/dist/util/interactive.js.flow +2 -0
  60. package/dist/util.d.ts +3 -3
  61. package/dist/util.js.flow +4 -3
  62. package/dist/widgets/__stories__/test-keypad-context-wrapper.d.ts +2 -2
  63. package/dist/widgets/__stories__/test-keypad-context-wrapper.js.flow +2 -4
  64. package/dist/widgets/expression.d.ts +2 -2
  65. package/dist/widgets/expression.js.flow +2 -2
  66. package/dist/widgets/grapher.d.ts +1 -1
  67. package/dist/widgets/grapher.js.flow +12 -3
  68. package/dist/widgets/interaction/element-container.d.ts +5 -4
  69. package/dist/widgets/interaction/element-container.js.flow +6 -11
  70. package/dist/widgets/label-image/marker.d.ts +4 -4
  71. package/dist/widgets/label-image/marker.js.flow +4 -6
  72. package/dist/widgets/matcher.d.ts +7 -3
  73. package/dist/widgets/matcher.js.flow +7 -3
  74. package/dist/widgets/number-line.d.ts +1 -1
  75. package/dist/widgets/number-line.js.flow +1 -1
  76. package/dist/widgets/numeric-input.d.ts +0 -2
  77. package/dist/widgets/numeric-input.js.flow +0 -4
  78. package/dist/widgets/radio/base-radio.d.ts +7 -1
  79. package/dist/widgets/radio/base-radio.js.flow +7 -1
  80. package/dist/widgets/radio/choice-icon/choice-icon.d.ts +1 -1
  81. package/dist/widgets/radio/choice-icon/choice-icon.js.flow +1 -1
  82. package/dist/widgets/radio/choice-icon/cross-out-line.d.ts +2 -2
  83. package/dist/widgets/radio/choice-icon/cross-out-line.js.flow +2 -2
  84. package/dist/widgets/radio/focus-ring.d.ts +8 -1
  85. package/dist/widgets/radio/focus-ring.js.flow +8 -1
  86. package/dist/widgets/radio/option-status.d.ts +2 -2
  87. package/dist/widgets/radio/option-status.js.flow +2 -2
  88. package/dist/widgets/video-transcript-link.d.ts +1 -1
  89. package/dist/widgets/video-transcript-link.js.flow +1 -1
  90. package/package.json +4 -4
  91. package/src/__stories__/item-renderer.stories.tsx +2 -6
  92. package/src/__stories__/server-item-renderer.stories.tsx +2 -6
  93. package/src/__tests__/__snapshots__/item-renderer.test.tsx.snap +151 -159
  94. package/src/__tests__/__snapshots__/renderer.test.tsx.snap +358 -394
  95. package/src/__tests__/__snapshots__/server-item-renderer.test.tsx.snap +169 -189
  96. package/src/components/__stories__/button-group.stories.tsx +2 -6
  97. package/src/components/__stories__/fixed-to-responsive.stories.tsx +14 -16
  98. package/src/components/__stories__/graph.stories.tsx +3 -5
  99. package/src/components/__stories__/graphie.stories.tsx +3 -5
  100. package/src/components/__stories__/hud.stories.tsx +2 -6
  101. package/src/components/__stories__/icon.stories.tsx +1 -1
  102. package/src/components/__stories__/image-loader.stories.tsx +4 -4
  103. package/src/components/__stories__/info-tip.stories.tsx +2 -6
  104. package/src/components/__stories__/inline-icon.stories.tsx +4 -8
  105. package/src/components/__stories__/input-with-examples.stories.tsx +6 -10
  106. package/src/components/__stories__/lint.stories.tsx +62 -27
  107. package/src/components/__stories__/math-input.stories.tsx +4 -8
  108. package/src/components/__stories__/math-output.stories.tsx +3 -5
  109. package/src/components/__stories__/multi-button-group.stories.tsx +2 -6
  110. package/src/components/__stories__/number-input.stories.tsx +6 -8
  111. package/src/components/__stories__/prop-check-box.stories.tsx +9 -9
  112. package/src/components/__stories__/range-input.stories.tsx +4 -6
  113. package/src/components/__stories__/simple-keypad-input.stories.tsx +2 -4
  114. package/src/components/__stories__/sortable.stories.tsx +20 -20
  115. package/src/components/__stories__/stub-tag-editor.stories.tsx +5 -9
  116. package/src/components/__stories__/svg-image.stories.tsx +10 -18
  117. package/src/components/__stories__/tex.stories.tsx +1 -3
  118. package/src/components/__stories__/text-buttons.stories.tsx +10 -22
  119. package/src/components/__stories__/text-input.stories.tsx +4 -10
  120. package/src/components/__stories__/text-list-editor.stories.tsx +1 -3
  121. package/src/components/__stories__/tooltip.stories.tsx +52 -0
  122. package/src/components/__stories__/zoomable-tex.stories.tsx +6 -4
  123. package/src/components/__stories__/zoomable.stories.tsx +1 -3
  124. package/src/components/__tests__/__snapshots__/sortable.test.tsx.snap +114 -30
  125. package/src/components/__tests__/__snapshots__/sorter.test.tsx.snap +172 -204
  126. package/src/components/__tests__/sortable.test.tsx +54 -16
  127. package/src/components/__tests__/sorter.test.tsx +12 -9
  128. package/src/components/fixed-to-responsive.tsx +43 -38
  129. package/src/components/graph.tsx +95 -81
  130. package/src/components/graphie.tsx +62 -32
  131. package/src/components/highlighting/highlightable-content.tsx +4 -7
  132. package/src/components/highlighting/ui/highlight-renderer.tsx +6 -9
  133. package/src/components/highlighting/ui/highlight-set-renderer.tsx +5 -8
  134. package/src/components/highlighting/ui/highlight-tooltip.tsx +2 -2
  135. package/src/components/highlighting/ui/highlighting-ui.tsx +2 -2
  136. package/src/components/highlighting/ui/selection-tracker.tsx +5 -8
  137. package/src/components/highlighting/word-indexer.tsx +2 -2
  138. package/src/components/hud.tsx +104 -115
  139. package/src/components/inline-icon.tsx +17 -34
  140. package/src/components/input-with-examples.tsx +4 -4
  141. package/src/components/lint.tsx +47 -41
  142. package/src/components/math-output.tsx +17 -11
  143. package/src/components/simple-keypad-input.tsx +4 -4
  144. package/src/components/sortable.tsx +134 -94
  145. package/src/components/svg-image.tsx +10 -11
  146. package/src/components/tex-buttons.tsx +2 -2
  147. package/src/components/tooltip.tsx +189 -171
  148. package/src/components/visibility-observer/__stories__/visibility-observer.stories.tsx +1 -3
  149. package/src/error-boundary.tsx +4 -7
  150. package/src/interactive2/types.ts +2 -2
  151. package/src/multi-items/__stories__/multi-renderer.stories.tsx +1 -1
  152. package/src/multi-items/__tests__/__snapshots__/multi-renderer.test.tsx.snap +708 -764
  153. package/src/multi-items/__tests__/multi-renderer.test.tsx +2 -3
  154. package/src/perseus-types.ts +13 -12
  155. package/src/renderer.tsx +11 -22
  156. package/src/types.ts +0 -18
  157. package/src/util/graphie.ts +3 -3
  158. package/src/util/interactive.ts +18 -5
  159. package/src/util/tex.ts +13 -77
  160. package/src/util.ts +3 -4
  161. package/src/widgets/__stories__/categorizer.stories.tsx +1 -1
  162. package/src/widgets/__stories__/cs-program.stories.tsx +1 -1
  163. package/src/widgets/__stories__/definition.stories.tsx +3 -7
  164. package/src/widgets/__stories__/dropdown.stories.tsx +1 -1
  165. package/src/widgets/__stories__/explanation.stories.tsx +2 -2
  166. package/src/widgets/__stories__/expression.stories.tsx +5 -11
  167. package/src/widgets/__stories__/graded-group-set.stories.tsx +1 -1
  168. package/src/widgets/__stories__/graded-group.stories.tsx +1 -1
  169. package/src/widgets/__stories__/grapher.stories.tsx +7 -21
  170. package/src/widgets/__stories__/group.stories.tsx +1 -1
  171. package/src/widgets/__stories__/iframe.stories.tsx +1 -1
  172. package/src/widgets/__stories__/image.stories.tsx +1 -1
  173. package/src/widgets/__stories__/input-number.stories.tsx +3 -12
  174. package/src/widgets/__stories__/interaction.stories.tsx +1 -1
  175. package/src/widgets/__stories__/interactive-graph.stories.tsx +9 -9
  176. package/src/widgets/__stories__/matcher.stories.tsx +1 -1
  177. package/src/widgets/__stories__/matrix.stories.tsx +1 -1
  178. package/src/widgets/__stories__/number-line.stories.tsx +1 -1
  179. package/src/widgets/__stories__/numeric-input.stories.tsx +3 -5
  180. package/src/widgets/__stories__/orderer.stories.tsx +1 -1
  181. package/src/widgets/__stories__/passage-ref.stories.tsx +2 -2
  182. package/src/widgets/__stories__/passage.stories.tsx +3 -9
  183. package/src/widgets/__stories__/radio.stories.tsx +3 -5
  184. package/src/widgets/__stories__/sorter.stories.tsx +1 -1
  185. package/src/widgets/__stories__/test-keypad-context-wrapper.tsx +2 -4
  186. package/src/widgets/__stories__/transformer.stories.tsx +1 -1
  187. package/src/widgets/__stories__/unit.stories.tsx +1 -3
  188. package/src/widgets/__stories__/video-transcript-link.stories.tsx +2 -6
  189. package/src/widgets/__stories__/video.stories.tsx +1 -1
  190. package/src/widgets/__testdata__/group.testdata.ts +0 -2
  191. package/src/widgets/__tests__/__snapshots__/categorizer.test.ts.snap +717 -773
  192. package/src/widgets/__tests__/__snapshots__/cs-program.test.ts.snap +28 -36
  193. package/src/widgets/__tests__/__snapshots__/definition.test.ts.snap +52 -60
  194. package/src/widgets/__tests__/__snapshots__/dropdown.test.ts.snap +100 -108
  195. package/src/widgets/__tests__/__snapshots__/explanation.test.ts.snap +212 -260
  196. package/src/widgets/__tests__/__snapshots__/graded-group-set-jipt.test.ts.snap +613 -641
  197. package/src/widgets/__tests__/__snapshots__/graded-group-set.test.ts.snap +249 -261
  198. package/src/widgets/__tests__/__snapshots__/graded-group.test.ts.snap +671 -735
  199. package/src/widgets/__tests__/__snapshots__/grapher.test.ts.snap +2676 -2684
  200. package/src/widgets/__tests__/__snapshots__/group.test.tsx.snap +938 -1002
  201. package/src/widgets/__tests__/__snapshots__/iframe.test.ts.snap +28 -36
  202. package/src/widgets/__tests__/__snapshots__/image.test.ts.snap +227 -255
  203. package/src/widgets/__tests__/__snapshots__/input-number.test.ts.snap +353 -357
  204. package/src/widgets/__tests__/__snapshots__/interaction.test.ts.snap +255 -259
  205. package/src/widgets/__tests__/__snapshots__/interactive-graph.test.ts.snap +2401 -2433
  206. package/src/widgets/__tests__/__snapshots__/matcher.test.tsx.snap +600 -756
  207. package/src/widgets/__tests__/__snapshots__/matrix.test.ts.snap +420 -428
  208. package/src/widgets/__tests__/__snapshots__/number-line.test.ts.snap +762 -770
  209. package/src/widgets/__tests__/__snapshots__/numeric-input.test.ts.snap +373 -393
  210. package/src/widgets/__tests__/__snapshots__/orderer.test.ts.snap +116 -148
  211. package/src/widgets/__tests__/__snapshots__/passage-ref.test.ts.snap +289 -301
  212. package/src/widgets/__tests__/__snapshots__/passage.test.tsx.snap +1679 -1711
  213. package/src/widgets/__tests__/__snapshots__/radio.test.ts.snap +2692 -2960
  214. package/src/widgets/__tests__/__snapshots__/video.test.ts.snap +90 -98
  215. package/src/widgets/__tests__/group.test.tsx +0 -2
  216. package/src/widgets/__tests__/matcher.test.tsx +33 -9
  217. package/src/widgets/__tests__/radio/focus-ring.test.tsx +0 -1
  218. package/src/widgets/expression.tsx +12 -9
  219. package/src/widgets/grapher.tsx +3 -3
  220. package/src/widgets/image.tsx +2 -2
  221. package/src/widgets/interaction/element-container.tsx +7 -8
  222. package/src/widgets/interactive-graph.tsx +5 -5
  223. package/src/widgets/label-image/__stories__/answer-choices.stories.tsx +2 -4
  224. package/src/widgets/label-image/__stories__/marker.stories.tsx +9 -19
  225. package/src/widgets/label-image/marker.tsx +4 -4
  226. package/src/widgets/matcher.tsx +43 -24
  227. package/src/widgets/number-line.tsx +1 -1
  228. package/src/widgets/numeric-input.tsx +0 -3
  229. package/src/widgets/passage/passage-markdown.tsx +2 -2
  230. package/src/widgets/radio/__stories__/base-radio.stories.tsx +11 -19
  231. package/src/widgets/radio/__stories__/choice-icon.stories.tsx +9 -11
  232. package/src/widgets/radio/__stories__/choice-none-above.stories.tsx +1 -1
  233. package/src/widgets/radio/__stories__/choice.stories.tsx +4 -4
  234. package/src/widgets/radio/__stories__/focus-ring.stories.tsx +1 -1
  235. package/src/widgets/radio/__stories__/option-status.stories.tsx +2 -4
  236. package/src/widgets/radio/base-radio.tsx +1 -1
  237. package/src/widgets/radio/choice-icon/choice-icon.tsx +5 -5
  238. package/src/widgets/radio/choice-icon/cross-out-line.tsx +1 -3
  239. package/src/widgets/radio/choice-none-above.tsx +2 -2
  240. package/src/widgets/radio/choice.tsx +1 -3
  241. package/src/widgets/radio/focus-ring.tsx +1 -1
  242. package/src/widgets/radio/option-status.tsx +2 -4
  243. package/src/widgets/radio/widget.tsx +0 -1
  244. package/src/widgets/reaction-diagram.tsx +2 -2
  245. package/src/widgets/simulator.tsx +4 -6
  246. package/src/widgets/video-transcript-link.tsx +1 -1
  247. package/{tsconfig.json → tsconfig-build.json} +6 -6
  248. package/tsconfig-build.tsbuildinfo +1 -0
  249. package/tsconfig.tsbuildinfo +0 -1
@@ -9,7 +9,7 @@ import PropTypes from "prop-types";
9
9
  import * as React from "react";
10
10
  import _ from "underscore";
11
11
 
12
- import Sortable from "../components/sortable";
12
+ import Sortable, {Layout} from "../components/sortable";
13
13
  import {getDependencies} from "../dependencies";
14
14
  import {ApiOptions} from "../perseus-api";
15
15
  import Renderer from "../renderer";
@@ -21,6 +21,12 @@ import type {WidgetExports} from "../types";
21
21
  const {shuffle, seededRNG} = Util;
22
22
  const HACKY_CSS_CLASSNAME = "perseus-widget-matcher";
23
23
 
24
+ type State = {
25
+ leftHeight: number;
26
+ rightHeight: number;
27
+ texRendererLoaded: boolean;
28
+ };
29
+
24
30
  class Matcher extends React.Component<any, any> {
25
31
  static propTypes = {
26
32
  apiOptions: ApiOptions.propTypes,
@@ -46,27 +52,40 @@ class Matcher extends React.Component<any, any> {
46
52
  linterContext: linterContextDefault,
47
53
  };
48
54
 
49
- state: any = {
55
+ state: State = {
50
56
  leftHeight: 0,
51
57
  rightHeight: 0,
52
- katex: null,
58
+ texRendererLoaded: false,
53
59
  };
54
60
 
55
- componentDidMount() {
56
- getDependencies()
57
- .getKaTeX()
58
- .then((katex) => this.setState({katex}));
59
- }
60
-
61
- render(): React.ReactNode {
62
- // We don't render the Matcher until KaTeX has fully loaded, in case
63
- // the sortables are rendering KaTeX content. This is un-optimal as
64
- // we end up loading KaTeX even when we may not need it, however it
65
- // helps to ensure that the dimensions of the sortables (and thus the
66
- // Matcher) will be correct when they render, if their contents are
67
- // KaTeX-derived.
68
- if (!this.state.katex) {
69
- return <CircularSpinner />;
61
+ render(): React.ReactElement {
62
+ // To minimize layout shift, we display a spinner until our math
63
+ // renderer is ready to render the math inside the matcher. To
64
+ // do this, we:
65
+ // - render a dummy TeX component to force the math renderer to load
66
+ // - display a spinner until the TeX component calls its onRender
67
+ // callback, signifying that the math is rendered (from which we can
68
+ // infer that the math renderer has loaded)
69
+ //
70
+ // If we didn't do this, the user might see a matcher with empty
71
+ // columns on first render, and then the math would pop in a few
72
+ // moments later once the rendering library loaded.
73
+ if (!this.state.texRendererLoaded) {
74
+ const {TeX} = getDependencies();
75
+ return (
76
+ <>
77
+ <CircularSpinner />
78
+ <div style={{display: "none"}}>
79
+ <TeX
80
+ onRender={() => {
81
+ this.setState({texRendererLoaded: true});
82
+ }}
83
+ >
84
+ 1
85
+ </TeX>
86
+ </div>
87
+ </>
88
+ );
70
89
  }
71
90
 
72
91
  // Use the same random() function to shuffle both columns sequentially
@@ -123,7 +142,7 @@ class Matcher extends React.Component<any, any> {
123
142
  <td className={css(styles.column)}>
124
143
  <Sortable
125
144
  options={left}
126
- layout="vertical"
145
+ layout={Layout.VERTICAL}
127
146
  padding={this.props.padding}
128
147
  disabled={!this.props.orderMatters}
129
148
  constraints={constraints}
@@ -139,7 +158,7 @@ class Matcher extends React.Component<any, any> {
139
158
  <Sortable
140
159
  // @ts-expect-error [FEI-5003] - TS2322 - Type 'readonly unknown[]' is not assignable to type 'readonly string[]'.
141
160
  options={right}
142
- layout="vertical"
161
+ layout={Layout.VERTICAL}
143
162
  padding={this.props.padding}
144
163
  constraints={constraints}
145
164
  onMeasure={this.onMeasureRight}
@@ -172,10 +191,10 @@ class Matcher extends React.Component<any, any> {
172
191
  };
173
192
 
174
193
  getUserInput: () => any = () => {
175
- // If KaTeX hasn't loaded then we won't be able to get the contents
176
- // of the sortables on the left and right, so we just return empty
177
- // arrays until we render for the first time.
178
- if (!this.state.katex) {
194
+ // If the math renderer hasn't loaded then we won't be able to get the
195
+ // contents of the sortables on the left and right, so we just return
196
+ // empty arrays until we render for the first time.
197
+ if (!this.state.texRendererLoaded) {
179
198
  return {
180
199
  left: [],
181
200
  right: [],
@@ -192,7 +192,7 @@ const TickMarks: any = Graphie.createSimpleClass((graphie, props) => {
192
192
  });
193
193
 
194
194
  type Props = ChangeableProps & {
195
- range: ReadonlyArray<number>;
195
+ range: [number, number];
196
196
  labelRange: ReadonlyArray<number | null>;
197
197
  labelStyle: string;
198
198
  labelTicks: boolean;
@@ -76,7 +76,6 @@ type Props = ExternalProps & {
76
76
  answerForms: NonNullable<ExternalProps["answerForms"]>;
77
77
  labelText: NonNullable<ExternalProps["labelText"]>;
78
78
  linterContext: NonNullable<ExternalProps["linterContext"]>;
79
- multipleNumberInput: NonNullable<ExternalProps["multipleNumberInput"]>;
80
79
  currentValue: string;
81
80
  };
82
81
 
@@ -89,7 +88,6 @@ type DefaultProps = {
89
88
  answerForms: Props["answerForms"];
90
89
  labelText: Props["labelText"];
91
90
  linterContext: Props["linterContext"];
92
- multipleNumberInput: Props["multipleNumberInput"];
93
91
  };
94
92
 
95
93
  type State = {
@@ -110,7 +108,6 @@ export class NumericInput extends React.Component<Props, State> {
110
108
  answerForms: [],
111
109
  labelText: "",
112
110
  linterContext: linterContextDefault,
113
- multipleNumberInput: false,
114
111
  };
115
112
 
116
113
  static getUserInputFromProps(props: Props): UserInput {
@@ -48,7 +48,7 @@ type HighlightNode = {
48
48
  content: string;
49
49
  };
50
50
 
51
- type RefStartProps = {
51
+ type Props = {
52
52
  refContent: React.ReactNode;
53
53
  };
54
54
 
@@ -63,7 +63,7 @@ function getInitialParseState(): ParseState {
63
63
  };
64
64
  }
65
65
 
66
- class RefStart extends React.Component<RefStartProps> {
66
+ class RefStart extends React.Component<Props> {
67
67
  render(): React.ReactNode {
68
68
  return <span style={REF_STYLE}>{i18n.doNotTranslate("_")}</span>;
69
69
  }
@@ -60,27 +60,27 @@ const defaultProps = {
60
60
  isLastUsedWidget: false,
61
61
  } as const;
62
62
 
63
- export const Interactive: React.FC<StoryArgs> = (args): React.ReactElement => {
63
+ export const Interactive = (args: StoryArgs): React.ReactElement => {
64
64
  const overwrittenProps = {...defaultProps, ...args} as const;
65
65
  return <BaseRadio {...overwrittenProps} />;
66
66
  };
67
67
 
68
- export const SingleSelectWithNothingSelected: React.FC<StoryArgs> = (
69
- args,
68
+ export const SingleSelectWithNothingSelected = (
69
+ args: StoryArgs,
70
70
  ): React.ReactElement => {
71
71
  const overwrittenProps = {...defaultProps, multipleSelect: false} as const;
72
72
  return <BaseRadio {...overwrittenProps} />;
73
73
  };
74
74
 
75
- export const MultipleSelectWithNothingSelected: React.FC<StoryArgs> = (
76
- args,
75
+ export const MultipleSelectWithNothingSelected = (
76
+ args: StoryArgs,
77
77
  ): React.ReactElement => {
78
78
  const overwrittenProps = {...defaultProps, multipleSelect: true} as const;
79
79
  return <BaseRadio {...overwrittenProps} />;
80
80
  };
81
81
 
82
- export const MultipleSelectWithCountChoicesLabel: React.FC<StoryArgs> = (
83
- args,
82
+ export const MultipleSelectWithCountChoicesLabel = (
83
+ args: StoryArgs,
84
84
  ): React.ReactElement => {
85
85
  const overwrittenProps = {
86
86
  ...defaultProps,
@@ -91,9 +91,7 @@ export const MultipleSelectWithCountChoicesLabel: React.FC<StoryArgs> = (
91
91
  return <BaseRadio {...overwrittenProps} />;
92
92
  };
93
93
 
94
- export const SingleSelected: React.FC<StoryArgs> = (
95
- args,
96
- ): React.ReactElement => {
94
+ export const SingleSelected = (args: StoryArgs): React.ReactElement => {
97
95
  const choices = Array(4)
98
96
  .fill(null)
99
97
  .map((_, i) => generateChoice({content: `Choice ${i + 1}`}));
@@ -107,9 +105,7 @@ export const SingleSelected: React.FC<StoryArgs> = (
107
105
  return <BaseRadio {...overwrittenProps} />;
108
106
  };
109
107
 
110
- export const MultipleSelected: React.FC<StoryArgs> = (
111
- args,
112
- ): React.ReactElement => {
108
+ export const MultipleSelected = (args: StoryArgs): React.ReactElement => {
113
109
  const choices = Array(4)
114
110
  .fill(null)
115
111
  .map((_, i) => generateChoice({content: `Choice ${i + 1}`}));
@@ -124,9 +120,7 @@ export const MultipleSelected: React.FC<StoryArgs> = (
124
120
  return <BaseRadio {...overwrittenProps} />;
125
121
  };
126
122
 
127
- export const SingleKitchenSink: React.FC<StoryArgs> = (
128
- args,
129
- ): React.ReactElement => {
123
+ export const SingleKitchenSink = (args: StoryArgs): React.ReactElement => {
130
124
  const choices = Array(4)
131
125
  .fill(null)
132
126
  .map((_, i) => {
@@ -162,9 +156,7 @@ export const SingleKitchenSink: React.FC<StoryArgs> = (
162
156
  return <BaseRadio {...overwrittenProps} />;
163
157
  };
164
158
 
165
- export const MultipleKitchenSink: React.FC<StoryArgs> = (
166
- args,
167
- ): React.ReactElement => {
159
+ export const MultipleKitchenSink = (args: StoryArgs): React.ReactElement => {
168
160
  const choices = Array(4)
169
161
  .fill(null)
170
162
  .map((_, i) => {
@@ -40,13 +40,11 @@ export default {
40
40
  args: defaultProps,
41
41
  };
42
42
 
43
- const Panel: React.FC<{
44
- children: React.ReactNode;
45
- }> = (props): React.ReactElement => {
43
+ const Panel = (props: {children: React.ReactNode}): React.ReactElement => {
46
44
  return <div style={{padding: "10px"}}>{props.children}</div>;
47
45
  };
48
46
 
49
- export const Interactive: React.FC<StoryArgs> = (args): React.ReactElement => {
47
+ export const Interactive = (args: StoryArgs): React.ReactElement => {
50
48
  return (
51
49
  <Panel>
52
50
  <ChoiceIcon {...args} />
@@ -54,7 +52,7 @@ export const Interactive: React.FC<StoryArgs> = (args): React.ReactElement => {
54
52
  );
55
53
  };
56
54
 
57
- export const Default: React.FC<StoryArgs> = (args): React.ReactElement => {
55
+ export const Default = (args: StoryArgs): React.ReactElement => {
58
56
  return (
59
57
  <Panel>
60
58
  <ChoiceIcon {...defaultProps} />
@@ -63,7 +61,7 @@ export const Default: React.FC<StoryArgs> = (args): React.ReactElement => {
63
61
  );
64
62
  };
65
63
 
66
- export const Focused: React.FC<StoryArgs> = (args): React.ReactElement => {
64
+ export const Focused = (args: StoryArgs): React.ReactElement => {
67
65
  return (
68
66
  <Panel>
69
67
  <ChoiceIcon {...defaultProps} focused={true} />
@@ -76,7 +74,7 @@ export const Focused: React.FC<StoryArgs> = (args): React.ReactElement => {
76
74
  );
77
75
  };
78
76
 
79
- export const Checked: React.FC<StoryArgs> = (args): React.ReactElement => {
77
+ export const Checked = (args: StoryArgs): React.ReactElement => {
80
78
  return (
81
79
  <Panel>
82
80
  <ChoiceIcon {...defaultProps} checked={true} />
@@ -89,7 +87,7 @@ export const Checked: React.FC<StoryArgs> = (args): React.ReactElement => {
89
87
  );
90
88
  };
91
89
 
92
- export const CrossedOut: React.FC<StoryArgs> = (args): React.ReactElement => {
90
+ export const CrossedOut = (args: StoryArgs): React.ReactElement => {
93
91
  return (
94
92
  <Panel>
95
93
  <ChoiceIcon {...defaultProps} crossedOut={true} />
@@ -102,7 +100,7 @@ export const CrossedOut: React.FC<StoryArgs> = (args): React.ReactElement => {
102
100
  );
103
101
  };
104
102
 
105
- export const Correct: React.FC<StoryArgs> = (args): React.ReactElement => {
103
+ export const Correct = (args: StoryArgs): React.ReactElement => {
106
104
  return (
107
105
  <Panel>
108
106
  <ChoiceIcon
@@ -124,7 +122,7 @@ export const Correct: React.FC<StoryArgs> = (args): React.ReactElement => {
124
122
  );
125
123
  };
126
124
 
127
- export const Incorrect: React.FC<StoryArgs> = (args): React.ReactElement => {
125
+ export const Incorrect = (args: StoryArgs): React.ReactElement => {
128
126
  return (
129
127
  <Panel>
130
128
  <ChoiceIcon
@@ -146,7 +144,7 @@ export const Incorrect: React.FC<StoryArgs> = (args): React.ReactElement => {
146
144
  );
147
145
  };
148
146
 
149
- export const AllPositions: React.FC<StoryArgs> = (args): React.ReactElement => {
147
+ export const AllPositions = (args: StoryArgs): React.ReactElement => {
150
148
  // @ts-expect-error [FEI-5003] - TS2554 - Expected 1-3 arguments, but got 0.
151
149
  const allLetters = Array(26).fill();
152
150
  return (
@@ -34,7 +34,7 @@ const ChoiceDefaults = {
34
34
  onChange: action("changed"),
35
35
  } as const;
36
36
 
37
- export const Example: React.FC<StoryArgs> = (args): React.ReactElement => {
37
+ export const Example = (args: StoryArgs): React.ReactElement => {
38
38
  const combineProps = {...ChoiceDefaults, ...args} as const;
39
39
  return <ChoiceNoneAbove {...combineProps} />;
40
40
  };
@@ -45,11 +45,11 @@ export default {
45
45
  args: defaultProps,
46
46
  } as Story;
47
47
 
48
- export const Interactive: React.FC<StoryArgs> = (args): React.ReactElement => {
48
+ export const Interactive = (args: StoryArgs): React.ReactElement => {
49
49
  return <Choice {...args} />;
50
50
  };
51
51
 
52
- export const Checked: React.FC<StoryArgs> = (args): React.ReactElement => {
52
+ export const Checked = (args: StoryArgs): React.ReactElement => {
53
53
  const sharedProps = {
54
54
  ...defaultProps,
55
55
  checked: true,
@@ -73,7 +73,7 @@ export const Checked: React.FC<StoryArgs> = (args): React.ReactElement => {
73
73
  );
74
74
  };
75
75
 
76
- export const ReviewMode: React.FC<StoryArgs> = (args): React.ReactElement => {
76
+ export const ReviewMode = (args: StoryArgs): React.ReactElement => {
77
77
  const sharedProps = {
78
78
  ...defaultProps,
79
79
  showCorrectness: true,
@@ -108,7 +108,7 @@ export const ReviewMode: React.FC<StoryArgs> = (args): React.ReactElement => {
108
108
  );
109
109
  };
110
110
 
111
- export const Rationale: React.FC<StoryArgs> = (args): React.ReactElement => {
111
+ export const Rationale = (args: StoryArgs): React.ReactElement => {
112
112
  const sharedProps = {
113
113
  ...defaultProps,
114
114
  checked: true,
@@ -25,7 +25,7 @@ export default {
25
25
  },
26
26
  } as Story;
27
27
 
28
- export const Interactive: React.FC<StoryArgs> = (args): React.ReactElement => {
28
+ export const Interactive = (args: StoryArgs): React.ReactElement => {
29
29
  // faux choice is just for demonstration
30
30
  const fauxChoiceStyles = {
31
31
  height: "20px",
@@ -26,13 +26,11 @@ export default {
26
26
  },
27
27
  } as Story;
28
28
 
29
- export const Interactive: React.FC<StoryArgs> = (args): React.ReactElement => {
29
+ export const Interactive = (args: StoryArgs): React.ReactElement => {
30
30
  return <OptionStatus {...args} />;
31
31
  };
32
32
 
33
- export const AllPossibleOutputs: React.FC<StoryArgs> = (
34
- args,
35
- ): React.ReactElement => {
33
+ export const AllPossibleOutputs = (args: StoryArgs): React.ReactElement => {
36
34
  return (
37
35
  <>
38
36
  <div>
@@ -86,7 +86,7 @@ function getInstructionsText(
86
86
  return i18n._("Choose 1 answer:");
87
87
  }
88
88
 
89
- const BaseRadio: React.FC<Props> = function (props): React.ReactElement {
89
+ const BaseRadio = function (props: Props): React.ReactElement {
90
90
  const {
91
91
  apiOptions,
92
92
  reviewModeRubric,
@@ -27,11 +27,13 @@ type ChoiceIconProps = {
27
27
  previouslyAnswered: boolean;
28
28
  };
29
29
 
30
- function ChoiceInner(props: {
30
+ type ChoiceInnerProps = {
31
31
  pos: number;
32
32
  showCorrectness: boolean;
33
33
  correct: boolean | null | undefined;
34
- }) {
34
+ };
35
+
36
+ function ChoiceInner(props: ChoiceInnerProps) {
35
37
  const {pos, showCorrectness, correct} = props;
36
38
  const letter = getChoiceLetter(pos);
37
39
 
@@ -96,9 +98,7 @@ function getDynamicStyles(
96
98
  return {backgroundColor, borderColor, color, borderRadius};
97
99
  }
98
100
 
99
- const ChoiceIcon: React.FC<ChoiceIconProps> = function (
100
- props,
101
- ): React.ReactElement {
101
+ const ChoiceIcon = function (props: ChoiceIconProps): React.ReactElement {
102
102
  const {
103
103
  checked,
104
104
  crossedOut,
@@ -14,9 +14,7 @@ const CROSS_OUT_LINE_SIZE = CHOICE_ICON_SIZE + CROSS_OUT_LINE_PADDING * 2;
14
14
  * The "cross-out line" that appears over the icon when the choice has been
15
15
  * `crossedOut`.
16
16
  */
17
- const CrossOutLine: React.FC<{
18
- color: string;
19
- }> = function (props): React.ReactElement {
17
+ const CrossOutLine = function (props: {color: string}): React.ReactElement {
20
18
  return (
21
19
  <svg
22
20
  width={CROSS_OUT_LINE_SIZE}
@@ -17,8 +17,8 @@ type WithForwardRef = {
17
17
 
18
18
  type PropsWithForwardRef = Props & WithForwardRef;
19
19
 
20
- const ChoiceNoneAbove: React.FC<PropsWithForwardRef> = function (
21
- props,
20
+ const ChoiceNoneAbove = function (
21
+ props: PropsWithForwardRef,
22
22
  ): React.ReactElement {
23
23
  const {showContent, content, forwardedRef, ...rest} = props;
24
24
 
@@ -78,9 +78,7 @@ function uniqueId() {
78
78
  return `choice-${id++}`;
79
79
  }
80
80
 
81
- const Choice: React.FC<ChoicePropsWithForwardRef> = function (
82
- props,
83
- ): React.ReactElement {
81
+ const Choice = function (props: ChoicePropsWithForwardRef): React.ReactElement {
84
82
  const {
85
83
  disabled = false,
86
84
  checked = false,
@@ -18,7 +18,7 @@ type Props = {
18
18
  multipleSelect: boolean;
19
19
  };
20
20
 
21
- const FocusRing: React.FC<Props> = function (props): React.ReactElement {
21
+ const FocusRing = function (props: Props): React.ReactElement {
22
22
  const {visible, color, children, multipleSelect} = props;
23
23
 
24
24
  const borderColor = visible ? color : "transparent";
@@ -11,7 +11,7 @@ import * as i18n from "@khanacademy/wonder-blocks-i18n";
11
11
  import {StyleSheet, css} from "aphrodite";
12
12
  import * as React from "react";
13
13
 
14
- type OptionStatusProps = {
14
+ type Props = {
15
15
  // Was this option the correct answer?
16
16
  correct: boolean;
17
17
  // Did the user select this option as the answer?
@@ -47,9 +47,7 @@ function renderText(
47
47
  return i18n._("Incorrect");
48
48
  }
49
49
 
50
- const OptionStatus: React.FC<OptionStatusProps> = function (
51
- props,
52
- ): React.ReactElement {
50
+ const OptionStatus = function (props: Props): React.ReactElement {
53
51
  const {checked, correct, crossedOut, previouslyAnswered, reviewMode} =
54
52
  props;
55
53
 
@@ -502,7 +502,6 @@ class Radio extends React.Component<Props> {
502
502
  return (
503
503
  <BaseRadio
504
504
  labelWrap={true}
505
- // @ts-expect-error [FEI-5003] - TS2322 - Type 'boolean | undefined' is not assignable to type 'boolean'.
506
505
  multipleSelect={this.props.multipleSelect}
507
506
  countChoices={this.props.countChoices}
508
507
  numCorrect={this.props.numCorrect}
@@ -7,6 +7,8 @@ import {Molecule} from "./molecule";
7
7
  import type {WidgetExports} from "../types";
8
8
 
9
9
  class Separator extends React.Component<any> {
10
+ arrowLength = 100;
11
+
10
12
  static propTypes = {
11
13
  // TODO(colin): figure out and add shape.
12
14
  data: PropTypes.any,
@@ -21,8 +23,6 @@ class Separator extends React.Component<any> {
21
23
  this.drawArrow();
22
24
  }
23
25
 
24
- arrowLength = 100;
25
-
26
26
  drawArrow = () => {
27
27
  // eslint-disable-next-line react/no-string-refs
28
28
  const canvas = this.refs["arrowCanvas" + this.props.index];
@@ -8,7 +8,6 @@ import _ from "underscore";
8
8
 
9
9
  import Graphie from "../components/graphie";
10
10
  import InfoTip from "../components/info-tip";
11
- import MathOutput from "../components/math-output";
12
11
  import NumberInput from "../components/number-input";
13
12
  import InteractiveUtil from "../interactive2/interactive-util";
14
13
  import * as Changeable from "../mixins/changeable";
@@ -17,6 +16,7 @@ import Util from "../util";
17
16
  import KhanColors from "../util/colors";
18
17
  import KhanMath from "../util/math";
19
18
 
19
+ import type {Range} from "../perseus-types";
20
20
  import type {WidgetExports} from "../types";
21
21
 
22
22
  const {assert} = InteractiveUtil;
@@ -231,9 +231,7 @@ class Histogram extends React.Component<any, any> {
231
231
  range: range,
232
232
  data: data,
233
233
  scale: [
234
- // @ts-expect-error [FEI-5003] - TS2345 - Argument of type 'any[]' is not assignable to parameter of type 'Coordinates'.
235
234
  Util.scaleFromExtent(range[0], this.props.box[0]),
236
- // @ts-expect-error [FEI-5003] - TS2345 - Argument of type 'any[]' is not assignable to parameter of type 'Coordinates'.
237
235
  Util.scaleFromExtent(range[1], this.props.box[1]),
238
236
  ],
239
237
  } as const;
@@ -352,8 +350,8 @@ class Histogram extends React.Component<any, any> {
352
350
  };
353
351
 
354
352
  /* Convenience functions that help calculate props based on other props. */
355
- _range = (props) => {
356
- const defaultRange = [
353
+ _range = (props): [Range, Range] => {
354
+ const defaultRange: [Range, Range] = [
357
355
  [0, 100],
358
356
  [-1, 10],
359
357
  ];
@@ -361,7 +359,7 @@ class Histogram extends React.Component<any, any> {
361
359
  return props.data ? this._getRangeForData(props.data) : defaultRange;
362
360
  };
363
361
 
364
- _getRangeForData = (data: any) => {
362
+ _getRangeForData = (data: any): [Range, Range] => {
365
363
  // Find first/last non-zero entry and add some padding
366
364
  const padding = 10;
367
365
  const firstIndex = _.indexOf(
@@ -31,7 +31,7 @@ type Props = {
31
31
  /**
32
32
  * Video Transcript Link Component.
33
33
  */
34
- const VideoTranscriptLink: React.FC<Props> = (props): React.ReactElement => {
34
+ const VideoTranscriptLink = (props: Props): React.ReactElement => {
35
35
  const {location} = props;
36
36
  const {useVideo} = getDependencies();
37
37
  const [id, kind] = IS_URL.test(location)
@@ -15,11 +15,11 @@
15
15
  }
16
16
  },
17
17
  "references": [
18
- {"path": "../kas"},
19
- {"path": "../kmath"},
20
- {"path": "../math-input"},
21
- {"path": "../perseus-linter"},
22
- {"path": "../pure-markdown"},
23
- {"path": "../simple-markdown"},
18
+ {"path": "../kas/tsconfig-build.json"},
19
+ {"path": "../kmath/tsconfig-build.json"},
20
+ {"path": "../math-input/tsconfig-build.json"},
21
+ {"path": "../perseus-linter/tsconfig-build.json"},
22
+ {"path": "../pure-markdown/tsconfig-build.json"},
23
+ {"path": "../simple-markdown/tsconfig-build.json"},
24
24
  ]
25
25
  }