@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/dist/strings.js CHANGED
@@ -5,29 +5,115 @@
5
5
  */
6
6
 
7
7
  module.exports = [
8
+ i18n._(" The symbol %(sentenceSymbol)s indicates that the following sentence is referenced in a question.", {}),
9
+ i18n._("'None of the above' may not be selected when other answers are selected.", {}),
10
+ i18n._("(Choice %(letter)s, Checked, Correct)", {}),
11
+ i18n._("(Choice %(letter)s, Checked, Incorrect)", {}),
12
+ i18n._("(Choice %(letter)s, Checked)", {}),
13
+ i18n._("(Choice %(letter)s, Correct)", {}),
14
+ i18n._("(Choice %(letter)s, Crossed out, Correct)", {}),
15
+ i18n._("(Choice %(letter)s, Crossed out, Incorrect)", {}),
16
+ i18n._("(Choice %(letter)s, Crossed out)", {}),
17
+ i18n._("(Choice %(letter)s, Incorrect)", {}),
18
+ i18n._("(Choice %(letter)s)", {}),
19
+ i18n.$_("[Circle marker %(number)s]", {}),
20
+ i18n.$_("[Marker for question %(number)s]", {}),
21
+ i18n.$_("[Sentence %(number)s]", {}),
22
+ i18n._("**Your answer should be** ", {}),
23
+ i18n._("a *proper* fraction, like $1/2$ or $6/10$", {}),
24
+ i18n._("a *simplified improper* fraction, like $7/4$", {}),
25
+ i18n._("a *simplified proper* fraction, like $3/5$", {}),
26
+ // I18N: This is a list of single-character labels that will appear in front of multiple-choice options. For instance, a multiple-choice question with three options would display (A) first option (B) second option (C) third option There must be spaces between each of the different characters. The characters will show up next to options in the order that they are listed here. Most multiple choice questions have 5 or fewer options.
27
+ i18n._("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", {}),
28
+ i18n._("a mixed number, like $1\\ 3/4$", {}),
29
+ i18n.$_("A molecular structure drawing. SMILES notation: %(content)s", {}),
30
+ i18n._("a multiple of pi, like $12\\ \\text{pi}$ or $2/3\\ \\text{pi}$", {}),
31
+ i18n._("a percent, like $12.34\\%$", {}),
32
+ i18n._("Add highlight", {}),
33
+ i18n._("Add transformations below:", {}),
34
+ i18n._("an *exact* decimal, like $0.75$", {}),
35
+ i18n._("an *improper* fraction, like $10/7$ or $14/8$", {}),
36
+ i18n._("an integer, like $6$", {}),
37
+ i18n._("Beginning of reading passage footnotes.", {}),
38
+ i18n._("Beginning of reading passage.", {}),
39
+ i18n._("Bring back", {}),
40
+ i18n._("Bring back Choice %(letter)s", {}),
41
+ i18n._("Check", {}),
42
+ i18n._("Check your significant figures.", {}),
43
+ i18n._("Check your units.", {}),
44
+ i18n._("Choices:", {}),
45
+ i18n._("Choose %(numCorrect)s answers:", {}),
46
+ i18n._("Choose 1 answer:", {}),
47
+ i18n._("Choose all answers that apply:", {}),
48
+ i18n._("Click each dot on the image to select all answers that apply.", {}),
49
+ i18n._("Click each dot on the image to select an answer.", {}),
50
+ i18n._("Click on the tiles to change the lights.", {}),
51
+ i18n._("Click to add points", {}),
52
+ i18n._("Click to add vertices", {}),
53
+ i18n._("Close", {}),
54
+ i18n._("Closes the tooltip: ", {}),
55
+ i18n._("Correct", {}),
56
+ i18n._("Correct (but you crossed it out)", {}),
57
+ i18n._("Correct (selected)", {}),
58
+ i18n._("Correct!", {}),
8
59
  i18n._("Cosine", {}),
60
+ i18n._("Cross out", {}),
61
+ i18n._("Cross out Choice %(letter)s", {}),
9
62
  i18n._("Cube", {}),
10
63
  i18n._("Cube root", {}),
11
64
  i18n._("Custom exponent", {}),
12
65
  i18n._("Decimal", {}),
13
66
  i18n._("Delete", {}),
67
+ // I18N: As in the command, "Dilate the polygon"
68
+ i18n._("Dilate", {}),
69
+ i18n._("dilation", {}),
70
+ i18n._("Dilation", {}),
71
+ i18n.$_("Dilation about %(point)s by %(scale)s", {}),
72
+ i18n.$_("Dilation of scale %(scale)s about %(point)s", {}),
14
73
  i18n._("Dismiss", {}),
15
74
  i18n._("Divide", {}),
16
75
  i18n._("Down arrow", {}),
76
+ i18n._("Drag handles to make graph", {}),
77
+ i18n._("End of reading passage.", {}),
78
+ i18n._("entered in an invalid answer.", {}),
17
79
  i18n._("Equals sign", {}),
18
- i18n._("foo", {}),
80
+ i18n.$_("Error rendering: %(error)s", {}),
81
+ i18n._("Explain", {}),
82
+ i18n._("False", {}),
19
83
  i18n._("Fraction, excluding the current expression", {}),
20
84
  i18n._("Fraction, with current expression in numerator", {}),
85
+ i18n._("Get another hint", {}),
21
86
  i18n._("Greater than or equal to sign", {}),
22
87
  i18n._("Greater than sign", {}),
88
+ i18n._("Hide explanation", {}),
89
+ i18n._("Hint #%(pos)s", {}),
90
+ i18n._("Hints", {}),
91
+ i18n._("I couldn't understand those units.", {}),
92
+ i18n._("I don't understand that", {}),
93
+ i18n._("I'm a computer. I only understand multiplication if you use an asterisk (*) as the multiplication sign.", {}),
94
+ i18n._("Incorrect", {}),
95
+ i18n._("Incorrect (selected)", {}),
96
+ i18n._("It looks like you left something blank or ", {}),
97
+ i18n._("Keep trying", {}),
98
+ i18n._("Khan Academy video wrapper", {}),
23
99
  i18n._("Left arrow", {}),
24
100
  i18n._("Left parenthesis", {}),
25
101
  i18n._("Less than or equal to sign", {}),
26
102
  i18n._("Less than sign", {}),
103
+ // I18N: a label next to a reading passage to denote the line number
104
+ i18n._("Line ", {}),
105
+ i18n.$_("line %(lineNumber)s", {}),
106
+ i18n.$_("lines %(lineRange)s", {}),
107
+ i18n._("Loading...", {}),
27
108
  i18n._("Logarithm with base 10", {}),
28
109
  i18n._("Logarithm with custom base", {}),
110
+ i18n._("Make circle filled", {}),
111
+ i18n._("Make circle open", {}),
112
+ i18n._("Make sure you fill in all cells in the matrix.", {}),
113
+ i18n._("Make sure you select something for every row.", {}),
29
114
  i18n._("Math input box", {}),
30
115
  i18n._("Minus", {}),
116
+ i18n.ngettext("Moves: %(num)s","Moves: %(num)s", {}),
31
117
  i18n._("Multiply", {}),
32
118
  i18n._("Natural logarithm", {}),
33
119
  i18n._("Navigate right into the numerator of a fraction", {}),
@@ -37,18 +123,79 @@ module.exports = [
37
123
  i18n._("Navigate right out of the denominator of a fraction", {}),
38
124
  i18n._("Navigate right out of the numerator and into the denominator", {}),
39
125
  i18n._("Negative", {}),
126
+ i18n._("Next question", {}),
127
+ i18n._("No", {}),
128
+ i18n._("None of the above", {}),
40
129
  i18n._("Not-equals sign", {}),
130
+ i18n._("Note: For this question, the shape will not move.", {}),
131
+ i18n._("Number of divisions:", {}),
132
+ i18n._("Number of trials:", {}),
133
+ i18n._("Open menu for Choice %(letter)s", {}),
134
+ i18n._("Parameter", {}),
41
135
  i18n._("Percent", {}),
42
136
  i18n._("Pi", {}),
137
+ i18n._("Please choose the correct number of answers.", {}),
138
+ i18n.$_("Please make sure the number of divisions is in the range %(divRangeString)s.", {}),
43
139
  i18n._("Plus", {}),
44
140
  i18n._("Radical with custom root", {}),
141
+ i18n._("Reaction arrow pointing to the right.", {}),
142
+ // I18N: As in the command, "Reflect the polygon"
143
+ i18n._("Reflect", {}),
144
+ i18n._("reflection", {}),
145
+ i18n._("Reflection", {}),
146
+ i18n.$_("Reflection over the line from %(point1)s to %(point2)s", {}),
147
+ i18n._("Remove highlight", {}),
45
148
  i18n._("Right arrow", {}),
46
149
  i18n._("Right parenthesis", {}),
150
+ // I18N: As in the command, "Rotate the polygon"
151
+ i18n._("Rotate", {}),
152
+ i18n._("rotation", {}),
153
+ i18n._("Rotation", {}),
154
+ // I18N: %(point)s must come before %(degrees)s in this phrase
155
+ i18n.$_("Rotation about %(point)s by %(degrees)s", {}),
156
+ i18n.$_("Rotation by %(degrees)s about %(point)s", {}),
157
+ i18n._("Run simulation", {}),
158
+ i18n._("Sample size:", {}),
159
+ i18n._("See video transcript", {}),
47
160
  i18n._("Sine", {}),
161
+ i18n._("Skip to %(title)s", {}),
162
+ i18n._("Something went wrong.", {}),
163
+ i18n._("Sorry, I don't understand that!", {}),
48
164
  i18n._("Square", {}),
49
165
  i18n._("Square root", {}),
166
+ i18n._("Switch direction", {}),
50
167
  i18n._("Tangent", {}),
168
+ i18n._("Tap each dot on the image to select all answers that apply.", {}),
169
+ i18n._("Tap each dot on the image to select an answer.", {}),
170
+ i18n._("Tap to add points", {}),
51
171
  i18n._("Tap with one or two fingers to open keyboard", {}),
172
+ i18n._("That answer is numerically incorrect.", {}),
173
+ i18n._("The symbol %(questionSymbol)s indicates that question %(questionNumber)s references this portion of the passage.", {}),
52
174
  i18n._("Theta", {}),
175
+ i18n._("This controls the proportion or percentage that will be used in your simulation.", {}),
176
+ i18n._("This controls the sample size that will be used in your simulation. For example, if you set this to 100, then for each trial, responses from 100 participants will be simulated.", {}),
177
+ i18n._("This is the number of trials used in the simulation. For example, if set to 50, then the survey will be conducted 50 times.", {}),
178
+ // I18N: As in the command, "Translate the polygon"
179
+ i18n._("Translate", {}),
180
+ i18n._("translation", {}),
181
+ i18n._("Translation", {}),
182
+ // I18N: As in the command, "Translation by <3, 1>"
183
+ i18n.$_("Translation by %(vector)s", {}),
184
+ i18n._("True", {}),
185
+ i18n._("Try again", {}),
186
+ i18n._("Undo", {}),
53
187
  i18n._("Up arrow", {}),
188
+ i18n._("Use the interactive graph to define a correct transformation.", {}),
189
+ i18n._("Value", {}),
190
+ i18n._("We could not understand your answer. Please check your answer for extra text or symbols.", {}),
191
+ i18n._("We couldn't grade your answer.", {}),
192
+ i18n._("Yes", {}),
193
+ i18n._("You must turn on all of the lights to continue.", {}),
194
+ i18n._("Your answer includes a wrong variable letter.", {}),
195
+ i18n._("Your answer includes use of a variable with the wrong case.", {}),
196
+ i18n._("Your answer is almost correct, but it is missing a <code>\\%</code> at the end.", {}),
197
+ i18n._("Your answer is almost correct, but it needs to be simplified.", {}),
198
+ i18n._("Your answer is close, but you may have approximated pi. Enter your answer as a multiple of pi, like <code>12\\ \\text{pi}</code> or <code>2/3\\ \\text{pi}</code>", {}),
199
+ i18n._("Your answer:", {}),
200
+ i18n._("Your transformation must use a %(type)s.", {}),
54
201
  ];
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "access": "public"
4
4
  },
5
5
  "name": "@khanacademy/perseus",
6
- "version": "0.0.1",
6
+ "version": "0.1.0",
7
7
  "description": "Core Perseus API (includes renderers and widgets)",
8
8
  "module": "dist/es/index.js",
9
9
  "main": "dist/index.js",
@@ -12,20 +12,56 @@
12
12
  "test": "bash -c 'yarn --silent --cwd \"../..\" test ${@:0} $($([[ ${@: -1} = -* ]] || [[ ${@: -1} = bash ]]) && echo $PWD)'"
13
13
  },
14
14
  "dependencies": {
15
- "@khanacademy/math-input": "^0.4.1"
15
+ "@khanacademy/math-input": "^0.4.1",
16
+ "kas": "git+https://git@github.com/Khan/KAS.git#a5b04e0688ec692da86e2991cd389f1fd3831528",
17
+ "kmath": "git+https://git@github.com/Khan/kmath.git#e1191bbc7bac64ccb582de1b3b2d47ba38b510e0",
18
+ "mathquill": "git+https://git@github.com/Khan/mathquill.git#a9ae54e057c5c1acc8244a5627acbff29901d992",
19
+ "simple-markdown": "^0.3.1"
16
20
  },
17
21
  "devDependencies": {
22
+ "@khanacademy/wonder-blocks-color": "^1.1.20",
23
+ "@khanacademy/wonder-blocks-core": "^4.3.0",
24
+ "@khanacademy/wonder-blocks-data": "^7.0.0",
25
+ "@khanacademy/wonder-blocks-dropdown": "^2.6.7",
18
26
  "@khanacademy/wonder-blocks-i18n": "^1.2.3",
27
+ "@khanacademy/wonder-blocks-link": "^3.8.5",
28
+ "@khanacademy/wonder-blocks-popover": "^1.1.10",
29
+ "@khanacademy/wonder-blocks-spacing": "^3.0.5",
30
+ "@khanacademy/wonder-blocks-tooltip": "^1.3.10",
31
+ "@khanacademy/wonder-stuff-core": "^0.1.2",
32
+ "aphrodite": "^1.2.5",
33
+ "classnames": "^1.1.4",
34
+ "create-react-class": "^15.6.3",
19
35
  "eslint-import-resolver-alias": "^1.1.2",
20
36
  "eslint-plugin-import": "^2.26.0",
37
+ "intersection-observer": "^0.12.0",
38
+ "jquery": "^2.1.1",
21
39
  "perseus-build-settings": "^0.0.1",
40
+ "prop-types": "^15.6.1",
22
41
  "react": "16.14.0",
23
- "react-dom": "16.14.0"
42
+ "react-dom": "16.14.0",
43
+ "underscore": "^1.4.4"
24
44
  },
25
45
  "peerDependencies": {
46
+ "@khanacademy/wonder-blocks-color": "^1.1.20",
47
+ "@khanacademy/wonder-blocks-core": "^4.3.0",
48
+ "@khanacademy/wonder-blocks-data": "^7.0.0",
49
+ "@khanacademy/wonder-blocks-dropdown": "^2.6.7",
26
50
  "@khanacademy/wonder-blocks-i18n": "^1.2.3",
51
+ "@khanacademy/wonder-blocks-link": "^3.8.5",
52
+ "@khanacademy/wonder-blocks-popover": "^1.1.10",
53
+ "@khanacademy/wonder-blocks-spacing": "^3.0.5",
54
+ "@khanacademy/wonder-blocks-tooltip": "^1.3.10",
55
+ "@khanacademy/wonder-stuff-core": "^0.1.2",
56
+ "aphrodite": "^1.2.5",
57
+ "classnames": "^1.1.4",
58
+ "create-react-class": "^15.6.3",
59
+ "intersection-observer": "^0.12.0",
60
+ "jquery": "^2.1.1",
61
+ "prop-types": "^15.6.1",
27
62
  "react": "16.14.0",
28
- "react-dom": "16.14.0"
63
+ "react-dom": "16.14.0",
64
+ "underscore": "^1.4.4"
29
65
  },
30
66
  "author": "",
31
67
  "license": "MIT"
package/src/README.md ADDED
@@ -0,0 +1,7 @@
1
+ Widgets from the Perseus (exercise) editor.
2
+
3
+ TODO(benkraft): Figure out the distinction between this and the various other
4
+ Perseus packages.
5
+
6
+ Code-Owner: Learning Platform
7
+ Crowdin-Category: content.chrome
@@ -0,0 +1,27 @@
1
+ // @flow
2
+
3
+ import * as React from "react";
4
+
5
+ import {ItemRendererWithDebugUI} from "../../../../testing/item-renderer-with-debug-ui.jsx";
6
+ import {
7
+ itemWithInput,
8
+ labelImageItem,
9
+ } from "../__testdata__/item-renderer_testdata.js";
10
+
11
+ type StoryArgs = {||};
12
+
13
+ type Story = {|
14
+ title: string,
15
+ |};
16
+
17
+ export default ({
18
+ title: "Perseus/Renderers/Item Renderer",
19
+ }: Story);
20
+
21
+ export const InputNumberItem = (args: StoryArgs): React.Node => {
22
+ return <ItemRendererWithDebugUI item={itemWithInput} />;
23
+ };
24
+
25
+ export const LabelImageItem = (args: StoryArgs): React.Node => {
26
+ return <ItemRendererWithDebugUI item={labelImageItem} />;
27
+ };
@@ -0,0 +1,27 @@
1
+ // @flow
2
+
3
+ import * as React from "react";
4
+
5
+ import {ServerItemRendererWithDebugUI} from "../../../../testing/server-item-renderer-with-debug-ui.jsx";
6
+ import {
7
+ itemWithInput,
8
+ labelImageItem,
9
+ } from "../__testdata__/item-renderer_testdata.js";
10
+
11
+ type StoryArgs = {||};
12
+
13
+ type Story = {|
14
+ title: string,
15
+ |};
16
+
17
+ export default ({
18
+ title: "Perseus/Renderers/Server Item Renderer",
19
+ }: Story);
20
+
21
+ export const InputNumberItem = (args: StoryArgs): React.Node => {
22
+ return <ServerItemRendererWithDebugUI item={itemWithInput} />;
23
+ };
24
+
25
+ export const LabelImageItem = (args: StoryArgs): React.Node => {
26
+ return <ServerItemRendererWithDebugUI item={labelImageItem} />;
27
+ };
@@ -0,0 +1,161 @@
1
+ // @flow
2
+
3
+ import type {
4
+ InputNumberWidget,
5
+ LabelImageWidget,
6
+ PerseusItem,
7
+ PerseusRenderer,
8
+ } from "../perseus-types.js";
9
+
10
+ export const itemWithInput: PerseusItem = {
11
+ question: {
12
+ content:
13
+ "Enter the number $$-42$$ in the box: [[\u2603 input-number 1]]",
14
+ images: {},
15
+ widgets: {
16
+ "input-number 1": ({
17
+ type: "input-number",
18
+ graded: true,
19
+ options: {
20
+ answerType: "number",
21
+ value: "-42",
22
+ simplify: "required",
23
+ size: "normal",
24
+ inexact: false,
25
+ maxError: 0.1,
26
+ },
27
+ }: InputNumberWidget),
28
+ },
29
+ },
30
+ hints: [
31
+ {content: "Hint #1", images: {}, widgets: {}},
32
+ {content: "Hint #2", images: {}, widgets: {}},
33
+ {content: "Hint #3", images: {}, widgets: {}},
34
+ ],
35
+ answerArea: null,
36
+ _multi: null,
37
+ itemDataVersion: {major: 0, minor: 0},
38
+ answer: null,
39
+ };
40
+
41
+ export const labelImageItem: PerseusItem = {
42
+ answerArea: {
43
+ calculator: false,
44
+ chi2Table: false,
45
+ periodicTable: false,
46
+ tTable: false,
47
+ zTable: false,
48
+ },
49
+ _multi: null,
50
+ answer: null,
51
+ hints: [],
52
+ itemDataVersion: {major: 0, minor: 1},
53
+ question: {
54
+ content:
55
+ "Catherine created a chart and a bar graph to show how many dogs of each breed the animal shelter placed into good homes last year. \n\nDog breed | Number of dogs \n:- | :-: \nBulldog | $32$ \nGreyhound | $72$ \nMastiff | $56$ \nCollie | $40$ \n\n**Label each bar on the bar graph.**\n\n[[☃ label-image 1]]\n\n\n\n",
56
+ images: {
57
+ "web+graphie://ka-perseus-graphie.s3.amazonaws.com/2f60b533892fe6cb9351f704ffdada8ae4bc655c":
58
+ {height: 365, width: 503},
59
+ "web+graphie://ka-perseus-graphie.s3.amazonaws.com/75f937c6ea133d655dd9f698a58182efd6cc85d4":
60
+ {height: 293, width: 331},
61
+ },
62
+ widgets: {
63
+ "label-image 1": ({
64
+ alignment: "default",
65
+ graded: true,
66
+ static: false,
67
+ type: "label-image",
68
+ version: {major: 0, minor: 0},
69
+ options: {
70
+ choices: ["Bulldog", "Greyhound", "Mastiff", "Collie"],
71
+ hideChoicesFromInstructions: true,
72
+ imageAlt:
73
+ "A bar graph with four bar lines shows the horizontal axis labeled Dog breed and the vertical axis labeled Number of dogs. The vertical axis is labeled from the bottom of the axis to the top of the axis as follows: 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, and 80. The horizontal axis has, from left to right, four unlabeled bar lines as follows: the first unlabeled bar line extends to 56, the second unlabeled bar line extends to 72, the third unlabeled bar line extends to 40, and the fourth unlabeled bar line extends to 32.",
74
+ imageHeight: 293,
75
+ imageUrl:
76
+ "web+graphie://ka-perseus-graphie.s3.amazonaws.com/64ace45942546183c3dc842cb0e9e4f64a312727",
77
+ imageWidth: 331,
78
+ markers: [
79
+ {
80
+ answers: ["Bulldog"],
81
+ label: "The fourth unlabeled bar line.",
82
+ x: 87.3,
83
+ y: 90.2,
84
+ },
85
+ {
86
+ answers: ["Collie"],
87
+ label: "The third unlabeled bar line.",
88
+ x: 67.7,
89
+ y: 90.5,
90
+ },
91
+ {
92
+ answers: ["Greyhound"],
93
+ label: "The second unlabeled bar line.",
94
+ x: 47.7,
95
+ y: 90.2,
96
+ },
97
+ {
98
+ answers: ["Mastiff"],
99
+ label: "The first unlabeled bar line.",
100
+ x: 27.8,
101
+ y: 90.5,
102
+ },
103
+ ],
104
+ multipleAnswers: false,
105
+ static: false,
106
+ },
107
+ }: LabelImageWidget),
108
+ },
109
+ },
110
+ };
111
+
112
+ // Note that if this item is used, you _must_ first register the MockWidget
113
+ export const mockedItem: PerseusItem = {
114
+ // The mock widget type is not part of the PerseusWidget type union (and
115
+ // we don't want to make it such to avoid polluting our production types
116
+ // for test purposes) so we force Flow to accept it here.
117
+ question: (({
118
+ content:
119
+ "Mock widget ==> [[\u2603 mock-widget 1]] [[\u2603 mock-widget 2]] [[\u2603 mock-widget 3]] [[\u2603 mock-widget 4]]",
120
+ images: {},
121
+ widgets: {
122
+ "mock-widget 1": {
123
+ graded: true,
124
+ version: {major: 0, minor: 0},
125
+ static: false,
126
+ type: "mock-widget",
127
+ options: {static: false, smiling: true},
128
+ alignment: "default",
129
+ },
130
+ "mock-widget 2": {
131
+ graded: true,
132
+ version: {major: 0, minor: 0},
133
+ static: false,
134
+ type: "mock-widget",
135
+ options: {static: false, smiling: false},
136
+ alignment: "default",
137
+ },
138
+ "mock-widget 3": {
139
+ graded: true,
140
+ version: {major: 0, minor: 0},
141
+ static: false,
142
+ type: "mock-widget",
143
+ options: {static: false, smiling: true},
144
+ alignment: "default",
145
+ },
146
+ "mock-widget 4": {
147
+ graded: true,
148
+ version: {major: 0, minor: 0},
149
+ static: false,
150
+ type: "mock-widget",
151
+ options: {static: false, smiling: false},
152
+ alignment: "default",
153
+ },
154
+ },
155
+ }: any): PerseusRenderer),
156
+ hints: [],
157
+ answerArea: null,
158
+ _multi: null,
159
+ itemDataVersion: {major: 0, minor: 0},
160
+ answer: null,
161
+ };
@@ -0,0 +1,123 @@
1
+ // @flow
2
+
3
+ import type {
4
+ DropdownWidget,
5
+ ImageWidget,
6
+ InputNumberWidget,
7
+ PerseusRenderer,
8
+ } from "../perseus-types.js";
9
+
10
+ export const dropdownWidget: DropdownWidget = {
11
+ type: "dropdown",
12
+ alignment: "default",
13
+ static: false,
14
+ graded: true,
15
+ options: {
16
+ static: false,
17
+ placeholder: "greater/less than or equal to",
18
+ choices: [
19
+ {
20
+ content: "greater than or equal to",
21
+ correct: false,
22
+ },
23
+ {
24
+ content: "less than or equal to",
25
+ correct: true,
26
+ },
27
+ ],
28
+ },
29
+ version: {
30
+ major: 0,
31
+ minor: 0,
32
+ },
33
+ };
34
+
35
+ export const imageWidget: ImageWidget = {
36
+ alignment: "block",
37
+ graded: true,
38
+ options: {
39
+ alt: "A number line labeled 200 to 300 with tick marks at every 5 units. The tick marks at 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, and 300 are labeled. A red circle labeled A is between 220 tick mark and 230 tick mark.",
40
+ backgroundImage: {
41
+ height: 80,
42
+ url: "web+graphie://ka-perseus-graphie.s3.amazonaws.com/3351ccf19e60c28a1d08664f5c16defa76ed0348",
43
+ width: 380,
44
+ },
45
+ },
46
+ static: false,
47
+ type: "image",
48
+ version: {major: 0, minor: 0},
49
+ };
50
+
51
+ export const inputNumberWidget: InputNumberWidget = {
52
+ version: {
53
+ major: 0,
54
+ minor: 0,
55
+ },
56
+ type: "input-number",
57
+ graded: true,
58
+ alignment: "default",
59
+ options: {
60
+ maxError: 0.1,
61
+ inexact: false,
62
+ value: 0.3333333333333333,
63
+ simplify: "optional",
64
+ answerType: "rational",
65
+ size: "normal",
66
+ },
67
+ };
68
+
69
+ export const question1: PerseusRenderer = {
70
+ content:
71
+ "The total number of boxes the forklift can carry is [[☃ dropdown 1]] $60$.",
72
+ images: {},
73
+ widgets: {"dropdown 1": dropdownWidget},
74
+ };
75
+
76
+ export const question2: PerseusRenderer = {
77
+ content:
78
+ "Denis baked a peach pie and cut it into $3$ equal-sized pieces. Denis's dad eats $1$ section of the pie. \n\n**What fraction of the pie did Denis's dad eat?** \n![](https://ka-perseus-graphie.s3.amazonaws.com/74a2b7583a2c26ebfb3ad714e29867541253fc97.png) \n[[\u2603 input-number 1]] \n\n\n\n",
79
+ images: {
80
+ "https://ka-perseus-graphie.s3.amazonaws.com/74a2b7583a2c26ebfb3ad714e29867541253fc97.png":
81
+ {
82
+ width: 200,
83
+ height: 200,
84
+ },
85
+ },
86
+ widgets: {"input-number 1": inputNumberWidget},
87
+ };
88
+
89
+ // Note that if this item is used, you _must_ first register the MockWidget
90
+ export const mockedItem: PerseusRenderer = (({
91
+ // The mock widget type is not part of the PerseusWidget type union (and
92
+ // we don't want to make it such to avoid polluting our production types
93
+ // for test purposes) so we force Flow to accept it here.
94
+ content:
95
+ "Mock widgets ==> [[\u2603 mock-widget 1]] [[\u2603 mock-widget 2]] [[\u2603 mock-widget 3]]",
96
+ images: {},
97
+ widgets: {
98
+ "mock-widget 1": {
99
+ graded: true,
100
+ version: {major: 0, minor: 0},
101
+ static: false,
102
+ type: "mock-widget",
103
+ options: {static: false, smiling: true},
104
+ alignment: "default",
105
+ },
106
+ "mock-widget 2": {
107
+ graded: true,
108
+ version: {major: 0, minor: 0},
109
+ static: false,
110
+ type: "mock-widget",
111
+ options: {static: false, smiling: false},
112
+ alignment: "default",
113
+ },
114
+ "mock-widget 3": {
115
+ graded: true,
116
+ version: {major: 0, minor: 0},
117
+ static: false,
118
+ type: "mock-widget",
119
+ options: {static: false, smiling: true},
120
+ alignment: "default",
121
+ },
122
+ },
123
+ }: any): PerseusRenderer);