@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
@@ -2,160 +2,152 @@
2
2
 
3
3
  exports[`video widget should snapshot on mobile: first mobile render 1`] = `
4
4
  <div>
5
- <span
6
- class="mock-KatexProvider"
5
+ <div
6
+ class="perseus-renderer perseus-renderer-responsive"
7
7
  >
8
8
  <div
9
- class="perseus-renderer perseus-renderer-responsive"
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
- <div
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="paragraph"
26
+ class="perseus-widget-container widget-nohighlight widget-block"
27
27
  >
28
28
  <div
29
- class="perseus-widget-container widget-nohighlight widget-block"
29
+ class="default_xu2jcg"
30
30
  >
31
31
  <div
32
- class="default_xu2jcg"
32
+ class="fixed-to-responsive"
33
+ style="max-width: 1280px; max-height: 720px;"
33
34
  >
34
35
  <div
35
- class="fixed-to-responsive"
36
- style="max-width: 1280px; max-height: 720px;"
36
+ style="padding-bottom: 56.25%;"
37
+ />
38
+ <div
39
+ class="default_xu2jcg-o_O-srOnly_19bpjuy"
37
40
  >
38
- <div
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
- class="default_xu2jcg-o_O-transcriptLink_18xwqfz"
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
- <span
59
- class="text_f1191h"
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
- </span>
75
+ </div>
80
76
  </div>
81
77
  `;
82
78
 
83
79
  exports[`video widget should snapshot: first render 1`] = `
84
80
  <div>
85
- <span
86
- class="mock-KatexProvider"
81
+ <div
82
+ class="perseus-renderer perseus-renderer-responsive"
87
83
  >
88
84
  <div
89
- class="perseus-renderer perseus-renderer-responsive"
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
- <div
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="paragraph"
102
+ class="perseus-widget-container widget-nohighlight widget-block"
107
103
  >
108
104
  <div
109
- class="perseus-widget-container widget-nohighlight widget-block"
105
+ class="default_xu2jcg"
110
106
  >
111
107
  <div
112
- class="default_xu2jcg"
108
+ class="fixed-to-responsive"
109
+ style="max-width: 1280px; max-height: 720px;"
113
110
  >
114
111
  <div
115
- class="fixed-to-responsive"
116
- style="max-width: 1280px; max-height: 720px;"
112
+ style="padding-bottom: 56.25%;"
113
+ />
114
+ <div
115
+ class="default_xu2jcg-o_O-srOnly_19bpjuy"
117
116
  >
118
- <div
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
- class="default_xu2jcg-o_O-transcriptLink_18xwqfz"
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
- <span
139
- class="text_f1191h"
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
- </span>
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
- getKaTeX: () => {
30
- return Promise.resolve({});
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, KeypadTypes} from "@khanacademy/math-input";
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 from "../components/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="right"
482
- horizontalAlign="left"
483
- verticalPosition="top"
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 = KeypadTypes.EXPRESSION;
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> = {};
@@ -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);
@@ -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 ElementContainerProps = {
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
- class ElementContainer extends React.Component<
23
- ElementContainerProps,
24
- {
25
- show: boolean;
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: ElementContainerProps) {
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
- } as const;
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
- const onMouseDown = this.isClickToAddPoints()
1988
- ? this.handleAddPointsMouseDown
1989
- : null;
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: React.FC<StoryArgs> = (args): React.ReactElement => {
90
+ export const SingleSelect = (args: StoryArgs): React.ReactElement => {
91
91
  return <WithState />;
92
92
  };
93
93
 
94
- export const MultipleSelect: React.FC<StoryArgs> = (
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: React.FC<StoryArgs> = (args): React.ReactElement => {
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.FC<StoryArgs> = (
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.FC<StoryArgs> = (
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: React.FC<StoryArgs> = (args): React.ReactElement => {
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.FC<StoryArgs> = (
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: React.FC<StoryArgs> = (args): React.ReactElement => {
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.FC<StoryArgs> = (
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: React.FC<StoryArgs> = (args): React.ReactElement => {
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.FC<StoryArgs> = (
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 MarkerProps = InteractiveMarkerType & {
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 MarkerState = {
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<MarkerProps, MarkerState> {
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: MarkerState = {
41
+ state: State = {
42
42
  isFocused: false,
43
43
  };
44
44