@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
|
@@ -2,160 +2,152 @@
|
|
|
2
2
|
|
|
3
3
|
exports[`video widget should snapshot on mobile: first mobile render 1`] = `
|
|
4
4
|
<div>
|
|
5
|
-
<
|
|
6
|
-
class="
|
|
5
|
+
<div
|
|
6
|
+
class="perseus-renderer perseus-renderer-responsive"
|
|
7
7
|
>
|
|
8
8
|
<div
|
|
9
|
-
class="
|
|
9
|
+
class="paragraph"
|
|
10
|
+
data-perseus-paragraph-index="0"
|
|
10
11
|
>
|
|
11
12
|
<div
|
|
12
13
|
class="paragraph"
|
|
13
|
-
data-perseus-paragraph-index="0"
|
|
14
14
|
>
|
|
15
|
-
|
|
16
|
-
class="paragraph"
|
|
17
|
-
>
|
|
18
|
-
Watch the Biogeography: Where Life Lives video to find the answer.
|
|
19
|
-
</div>
|
|
15
|
+
Watch the Biogeography: Where Life Lives video to find the answer.
|
|
20
16
|
</div>
|
|
17
|
+
</div>
|
|
18
|
+
<div
|
|
19
|
+
class="paragraph"
|
|
20
|
+
data-perseus-paragraph-index="1"
|
|
21
|
+
>
|
|
21
22
|
<div
|
|
22
23
|
class="paragraph"
|
|
23
|
-
data-perseus-paragraph-index="1"
|
|
24
24
|
>
|
|
25
25
|
<div
|
|
26
|
-
class="
|
|
26
|
+
class="perseus-widget-container widget-nohighlight widget-block"
|
|
27
27
|
>
|
|
28
28
|
<div
|
|
29
|
-
class="
|
|
29
|
+
class="default_xu2jcg"
|
|
30
30
|
>
|
|
31
31
|
<div
|
|
32
|
-
class="
|
|
32
|
+
class="fixed-to-responsive"
|
|
33
|
+
style="max-width: 1280px; max-height: 720px;"
|
|
33
34
|
>
|
|
34
35
|
<div
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
style="padding-bottom: 56.25%;"
|
|
37
|
+
/>
|
|
38
|
+
<div
|
|
39
|
+
class="default_xu2jcg-o_O-srOnly_19bpjuy"
|
|
37
40
|
>
|
|
38
|
-
|
|
39
|
-
style="padding-bottom: 56.25%;"
|
|
40
|
-
/>
|
|
41
|
-
<div
|
|
42
|
-
class="default_xu2jcg-o_O-srOnly_19bpjuy"
|
|
43
|
-
>
|
|
44
|
-
Khan Academy video wrapper
|
|
45
|
-
</div>
|
|
46
|
-
<iframe
|
|
47
|
-
allowfullscreen=""
|
|
48
|
-
class="perseus-video-widget"
|
|
49
|
-
height="720"
|
|
50
|
-
sandbox="allow-same-origin allow-scripts"
|
|
51
|
-
src="https://www.khanacademy.org/embed_video?slug=biogeography-where-life-lives&internal_video_only=1"
|
|
52
|
-
width="1280"
|
|
53
|
-
/>
|
|
41
|
+
Khan Academy video wrapper
|
|
54
42
|
</div>
|
|
43
|
+
<iframe
|
|
44
|
+
allowfullscreen=""
|
|
45
|
+
class="perseus-video-widget"
|
|
46
|
+
height="720"
|
|
47
|
+
sandbox="allow-same-origin allow-scripts"
|
|
48
|
+
src="https://www.khanacademy.org/embed_video?slug=biogeography-where-life-lives&internal_video_only=1"
|
|
49
|
+
width="1280"
|
|
50
|
+
/>
|
|
51
|
+
</div>
|
|
52
|
+
<div
|
|
53
|
+
class="default_xu2jcg-o_O-transcriptLink_18xwqfz"
|
|
54
|
+
>
|
|
55
|
+
<span
|
|
56
|
+
class="text_f1191h"
|
|
57
|
+
/>
|
|
55
58
|
<div
|
|
56
|
-
|
|
59
|
+
aria-hidden="true"
|
|
60
|
+
class="default_xu2jcg-o_O-inlineStyles_sc01dy"
|
|
61
|
+
/>
|
|
62
|
+
<a
|
|
63
|
+
class="shared_htyo3s-o_O-resting_nelfll visited-no-recolor"
|
|
64
|
+
href="/transcript/videoNotFound"
|
|
65
|
+
rel="noopener noreferrer"
|
|
66
|
+
target="_blank"
|
|
57
67
|
>
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
/>
|
|
61
|
-
<div
|
|
62
|
-
aria-hidden="true"
|
|
63
|
-
class="default_xu2jcg-o_O-inlineStyles_sc01dy"
|
|
64
|
-
/>
|
|
65
|
-
<a
|
|
66
|
-
class="shared_htyo3s-o_O-resting_nelfll visited-no-recolor"
|
|
67
|
-
href="/transcript/videoNotFound"
|
|
68
|
-
rel="noopener noreferrer"
|
|
69
|
-
target="_blank"
|
|
70
|
-
>
|
|
71
|
-
See video transcript
|
|
72
|
-
</a>
|
|
73
|
-
</div>
|
|
68
|
+
See video transcript
|
|
69
|
+
</a>
|
|
74
70
|
</div>
|
|
75
71
|
</div>
|
|
76
72
|
</div>
|
|
77
73
|
</div>
|
|
78
74
|
</div>
|
|
79
|
-
</
|
|
75
|
+
</div>
|
|
80
76
|
</div>
|
|
81
77
|
`;
|
|
82
78
|
|
|
83
79
|
exports[`video widget should snapshot: first render 1`] = `
|
|
84
80
|
<div>
|
|
85
|
-
<
|
|
86
|
-
class="
|
|
81
|
+
<div
|
|
82
|
+
class="perseus-renderer perseus-renderer-responsive"
|
|
87
83
|
>
|
|
88
84
|
<div
|
|
89
|
-
class="
|
|
85
|
+
class="paragraph"
|
|
86
|
+
data-perseus-paragraph-index="0"
|
|
90
87
|
>
|
|
91
88
|
<div
|
|
92
89
|
class="paragraph"
|
|
93
|
-
data-perseus-paragraph-index="0"
|
|
94
90
|
>
|
|
95
|
-
|
|
96
|
-
class="paragraph"
|
|
97
|
-
>
|
|
98
|
-
Watch the Biogeography: Where Life Lives video to find the answer.
|
|
99
|
-
</div>
|
|
91
|
+
Watch the Biogeography: Where Life Lives video to find the answer.
|
|
100
92
|
</div>
|
|
93
|
+
</div>
|
|
94
|
+
<div
|
|
95
|
+
class="paragraph"
|
|
96
|
+
data-perseus-paragraph-index="1"
|
|
97
|
+
>
|
|
101
98
|
<div
|
|
102
99
|
class="paragraph"
|
|
103
|
-
data-perseus-paragraph-index="1"
|
|
104
100
|
>
|
|
105
101
|
<div
|
|
106
|
-
class="
|
|
102
|
+
class="perseus-widget-container widget-nohighlight widget-block"
|
|
107
103
|
>
|
|
108
104
|
<div
|
|
109
|
-
class="
|
|
105
|
+
class="default_xu2jcg"
|
|
110
106
|
>
|
|
111
107
|
<div
|
|
112
|
-
class="
|
|
108
|
+
class="fixed-to-responsive"
|
|
109
|
+
style="max-width: 1280px; max-height: 720px;"
|
|
113
110
|
>
|
|
114
111
|
<div
|
|
115
|
-
|
|
116
|
-
|
|
112
|
+
style="padding-bottom: 56.25%;"
|
|
113
|
+
/>
|
|
114
|
+
<div
|
|
115
|
+
class="default_xu2jcg-o_O-srOnly_19bpjuy"
|
|
117
116
|
>
|
|
118
|
-
|
|
119
|
-
style="padding-bottom: 56.25%;"
|
|
120
|
-
/>
|
|
121
|
-
<div
|
|
122
|
-
class="default_xu2jcg-o_O-srOnly_19bpjuy"
|
|
123
|
-
>
|
|
124
|
-
Khan Academy video wrapper
|
|
125
|
-
</div>
|
|
126
|
-
<iframe
|
|
127
|
-
allowfullscreen=""
|
|
128
|
-
class="perseus-video-widget"
|
|
129
|
-
height="720"
|
|
130
|
-
sandbox="allow-same-origin allow-scripts"
|
|
131
|
-
src="https://www.khanacademy.org/embed_video?slug=biogeography-where-life-lives&internal_video_only=1"
|
|
132
|
-
width="1280"
|
|
133
|
-
/>
|
|
117
|
+
Khan Academy video wrapper
|
|
134
118
|
</div>
|
|
119
|
+
<iframe
|
|
120
|
+
allowfullscreen=""
|
|
121
|
+
class="perseus-video-widget"
|
|
122
|
+
height="720"
|
|
123
|
+
sandbox="allow-same-origin allow-scripts"
|
|
124
|
+
src="https://www.khanacademy.org/embed_video?slug=biogeography-where-life-lives&internal_video_only=1"
|
|
125
|
+
width="1280"
|
|
126
|
+
/>
|
|
127
|
+
</div>
|
|
128
|
+
<div
|
|
129
|
+
class="default_xu2jcg-o_O-transcriptLink_18xwqfz"
|
|
130
|
+
>
|
|
131
|
+
<span
|
|
132
|
+
class="text_f1191h"
|
|
133
|
+
/>
|
|
135
134
|
<div
|
|
136
|
-
|
|
135
|
+
aria-hidden="true"
|
|
136
|
+
class="default_xu2jcg-o_O-inlineStyles_sc01dy"
|
|
137
|
+
/>
|
|
138
|
+
<a
|
|
139
|
+
class="shared_htyo3s-o_O-resting_nelfll visited-no-recolor"
|
|
140
|
+
href="/transcript/videoNotFound"
|
|
141
|
+
rel="noopener noreferrer"
|
|
142
|
+
target="_blank"
|
|
137
143
|
>
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
/>
|
|
141
|
-
<div
|
|
142
|
-
aria-hidden="true"
|
|
143
|
-
class="default_xu2jcg-o_O-inlineStyles_sc01dy"
|
|
144
|
-
/>
|
|
145
|
-
<a
|
|
146
|
-
class="shared_htyo3s-o_O-resting_nelfll visited-no-recolor"
|
|
147
|
-
href="/transcript/videoNotFound"
|
|
148
|
-
rel="noopener noreferrer"
|
|
149
|
-
target="_blank"
|
|
150
|
-
>
|
|
151
|
-
See video transcript
|
|
152
|
-
</a>
|
|
153
|
-
</div>
|
|
144
|
+
See video transcript
|
|
145
|
+
</a>
|
|
154
146
|
</div>
|
|
155
147
|
</div>
|
|
156
148
|
</div>
|
|
157
149
|
</div>
|
|
158
150
|
</div>
|
|
159
|
-
</
|
|
151
|
+
</div>
|
|
160
152
|
</div>
|
|
161
153
|
`;
|
|
@@ -279,7 +279,6 @@ describe("group widget", () => {
|
|
|
279
279
|
"coefficient": false,
|
|
280
280
|
"currentValue": "99",
|
|
281
281
|
"labelText": "value rounded to the nearest ten",
|
|
282
|
-
"multipleNumberInput": false,
|
|
283
282
|
"rightAlign": false,
|
|
284
283
|
"size": "normal",
|
|
285
284
|
"static": false,
|
|
@@ -288,7 +287,6 @@ describe("group widget", () => {
|
|
|
288
287
|
"answerForms": [],
|
|
289
288
|
"coefficient": false,
|
|
290
289
|
"labelText": "value rounded to the nearest hundred",
|
|
291
|
-
"multipleNumberInput": false,
|
|
292
290
|
"rightAlign": false,
|
|
293
291
|
"size": "normal",
|
|
294
292
|
"static": false,
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import getRenderA11yString from "katex/dist/contrib/render-a11y-string";
|
|
2
1
|
import * as React from "react";
|
|
3
2
|
import "@testing-library/jest-dom";
|
|
4
3
|
|
|
@@ -26,15 +25,18 @@ describe("matcher widget", () => {
|
|
|
26
25
|
|
|
27
26
|
jest.spyOn(Dependencies, "getDependencies").mockReturnValue({
|
|
28
27
|
...testDependencies,
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
TeX: ({
|
|
29
|
+
children,
|
|
30
|
+
onRender: onLoad,
|
|
31
|
+
}: {
|
|
32
|
+
children: React.ReactNode;
|
|
33
|
+
onRender?: () => unknown;
|
|
34
|
+
}) => {
|
|
35
|
+
React.useLayoutEffect(() => {
|
|
36
|
+
onLoad?.();
|
|
37
|
+
}, [onLoad]);
|
|
38
|
+
return <span className="tex-mock">{children}</span>;
|
|
31
39
|
},
|
|
32
|
-
TeX: ({children}: {children: React.ReactNode}) => (
|
|
33
|
-
<span className="tex-mock">{children}</span>
|
|
34
|
-
),
|
|
35
|
-
// @ts-expect-error [FEI-5003] - TS2322 - Type 'Promise<any>' is not assignable to type '() => Promise<katexA11y>'.
|
|
36
|
-
getRenderA11yString: Promise.resolve(getRenderA11yString),
|
|
37
|
-
shouldUseFutureKaTeX: (flag: boolean) => {},
|
|
38
40
|
});
|
|
39
41
|
});
|
|
40
42
|
|
|
@@ -149,4 +151,26 @@ describe("matcher widget", () => {
|
|
|
149
151
|
// Assert
|
|
150
152
|
expect(renderer).toHaveBeenAnsweredIncorrectly();
|
|
151
153
|
});
|
|
154
|
+
|
|
155
|
+
it("is scored incorrect if the math renderer hasn't loaded yet", () => {
|
|
156
|
+
// Arrange: stub the TeX renderer to never call its onRender prop,
|
|
157
|
+
// which is how the matcher knows the math renderer is ready.
|
|
158
|
+
jest.spyOn(Dependencies, "getDependencies").mockReturnValue({
|
|
159
|
+
...testDependencies,
|
|
160
|
+
TeX: () => {
|
|
161
|
+
return null;
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
const apiOptions: APIOptions = {
|
|
166
|
+
isMobile: false,
|
|
167
|
+
};
|
|
168
|
+
const {renderer} = renderQuestion(question1, apiOptions);
|
|
169
|
+
|
|
170
|
+
// Act
|
|
171
|
+
renderer.guessAndScore();
|
|
172
|
+
|
|
173
|
+
// Assert
|
|
174
|
+
expect(renderer).toHaveBeenAnsweredIncorrectly();
|
|
175
|
+
});
|
|
152
176
|
});
|
|
@@ -10,7 +10,6 @@ describe("choice icon", () => {
|
|
|
10
10
|
describe.each([[true], [false]])("multipleSelect: %s", (multipleSelect) => {
|
|
11
11
|
it("renders with the correct border radius", () => {
|
|
12
12
|
// Arrange/Act
|
|
13
|
-
// @ts-expect-error [FEI-5003] - TS2739 - Type '{ multipleSelect: any; }' is missing the following properties from type 'Props': visible, color
|
|
14
13
|
render(<FocusRing multipleSelect={multipleSelect} />);
|
|
15
14
|
|
|
16
15
|
const focusRing = screen.getByTestId("focus-ring");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* eslint-disable react/prop-types */
|
|
2
2
|
import * as KAS from "@khanacademy/kas";
|
|
3
|
-
import {KeypadInput,
|
|
3
|
+
import {KeypadInput, KeypadType} from "@khanacademy/math-input";
|
|
4
4
|
import {linterContextDefault} from "@khanacademy/perseus-linter";
|
|
5
5
|
import * as i18n from "@khanacademy/wonder-blocks-i18n";
|
|
6
6
|
import classNames from "classnames";
|
|
@@ -9,7 +9,10 @@ import _ from "underscore";
|
|
|
9
9
|
|
|
10
10
|
import InlineIcon from "../components/inline-icon";
|
|
11
11
|
import MathInput from "../components/math-input";
|
|
12
|
-
import Tooltip
|
|
12
|
+
import Tooltip, {
|
|
13
|
+
HorizontalDirection,
|
|
14
|
+
VerticalDirection,
|
|
15
|
+
} from "../components/tooltip";
|
|
13
16
|
import {iconExclamationSign} from "../icon-paths";
|
|
14
17
|
import {Errors as PerseusErrors, Log} from "../logging/log";
|
|
15
18
|
import * as Changeable from "../mixins/changeable";
|
|
@@ -87,6 +90,9 @@ type OnInputErrorFunctionType = (
|
|
|
87
90
|
|
|
88
91
|
// The new, MathQuill input expression widget
|
|
89
92
|
export class Expression extends React.Component<Props, ExpressionState> {
|
|
93
|
+
_isMounted = false;
|
|
94
|
+
errorTimeout: null | number = null;
|
|
95
|
+
|
|
90
96
|
//#region Previously a class extension
|
|
91
97
|
/* Content creators input a list of answers which are matched from top to
|
|
92
98
|
* bottom. The intent is that they can include spcific solutions which should
|
|
@@ -334,9 +340,6 @@ export class Expression extends React.Component<Props, ExpressionState> {
|
|
|
334
340
|
this._isMounted = false;
|
|
335
341
|
};
|
|
336
342
|
|
|
337
|
-
_isMounted = false;
|
|
338
|
-
errorTimeout: null | number = null;
|
|
339
|
-
|
|
340
343
|
simpleValidate: (
|
|
341
344
|
rubric: Rubric,
|
|
342
345
|
onInputError: OnInputErrorFunctionType,
|
|
@@ -478,9 +481,9 @@ export class Expression extends React.Component<Props, ExpressionState> {
|
|
|
478
481
|
<span className="error-tooltip" role="tooltip">
|
|
479
482
|
<Tooltip
|
|
480
483
|
className="error-text-container"
|
|
481
|
-
horizontalPosition=
|
|
482
|
-
horizontalAlign=
|
|
483
|
-
verticalPosition=
|
|
484
|
+
horizontalPosition={HorizontalDirection.Right}
|
|
485
|
+
horizontalAlign={HorizontalDirection.Left}
|
|
486
|
+
verticalPosition={VerticalDirection.Top}
|
|
484
487
|
arrowSize={10}
|
|
485
488
|
borderColor="#fcc335"
|
|
486
489
|
show={this.state.showErrorText}
|
|
@@ -549,7 +552,7 @@ const keypadConfigurationForProps = (
|
|
|
549
552
|
) => {
|
|
550
553
|
// Always use the Expression keypad, regardless of the button sets that have
|
|
551
554
|
// been enabled.
|
|
552
|
-
const keypadType =
|
|
555
|
+
const keypadType = KeypadType.EXPRESSION;
|
|
553
556
|
|
|
554
557
|
// Extract any and all variables and constants from the answer forms.
|
|
555
558
|
const uniqueExtraVariables: Record<string, any> = {};
|
package/src/widgets/grapher.tsx
CHANGED
|
@@ -476,15 +476,15 @@ class Grapher extends React.Component<Props> {
|
|
|
476
476
|
_calculateMobileTickStep(
|
|
477
477
|
gridStep: JSX.LibraryManagedAttributes<
|
|
478
478
|
typeof Graphie,
|
|
479
|
-
React.ComponentProps<typeof Graphie
|
|
479
|
+
Required<React.ComponentProps<typeof Graphie>>
|
|
480
480
|
>["gridStep"],
|
|
481
481
|
step: JSX.LibraryManagedAttributes<
|
|
482
482
|
typeof Graphie,
|
|
483
|
-
React.ComponentProps<typeof Graphie
|
|
483
|
+
Required<React.ComponentProps<typeof Graphie>>
|
|
484
484
|
>["step"],
|
|
485
485
|
ranges: JSX.LibraryManagedAttributes<
|
|
486
486
|
typeof Graphie,
|
|
487
|
-
React.ComponentProps<typeof Graphie
|
|
487
|
+
Required<React.ComponentProps<typeof Graphie>>
|
|
488
488
|
>["ranges"],
|
|
489
489
|
): any {
|
|
490
490
|
const tickStep = Util.constrainedTickStepsFromTickSteps(step, ranges);
|
package/src/widgets/image.tsx
CHANGED
|
@@ -12,7 +12,7 @@ import Renderer from "../renderer";
|
|
|
12
12
|
import {baseUnitPx} from "../styles/constants";
|
|
13
13
|
import mediaQueries from "../styles/media-queries";
|
|
14
14
|
|
|
15
|
-
import type {PerseusImageWidgetOptions} from "../perseus-types";
|
|
15
|
+
import type {Range, PerseusImageWidgetOptions} from "../perseus-types";
|
|
16
16
|
import type {
|
|
17
17
|
ChangeFn,
|
|
18
18
|
PerseusScore,
|
|
@@ -21,7 +21,7 @@ import type {
|
|
|
21
21
|
} from "../types";
|
|
22
22
|
|
|
23
23
|
const defaultBoxSize = 400;
|
|
24
|
-
const defaultRange = [0, 10];
|
|
24
|
+
const defaultRange: Range = [0, 10];
|
|
25
25
|
const defaultBackgroundImage = {
|
|
26
26
|
url: null,
|
|
27
27
|
width: 0,
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
iconTrash,
|
|
11
11
|
} from "../../icon-paths";
|
|
12
12
|
|
|
13
|
-
type
|
|
13
|
+
type Props = {
|
|
14
14
|
children: React.ReactElement<any> | ReadonlyArray<React.ReactElement<any>>;
|
|
15
15
|
initiallyVisible: boolean;
|
|
16
16
|
onDelete?: () => void | null | undefined;
|
|
@@ -19,12 +19,11 @@ type ElementContainerProps = {
|
|
|
19
19
|
title: string | React.ReactElement<any>;
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
> {
|
|
22
|
+
type State = {
|
|
23
|
+
show: boolean;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
class ElementContainer extends React.Component<Props, State> {
|
|
28
27
|
static defaultProps: {
|
|
29
28
|
initiallyVisible: boolean;
|
|
30
29
|
title: string;
|
|
@@ -33,7 +32,7 @@ class ElementContainer extends React.Component<
|
|
|
33
32
|
title: "More",
|
|
34
33
|
};
|
|
35
34
|
|
|
36
|
-
constructor(props:
|
|
35
|
+
constructor(props: Props) {
|
|
37
36
|
super(props);
|
|
38
37
|
|
|
39
38
|
this.state = {
|
|
@@ -43,7 +43,7 @@ const TRASH_ICON_URI =
|
|
|
43
43
|
|
|
44
44
|
const defaultBackgroundImage = {
|
|
45
45
|
url: null,
|
|
46
|
-
}
|
|
46
|
+
};
|
|
47
47
|
|
|
48
48
|
const eq = Util.eq;
|
|
49
49
|
const deepEq = Util.deepEq;
|
|
@@ -417,7 +417,6 @@ class InteractiveGraph extends React.Component<Props, State> {
|
|
|
417
417
|
[-10, 10],
|
|
418
418
|
],
|
|
419
419
|
step: [1, 1],
|
|
420
|
-
// @ts-expect-error [FEI-5003] - TS2739 - Type '{ readonly url: null; }' is missing the following properties from type 'PerseusImageBackground': width, height
|
|
421
420
|
backgroundImage: defaultBackgroundImage,
|
|
422
421
|
markings: "graph",
|
|
423
422
|
showTooltips: false,
|
|
@@ -1984,9 +1983,10 @@ class InteractiveGraph extends React.Component<Props, State> {
|
|
|
1984
1983
|
instructions = undefined;
|
|
1985
1984
|
}
|
|
1986
1985
|
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1986
|
+
let onMouseDown;
|
|
1987
|
+
if (this.isClickToAddPoints()) {
|
|
1988
|
+
onMouseDown = this.handleAddPointsMouseDown;
|
|
1989
|
+
}
|
|
1990
1990
|
|
|
1991
1991
|
const gridStep =
|
|
1992
1992
|
this.props.gridStep ||
|
|
@@ -87,12 +87,10 @@ class WithState extends React.Component<
|
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
export const SingleSelect
|
|
90
|
+
export const SingleSelect = (args: StoryArgs): React.ReactElement => {
|
|
91
91
|
return <WithState />;
|
|
92
92
|
};
|
|
93
93
|
|
|
94
|
-
export const MultipleSelect: React.
|
|
95
|
-
args,
|
|
96
|
-
): React.ReactElement => {
|
|
94
|
+
export const MultipleSelect = (args: StoryArgs): React.ReactElement => {
|
|
97
95
|
return <WithState multipleSelect={true} />;
|
|
98
96
|
};
|
|
@@ -31,7 +31,7 @@ const Wrapper = (props) => (
|
|
|
31
31
|
// TODO(jeremy): There are a bunch of props that we have to pass to the Marker
|
|
32
32
|
// that are not used by it, but required because we share a props type.
|
|
33
33
|
|
|
34
|
-
export const Unfilled
|
|
34
|
+
export const Unfilled = (args: StoryArgs): React.ReactElement => {
|
|
35
35
|
const props = {
|
|
36
36
|
answers: ["BMW", "Ferrari"],
|
|
37
37
|
selected: [],
|
|
@@ -46,9 +46,7 @@ export const Unfilled: React.FC<StoryArgs> = (args): React.ReactElement => {
|
|
|
46
46
|
return <Wrapper {...props} />;
|
|
47
47
|
};
|
|
48
48
|
|
|
49
|
-
export const UnfilledPulsate: React.
|
|
50
|
-
args,
|
|
51
|
-
): React.ReactElement => {
|
|
49
|
+
export const UnfilledPulsate = (args: StoryArgs): React.ReactElement => {
|
|
52
50
|
const props = {
|
|
53
51
|
answers: ["BMW", "Ferrari"],
|
|
54
52
|
selected: [],
|
|
@@ -63,9 +61,7 @@ export const UnfilledPulsate: React.FC<StoryArgs> = (
|
|
|
63
61
|
return <Wrapper {...props} />;
|
|
64
62
|
};
|
|
65
63
|
|
|
66
|
-
export const UnfilledSelected: React.
|
|
67
|
-
args,
|
|
68
|
-
): React.ReactElement => {
|
|
64
|
+
export const UnfilledSelected = (args: StoryArgs): React.ReactElement => {
|
|
69
65
|
const props = {
|
|
70
66
|
answers: ["BMW", "Ferrari"],
|
|
71
67
|
selected: [],
|
|
@@ -80,7 +76,7 @@ export const UnfilledSelected: React.FC<StoryArgs> = (
|
|
|
80
76
|
return <Wrapper {...props} />;
|
|
81
77
|
};
|
|
82
78
|
|
|
83
|
-
export const Filled
|
|
79
|
+
export const Filled = (args: StoryArgs): React.ReactElement => {
|
|
84
80
|
const props = {
|
|
85
81
|
answers: ["BMW", "Ferrari"],
|
|
86
82
|
selected: ["Fiat"],
|
|
@@ -95,9 +91,7 @@ export const Filled: React.FC<StoryArgs> = (args): React.ReactElement => {
|
|
|
95
91
|
return <Wrapper {...props} />;
|
|
96
92
|
};
|
|
97
93
|
|
|
98
|
-
export const FilledSelected: React.
|
|
99
|
-
args,
|
|
100
|
-
): React.ReactElement => {
|
|
94
|
+
export const FilledSelected = (args: StoryArgs): React.ReactElement => {
|
|
101
95
|
const props = {
|
|
102
96
|
answers: ["BMW", "Ferrari"],
|
|
103
97
|
selected: ["Fiat"],
|
|
@@ -112,7 +106,7 @@ export const FilledSelected: React.FC<StoryArgs> = (
|
|
|
112
106
|
return <Wrapper {...props} />;
|
|
113
107
|
};
|
|
114
108
|
|
|
115
|
-
export const Incorrect
|
|
109
|
+
export const Incorrect = (args: StoryArgs): React.ReactElement => {
|
|
116
110
|
const props = {
|
|
117
111
|
answers: ["BMW", "Ferrari"],
|
|
118
112
|
selected: ["Fiat"],
|
|
@@ -128,9 +122,7 @@ export const Incorrect: React.FC<StoryArgs> = (args): React.ReactElement => {
|
|
|
128
122
|
return <Wrapper {...props} />;
|
|
129
123
|
};
|
|
130
124
|
|
|
131
|
-
export const IncorrectSelected: React.
|
|
132
|
-
args,
|
|
133
|
-
): React.ReactElement => {
|
|
125
|
+
export const IncorrectSelected = (args: StoryArgs): React.ReactElement => {
|
|
134
126
|
const props = {
|
|
135
127
|
answers: ["BMW", "Ferrari"],
|
|
136
128
|
selected: ["Fiat"],
|
|
@@ -146,7 +138,7 @@ export const IncorrectSelected: React.FC<StoryArgs> = (
|
|
|
146
138
|
return <Wrapper {...props} />;
|
|
147
139
|
};
|
|
148
140
|
|
|
149
|
-
export const Correct
|
|
141
|
+
export const Correct = (args: StoryArgs): React.ReactElement => {
|
|
150
142
|
const props = {
|
|
151
143
|
answers: ["BMW", "Ferrari"],
|
|
152
144
|
selected: ["BMW", "Ferrari"],
|
|
@@ -162,9 +154,7 @@ export const Correct: React.FC<StoryArgs> = (args): React.ReactElement => {
|
|
|
162
154
|
return <Wrapper {...props} />;
|
|
163
155
|
};
|
|
164
156
|
|
|
165
|
-
export const CorrectSelected: React.
|
|
166
|
-
args,
|
|
167
|
-
): React.ReactElement => {
|
|
157
|
+
export const CorrectSelected = (args: StoryArgs): React.ReactElement => {
|
|
168
158
|
const props = {
|
|
169
159
|
answers: ["BMW", "Ferrari"],
|
|
170
160
|
selected: ["BMW", "Ferrari"],
|
|
@@ -13,7 +13,7 @@ import {iconCheck, iconMinus} from "../../icon-paths";
|
|
|
13
13
|
|
|
14
14
|
import type {InteractiveMarkerType} from "./types";
|
|
15
15
|
|
|
16
|
-
type
|
|
16
|
+
type Props = InteractiveMarkerType & {
|
|
17
17
|
// Whether this marker has been selected by user.
|
|
18
18
|
showSelected: boolean;
|
|
19
19
|
// Whether this marker should pulsate to draw user attention.
|
|
@@ -23,12 +23,12 @@ type MarkerProps = InteractiveMarkerType & {
|
|
|
23
23
|
onKeyDown: (e: KeyboardEvent) => void;
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
-
type
|
|
26
|
+
type State = {
|
|
27
27
|
// Whether the marker button has input focus.
|
|
28
28
|
isFocused: boolean;
|
|
29
29
|
};
|
|
30
30
|
|
|
31
|
-
export default class Marker extends React.Component<
|
|
31
|
+
export default class Marker extends React.Component<Props, State> {
|
|
32
32
|
// The marker icon element.
|
|
33
33
|
_icon: HTMLElement | null | undefined;
|
|
34
34
|
|
|
@@ -38,7 +38,7 @@ export default class Marker extends React.Component<MarkerProps, MarkerState> {
|
|
|
38
38
|
selected: [],
|
|
39
39
|
};
|
|
40
40
|
|
|
41
|
-
state:
|
|
41
|
+
state: State = {
|
|
42
42
|
isFocused: false,
|
|
43
43
|
};
|
|
44
44
|
|