@khanacademy/perseus 0.0.1 → 0.2.1

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 (507) hide show
  1. package/.babelrc.js +1 -1
  2. package/CHANGELOG.md +29 -0
  3. package/dist/es/index.css +4361 -0
  4. package/dist/es/index.js +7 -1
  5. package/dist/es/index.js.map +1 -1
  6. package/dist/index.css +4361 -0
  7. package/dist/index.js +7 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/strings.js +148 -46
  10. package/package.json +50 -4
  11. package/src/README.md +35 -0
  12. package/src/__stories__/item-renderer.stories.jsx +27 -0
  13. package/src/__stories__/server-item-renderer.stories.jsx +27 -0
  14. package/src/__testdata__/item-renderer_testdata.js +161 -0
  15. package/src/__testdata__/renderer_testdata.js +123 -0
  16. package/src/__tests__/__snapshots__/item-renderer_test.jsx.snap +233 -0
  17. package/src/__tests__/__snapshots__/perseus-markdown_test.jsx.snap +516 -0
  18. package/src/__tests__/__snapshots__/pure-markdown_test.js.snap +113 -0
  19. package/src/__tests__/__snapshots__/renderer_test.jsx.snap +576 -0
  20. package/src/__tests__/__snapshots__/server-item-renderer_test.jsx.snap +306 -0
  21. package/src/__tests__/a11y_test.jsx +304 -0
  22. package/src/__tests__/item-renderer_test.jsx +892 -0
  23. package/src/__tests__/mock-asset-loading-widget.jsx +57 -0
  24. package/src/__tests__/mock-widget.jsx +35 -0
  25. package/src/__tests__/perseus-markdown_test.jsx +747 -0
  26. package/src/__tests__/pure-markdown_test.js +552 -0
  27. package/src/__tests__/renderability_test.jsx +481 -0
  28. package/src/__tests__/renderer-api_test.jsx +333 -0
  29. package/src/__tests__/renderer_test.jsx +1792 -0
  30. package/src/__tests__/server-item-renderer_test.jsx +516 -0
  31. package/src/__tests__/test-items/image-item.js +25 -0
  32. package/src/__tests__/test-items/input-number-1-item.js +27 -0
  33. package/src/__tests__/test-items/input-number-2-item.js +39 -0
  34. package/src/__tests__/test-items/table-item.js +30 -0
  35. package/src/__tests__/tex-wrangler_test.js +83 -0
  36. package/src/__tests__/util_test.js +41 -0
  37. package/src/a11y.js +46 -0
  38. package/src/all-widgets.js +9 -0
  39. package/src/article-renderer.jsx +215 -0
  40. package/src/asset-context.js +30 -0
  41. package/src/basic-widgets.js +13 -0
  42. package/src/components/__stories__/button-group.stories.jsx +61 -0
  43. package/src/components/__stories__/fixed-to-responsive.stories.jsx +132 -0
  44. package/src/components/__stories__/graph.stories.jsx +27 -0
  45. package/src/components/__stories__/graphie.stories.jsx +28 -0
  46. package/src/components/__stories__/hud.stories.jsx +36 -0
  47. package/src/components/__stories__/icon.stories.jsx +56 -0
  48. package/src/components/__stories__/image-loader.stories.jsx +60 -0
  49. package/src/components/__stories__/info-tip.stories.jsx +33 -0
  50. package/src/components/__stories__/inline-icon.stories.jsx +39 -0
  51. package/src/components/__stories__/input-with-examples.stories.jsx +51 -0
  52. package/src/components/__stories__/lint.stories.jsx +40 -0
  53. package/src/components/__stories__/math-input.stories.jsx +29 -0
  54. package/src/components/__stories__/math-output.stories.jsx +24 -0
  55. package/src/components/__stories__/multi-button-group.stories.jsx +69 -0
  56. package/src/components/__stories__/number-input.stories.jsx +42 -0
  57. package/src/components/__stories__/possible-answers.stories.jsx +22 -0
  58. package/src/components/__stories__/prop-check-box.stories.jsx +62 -0
  59. package/src/components/__stories__/range-input.stories.jsx +28 -0
  60. package/src/components/__stories__/simple-keypad-input.stories.jsx +28 -0
  61. package/src/components/__stories__/sortable.stories.jsx +73 -0
  62. package/src/components/__stories__/stub-tag-editor.stories.jsx +44 -0
  63. package/src/components/__stories__/svg-image.stories.jsx +60 -0
  64. package/src/components/__stories__/tex.stories.jsx +18 -0
  65. package/src/components/__stories__/text-buttons.stories.jsx +51 -0
  66. package/src/components/__stories__/text-input.stories.jsx +34 -0
  67. package/src/components/__stories__/text-list-editor.stories.jsx +33 -0
  68. package/src/components/__stories__/zoomable-tex.stories.jsx +39 -0
  69. package/src/components/__stories__/zoomable.stories.jsx +40 -0
  70. package/src/components/__testdata__/sorter_testdata.js +20 -0
  71. package/src/components/__tests__/__snapshots__/sortable_test.jsx.snap +79 -0
  72. package/src/components/__tests__/__snapshots__/sorter_test.jsx.snap +297 -0
  73. package/src/components/__tests__/number-input_test.jsx +112 -0
  74. package/src/components/__tests__/sortable_test.jsx +234 -0
  75. package/src/components/__tests__/sorter_test.jsx +111 -0
  76. package/src/components/__tests__/zoomable_test.jsx +388 -0
  77. package/src/components/button-group.jsx +131 -0
  78. package/src/components/constants.js +15 -0
  79. package/src/components/fixed-to-responsive.jsx +164 -0
  80. package/src/components/graph.jsx +415 -0
  81. package/src/components/graphie-classes.jsx +148 -0
  82. package/src/components/graphie-movables.jsx +342 -0
  83. package/src/components/graphie.jsx +353 -0
  84. package/src/components/highlighting/highlightable-content.jsx +245 -0
  85. package/src/components/highlighting/highlights.js +208 -0
  86. package/src/components/highlighting/ranges.js +299 -0
  87. package/src/components/highlighting/types.js +73 -0
  88. package/src/components/highlighting/ui/highlight-renderer.jsx +179 -0
  89. package/src/components/highlighting/ui/highlight-set-renderer.jsx +190 -0
  90. package/src/components/highlighting/ui/highlight-tooltip.jsx +153 -0
  91. package/src/components/highlighting/ui/highlighting-ui.jsx +163 -0
  92. package/src/components/highlighting/ui/selection-tracker.jsx +195 -0
  93. package/src/components/highlighting/ui/types.js +21 -0
  94. package/src/components/highlighting/ui/util.js +166 -0
  95. package/src/components/highlighting/word-indexer.jsx +155 -0
  96. package/src/components/hud.jsx +179 -0
  97. package/src/components/icon.jsx +149 -0
  98. package/src/components/image-loader.jsx +175 -0
  99. package/src/components/info-tip/info-tip.jsx +146 -0
  100. package/src/components/info-tip.jsx +38 -0
  101. package/src/components/inline-icon.jsx +81 -0
  102. package/src/components/input-with-examples.jsx +231 -0
  103. package/src/components/lint.jsx +454 -0
  104. package/src/components/math-input.jsx +282 -0
  105. package/src/components/math-output.jsx +128 -0
  106. package/src/components/multi-button-group.jsx +137 -0
  107. package/src/components/new-tooltip/README.md +110 -0
  108. package/src/components/new-tooltip/__stories__/flexible-position.stories.jsx +437 -0
  109. package/src/components/new-tooltip/__stories__/new-tooltip.stories.jsx +665 -0
  110. package/src/components/new-tooltip/__stories__/tooltip-arrow.stories.jsx +70 -0
  111. package/src/components/new-tooltip/__stories__/tooltip-bubble.stories.jsx +98 -0
  112. package/src/components/new-tooltip/__tests__/style-constants_test.js +8 -0
  113. package/src/components/new-tooltip/__tests__/util_test.js +47 -0
  114. package/src/components/new-tooltip/flexible-position.jsx +182 -0
  115. package/src/components/new-tooltip/new-tooltip.jsx +399 -0
  116. package/src/components/new-tooltip/style-constants.js +13 -0
  117. package/src/components/new-tooltip/tooltip-arrow.jsx +184 -0
  118. package/src/components/new-tooltip/tooltip-bubble.jsx +223 -0
  119. package/src/components/new-tooltip/tooltip-portal.jsx +101 -0
  120. package/src/components/new-tooltip/tooltip-positioner.jsx +529 -0
  121. package/src/components/new-tooltip/types.js +183 -0
  122. package/src/components/new-tooltip/util.js +27 -0
  123. package/src/components/number-input.jsx +253 -0
  124. package/src/components/possible-answers.jsx +36 -0
  125. package/src/components/prop-check-box.jsx +80 -0
  126. package/src/components/range-input.jsx +61 -0
  127. package/src/components/simple-keypad-input.jsx +91 -0
  128. package/src/components/sortable.jsx +873 -0
  129. package/src/components/stub-tag-editor.jsx +54 -0
  130. package/src/components/svg-image.jsx +762 -0
  131. package/src/components/tex-buttons.jsx +322 -0
  132. package/src/components/tex.jsx +70 -0
  133. package/src/components/text-input.jsx +82 -0
  134. package/src/components/text-list-editor.jsx +157 -0
  135. package/src/components/tooltip.jsx +395 -0
  136. package/src/components/visibility-observer/__stories__/visibility-observer.stories.jsx +140 -0
  137. package/src/components/visibility-observer/get-scroll-parent.js +45 -0
  138. package/src/components/visibility-observer/visibility-observer.js +109 -0
  139. package/src/components/visibility-observer/visibility-observer.jsx +123 -0
  140. package/src/components/zoomable-tex.jsx +70 -0
  141. package/src/components/zoomable.jsx +304 -0
  142. package/src/components.js +17 -0
  143. package/src/dependencies.js +22 -0
  144. package/src/error-boundary.jsx +48 -0
  145. package/src/extra-widgets.js +75 -0
  146. package/src/gorgon/README +40 -0
  147. package/src/gorgon/__tests__/matcher_test.js +497 -0
  148. package/src/gorgon/__tests__/rule_test.js +101 -0
  149. package/src/gorgon/__tests__/rules_test.js +487 -0
  150. package/src/gorgon/__tests__/selector-parser_test.js +52 -0
  151. package/src/gorgon/__tests__/tree-transformer_test.js +446 -0
  152. package/src/gorgon/gorgon.js +290 -0
  153. package/src/gorgon/proptypes.js +29 -0
  154. package/src/gorgon/rule.js +413 -0
  155. package/src/gorgon/rules/absolute-url.js +24 -0
  156. package/src/gorgon/rules/all-rules.js +72 -0
  157. package/src/gorgon/rules/blockquoted-math.js +10 -0
  158. package/src/gorgon/rules/blockquoted-widget.js +10 -0
  159. package/src/gorgon/rules/double-spacing-after-terminal.js +12 -0
  160. package/src/gorgon/rules/extra-content-spacing.js +12 -0
  161. package/src/gorgon/rules/heading-level-1.js +14 -0
  162. package/src/gorgon/rules/heading-level-skip.js +20 -0
  163. package/src/gorgon/rules/heading-sentence-case.js +11 -0
  164. package/src/gorgon/rules/heading-title-case.js +63 -0
  165. package/src/gorgon/rules/image-alt-text.js +21 -0
  166. package/src/gorgon/rules/image-in-table.js +10 -0
  167. package/src/gorgon/rules/image-spaces-around-urls.js +35 -0
  168. package/src/gorgon/rules/image-widget.js +50 -0
  169. package/src/gorgon/rules/link-click-here.js +11 -0
  170. package/src/gorgon/rules/lint-utils.js +48 -0
  171. package/src/gorgon/rules/long-paragraph.js +14 -0
  172. package/src/gorgon/rules/math-adjacent.js +10 -0
  173. package/src/gorgon/rules/math-align-extra-break.js +11 -0
  174. package/src/gorgon/rules/math-align-linebreaks.js +43 -0
  175. package/src/gorgon/rules/math-empty.js +10 -0
  176. package/src/gorgon/rules/math-font-size.js +12 -0
  177. package/src/gorgon/rules/math-frac.js +10 -0
  178. package/src/gorgon/rules/math-nested.js +11 -0
  179. package/src/gorgon/rules/math-starts-with-space.js +12 -0
  180. package/src/gorgon/rules/math-text-empty.js +10 -0
  181. package/src/gorgon/rules/math-without-dollars.js +14 -0
  182. package/src/gorgon/rules/nested-lists.js +11 -0
  183. package/src/gorgon/rules/profanity.js +10 -0
  184. package/src/gorgon/rules/table-missing-cells.js +20 -0
  185. package/src/gorgon/rules/unbalanced-code-delimiters.js +14 -0
  186. package/src/gorgon/rules/unescaped-dollar.js +10 -0
  187. package/src/gorgon/rules/widget-in-table.js +10 -0
  188. package/src/gorgon/selector.js +506 -0
  189. package/src/gorgon/tree-transformer.js +588 -0
  190. package/src/hint-renderer.jsx +159 -0
  191. package/src/hints-renderer.jsx +359 -0
  192. package/src/icon-paths.js +120 -0
  193. package/src/index.js +149 -2
  194. package/src/init.js +49 -0
  195. package/src/interaction-tracker.js +60 -0
  196. package/src/interactive2/__tests__/movable-mock.js +48 -0
  197. package/src/interactive2/__tests__/movable-point_test.js +146 -0
  198. package/src/interactive2/interactive-util.js +152 -0
  199. package/src/interactive2/movable-helper-methods.js +160 -0
  200. package/src/interactive2/movable-line-options.js +392 -0
  201. package/src/interactive2/movable-line.js +322 -0
  202. package/src/interactive2/movable-point-options.js +190 -0
  203. package/src/interactive2/movable-point.jsx +603 -0
  204. package/src/interactive2/movable-polygon-options.js +351 -0
  205. package/src/interactive2/movable-polygon.js +368 -0
  206. package/src/interactive2/movable.js +273 -0
  207. package/src/interactive2/objective_.js +79 -0
  208. package/src/interactive2/types.js +3 -0
  209. package/src/interactive2/wrapped-defaults.js +86 -0
  210. package/src/interactive2/wrapped-ellipse.js +87 -0
  211. package/src/interactive2/wrapped-line.js +109 -0
  212. package/src/interactive2/wrapped-path.js +47 -0
  213. package/src/interactive2.js +91 -0
  214. package/src/item-renderer.jsx +518 -0
  215. package/src/item-version.js +12 -0
  216. package/src/jipt-paragraphs.js +44 -0
  217. package/src/jquery.mobile.vmouse.js +545 -0
  218. package/src/keypad-context.js +33 -0
  219. package/src/loading-context.js +20 -0
  220. package/src/logging/log.js +107 -0
  221. package/src/logging/log_test.js +41 -0
  222. package/src/mixins/changeable.jsx +115 -0
  223. package/src/mixins/editor-jsonify.jsx +13 -0
  224. package/src/mixins/provide-keypad.jsx +129 -0
  225. package/src/mixins/widget-jsonify-deprecated.jsx +23 -0
  226. package/src/mixins/widget-prop-blacklist.js +36 -0
  227. package/src/multi-items/__stories__/multi-renderer.stories.js +88 -0
  228. package/src/multi-items/__testdata__/multi-renderer_testdata.js +174 -0
  229. package/src/multi-items/__tests__/__snapshots__/multi-renderer_test.js.snap +994 -0
  230. package/src/multi-items/__tests__/items_test.js +245 -0
  231. package/src/multi-items/__tests__/multi-renderer_test.js +903 -0
  232. package/src/multi-items/__tests__/prop-type-builders_test.js +134 -0
  233. package/src/multi-items/__tests__/shapes_test.js +44 -0
  234. package/src/multi-items/__tests__/trees_test.js +316 -0
  235. package/src/multi-items/item-types.js +55 -0
  236. package/src/multi-items/items.js +176 -0
  237. package/src/multi-items/multi-renderer.jsx +543 -0
  238. package/src/multi-items/prop-type-builders.js +105 -0
  239. package/src/multi-items/shape-types.js +47 -0
  240. package/src/multi-items/shapes.js +53 -0
  241. package/src/multi-items/tree-types.js +42 -0
  242. package/src/multi-items/trees.js +345 -0
  243. package/src/multi-items.js +76 -0
  244. package/src/not-gorgon.js +129 -0
  245. package/src/perseus-api.jsx +270 -0
  246. package/src/perseus-env.js +26 -0
  247. package/src/perseus-error.js +19 -0
  248. package/src/perseus-markdown.jsx +433 -0
  249. package/src/perseus-types.js +1597 -0
  250. package/src/pure-markdown.js +347 -0
  251. package/src/question-paragraph.jsx +30 -0
  252. package/src/renderability.jsx +108 -0
  253. package/src/renderer.jsx +1932 -0
  254. package/src/server-item-renderer.jsx +467 -0
  255. package/src/sigfigs.jsx +492 -0
  256. package/src/styles/articles.less +748 -0
  257. package/src/styles/constants.js +119 -0
  258. package/src/styles/global-constants.js +350 -0
  259. package/src/styles/global-styles.js +307 -0
  260. package/src/styles/khan-exercise.css +1304 -0
  261. package/src/styles/media-queries.js +48 -0
  262. package/src/styles/perseus-renderer.less +1007 -0
  263. package/src/styles/shared.js +132 -0
  264. package/src/styles/util.less +47 -0
  265. package/src/styles/variables.boostrap.less +301 -0
  266. package/src/styles/variables.less +68 -0
  267. package/src/styles/variables.shared.less +356 -0
  268. package/src/styles/widgets/categorizer.less +39 -0
  269. package/src/styles/widgets/definition.less +86 -0
  270. package/src/styles/widgets/dropdown.less +3 -0
  271. package/src/styles/widgets/expression.less +147 -0
  272. package/src/styles/widgets/graded-group.less +36 -0
  273. package/src/styles/widgets/grapher.less +11 -0
  274. package/src/styles/widgets/group.less +19 -0
  275. package/src/styles/widgets/image.less +29 -0
  276. package/src/styles/widgets/interactive-graph.less +61 -0
  277. package/src/styles/widgets/label-image.less +41 -0
  278. package/src/styles/widgets/matcher.less +8 -0
  279. package/src/styles/widgets/matrix.less +120 -0
  280. package/src/styles/widgets/measurer.less +20 -0
  281. package/src/styles/widgets/orderer.less +97 -0
  282. package/src/styles/widgets/passage.less +151 -0
  283. package/src/styles/widgets/plotter.less +33 -0
  284. package/src/styles/widgets/radio.less +52 -0
  285. package/src/styles/widgets/reaction-diagram.less +35 -0
  286. package/src/styles/widgets/sequence.less +5 -0
  287. package/src/styles/widgets/sortable.less +127 -0
  288. package/src/styles/widgets/table.less +56 -0
  289. package/src/styles/widgets/transformer.less +28 -0
  290. package/src/styles/widgets/unit.less +14 -0
  291. package/src/tex-wrangler.js +176 -0
  292. package/src/traversal.jsx +141 -0
  293. package/src/types.js +538 -0
  294. package/src/util/a11y.js +24 -0
  295. package/src/util/answer-types.js +862 -0
  296. package/src/util/answer-types_test.js +115 -0
  297. package/src/util/colors.js +94 -0
  298. package/src/util/fix-passage-refs.jsx +122 -0
  299. package/src/util/graph-utils.js +16 -0
  300. package/src/util/graphie.js +1586 -0
  301. package/src/util/interactive.js +4078 -0
  302. package/src/util/katex-preprocess.js +16 -0
  303. package/src/util/math.js +296 -0
  304. package/src/util/mobile-native-utils.js +14 -0
  305. package/src/util/mobile-native-utils_test.js +24 -0
  306. package/src/util/register-all-widgets-for-testing.js +12 -0
  307. package/src/util/scroll-utils.js +162 -0
  308. package/src/util/sizing-utils.js +46 -0
  309. package/src/util/tex.js +203 -0
  310. package/src/util/url-utils.js +36 -0
  311. package/src/util.js +990 -0
  312. package/src/version.js +11 -0
  313. package/src/widget-container.jsx +174 -0
  314. package/src/widgets/__stories__/categorizer.stories.jsx +15 -0
  315. package/src/widgets/__stories__/cs-program.stories.jsx +15 -0
  316. package/src/widgets/__stories__/definition.stories.jsx +38 -0
  317. package/src/widgets/__stories__/dropdown.stories.jsx +15 -0
  318. package/src/widgets/__stories__/explanation.stories.jsx +19 -0
  319. package/src/widgets/__stories__/expression.stories.jsx +26 -0
  320. package/src/widgets/__stories__/graded-group-set.stories.jsx +32 -0
  321. package/src/widgets/__stories__/graded-group.stories.jsx +32 -0
  322. package/src/widgets/__stories__/grapher.stories.jsx +47 -0
  323. package/src/widgets/__stories__/group.stories.jsx +15 -0
  324. package/src/widgets/__stories__/iframe.stories.jsx +15 -0
  325. package/src/widgets/__stories__/image.stories.jsx +62 -0
  326. package/src/widgets/__stories__/input-number.stories.jsx +90 -0
  327. package/src/widgets/__stories__/interaction.stories.jsx +15 -0
  328. package/src/widgets/__stories__/interactive-graph.stories.jsx +61 -0
  329. package/src/widgets/__stories__/matcher.stories.jsx +15 -0
  330. package/src/widgets/__stories__/matrix.stories.jsx +15 -0
  331. package/src/widgets/__stories__/number-line.stories.jsx +15 -0
  332. package/src/widgets/__stories__/numeric-input.stories.jsx +19 -0
  333. package/src/widgets/__stories__/orderer.stories.jsx +15 -0
  334. package/src/widgets/__stories__/passage-ref.stories.jsx +19 -0
  335. package/src/widgets/__stories__/passage.stories.jsx +19 -0
  336. package/src/widgets/__stories__/radio.stories.jsx +82 -0
  337. package/src/widgets/__stories__/sorter.stories.jsx +15 -0
  338. package/src/widgets/__stories__/transformer.stories.jsx +15 -0
  339. package/src/widgets/__stories__/unit.stories.jsx +45 -0
  340. package/src/widgets/__stories__/video-transcript-link.stories.jsx +24 -0
  341. package/src/widgets/__stories__/video.stories.jsx +15 -0
  342. package/src/widgets/__testdata__/categorizer_testdata.js +50 -0
  343. package/src/widgets/__testdata__/cs-program_testdata.js +28 -0
  344. package/src/widgets/__testdata__/dropdown_testdata.js +34 -0
  345. package/src/widgets/__testdata__/explanation_testdata.js +56 -0
  346. package/src/widgets/__testdata__/expression_testdata.js +95 -0
  347. package/src/widgets/__testdata__/graded-group-set_testdata.js +358 -0
  348. package/src/widgets/__testdata__/graded-group_testdata.js +79 -0
  349. package/src/widgets/__testdata__/grapher_testdata.js +376 -0
  350. package/src/widgets/__testdata__/group_testdata.js +156 -0
  351. package/src/widgets/__testdata__/iframe_testdata.js +36 -0
  352. package/src/widgets/__testdata__/image_testdata.js +38 -0
  353. package/src/widgets/__testdata__/input-number_testdata.js +73 -0
  354. package/src/widgets/__testdata__/interaction_testdata.js +264 -0
  355. package/src/widgets/__testdata__/interactive-graph_testdata.js +646 -0
  356. package/src/widgets/__testdata__/matcher_testdata.js +34 -0
  357. package/src/widgets/__testdata__/matrix_testdata.js +29 -0
  358. package/src/widgets/__testdata__/number-line_testdata.js +31 -0
  359. package/src/widgets/__testdata__/numeric-input_testdata.js +266 -0
  360. package/src/widgets/__testdata__/orderer_testdata.js +58 -0
  361. package/src/widgets/__testdata__/passage-ref_testdata.js +41 -0
  362. package/src/widgets/__testdata__/passage_testdata.js +71 -0
  363. package/src/widgets/__testdata__/radio_testdata.js +210 -0
  364. package/src/widgets/__testdata__/sorter_testdata.js +20 -0
  365. package/src/widgets/__testdata__/transformer_testdata.js +109 -0
  366. package/src/widgets/__testdata__/video_testdata.js +22 -0
  367. package/src/widgets/__tests__/__snapshots__/categorizer_test.jsx.snap +928 -0
  368. package/src/widgets/__tests__/__snapshots__/cs-program_test.jsx.snap +75 -0
  369. package/src/widgets/__tests__/__snapshots__/definition_test.js.snap +99 -0
  370. package/src/widgets/__tests__/__snapshots__/dropdown_test.jsx.snap +143 -0
  371. package/src/widgets/__tests__/__snapshots__/explanation_test.js.snap +473 -0
  372. package/src/widgets/__tests__/__snapshots__/expression_test.jsx.snap +38 -0
  373. package/src/widgets/__tests__/__snapshots__/graded-group-set-jipt_test.jsx.snap +754 -0
  374. package/src/widgets/__tests__/__snapshots__/graded-group-set_test.jsx.snap +310 -0
  375. package/src/widgets/__tests__/__snapshots__/graded-group_test.jsx.snap +863 -0
  376. package/src/widgets/__tests__/__snapshots__/grapher_test.jsx.snap +2880 -0
  377. package/src/widgets/__tests__/__snapshots__/group_test.jsx.snap +1154 -0
  378. package/src/widgets/__tests__/__snapshots__/iframe_test.jsx.snap +69 -0
  379. package/src/widgets/__tests__/__snapshots__/image_test.jsx.snap +388 -0
  380. package/src/widgets/__tests__/__snapshots__/input-number_test.jsx.snap +978 -0
  381. package/src/widgets/__tests__/__snapshots__/interaction_test.jsx.snap +311 -0
  382. package/src/widgets/__tests__/__snapshots__/interactive-graph_test.jsx.snap +2915 -0
  383. package/src/widgets/__tests__/__snapshots__/matcher_test.jsx.snap +1039 -0
  384. package/src/widgets/__tests__/__snapshots__/matrix_test.jsx.snap +450 -0
  385. package/src/widgets/__tests__/__snapshots__/number-line_test.jsx.snap +888 -0
  386. package/src/widgets/__tests__/__snapshots__/numeric-input_test.jsx.snap +930 -0
  387. package/src/widgets/__tests__/__snapshots__/orderer_test.jsx.snap +275 -0
  388. package/src/widgets/__tests__/__snapshots__/passage-ref_test.jsx.snap +446 -0
  389. package/src/widgets/__tests__/__snapshots__/passage_test.jsx.snap +1988 -0
  390. package/src/widgets/__tests__/__snapshots__/radio_test.jsx.snap +7107 -0
  391. package/src/widgets/__tests__/__snapshots__/video_test.jsx.snap +163 -0
  392. package/src/widgets/__tests__/categorizer_test.jsx +205 -0
  393. package/src/widgets/__tests__/cs-program_test.jsx +45 -0
  394. package/src/widgets/__tests__/definition_test.js +152 -0
  395. package/src/widgets/__tests__/dropdown_test.jsx +106 -0
  396. package/src/widgets/__tests__/explanation_test.js +199 -0
  397. package/src/widgets/__tests__/expression_test.jsx +439 -0
  398. package/src/widgets/__tests__/graded-group-set-jipt_test.jsx +33 -0
  399. package/src/widgets/__tests__/graded-group-set_test.jsx +270 -0
  400. package/src/widgets/__tests__/graded-group_test.jsx +233 -0
  401. package/src/widgets/__tests__/grapher.cypress.jsx +486 -0
  402. package/src/widgets/__tests__/grapher_test.jsx +35 -0
  403. package/src/widgets/__tests__/group_test.jsx +512 -0
  404. package/src/widgets/__tests__/iframe_test.jsx +47 -0
  405. package/src/widgets/__tests__/image_test.jsx +65 -0
  406. package/src/widgets/__tests__/input-number_test.jsx +360 -0
  407. package/src/widgets/__tests__/interaction_test.jsx +33 -0
  408. package/src/widgets/__tests__/interactive-graph.cypress.jsx +697 -0
  409. package/src/widgets/__tests__/interactive-graph_test.jsx +105 -0
  410. package/src/widgets/__tests__/matcher_test.jsx +157 -0
  411. package/src/widgets/__tests__/matrix_test.jsx +84 -0
  412. package/src/widgets/__tests__/number-line_test.jsx +81 -0
  413. package/src/widgets/__tests__/numeric-input_test.jsx +574 -0
  414. package/src/widgets/__tests__/orderer_test.jsx +75 -0
  415. package/src/widgets/__tests__/passage-ref_test.jsx +166 -0
  416. package/src/widgets/__tests__/passage_test.jsx +133 -0
  417. package/src/widgets/__tests__/radio/base-radio_test.jsx +82 -0
  418. package/src/widgets/__tests__/radio_test.jsx +651 -0
  419. package/src/widgets/__tests__/renderQuestion.jsx +66 -0
  420. package/src/widgets/__tests__/unit_test.jsx +144 -0
  421. package/src/widgets/__tests__/video_test.jsx +55 -0
  422. package/src/widgets/categorizer.jsx +338 -0
  423. package/src/widgets/cs-program.jsx +227 -0
  424. package/src/widgets/definition.jsx +141 -0
  425. package/src/widgets/dropdown.jsx +143 -0
  426. package/src/widgets/explanation.jsx +315 -0
  427. package/src/widgets/expression.jsx +652 -0
  428. package/src/widgets/graded-group-answer-bar.jsx +152 -0
  429. package/src/widgets/graded-group-set.jsx +285 -0
  430. package/src/widgets/graded-group.jsx +448 -0
  431. package/src/widgets/grapher/util.jsx +806 -0
  432. package/src/widgets/grapher.jsx +663 -0
  433. package/src/widgets/group.jsx +213 -0
  434. package/src/widgets/iframe.jsx +198 -0
  435. package/src/widgets/image.jsx +310 -0
  436. package/src/widgets/input-number.jsx +411 -0
  437. package/src/widgets/interaction/arrow-picker.jsx +39 -0
  438. package/src/widgets/interaction/color-picker.jsx +69 -0
  439. package/src/widgets/interaction/dash-picker.jsx +46 -0
  440. package/src/widgets/interaction/element-container.jsx +97 -0
  441. package/src/widgets/interaction.jsx +742 -0
  442. package/src/widgets/interactive-graph.jsx +2820 -0
  443. package/src/widgets/label-image/__stories__/answer-choices.stories.jsx +93 -0
  444. package/src/widgets/label-image/__stories__/marker.stories.jsx +172 -0
  445. package/src/widgets/label-image/answer-choices.jsx +311 -0
  446. package/src/widgets/label-image/marker.jsx +365 -0
  447. package/src/widgets/label-image/types.js +33 -0
  448. package/src/widgets/label-image.jsx +841 -0
  449. package/src/widgets/label-image_test.js +840 -0
  450. package/src/widgets/lights-puzzle.jsx +356 -0
  451. package/src/widgets/matcher.jsx +271 -0
  452. package/src/widgets/matrix.jsx +616 -0
  453. package/src/widgets/measurer.jsx +215 -0
  454. package/src/widgets/molecule/__tests__/layout_test.jsx +159 -0
  455. package/src/widgets/molecule/__tests__/parser_test.jsx +142 -0
  456. package/src/widgets/molecule/molecule-drawing.jsx +175 -0
  457. package/src/widgets/molecule/molecule-layout.jsx +367 -0
  458. package/src/widgets/molecule/smiles-parser.jsx +300 -0
  459. package/src/widgets/molecule.jsx +172 -0
  460. package/src/widgets/number-line.jsx +858 -0
  461. package/src/widgets/numeric-input.jsx +622 -0
  462. package/src/widgets/orderer.jsx +753 -0
  463. package/src/widgets/passage/__tests__/passage-markdown_test.jsx +382 -0
  464. package/src/widgets/passage/get-line-height-for-node.js +10 -0
  465. package/src/widgets/passage/passage-markdown.jsx +416 -0
  466. package/src/widgets/passage-ref-target.jsx +70 -0
  467. package/src/widgets/passage-ref.jsx +198 -0
  468. package/src/widgets/passage.jsx +601 -0
  469. package/src/widgets/plotter.jsx +1198 -0
  470. package/src/widgets/radio/__stories__/base-radio.stories.jsx +40 -0
  471. package/src/widgets/radio/__stories__/choice-icon.stories.jsx +157 -0
  472. package/src/widgets/radio/__stories__/choice-none-above.stories.jsx +26 -0
  473. package/src/widgets/radio/__stories__/cross-out-button.stories.jsx +64 -0
  474. package/src/widgets/radio/__stories__/cross-out-menu.stories.jsx +59 -0
  475. package/src/widgets/radio/__stories__/cross-out-tooltip.stories.jsx +59 -0
  476. package/src/widgets/radio/__stories__/focus-ring.stories.jsx +38 -0
  477. package/src/widgets/radio/__stories__/option-status.stories.jsx +118 -0
  478. package/src/widgets/radio/__stories__/toggleable-radio-button.stories.jsx +28 -0
  479. package/src/widgets/radio/base-radio.jsx +642 -0
  480. package/src/widgets/radio/choice-icon.jsx +468 -0
  481. package/src/widgets/radio/choice-none-above.jsx +54 -0
  482. package/src/widgets/radio/choice.jsx +692 -0
  483. package/src/widgets/radio/choice.jsx.fixture.js +64 -0
  484. package/src/widgets/radio/cross-out-button.jsx +136 -0
  485. package/src/widgets/radio/cross-out-menu-wrapper.jsx +492 -0
  486. package/src/widgets/radio/cross-out-tooltip.jsx +129 -0
  487. package/src/widgets/radio/focus-ring.jsx +51 -0
  488. package/src/widgets/radio/option-status.jsx +89 -0
  489. package/src/widgets/radio/toggleable-radio-button.jsx +133 -0
  490. package/src/widgets/radio/util.js +32 -0
  491. package/src/widgets/radio/util_test.js +19 -0
  492. package/src/widgets/radio/widget.jsx +470 -0
  493. package/src/widgets/radio.jsx +156 -0
  494. package/src/widgets/reaction-diagram.jsx +137 -0
  495. package/src/widgets/sequence.jsx +140 -0
  496. package/src/widgets/simulator.jsx +808 -0
  497. package/src/widgets/sorter.jsx +146 -0
  498. package/src/widgets/table.jsx +394 -0
  499. package/src/widgets/transformer.jsx +2876 -0
  500. package/src/widgets/unit.jsx +372 -0
  501. package/src/widgets/video-transcript-link.jsx +84 -0
  502. package/src/widgets/video-transcript-link_test.js +211 -0
  503. package/src/widgets/video.jsx +126 -0
  504. package/src/widgets.js +431 -0
  505. package/src/zoom.js +539 -0
  506. package/README.md +0 -3
  507. package/src/__tests__/index.test.js +0 -14
package/dist/strings.js CHANGED
@@ -5,50 +5,152 @@
5
5
  */
6
6
 
7
7
  module.exports = [
8
- i18n._("Cosine", {}),
9
- i18n._("Cube", {}),
10
- i18n._("Cube root", {}),
11
- i18n._("Custom exponent", {}),
12
- i18n._("Decimal", {}),
13
- i18n._("Delete", {}),
14
- i18n._("Dismiss", {}),
15
- i18n._("Divide", {}),
16
- i18n._("Down arrow", {}),
17
- i18n._("Equals sign", {}),
18
- i18n._("foo", {}),
19
- i18n._("Fraction, excluding the current expression", {}),
20
- i18n._("Fraction, with current expression in numerator", {}),
21
- i18n._("Greater than or equal to sign", {}),
22
- i18n._("Greater than sign", {}),
23
- i18n._("Left arrow", {}),
24
- i18n._("Left parenthesis", {}),
25
- i18n._("Less than or equal to sign", {}),
26
- i18n._("Less than sign", {}),
27
- i18n._("Logarithm with base 10", {}),
28
- i18n._("Logarithm with custom base", {}),
29
- i18n._("Math input box", {}),
30
- i18n._("Minus", {}),
31
- i18n._("Multiply", {}),
32
- i18n._("Natural logarithm", {}),
33
- i18n._("Navigate right into the numerator of a fraction", {}),
34
- i18n._("Navigate right out of a base", {}),
35
- i18n._("Navigate right out of a set of parentheses", {}),
36
- i18n._("Navigate right out of an exponent", {}),
37
- i18n._("Navigate right out of the denominator of a fraction", {}),
38
- i18n._("Navigate right out of the numerator and into the denominator", {}),
39
- i18n._("Negative", {}),
40
- i18n._("Not-equals sign", {}),
41
- i18n._("Percent", {}),
42
- i18n._("Pi", {}),
43
- i18n._("Plus", {}),
44
- i18n._("Radical with custom root", {}),
45
- i18n._("Right arrow", {}),
46
- i18n._("Right parenthesis", {}),
47
- i18n._("Sine", {}),
48
- i18n._("Square", {}),
49
- i18n._("Square root", {}),
50
- i18n._("Tangent", {}),
51
- i18n._("Tap with one or two fingers to open keyboard", {}),
52
- i18n._("Theta", {}),
53
- i18n._("Up arrow", {}),
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!", {}),
59
+ i18n._("Cross out", {}),
60
+ i18n._("Cross out Choice %(letter)s", {}),
61
+ // I18N: As in the command, "Dilate the polygon"
62
+ i18n._("Dilate", {}),
63
+ i18n._("dilation", {}),
64
+ i18n._("Dilation", {}),
65
+ i18n.$_("Dilation about %(point)s by %(scale)s", {}),
66
+ i18n.$_("Dilation of scale %(scale)s about %(point)s", {}),
67
+ i18n._("Drag handles to make graph", {}),
68
+ i18n._("End of reading passage.", {}),
69
+ i18n._("entered in an invalid answer.", {}),
70
+ i18n.$_("Error rendering: %(error)s", {}),
71
+ i18n._("Explain", {}),
72
+ i18n._("False", {}),
73
+ i18n._("Get another hint", {}),
74
+ i18n._("Hide explanation", {}),
75
+ i18n._("Hint #%(pos)s", {}),
76
+ i18n._("Hints", {}),
77
+ i18n._("I couldn't understand those units.", {}),
78
+ i18n._("I don't understand that", {}),
79
+ i18n._("I'm a computer. I only understand multiplication if you use an asterisk (*) as the multiplication sign.", {}),
80
+ i18n._("Incorrect", {}),
81
+ i18n._("Incorrect (selected)", {}),
82
+ i18n._("It looks like you left something blank or ", {}),
83
+ i18n._("Keep trying", {}),
84
+ i18n._("Khan Academy video wrapper", {}),
85
+ // I18N: a label next to a reading passage to denote the line number
86
+ i18n._("Line ", {}),
87
+ i18n.$_("line %(lineNumber)s", {}),
88
+ i18n.$_("lines %(lineRange)s", {}),
89
+ i18n._("Loading...", {}),
90
+ i18n._("Make circle filled", {}),
91
+ i18n._("Make circle open", {}),
92
+ i18n._("Make sure you fill in all cells in the matrix.", {}),
93
+ i18n._("Make sure you select something for every row.", {}),
94
+ i18n.ngettext("Moves: %(num)s","Moves: %(num)s", {}),
95
+ i18n._("Next question", {}),
96
+ i18n._("No", {}),
97
+ i18n._("None of the above", {}),
98
+ i18n._("Note: For this question, the shape will not move.", {}),
99
+ i18n._("Number of divisions:", {}),
100
+ i18n._("Number of trials:", {}),
101
+ i18n._("Open menu for Choice %(letter)s", {}),
102
+ i18n._("Parameter", {}),
103
+ i18n._("Please choose the correct number of answers.", {}),
104
+ i18n.$_("Please make sure the number of divisions is in the range %(divRangeString)s.", {}),
105
+ i18n._("Reaction arrow pointing to the right.", {}),
106
+ // I18N: As in the command, "Reflect the polygon"
107
+ i18n._("Reflect", {}),
108
+ i18n._("reflection", {}),
109
+ i18n._("Reflection", {}),
110
+ i18n.$_("Reflection over the line from %(point1)s to %(point2)s", {}),
111
+ i18n._("Remove highlight", {}),
112
+ // I18N: As in the command, "Rotate the polygon"
113
+ i18n._("Rotate", {}),
114
+ i18n._("rotation", {}),
115
+ i18n._("Rotation", {}),
116
+ // I18N: %(point)s must come before %(degrees)s in this phrase
117
+ i18n.$_("Rotation about %(point)s by %(degrees)s", {}),
118
+ i18n.$_("Rotation by %(degrees)s about %(point)s", {}),
119
+ i18n._("Run simulation", {}),
120
+ i18n._("Sample size:", {}),
121
+ i18n._("See video transcript", {}),
122
+ i18n._("Skip to %(title)s", {}),
123
+ i18n._("Something went wrong.", {}),
124
+ i18n._("Sorry, I don't understand that!", {}),
125
+ i18n._("Switch direction", {}),
126
+ i18n._("Tap each dot on the image to select all answers that apply.", {}),
127
+ i18n._("Tap each dot on the image to select an answer.", {}),
128
+ i18n._("Tap to add points", {}),
129
+ i18n._("That answer is numerically incorrect.", {}),
130
+ i18n._("The symbol %(questionSymbol)s indicates that question %(questionNumber)s references this portion of the passage.", {}),
131
+ i18n._("This controls the proportion or percentage that will be used in your simulation.", {}),
132
+ 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.", {}),
133
+ 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.", {}),
134
+ // I18N: As in the command, "Translate the polygon"
135
+ i18n._("Translate", {}),
136
+ i18n._("translation", {}),
137
+ i18n._("Translation", {}),
138
+ // I18N: As in the command, "Translation by <3, 1>"
139
+ i18n.$_("Translation by %(vector)s", {}),
140
+ i18n._("True", {}),
141
+ i18n._("Try again", {}),
142
+ i18n._("Undo", {}),
143
+ i18n._("Use the interactive graph to define a correct transformation.", {}),
144
+ i18n._("Value", {}),
145
+ i18n._("We could not understand your answer. Please check your answer for extra text or symbols.", {}),
146
+ i18n._("We couldn't grade your answer.", {}),
147
+ i18n._("Yes", {}),
148
+ i18n._("You must turn on all of the lights to continue.", {}),
149
+ i18n._("Your answer includes a wrong variable letter.", {}),
150
+ i18n._("Your answer includes use of a variable with the wrong case.", {}),
151
+ i18n._("Your answer is almost correct, but it is missing a <code>\\%</code> at the end.", {}),
152
+ i18n._("Your answer is almost correct, but it needs to be simplified.", {}),
153
+ 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>", {}),
154
+ i18n._("Your answer:", {}),
155
+ i18n._("Your transformation must use a %(type)s.", {}),
54
156
  ];
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.2.1",
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,66 @@
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/kmath": "0.0.5",
16
+ "@khanacademy/math-input": "^0.5.0",
17
+ "@khanacademy/kas": "^0.2.3",
18
+ "@khanacademy/simple-markdown": "^0.8.1",
19
+ "mathquill": "git+https://git@github.com/Khan/mathquill.git#a9ae54e057c5c1acc8244a5627acbff29901d992"
16
20
  },
17
21
  "devDependencies": {
22
+ "@khanacademy/wonder-blocks-button": "2.11.5",
23
+ "@khanacademy/wonder-blocks-color": "^1.1.20",
24
+ "@khanacademy/wonder-blocks-core": "^4.3.0",
25
+ "@khanacademy/wonder-blocks-data": "^7.0.0",
26
+ "@khanacademy/wonder-blocks-dropdown": "^2.6.7",
18
27
  "@khanacademy/wonder-blocks-i18n": "^1.2.3",
28
+ "@khanacademy/wonder-blocks-layout": "1.4.9",
29
+ "@khanacademy/wonder-blocks-link": "^3.8.5",
30
+ "@khanacademy/wonder-blocks-popover": "^1.1.10",
31
+ "@khanacademy/wonder-blocks-progress-spinner": "1.1.31",
32
+ "@khanacademy/wonder-blocks-spacing": "^3.0.5",
33
+ "@khanacademy/wonder-blocks-tooltip": "^1.3.10",
34
+ "@khanacademy/wonder-blocks-typography": "1.1.31",
35
+ "@khanacademy/wonder-stuff-core": "^0.1.2",
36
+ "aphrodite": "^1.2.5",
37
+ "classnames": "^1.1.4",
38
+ "create-react-class": "^15.6.3",
19
39
  "eslint-import-resolver-alias": "^1.1.2",
20
40
  "eslint-plugin-import": "^2.26.0",
41
+ "intersection-observer": "^0.12.0",
42
+ "jquery": "^2.1.1",
43
+ "lodash.debounce": "^4.0.8",
21
44
  "perseus-build-settings": "^0.0.1",
45
+ "prop-types": "^15.6.1",
22
46
  "react": "16.14.0",
23
- "react-dom": "16.14.0"
47
+ "react-dom": "16.14.0",
48
+ "underscore": "^1.4.4"
24
49
  },
25
50
  "peerDependencies": {
51
+ "@khanacademy/wonder-blocks-button": "2.11.5",
52
+ "@khanacademy/wonder-blocks-color": "^1.1.20",
53
+ "@khanacademy/wonder-blocks-core": "^4.3.0",
54
+ "@khanacademy/wonder-blocks-data": "^7.0.0",
55
+ "@khanacademy/wonder-blocks-dropdown": "^2.6.7",
26
56
  "@khanacademy/wonder-blocks-i18n": "^1.2.3",
57
+ "@khanacademy/wonder-blocks-layout": "1.4.9",
58
+ "@khanacademy/wonder-blocks-link": "^3.8.5",
59
+ "@khanacademy/wonder-blocks-popover": "^1.1.10",
60
+ "@khanacademy/wonder-blocks-progress-spinner": "1.1.31",
61
+ "@khanacademy/wonder-blocks-spacing": "^3.0.5",
62
+ "@khanacademy/wonder-blocks-tooltip": "^1.3.10",
63
+ "@khanacademy/wonder-blocks-typography": "1.1.31",
64
+ "@khanacademy/wonder-stuff-core": "^0.1.2",
65
+ "aphrodite": "^1.2.5",
66
+ "classnames": "^1.1.4",
67
+ "create-react-class": "^15.6.3",
68
+ "intersection-observer": "^0.12.0",
69
+ "jquery": "^2.1.1",
70
+ "lodash.debounce": "^4.0.8",
71
+ "prop-types": "^15.6.1",
27
72
  "react": "16.14.0",
28
- "react-dom": "16.14.0"
73
+ "react-dom": "16.14.0",
74
+ "underscore": "^1.4.4"
29
75
  },
30
76
  "author": "",
31
77
  "license": "MIT"
package/src/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # Perseus
2
+
3
+ <p align="center"><img src="logo.png" alt="perseus logo" width="150px"/></p>
4
+
5
+ <p align="center">Perseus Exercise Renderer</p>
6
+
7
+ Perseus is Khan Academy's exercise system. This repo contains the code needed to take a problem in the perseus format and present it, allow interaction, and grade the result of a learner's work.
8
+
9
+ <p align="center"><img src="sample.png" alt="sample of perseus in use" height="150px"/></p>
10
+
11
+ This repo is a constellation of sub-repos for showing exercise content. Please see individual projects in in the `packages/` folder for more information about each sub-project.
12
+
13
+ ## Getting started
14
+
15
+ ### Prerequisites
16
+
17
+ - [Node.JS v12](https://nodejs.org/download/release/v10.18.1/)
18
+ - [Yarn](https://yarnpkg.com/lang/en/docs/install/)
19
+
20
+ ### Installation
21
+
22
+ To install perseus, you need to run the following commands:
23
+
24
+ #### `yarn install`
25
+
26
+ Installs project dependencies
27
+
28
+ ## Contributing
29
+
30
+ See [CONTRIBUTING.md](./CONTRIBUTING.md) for a walkthrough of how some
31
+ of the Perseus code works and how to extend it.
32
+
33
+ ## License
34
+
35
+ [MIT License](http://opensource.org/licenses/MIT)
@@ -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);