@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.
- package/CHANGELOG.md +57 -0
- package/dist/components/fixed-to-responsive.d.ts +27 -1
- package/dist/components/fixed-to-responsive.js.flow +27 -1
- package/dist/components/graph.d.ts +42 -26
- package/dist/components/graph.js.flow +42 -28
- package/dist/components/graphie.d.ts +34 -22
- package/dist/components/graphie.js.flow +37 -24
- package/dist/components/highlighting/highlightable-content.d.ts +4 -4
- package/dist/components/highlighting/highlightable-content.js.flow +4 -7
- package/dist/components/highlighting/ui/highlight-renderer.d.ts +6 -6
- package/dist/components/highlighting/ui/highlight-renderer.js.flow +6 -8
- package/dist/components/highlighting/ui/highlight-set-renderer.d.ts +5 -5
- package/dist/components/highlighting/ui/highlight-set-renderer.js.flow +5 -8
- package/dist/components/highlighting/ui/highlight-tooltip.d.ts +2 -2
- package/dist/components/highlighting/ui/highlight-tooltip.js.flow +2 -4
- package/dist/components/highlighting/ui/highlighting-ui.d.ts +2 -2
- package/dist/components/highlighting/ui/highlighting-ui.js.flow +2 -2
- package/dist/components/highlighting/ui/selection-tracker.d.ts +5 -5
- package/dist/components/highlighting/ui/selection-tracker.js.flow +5 -7
- package/dist/components/highlighting/word-indexer.d.ts +2 -2
- package/dist/components/highlighting/word-indexer.js.flow +2 -2
- package/dist/components/hud.d.ts +8 -14
- package/dist/components/hud.js.flow +7 -14
- package/dist/components/inline-icon.d.ts +27 -3
- package/dist/components/inline-icon.js.flow +26 -3
- package/dist/components/lint.d.ts +41 -13
- package/dist/components/lint.js.flow +42 -13
- package/dist/components/math-output.d.ts +15 -11
- package/dist/components/math-output.js.flow +15 -11
- package/dist/components/simple-keypad-input.d.ts +1 -1
- package/dist/components/simple-keypad-input.js.flow +1 -1
- package/dist/components/sortable.d.ts +17 -9
- package/dist/components/sortable.js.flow +22 -9
- package/dist/components/svg-image.d.ts +5 -3
- package/dist/components/svg-image.js.flow +5 -3
- package/dist/components/tex-buttons.d.ts +2 -2
- package/dist/components/tex-buttons.js.flow +2 -2
- package/dist/components/tooltip.d.ts +45 -4
- package/dist/components/tooltip.js.flow +44 -31
- package/dist/error-boundary.d.ts +4 -4
- package/dist/error-boundary.js.flow +4 -6
- package/dist/es/index.css +0 -3
- package/dist/es/index.js +484 -658
- package/dist/es/index.js.map +1 -1
- package/dist/index.css +0 -3
- package/dist/index.js +488 -655
- package/dist/index.js.map +1 -1
- package/dist/perseus-types.d.ts +11 -10
- package/dist/perseus-types.js.flow +11 -10
- package/dist/renderer.d.ts +2 -2
- package/dist/renderer.js.flow +1 -3
- package/dist/styles/shared.d.ts +0 -1
- package/dist/styles/shared.js.flow +0 -1
- package/dist/types.d.ts +0 -10
- package/dist/types.js.flow +0 -13
- package/dist/util/a11y.d.ts +0 -1
- package/dist/util/a11y.js.flow +0 -1
- package/dist/util/interactive.d.ts +2 -0
- package/dist/util/interactive.js.flow +2 -0
- package/dist/util.d.ts +3 -3
- package/dist/util.js.flow +4 -3
- package/dist/widgets/__stories__/test-keypad-context-wrapper.d.ts +2 -2
- package/dist/widgets/__stories__/test-keypad-context-wrapper.js.flow +2 -4
- package/dist/widgets/expression.d.ts +2 -2
- package/dist/widgets/expression.js.flow +2 -2
- package/dist/widgets/grapher.d.ts +1 -1
- package/dist/widgets/grapher.js.flow +12 -3
- package/dist/widgets/interaction/element-container.d.ts +5 -4
- package/dist/widgets/interaction/element-container.js.flow +6 -11
- package/dist/widgets/label-image/marker.d.ts +4 -4
- package/dist/widgets/label-image/marker.js.flow +4 -6
- package/dist/widgets/matcher.d.ts +7 -3
- package/dist/widgets/matcher.js.flow +7 -3
- package/dist/widgets/number-line.d.ts +1 -1
- package/dist/widgets/number-line.js.flow +1 -1
- package/dist/widgets/numeric-input.d.ts +0 -2
- package/dist/widgets/numeric-input.js.flow +0 -4
- package/dist/widgets/radio/base-radio.d.ts +7 -1
- package/dist/widgets/radio/base-radio.js.flow +7 -1
- package/dist/widgets/radio/choice-icon/choice-icon.d.ts +1 -1
- package/dist/widgets/radio/choice-icon/choice-icon.js.flow +1 -1
- package/dist/widgets/radio/choice-icon/cross-out-line.d.ts +2 -2
- package/dist/widgets/radio/choice-icon/cross-out-line.js.flow +2 -2
- package/dist/widgets/radio/focus-ring.d.ts +8 -1
- package/dist/widgets/radio/focus-ring.js.flow +8 -1
- package/dist/widgets/radio/option-status.d.ts +2 -2
- package/dist/widgets/radio/option-status.js.flow +2 -2
- package/dist/widgets/video-transcript-link.d.ts +1 -1
- package/dist/widgets/video-transcript-link.js.flow +1 -1
- package/package.json +4 -4
- package/src/__stories__/item-renderer.stories.tsx +2 -6
- package/src/__stories__/server-item-renderer.stories.tsx +2 -6
- package/src/__tests__/__snapshots__/item-renderer.test.tsx.snap +151 -159
- package/src/__tests__/__snapshots__/renderer.test.tsx.snap +358 -394
- package/src/__tests__/__snapshots__/server-item-renderer.test.tsx.snap +169 -189
- package/src/components/__stories__/button-group.stories.tsx +2 -6
- package/src/components/__stories__/fixed-to-responsive.stories.tsx +14 -16
- package/src/components/__stories__/graph.stories.tsx +3 -5
- package/src/components/__stories__/graphie.stories.tsx +3 -5
- package/src/components/__stories__/hud.stories.tsx +2 -6
- package/src/components/__stories__/icon.stories.tsx +1 -1
- package/src/components/__stories__/image-loader.stories.tsx +4 -4
- package/src/components/__stories__/info-tip.stories.tsx +2 -6
- package/src/components/__stories__/inline-icon.stories.tsx +4 -8
- package/src/components/__stories__/input-with-examples.stories.tsx +6 -10
- package/src/components/__stories__/lint.stories.tsx +62 -27
- package/src/components/__stories__/math-input.stories.tsx +4 -8
- package/src/components/__stories__/math-output.stories.tsx +3 -5
- package/src/components/__stories__/multi-button-group.stories.tsx +2 -6
- package/src/components/__stories__/number-input.stories.tsx +6 -8
- package/src/components/__stories__/prop-check-box.stories.tsx +9 -9
- package/src/components/__stories__/range-input.stories.tsx +4 -6
- package/src/components/__stories__/simple-keypad-input.stories.tsx +2 -4
- package/src/components/__stories__/sortable.stories.tsx +20 -20
- package/src/components/__stories__/stub-tag-editor.stories.tsx +5 -9
- package/src/components/__stories__/svg-image.stories.tsx +10 -18
- package/src/components/__stories__/tex.stories.tsx +1 -3
- package/src/components/__stories__/text-buttons.stories.tsx +10 -22
- package/src/components/__stories__/text-input.stories.tsx +4 -10
- package/src/components/__stories__/text-list-editor.stories.tsx +1 -3
- package/src/components/__stories__/tooltip.stories.tsx +52 -0
- package/src/components/__stories__/zoomable-tex.stories.tsx +6 -4
- package/src/components/__stories__/zoomable.stories.tsx +1 -3
- package/src/components/__tests__/__snapshots__/sortable.test.tsx.snap +114 -30
- package/src/components/__tests__/__snapshots__/sorter.test.tsx.snap +172 -204
- package/src/components/__tests__/sortable.test.tsx +54 -16
- package/src/components/__tests__/sorter.test.tsx +12 -9
- package/src/components/fixed-to-responsive.tsx +43 -38
- package/src/components/graph.tsx +95 -81
- package/src/components/graphie.tsx +62 -32
- package/src/components/highlighting/highlightable-content.tsx +4 -7
- package/src/components/highlighting/ui/highlight-renderer.tsx +6 -9
- package/src/components/highlighting/ui/highlight-set-renderer.tsx +5 -8
- package/src/components/highlighting/ui/highlight-tooltip.tsx +2 -2
- package/src/components/highlighting/ui/highlighting-ui.tsx +2 -2
- package/src/components/highlighting/ui/selection-tracker.tsx +5 -8
- package/src/components/highlighting/word-indexer.tsx +2 -2
- package/src/components/hud.tsx +104 -115
- package/src/components/inline-icon.tsx +17 -34
- package/src/components/input-with-examples.tsx +4 -4
- package/src/components/lint.tsx +47 -41
- package/src/components/math-output.tsx +17 -11
- package/src/components/simple-keypad-input.tsx +4 -4
- package/src/components/sortable.tsx +134 -94
- package/src/components/svg-image.tsx +10 -11
- package/src/components/tex-buttons.tsx +2 -2
- package/src/components/tooltip.tsx +189 -171
- package/src/components/visibility-observer/__stories__/visibility-observer.stories.tsx +1 -3
- package/src/error-boundary.tsx +4 -7
- package/src/interactive2/types.ts +2 -2
- package/src/multi-items/__stories__/multi-renderer.stories.tsx +1 -1
- package/src/multi-items/__tests__/__snapshots__/multi-renderer.test.tsx.snap +708 -764
- package/src/multi-items/__tests__/multi-renderer.test.tsx +2 -3
- package/src/perseus-types.ts +13 -12
- package/src/renderer.tsx +11 -22
- package/src/types.ts +0 -18
- package/src/util/graphie.ts +3 -3
- package/src/util/interactive.ts +18 -5
- package/src/util/tex.ts +13 -77
- package/src/util.ts +3 -4
- package/src/widgets/__stories__/categorizer.stories.tsx +1 -1
- package/src/widgets/__stories__/cs-program.stories.tsx +1 -1
- package/src/widgets/__stories__/definition.stories.tsx +3 -7
- package/src/widgets/__stories__/dropdown.stories.tsx +1 -1
- package/src/widgets/__stories__/explanation.stories.tsx +2 -2
- package/src/widgets/__stories__/expression.stories.tsx +5 -11
- package/src/widgets/__stories__/graded-group-set.stories.tsx +1 -1
- package/src/widgets/__stories__/graded-group.stories.tsx +1 -1
- package/src/widgets/__stories__/grapher.stories.tsx +7 -21
- package/src/widgets/__stories__/group.stories.tsx +1 -1
- package/src/widgets/__stories__/iframe.stories.tsx +1 -1
- package/src/widgets/__stories__/image.stories.tsx +1 -1
- package/src/widgets/__stories__/input-number.stories.tsx +3 -12
- package/src/widgets/__stories__/interaction.stories.tsx +1 -1
- package/src/widgets/__stories__/interactive-graph.stories.tsx +9 -9
- package/src/widgets/__stories__/matcher.stories.tsx +1 -1
- package/src/widgets/__stories__/matrix.stories.tsx +1 -1
- package/src/widgets/__stories__/number-line.stories.tsx +1 -1
- package/src/widgets/__stories__/numeric-input.stories.tsx +3 -5
- package/src/widgets/__stories__/orderer.stories.tsx +1 -1
- package/src/widgets/__stories__/passage-ref.stories.tsx +2 -2
- package/src/widgets/__stories__/passage.stories.tsx +3 -9
- package/src/widgets/__stories__/radio.stories.tsx +3 -5
- package/src/widgets/__stories__/sorter.stories.tsx +1 -1
- package/src/widgets/__stories__/test-keypad-context-wrapper.tsx +2 -4
- package/src/widgets/__stories__/transformer.stories.tsx +1 -1
- package/src/widgets/__stories__/unit.stories.tsx +1 -3
- package/src/widgets/__stories__/video-transcript-link.stories.tsx +2 -6
- package/src/widgets/__stories__/video.stories.tsx +1 -1
- package/src/widgets/__testdata__/group.testdata.ts +0 -2
- package/src/widgets/__tests__/__snapshots__/categorizer.test.ts.snap +717 -773
- package/src/widgets/__tests__/__snapshots__/cs-program.test.ts.snap +28 -36
- package/src/widgets/__tests__/__snapshots__/definition.test.ts.snap +52 -60
- package/src/widgets/__tests__/__snapshots__/dropdown.test.ts.snap +100 -108
- package/src/widgets/__tests__/__snapshots__/explanation.test.ts.snap +212 -260
- package/src/widgets/__tests__/__snapshots__/graded-group-set-jipt.test.ts.snap +613 -641
- package/src/widgets/__tests__/__snapshots__/graded-group-set.test.ts.snap +249 -261
- package/src/widgets/__tests__/__snapshots__/graded-group.test.ts.snap +671 -735
- package/src/widgets/__tests__/__snapshots__/grapher.test.ts.snap +2676 -2684
- package/src/widgets/__tests__/__snapshots__/group.test.tsx.snap +938 -1002
- package/src/widgets/__tests__/__snapshots__/iframe.test.ts.snap +28 -36
- package/src/widgets/__tests__/__snapshots__/image.test.ts.snap +227 -255
- package/src/widgets/__tests__/__snapshots__/input-number.test.ts.snap +353 -357
- package/src/widgets/__tests__/__snapshots__/interaction.test.ts.snap +255 -259
- package/src/widgets/__tests__/__snapshots__/interactive-graph.test.ts.snap +2401 -2433
- package/src/widgets/__tests__/__snapshots__/matcher.test.tsx.snap +600 -756
- package/src/widgets/__tests__/__snapshots__/matrix.test.ts.snap +420 -428
- package/src/widgets/__tests__/__snapshots__/number-line.test.ts.snap +762 -770
- package/src/widgets/__tests__/__snapshots__/numeric-input.test.ts.snap +373 -393
- package/src/widgets/__tests__/__snapshots__/orderer.test.ts.snap +116 -148
- package/src/widgets/__tests__/__snapshots__/passage-ref.test.ts.snap +289 -301
- package/src/widgets/__tests__/__snapshots__/passage.test.tsx.snap +1679 -1711
- package/src/widgets/__tests__/__snapshots__/radio.test.ts.snap +2692 -2960
- package/src/widgets/__tests__/__snapshots__/video.test.ts.snap +90 -98
- package/src/widgets/__tests__/group.test.tsx +0 -2
- package/src/widgets/__tests__/matcher.test.tsx +33 -9
- package/src/widgets/__tests__/radio/focus-ring.test.tsx +0 -1
- package/src/widgets/expression.tsx +12 -9
- package/src/widgets/grapher.tsx +3 -3
- package/src/widgets/image.tsx +2 -2
- package/src/widgets/interaction/element-container.tsx +7 -8
- package/src/widgets/interactive-graph.tsx +5 -5
- package/src/widgets/label-image/__stories__/answer-choices.stories.tsx +2 -4
- package/src/widgets/label-image/__stories__/marker.stories.tsx +9 -19
- package/src/widgets/label-image/marker.tsx +4 -4
- package/src/widgets/matcher.tsx +43 -24
- package/src/widgets/number-line.tsx +1 -1
- package/src/widgets/numeric-input.tsx +0 -3
- package/src/widgets/passage/passage-markdown.tsx +2 -2
- package/src/widgets/radio/__stories__/base-radio.stories.tsx +11 -19
- package/src/widgets/radio/__stories__/choice-icon.stories.tsx +9 -11
- package/src/widgets/radio/__stories__/choice-none-above.stories.tsx +1 -1
- package/src/widgets/radio/__stories__/choice.stories.tsx +4 -4
- package/src/widgets/radio/__stories__/focus-ring.stories.tsx +1 -1
- package/src/widgets/radio/__stories__/option-status.stories.tsx +2 -4
- package/src/widgets/radio/base-radio.tsx +1 -1
- package/src/widgets/radio/choice-icon/choice-icon.tsx +5 -5
- package/src/widgets/radio/choice-icon/cross-out-line.tsx +1 -3
- package/src/widgets/radio/choice-none-above.tsx +2 -2
- package/src/widgets/radio/choice.tsx +1 -3
- package/src/widgets/radio/focus-ring.tsx +1 -1
- package/src/widgets/radio/option-status.tsx +2 -4
- package/src/widgets/radio/widget.tsx +0 -1
- package/src/widgets/reaction-diagram.tsx +2 -2
- package/src/widgets/simulator.tsx +4 -6
- package/src/widgets/video-transcript-link.tsx +1 -1
- package/{tsconfig.json → tsconfig-build.json} +6 -6
- package/tsconfig-build.tsbuildinfo +1 -0
- package/tsconfig.tsbuildinfo +0 -1
package/src/widgets/matcher.tsx
CHANGED
|
@@ -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:
|
|
55
|
+
state: State = {
|
|
50
56
|
leftHeight: 0,
|
|
51
57
|
rightHeight: 0,
|
|
52
|
-
|
|
58
|
+
texRendererLoaded: false,
|
|
53
59
|
};
|
|
54
60
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
//
|
|
63
|
-
//
|
|
64
|
-
// we
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return
|
|
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=
|
|
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=
|
|
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
|
|
176
|
-
// of the sortables on the left and right, so we just return
|
|
177
|
-
// arrays until we render for the first time.
|
|
178
|
-
if (!this.state.
|
|
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:
|
|
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
|
|
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<
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
48
|
+
export const Interactive = (args: StoryArgs): React.ReactElement => {
|
|
49
49
|
return <Choice {...args} />;
|
|
50
50
|
};
|
|
51
51
|
|
|
52
|
-
export const Checked
|
|
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
|
|
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
|
|
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
|
|
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
|
|
29
|
+
export const Interactive = (args: StoryArgs): React.ReactElement => {
|
|
30
30
|
return <OptionStatus {...args} />;
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
-
export const AllPossibleOutputs: React.
|
|
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
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
}
|