@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.
- package/.babelrc.js +1 -1
- package/CHANGELOG.md +29 -0
- package/dist/es/index.css +4361 -0
- package/dist/es/index.js +7 -1
- package/dist/es/index.js.map +1 -1
- package/dist/index.css +4361 -0
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/strings.js +148 -46
- package/package.json +50 -4
- package/src/README.md +35 -0
- package/src/__stories__/item-renderer.stories.jsx +27 -0
- package/src/__stories__/server-item-renderer.stories.jsx +27 -0
- package/src/__testdata__/item-renderer_testdata.js +161 -0
- package/src/__testdata__/renderer_testdata.js +123 -0
- package/src/__tests__/__snapshots__/item-renderer_test.jsx.snap +233 -0
- package/src/__tests__/__snapshots__/perseus-markdown_test.jsx.snap +516 -0
- package/src/__tests__/__snapshots__/pure-markdown_test.js.snap +113 -0
- package/src/__tests__/__snapshots__/renderer_test.jsx.snap +576 -0
- package/src/__tests__/__snapshots__/server-item-renderer_test.jsx.snap +306 -0
- package/src/__tests__/a11y_test.jsx +304 -0
- package/src/__tests__/item-renderer_test.jsx +892 -0
- package/src/__tests__/mock-asset-loading-widget.jsx +57 -0
- package/src/__tests__/mock-widget.jsx +35 -0
- package/src/__tests__/perseus-markdown_test.jsx +747 -0
- package/src/__tests__/pure-markdown_test.js +552 -0
- package/src/__tests__/renderability_test.jsx +481 -0
- package/src/__tests__/renderer-api_test.jsx +333 -0
- package/src/__tests__/renderer_test.jsx +1792 -0
- package/src/__tests__/server-item-renderer_test.jsx +516 -0
- package/src/__tests__/test-items/image-item.js +25 -0
- package/src/__tests__/test-items/input-number-1-item.js +27 -0
- package/src/__tests__/test-items/input-number-2-item.js +39 -0
- package/src/__tests__/test-items/table-item.js +30 -0
- package/src/__tests__/tex-wrangler_test.js +83 -0
- package/src/__tests__/util_test.js +41 -0
- package/src/a11y.js +46 -0
- package/src/all-widgets.js +9 -0
- package/src/article-renderer.jsx +215 -0
- package/src/asset-context.js +30 -0
- package/src/basic-widgets.js +13 -0
- package/src/components/__stories__/button-group.stories.jsx +61 -0
- package/src/components/__stories__/fixed-to-responsive.stories.jsx +132 -0
- package/src/components/__stories__/graph.stories.jsx +27 -0
- package/src/components/__stories__/graphie.stories.jsx +28 -0
- package/src/components/__stories__/hud.stories.jsx +36 -0
- package/src/components/__stories__/icon.stories.jsx +56 -0
- package/src/components/__stories__/image-loader.stories.jsx +60 -0
- package/src/components/__stories__/info-tip.stories.jsx +33 -0
- package/src/components/__stories__/inline-icon.stories.jsx +39 -0
- package/src/components/__stories__/input-with-examples.stories.jsx +51 -0
- package/src/components/__stories__/lint.stories.jsx +40 -0
- package/src/components/__stories__/math-input.stories.jsx +29 -0
- package/src/components/__stories__/math-output.stories.jsx +24 -0
- package/src/components/__stories__/multi-button-group.stories.jsx +69 -0
- package/src/components/__stories__/number-input.stories.jsx +42 -0
- package/src/components/__stories__/possible-answers.stories.jsx +22 -0
- package/src/components/__stories__/prop-check-box.stories.jsx +62 -0
- package/src/components/__stories__/range-input.stories.jsx +28 -0
- package/src/components/__stories__/simple-keypad-input.stories.jsx +28 -0
- package/src/components/__stories__/sortable.stories.jsx +73 -0
- package/src/components/__stories__/stub-tag-editor.stories.jsx +44 -0
- package/src/components/__stories__/svg-image.stories.jsx +60 -0
- package/src/components/__stories__/tex.stories.jsx +18 -0
- package/src/components/__stories__/text-buttons.stories.jsx +51 -0
- package/src/components/__stories__/text-input.stories.jsx +34 -0
- package/src/components/__stories__/text-list-editor.stories.jsx +33 -0
- package/src/components/__stories__/zoomable-tex.stories.jsx +39 -0
- package/src/components/__stories__/zoomable.stories.jsx +40 -0
- package/src/components/__testdata__/sorter_testdata.js +20 -0
- package/src/components/__tests__/__snapshots__/sortable_test.jsx.snap +79 -0
- package/src/components/__tests__/__snapshots__/sorter_test.jsx.snap +297 -0
- package/src/components/__tests__/number-input_test.jsx +112 -0
- package/src/components/__tests__/sortable_test.jsx +234 -0
- package/src/components/__tests__/sorter_test.jsx +111 -0
- package/src/components/__tests__/zoomable_test.jsx +388 -0
- package/src/components/button-group.jsx +131 -0
- package/src/components/constants.js +15 -0
- package/src/components/fixed-to-responsive.jsx +164 -0
- package/src/components/graph.jsx +415 -0
- package/src/components/graphie-classes.jsx +148 -0
- package/src/components/graphie-movables.jsx +342 -0
- package/src/components/graphie.jsx +353 -0
- package/src/components/highlighting/highlightable-content.jsx +245 -0
- package/src/components/highlighting/highlights.js +208 -0
- package/src/components/highlighting/ranges.js +299 -0
- package/src/components/highlighting/types.js +73 -0
- package/src/components/highlighting/ui/highlight-renderer.jsx +179 -0
- package/src/components/highlighting/ui/highlight-set-renderer.jsx +190 -0
- package/src/components/highlighting/ui/highlight-tooltip.jsx +153 -0
- package/src/components/highlighting/ui/highlighting-ui.jsx +163 -0
- package/src/components/highlighting/ui/selection-tracker.jsx +195 -0
- package/src/components/highlighting/ui/types.js +21 -0
- package/src/components/highlighting/ui/util.js +166 -0
- package/src/components/highlighting/word-indexer.jsx +155 -0
- package/src/components/hud.jsx +179 -0
- package/src/components/icon.jsx +149 -0
- package/src/components/image-loader.jsx +175 -0
- package/src/components/info-tip/info-tip.jsx +146 -0
- package/src/components/info-tip.jsx +38 -0
- package/src/components/inline-icon.jsx +81 -0
- package/src/components/input-with-examples.jsx +231 -0
- package/src/components/lint.jsx +454 -0
- package/src/components/math-input.jsx +282 -0
- package/src/components/math-output.jsx +128 -0
- package/src/components/multi-button-group.jsx +137 -0
- package/src/components/new-tooltip/README.md +110 -0
- package/src/components/new-tooltip/__stories__/flexible-position.stories.jsx +437 -0
- package/src/components/new-tooltip/__stories__/new-tooltip.stories.jsx +665 -0
- package/src/components/new-tooltip/__stories__/tooltip-arrow.stories.jsx +70 -0
- package/src/components/new-tooltip/__stories__/tooltip-bubble.stories.jsx +98 -0
- package/src/components/new-tooltip/__tests__/style-constants_test.js +8 -0
- package/src/components/new-tooltip/__tests__/util_test.js +47 -0
- package/src/components/new-tooltip/flexible-position.jsx +182 -0
- package/src/components/new-tooltip/new-tooltip.jsx +399 -0
- package/src/components/new-tooltip/style-constants.js +13 -0
- package/src/components/new-tooltip/tooltip-arrow.jsx +184 -0
- package/src/components/new-tooltip/tooltip-bubble.jsx +223 -0
- package/src/components/new-tooltip/tooltip-portal.jsx +101 -0
- package/src/components/new-tooltip/tooltip-positioner.jsx +529 -0
- package/src/components/new-tooltip/types.js +183 -0
- package/src/components/new-tooltip/util.js +27 -0
- package/src/components/number-input.jsx +253 -0
- package/src/components/possible-answers.jsx +36 -0
- package/src/components/prop-check-box.jsx +80 -0
- package/src/components/range-input.jsx +61 -0
- package/src/components/simple-keypad-input.jsx +91 -0
- package/src/components/sortable.jsx +873 -0
- package/src/components/stub-tag-editor.jsx +54 -0
- package/src/components/svg-image.jsx +762 -0
- package/src/components/tex-buttons.jsx +322 -0
- package/src/components/tex.jsx +70 -0
- package/src/components/text-input.jsx +82 -0
- package/src/components/text-list-editor.jsx +157 -0
- package/src/components/tooltip.jsx +395 -0
- package/src/components/visibility-observer/__stories__/visibility-observer.stories.jsx +140 -0
- package/src/components/visibility-observer/get-scroll-parent.js +45 -0
- package/src/components/visibility-observer/visibility-observer.js +109 -0
- package/src/components/visibility-observer/visibility-observer.jsx +123 -0
- package/src/components/zoomable-tex.jsx +70 -0
- package/src/components/zoomable.jsx +304 -0
- package/src/components.js +17 -0
- package/src/dependencies.js +22 -0
- package/src/error-boundary.jsx +48 -0
- package/src/extra-widgets.js +75 -0
- package/src/gorgon/README +40 -0
- package/src/gorgon/__tests__/matcher_test.js +497 -0
- package/src/gorgon/__tests__/rule_test.js +101 -0
- package/src/gorgon/__tests__/rules_test.js +487 -0
- package/src/gorgon/__tests__/selector-parser_test.js +52 -0
- package/src/gorgon/__tests__/tree-transformer_test.js +446 -0
- package/src/gorgon/gorgon.js +290 -0
- package/src/gorgon/proptypes.js +29 -0
- package/src/gorgon/rule.js +413 -0
- package/src/gorgon/rules/absolute-url.js +24 -0
- package/src/gorgon/rules/all-rules.js +72 -0
- package/src/gorgon/rules/blockquoted-math.js +10 -0
- package/src/gorgon/rules/blockquoted-widget.js +10 -0
- package/src/gorgon/rules/double-spacing-after-terminal.js +12 -0
- package/src/gorgon/rules/extra-content-spacing.js +12 -0
- package/src/gorgon/rules/heading-level-1.js +14 -0
- package/src/gorgon/rules/heading-level-skip.js +20 -0
- package/src/gorgon/rules/heading-sentence-case.js +11 -0
- package/src/gorgon/rules/heading-title-case.js +63 -0
- package/src/gorgon/rules/image-alt-text.js +21 -0
- package/src/gorgon/rules/image-in-table.js +10 -0
- package/src/gorgon/rules/image-spaces-around-urls.js +35 -0
- package/src/gorgon/rules/image-widget.js +50 -0
- package/src/gorgon/rules/link-click-here.js +11 -0
- package/src/gorgon/rules/lint-utils.js +48 -0
- package/src/gorgon/rules/long-paragraph.js +14 -0
- package/src/gorgon/rules/math-adjacent.js +10 -0
- package/src/gorgon/rules/math-align-extra-break.js +11 -0
- package/src/gorgon/rules/math-align-linebreaks.js +43 -0
- package/src/gorgon/rules/math-empty.js +10 -0
- package/src/gorgon/rules/math-font-size.js +12 -0
- package/src/gorgon/rules/math-frac.js +10 -0
- package/src/gorgon/rules/math-nested.js +11 -0
- package/src/gorgon/rules/math-starts-with-space.js +12 -0
- package/src/gorgon/rules/math-text-empty.js +10 -0
- package/src/gorgon/rules/math-without-dollars.js +14 -0
- package/src/gorgon/rules/nested-lists.js +11 -0
- package/src/gorgon/rules/profanity.js +10 -0
- package/src/gorgon/rules/table-missing-cells.js +20 -0
- package/src/gorgon/rules/unbalanced-code-delimiters.js +14 -0
- package/src/gorgon/rules/unescaped-dollar.js +10 -0
- package/src/gorgon/rules/widget-in-table.js +10 -0
- package/src/gorgon/selector.js +506 -0
- package/src/gorgon/tree-transformer.js +588 -0
- package/src/hint-renderer.jsx +159 -0
- package/src/hints-renderer.jsx +359 -0
- package/src/icon-paths.js +120 -0
- package/src/index.js +149 -2
- package/src/init.js +49 -0
- package/src/interaction-tracker.js +60 -0
- package/src/interactive2/__tests__/movable-mock.js +48 -0
- package/src/interactive2/__tests__/movable-point_test.js +146 -0
- package/src/interactive2/interactive-util.js +152 -0
- package/src/interactive2/movable-helper-methods.js +160 -0
- package/src/interactive2/movable-line-options.js +392 -0
- package/src/interactive2/movable-line.js +322 -0
- package/src/interactive2/movable-point-options.js +190 -0
- package/src/interactive2/movable-point.jsx +603 -0
- package/src/interactive2/movable-polygon-options.js +351 -0
- package/src/interactive2/movable-polygon.js +368 -0
- package/src/interactive2/movable.js +273 -0
- package/src/interactive2/objective_.js +79 -0
- package/src/interactive2/types.js +3 -0
- package/src/interactive2/wrapped-defaults.js +86 -0
- package/src/interactive2/wrapped-ellipse.js +87 -0
- package/src/interactive2/wrapped-line.js +109 -0
- package/src/interactive2/wrapped-path.js +47 -0
- package/src/interactive2.js +91 -0
- package/src/item-renderer.jsx +518 -0
- package/src/item-version.js +12 -0
- package/src/jipt-paragraphs.js +44 -0
- package/src/jquery.mobile.vmouse.js +545 -0
- package/src/keypad-context.js +33 -0
- package/src/loading-context.js +20 -0
- package/src/logging/log.js +107 -0
- package/src/logging/log_test.js +41 -0
- package/src/mixins/changeable.jsx +115 -0
- package/src/mixins/editor-jsonify.jsx +13 -0
- package/src/mixins/provide-keypad.jsx +129 -0
- package/src/mixins/widget-jsonify-deprecated.jsx +23 -0
- package/src/mixins/widget-prop-blacklist.js +36 -0
- package/src/multi-items/__stories__/multi-renderer.stories.js +88 -0
- package/src/multi-items/__testdata__/multi-renderer_testdata.js +174 -0
- package/src/multi-items/__tests__/__snapshots__/multi-renderer_test.js.snap +994 -0
- package/src/multi-items/__tests__/items_test.js +245 -0
- package/src/multi-items/__tests__/multi-renderer_test.js +903 -0
- package/src/multi-items/__tests__/prop-type-builders_test.js +134 -0
- package/src/multi-items/__tests__/shapes_test.js +44 -0
- package/src/multi-items/__tests__/trees_test.js +316 -0
- package/src/multi-items/item-types.js +55 -0
- package/src/multi-items/items.js +176 -0
- package/src/multi-items/multi-renderer.jsx +543 -0
- package/src/multi-items/prop-type-builders.js +105 -0
- package/src/multi-items/shape-types.js +47 -0
- package/src/multi-items/shapes.js +53 -0
- package/src/multi-items/tree-types.js +42 -0
- package/src/multi-items/trees.js +345 -0
- package/src/multi-items.js +76 -0
- package/src/not-gorgon.js +129 -0
- package/src/perseus-api.jsx +270 -0
- package/src/perseus-env.js +26 -0
- package/src/perseus-error.js +19 -0
- package/src/perseus-markdown.jsx +433 -0
- package/src/perseus-types.js +1597 -0
- package/src/pure-markdown.js +347 -0
- package/src/question-paragraph.jsx +30 -0
- package/src/renderability.jsx +108 -0
- package/src/renderer.jsx +1932 -0
- package/src/server-item-renderer.jsx +467 -0
- package/src/sigfigs.jsx +492 -0
- package/src/styles/articles.less +748 -0
- package/src/styles/constants.js +119 -0
- package/src/styles/global-constants.js +350 -0
- package/src/styles/global-styles.js +307 -0
- package/src/styles/khan-exercise.css +1304 -0
- package/src/styles/media-queries.js +48 -0
- package/src/styles/perseus-renderer.less +1007 -0
- package/src/styles/shared.js +132 -0
- package/src/styles/util.less +47 -0
- package/src/styles/variables.boostrap.less +301 -0
- package/src/styles/variables.less +68 -0
- package/src/styles/variables.shared.less +356 -0
- package/src/styles/widgets/categorizer.less +39 -0
- package/src/styles/widgets/definition.less +86 -0
- package/src/styles/widgets/dropdown.less +3 -0
- package/src/styles/widgets/expression.less +147 -0
- package/src/styles/widgets/graded-group.less +36 -0
- package/src/styles/widgets/grapher.less +11 -0
- package/src/styles/widgets/group.less +19 -0
- package/src/styles/widgets/image.less +29 -0
- package/src/styles/widgets/interactive-graph.less +61 -0
- package/src/styles/widgets/label-image.less +41 -0
- package/src/styles/widgets/matcher.less +8 -0
- package/src/styles/widgets/matrix.less +120 -0
- package/src/styles/widgets/measurer.less +20 -0
- package/src/styles/widgets/orderer.less +97 -0
- package/src/styles/widgets/passage.less +151 -0
- package/src/styles/widgets/plotter.less +33 -0
- package/src/styles/widgets/radio.less +52 -0
- package/src/styles/widgets/reaction-diagram.less +35 -0
- package/src/styles/widgets/sequence.less +5 -0
- package/src/styles/widgets/sortable.less +127 -0
- package/src/styles/widgets/table.less +56 -0
- package/src/styles/widgets/transformer.less +28 -0
- package/src/styles/widgets/unit.less +14 -0
- package/src/tex-wrangler.js +176 -0
- package/src/traversal.jsx +141 -0
- package/src/types.js +538 -0
- package/src/util/a11y.js +24 -0
- package/src/util/answer-types.js +862 -0
- package/src/util/answer-types_test.js +115 -0
- package/src/util/colors.js +94 -0
- package/src/util/fix-passage-refs.jsx +122 -0
- package/src/util/graph-utils.js +16 -0
- package/src/util/graphie.js +1586 -0
- package/src/util/interactive.js +4078 -0
- package/src/util/katex-preprocess.js +16 -0
- package/src/util/math.js +296 -0
- package/src/util/mobile-native-utils.js +14 -0
- package/src/util/mobile-native-utils_test.js +24 -0
- package/src/util/register-all-widgets-for-testing.js +12 -0
- package/src/util/scroll-utils.js +162 -0
- package/src/util/sizing-utils.js +46 -0
- package/src/util/tex.js +203 -0
- package/src/util/url-utils.js +36 -0
- package/src/util.js +990 -0
- package/src/version.js +11 -0
- package/src/widget-container.jsx +174 -0
- package/src/widgets/__stories__/categorizer.stories.jsx +15 -0
- package/src/widgets/__stories__/cs-program.stories.jsx +15 -0
- package/src/widgets/__stories__/definition.stories.jsx +38 -0
- package/src/widgets/__stories__/dropdown.stories.jsx +15 -0
- package/src/widgets/__stories__/explanation.stories.jsx +19 -0
- package/src/widgets/__stories__/expression.stories.jsx +26 -0
- package/src/widgets/__stories__/graded-group-set.stories.jsx +32 -0
- package/src/widgets/__stories__/graded-group.stories.jsx +32 -0
- package/src/widgets/__stories__/grapher.stories.jsx +47 -0
- package/src/widgets/__stories__/group.stories.jsx +15 -0
- package/src/widgets/__stories__/iframe.stories.jsx +15 -0
- package/src/widgets/__stories__/image.stories.jsx +62 -0
- package/src/widgets/__stories__/input-number.stories.jsx +90 -0
- package/src/widgets/__stories__/interaction.stories.jsx +15 -0
- package/src/widgets/__stories__/interactive-graph.stories.jsx +61 -0
- package/src/widgets/__stories__/matcher.stories.jsx +15 -0
- package/src/widgets/__stories__/matrix.stories.jsx +15 -0
- package/src/widgets/__stories__/number-line.stories.jsx +15 -0
- package/src/widgets/__stories__/numeric-input.stories.jsx +19 -0
- package/src/widgets/__stories__/orderer.stories.jsx +15 -0
- package/src/widgets/__stories__/passage-ref.stories.jsx +19 -0
- package/src/widgets/__stories__/passage.stories.jsx +19 -0
- package/src/widgets/__stories__/radio.stories.jsx +82 -0
- package/src/widgets/__stories__/sorter.stories.jsx +15 -0
- package/src/widgets/__stories__/transformer.stories.jsx +15 -0
- package/src/widgets/__stories__/unit.stories.jsx +45 -0
- package/src/widgets/__stories__/video-transcript-link.stories.jsx +24 -0
- package/src/widgets/__stories__/video.stories.jsx +15 -0
- package/src/widgets/__testdata__/categorizer_testdata.js +50 -0
- package/src/widgets/__testdata__/cs-program_testdata.js +28 -0
- package/src/widgets/__testdata__/dropdown_testdata.js +34 -0
- package/src/widgets/__testdata__/explanation_testdata.js +56 -0
- package/src/widgets/__testdata__/expression_testdata.js +95 -0
- package/src/widgets/__testdata__/graded-group-set_testdata.js +358 -0
- package/src/widgets/__testdata__/graded-group_testdata.js +79 -0
- package/src/widgets/__testdata__/grapher_testdata.js +376 -0
- package/src/widgets/__testdata__/group_testdata.js +156 -0
- package/src/widgets/__testdata__/iframe_testdata.js +36 -0
- package/src/widgets/__testdata__/image_testdata.js +38 -0
- package/src/widgets/__testdata__/input-number_testdata.js +73 -0
- package/src/widgets/__testdata__/interaction_testdata.js +264 -0
- package/src/widgets/__testdata__/interactive-graph_testdata.js +646 -0
- package/src/widgets/__testdata__/matcher_testdata.js +34 -0
- package/src/widgets/__testdata__/matrix_testdata.js +29 -0
- package/src/widgets/__testdata__/number-line_testdata.js +31 -0
- package/src/widgets/__testdata__/numeric-input_testdata.js +266 -0
- package/src/widgets/__testdata__/orderer_testdata.js +58 -0
- package/src/widgets/__testdata__/passage-ref_testdata.js +41 -0
- package/src/widgets/__testdata__/passage_testdata.js +71 -0
- package/src/widgets/__testdata__/radio_testdata.js +210 -0
- package/src/widgets/__testdata__/sorter_testdata.js +20 -0
- package/src/widgets/__testdata__/transformer_testdata.js +109 -0
- package/src/widgets/__testdata__/video_testdata.js +22 -0
- package/src/widgets/__tests__/__snapshots__/categorizer_test.jsx.snap +928 -0
- package/src/widgets/__tests__/__snapshots__/cs-program_test.jsx.snap +75 -0
- package/src/widgets/__tests__/__snapshots__/definition_test.js.snap +99 -0
- package/src/widgets/__tests__/__snapshots__/dropdown_test.jsx.snap +143 -0
- package/src/widgets/__tests__/__snapshots__/explanation_test.js.snap +473 -0
- package/src/widgets/__tests__/__snapshots__/expression_test.jsx.snap +38 -0
- package/src/widgets/__tests__/__snapshots__/graded-group-set-jipt_test.jsx.snap +754 -0
- package/src/widgets/__tests__/__snapshots__/graded-group-set_test.jsx.snap +310 -0
- package/src/widgets/__tests__/__snapshots__/graded-group_test.jsx.snap +863 -0
- package/src/widgets/__tests__/__snapshots__/grapher_test.jsx.snap +2880 -0
- package/src/widgets/__tests__/__snapshots__/group_test.jsx.snap +1154 -0
- package/src/widgets/__tests__/__snapshots__/iframe_test.jsx.snap +69 -0
- package/src/widgets/__tests__/__snapshots__/image_test.jsx.snap +388 -0
- package/src/widgets/__tests__/__snapshots__/input-number_test.jsx.snap +978 -0
- package/src/widgets/__tests__/__snapshots__/interaction_test.jsx.snap +311 -0
- package/src/widgets/__tests__/__snapshots__/interactive-graph_test.jsx.snap +2915 -0
- package/src/widgets/__tests__/__snapshots__/matcher_test.jsx.snap +1039 -0
- package/src/widgets/__tests__/__snapshots__/matrix_test.jsx.snap +450 -0
- package/src/widgets/__tests__/__snapshots__/number-line_test.jsx.snap +888 -0
- package/src/widgets/__tests__/__snapshots__/numeric-input_test.jsx.snap +930 -0
- package/src/widgets/__tests__/__snapshots__/orderer_test.jsx.snap +275 -0
- package/src/widgets/__tests__/__snapshots__/passage-ref_test.jsx.snap +446 -0
- package/src/widgets/__tests__/__snapshots__/passage_test.jsx.snap +1988 -0
- package/src/widgets/__tests__/__snapshots__/radio_test.jsx.snap +7107 -0
- package/src/widgets/__tests__/__snapshots__/video_test.jsx.snap +163 -0
- package/src/widgets/__tests__/categorizer_test.jsx +205 -0
- package/src/widgets/__tests__/cs-program_test.jsx +45 -0
- package/src/widgets/__tests__/definition_test.js +152 -0
- package/src/widgets/__tests__/dropdown_test.jsx +106 -0
- package/src/widgets/__tests__/explanation_test.js +199 -0
- package/src/widgets/__tests__/expression_test.jsx +439 -0
- package/src/widgets/__tests__/graded-group-set-jipt_test.jsx +33 -0
- package/src/widgets/__tests__/graded-group-set_test.jsx +270 -0
- package/src/widgets/__tests__/graded-group_test.jsx +233 -0
- package/src/widgets/__tests__/grapher.cypress.jsx +486 -0
- package/src/widgets/__tests__/grapher_test.jsx +35 -0
- package/src/widgets/__tests__/group_test.jsx +512 -0
- package/src/widgets/__tests__/iframe_test.jsx +47 -0
- package/src/widgets/__tests__/image_test.jsx +65 -0
- package/src/widgets/__tests__/input-number_test.jsx +360 -0
- package/src/widgets/__tests__/interaction_test.jsx +33 -0
- package/src/widgets/__tests__/interactive-graph.cypress.jsx +697 -0
- package/src/widgets/__tests__/interactive-graph_test.jsx +105 -0
- package/src/widgets/__tests__/matcher_test.jsx +157 -0
- package/src/widgets/__tests__/matrix_test.jsx +84 -0
- package/src/widgets/__tests__/number-line_test.jsx +81 -0
- package/src/widgets/__tests__/numeric-input_test.jsx +574 -0
- package/src/widgets/__tests__/orderer_test.jsx +75 -0
- package/src/widgets/__tests__/passage-ref_test.jsx +166 -0
- package/src/widgets/__tests__/passage_test.jsx +133 -0
- package/src/widgets/__tests__/radio/base-radio_test.jsx +82 -0
- package/src/widgets/__tests__/radio_test.jsx +651 -0
- package/src/widgets/__tests__/renderQuestion.jsx +66 -0
- package/src/widgets/__tests__/unit_test.jsx +144 -0
- package/src/widgets/__tests__/video_test.jsx +55 -0
- package/src/widgets/categorizer.jsx +338 -0
- package/src/widgets/cs-program.jsx +227 -0
- package/src/widgets/definition.jsx +141 -0
- package/src/widgets/dropdown.jsx +143 -0
- package/src/widgets/explanation.jsx +315 -0
- package/src/widgets/expression.jsx +652 -0
- package/src/widgets/graded-group-answer-bar.jsx +152 -0
- package/src/widgets/graded-group-set.jsx +285 -0
- package/src/widgets/graded-group.jsx +448 -0
- package/src/widgets/grapher/util.jsx +806 -0
- package/src/widgets/grapher.jsx +663 -0
- package/src/widgets/group.jsx +213 -0
- package/src/widgets/iframe.jsx +198 -0
- package/src/widgets/image.jsx +310 -0
- package/src/widgets/input-number.jsx +411 -0
- package/src/widgets/interaction/arrow-picker.jsx +39 -0
- package/src/widgets/interaction/color-picker.jsx +69 -0
- package/src/widgets/interaction/dash-picker.jsx +46 -0
- package/src/widgets/interaction/element-container.jsx +97 -0
- package/src/widgets/interaction.jsx +742 -0
- package/src/widgets/interactive-graph.jsx +2820 -0
- package/src/widgets/label-image/__stories__/answer-choices.stories.jsx +93 -0
- package/src/widgets/label-image/__stories__/marker.stories.jsx +172 -0
- package/src/widgets/label-image/answer-choices.jsx +311 -0
- package/src/widgets/label-image/marker.jsx +365 -0
- package/src/widgets/label-image/types.js +33 -0
- package/src/widgets/label-image.jsx +841 -0
- package/src/widgets/label-image_test.js +840 -0
- package/src/widgets/lights-puzzle.jsx +356 -0
- package/src/widgets/matcher.jsx +271 -0
- package/src/widgets/matrix.jsx +616 -0
- package/src/widgets/measurer.jsx +215 -0
- package/src/widgets/molecule/__tests__/layout_test.jsx +159 -0
- package/src/widgets/molecule/__tests__/parser_test.jsx +142 -0
- package/src/widgets/molecule/molecule-drawing.jsx +175 -0
- package/src/widgets/molecule/molecule-layout.jsx +367 -0
- package/src/widgets/molecule/smiles-parser.jsx +300 -0
- package/src/widgets/molecule.jsx +172 -0
- package/src/widgets/number-line.jsx +858 -0
- package/src/widgets/numeric-input.jsx +622 -0
- package/src/widgets/orderer.jsx +753 -0
- package/src/widgets/passage/__tests__/passage-markdown_test.jsx +382 -0
- package/src/widgets/passage/get-line-height-for-node.js +10 -0
- package/src/widgets/passage/passage-markdown.jsx +416 -0
- package/src/widgets/passage-ref-target.jsx +70 -0
- package/src/widgets/passage-ref.jsx +198 -0
- package/src/widgets/passage.jsx +601 -0
- package/src/widgets/plotter.jsx +1198 -0
- package/src/widgets/radio/__stories__/base-radio.stories.jsx +40 -0
- package/src/widgets/radio/__stories__/choice-icon.stories.jsx +157 -0
- package/src/widgets/radio/__stories__/choice-none-above.stories.jsx +26 -0
- package/src/widgets/radio/__stories__/cross-out-button.stories.jsx +64 -0
- package/src/widgets/radio/__stories__/cross-out-menu.stories.jsx +59 -0
- package/src/widgets/radio/__stories__/cross-out-tooltip.stories.jsx +59 -0
- package/src/widgets/radio/__stories__/focus-ring.stories.jsx +38 -0
- package/src/widgets/radio/__stories__/option-status.stories.jsx +118 -0
- package/src/widgets/radio/__stories__/toggleable-radio-button.stories.jsx +28 -0
- package/src/widgets/radio/base-radio.jsx +642 -0
- package/src/widgets/radio/choice-icon.jsx +468 -0
- package/src/widgets/radio/choice-none-above.jsx +54 -0
- package/src/widgets/radio/choice.jsx +692 -0
- package/src/widgets/radio/choice.jsx.fixture.js +64 -0
- package/src/widgets/radio/cross-out-button.jsx +136 -0
- package/src/widgets/radio/cross-out-menu-wrapper.jsx +492 -0
- package/src/widgets/radio/cross-out-tooltip.jsx +129 -0
- package/src/widgets/radio/focus-ring.jsx +51 -0
- package/src/widgets/radio/option-status.jsx +89 -0
- package/src/widgets/radio/toggleable-radio-button.jsx +133 -0
- package/src/widgets/radio/util.js +32 -0
- package/src/widgets/radio/util_test.js +19 -0
- package/src/widgets/radio/widget.jsx +470 -0
- package/src/widgets/radio.jsx +156 -0
- package/src/widgets/reaction-diagram.jsx +137 -0
- package/src/widgets/sequence.jsx +140 -0
- package/src/widgets/simulator.jsx +808 -0
- package/src/widgets/sorter.jsx +146 -0
- package/src/widgets/table.jsx +394 -0
- package/src/widgets/transformer.jsx +2876 -0
- package/src/widgets/unit.jsx +372 -0
- package/src/widgets/video-transcript-link.jsx +84 -0
- package/src/widgets/video-transcript-link_test.js +211 -0
- package/src/widgets/video.jsx +126 -0
- package/src/widgets.js +431 -0
- package/src/zoom.js +539 -0
- package/README.md +0 -3
- 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._("
|
|
9
|
-
i18n._("
|
|
10
|
-
i18n._("
|
|
11
|
-
i18n._("
|
|
12
|
-
i18n._("
|
|
13
|
-
i18n._("
|
|
14
|
-
i18n._("
|
|
15
|
-
i18n._("
|
|
16
|
-
i18n._("
|
|
17
|
-
i18n._("
|
|
18
|
-
i18n._("
|
|
19
|
-
i18n
|
|
20
|
-
i18n
|
|
21
|
-
i18n
|
|
22
|
-
i18n._("
|
|
23
|
-
i18n._("
|
|
24
|
-
i18n._("
|
|
25
|
-
i18n._("
|
|
26
|
-
|
|
27
|
-
i18n._("
|
|
28
|
-
i18n._("
|
|
29
|
-
i18n
|
|
30
|
-
i18n._("
|
|
31
|
-
i18n._("
|
|
32
|
-
i18n._("
|
|
33
|
-
i18n._("
|
|
34
|
-
i18n._("
|
|
35
|
-
i18n._("
|
|
36
|
-
i18n._("
|
|
37
|
-
i18n._("
|
|
38
|
-
i18n._("
|
|
39
|
-
i18n._("
|
|
40
|
-
i18n._("
|
|
41
|
-
i18n._("
|
|
42
|
-
i18n._("
|
|
43
|
-
i18n._("
|
|
44
|
-
i18n._("
|
|
45
|
-
i18n._("
|
|
46
|
-
i18n._("
|
|
47
|
-
i18n._("
|
|
48
|
-
i18n._("
|
|
49
|
-
i18n._("
|
|
50
|
-
i18n._("
|
|
51
|
-
i18n._("
|
|
52
|
-
i18n._("
|
|
53
|
-
i18n._("
|
|
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.
|
|
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/
|
|
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 \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);
|