@khanacademy/perseus 19.1.5 → 19.1.6

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 (478) hide show
  1. package/dist/es/index.js +1 -1
  2. package/dist/index.js +1 -1
  3. package/package.json +11 -8
  4. package/.babelrc.js +0 -8
  5. package/.eslintrc.js +0 -12
  6. package/CHANGELOG.md +0 -1432
  7. package/src/__stories__/article-renderer.stories.tsx +0 -100
  8. package/src/__stories__/hints-renderer.stories.tsx +0 -55
  9. package/src/__stories__/server-item-renderer.stories.tsx +0 -44
  10. package/src/__testdata__/article-renderer.testdata.ts +0 -212
  11. package/src/__testdata__/graphie.testdata.ts +0 -51
  12. package/src/__testdata__/renderer.testdata.ts +0 -274
  13. package/src/__testdata__/server-item-renderer.testdata.ts +0 -171
  14. package/src/__tests__/__snapshots__/perseus-markdown.test.ts.snap +0 -507
  15. package/src/__tests__/__snapshots__/renderer.test.tsx.snap +0 -525
  16. package/src/__tests__/__snapshots__/server-item-renderer.test.tsx.snap +0 -285
  17. package/src/__tests__/a11y.test.ts +0 -303
  18. package/src/__tests__/article-renderer.test.tsx +0 -130
  19. package/src/__tests__/error-boundary.test.tsx +0 -76
  20. package/src/__tests__/extract-perseus-data.test.ts +0 -1027
  21. package/src/__tests__/init.test.ts +0 -10
  22. package/src/__tests__/jipt-paragraphs.test.ts +0 -32
  23. package/src/__tests__/mock-asset-loading-widget.tsx +0 -53
  24. package/src/__tests__/mock-widget.tsx +0 -33
  25. package/src/__tests__/perseus-markdown.test.ts +0 -764
  26. package/src/__tests__/renderability.test.ts +0 -480
  27. package/src/__tests__/renderer-api.test.tsx +0 -302
  28. package/src/__tests__/renderer.test.tsx +0 -1816
  29. package/src/__tests__/server-item-renderer.test.tsx +0 -582
  30. package/src/__tests__/test-items/image-item.ts +0 -24
  31. package/src/__tests__/test-items/input-number-1-item.ts +0 -26
  32. package/src/__tests__/test-items/input-number-2-item.ts +0 -38
  33. package/src/__tests__/test-items/table-item.ts +0 -29
  34. package/src/__tests__/tex-wrangler.test.ts +0 -82
  35. package/src/__tests__/util.test.ts +0 -40
  36. package/src/__tests__/widget-container.test.tsx +0 -126
  37. package/src/__tests__/widgets.test.ts +0 -91
  38. package/src/a11y.ts +0 -45
  39. package/src/all-widgets.ts +0 -9
  40. package/src/article-renderer.tsx +0 -237
  41. package/src/asset-context.ts +0 -30
  42. package/src/basic-widgets.ts +0 -16
  43. package/src/components/__stories__/button-group.stories.tsx +0 -55
  44. package/src/components/__stories__/fixed-to-responsive.stories.tsx +0 -141
  45. package/src/components/__stories__/graph.stories.tsx +0 -28
  46. package/src/components/__stories__/graphie.stories.tsx +0 -33
  47. package/src/components/__stories__/hud.stories.tsx +0 -35
  48. package/src/components/__stories__/icon.stories.tsx +0 -63
  49. package/src/components/__stories__/image-loader.stories.tsx +0 -63
  50. package/src/components/__stories__/info-tip.stories.tsx +0 -31
  51. package/src/components/__stories__/inline-icon.stories.tsx +0 -40
  52. package/src/components/__stories__/input-with-examples.stories.tsx +0 -53
  53. package/src/components/__stories__/lint.stories.tsx +0 -86
  54. package/src/components/__stories__/math-input.stories.tsx +0 -43
  55. package/src/components/__stories__/math-output.stories.tsx +0 -23
  56. package/src/components/__stories__/multi-button-group.stories.tsx +0 -66
  57. package/src/components/__stories__/number-input.stories.tsx +0 -41
  58. package/src/components/__stories__/prop-check-box.stories.tsx +0 -65
  59. package/src/components/__stories__/range-input.stories.tsx +0 -29
  60. package/src/components/__stories__/simple-keypad-input.stories.tsx +0 -27
  61. package/src/components/__stories__/sortable.stories.tsx +0 -77
  62. package/src/components/__stories__/stub-tag-editor.stories.tsx +0 -45
  63. package/src/components/__stories__/svg-image.stories.tsx +0 -74
  64. package/src/components/__stories__/tex.stories.tsx +0 -23
  65. package/src/components/__stories__/text-input.stories.tsx +0 -33
  66. package/src/components/__stories__/text-list-editor.stories.tsx +0 -32
  67. package/src/components/__stories__/tooltip.stories.tsx +0 -52
  68. package/src/components/__stories__/zoomable-tex.stories.tsx +0 -41
  69. package/src/components/__stories__/zoomable.stories.tsx +0 -49
  70. package/src/components/__testdata__/sorter.testdata.ts +0 -19
  71. package/src/components/__tests__/__snapshots__/sortable.test.tsx.snap +0 -163
  72. package/src/components/__tests__/__snapshots__/sorter.test.tsx.snap +0 -265
  73. package/src/components/__tests__/math-input.test.tsx +0 -147
  74. package/src/components/__tests__/number-input.test.tsx +0 -128
  75. package/src/components/__tests__/sortable.test.tsx +0 -269
  76. package/src/components/__tests__/sorter.test.tsx +0 -114
  77. package/src/components/__tests__/zoomable.test.tsx +0 -399
  78. package/src/components/button-group.tsx +0 -130
  79. package/src/components/constants.ts +0 -14
  80. package/src/components/fixed-to-responsive.tsx +0 -169
  81. package/src/components/graph.tsx +0 -444
  82. package/src/components/graphie-classes.ts +0 -153
  83. package/src/components/graphie-movables.ts +0 -338
  84. package/src/components/graphie.tsx +0 -400
  85. package/src/components/highlighting/highlightable-content.tsx +0 -240
  86. package/src/components/highlighting/highlights.ts +0 -207
  87. package/src/components/highlighting/ranges.ts +0 -304
  88. package/src/components/highlighting/types.ts +0 -73
  89. package/src/components/highlighting/ui/highlight-renderer.tsx +0 -172
  90. package/src/components/highlighting/ui/highlight-set-renderer.tsx +0 -185
  91. package/src/components/highlighting/ui/highlight-tooltip.tsx +0 -141
  92. package/src/components/highlighting/ui/highlighting-ui.tsx +0 -143
  93. package/src/components/highlighting/ui/selection-tracker.tsx +0 -186
  94. package/src/components/highlighting/ui/types.ts +0 -21
  95. package/src/components/highlighting/ui/util.ts +0 -165
  96. package/src/components/highlighting/word-indexer.tsx +0 -152
  97. package/src/components/hud.tsx +0 -167
  98. package/src/components/icon.tsx +0 -141
  99. package/src/components/image-loader.tsx +0 -177
  100. package/src/components/info-tip/info-tip.tsx +0 -144
  101. package/src/components/info-tip.tsx +0 -39
  102. package/src/components/inline-icon.tsx +0 -60
  103. package/src/components/input-with-examples.tsx +0 -249
  104. package/src/components/lint.tsx +0 -459
  105. package/src/components/math-input.tsx +0 -474
  106. package/src/components/math-output.tsx +0 -134
  107. package/src/components/multi-button-group.tsx +0 -135
  108. package/src/components/number-input.tsx +0 -249
  109. package/src/components/prop-check-box.tsx +0 -79
  110. package/src/components/range-input.tsx +0 -60
  111. package/src/components/simple-keypad-input.tsx +0 -88
  112. package/src/components/sortable.tsx +0 -958
  113. package/src/components/stub-tag-editor.tsx +0 -53
  114. package/src/components/svg-image.tsx +0 -779
  115. package/src/components/tex.tsx +0 -67
  116. package/src/components/text-input.tsx +0 -129
  117. package/src/components/text-list-editor.tsx +0 -166
  118. package/src/components/tooltip.tsx +0 -410
  119. package/src/components/visibility-observer/__stories__/visibility-observer.stories.tsx +0 -141
  120. package/src/components/visibility-observer/create-visibility-observer.ts +0 -108
  121. package/src/components/visibility-observer/get-scroll-parent.ts +0 -46
  122. package/src/components/visibility-observer/visibility-observer.tsx +0 -124
  123. package/src/components/zoomable-tex.tsx +0 -78
  124. package/src/components/zoomable.tsx +0 -304
  125. package/src/components.ts +0 -15
  126. package/src/definition-context.tsx +0 -59
  127. package/src/dependencies.ts +0 -40
  128. package/src/error-boundary.tsx +0 -70
  129. package/src/extra-widgets.ts +0 -75
  130. package/src/hint-renderer.tsx +0 -151
  131. package/src/hints-renderer.tsx +0 -372
  132. package/src/icon-paths.ts +0 -119
  133. package/src/index.ts +0 -171
  134. package/src/init.ts +0 -56
  135. package/src/interaction-tracker.ts +0 -62
  136. package/src/interactive2/__tests__/movable-mock.ts +0 -55
  137. package/src/interactive2/__tests__/movable-point.test.ts +0 -144
  138. package/src/interactive2/interactive-util.test.ts +0 -93
  139. package/src/interactive2/interactive-util.ts +0 -159
  140. package/src/interactive2/movable-helper-methods.ts +0 -166
  141. package/src/interactive2/movable-line-options.ts +0 -419
  142. package/src/interactive2/movable-line.ts +0 -307
  143. package/src/interactive2/movable-point-options.ts +0 -224
  144. package/src/interactive2/movable-point.tsx +0 -585
  145. package/src/interactive2/movable-polygon-options.ts +0 -389
  146. package/src/interactive2/movable-polygon.ts +0 -360
  147. package/src/interactive2/movable.test.ts +0 -249
  148. package/src/interactive2/movable.ts +0 -437
  149. package/src/interactive2/objective_.ts +0 -79
  150. package/src/interactive2/types.ts +0 -17
  151. package/src/interactive2/wrapped-defaults.ts +0 -87
  152. package/src/interactive2/wrapped-ellipse.ts +0 -94
  153. package/src/interactive2/wrapped-line.ts +0 -116
  154. package/src/interactive2/wrapped-path.ts +0 -51
  155. package/src/interactive2.ts +0 -70
  156. package/src/item-version.ts +0 -10
  157. package/src/jipt-paragraphs.ts +0 -49
  158. package/src/jquery.mobile.vmouse.js +0 -545
  159. package/src/loading-context.ts +0 -21
  160. package/src/logging/log.test.ts +0 -39
  161. package/src/logging/log.ts +0 -97
  162. package/src/mixins/__tests__/widget-prop-denylist.test.ts +0 -21
  163. package/src/mixins/changeable.ts +0 -133
  164. package/src/mixins/editor-jsonify.ts +0 -13
  165. package/src/mixins/widget-jsonify-deprecated.ts +0 -23
  166. package/src/mixins/widget-prop-denylist.ts +0 -48
  167. package/src/multi-items/__stories__/multi-renderer.stories.tsx +0 -83
  168. package/src/multi-items/__testdata__/multi-renderer.testdata.ts +0 -172
  169. package/src/multi-items/__tests__/__snapshots__/multi-renderer.test.tsx.snap +0 -1164
  170. package/src/multi-items/__tests__/items.test.ts +0 -240
  171. package/src/multi-items/__tests__/multi-renderer.test.tsx +0 -914
  172. package/src/multi-items/__tests__/prop-type-builders.test.ts +0 -133
  173. package/src/multi-items/__tests__/shapes.test.ts +0 -43
  174. package/src/multi-items/__tests__/trees.test.ts +0 -317
  175. package/src/multi-items/item-types.ts +0 -56
  176. package/src/multi-items/items.ts +0 -176
  177. package/src/multi-items/multi-renderer.tsx +0 -569
  178. package/src/multi-items/prop-type-builders.ts +0 -106
  179. package/src/multi-items/shape-types.ts +0 -52
  180. package/src/multi-items/shapes.ts +0 -52
  181. package/src/multi-items/tree-types.ts +0 -47
  182. package/src/multi-items/trees.ts +0 -360
  183. package/src/multi-items.ts +0 -75
  184. package/src/perseus-api.tsx +0 -188
  185. package/src/perseus-env.ts +0 -27
  186. package/src/perseus-error.ts +0 -17
  187. package/src/perseus-markdown.tsx +0 -405
  188. package/src/perseus-types.ts +0 -1366
  189. package/src/perseus-version.ts +0 -9
  190. package/src/question-paragraph.tsx +0 -34
  191. package/src/renderability.ts +0 -109
  192. package/src/renderer.tsx +0 -2000
  193. package/src/server-item-renderer.tsx +0 -495
  194. package/src/sigfigs.ts +0 -490
  195. package/src/styles/articles.less +0 -749
  196. package/src/styles/constants.ts +0 -94
  197. package/src/styles/global-constants.ts +0 -343
  198. package/src/styles/global-styles.ts +0 -306
  199. package/src/styles/khan-exercise.css +0 -1468
  200. package/src/styles/media-queries.ts +0 -47
  201. package/src/styles/perseus-renderer.less +0 -732
  202. package/src/styles/shared.ts +0 -130
  203. package/src/styles/util.less +0 -47
  204. package/src/styles/variables.boostrap.less +0 -277
  205. package/src/styles/variables.less +0 -56
  206. package/src/styles/variables.shared.less +0 -340
  207. package/src/styles/widgets/categorizer.less +0 -38
  208. package/src/styles/widgets/dropdown.less +0 -3
  209. package/src/styles/widgets/expression.less +0 -65
  210. package/src/styles/widgets/graded-group.less +0 -36
  211. package/src/styles/widgets/grapher.less +0 -12
  212. package/src/styles/widgets/group.less +0 -19
  213. package/src/styles/widgets/image.less +0 -54
  214. package/src/styles/widgets/interactive-graph.less +0 -64
  215. package/src/styles/widgets/label-image.less +0 -57
  216. package/src/styles/widgets/matcher.less +0 -8
  217. package/src/styles/widgets/matrix.less +0 -126
  218. package/src/styles/widgets/measurer.less +0 -20
  219. package/src/styles/widgets/orderer.less +0 -98
  220. package/src/styles/widgets/passage.less +0 -154
  221. package/src/styles/widgets/plotter.less +0 -31
  222. package/src/styles/widgets/radio.less +0 -58
  223. package/src/styles/widgets/reaction-diagram.less +0 -35
  224. package/src/styles/widgets/sequence.less +0 -5
  225. package/src/styles/widgets/sortable.less +0 -113
  226. package/src/styles/widgets/table.less +0 -57
  227. package/src/styles/widgets/unit.less +0 -15
  228. package/src/tex-wrangler.ts +0 -182
  229. package/src/translation-linter.ts +0 -126
  230. package/src/traversal.ts +0 -138
  231. package/src/types.ts +0 -513
  232. package/src/util/a11y.ts +0 -23
  233. package/src/util/answer-types.test.ts +0 -114
  234. package/src/util/answer-types.ts +0 -876
  235. package/src/util/colors.ts +0 -93
  236. package/src/util/drawing-transform.test.ts +0 -67
  237. package/src/util/drawing-transform.ts +0 -102
  238. package/src/util/extract-perseus-data.ts +0 -539
  239. package/src/util/fix-passage-refs.ts +0 -121
  240. package/src/util/geometry.test.ts +0 -75
  241. package/src/util/geometry.ts +0 -312
  242. package/src/util/graph-bounds.ts +0 -23
  243. package/src/util/graph-utils.ts +0 -15
  244. package/src/util/graphie.test.ts +0 -1277
  245. package/src/util/graphie.ts +0 -1576
  246. package/src/util/interactive.ts +0 -4174
  247. package/src/util/interval.ts +0 -4
  248. package/src/util/katex-preprocess.ts +0 -14
  249. package/src/util/math.test.ts +0 -11
  250. package/src/util/math.ts +0 -294
  251. package/src/util/mobile-native-utils.test.ts +0 -22
  252. package/src/util/mobile-native-utils.ts +0 -12
  253. package/src/util/parse-perseus-json.test.ts +0 -10
  254. package/src/util/parse-perseus-json.ts +0 -13
  255. package/src/util/react-render.tsx +0 -27
  256. package/src/util/register-all-widgets-for-testing.ts +0 -13
  257. package/src/util/scroll-utils.ts +0 -155
  258. package/src/util/sizing-utils.ts +0 -46
  259. package/src/util/tex.ts +0 -73
  260. package/src/util/url-utils.ts +0 -34
  261. package/src/util.graphie.test.ts +0 -45
  262. package/src/util.graphie.ts +0 -59
  263. package/src/util.ts +0 -966
  264. package/src/version.ts +0 -10
  265. package/src/widget-container.tsx +0 -199
  266. package/src/widgets/__stories__/categorizer.stories.tsx +0 -14
  267. package/src/widgets/__stories__/cs-program.stories.tsx +0 -14
  268. package/src/widgets/__stories__/definition.stories.tsx +0 -114
  269. package/src/widgets/__stories__/dropdown.stories.tsx +0 -14
  270. package/src/widgets/__stories__/explanation.stories.tsx +0 -18
  271. package/src/widgets/__stories__/expression.stories.tsx +0 -145
  272. package/src/widgets/__stories__/graded-group-set.stories.tsx +0 -31
  273. package/src/widgets/__stories__/graded-group.stories.tsx +0 -31
  274. package/src/widgets/__stories__/grapher.stories.tsx +0 -46
  275. package/src/widgets/__stories__/group.stories.tsx +0 -14
  276. package/src/widgets/__stories__/iframe.stories.tsx +0 -14
  277. package/src/widgets/__stories__/image.stories.tsx +0 -85
  278. package/src/widgets/__stories__/input-number.stories.tsx +0 -101
  279. package/src/widgets/__stories__/interaction.stories.tsx +0 -14
  280. package/src/widgets/__stories__/interactive-graph.stories.tsx +0 -60
  281. package/src/widgets/__stories__/label-image.stories.tsx +0 -130
  282. package/src/widgets/__stories__/matcher.stories.tsx +0 -14
  283. package/src/widgets/__stories__/matrix.stories.tsx +0 -14
  284. package/src/widgets/__stories__/number-line.stories.tsx +0 -14
  285. package/src/widgets/__stories__/numeric-input.stories.tsx +0 -105
  286. package/src/widgets/__stories__/orderer.stories.tsx +0 -18
  287. package/src/widgets/__stories__/passage-ref.stories.tsx +0 -33
  288. package/src/widgets/__stories__/passage.stories.tsx +0 -39
  289. package/src/widgets/__stories__/plotter.stories.tsx +0 -27
  290. package/src/widgets/__stories__/radio.stories.tsx +0 -86
  291. package/src/widgets/__stories__/random-widgets.stories.tsx +0 -59
  292. package/src/widgets/__stories__/sorter.stories.tsx +0 -14
  293. package/src/widgets/__stories__/test-keypad-context-wrapper.tsx +0 -66
  294. package/src/widgets/__stories__/unit.stories.tsx +0 -28
  295. package/src/widgets/__stories__/video-transcript-link.stories.tsx +0 -23
  296. package/src/widgets/__stories__/video.stories.tsx +0 -22
  297. package/src/widgets/__testdata__/base-radio.testdata.ts +0 -21
  298. package/src/widgets/__testdata__/categorizer.testdata.ts +0 -89
  299. package/src/widgets/__testdata__/cs-program.testdata.ts +0 -27
  300. package/src/widgets/__testdata__/dropdown.testdata.ts +0 -71
  301. package/src/widgets/__testdata__/explanation.testdata.ts +0 -85
  302. package/src/widgets/__testdata__/expression.testdata.ts +0 -198
  303. package/src/widgets/__testdata__/graded-group-set.testdata.ts +0 -356
  304. package/src/widgets/__testdata__/graded-group.testdata.ts +0 -77
  305. package/src/widgets/__testdata__/grapher.testdata.ts +0 -374
  306. package/src/widgets/__testdata__/group.testdata.ts +0 -153
  307. package/src/widgets/__testdata__/iframe.testdata.ts +0 -35
  308. package/src/widgets/__testdata__/image.testdata.ts +0 -36
  309. package/src/widgets/__testdata__/input-number.testdata.ts +0 -72
  310. package/src/widgets/__testdata__/interaction.testdata.ts +0 -262
  311. package/src/widgets/__testdata__/interactive-graph-random.testdata.ts +0 -269
  312. package/src/widgets/__testdata__/interactive-graph.testdata.ts +0 -644
  313. package/src/widgets/__testdata__/label-image.testdata.ts +0 -308
  314. package/src/widgets/__testdata__/matcher.testdata.ts +0 -33
  315. package/src/widgets/__testdata__/matrix.testdata.ts +0 -28
  316. package/src/widgets/__testdata__/number-line.testdata.ts +0 -30
  317. package/src/widgets/__testdata__/numeric-input.testdata.ts +0 -265
  318. package/src/widgets/__testdata__/orderer.testdata.ts +0 -123
  319. package/src/widgets/__testdata__/passage-ref.testdata.ts +0 -101
  320. package/src/widgets/__testdata__/passage.testdata.ts +0 -95
  321. package/src/widgets/__testdata__/plotter.testdata.ts +0 -36
  322. package/src/widgets/__testdata__/radio.testdata.ts +0 -324
  323. package/src/widgets/__testdata__/randomizers.ts +0 -51
  324. package/src/widgets/__testdata__/sorter.testdata.ts +0 -19
  325. package/src/widgets/__testdata__/video.testdata.ts +0 -61
  326. package/src/widgets/__tests__/__snapshots__/categorizer.test.ts.snap +0 -940
  327. package/src/widgets/__tests__/__snapshots__/cs-program.test.ts.snap +0 -67
  328. package/src/widgets/__tests__/__snapshots__/definition.test.ts.snap +0 -97
  329. package/src/widgets/__tests__/__snapshots__/dropdown.test.ts.snap +0 -133
  330. package/src/widgets/__tests__/__snapshots__/explanation.test.ts.snap +0 -425
  331. package/src/widgets/__tests__/__snapshots__/graded-group-set-jipt.test.ts.snap +0 -729
  332. package/src/widgets/__tests__/__snapshots__/graded-group-set.test.ts.snap +0 -339
  333. package/src/widgets/__tests__/__snapshots__/graded-group.test.ts.snap +0 -801
  334. package/src/widgets/__tests__/__snapshots__/grapher.test.ts.snap +0 -2673
  335. package/src/widgets/__tests__/__snapshots__/group.test.tsx.snap +0 -1211
  336. package/src/widgets/__tests__/__snapshots__/iframe.test.ts.snap +0 -61
  337. package/src/widgets/__tests__/__snapshots__/image.test.ts.snap +0 -378
  338. package/src/widgets/__tests__/__snapshots__/input-number.test.ts.snap +0 -495
  339. package/src/widgets/__tests__/__snapshots__/interaction.test.ts.snap +0 -292
  340. package/src/widgets/__tests__/__snapshots__/interactive-graph.test.ts.snap +0 -2889
  341. package/src/widgets/__tests__/__snapshots__/matcher.test.tsx.snap +0 -883
  342. package/src/widgets/__tests__/__snapshots__/matrix.test.ts.snap +0 -514
  343. package/src/widgets/__tests__/__snapshots__/number-line.test.ts.snap +0 -814
  344. package/src/widgets/__tests__/__snapshots__/numeric-input.test.ts.snap +0 -470
  345. package/src/widgets/__tests__/__snapshots__/orderer.test.ts.snap +0 -243
  346. package/src/widgets/__tests__/__snapshots__/passage-ref.test.ts.snap +0 -434
  347. package/src/widgets/__tests__/__snapshots__/passage.test.tsx.snap +0 -1956
  348. package/src/widgets/__tests__/__snapshots__/plotter.test.tsx.snap +0 -827
  349. package/src/widgets/__tests__/__snapshots__/radio.test.ts.snap +0 -4237
  350. package/src/widgets/__tests__/__snapshots__/unit.test.tsx.snap +0 -20
  351. package/src/widgets/__tests__/__snapshots__/video.test.ts.snap +0 -153
  352. package/src/widgets/__tests__/categorizer.test.ts +0 -203
  353. package/src/widgets/__tests__/cs-program.test.ts +0 -43
  354. package/src/widgets/__tests__/definition.test.ts +0 -136
  355. package/src/widgets/__tests__/dropdown.test.ts +0 -105
  356. package/src/widgets/__tests__/explanation.test.ts +0 -198
  357. package/src/widgets/__tests__/expression-mobile.test.tsx +0 -363
  358. package/src/widgets/__tests__/expression.test.tsx +0 -484
  359. package/src/widgets/__tests__/graded-group-set-jipt.test.ts +0 -30
  360. package/src/widgets/__tests__/graded-group-set.test.ts +0 -288
  361. package/src/widgets/__tests__/graded-group.test.ts +0 -232
  362. package/src/widgets/__tests__/grapher.cypress.ts +0 -576
  363. package/src/widgets/__tests__/grapher.test.ts +0 -33
  364. package/src/widgets/__tests__/group.test.tsx +0 -510
  365. package/src/widgets/__tests__/iframe.test.ts +0 -45
  366. package/src/widgets/__tests__/image.test.ts +0 -62
  367. package/src/widgets/__tests__/input-number.test.ts +0 -354
  368. package/src/widgets/__tests__/interaction.test.ts +0 -31
  369. package/src/widgets/__tests__/interactive-graph.cypress.ts +0 -815
  370. package/src/widgets/__tests__/interactive-graph.test.ts +0 -106
  371. package/src/widgets/__tests__/matcher.test.tsx +0 -176
  372. package/src/widgets/__tests__/matrix.test.ts +0 -82
  373. package/src/widgets/__tests__/number-line.test.ts +0 -79
  374. package/src/widgets/__tests__/numeric-input.test.ts +0 -575
  375. package/src/widgets/__tests__/orderer.test.ts +0 -73
  376. package/src/widgets/__tests__/passage-ref.test.ts +0 -168
  377. package/src/widgets/__tests__/passage.test.tsx +0 -224
  378. package/src/widgets/__tests__/plotter.test.tsx +0 -69
  379. package/src/widgets/__tests__/radio/base-radio.test.tsx +0 -470
  380. package/src/widgets/__tests__/radio/choice-icon.test.tsx +0 -90
  381. package/src/widgets/__tests__/radio/choice.test.tsx +0 -310
  382. package/src/widgets/__tests__/radio/focus-ring.test.tsx +0 -22
  383. package/src/widgets/__tests__/radio/option-status.test.tsx +0 -77
  384. package/src/widgets/__tests__/radio.test.ts +0 -807
  385. package/src/widgets/__tests__/randomizers.test.ts +0 -53
  386. package/src/widgets/__tests__/renderQuestion.tsx +0 -101
  387. package/src/widgets/__tests__/unit.test.tsx +0 -168
  388. package/src/widgets/__tests__/video.test.ts +0 -69
  389. package/src/widgets/categorizer.tsx +0 -344
  390. package/src/widgets/cs-program.tsx +0 -227
  391. package/src/widgets/definition.tsx +0 -121
  392. package/src/widgets/deprecated-standin/__stories__/deprecated-standin.stories.tsx +0 -30
  393. package/src/widgets/deprecated-standin/__tests__/__snapshots__/deprecated-standin.test.ts.snap +0 -70
  394. package/src/widgets/deprecated-standin/__tests__/deprecated-standin.test.ts +0 -93
  395. package/src/widgets/deprecated-standin/index.tsx +0 -58
  396. package/src/widgets/dropdown.tsx +0 -142
  397. package/src/widgets/explanation.tsx +0 -317
  398. package/src/widgets/expression.tsx +0 -707
  399. package/src/widgets/graded-group-answer-bar.tsx +0 -142
  400. package/src/widgets/graded-group-set.tsx +0 -338
  401. package/src/widgets/graded-group.tsx +0 -471
  402. package/src/widgets/grapher/util.tsx +0 -799
  403. package/src/widgets/grapher.tsx +0 -660
  404. package/src/widgets/group.tsx +0 -195
  405. package/src/widgets/iframe.tsx +0 -195
  406. package/src/widgets/image.tsx +0 -312
  407. package/src/widgets/input-number.tsx +0 -412
  408. package/src/widgets/interaction/arrow-picker.tsx +0 -38
  409. package/src/widgets/interaction/color-picker.tsx +0 -69
  410. package/src/widgets/interaction/dash-picker.tsx +0 -45
  411. package/src/widgets/interaction/element-container.tsx +0 -100
  412. package/src/widgets/interaction.tsx +0 -826
  413. package/src/widgets/interactive-graph.tsx +0 -2597
  414. package/src/widgets/label-image/__stories__/answer-choices.stories.tsx +0 -91
  415. package/src/widgets/label-image/__stories__/answer-pill.stories.tsx +0 -62
  416. package/src/widgets/label-image/__stories__/marker.stories.tsx +0 -171
  417. package/src/widgets/label-image/__tests__/answer-pill.test.tsx +0 -75
  418. package/src/widgets/label-image/__tests__/hide-answers-toggle.test.tsx +0 -39
  419. package/src/widgets/label-image/answer-choices.tsx +0 -88
  420. package/src/widgets/label-image/answer-pill.tsx +0 -103
  421. package/src/widgets/label-image/hide-answers-toggle.tsx +0 -40
  422. package/src/widgets/label-image/marker.tsx +0 -268
  423. package/src/widgets/label-image/strings.ts +0 -5
  424. package/src/widgets/label-image/types.ts +0 -27
  425. package/src/widgets/label-image.test.ts +0 -928
  426. package/src/widgets/label-image.tsx +0 -819
  427. package/src/widgets/lights-puzzle.tsx +0 -359
  428. package/src/widgets/matcher.tsx +0 -298
  429. package/src/widgets/matrix.tsx +0 -634
  430. package/src/widgets/measurer.tsx +0 -222
  431. package/src/widgets/molecule/__tests__/layout.test.ts +0 -162
  432. package/src/widgets/molecule/__tests__/parser.test.ts +0 -155
  433. package/src/widgets/molecule/molecule-drawing.ts +0 -173
  434. package/src/widgets/molecule/molecule-layout.ts +0 -362
  435. package/src/widgets/molecule/smiles-parser.ts +0 -296
  436. package/src/widgets/molecule.tsx +0 -172
  437. package/src/widgets/number-line.tsx +0 -862
  438. package/src/widgets/numeric-input.tsx +0 -576
  439. package/src/widgets/orderer.tsx +0 -786
  440. package/src/widgets/passage/__tests__/passage-markdown.test.ts +0 -376
  441. package/src/widgets/passage/passage-markdown.tsx +0 -475
  442. package/src/widgets/passage-ref-target.tsx +0 -76
  443. package/src/widgets/passage-ref.tsx +0 -213
  444. package/src/widgets/passage.tsx +0 -582
  445. package/src/widgets/plotter.tsx +0 -1194
  446. package/src/widgets/radio/__stories__/base-radio.stories.tsx +0 -196
  447. package/src/widgets/radio/__stories__/choice-icon.stories.tsx +0 -166
  448. package/src/widgets/radio/__stories__/choice-none-above.stories.tsx +0 -40
  449. package/src/widgets/radio/__stories__/choice.stories.tsx +0 -137
  450. package/src/widgets/radio/__stories__/focus-ring.stories.tsx +0 -43
  451. package/src/widgets/radio/__stories__/option-status.stories.tsx +0 -103
  452. package/src/widgets/radio/base-radio.tsx +0 -511
  453. package/src/widgets/radio/choice-a11y-text.ts +0 -61
  454. package/src/widgets/radio/choice-icon/choice-icon.tsx +0 -218
  455. package/src/widgets/radio/choice-icon/cross-out-line.tsx +0 -51
  456. package/src/widgets/radio/choice-icon/shared-styles.ts +0 -15
  457. package/src/widgets/radio/choice-none-above.tsx +0 -56
  458. package/src/widgets/radio/choice.jsx.fixture.ts +0 -45
  459. package/src/widgets/radio/choice.tsx +0 -359
  460. package/src/widgets/radio/focus-ring.tsx +0 -57
  461. package/src/widgets/radio/option-status.tsx +0 -98
  462. package/src/widgets/radio/util.test.ts +0 -18
  463. package/src/widgets/radio/util.ts +0 -31
  464. package/src/widgets/radio/widget.tsx +0 -520
  465. package/src/widgets/radio.ts +0 -157
  466. package/src/widgets/reaction-diagram.tsx +0 -144
  467. package/src/widgets/sequence.tsx +0 -142
  468. package/src/widgets/simulator.tsx +0 -829
  469. package/src/widgets/sorter.tsx +0 -155
  470. package/src/widgets/table.tsx +0 -393
  471. package/src/widgets/unit.tsx +0 -374
  472. package/src/widgets/video-transcript-link.test.tsx +0 -213
  473. package/src/widgets/video-transcript-link.tsx +0 -84
  474. package/src/widgets/video.tsx +0 -135
  475. package/src/widgets.ts +0 -489
  476. package/src/zoom.ts +0 -555
  477. package/tsconfig-build.json +0 -26
  478. package/tsconfig-build.tsbuildinfo +0 -1
@@ -1,186 +0,0 @@
1
- /* eslint-disable react/no-unsafe */
2
- /**
3
- * Tracks the user's current selection, and exposes it to the subtree using the
4
- * function-as-children pattern.
5
- */
6
- import * as React from "react";
7
-
8
- import type {DOMHighlight, DOMRange} from "./types";
9
-
10
- export type TrackedSelection = {
11
- // The focus of the current selection - that is, the boundary point of the
12
- // selection that the user is dragging around.
13
- //
14
- // We don't simply track the full `Selection` object, which contains all of
15
- // this focus and range information and more, because the browser reuses
16
- // the global `Selection` object and mutates it, which breaks our
17
- // `shouldComponentUpdate` checks.
18
- focusNode: Node;
19
- focusOffset: number;
20
- // If the current selection maps to a valid new highlight, we cache the
21
- // highlight object here.
22
- proposedHighlight: DOMHighlight;
23
- };
24
-
25
- type Props = {
26
- // A function that builds a DOMHighlight from the given DOMRange, if
27
- // possible. If it would not currently be valid to add a highlight over the
28
- // given DOMRange, returns null.
29
- buildHighlight: (domRange: DOMRange) => DOMHighlight | null | undefined;
30
- // The function-as-children pattern: passes the tracked selection, and
31
- // whether the user is currently using their mouse to select, down the
32
- // tree.
33
- children?: (
34
- trackedSelection: TrackedSelection | null | undefined,
35
- userIsMouseSelecting: boolean,
36
- ) => React.ReactElement<any>;
37
- // If false, will not track selections.
38
- enabled: boolean;
39
- };
40
-
41
- type State = {
42
- // The current state of the mouse button. We distinguish between down,
43
- // down and the selection has changed since going down, and up.
44
- mouseState: "down" | "down-and-selecting" | "up";
45
- // The current TrackedSelection, if any.
46
- trackedSelection: TrackedSelection | null | undefined;
47
- };
48
-
49
- class SelectionTracker extends React.PureComponent<Props, State> {
50
- state: State = {
51
- mouseState: "up",
52
- trackedSelection: null,
53
- };
54
-
55
- componentDidMount() {
56
- this._updateListeners(false, this.props.enabled);
57
- }
58
-
59
- componentDidUpdate(prevProps: Props) {
60
- if (this.props.buildHighlight !== prevProps.buildHighlight) {
61
- // The highlight-building function changed, so the
62
- // proposedHighlight we built with it might be different, or no
63
- // longer be valid. Update accordingly.
64
- this._updateTrackedSelection();
65
- }
66
-
67
- this._updateListeners(prevProps.enabled, this.props.enabled);
68
- }
69
-
70
- componentWillUnmount() {
71
- this._updateListeners(this.props.enabled, false);
72
- }
73
-
74
- _updateListeners(wasListening: boolean, willListen: boolean) {
75
- if (!wasListening && willListen) {
76
- window.addEventListener("mousedown", this._handleMouseDown);
77
- window.addEventListener("mouseup", this._handleMouseUp);
78
- document.addEventListener(
79
- "selectionchange",
80
- this._handleSelectionChange,
81
- );
82
- } else if (wasListening && !willListen) {
83
- window.removeEventListener("mousedown", this._handleMouseDown);
84
- window.removeEventListener("mouseup", this._handleMouseUp);
85
- document.removeEventListener(
86
- "selectionchange",
87
- this._handleSelectionChange,
88
- );
89
-
90
- // Additionally, reset the state, to guard against errors where we
91
- // re-enter listening mode and have stale values stored.
92
- this.setState({
93
- mouseState: "up",
94
- trackedSelection: null,
95
- });
96
- }
97
- }
98
-
99
- /**
100
- * Get the current selection focus and range, if present and non-collapsed.
101
- *
102
- * Otherwise, if there is no current selection or it's collapsed, return
103
- * null.
104
- */
105
- _computeFocusAndRange():
106
- | {
107
- focusNode: Node;
108
- focusOffset: number;
109
- range: DOMRange;
110
- }
111
- | null
112
- | undefined {
113
- const selection = document.getSelection();
114
- if (!selection || selection.rangeCount === 0) {
115
- return null;
116
- }
117
-
118
- const range = selection.getRangeAt(0);
119
- if (range.collapsed) {
120
- return null;
121
- }
122
-
123
- // NOTE(mdr): The focus node is guaranteed to exist, because
124
- // there's a range, but the type annotations for
125
- // Selection don't know that. Cast it ourselves.
126
- const focusNode: Node = selection.focusNode as any;
127
- const focusOffset = selection.focusOffset;
128
- return {focusNode, focusOffset, range};
129
- }
130
-
131
- /**
132
- * Compute and update the TrackedSelection to reflect the document state.
133
- */
134
- _updateTrackedSelection(): void {
135
- const focusAndRange = this._computeFocusAndRange();
136
- if (!focusAndRange) {
137
- this.setState({trackedSelection: null});
138
- return;
139
- }
140
-
141
- const {focusNode, focusOffset, range} = focusAndRange;
142
- const proposedHighlight = this.props.buildHighlight(range);
143
- if (!proposedHighlight) {
144
- this.setState({trackedSelection: null});
145
- return;
146
- }
147
-
148
- const trackedSelection = {
149
- focusNode,
150
- focusOffset,
151
- proposedHighlight,
152
- } as const;
153
- this.setState({trackedSelection});
154
- }
155
-
156
- _handleSelectionChange: () => void = () => {
157
- this._updateTrackedSelection();
158
-
159
- if (this.state.mouseState === "down") {
160
- this.setState({
161
- mouseState: "down-and-selecting",
162
- });
163
- }
164
- };
165
-
166
- _handleMouseDown: () => void = () => {
167
- this.setState({mouseState: "down"});
168
- };
169
-
170
- _handleMouseUp: () => void = () => {
171
- this.setState({mouseState: "up"});
172
- };
173
-
174
- render(): null | React.ReactElement<React.ComponentProps<"div">> {
175
- const {mouseState, trackedSelection} = this.state;
176
- const userIsMouseSelecting = mouseState === "down-and-selecting";
177
-
178
- return this.props.children ? (
179
- <div>
180
- {this.props.children(trackedSelection, userIsMouseSelecting)}
181
- </div>
182
- ) : null;
183
- }
184
- }
185
-
186
- export default SelectionTracker;
@@ -1,21 +0,0 @@
1
- // Import the DOM-related types from the parent directory, and re-export them
2
- // to the UI code.
3
- import type {DOMHighlight, DOMHighlightSet, DOMRange} from "../types";
4
-
5
- export type {DOMHighlight, DOMHighlightSet, DOMRange};
6
-
7
- export type Position = {
8
- left: number;
9
- top: number;
10
- };
11
-
12
- export type Rect = Position & {
13
- width: number;
14
- height: number;
15
- };
16
-
17
- // TODO(mdr): Is this way of passing around `z-index: 0` actually worth the
18
- // trouble? We used to have more, but now we don't need them...
19
- export type ZIndexes = {
20
- belowContent: number;
21
- };
@@ -1,165 +0,0 @@
1
- /**
2
- * Utility functions for highlighting UI.
3
- */
4
- import {rangesOverlap, intersectRanges} from "../ranges";
5
-
6
- import type {DOMRange, Position, Rect} from "./types";
7
-
8
- /**
9
- * Given two positions relative to the same origin, return `child`'s position
10
- * relative to `parent`'s position.
11
- */
12
- export function getRelativePosition(
13
- child: Position,
14
- parent: Position,
15
- ): Position {
16
- return {
17
- left: child.left - parent.left,
18
- top: child.top - parent.top,
19
- };
20
- }
21
-
22
- /**
23
- * `getRelativePosition`, but for Rects.
24
- *
25
- * Given a rectangle and a position relative to the same origin, return a new
26
- * rectangle of the same size, whose position is relative to the given
27
- * position.
28
- */
29
- export function getRelativeRect(
30
- {left, top, width, height}: Rect,
31
- parent: Position,
32
- ): Rect {
33
- return {
34
- ...getRelativePosition({left, top}, parent),
35
- width,
36
- height,
37
- };
38
- }
39
-
40
- /**
41
- * Given a DOMRange, return a list of client-relative rects that cover the text
42
- * inside the DOMRange.
43
- *
44
- * This behaves differently than the browser's built-in `getClientRects` method
45
- * for DOMRanges, because this method only gets rects for the *text* nodes,
46
- * whereas the browser's method will also return rects for any fully-contained
47
- * *element* nodes.
48
- *
49
- * For example, if an entire paragraph is selected, then `getClientRects` will
50
- * return a rectangle that covers the entire paragraph block, whereas this
51
- * method will only return rectangles for the text inside the paragraph.
52
- */
53
- export function getClientRectsForTextInRange(
54
- range: DOMRange,
55
- ): ReadonlyArray<Rect> {
56
- const mutableRects = [];
57
- addClientRectsForTextInNodeAndRange(
58
- range.commonAncestorContainer,
59
- range,
60
- mutableRects,
61
- );
62
- return mutableRects;
63
- }
64
-
65
- /**
66
- * A helper method for getClientRectsForTextInRange.
67
- *
68
- * Given a node and a range, find text that is contained within both the node
69
- * and the range by recursing down the node's subtree, and push the text's
70
- * client rects onto the given `mutableRects` array.
71
- */
72
- function addClientRectsForTextInNodeAndRange(
73
- node: Node,
74
- range: DOMRange,
75
- mutableRects: Array<Rect>,
76
- ): void {
77
- const nodeContentsRange = new Range();
78
- nodeContentsRange.selectNodeContents(node);
79
-
80
- if (node.nodeType === Node.TEXT_NODE) {
81
- // Get the text that appears both in this text node and in the range
82
- // we're searching.
83
- const intersectedRange = intersectRanges(range, nodeContentsRange);
84
- if (intersectedRange) {
85
- addClientRectsForText(node, intersectedRange, mutableRects);
86
- }
87
- } else if (node.nodeType === Node.ELEMENT_NODE) {
88
- // Don't bother deep-traversing a node that doesn't even overlap the
89
- // range we're searching.
90
- if (!rangesOverlap(range, nodeContentsRange)) {
91
- return;
92
- }
93
-
94
- // NOTE(mdr): Safari returns a non-iterable `childNodes` object, so
95
- // convert it to an array.
96
- for (const child of Array.from(node.childNodes)) {
97
- // TODO(mdr): If this parent has overflow: hidden, bound the child
98
- // rects accordingly. This would allow us to remove the hack
99
- // we added to .perseus-sr-only.
100
- addClientRectsForTextInNodeAndRange(child, range, mutableRects);
101
- }
102
- }
103
- }
104
-
105
- /**
106
- * Given a DOMRange of text fully contained by the given `textNode`, compute
107
- * rectangles that visually cover the range, and push them onto the given
108
- * `mutableRects` array.
109
- *
110
- * This function adjusts the rectangles to the line height of the text, to
111
- * match the visual behavior of native text selection, and remove annoying gaps
112
- * between lines that disrupt hover behavior.
113
- */
114
- function addClientRectsForText(
115
- textNode: Node,
116
- textRange: DOMRange,
117
- mutableRects: Array<Rect>,
118
- ): void {
119
- const parentElement = textNode.parentElement;
120
- // @ts-expect-error - TS2345 - Argument of type 'HTMLElement | null' is not assignable to parameter of type 'Element'.
121
- const computedStyle = window.getComputedStyle(parentElement);
122
-
123
- // NOTE(mdr): I'm not sure how computed line height works in all contexts
124
- // in all browsers. It's valid to specify line height as a ratio,
125
- // relative to font size. Latest Chrome seems to transform this into a
126
- // px value, but maybe some browsers don't, so I'm being defensive here
127
- // and only using the computed line height if it's explicitly a px
128
- // value. We could also handle other browsers by computing font size
129
- // and doing the math ourselves, but let's punt that until we need it.
130
- let lineHeight = null;
131
- if (
132
- typeof computedStyle.lineHeight === "string" &&
133
- computedStyle.lineHeight.endsWith("px")
134
- ) {
135
- const parsedLineHeight = parseFloat(computedStyle.lineHeight);
136
- if (!isNaN(parsedLineHeight)) {
137
- // @ts-expect-error - TS2322 - Type 'number' is not assignable to type 'null'.
138
- lineHeight = parsedLineHeight;
139
- }
140
- }
141
-
142
- // NOTE(mdr): Safari returns a non-iterable `getClientRects` object, so
143
- // convert it to an array.
144
- const boundingRects = Array.from(textRange.getClientRects());
145
-
146
- for (const boundingRect of boundingRects) {
147
- const rect: Rect = {
148
- left: boundingRect.left,
149
- top: boundingRect.top,
150
- height: boundingRect.height,
151
- width: boundingRect.width,
152
- };
153
-
154
- // Adjust the rectangle according to the text's line height. It should
155
- // keep the same bottom coordinate, so the top coordinate will move
156
- // accordingly.
157
- if (lineHeight !== null) {
158
- const heightIncrease = lineHeight - rect.height;
159
- rect.top -= heightIncrease;
160
- rect.height = lineHeight;
161
- }
162
-
163
- mutableRects.push(rect);
164
- }
165
- }
@@ -1,152 +0,0 @@
1
- /**
2
- * This component, whenever its content updates, traverses the DOM to find
3
- * semantic words and send the corresponding DOMRanges to the caller via a
4
- * callback.
5
- *
6
- * A "word" here is a sequence of non-whitespace text characters, uninterrupted
7
- * by the start/end of a non-inline element. That is, a word can span across
8
- * text nodes and inline tags like <b>, but cannot span across block
9
- * paragraphs.
10
- *
11
- * The words yielded by WordIndexer are sorted in document order, which makes
12
- * them amenable to binary search - see `findBoundaryWordIndex` in ranges.js.
13
- */
14
- import * as React from "react";
15
-
16
- import {Errors} from "../../logging/log";
17
- import {PerseusError} from "../../perseus-error";
18
-
19
- import type {DOMRange} from "./types";
20
-
21
- type Props = {
22
- // The content to display and traverse in search of words.
23
- children?: React.ReactElement<any>;
24
- // After each mount and update, this callback is called with the list of
25
- // word ranges in `children`'s DOM, sorted in document order.
26
- onWordsUpdate: (wordRanges: ReadonlyArray<DOMRange>) => unknown;
27
- };
28
-
29
- class WordIndexer extends React.PureComponent<Props> {
30
- _container: HTMLElement | null | undefined;
31
- /* eslint-enable react/sort-comp */
32
-
33
- componentDidMount() {
34
- this._sendWordsUpdate();
35
- }
36
-
37
- componentDidUpdate() {
38
- this._sendWordsUpdate();
39
- }
40
-
41
- _sendWordsUpdate() {
42
- this.props.onWordsUpdate(this._getWordRanges());
43
- }
44
-
45
- _getWordRanges(): ReadonlyArray<DOMRange> {
46
- const container = this._container;
47
-
48
- if (!container) {
49
- throw new PerseusError(
50
- "invariant violation: `this._container` is not defined, but " +
51
- "this method is only called after mount/update",
52
- Errors.NotAllowed,
53
- );
54
- }
55
-
56
- // Create a TreeWalker that visits text nodes and element nodes.
57
- // We select the types of nodes we're interested in by bitwise-ORing
58
- // the desired filters together.
59
- const treeWalker = container.ownerDocument.createTreeWalker(
60
- container,
61
- NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT,
62
- () => NodeFilter.FILTER_ACCEPT,
63
- // @ts-expect-error - TS2554 - Expected 1-3 arguments, but got 4.
64
- false,
65
- );
66
-
67
- // Traverse the container's descendant text nodes in DOM order,
68
- // indexing the words we find.
69
- const index: Array<Range> = [];
70
- let trailingWordRange = null;
71
- while (treeWalker.nextNode()) {
72
- const node = treeWalker.currentNode;
73
-
74
- if (node.nodeType === Node.ELEMENT_NODE) {
75
- const element: Element = node as any;
76
- if (getComputedStyle(element).display !== "inline") {
77
- // Block-level elements interrupt text words, so set the
78
- // current trailing word to `null`.
79
- //
80
- // This includes exiting one paragraph to visit another,
81
- // but also includes text interrupted by inline-block
82
- // elements.
83
- //
84
- // TODO(mdr): Is this behavior *generalizably* correct?
85
- // TODO(mdr): I don't *fully* understand the performance
86
- // implications of `getComputedStyle`, but I think it's
87
- // gonna be nbd at the current call sites. If we try to
88
- // generalize to frequently-updating content, we might
89
- // want to watch this as a potential performance
90
- // bottleneck.
91
- trailingWordRange = null;
92
- }
93
- } else if (node.nodeType === Node.TEXT_NODE) {
94
- const text = node.nodeValue;
95
-
96
- // A "word" is here simply defined as a maximal-length
97
- // substring of non-space characters.
98
- //
99
- // Loop over all the words in the string, by repeatedly calling
100
- // `wordPattern.exec(text)`.
101
- const wordPattern = /\S+/g;
102
- let wordMatch;
103
- let newTrailingWordRange = null;
104
- // @ts-expect-error - TS2345 - Argument of type 'string | null' is not assignable to parameter of type 'string'.
105
- while ((wordMatch = wordPattern.exec(text)) !== null) {
106
- const startOffset = wordMatch.index;
107
- const endOffset = wordMatch.index + wordMatch[0].length;
108
-
109
- let range;
110
- if (startOffset === 0 && trailingWordRange) {
111
- // This word is at the start of this text node, and
112
- // there's a trailing word from the previous text node,
113
- // and there was no non-inline element between them.
114
- // This word and the trailing word are probably
115
- // intended to be two parts of the same word.
116
- //
117
- // So, instead of creating a new word range, we add
118
- // this word to the previous range by extending it.
119
- range = trailingWordRange;
120
- range.setEnd(node, endOffset);
121
- } else {
122
- // Otherwise, start a new word range here, and add it
123
- // to the list.
124
- // @ts-expect-error - TS2531 - Object is possibly 'null'.
125
- range = node.ownerDocument.createRange();
126
- range.setStart(node, startOffset);
127
- range.setEnd(node, endOffset);
128
- index.push(range);
129
- }
130
-
131
- // @ts-expect-error - TS2531 - Object is possibly 'null'.
132
- if (endOffset === text.length) {
133
- newTrailingWordRange = range;
134
- }
135
- }
136
- trailingWordRange = newTrailingWordRange;
137
- }
138
- }
139
-
140
- return index;
141
- }
142
-
143
- render(): React.ReactNode {
144
- return (
145
- <div ref={(container) => (this._container = container)}>
146
- {this.props.children}
147
- </div>
148
- );
149
- }
150
- }
151
-
152
- export default WordIndexer;
@@ -1,167 +0,0 @@
1
- import {StyleSheet, css} from "aphrodite";
2
- import * as React from "react";
3
-
4
- import * as constants from "../styles/constants";
5
-
6
- // Displays a stylized open eye: lint warnings are visible
7
- const VisibleIcon = () => (
8
- <svg
9
- width="24"
10
- height="24"
11
- viewBox="0 0 24 24"
12
- className={css(styles.icon)}
13
- >
14
- <defs>
15
- <path
16
- id="a"
17
- d={
18
- "M7.401 10.035c-1.424.748-2.599 1.905-3.544 " +
19
- "3.48a1 1 0 0 1-1.714-1.03C4.325 8.849 7.652 7 " +
20
- "12 7c4.348 0 7.675 1.848 9.857 5.486a1 1 0 0 " +
21
- "1-1.714 1.028c-.945-1.574-2.12-2.73-3.544-" +
22
- "3.48a5 5 0 1 1-9.198 0zM12 15a3 3 0 1 0 0-6 3 3 " +
23
- "0 0 0 0 6z"
24
- }
25
- />
26
- </defs>
27
- <g fill="none" fillRule="evenodd">
28
- <path fill="none" d="M0 0h24v24H0z" />
29
- <mask id="b" fill="#fff">
30
- <use href="#a" />
31
- </mask>
32
- <use fill="#fff" fillRule="nonzero" href="#a" />
33
- <g fill="#fff" mask="url(#b)">
34
- <path d="M0 0h24v24H0z" />
35
- </g>
36
- </g>
37
- </svg>
38
- );
39
-
40
- // Displays a stylized eye with a line through it: I don't want to see lint
41
- const HiddenIcon = () => (
42
- <svg
43
- width="24"
44
- height="24"
45
- viewBox="0 0 24 24"
46
- className={css(styles.icon)}
47
- >
48
- <defs>
49
- <path
50
- id="a"
51
- d={
52
- "M8.794 7.38C9.791 7.127 10.86 7 12 7c4.348 0 " +
53
- "7.675 1.848 9.857 5.486a1 1 0 0 1-1.714 " +
54
- "1.028c-.945-1.574-2.12-2.73-3.544-3.48.258." +
55
- "604.401 1.268.401 1.966 0 1.02-.305 " +
56
- "1.967-.828 2.757l2.535 2.536a1 1 0 0 " +
57
- "1-1.414 1.414l-12-12a1 1 0 0 1 " +
58
- "1.414-1.414L8.794 7.38zm5.914 5.913a3 3 0 0 " +
59
- "0-4.001-4.001l4 4.001zM6.072 8.486l2.976 " +
60
- "2.976a3 3 0 0 0 3.49 3.49l1.579 1.58A5 5 0 " +
61
- "0 1 7.4 10.035c-1.424.747-2.599 1.904-3.544 " +
62
- "3.478a1 1 0 0 1-1.714-1.028c1.049-1.75 " +
63
- "2.363-3.085 3.929-4z"
64
- }
65
- />
66
- </defs>
67
- <g fill="none" fillRule="evenodd">
68
- <path fill="none" d="M0 0h24v24H0z" />
69
- <mask id="b" fill="#fff">
70
- <use href="#a" />
71
- </mask>
72
- <use fill="#fff" fillRule="nonzero" href="#a" />
73
- <g fill="#fff" mask="url(#b)">
74
- <path d="M0 0h24v24H0z" />
75
- </g>
76
- </g>
77
- </svg>
78
- );
79
-
80
- type Props = {
81
- message: string;
82
- enabled: boolean;
83
- onClick: () => void;
84
- fixedPosition?: boolean;
85
- };
86
-
87
- const HUD = ({message, enabled, onClick, fixedPosition = true}: Props) => {
88
- let state;
89
- let icon;
90
- if (enabled) {
91
- state = styles.enabled;
92
- icon = <VisibleIcon />;
93
- } else {
94
- state = styles.disabled;
95
- icon = <HiddenIcon />;
96
- }
97
-
98
- return (
99
- <button
100
- className={css(
101
- styles.hud,
102
- fixedPosition && styles.hudFixedPosition,
103
- state,
104
- )}
105
- onClick={(e) => {
106
- onClick();
107
- }}
108
- >
109
- {icon}
110
- {message}
111
- </button>
112
- );
113
- };
114
-
115
- const styles = StyleSheet.create({
116
- hud: {
117
- boxSizing: "border-box",
118
- height: 36,
119
- padding: "9px 16px",
120
- borderRadius: 18,
121
- fontFamily: constants.boldFontFamily,
122
- fontSize: "15px",
123
- lineHeight: "18px",
124
- color: constants.white,
125
- userSelect: "none",
126
- borderWidth: 0, // <button> gives us a border by default
127
- },
128
-
129
- // We want to render the element in-place in our fixtures, so allow us to
130
- // render in the bottom corner in production and in-place in testing.
131
- hudFixedPosition: {
132
- bottom: 20,
133
- position: "fixed",
134
- right: 20,
135
- zIndex: 1,
136
- },
137
-
138
- icon: {
139
- width: 24,
140
- height: 24,
141
- marginRight: 8,
142
- marginTop: -3,
143
- verticalAlign: "middle",
144
- },
145
-
146
- enabled: {
147
- backgroundColor: constants.warningColor,
148
- ":hover": {
149
- backgroundColor: constants.warningColorHover,
150
- },
151
- ":active": {
152
- backgroundColor: constants.warningColorActive,
153
- },
154
- },
155
-
156
- disabled: {
157
- backgroundColor: constants.gray76,
158
- ":hover": {
159
- backgroundColor: "#a1a5a9", // in between those two grays
160
- },
161
- ":active": {
162
- backgroundColor: constants.gray68,
163
- },
164
- },
165
- });
166
-
167
- export default HUD;