@khanacademy/perseus 0.0.1 → 0.1.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 (503) hide show
  1. package/.babelrc.js +1 -1
  2. package/CHANGELOG.md +7 -0
  3. package/dist/es/index.js +15 -1
  4. package/dist/es/index.js.map +1 -1
  5. package/dist/index.css +11934 -0
  6. package/dist/index.js +15 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/strings.js +148 -1
  9. package/package.json +40 -4
  10. package/src/README.md +7 -0
  11. package/src/__stories__/item-renderer.stories.jsx +27 -0
  12. package/src/__stories__/server-item-renderer.stories.jsx +27 -0
  13. package/src/__testdata__/item-renderer_testdata.js +161 -0
  14. package/src/__testdata__/renderer_testdata.js +123 -0
  15. package/src/__tests__/__snapshots__/item-renderer_test.jsx.snap +233 -0
  16. package/src/__tests__/__snapshots__/perseus-markdown_test.jsx.snap +516 -0
  17. package/src/__tests__/__snapshots__/pure-markdown_test.js.snap +113 -0
  18. package/src/__tests__/__snapshots__/renderer_test.jsx.snap +576 -0
  19. package/src/__tests__/__snapshots__/server-item-renderer_test.jsx.snap +306 -0
  20. package/src/__tests__/a11y_test.jsx +304 -0
  21. package/src/__tests__/item-renderer_test.jsx +892 -0
  22. package/src/__tests__/mock-asset-loading-widget.jsx +57 -0
  23. package/src/__tests__/mock-widget.jsx +35 -0
  24. package/src/__tests__/perseus-markdown_test.jsx +747 -0
  25. package/src/__tests__/pure-markdown_test.js +552 -0
  26. package/src/__tests__/renderability_test.jsx +481 -0
  27. package/src/__tests__/renderer-api_test.jsx +333 -0
  28. package/src/__tests__/renderer_test.jsx +1792 -0
  29. package/src/__tests__/server-item-renderer_test.jsx +516 -0
  30. package/src/__tests__/test-items/image-item.js +25 -0
  31. package/src/__tests__/test-items/input-number-1-item.js +27 -0
  32. package/src/__tests__/test-items/input-number-2-item.js +39 -0
  33. package/src/__tests__/test-items/table-item.js +30 -0
  34. package/src/__tests__/tex-wrangler_test.js +83 -0
  35. package/src/__tests__/util_test.js +41 -0
  36. package/src/a11y.js +46 -0
  37. package/src/all-widgets.js +9 -0
  38. package/src/article-renderer.jsx +215 -0
  39. package/src/asset-context.js +30 -0
  40. package/src/basic-widgets.js +13 -0
  41. package/src/components/__stories__/button-group.stories.jsx +61 -0
  42. package/src/components/__stories__/fixed-to-responsive.stories.jsx +132 -0
  43. package/src/components/__stories__/graph.stories.jsx +27 -0
  44. package/src/components/__stories__/graphie.stories.jsx +28 -0
  45. package/src/components/__stories__/hud.stories.jsx +36 -0
  46. package/src/components/__stories__/icon.stories.jsx +56 -0
  47. package/src/components/__stories__/image-loader.stories.jsx +60 -0
  48. package/src/components/__stories__/info-tip.stories.jsx +33 -0
  49. package/src/components/__stories__/inline-icon.stories.jsx +39 -0
  50. package/src/components/__stories__/input-with-examples.stories.jsx +51 -0
  51. package/src/components/__stories__/lint.stories.jsx +40 -0
  52. package/src/components/__stories__/math-input.stories.jsx +29 -0
  53. package/src/components/__stories__/math-output.stories.jsx +24 -0
  54. package/src/components/__stories__/multi-button-group.stories.jsx +69 -0
  55. package/src/components/__stories__/number-input.stories.jsx +42 -0
  56. package/src/components/__stories__/possible-answers.stories.jsx +22 -0
  57. package/src/components/__stories__/prop-check-box.stories.jsx +62 -0
  58. package/src/components/__stories__/range-input.stories.jsx +28 -0
  59. package/src/components/__stories__/simple-keypad-input.stories.jsx +28 -0
  60. package/src/components/__stories__/sortable.stories.jsx +73 -0
  61. package/src/components/__stories__/stub-tag-editor.stories.jsx +44 -0
  62. package/src/components/__stories__/svg-image.stories.jsx +60 -0
  63. package/src/components/__stories__/tex.stories.jsx +18 -0
  64. package/src/components/__stories__/text-buttons.stories.jsx +51 -0
  65. package/src/components/__stories__/text-input.stories.jsx +34 -0
  66. package/src/components/__stories__/text-list-editor.stories.jsx +33 -0
  67. package/src/components/__stories__/zoomable-tex.stories.jsx +39 -0
  68. package/src/components/__stories__/zoomable.stories.jsx +40 -0
  69. package/src/components/__testdata__/sorter_testdata.js +20 -0
  70. package/src/components/__tests__/__snapshots__/sortable_test.jsx.snap +79 -0
  71. package/src/components/__tests__/__snapshots__/sorter_test.jsx.snap +297 -0
  72. package/src/components/__tests__/number-input_test.jsx +112 -0
  73. package/src/components/__tests__/sortable_test.jsx +234 -0
  74. package/src/components/__tests__/sorter_test.jsx +111 -0
  75. package/src/components/__tests__/zoomable_test.jsx +388 -0
  76. package/src/components/button-group.jsx +131 -0
  77. package/src/components/constants.js +15 -0
  78. package/src/components/fixed-to-responsive.jsx +163 -0
  79. package/src/components/graph.jsx +414 -0
  80. package/src/components/graphie-classes.jsx +148 -0
  81. package/src/components/graphie-movables.jsx +342 -0
  82. package/src/components/graphie.jsx +353 -0
  83. package/src/components/highlighting/highlightable-content.jsx +245 -0
  84. package/src/components/highlighting/highlights.js +208 -0
  85. package/src/components/highlighting/ranges.js +299 -0
  86. package/src/components/highlighting/types.js +73 -0
  87. package/src/components/highlighting/ui/highlight-renderer.jsx +179 -0
  88. package/src/components/highlighting/ui/highlight-set-renderer.jsx +190 -0
  89. package/src/components/highlighting/ui/highlight-tooltip.jsx +153 -0
  90. package/src/components/highlighting/ui/highlighting-ui.jsx +163 -0
  91. package/src/components/highlighting/ui/selection-tracker.jsx +195 -0
  92. package/src/components/highlighting/ui/types.js +21 -0
  93. package/src/components/highlighting/ui/util.js +166 -0
  94. package/src/components/highlighting/word-indexer.jsx +155 -0
  95. package/src/components/hud.jsx +179 -0
  96. package/src/components/icon.jsx +149 -0
  97. package/src/components/image-loader.jsx +175 -0
  98. package/src/components/info-tip/info-tip.jsx +149 -0
  99. package/src/components/info-tip.jsx +38 -0
  100. package/src/components/inline-icon.jsx +81 -0
  101. package/src/components/input-with-examples.jsx +231 -0
  102. package/src/components/lint.jsx +456 -0
  103. package/src/components/math-input.jsx +282 -0
  104. package/src/components/math-output.jsx +128 -0
  105. package/src/components/multi-button-group.jsx +137 -0
  106. package/src/components/new-tooltip/README.md +110 -0
  107. package/src/components/new-tooltip/__stories__/flexible-position.stories.jsx +437 -0
  108. package/src/components/new-tooltip/__stories__/new-tooltip.stories.jsx +665 -0
  109. package/src/components/new-tooltip/__stories__/tooltip-arrow.stories.jsx +70 -0
  110. package/src/components/new-tooltip/__stories__/tooltip-bubble.stories.jsx +98 -0
  111. package/src/components/new-tooltip/__tests__/style-constants_test.js +8 -0
  112. package/src/components/new-tooltip/__tests__/util_test.js +47 -0
  113. package/src/components/new-tooltip/flexible-position.jsx +182 -0
  114. package/src/components/new-tooltip/new-tooltip.jsx +399 -0
  115. package/src/components/new-tooltip/style-constants.js +13 -0
  116. package/src/components/new-tooltip/tooltip-arrow.jsx +184 -0
  117. package/src/components/new-tooltip/tooltip-bubble.jsx +223 -0
  118. package/src/components/new-tooltip/tooltip-portal.jsx +101 -0
  119. package/src/components/new-tooltip/tooltip-positioner.jsx +529 -0
  120. package/src/components/new-tooltip/types.js +183 -0
  121. package/src/components/new-tooltip/util.js +27 -0
  122. package/src/components/number-input.jsx +253 -0
  123. package/src/components/possible-answers.jsx +36 -0
  124. package/src/components/prop-check-box.jsx +78 -0
  125. package/src/components/range-input.jsx +61 -0
  126. package/src/components/simple-keypad-input.jsx +91 -0
  127. package/src/components/sortable.jsx +872 -0
  128. package/src/components/stub-tag-editor.jsx +53 -0
  129. package/src/components/svg-image.jsx +762 -0
  130. package/src/components/tex-buttons.jsx +322 -0
  131. package/src/components/tex.jsx +70 -0
  132. package/src/components/text-input.jsx +82 -0
  133. package/src/components/text-list-editor.jsx +157 -0
  134. package/src/components/tooltip.jsx +395 -0
  135. package/src/components/visibility-observer/__stories__/visibility-observer.stories.jsx +140 -0
  136. package/src/components/visibility-observer/get-scroll-parent.js +45 -0
  137. package/src/components/visibility-observer/visibility-observer.js +109 -0
  138. package/src/components/visibility-observer/visibility-observer.jsx +123 -0
  139. package/src/components/zoomable-tex.jsx +70 -0
  140. package/src/components/zoomable.jsx +304 -0
  141. package/src/components.js +17 -0
  142. package/src/dependencies.js +22 -0
  143. package/src/error-boundary.jsx +48 -0
  144. package/src/extra-widgets.js +75 -0
  145. package/src/gorgon/README +40 -0
  146. package/src/gorgon/__tests__/matcher_test.js +497 -0
  147. package/src/gorgon/__tests__/rule_test.js +101 -0
  148. package/src/gorgon/__tests__/rules_test.js +487 -0
  149. package/src/gorgon/__tests__/selector-parser_test.js +52 -0
  150. package/src/gorgon/__tests__/tree-transformer_test.js +446 -0
  151. package/src/gorgon/gorgon.js +290 -0
  152. package/src/gorgon/proptypes.js +29 -0
  153. package/src/gorgon/rule.js +413 -0
  154. package/src/gorgon/rules/absolute-url.js +24 -0
  155. package/src/gorgon/rules/all-rules.js +72 -0
  156. package/src/gorgon/rules/blockquoted-math.js +10 -0
  157. package/src/gorgon/rules/blockquoted-widget.js +10 -0
  158. package/src/gorgon/rules/double-spacing-after-terminal.js +12 -0
  159. package/src/gorgon/rules/extra-content-spacing.js +12 -0
  160. package/src/gorgon/rules/heading-level-1.js +14 -0
  161. package/src/gorgon/rules/heading-level-skip.js +20 -0
  162. package/src/gorgon/rules/heading-sentence-case.js +11 -0
  163. package/src/gorgon/rules/heading-title-case.js +63 -0
  164. package/src/gorgon/rules/image-alt-text.js +21 -0
  165. package/src/gorgon/rules/image-in-table.js +10 -0
  166. package/src/gorgon/rules/image-spaces-around-urls.js +35 -0
  167. package/src/gorgon/rules/image-widget.js +50 -0
  168. package/src/gorgon/rules/link-click-here.js +11 -0
  169. package/src/gorgon/rules/lint-utils.js +48 -0
  170. package/src/gorgon/rules/long-paragraph.js +14 -0
  171. package/src/gorgon/rules/math-adjacent.js +10 -0
  172. package/src/gorgon/rules/math-align-extra-break.js +11 -0
  173. package/src/gorgon/rules/math-align-linebreaks.js +43 -0
  174. package/src/gorgon/rules/math-empty.js +10 -0
  175. package/src/gorgon/rules/math-font-size.js +12 -0
  176. package/src/gorgon/rules/math-frac.js +10 -0
  177. package/src/gorgon/rules/math-nested.js +11 -0
  178. package/src/gorgon/rules/math-starts-with-space.js +12 -0
  179. package/src/gorgon/rules/math-text-empty.js +10 -0
  180. package/src/gorgon/rules/math-without-dollars.js +14 -0
  181. package/src/gorgon/rules/nested-lists.js +11 -0
  182. package/src/gorgon/rules/profanity.js +10 -0
  183. package/src/gorgon/rules/table-missing-cells.js +20 -0
  184. package/src/gorgon/rules/unbalanced-code-delimiters.js +14 -0
  185. package/src/gorgon/rules/unescaped-dollar.js +10 -0
  186. package/src/gorgon/rules/widget-in-table.js +10 -0
  187. package/src/gorgon/selector.js +506 -0
  188. package/src/gorgon/tree-transformer.js +588 -0
  189. package/src/hint-renderer.jsx +159 -0
  190. package/src/hints-renderer.jsx +359 -0
  191. package/src/icon-paths.js +120 -0
  192. package/src/index.js +149 -2
  193. package/src/init.js +49 -0
  194. package/src/interaction-tracker.js +60 -0
  195. package/src/interactive2/__tests__/movable-mock.js +48 -0
  196. package/src/interactive2/__tests__/movable-point_test.js +146 -0
  197. package/src/interactive2/interactive-util.js +152 -0
  198. package/src/interactive2/movable-helper-methods.js +160 -0
  199. package/src/interactive2/movable-line-options.js +392 -0
  200. package/src/interactive2/movable-line.js +322 -0
  201. package/src/interactive2/movable-point-options.js +190 -0
  202. package/src/interactive2/movable-point.jsx +604 -0
  203. package/src/interactive2/movable-polygon-options.js +351 -0
  204. package/src/interactive2/movable-polygon.js +367 -0
  205. package/src/interactive2/movable.js +273 -0
  206. package/src/interactive2/objective_.js +79 -0
  207. package/src/interactive2/types.js +3 -0
  208. package/src/interactive2/wrapped-defaults.js +86 -0
  209. package/src/interactive2/wrapped-ellipse.js +87 -0
  210. package/src/interactive2/wrapped-line.js +109 -0
  211. package/src/interactive2/wrapped-path.js +47 -0
  212. package/src/interactive2.js +91 -0
  213. package/src/item-renderer.jsx +518 -0
  214. package/src/item-version.js +12 -0
  215. package/src/jipt-paragraphs.js +44 -0
  216. package/src/jquery.mobile.vmouse.js +545 -0
  217. package/src/keypad-context.js +33 -0
  218. package/src/loading-context.js +20 -0
  219. package/src/logging/log.js +107 -0
  220. package/src/logging/log_test.js +41 -0
  221. package/src/mixins/changeable.jsx +115 -0
  222. package/src/mixins/editor-jsonify.jsx +13 -0
  223. package/src/mixins/provide-keypad.jsx +131 -0
  224. package/src/mixins/widget-jsonify-deprecated.jsx +23 -0
  225. package/src/mixins/widget-prop-blacklist.js +36 -0
  226. package/src/multi-items/__stories__/multi-renderer.stories.js +88 -0
  227. package/src/multi-items/__testdata__/multi-renderer_testdata.js +174 -0
  228. package/src/multi-items/__tests__/__snapshots__/multi-renderer_test.js.snap +994 -0
  229. package/src/multi-items/__tests__/items_test.js +245 -0
  230. package/src/multi-items/__tests__/multi-renderer_test.js +903 -0
  231. package/src/multi-items/__tests__/prop-type-builders_test.js +134 -0
  232. package/src/multi-items/__tests__/shapes_test.js +44 -0
  233. package/src/multi-items/__tests__/trees_test.js +316 -0
  234. package/src/multi-items/item-types.js +55 -0
  235. package/src/multi-items/items.js +176 -0
  236. package/src/multi-items/multi-renderer.jsx +542 -0
  237. package/src/multi-items/prop-type-builders.js +105 -0
  238. package/src/multi-items/shape-types.js +47 -0
  239. package/src/multi-items/shapes.js +53 -0
  240. package/src/multi-items/tree-types.js +42 -0
  241. package/src/multi-items/trees.js +345 -0
  242. package/src/multi-items.js +76 -0
  243. package/src/not-gorgon.js +129 -0
  244. package/src/perseus-api.jsx +270 -0
  245. package/src/perseus-env.js +26 -0
  246. package/src/perseus-error.js +19 -0
  247. package/src/perseus-markdown.jsx +434 -0
  248. package/src/perseus-types.js +1597 -0
  249. package/src/pure-markdown.js +346 -0
  250. package/src/question-paragraph.jsx +30 -0
  251. package/src/renderability.jsx +108 -0
  252. package/src/renderer.jsx +1931 -0
  253. package/src/server-item-renderer.jsx +467 -0
  254. package/src/sigfigs.jsx +492 -0
  255. package/src/styles/articles.less +748 -0
  256. package/src/styles/constants.js +119 -0
  257. package/src/styles/global-constants.js +350 -0
  258. package/src/styles/global-styles.js +307 -0
  259. package/src/styles/khan-exercise.css +1304 -0
  260. package/src/styles/media-queries.js +48 -0
  261. package/src/styles/perseus-renderer.less +1008 -0
  262. package/src/styles/shared.js +132 -0
  263. package/src/styles/util.less +47 -0
  264. package/src/styles/variables.boostrap.less +301 -0
  265. package/src/styles/variables.less +68 -0
  266. package/src/styles/variables.shared.less +356 -0
  267. package/src/styles/widgets/categorizer.less +39 -0
  268. package/src/styles/widgets/definition.less +86 -0
  269. package/src/styles/widgets/dropdown.less +3 -0
  270. package/src/styles/widgets/expression.less +147 -0
  271. package/src/styles/widgets/graded-group.less +36 -0
  272. package/src/styles/widgets/grapher.less +11 -0
  273. package/src/styles/widgets/group.less +19 -0
  274. package/src/styles/widgets/image.less +29 -0
  275. package/src/styles/widgets/interactive-graph.less +61 -0
  276. package/src/styles/widgets/label-image.less +41 -0
  277. package/src/styles/widgets/matcher.less +8 -0
  278. package/src/styles/widgets/matrix.less +120 -0
  279. package/src/styles/widgets/measurer.less +20 -0
  280. package/src/styles/widgets/orderer.less +97 -0
  281. package/src/styles/widgets/passage.less +151 -0
  282. package/src/styles/widgets/plotter.less +33 -0
  283. package/src/styles/widgets/radio.less +52 -0
  284. package/src/styles/widgets/reaction-diagram.less +35 -0
  285. package/src/styles/widgets/sequence.less +5 -0
  286. package/src/styles/widgets/sortable.less +127 -0
  287. package/src/styles/widgets/table.less +56 -0
  288. package/src/styles/widgets/transformer.less +28 -0
  289. package/src/styles/widgets/unit.less +14 -0
  290. package/src/tex-wrangler.js +176 -0
  291. package/src/traversal.jsx +141 -0
  292. package/src/types.js +538 -0
  293. package/src/util/a11y.js +24 -0
  294. package/src/util/answer-types.js +862 -0
  295. package/src/util/answer-types_test.js +115 -0
  296. package/src/util/colors.js +94 -0
  297. package/src/util/fix-passage-refs.jsx +122 -0
  298. package/src/util/graph-utils.js +16 -0
  299. package/src/util/graphie.js +1585 -0
  300. package/src/util/interactive.js +4071 -0
  301. package/src/util/katex-preprocess.js +16 -0
  302. package/src/util/math.js +296 -0
  303. package/src/util/mobile-native-utils.js +14 -0
  304. package/src/util/mobile-native-utils_test.js +24 -0
  305. package/src/util/register-all-widgets-for-testing.js +12 -0
  306. package/src/util/scroll-utils.js +162 -0
  307. package/src/util/sizing-utils.js +46 -0
  308. package/src/util/tex.js +203 -0
  309. package/src/util/url-utils.js +36 -0
  310. package/src/util.js +990 -0
  311. package/src/version.js +11 -0
  312. package/src/widget-container.jsx +174 -0
  313. package/src/widgets/__stories__/categorizer.stories.jsx +15 -0
  314. package/src/widgets/__stories__/cs-program.stories.jsx +15 -0
  315. package/src/widgets/__stories__/definition.stories.jsx +38 -0
  316. package/src/widgets/__stories__/dropdown.stories.jsx +15 -0
  317. package/src/widgets/__stories__/explanation.stories.jsx +19 -0
  318. package/src/widgets/__stories__/expression.stories.jsx +26 -0
  319. package/src/widgets/__stories__/graded-group-set.stories.jsx +32 -0
  320. package/src/widgets/__stories__/graded-group.stories.jsx +32 -0
  321. package/src/widgets/__stories__/grapher.stories.jsx +47 -0
  322. package/src/widgets/__stories__/group.stories.jsx +15 -0
  323. package/src/widgets/__stories__/iframe.stories.jsx +15 -0
  324. package/src/widgets/__stories__/image.stories.jsx +62 -0
  325. package/src/widgets/__stories__/input-number.stories.jsx +90 -0
  326. package/src/widgets/__stories__/interaction.stories.jsx +15 -0
  327. package/src/widgets/__stories__/interactive-graph.stories.jsx +61 -0
  328. package/src/widgets/__stories__/matcher.stories.jsx +15 -0
  329. package/src/widgets/__stories__/matrix.stories.jsx +15 -0
  330. package/src/widgets/__stories__/number-line.stories.jsx +15 -0
  331. package/src/widgets/__stories__/numeric-input.stories.jsx +19 -0
  332. package/src/widgets/__stories__/orderer.stories.jsx +15 -0
  333. package/src/widgets/__stories__/passage-ref.stories.jsx +19 -0
  334. package/src/widgets/__stories__/passage.stories.jsx +19 -0
  335. package/src/widgets/__stories__/radio.stories.jsx +82 -0
  336. package/src/widgets/__stories__/sorter.stories.jsx +15 -0
  337. package/src/widgets/__stories__/transformer.stories.jsx +15 -0
  338. package/src/widgets/__stories__/video.stories.jsx +15 -0
  339. package/src/widgets/__testdata__/categorizer_testdata.js +50 -0
  340. package/src/widgets/__testdata__/cs-program_testdata.js +28 -0
  341. package/src/widgets/__testdata__/dropdown_testdata.js +34 -0
  342. package/src/widgets/__testdata__/explanation_testdata.js +56 -0
  343. package/src/widgets/__testdata__/expression_testdata.js +95 -0
  344. package/src/widgets/__testdata__/graded-group-set_testdata.js +358 -0
  345. package/src/widgets/__testdata__/graded-group_testdata.js +79 -0
  346. package/src/widgets/__testdata__/grapher_testdata.js +376 -0
  347. package/src/widgets/__testdata__/group_testdata.js +156 -0
  348. package/src/widgets/__testdata__/iframe_testdata.js +36 -0
  349. package/src/widgets/__testdata__/image_testdata.js +38 -0
  350. package/src/widgets/__testdata__/input-number_testdata.js +73 -0
  351. package/src/widgets/__testdata__/interaction_testdata.js +264 -0
  352. package/src/widgets/__testdata__/interactive-graph_testdata.js +646 -0
  353. package/src/widgets/__testdata__/matcher_testdata.js +34 -0
  354. package/src/widgets/__testdata__/matrix_testdata.js +29 -0
  355. package/src/widgets/__testdata__/number-line_testdata.js +31 -0
  356. package/src/widgets/__testdata__/numeric-input_testdata.js +266 -0
  357. package/src/widgets/__testdata__/orderer_testdata.js +58 -0
  358. package/src/widgets/__testdata__/passage-ref_testdata.js +41 -0
  359. package/src/widgets/__testdata__/passage_testdata.js +71 -0
  360. package/src/widgets/__testdata__/radio_testdata.js +210 -0
  361. package/src/widgets/__testdata__/sorter_testdata.js +20 -0
  362. package/src/widgets/__testdata__/transformer_testdata.js +109 -0
  363. package/src/widgets/__testdata__/video_testdata.js +22 -0
  364. package/src/widgets/__tests__/__snapshots__/categorizer_test.jsx.snap +928 -0
  365. package/src/widgets/__tests__/__snapshots__/cs-program_test.jsx.snap +75 -0
  366. package/src/widgets/__tests__/__snapshots__/definition_test.js.snap +99 -0
  367. package/src/widgets/__tests__/__snapshots__/dropdown_test.jsx.snap +143 -0
  368. package/src/widgets/__tests__/__snapshots__/explanation_test.js.snap +473 -0
  369. package/src/widgets/__tests__/__snapshots__/expression_test.jsx.snap +38 -0
  370. package/src/widgets/__tests__/__snapshots__/graded-group-set-jipt_test.jsx.snap +754 -0
  371. package/src/widgets/__tests__/__snapshots__/graded-group-set_test.jsx.snap +310 -0
  372. package/src/widgets/__tests__/__snapshots__/graded-group_test.jsx.snap +863 -0
  373. package/src/widgets/__tests__/__snapshots__/grapher_test.jsx.snap +2880 -0
  374. package/src/widgets/__tests__/__snapshots__/group_test.jsx.snap +1154 -0
  375. package/src/widgets/__tests__/__snapshots__/iframe_test.jsx.snap +69 -0
  376. package/src/widgets/__tests__/__snapshots__/image_test.jsx.snap +388 -0
  377. package/src/widgets/__tests__/__snapshots__/input-number_test.jsx.snap +978 -0
  378. package/src/widgets/__tests__/__snapshots__/interaction_test.jsx.snap +311 -0
  379. package/src/widgets/__tests__/__snapshots__/interactive-graph_test.jsx.snap +2915 -0
  380. package/src/widgets/__tests__/__snapshots__/matcher_test.jsx.snap +1039 -0
  381. package/src/widgets/__tests__/__snapshots__/matrix_test.jsx.snap +450 -0
  382. package/src/widgets/__tests__/__snapshots__/number-line_test.jsx.snap +888 -0
  383. package/src/widgets/__tests__/__snapshots__/numeric-input_test.jsx.snap +930 -0
  384. package/src/widgets/__tests__/__snapshots__/orderer_test.jsx.snap +275 -0
  385. package/src/widgets/__tests__/__snapshots__/passage-ref_test.jsx.snap +446 -0
  386. package/src/widgets/__tests__/__snapshots__/passage_test.jsx.snap +1988 -0
  387. package/src/widgets/__tests__/__snapshots__/radio_test.jsx.snap +7107 -0
  388. package/src/widgets/__tests__/__snapshots__/video_test.jsx.snap +163 -0
  389. package/src/widgets/__tests__/categorizer_test.jsx +205 -0
  390. package/src/widgets/__tests__/cs-program_test.jsx +45 -0
  391. package/src/widgets/__tests__/definition_test.js +152 -0
  392. package/src/widgets/__tests__/dropdown_test.jsx +106 -0
  393. package/src/widgets/__tests__/explanation_test.js +199 -0
  394. package/src/widgets/__tests__/expression_test.jsx +439 -0
  395. package/src/widgets/__tests__/graded-group-set-jipt_test.jsx +33 -0
  396. package/src/widgets/__tests__/graded-group-set_test.jsx +270 -0
  397. package/src/widgets/__tests__/graded-group_test.jsx +233 -0
  398. package/src/widgets/__tests__/grapher.cypress.jsx +486 -0
  399. package/src/widgets/__tests__/grapher_test.jsx +35 -0
  400. package/src/widgets/__tests__/group_test.jsx +512 -0
  401. package/src/widgets/__tests__/iframe_test.jsx +47 -0
  402. package/src/widgets/__tests__/image_test.jsx +65 -0
  403. package/src/widgets/__tests__/input-number_test.jsx +360 -0
  404. package/src/widgets/__tests__/interaction_test.jsx +33 -0
  405. package/src/widgets/__tests__/interactive-graph.cypress.jsx +697 -0
  406. package/src/widgets/__tests__/interactive-graph_test.jsx +105 -0
  407. package/src/widgets/__tests__/matcher_test.jsx +157 -0
  408. package/src/widgets/__tests__/matrix_test.jsx +84 -0
  409. package/src/widgets/__tests__/number-line_test.jsx +81 -0
  410. package/src/widgets/__tests__/numeric-input_test.jsx +574 -0
  411. package/src/widgets/__tests__/orderer_test.jsx +75 -0
  412. package/src/widgets/__tests__/passage-ref_test.jsx +166 -0
  413. package/src/widgets/__tests__/passage_test.jsx +133 -0
  414. package/src/widgets/__tests__/radio/base-radio_test.jsx +82 -0
  415. package/src/widgets/__tests__/radio_test.jsx +651 -0
  416. package/src/widgets/__tests__/renderQuestion.jsx +65 -0
  417. package/src/widgets/__tests__/unit_test.jsx +144 -0
  418. package/src/widgets/__tests__/video_test.jsx +55 -0
  419. package/src/widgets/categorizer.jsx +338 -0
  420. package/src/widgets/cs-program.jsx +228 -0
  421. package/src/widgets/definition.jsx +141 -0
  422. package/src/widgets/dropdown.jsx +143 -0
  423. package/src/widgets/explanation.jsx +315 -0
  424. package/src/widgets/expression.jsx +654 -0
  425. package/src/widgets/graded-group-answer-bar.jsx +152 -0
  426. package/src/widgets/graded-group-set.jsx +285 -0
  427. package/src/widgets/graded-group.jsx +448 -0
  428. package/src/widgets/grapher/util.jsx +819 -0
  429. package/src/widgets/grapher.jsx +658 -0
  430. package/src/widgets/group.jsx +213 -0
  431. package/src/widgets/iframe.jsx +199 -0
  432. package/src/widgets/image.jsx +309 -0
  433. package/src/widgets/input-number.jsx +410 -0
  434. package/src/widgets/interaction/arrow-picker.jsx +39 -0
  435. package/src/widgets/interaction/color-picker.jsx +69 -0
  436. package/src/widgets/interaction/dash-picker.jsx +46 -0
  437. package/src/widgets/interaction/element-container.jsx +97 -0
  438. package/src/widgets/interaction.jsx +742 -0
  439. package/src/widgets/interactive-graph.jsx +2821 -0
  440. package/src/widgets/label-image/__stories__/answer-choices.stories.jsx +93 -0
  441. package/src/widgets/label-image/__stories__/marker.stories.jsx +172 -0
  442. package/src/widgets/label-image/answer-choices.jsx +311 -0
  443. package/src/widgets/label-image/marker.jsx +365 -0
  444. package/src/widgets/label-image/types.js +33 -0
  445. package/src/widgets/label-image.jsx +841 -0
  446. package/src/widgets/label-image_test.js +840 -0
  447. package/src/widgets/lights-puzzle.jsx +356 -0
  448. package/src/widgets/matcher.jsx +271 -0
  449. package/src/widgets/matrix.jsx +615 -0
  450. package/src/widgets/measurer.jsx +215 -0
  451. package/src/widgets/molecule/__tests__/layout_test.jsx +159 -0
  452. package/src/widgets/molecule/__tests__/parser_test.jsx +142 -0
  453. package/src/widgets/molecule/molecule-drawing.jsx +175 -0
  454. package/src/widgets/molecule/molecule-layout.jsx +367 -0
  455. package/src/widgets/molecule/smiles-parser.jsx +300 -0
  456. package/src/widgets/molecule.jsx +172 -0
  457. package/src/widgets/number-line.jsx +858 -0
  458. package/src/widgets/numeric-input.jsx +622 -0
  459. package/src/widgets/orderer.jsx +753 -0
  460. package/src/widgets/passage/__tests__/passage-markdown_test.jsx +382 -0
  461. package/src/widgets/passage/get-line-height-for-node.js +10 -0
  462. package/src/widgets/passage/passage-markdown.jsx +416 -0
  463. package/src/widgets/passage-ref-target.jsx +70 -0
  464. package/src/widgets/passage-ref.jsx +198 -0
  465. package/src/widgets/passage.jsx +601 -0
  466. package/src/widgets/plotter.jsx +1198 -0
  467. package/src/widgets/radio/__stories__/base-radio.stories.jsx +40 -0
  468. package/src/widgets/radio/__stories__/choice-icon.stories.jsx +157 -0
  469. package/src/widgets/radio/__stories__/choice-none-above.stories.jsx +26 -0
  470. package/src/widgets/radio/__stories__/cross-out-button.stories.jsx +64 -0
  471. package/src/widgets/radio/__stories__/cross-out-menu.stories.jsx +59 -0
  472. package/src/widgets/radio/__stories__/cross-out-tooltip.stories.jsx +59 -0
  473. package/src/widgets/radio/__stories__/focus-ring.stories.jsx +38 -0
  474. package/src/widgets/radio/__stories__/option-status.stories.jsx +118 -0
  475. package/src/widgets/radio/__stories__/toggleable-radio-button.stories.jsx +28 -0
  476. package/src/widgets/radio/base-radio.jsx +642 -0
  477. package/src/widgets/radio/choice-icon.jsx +468 -0
  478. package/src/widgets/radio/choice-none-above.jsx +54 -0
  479. package/src/widgets/radio/choice.jsx +692 -0
  480. package/src/widgets/radio/choice.jsx.fixture.js +64 -0
  481. package/src/widgets/radio/cross-out-button.jsx +136 -0
  482. package/src/widgets/radio/cross-out-menu-wrapper.jsx +492 -0
  483. package/src/widgets/radio/cross-out-tooltip.jsx +129 -0
  484. package/src/widgets/radio/focus-ring.jsx +51 -0
  485. package/src/widgets/radio/option-status.jsx +89 -0
  486. package/src/widgets/radio/toggleable-radio-button.jsx +133 -0
  487. package/src/widgets/radio/util.js +32 -0
  488. package/src/widgets/radio/util_test.js +19 -0
  489. package/src/widgets/radio/widget.jsx +470 -0
  490. package/src/widgets/radio.jsx +156 -0
  491. package/src/widgets/reaction-diagram.jsx +136 -0
  492. package/src/widgets/sequence.jsx +140 -0
  493. package/src/widgets/simulator.jsx +808 -0
  494. package/src/widgets/sorter.jsx +146 -0
  495. package/src/widgets/table.jsx +395 -0
  496. package/src/widgets/transformer.jsx +2870 -0
  497. package/src/widgets/unit.jsx +371 -0
  498. package/src/widgets/video-transcript-link.jsx +84 -0
  499. package/src/widgets/video-transcript-link_test.js +211 -0
  500. package/src/widgets/video.jsx +131 -0
  501. package/src/widgets.js +431 -0
  502. package/src/zoom.js +539 -0
  503. package/src/__tests__/index.test.js +0 -14
package/src/version.js ADDED
@@ -0,0 +1,11 @@
1
+ // @flow
2
+ export default {
3
+ apiVersion: {
4
+ major: 11,
5
+ minor: 0,
6
+ },
7
+ itemDataVersion: {
8
+ major: 0,
9
+ minor: 1,
10
+ },
11
+ };
@@ -0,0 +1,174 @@
1
+ /* eslint-disable react/no-unsafe, react/sort-comp */
2
+ // @flow
3
+ import classNames from "classnames";
4
+ import * as React from "react";
5
+ import ReactDOM from "react-dom";
6
+
7
+ import {linterContextDefault} from "./gorgon/proptypes.js";
8
+ import {zIndexInteractiveComponent} from "./styles/constants.js";
9
+ import {containerSizeClass, getClassFromWidth} from "./util/sizing-utils.js";
10
+ import * as Widgets from "./widgets.js";
11
+
12
+ import type {PerseusWidgetOptions} from "./perseus-types.js";
13
+ import type {LinterContextProps, WidgetProps} from "./types.js";
14
+
15
+ type Props = {|
16
+ shouldHighlight: boolean,
17
+ type: string, // widget type/name
18
+ initialProps: WidgetProps<$FlowFixMe, PerseusWidgetOptions>,
19
+ linterContext: LinterContextProps,
20
+ |};
21
+
22
+ type DefaultProps = {|
23
+ linterContext: LinterContextProps,
24
+ |};
25
+
26
+ type State = {|
27
+ sizeClass: "small" | "medium" | "large" | "xlarge",
28
+ widgetProps: WidgetProps<$FlowFixMe, PerseusWidgetOptions>,
29
+ |};
30
+
31
+ class WidgetContainer extends React.Component<Props, State> {
32
+ static defaultProps: DefaultProps = {
33
+ linterContext: linterContextDefault,
34
+ };
35
+
36
+ state: $FlowFixMe = {
37
+ // TODO(benkomalo): before we're mounted, we don't know how big
38
+ // we're going to be, so just default to MEDIUM for now. :/ In the
39
+ // future we can sniff with user-agents or something to get a
40
+ // better approximation, to avoid flickers
41
+ sizeClass: containerSizeClass.MEDIUM,
42
+ widgetProps: this.props.initialProps,
43
+ };
44
+
45
+ componentDidMount() {
46
+ // Only relay size class changes for mobile right now. We may want to
47
+ // this for desktop as well at some point in the future.
48
+ if (this.state.widgetProps.apiOptions.isMobile) {
49
+ // $FlowFixMe[prop-missing]
50
+ // $FlowFixMe[incompatible-use]
51
+ const containerWidth = ReactDOM.findDOMNode(this).offsetWidth;
52
+
53
+ // NOTE(benkomalo): in the common case, this won't change anything.
54
+ // Unfortunately, it will cause a flash and re-layout on mobile,
55
+ // but until we have better SSR or a more drastic way change to our
56
+ // APIs that hints at the available size, we do have to measure DOM
57
+ // unfortunately.
58
+ /* eslint-disable react/no-did-mount-set-state */
59
+ this.setState({
60
+ sizeClass: getClassFromWidth(containerWidth),
61
+ });
62
+ /* eslint-enable react/no-did-mount-set-state */
63
+ }
64
+ }
65
+
66
+ render(): React.Node {
67
+ let className = classNames({
68
+ "perseus-widget-container": true,
69
+ "widget-highlight": this.props.shouldHighlight,
70
+ "widget-nohighlight": !this.props.shouldHighlight,
71
+ });
72
+
73
+ const type = this.props.type;
74
+ const WidgetType = Widgets.getWidget(type);
75
+ if (WidgetType == null) {
76
+ // This is for the good of all people!!
77
+ // eslint-disable-next-line no-console
78
+ console.warn(`Widget type '${type}' not found!`);
79
+ // Just give up on invalid widget types
80
+ return <div className={className} />;
81
+ }
82
+
83
+ let alignment = this.state.widgetProps.alignment;
84
+ if (alignment === "default") {
85
+ alignment = Widgets.getDefaultAlignment(type);
86
+ }
87
+
88
+ className += " widget-" + alignment;
89
+
90
+ const apiOptions = this.state.widgetProps.apiOptions;
91
+
92
+ // Hack to prevent interaction with static widgets: we overlay a big
93
+ // div on top of the widget and overflow: hidden the container.
94
+ // Ideally widgets themselves should know how to prevent interaction.
95
+ const isStatic = this.state.widgetProps.static || apiOptions.readOnly;
96
+ const staticContainerStyles = {
97
+ position: "relative",
98
+ overflow: "visible",
99
+ };
100
+ const staticOverlayStyles = {
101
+ width: "100%",
102
+ height: "100%",
103
+ position: "absolute",
104
+ top: 0,
105
+ left: 0,
106
+ zIndex: zIndexInteractiveComponent,
107
+ };
108
+
109
+ // Some widgets may include strings of markdown that we may
110
+ // want to run the linter on. So if the widget is lintable,
111
+ // and we've been asked to highlight lint, pass that property
112
+ // on to the widget, and if the content is not lintable, make sure
113
+ // to default to false.
114
+ // The linter context might be a constant object (and it isn't owned
115
+ // by us anyway), so we copy it if we have to modify it.
116
+ const linterContext = Widgets.isLintable(type)
117
+ ? this.props.linterContext
118
+ : {...this.props.linterContext, highlightLint: false};
119
+
120
+ // Note: if you add more props here, please consider whether or not
121
+ // it should be auto-serialized (e.g. used in scoreInput()). See
122
+ // widget-jsonify-deprecated.jsx and widget-prop-blacklist.jsx
123
+
124
+ // We default to an empty object for style instead of null
125
+ // because of a strange bug where the static styles aren't applied
126
+ // after toggling static mode.
127
+ return (
128
+ <div
129
+ className={className}
130
+ style={isStatic ? staticContainerStyles : {}}
131
+ >
132
+ <WidgetType
133
+ {...this.state.widgetProps}
134
+ linterContext={linterContext}
135
+ containerSizeClass={this.state.sizeClass}
136
+ // eslint-disable-next-line react/no-string-refs
137
+ ref="widget"
138
+ />
139
+ {isStatic && <div style={staticOverlayStyles} />}
140
+ </div>
141
+ );
142
+ }
143
+
144
+ UNSAFE_componentWillReceiveProps(nextProps: Props) {
145
+ if (this.props.type !== nextProps.type) {
146
+ throw new Error(
147
+ "WidgetContainer can't change widget type; set a different " +
148
+ "key instead to recreate the container.",
149
+ );
150
+ }
151
+ }
152
+
153
+ shouldComponentUpdate(nextProps: Props, nextState: State): boolean {
154
+ return (
155
+ this.props.shouldHighlight !== nextProps.shouldHighlight ||
156
+ this.props.type !== nextProps.type ||
157
+ this.state.widgetProps !== nextState.widgetProps ||
158
+ this.state.sizeClass !== nextState.sizeClass
159
+ );
160
+ }
161
+
162
+ getWidget: () => $FlowFixMe = () => {
163
+ // eslint-disable-next-line react/no-string-refs
164
+ return this.refs.widget;
165
+ };
166
+
167
+ replaceWidgetProps: (
168
+ WidgetProps<$FlowFixMe, PerseusWidgetOptions>,
169
+ ) => void = (newWidgetProps) => {
170
+ this.setState({widgetProps: newWidgetProps});
171
+ };
172
+ }
173
+
174
+ export default WidgetContainer;
@@ -0,0 +1,15 @@
1
+ // @flow
2
+ import * as React from "react";
3
+
4
+ import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
+ import {question1} from "../__testdata__/categorizer_testdata.js";
6
+
7
+ export default {
8
+ title: "Perseus/Widgets/Categorizer",
9
+ };
10
+
11
+ type StoryArgs = {||};
12
+
13
+ export const Question1 = (args: StoryArgs): React.Node => {
14
+ return <RendererWithDebugUI question={question1} />;
15
+ };
@@ -0,0 +1,15 @@
1
+ // @flow
2
+ import * as React from "react";
3
+
4
+ import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
+ import {question1} from "../__testdata__/cs-program_testdata.js";
6
+
7
+ export default {
8
+ title: "Perseus/Widgets/CS Program",
9
+ };
10
+
11
+ type StoryArgs = {||};
12
+
13
+ export const Question1 = (args: StoryArgs): React.Node => {
14
+ return <RendererWithDebugUI question={question1} />;
15
+ };
@@ -0,0 +1,38 @@
1
+ // @flow
2
+ import * as React from "react";
3
+
4
+ import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
+
6
+ export default {
7
+ title: "Perseus/Widgets/Definition",
8
+ };
9
+
10
+ const question1 = {
11
+ content:
12
+ "Read the excerpt and answer the question below. \n\nThe Governor and Council of the Massachusetts had much conference many days; and at last . . . . concluded a peace and friendship with [[\u2603 definition 1]], upon these conditions.",
13
+ images: {},
14
+ widgets: {
15
+ "definition 1": {
16
+ graded: true,
17
+ version: {
18
+ major: 0,
19
+ minor: 0,
20
+ },
21
+ static: false,
22
+ type: "definition",
23
+ options: {
24
+ definition:
25
+ "A Native American people in Connecticut; white settlers in New England, the Pequots, and their respective allies were at war from 1636-1638.",
26
+ togglePrompt: "the Pequots",
27
+ static: false,
28
+ },
29
+ alignment: "default",
30
+ },
31
+ },
32
+ };
33
+
34
+ type StoryArgs = {||};
35
+
36
+ export const Question1 = (args: StoryArgs): React.Node => {
37
+ return <RendererWithDebugUI question={question1} />;
38
+ };
@@ -0,0 +1,15 @@
1
+ // @flow
2
+ import * as React from "react";
3
+
4
+ import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
+ import {question1} from "../__testdata__/dropdown_testdata.js";
6
+
7
+ export default {
8
+ title: "Perseus/Widgets/Dropdown",
9
+ };
10
+
11
+ type StoryArgs = {||};
12
+
13
+ export const Question1 = (args: StoryArgs): React.Node => {
14
+ return <RendererWithDebugUI question={question1} />;
15
+ };
@@ -0,0 +1,19 @@
1
+ // @flow
2
+ import * as React from "react";
3
+
4
+ import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
+ import {question1, question2} from "../__testdata__/explanation_testdata.js";
6
+
7
+ export default {
8
+ title: "Perseus/Widgets/Explanation",
9
+ };
10
+
11
+ type StoryArgs = {||};
12
+
13
+ export const Question1 = (args: StoryArgs): React.Node => {
14
+ return <RendererWithDebugUI question={question1} />;
15
+ };
16
+
17
+ export const Question2 = (args: StoryArgs): React.Node => {
18
+ return <RendererWithDebugUI question={question2} />;
19
+ };
@@ -0,0 +1,26 @@
1
+ // @flow
2
+ import * as React from "react";
3
+
4
+ import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
+ import {
6
+ expressionItem2,
7
+ expressionItem3,
8
+ } from "../__testdata__/expression_testdata.js";
9
+
10
+ type StoryArgs = {||};
11
+
12
+ type Story = {|
13
+ title: string,
14
+ |};
15
+
16
+ export default ({
17
+ title: "Perseus/Widgets/Expression",
18
+ }: Story);
19
+
20
+ export const ExpressionItem2 = (args: StoryArgs): React.Node => {
21
+ return <RendererWithDebugUI question={expressionItem2.question} />;
22
+ };
23
+
24
+ export const ExpressionItem3 = (args: StoryArgs): React.Node => {
25
+ return <RendererWithDebugUI question={expressionItem3.question} />;
26
+ };
@@ -0,0 +1,32 @@
1
+ // @flow
2
+ import * as React from "react";
3
+
4
+ import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
+ import {article1} from "../__testdata__/graded-group-set_testdata.js";
6
+
7
+ type StoryArgs = {|
8
+ isMobile: boolean,
9
+ |};
10
+
11
+ type GradedGroupSetStory = {|
12
+ title: string,
13
+ args: StoryArgs,
14
+ |};
15
+
16
+ export const Article1 = (args: StoryArgs): React.Node => {
17
+ return (
18
+ <RendererWithDebugUI
19
+ apiOptions={{
20
+ isMobile: args.isMobile,
21
+ }}
22
+ question={article1}
23
+ />
24
+ );
25
+ };
26
+
27
+ export default ({
28
+ title: "Perseus/Widgets/Graded Group Set",
29
+ args: {
30
+ isMobile: false,
31
+ },
32
+ }: GradedGroupSetStory);
@@ -0,0 +1,32 @@
1
+ // @flow
2
+ import * as React from "react";
3
+
4
+ import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
+ import {question1} from "../__testdata__/graded-group_testdata.js";
6
+
7
+ type StoryArgs = {|
8
+ isMobile: boolean,
9
+ |};
10
+
11
+ type Story = {|
12
+ title: string,
13
+ args: StoryArgs,
14
+ |};
15
+
16
+ export const Question1 = (args: StoryArgs): React.Node => {
17
+ return (
18
+ <RendererWithDebugUI
19
+ question={question1}
20
+ apiOptions={{
21
+ isMobile: args.isMobile,
22
+ }}
23
+ />
24
+ );
25
+ };
26
+
27
+ export default ({
28
+ title: "Perseus/Widgets/Graded Group",
29
+ args: {
30
+ isMobile: false,
31
+ },
32
+ }: Story);
@@ -0,0 +1,47 @@
1
+ // @flow
2
+ import * as React from "react";
3
+
4
+ import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
+ import {
6
+ absoluteValueQuestion,
7
+ multipleAvailableTypesQuestion,
8
+ exponentialQuestion,
9
+ linearQuestion,
10
+ logarithmQuestion,
11
+ quadraticQuestion,
12
+ sinusoidQuestion,
13
+ } from "../__testdata__/grapher_testdata.js";
14
+
15
+ export default {
16
+ title: "Perseus/Widgets/Grapher",
17
+ };
18
+
19
+ type StoryArgs = {||};
20
+
21
+ export const AbsoluteValueQuestion = (args: StoryArgs): React.Node => {
22
+ return <RendererWithDebugUI question={absoluteValueQuestion} />;
23
+ };
24
+
25
+ export const ExponentialQuestion = (args: StoryArgs): React.Node => {
26
+ return <RendererWithDebugUI question={exponentialQuestion} />;
27
+ };
28
+
29
+ export const LinearQuestion = (args: StoryArgs): React.Node => {
30
+ return <RendererWithDebugUI question={linearQuestion} />;
31
+ };
32
+
33
+ export const LogarithmQuestion = (args: StoryArgs): React.Node => {
34
+ return <RendererWithDebugUI question={logarithmQuestion} />;
35
+ };
36
+
37
+ export const QuadraticQuestion = (args: StoryArgs): React.Node => {
38
+ return <RendererWithDebugUI question={quadraticQuestion} />;
39
+ };
40
+
41
+ export const SinusoidQuestion = (args: StoryArgs): React.Node => {
42
+ return <RendererWithDebugUI question={sinusoidQuestion} />;
43
+ };
44
+
45
+ export const ComplexQuestion = (args: StoryArgs): React.Node => {
46
+ return <RendererWithDebugUI question={multipleAvailableTypesQuestion} />;
47
+ };
@@ -0,0 +1,15 @@
1
+ // @flow
2
+ import * as React from "react";
3
+
4
+ import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
+ import {question1} from "../__testdata__/group_testdata.js";
6
+
7
+ export default {
8
+ title: "Perseus/Widgets/Group",
9
+ };
10
+
11
+ type StoryArgs = {||};
12
+
13
+ export const Question1 = (args: StoryArgs): React.Node => {
14
+ return <RendererWithDebugUI question={question1} />;
15
+ };
@@ -0,0 +1,15 @@
1
+ // @flow
2
+ import * as React from "react";
3
+
4
+ import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
+ import {question1} from "../__testdata__/iframe_testdata.js";
6
+
7
+ export default {
8
+ title: "Perseus/Widgets/IFrame",
9
+ };
10
+
11
+ type StoryArgs = {||};
12
+
13
+ export const Question1 = (args: StoryArgs): React.Node => {
14
+ return <RendererWithDebugUI question={question1} />;
15
+ };
@@ -0,0 +1,62 @@
1
+ // @flow
2
+ import * as React from "react";
3
+
4
+ import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
+ import {question} from "../__testdata__/image_testdata.js";
6
+
7
+ import type {APIOptions} from "../../types.js";
8
+
9
+ type StoryArgs = {|
10
+ isMobile: boolean,
11
+ title: string,
12
+ caption: string,
13
+ |};
14
+
15
+ type ImageStory = {|
16
+ title: string,
17
+ args: StoryArgs,
18
+ |};
19
+
20
+ export const Question1 = (args: StoryArgs): React.Node => {
21
+ const apiOptions: APIOptions = {
22
+ isMobile: args.isMobile,
23
+ };
24
+ const imageOptions = question.widgets["image 1"].options;
25
+
26
+ const questionWithArgs = {
27
+ ...question,
28
+ widgets: {
29
+ ...question.widgets,
30
+ "image 1": {
31
+ ...question.widgets["image 1"],
32
+ options:
33
+ // `options` is nullable so we have handle it explicitly
34
+ // to avoid spreading `null` and generating
35
+ // hard-to-understand Flow type errors about missing keys
36
+ // in object literal.
37
+ imageOptions != null
38
+ ? {
39
+ ...imageOptions,
40
+ title: args.title,
41
+ caption: args.caption,
42
+ }
43
+ : null,
44
+ },
45
+ },
46
+ };
47
+ return (
48
+ <RendererWithDebugUI
49
+ question={questionWithArgs}
50
+ apiOptions={apiOptions}
51
+ />
52
+ );
53
+ };
54
+
55
+ export default ({
56
+ title: "Perseus/Widgets/Image",
57
+ args: {
58
+ isMobile: false,
59
+ title: "",
60
+ caption: "",
61
+ },
62
+ }: ImageStory);
@@ -0,0 +1,90 @@
1
+ // @flow
2
+ import * as React from "react";
3
+
4
+ import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
+ import {
6
+ question1,
7
+ question2,
8
+ question3,
9
+ } from "../__testdata__/input-number_testdata.js";
10
+
11
+ import type {
12
+ PerseusRenderer,
13
+ PerseusInputNumberWidgetOptions,
14
+ } from "../../perseus-types.js";
15
+
16
+ export default {
17
+ title: "Perseus/Widgets/InputNumber",
18
+ argTypes: {
19
+ maxError: {
20
+ control: {
21
+ type: "range",
22
+ min: 0,
23
+ max: 1,
24
+ step: 0.1,
25
+ },
26
+ },
27
+ inexact: {
28
+ control: {type: "boolean"},
29
+ },
30
+ value: {
31
+ control: {type: "number"},
32
+ },
33
+ simplify: {
34
+ control: {type: "select", options: ["optional", "required"]},
35
+ },
36
+ answerType: {
37
+ control: {
38
+ type: "select",
39
+ options: [
40
+ "number",
41
+ "decimal",
42
+ "integer",
43
+ "rational",
44
+ "improper",
45
+ "mixed",
46
+ "percent",
47
+ "pi",
48
+ ],
49
+ },
50
+ },
51
+ size: {
52
+ control: {type: "select", options: ["normal", "large"]},
53
+ },
54
+ },
55
+ };
56
+
57
+ type Question = PerseusRenderer;
58
+ type InputNumberOptions = PerseusInputNumberWidgetOptions;
59
+
60
+ const updateWidgetOptions = (
61
+ question: Question,
62
+ widgetId: string,
63
+ options: InputNumberOptions,
64
+ ): Question => {
65
+ const widget = question.widgets[widgetId];
66
+ return {
67
+ ...question,
68
+ widgets: {
69
+ [widgetId]: {...widget, options},
70
+ },
71
+ };
72
+ };
73
+
74
+ export const Rational = (args: InputNumberOptions): React.Node => {
75
+ const question = updateWidgetOptions(question1, "input-number 1", args);
76
+ return <RendererWithDebugUI question={question} />;
77
+ };
78
+ Rational.args = question1.widgets["input-number 1"].options;
79
+
80
+ export const PiSimplify = (args: InputNumberOptions): React.Node => {
81
+ const question = updateWidgetOptions(question2, "input-number 1", args);
82
+ return <RendererWithDebugUI question={question} />;
83
+ };
84
+ PiSimplify.args = question2.widgets["input-number 1"].options;
85
+
86
+ export const Percent = (args: InputNumberOptions): React.Node => {
87
+ const question = updateWidgetOptions(question3, "input-number 1", args);
88
+ return <RendererWithDebugUI question={question} />;
89
+ };
90
+ Percent.args = question3.widgets["input-number 1"].options;
@@ -0,0 +1,15 @@
1
+ // @flow
2
+ import * as React from "react";
3
+
4
+ import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui.jsx";
5
+ import {question1} from "../__testdata__/interaction_testdata.js";
6
+
7
+ export default {
8
+ title: "Perseus/Widgets/Interaction",
9
+ };
10
+
11
+ type StoryArgs = {||};
12
+
13
+ export const Question1 = (args: StoryArgs): React.Node => (
14
+ <RendererWithDebugUI question={question1} />
15
+ );