@khanacademy/perseus 19.1.4 → 19.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/graphie.d.ts +9 -1
- package/dist/es/index.js +255 -122
- package/dist/es/index.js.map +1 -1
- package/dist/index.js +261 -126
- package/dist/index.js.map +1 -1
- package/dist/interactive2/interactive-util.d.ts +1 -1
- package/dist/interactive2/movable-point-options.d.ts +5 -4
- package/dist/interactive2/movable.d.ts +90 -13
- package/dist/interactive2/types.d.ts +6 -0
- package/dist/util/graphie.d.ts +5 -0
- package/dist/widgets/expression.d.ts +4 -4
- package/package.json +11 -8
- package/.babelrc.js +0 -8
- package/.eslintrc.js +0 -12
- package/CHANGELOG.md +0 -1422
- package/src/__stories__/article-renderer.stories.tsx +0 -100
- package/src/__stories__/hints-renderer.stories.tsx +0 -55
- package/src/__stories__/server-item-renderer.stories.tsx +0 -44
- package/src/__testdata__/article-renderer.testdata.ts +0 -212
- package/src/__testdata__/graphie.testdata.ts +0 -51
- package/src/__testdata__/renderer.testdata.ts +0 -274
- package/src/__testdata__/server-item-renderer.testdata.ts +0 -171
- package/src/__tests__/__snapshots__/perseus-markdown.test.ts.snap +0 -507
- package/src/__tests__/__snapshots__/renderer.test.tsx.snap +0 -525
- package/src/__tests__/__snapshots__/server-item-renderer.test.tsx.snap +0 -285
- package/src/__tests__/a11y.test.ts +0 -303
- package/src/__tests__/article-renderer.test.tsx +0 -130
- package/src/__tests__/error-boundary.test.tsx +0 -76
- package/src/__tests__/extract-perseus-data.test.ts +0 -1027
- package/src/__tests__/init.test.ts +0 -10
- package/src/__tests__/jipt-paragraphs.test.ts +0 -32
- package/src/__tests__/mock-asset-loading-widget.tsx +0 -53
- package/src/__tests__/mock-widget.tsx +0 -33
- package/src/__tests__/perseus-markdown.test.ts +0 -764
- package/src/__tests__/renderability.test.ts +0 -480
- package/src/__tests__/renderer-api.test.tsx +0 -302
- package/src/__tests__/renderer.test.tsx +0 -1816
- package/src/__tests__/server-item-renderer.test.tsx +0 -582
- package/src/__tests__/test-items/image-item.ts +0 -24
- package/src/__tests__/test-items/input-number-1-item.ts +0 -26
- package/src/__tests__/test-items/input-number-2-item.ts +0 -38
- package/src/__tests__/test-items/table-item.ts +0 -29
- package/src/__tests__/tex-wrangler.test.ts +0 -82
- package/src/__tests__/util.test.ts +0 -40
- package/src/__tests__/widget-container.test.tsx +0 -126
- package/src/__tests__/widgets.test.ts +0 -91
- package/src/a11y.ts +0 -45
- package/src/all-widgets.ts +0 -9
- package/src/article-renderer.tsx +0 -237
- package/src/asset-context.ts +0 -30
- package/src/basic-widgets.ts +0 -16
- package/src/components/__stories__/button-group.stories.tsx +0 -55
- package/src/components/__stories__/fixed-to-responsive.stories.tsx +0 -141
- package/src/components/__stories__/graph.stories.tsx +0 -28
- package/src/components/__stories__/graphie.stories.tsx +0 -33
- package/src/components/__stories__/hud.stories.tsx +0 -35
- package/src/components/__stories__/icon.stories.tsx +0 -63
- package/src/components/__stories__/image-loader.stories.tsx +0 -63
- package/src/components/__stories__/info-tip.stories.tsx +0 -31
- package/src/components/__stories__/inline-icon.stories.tsx +0 -40
- package/src/components/__stories__/input-with-examples.stories.tsx +0 -53
- package/src/components/__stories__/lint.stories.tsx +0 -86
- package/src/components/__stories__/math-input.stories.tsx +0 -43
- package/src/components/__stories__/math-output.stories.tsx +0 -23
- package/src/components/__stories__/multi-button-group.stories.tsx +0 -66
- package/src/components/__stories__/number-input.stories.tsx +0 -41
- package/src/components/__stories__/prop-check-box.stories.tsx +0 -65
- package/src/components/__stories__/range-input.stories.tsx +0 -29
- package/src/components/__stories__/simple-keypad-input.stories.tsx +0 -27
- package/src/components/__stories__/sortable.stories.tsx +0 -77
- package/src/components/__stories__/stub-tag-editor.stories.tsx +0 -45
- package/src/components/__stories__/svg-image.stories.tsx +0 -74
- package/src/components/__stories__/tex.stories.tsx +0 -23
- package/src/components/__stories__/text-input.stories.tsx +0 -33
- package/src/components/__stories__/text-list-editor.stories.tsx +0 -32
- package/src/components/__stories__/tooltip.stories.tsx +0 -52
- package/src/components/__stories__/zoomable-tex.stories.tsx +0 -41
- package/src/components/__stories__/zoomable.stories.tsx +0 -49
- package/src/components/__testdata__/sorter.testdata.ts +0 -19
- package/src/components/__tests__/__snapshots__/sortable.test.tsx.snap +0 -163
- package/src/components/__tests__/__snapshots__/sorter.test.tsx.snap +0 -265
- package/src/components/__tests__/math-input.test.tsx +0 -147
- package/src/components/__tests__/number-input.test.tsx +0 -128
- package/src/components/__tests__/sortable.test.tsx +0 -269
- package/src/components/__tests__/sorter.test.tsx +0 -114
- package/src/components/__tests__/zoomable.test.tsx +0 -399
- package/src/components/button-group.tsx +0 -130
- package/src/components/constants.ts +0 -14
- package/src/components/fixed-to-responsive.tsx +0 -169
- package/src/components/graph.tsx +0 -444
- package/src/components/graphie-classes.ts +0 -153
- package/src/components/graphie-movables.ts +0 -338
- package/src/components/graphie.tsx +0 -392
- package/src/components/highlighting/highlightable-content.tsx +0 -240
- package/src/components/highlighting/highlights.ts +0 -207
- package/src/components/highlighting/ranges.ts +0 -304
- package/src/components/highlighting/types.ts +0 -73
- package/src/components/highlighting/ui/highlight-renderer.tsx +0 -172
- package/src/components/highlighting/ui/highlight-set-renderer.tsx +0 -185
- package/src/components/highlighting/ui/highlight-tooltip.tsx +0 -141
- package/src/components/highlighting/ui/highlighting-ui.tsx +0 -143
- package/src/components/highlighting/ui/selection-tracker.tsx +0 -186
- package/src/components/highlighting/ui/types.ts +0 -21
- package/src/components/highlighting/ui/util.ts +0 -165
- package/src/components/highlighting/word-indexer.tsx +0 -152
- package/src/components/hud.tsx +0 -167
- package/src/components/icon.tsx +0 -141
- package/src/components/image-loader.tsx +0 -177
- package/src/components/info-tip/info-tip.tsx +0 -144
- package/src/components/info-tip.tsx +0 -39
- package/src/components/inline-icon.tsx +0 -60
- package/src/components/input-with-examples.tsx +0 -249
- package/src/components/lint.tsx +0 -459
- package/src/components/math-input.tsx +0 -474
- package/src/components/math-output.tsx +0 -134
- package/src/components/multi-button-group.tsx +0 -135
- package/src/components/number-input.tsx +0 -249
- package/src/components/prop-check-box.tsx +0 -79
- package/src/components/range-input.tsx +0 -60
- package/src/components/simple-keypad-input.tsx +0 -88
- package/src/components/sortable.tsx +0 -958
- package/src/components/stub-tag-editor.tsx +0 -53
- package/src/components/svg-image.tsx +0 -779
- package/src/components/tex.tsx +0 -67
- package/src/components/text-input.tsx +0 -129
- package/src/components/text-list-editor.tsx +0 -166
- package/src/components/tooltip.tsx +0 -410
- package/src/components/visibility-observer/__stories__/visibility-observer.stories.tsx +0 -141
- package/src/components/visibility-observer/create-visibility-observer.ts +0 -108
- package/src/components/visibility-observer/get-scroll-parent.ts +0 -46
- package/src/components/visibility-observer/visibility-observer.tsx +0 -124
- package/src/components/zoomable-tex.tsx +0 -78
- package/src/components/zoomable.tsx +0 -304
- package/src/components.ts +0 -15
- package/src/definition-context.tsx +0 -59
- package/src/dependencies.ts +0 -40
- package/src/error-boundary.tsx +0 -70
- package/src/extra-widgets.ts +0 -75
- package/src/hint-renderer.tsx +0 -151
- package/src/hints-renderer.tsx +0 -372
- package/src/icon-paths.ts +0 -119
- package/src/index.ts +0 -171
- package/src/init.ts +0 -56
- package/src/interaction-tracker.ts +0 -62
- package/src/interactive2/__tests__/movable-mock.ts +0 -43
- package/src/interactive2/__tests__/movable-point.test.ts +0 -144
- package/src/interactive2/__tests__/movable.test.ts +0 -157
- package/src/interactive2/interactive-util.test.ts +0 -93
- package/src/interactive2/interactive-util.ts +0 -159
- package/src/interactive2/movable-helper-methods.ts +0 -166
- package/src/interactive2/movable-line-options.ts +0 -419
- package/src/interactive2/movable-line.ts +0 -307
- package/src/interactive2/movable-point-options.ts +0 -212
- package/src/interactive2/movable-point.tsx +0 -585
- package/src/interactive2/movable-polygon-options.ts +0 -389
- package/src/interactive2/movable-polygon.ts +0 -360
- package/src/interactive2/movable.ts +0 -279
- package/src/interactive2/objective_.ts +0 -79
- package/src/interactive2/types.ts +0 -2
- package/src/interactive2/wrapped-defaults.ts +0 -87
- package/src/interactive2/wrapped-ellipse.ts +0 -94
- package/src/interactive2/wrapped-line.ts +0 -116
- package/src/interactive2/wrapped-path.ts +0 -51
- package/src/interactive2.ts +0 -70
- package/src/item-version.ts +0 -10
- package/src/jipt-paragraphs.ts +0 -49
- package/src/jquery.mobile.vmouse.js +0 -545
- package/src/loading-context.ts +0 -21
- package/src/logging/log.test.ts +0 -39
- package/src/logging/log.ts +0 -97
- package/src/mixins/__tests__/widget-prop-denylist.test.ts +0 -21
- package/src/mixins/changeable.ts +0 -133
- package/src/mixins/editor-jsonify.ts +0 -13
- package/src/mixins/widget-jsonify-deprecated.ts +0 -23
- package/src/mixins/widget-prop-denylist.ts +0 -48
- package/src/multi-items/__stories__/multi-renderer.stories.tsx +0 -83
- package/src/multi-items/__testdata__/multi-renderer.testdata.ts +0 -172
- package/src/multi-items/__tests__/__snapshots__/multi-renderer.test.tsx.snap +0 -1164
- package/src/multi-items/__tests__/items.test.ts +0 -240
- package/src/multi-items/__tests__/multi-renderer.test.tsx +0 -914
- package/src/multi-items/__tests__/prop-type-builders.test.ts +0 -133
- package/src/multi-items/__tests__/shapes.test.ts +0 -43
- package/src/multi-items/__tests__/trees.test.ts +0 -317
- package/src/multi-items/item-types.ts +0 -56
- package/src/multi-items/items.ts +0 -176
- package/src/multi-items/multi-renderer.tsx +0 -569
- package/src/multi-items/prop-type-builders.ts +0 -106
- package/src/multi-items/shape-types.ts +0 -52
- package/src/multi-items/shapes.ts +0 -52
- package/src/multi-items/tree-types.ts +0 -47
- package/src/multi-items/trees.ts +0 -360
- package/src/multi-items.ts +0 -75
- package/src/perseus-api.tsx +0 -188
- package/src/perseus-env.ts +0 -27
- package/src/perseus-error.ts +0 -17
- package/src/perseus-markdown.tsx +0 -405
- package/src/perseus-types.ts +0 -1366
- package/src/perseus-version.ts +0 -9
- package/src/question-paragraph.tsx +0 -34
- package/src/renderability.ts +0 -109
- package/src/renderer.tsx +0 -2000
- package/src/server-item-renderer.tsx +0 -495
- package/src/sigfigs.ts +0 -490
- package/src/styles/articles.less +0 -749
- package/src/styles/constants.ts +0 -94
- package/src/styles/global-constants.ts +0 -343
- package/src/styles/global-styles.ts +0 -306
- package/src/styles/khan-exercise.css +0 -1468
- package/src/styles/media-queries.ts +0 -47
- package/src/styles/perseus-renderer.less +0 -732
- package/src/styles/shared.ts +0 -130
- package/src/styles/util.less +0 -47
- package/src/styles/variables.boostrap.less +0 -277
- package/src/styles/variables.less +0 -56
- package/src/styles/variables.shared.less +0 -340
- package/src/styles/widgets/categorizer.less +0 -38
- package/src/styles/widgets/dropdown.less +0 -3
- package/src/styles/widgets/expression.less +0 -65
- package/src/styles/widgets/graded-group.less +0 -36
- package/src/styles/widgets/grapher.less +0 -12
- package/src/styles/widgets/group.less +0 -19
- package/src/styles/widgets/image.less +0 -54
- package/src/styles/widgets/interactive-graph.less +0 -64
- package/src/styles/widgets/label-image.less +0 -57
- package/src/styles/widgets/matcher.less +0 -8
- package/src/styles/widgets/matrix.less +0 -126
- package/src/styles/widgets/measurer.less +0 -20
- package/src/styles/widgets/orderer.less +0 -98
- package/src/styles/widgets/passage.less +0 -154
- package/src/styles/widgets/plotter.less +0 -31
- package/src/styles/widgets/radio.less +0 -58
- package/src/styles/widgets/reaction-diagram.less +0 -35
- package/src/styles/widgets/sequence.less +0 -5
- package/src/styles/widgets/sortable.less +0 -113
- package/src/styles/widgets/table.less +0 -57
- package/src/styles/widgets/unit.less +0 -15
- package/src/tex-wrangler.ts +0 -182
- package/src/translation-linter.ts +0 -126
- package/src/traversal.ts +0 -138
- package/src/types.ts +0 -513
- package/src/util/a11y.ts +0 -23
- package/src/util/answer-types.test.ts +0 -114
- package/src/util/answer-types.ts +0 -876
- package/src/util/colors.ts +0 -93
- package/src/util/drawing-transform.test.ts +0 -67
- package/src/util/drawing-transform.ts +0 -102
- package/src/util/extract-perseus-data.ts +0 -539
- package/src/util/fix-passage-refs.ts +0 -121
- package/src/util/geometry.test.ts +0 -75
- package/src/util/geometry.ts +0 -312
- package/src/util/graph-bounds.ts +0 -23
- package/src/util/graph-utils.ts +0 -15
- package/src/util/graphie.test.ts +0 -1277
- package/src/util/graphie.ts +0 -1566
- package/src/util/interactive.ts +0 -4172
- package/src/util/interval.ts +0 -4
- package/src/util/katex-preprocess.ts +0 -14
- package/src/util/math.test.ts +0 -11
- package/src/util/math.ts +0 -294
- package/src/util/mobile-native-utils.test.ts +0 -22
- package/src/util/mobile-native-utils.ts +0 -12
- package/src/util/parse-perseus-json.test.ts +0 -10
- package/src/util/parse-perseus-json.ts +0 -13
- package/src/util/react-render.tsx +0 -27
- package/src/util/register-all-widgets-for-testing.ts +0 -13
- package/src/util/scroll-utils.ts +0 -155
- package/src/util/sizing-utils.ts +0 -46
- package/src/util/tex.ts +0 -73
- package/src/util/url-utils.ts +0 -34
- package/src/util.graphie.test.ts +0 -45
- package/src/util.graphie.ts +0 -59
- package/src/util.ts +0 -966
- package/src/version.ts +0 -10
- package/src/widget-container.tsx +0 -199
- package/src/widgets/__stories__/categorizer.stories.tsx +0 -14
- package/src/widgets/__stories__/cs-program.stories.tsx +0 -14
- package/src/widgets/__stories__/definition.stories.tsx +0 -114
- package/src/widgets/__stories__/dropdown.stories.tsx +0 -14
- package/src/widgets/__stories__/explanation.stories.tsx +0 -18
- package/src/widgets/__stories__/expression.stories.tsx +0 -145
- package/src/widgets/__stories__/graded-group-set.stories.tsx +0 -31
- package/src/widgets/__stories__/graded-group.stories.tsx +0 -31
- package/src/widgets/__stories__/grapher.stories.tsx +0 -46
- package/src/widgets/__stories__/group.stories.tsx +0 -14
- package/src/widgets/__stories__/iframe.stories.tsx +0 -14
- package/src/widgets/__stories__/image.stories.tsx +0 -85
- package/src/widgets/__stories__/input-number.stories.tsx +0 -101
- package/src/widgets/__stories__/interaction.stories.tsx +0 -14
- package/src/widgets/__stories__/interactive-graph.stories.tsx +0 -60
- package/src/widgets/__stories__/label-image.stories.tsx +0 -130
- package/src/widgets/__stories__/matcher.stories.tsx +0 -14
- package/src/widgets/__stories__/matrix.stories.tsx +0 -14
- package/src/widgets/__stories__/number-line.stories.tsx +0 -14
- package/src/widgets/__stories__/numeric-input.stories.tsx +0 -105
- package/src/widgets/__stories__/orderer.stories.tsx +0 -18
- package/src/widgets/__stories__/passage-ref.stories.tsx +0 -33
- package/src/widgets/__stories__/passage.stories.tsx +0 -39
- package/src/widgets/__stories__/plotter.stories.tsx +0 -27
- package/src/widgets/__stories__/radio.stories.tsx +0 -86
- package/src/widgets/__stories__/random-widgets.stories.tsx +0 -59
- package/src/widgets/__stories__/sorter.stories.tsx +0 -14
- package/src/widgets/__stories__/test-keypad-context-wrapper.tsx +0 -66
- package/src/widgets/__stories__/unit.stories.tsx +0 -28
- package/src/widgets/__stories__/video-transcript-link.stories.tsx +0 -23
- package/src/widgets/__stories__/video.stories.tsx +0 -22
- package/src/widgets/__testdata__/base-radio.testdata.ts +0 -21
- package/src/widgets/__testdata__/categorizer.testdata.ts +0 -89
- package/src/widgets/__testdata__/cs-program.testdata.ts +0 -27
- package/src/widgets/__testdata__/dropdown.testdata.ts +0 -71
- package/src/widgets/__testdata__/explanation.testdata.ts +0 -85
- package/src/widgets/__testdata__/expression.testdata.ts +0 -198
- package/src/widgets/__testdata__/graded-group-set.testdata.ts +0 -356
- package/src/widgets/__testdata__/graded-group.testdata.ts +0 -77
- package/src/widgets/__testdata__/grapher.testdata.ts +0 -374
- package/src/widgets/__testdata__/group.testdata.ts +0 -153
- package/src/widgets/__testdata__/iframe.testdata.ts +0 -35
- package/src/widgets/__testdata__/image.testdata.ts +0 -36
- package/src/widgets/__testdata__/input-number.testdata.ts +0 -72
- package/src/widgets/__testdata__/interaction.testdata.ts +0 -262
- package/src/widgets/__testdata__/interactive-graph-random.testdata.ts +0 -269
- package/src/widgets/__testdata__/interactive-graph.testdata.ts +0 -644
- package/src/widgets/__testdata__/label-image.testdata.ts +0 -308
- package/src/widgets/__testdata__/matcher.testdata.ts +0 -33
- package/src/widgets/__testdata__/matrix.testdata.ts +0 -28
- package/src/widgets/__testdata__/number-line.testdata.ts +0 -30
- package/src/widgets/__testdata__/numeric-input.testdata.ts +0 -265
- package/src/widgets/__testdata__/orderer.testdata.ts +0 -123
- package/src/widgets/__testdata__/passage-ref.testdata.ts +0 -101
- package/src/widgets/__testdata__/passage.testdata.ts +0 -95
- package/src/widgets/__testdata__/plotter.testdata.ts +0 -36
- package/src/widgets/__testdata__/radio.testdata.ts +0 -324
- package/src/widgets/__testdata__/randomizers.ts +0 -51
- package/src/widgets/__testdata__/sorter.testdata.ts +0 -19
- package/src/widgets/__testdata__/video.testdata.ts +0 -61
- package/src/widgets/__tests__/__snapshots__/categorizer.test.ts.snap +0 -940
- package/src/widgets/__tests__/__snapshots__/cs-program.test.ts.snap +0 -67
- package/src/widgets/__tests__/__snapshots__/definition.test.ts.snap +0 -97
- package/src/widgets/__tests__/__snapshots__/dropdown.test.ts.snap +0 -133
- package/src/widgets/__tests__/__snapshots__/explanation.test.ts.snap +0 -425
- package/src/widgets/__tests__/__snapshots__/graded-group-set-jipt.test.ts.snap +0 -729
- package/src/widgets/__tests__/__snapshots__/graded-group-set.test.ts.snap +0 -339
- package/src/widgets/__tests__/__snapshots__/graded-group.test.ts.snap +0 -801
- package/src/widgets/__tests__/__snapshots__/grapher.test.ts.snap +0 -2673
- package/src/widgets/__tests__/__snapshots__/group.test.tsx.snap +0 -1211
- package/src/widgets/__tests__/__snapshots__/iframe.test.ts.snap +0 -61
- package/src/widgets/__tests__/__snapshots__/image.test.ts.snap +0 -378
- package/src/widgets/__tests__/__snapshots__/input-number.test.ts.snap +0 -495
- package/src/widgets/__tests__/__snapshots__/interaction.test.ts.snap +0 -292
- package/src/widgets/__tests__/__snapshots__/interactive-graph.test.ts.snap +0 -2889
- package/src/widgets/__tests__/__snapshots__/matcher.test.tsx.snap +0 -883
- package/src/widgets/__tests__/__snapshots__/matrix.test.ts.snap +0 -514
- package/src/widgets/__tests__/__snapshots__/number-line.test.ts.snap +0 -814
- package/src/widgets/__tests__/__snapshots__/numeric-input.test.ts.snap +0 -470
- package/src/widgets/__tests__/__snapshots__/orderer.test.ts.snap +0 -243
- package/src/widgets/__tests__/__snapshots__/passage-ref.test.ts.snap +0 -434
- package/src/widgets/__tests__/__snapshots__/passage.test.tsx.snap +0 -1956
- package/src/widgets/__tests__/__snapshots__/plotter.test.tsx.snap +0 -827
- package/src/widgets/__tests__/__snapshots__/radio.test.ts.snap +0 -4237
- package/src/widgets/__tests__/__snapshots__/unit.test.tsx.snap +0 -20
- package/src/widgets/__tests__/__snapshots__/video.test.ts.snap +0 -153
- package/src/widgets/__tests__/categorizer.test.ts +0 -203
- package/src/widgets/__tests__/cs-program.test.ts +0 -43
- package/src/widgets/__tests__/definition.test.ts +0 -136
- package/src/widgets/__tests__/dropdown.test.ts +0 -105
- package/src/widgets/__tests__/explanation.test.ts +0 -198
- package/src/widgets/__tests__/expression-mobile.test.tsx +0 -363
- package/src/widgets/__tests__/expression.test.tsx +0 -484
- package/src/widgets/__tests__/graded-group-set-jipt.test.ts +0 -30
- package/src/widgets/__tests__/graded-group-set.test.ts +0 -288
- package/src/widgets/__tests__/graded-group.test.ts +0 -232
- package/src/widgets/__tests__/grapher.cypress.ts +0 -576
- package/src/widgets/__tests__/grapher.test.ts +0 -33
- package/src/widgets/__tests__/group.test.tsx +0 -510
- package/src/widgets/__tests__/iframe.test.ts +0 -45
- package/src/widgets/__tests__/image.test.ts +0 -62
- package/src/widgets/__tests__/input-number.test.ts +0 -354
- package/src/widgets/__tests__/interaction.test.ts +0 -31
- package/src/widgets/__tests__/interactive-graph.cypress.ts +0 -815
- package/src/widgets/__tests__/interactive-graph.test.ts +0 -106
- package/src/widgets/__tests__/matcher.test.tsx +0 -176
- package/src/widgets/__tests__/matrix.test.ts +0 -82
- package/src/widgets/__tests__/number-line.test.ts +0 -79
- package/src/widgets/__tests__/numeric-input.test.ts +0 -575
- package/src/widgets/__tests__/orderer.test.ts +0 -73
- package/src/widgets/__tests__/passage-ref.test.ts +0 -168
- package/src/widgets/__tests__/passage.test.tsx +0 -224
- package/src/widgets/__tests__/plotter.test.tsx +0 -69
- package/src/widgets/__tests__/radio/base-radio.test.tsx +0 -470
- package/src/widgets/__tests__/radio/choice-icon.test.tsx +0 -90
- package/src/widgets/__tests__/radio/choice.test.tsx +0 -310
- package/src/widgets/__tests__/radio/focus-ring.test.tsx +0 -22
- package/src/widgets/__tests__/radio/option-status.test.tsx +0 -77
- package/src/widgets/__tests__/radio.test.ts +0 -807
- package/src/widgets/__tests__/randomizers.test.ts +0 -53
- package/src/widgets/__tests__/renderQuestion.tsx +0 -101
- package/src/widgets/__tests__/unit.test.tsx +0 -168
- package/src/widgets/__tests__/video.test.ts +0 -69
- package/src/widgets/categorizer.tsx +0 -344
- package/src/widgets/cs-program.tsx +0 -227
- package/src/widgets/definition.tsx +0 -121
- package/src/widgets/deprecated-standin/__stories__/deprecated-standin.stories.tsx +0 -30
- package/src/widgets/deprecated-standin/__tests__/__snapshots__/deprecated-standin.test.ts.snap +0 -70
- package/src/widgets/deprecated-standin/__tests__/deprecated-standin.test.ts +0 -93
- package/src/widgets/deprecated-standin/index.tsx +0 -58
- package/src/widgets/dropdown.tsx +0 -142
- package/src/widgets/explanation.tsx +0 -317
- package/src/widgets/expression.tsx +0 -707
- package/src/widgets/graded-group-answer-bar.tsx +0 -142
- package/src/widgets/graded-group-set.tsx +0 -338
- package/src/widgets/graded-group.tsx +0 -471
- package/src/widgets/grapher/util.tsx +0 -799
- package/src/widgets/grapher.tsx +0 -660
- package/src/widgets/group.tsx +0 -195
- package/src/widgets/iframe.tsx +0 -195
- package/src/widgets/image.tsx +0 -312
- package/src/widgets/input-number.tsx +0 -412
- package/src/widgets/interaction/arrow-picker.tsx +0 -38
- package/src/widgets/interaction/color-picker.tsx +0 -69
- package/src/widgets/interaction/dash-picker.tsx +0 -45
- package/src/widgets/interaction/element-container.tsx +0 -100
- package/src/widgets/interaction.tsx +0 -826
- package/src/widgets/interactive-graph.tsx +0 -2597
- package/src/widgets/label-image/__stories__/answer-choices.stories.tsx +0 -91
- package/src/widgets/label-image/__stories__/answer-pill.stories.tsx +0 -62
- package/src/widgets/label-image/__stories__/marker.stories.tsx +0 -171
- package/src/widgets/label-image/__tests__/answer-pill.test.tsx +0 -75
- package/src/widgets/label-image/__tests__/hide-answers-toggle.test.tsx +0 -39
- package/src/widgets/label-image/answer-choices.tsx +0 -88
- package/src/widgets/label-image/answer-pill.tsx +0 -103
- package/src/widgets/label-image/hide-answers-toggle.tsx +0 -40
- package/src/widgets/label-image/marker.tsx +0 -268
- package/src/widgets/label-image/strings.ts +0 -5
- package/src/widgets/label-image/types.ts +0 -27
- package/src/widgets/label-image.test.ts +0 -928
- package/src/widgets/label-image.tsx +0 -819
- package/src/widgets/lights-puzzle.tsx +0 -359
- package/src/widgets/matcher.tsx +0 -298
- package/src/widgets/matrix.tsx +0 -634
- package/src/widgets/measurer.tsx +0 -222
- package/src/widgets/molecule/__tests__/layout.test.ts +0 -162
- package/src/widgets/molecule/__tests__/parser.test.ts +0 -155
- package/src/widgets/molecule/molecule-drawing.ts +0 -173
- package/src/widgets/molecule/molecule-layout.ts +0 -362
- package/src/widgets/molecule/smiles-parser.ts +0 -296
- package/src/widgets/molecule.tsx +0 -172
- package/src/widgets/number-line.tsx +0 -862
- package/src/widgets/numeric-input.tsx +0 -576
- package/src/widgets/orderer.tsx +0 -786
- package/src/widgets/passage/__tests__/passage-markdown.test.ts +0 -376
- package/src/widgets/passage/passage-markdown.tsx +0 -475
- package/src/widgets/passage-ref-target.tsx +0 -76
- package/src/widgets/passage-ref.tsx +0 -213
- package/src/widgets/passage.tsx +0 -582
- package/src/widgets/plotter.tsx +0 -1194
- package/src/widgets/radio/__stories__/base-radio.stories.tsx +0 -196
- package/src/widgets/radio/__stories__/choice-icon.stories.tsx +0 -166
- package/src/widgets/radio/__stories__/choice-none-above.stories.tsx +0 -40
- package/src/widgets/radio/__stories__/choice.stories.tsx +0 -137
- package/src/widgets/radio/__stories__/focus-ring.stories.tsx +0 -43
- package/src/widgets/radio/__stories__/option-status.stories.tsx +0 -103
- package/src/widgets/radio/base-radio.tsx +0 -511
- package/src/widgets/radio/choice-a11y-text.ts +0 -61
- package/src/widgets/radio/choice-icon/choice-icon.tsx +0 -218
- package/src/widgets/radio/choice-icon/cross-out-line.tsx +0 -51
- package/src/widgets/radio/choice-icon/shared-styles.ts +0 -15
- package/src/widgets/radio/choice-none-above.tsx +0 -56
- package/src/widgets/radio/choice.jsx.fixture.ts +0 -45
- package/src/widgets/radio/choice.tsx +0 -359
- package/src/widgets/radio/focus-ring.tsx +0 -57
- package/src/widgets/radio/option-status.tsx +0 -98
- package/src/widgets/radio/util.test.ts +0 -18
- package/src/widgets/radio/util.ts +0 -31
- package/src/widgets/radio/widget.tsx +0 -520
- package/src/widgets/radio.ts +0 -157
- package/src/widgets/reaction-diagram.tsx +0 -144
- package/src/widgets/sequence.tsx +0 -142
- package/src/widgets/simulator.tsx +0 -829
- package/src/widgets/sorter.tsx +0 -155
- package/src/widgets/table.tsx +0 -393
- package/src/widgets/unit.tsx +0 -374
- package/src/widgets/video-transcript-link.test.tsx +0 -213
- package/src/widgets/video-transcript-link.tsx +0 -84
- package/src/widgets/video.tsx +0 -135
- package/src/widgets.ts +0 -489
- package/src/zoom.ts +0 -555
- package/tsconfig-build.json +0 -26
- package/tsconfig-build.tsbuildinfo +0 -1
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import TexWrangler from "../tex-wrangler";
|
|
2
|
-
|
|
3
|
-
const {parseTex, modifyTex} = TexWrangler;
|
|
4
|
-
|
|
5
|
-
const whitespaceRegex = /\s/g;
|
|
6
|
-
|
|
7
|
-
const assertWrangled = (toWrangle: string, check: string) => {
|
|
8
|
-
// We ignore whitespace when comparing
|
|
9
|
-
const wrangled = modifyTex(toWrangle).replace(whitespaceRegex, "");
|
|
10
|
-
const checkNoSpace = check.replace(whitespaceRegex, "");
|
|
11
|
-
expect(wrangled).toBe(checkNoSpace);
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
const assertParsed = (toParse: undefined | string, check: string) => {
|
|
15
|
-
// We ignore whitespace when comparing
|
|
16
|
-
// @ts-expect-error - TS2345 - Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
|
|
17
|
-
const parsed = parseTex(toParse).replace(whitespaceRegex, "");
|
|
18
|
-
const checkNoSpace = check.replace(whitespaceRegex, "");
|
|
19
|
-
expect(parsed).toBe(checkNoSpace);
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
describe("modifyTex", () => {
|
|
23
|
-
it("should not touch single fractions", () => {
|
|
24
|
-
assertWrangled("\\frac{3}{4}", "\\frac{3}{4}");
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it("should make big single fractions small", () => {
|
|
28
|
-
assertWrangled("\\dfrac{3}{4}", "\\frac{3}{4}");
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it("should make outer fractions big", () => {
|
|
32
|
-
assertWrangled("\\frac{1}{\\frac{2}{3}}", "\\dfrac{1}{\\frac{2}{3}}");
|
|
33
|
-
assertWrangled("\\frac{\\frac{1}{2}}{3}", "\\dfrac{\\frac{1}{2}}{3}");
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it("should make inner fractions small", () => {
|
|
37
|
-
assertWrangled("\\dfrac{1}{\\dfrac{2}{3}}", "\\dfrac{1}{\\frac{2}{3}}");
|
|
38
|
-
assertWrangled("\\dfrac{\\dfrac{1}{2}}{3}", "\\dfrac{\\frac{1}{2}}{3}");
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it("should parse mutliple fractions", () => {
|
|
42
|
-
assertWrangled(
|
|
43
|
-
"\\dfrac{1}{2} + \\dfrac{3}{4}",
|
|
44
|
-
"\\frac{1}{2} + \\frac{3}{4}",
|
|
45
|
-
);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it("shouldn't touch things before fractions", () => {
|
|
49
|
-
assertWrangled("1 + \\dfrac{2}{3}", "1 + \\frac{2}{3}");
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it("shouldn't touch things after fractions", () => {
|
|
53
|
-
assertWrangled("\\dfrac{1}{2} + 3", "\\frac{1}{2} + 3");
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it("shouldn't touch things that wrap fractions", () => {
|
|
57
|
-
assertWrangled("\\sqrt{\\dfrac{1}{2}}", "\\sqrt{\\frac{1}{2}}");
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it("should have sane failure modes", () => {
|
|
61
|
-
assertWrangled("\\dfrac{3}{4", "\\frac{3}{4}");
|
|
62
|
-
// This could maybe be better, but if someone gives us this and it
|
|
63
|
-
// doesn't work then that's their fault. :)
|
|
64
|
-
assertWrangled("\\dfrac{3}{4}}", "\\frac{3}{4}}");
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
describe("parseTex", () => {
|
|
69
|
-
it("should replace single fractions", () => {
|
|
70
|
-
assertParsed("\\dfrac{3}{4}", "3 / 4");
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it("should remove blackslash-escapes for percent signs", () => {
|
|
74
|
-
assertParsed("3\\%", "3%");
|
|
75
|
-
assertParsed("3.5\\%", "3.5%");
|
|
76
|
-
assertParsed("\\dfrac{3\\%}{4}", "3% / 4");
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it("should not throw error when input is undefined", () => {
|
|
80
|
-
assertParsed(undefined, "");
|
|
81
|
-
});
|
|
82
|
-
});
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import Util from "../util";
|
|
2
|
-
|
|
3
|
-
describe("#constrainedTickStepsFromTickSteps", () => {
|
|
4
|
-
it("should not changes the tick steps if there are fewer than (or exactly) 10 steps", () => {
|
|
5
|
-
const result = Util.constrainedTickStepsFromTickSteps(
|
|
6
|
-
[1, 1],
|
|
7
|
-
[
|
|
8
|
-
[0, 10],
|
|
9
|
-
[0, 10],
|
|
10
|
-
],
|
|
11
|
-
);
|
|
12
|
-
|
|
13
|
-
expect(result).toEqual([1, 1]);
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it("should should double the tick step size if there are more than 10 but fewer than (or exactly) 20 steps", () => {
|
|
17
|
-
const result = Util.constrainedTickStepsFromTickSteps(
|
|
18
|
-
[1, 1],
|
|
19
|
-
[
|
|
20
|
-
[0, 20],
|
|
21
|
-
[0, 20],
|
|
22
|
-
],
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
expect(result).toEqual([2, 2]);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it("should use the value returned by tickStepFromNumTicks", () => {
|
|
29
|
-
jest.spyOn(Util, "tickStepFromNumTicks").mockReturnValue(5);
|
|
30
|
-
const result = Util.constrainedTickStepsFromTickSteps(
|
|
31
|
-
[1, 1],
|
|
32
|
-
[
|
|
33
|
-
[0, 50],
|
|
34
|
-
[0, 50],
|
|
35
|
-
],
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
expect(result).toEqual([5, 5]);
|
|
39
|
-
});
|
|
40
|
-
});
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import "@testing-library/jest-dom"; // Joyous side-effects
|
|
2
|
-
import {render, screen} from "@testing-library/react";
|
|
3
|
-
import * as React from "react";
|
|
4
|
-
|
|
5
|
-
import {testDependencies} from "../../../../testing/test-dependencies";
|
|
6
|
-
import * as Dependencies from "../dependencies";
|
|
7
|
-
import WidgetContainer from "../widget-container";
|
|
8
|
-
import {registerWidget} from "../widgets";
|
|
9
|
-
import PassageWidget from "../widgets/passage";
|
|
10
|
-
|
|
11
|
-
import type {WidgetExports} from "../types";
|
|
12
|
-
|
|
13
|
-
const MockWidgetComponent = ({
|
|
14
|
-
text,
|
|
15
|
-
fail = false,
|
|
16
|
-
}: {
|
|
17
|
-
text: string;
|
|
18
|
-
fail: boolean;
|
|
19
|
-
}) => {
|
|
20
|
-
if (fail) {
|
|
21
|
-
throw new Error("MockWidget failed to render");
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return <div>{text}</div>;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
const MockWidget: WidgetExports<typeof MockWidgetComponent> = {
|
|
28
|
-
name: "mock-widget",
|
|
29
|
-
displayName: "Mock Widget",
|
|
30
|
-
widget: MockWidgetComponent,
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
describe("widget-container", () => {
|
|
34
|
-
it("should render nothing when requested widget not registered", () => {
|
|
35
|
-
// Arrange
|
|
36
|
-
const warnMock = jest.spyOn(console, "warn").mockImplementation();
|
|
37
|
-
|
|
38
|
-
// Act
|
|
39
|
-
render(
|
|
40
|
-
<WidgetContainer
|
|
41
|
-
type="invalid-widget"
|
|
42
|
-
id="invalid-widget 1"
|
|
43
|
-
shouldHighlight={false}
|
|
44
|
-
initialProps={{apiOptions: {isMobile: false}}}
|
|
45
|
-
/>,
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
// Assert
|
|
49
|
-
expect(warnMock).toHaveBeenCalledWith(
|
|
50
|
-
"Widget type 'invalid-widget' not found!",
|
|
51
|
-
);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it("should render the requested widget", async () => {
|
|
55
|
-
// Arrange
|
|
56
|
-
jest.spyOn(Dependencies, "getDependencies").mockReturnValue(
|
|
57
|
-
testDependencies,
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
registerWidget("passage", PassageWidget);
|
|
61
|
-
|
|
62
|
-
// Act
|
|
63
|
-
render(
|
|
64
|
-
<WidgetContainer
|
|
65
|
-
type="passage"
|
|
66
|
-
id="passage 1"
|
|
67
|
-
shouldHighlight={false}
|
|
68
|
-
initialProps={{
|
|
69
|
-
passageTitle: "Greeting",
|
|
70
|
-
passageText: "Hello world!",
|
|
71
|
-
footnotes: null,
|
|
72
|
-
showLineNumbers: true,
|
|
73
|
-
|
|
74
|
-
findWidgets: () => [],
|
|
75
|
-
|
|
76
|
-
apiOptions: {isMobile: false},
|
|
77
|
-
}}
|
|
78
|
-
/>,
|
|
79
|
-
);
|
|
80
|
-
|
|
81
|
-
// Assert
|
|
82
|
-
expect(await screen.findByText("Greeting")).toBeInTheDocument();
|
|
83
|
-
expect(await screen.findByText("Hello world")).toBeInTheDocument();
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it("should send analytics even when widget rendering errors", () => {
|
|
87
|
-
// Arrange
|
|
88
|
-
jest.spyOn(Dependencies, "getDependencies").mockReturnValue(
|
|
89
|
-
testDependencies,
|
|
90
|
-
);
|
|
91
|
-
jest.spyOn(console, "error").mockImplementation(() => {});
|
|
92
|
-
|
|
93
|
-
const onAnalyticsEventSpy = jest.fn();
|
|
94
|
-
const depsV2 = {analytics: {onAnalyticsEvent: onAnalyticsEventSpy}};
|
|
95
|
-
|
|
96
|
-
registerWidget("mock-widget", MockWidget);
|
|
97
|
-
|
|
98
|
-
// Act
|
|
99
|
-
render(
|
|
100
|
-
<Dependencies.DependenciesContext.Provider value={depsV2}>
|
|
101
|
-
<WidgetContainer
|
|
102
|
-
type="mock-widget"
|
|
103
|
-
id="mock-widget 1"
|
|
104
|
-
shouldHighlight={false}
|
|
105
|
-
initialProps={{
|
|
106
|
-
text: "Hello world!",
|
|
107
|
-
fail: true,
|
|
108
|
-
|
|
109
|
-
findWidgets: () => [],
|
|
110
|
-
|
|
111
|
-
apiOptions: {isMobile: false},
|
|
112
|
-
}}
|
|
113
|
-
/>
|
|
114
|
-
</Dependencies.DependenciesContext.Provider>,
|
|
115
|
-
);
|
|
116
|
-
|
|
117
|
-
// Assert
|
|
118
|
-
expect(onAnalyticsEventSpy).toHaveBeenCalledWith({
|
|
119
|
-
type: "perseus:widget-rendering-error",
|
|
120
|
-
payload: {
|
|
121
|
-
widgetType: "mock-widget",
|
|
122
|
-
widgetId: "mock-widget 1",
|
|
123
|
-
},
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
});
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import {testDependencies} from "../../../../testing/test-dependencies";
|
|
2
|
-
import {setDependencies} from "../dependencies";
|
|
3
|
-
import {registerAllWidgetsForTesting} from "../util/register-all-widgets-for-testing";
|
|
4
|
-
import * as Widgets from "../widgets";
|
|
5
|
-
|
|
6
|
-
describe("Widget API support", () => {
|
|
7
|
-
beforeAll(() => {
|
|
8
|
-
registerAllWidgetsForTesting();
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
// This verifies a known list of widgets to ensure they provide the static
|
|
12
|
-
// validate function. Not all widgets support this function so even though
|
|
13
|
-
// this list looks exhaustive, it's not!
|
|
14
|
-
it.each([
|
|
15
|
-
"deprecated-standin",
|
|
16
|
-
"radio",
|
|
17
|
-
"input-number",
|
|
18
|
-
"numeric-input",
|
|
19
|
-
"expression",
|
|
20
|
-
"categorizer",
|
|
21
|
-
"cs-program",
|
|
22
|
-
"dropdown",
|
|
23
|
-
"explanation",
|
|
24
|
-
"definition",
|
|
25
|
-
"grapher",
|
|
26
|
-
"iframe",
|
|
27
|
-
"image",
|
|
28
|
-
"interaction",
|
|
29
|
-
"interactive-graph",
|
|
30
|
-
"label-image",
|
|
31
|
-
"matrix",
|
|
32
|
-
"matcher",
|
|
33
|
-
"measurer",
|
|
34
|
-
"number-line",
|
|
35
|
-
"orderer",
|
|
36
|
-
"passage",
|
|
37
|
-
"passage-ref",
|
|
38
|
-
"passage-ref-target",
|
|
39
|
-
"plotter",
|
|
40
|
-
"simulator",
|
|
41
|
-
"sorter",
|
|
42
|
-
"table",
|
|
43
|
-
"unit-input",
|
|
44
|
-
"video",
|
|
45
|
-
])("%s widget should provide static validate function", (widgetType) => {
|
|
46
|
-
expect(Widgets.getWidget(widgetType)).toHaveProperty("validate");
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
// This list is mirrored in Khan Academy's webapp for the coach reports.
|
|
50
|
-
// If you change this, be sure to double-check that consuming applications
|
|
51
|
-
// agree on this list of supported widgets.
|
|
52
|
-
it.each([
|
|
53
|
-
"categorizer",
|
|
54
|
-
"expression",
|
|
55
|
-
"grapher",
|
|
56
|
-
"input-number",
|
|
57
|
-
"interactive-graph",
|
|
58
|
-
"numeric-input",
|
|
59
|
-
"radio",
|
|
60
|
-
])(
|
|
61
|
-
"%s widget should provide static getUserInputFromProps function",
|
|
62
|
-
(widgetType) => {
|
|
63
|
-
const Widget = Widgets.getWidget(widgetType);
|
|
64
|
-
expect(Widget).toHaveProperty("getUserInputFromProps");
|
|
65
|
-
},
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
it.each(["expression", "input-number", "numeric-input"])(
|
|
69
|
-
"%s widget should provide static getOneCorrectAnswerFromRubric function",
|
|
70
|
-
(widgetType) => {
|
|
71
|
-
const Widget = Widgets.getWidget(widgetType);
|
|
72
|
-
expect(Widget).toHaveProperty("getOneCorrectAnswerFromRubric");
|
|
73
|
-
},
|
|
74
|
-
);
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
describe("replaceWidget", () => {
|
|
78
|
-
beforeEach(() => {
|
|
79
|
-
setDependencies(testDependencies);
|
|
80
|
-
registerAllWidgetsForTesting();
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it("replaces an existing widget", () => {
|
|
84
|
-
Widgets.replaceWidget("transformer", "radio");
|
|
85
|
-
expect(Widgets.getWidget("transformer")?.name).toBe("Radio");
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
it("Throws when the replacement isn't available", () => {
|
|
89
|
-
expect(() => Widgets.replaceWidget("radio", "dog-cat")).toThrow();
|
|
90
|
-
});
|
|
91
|
-
});
|
package/src/a11y.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Identifies whether or not a given perseus item requires the use of a mouse
|
|
3
|
-
* or screen, based on the widgets it contains.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import _ from "underscore";
|
|
7
|
-
|
|
8
|
-
import MultiItems from "./multi-items";
|
|
9
|
-
import {traverse} from "./traversal";
|
|
10
|
-
import * as Widgets from "./widgets";
|
|
11
|
-
|
|
12
|
-
const {findContentNodesInItem, inferItemShape} = MultiItems;
|
|
13
|
-
|
|
14
|
-
// Iterate over a single Perseus renderer, mutating `widgets` by appending
|
|
15
|
-
// violating widget types discovered in this item.
|
|
16
|
-
function traverseRenderer(itemData, widgets: Array<any>) {
|
|
17
|
-
traverse(itemData, null, function (info) {
|
|
18
|
-
if (info.type && !Widgets.isAccessible(info)) {
|
|
19
|
-
widgets.push(info.type);
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// Returns a list of widgets that cause a given perseus item to require
|
|
25
|
-
// the use of a screen or mouse.
|
|
26
|
-
//
|
|
27
|
-
// For now we'll just check the `accessible` field on each of the widgets
|
|
28
|
-
// in the item data, but in the future we may specify accessibility on
|
|
29
|
-
// each widget with higher granularity.
|
|
30
|
-
export function violatingWidgets(itemData: any): any {
|
|
31
|
-
// TODO(jordan): Hints as well
|
|
32
|
-
const widgets = [];
|
|
33
|
-
|
|
34
|
-
if (itemData._multi) {
|
|
35
|
-
const shape = inferItemShape(itemData);
|
|
36
|
-
findContentNodesInItem(itemData, shape, (content) =>
|
|
37
|
-
traverseRenderer(content, widgets),
|
|
38
|
-
);
|
|
39
|
-
} else {
|
|
40
|
-
traverseRenderer(itemData.question, widgets);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Uniquify the list of widgets (by type)
|
|
44
|
-
return _.uniq(widgets);
|
|
45
|
-
}
|
package/src/all-widgets.ts
DELETED
package/src/article-renderer.tsx
DELETED
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* An article renderer. Articles are long-form pieces of content,
|
|
3
|
-
* composed of multiple (Renderer) sections concatenated together.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import * as PerseusLinter from "@khanacademy/perseus-linter";
|
|
7
|
-
import classNames from "classnames";
|
|
8
|
-
import * as React from "react";
|
|
9
|
-
|
|
10
|
-
import {DependenciesContext} from "./dependencies";
|
|
11
|
-
import {ClassNames as ApiClassNames, ApiOptions} from "./perseus-api";
|
|
12
|
-
import Renderer from "./renderer";
|
|
13
|
-
import Util from "./util";
|
|
14
|
-
|
|
15
|
-
import type {PerseusRenderer} from "./perseus-types";
|
|
16
|
-
import type {APIOptions, PerseusDependenciesV2} from "./types";
|
|
17
|
-
import type {KeypadAPI} from "@khanacademy/math-input";
|
|
18
|
-
import type {KeypadContextRendererInterface} from "@khanacademy/perseus-core";
|
|
19
|
-
import type {LinterContextProps} from "@khanacademy/perseus-linter";
|
|
20
|
-
|
|
21
|
-
type Props = Partial<React.ContextType<typeof DependenciesContext>> & {
|
|
22
|
-
apiOptions: APIOptions;
|
|
23
|
-
json: PerseusRenderer | ReadonlyArray<PerseusRenderer>;
|
|
24
|
-
// Whether to use the new Bibliotron styles for articles
|
|
25
|
-
/**
|
|
26
|
-
* @deprecated Does nothing
|
|
27
|
-
*/
|
|
28
|
-
useNewStyles: boolean;
|
|
29
|
-
linterContext: LinterContextProps;
|
|
30
|
-
legacyPerseusLint?: ReadonlyArray<string>;
|
|
31
|
-
keypadElement?: KeypadAPI | null | undefined;
|
|
32
|
-
dependencies: PerseusDependenciesV2;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
type DefaultProps = {
|
|
36
|
-
apiOptions: Props["apiOptions"];
|
|
37
|
-
useNewStyles: Props["useNewStyles"];
|
|
38
|
-
linterContext: Props["linterContext"];
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
class ArticleRenderer
|
|
42
|
-
extends React.Component<Props>
|
|
43
|
-
implements KeypadContextRendererInterface
|
|
44
|
-
{
|
|
45
|
-
_currentFocus: any;
|
|
46
|
-
sectionRenderers: Array<Renderer> = [];
|
|
47
|
-
|
|
48
|
-
static defaultProps: DefaultProps = {
|
|
49
|
-
apiOptions: ApiOptions.defaults,
|
|
50
|
-
useNewStyles: false,
|
|
51
|
-
linterContext: PerseusLinter.linterContextDefault,
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
constructor(props: Props) {
|
|
55
|
-
super(props);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
componentDidMount() {
|
|
59
|
-
this._currentFocus = null;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
shouldComponentUpdate(nextProps: Props): boolean {
|
|
63
|
-
return nextProps !== this.props;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
_handleFocusChange: (arg1: any, arg2: any) => void = (
|
|
67
|
-
newFocusPath,
|
|
68
|
-
oldFocusPath,
|
|
69
|
-
) => {
|
|
70
|
-
// TODO(charlie): DRY this up--some of this logic is repeated in
|
|
71
|
-
// ItemRenderer.
|
|
72
|
-
if (newFocusPath) {
|
|
73
|
-
this._setCurrentFocus(newFocusPath);
|
|
74
|
-
} else {
|
|
75
|
-
this._onRendererBlur(oldFocusPath);
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
_setCurrentFocus: (arg1: any) => void = (newFocusPath) => {
|
|
80
|
-
const {keypadElement, apiOptions} = this.props;
|
|
81
|
-
const {isMobile} = apiOptions;
|
|
82
|
-
|
|
83
|
-
const prevFocusPath = this._currentFocus;
|
|
84
|
-
this._currentFocus = newFocusPath;
|
|
85
|
-
|
|
86
|
-
// Use the section prefix to extract the relevant Renderer's input
|
|
87
|
-
// paths, so as to check whether the focused path represents an
|
|
88
|
-
// input.
|
|
89
|
-
let didFocusInput = false;
|
|
90
|
-
let focusedInput;
|
|
91
|
-
|
|
92
|
-
if (this._currentFocus) {
|
|
93
|
-
const [sectionIndex, ...focusPath] = this._currentFocus;
|
|
94
|
-
|
|
95
|
-
const inputPaths =
|
|
96
|
-
this.sectionRenderers[sectionIndex].getInputPaths();
|
|
97
|
-
|
|
98
|
-
didFocusInput = inputPaths.some((inputPath) => {
|
|
99
|
-
return Util.inputPathsEqual(inputPath, focusPath);
|
|
100
|
-
});
|
|
101
|
-
focusedInput =
|
|
102
|
-
this.sectionRenderers[sectionIndex].getDOMNodeForPath(
|
|
103
|
-
focusPath,
|
|
104
|
-
);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const {onFocusChange} = this.props.apiOptions;
|
|
108
|
-
if (onFocusChange) {
|
|
109
|
-
// Wait for the keypad to mount before getting the height
|
|
110
|
-
setTimeout(() => {
|
|
111
|
-
const keypadDomNode =
|
|
112
|
-
keypadElement?.getDOMNode() as HTMLElement;
|
|
113
|
-
const keypadHeight =
|
|
114
|
-
keypadDomNode && didFocusInput
|
|
115
|
-
? keypadDomNode.getBoundingClientRect().height
|
|
116
|
-
: 0;
|
|
117
|
-
|
|
118
|
-
onFocusChange(
|
|
119
|
-
this._currentFocus,
|
|
120
|
-
prevFocusPath,
|
|
121
|
-
keypadHeight,
|
|
122
|
-
didFocusInput ? focusedInput : null,
|
|
123
|
-
);
|
|
124
|
-
}, 0);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (keypadElement && isMobile) {
|
|
128
|
-
if (didFocusInput) {
|
|
129
|
-
keypadElement.activate();
|
|
130
|
-
} else {
|
|
131
|
-
keypadElement.dismiss();
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
_onRendererBlur: (arg1: any) => void = (blurPath) => {
|
|
137
|
-
const blurringFocusPath = this._currentFocus;
|
|
138
|
-
|
|
139
|
-
// Failsafe: abort if ID is different, because focus probably happened
|
|
140
|
-
// before blur.
|
|
141
|
-
if (!Util.inputPathsEqual(blurPath, blurringFocusPath)) {
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Wait until after any new focus events fire this tick before declaring
|
|
146
|
-
// that nothing is focused, since if there were a focus change across
|
|
147
|
-
// sections, we could receive the blur before the focus.
|
|
148
|
-
// TODO(jeff, CP-3128): Use Wonder Blocks Timing API
|
|
149
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
150
|
-
setTimeout(() => {
|
|
151
|
-
if (Util.inputPathsEqual(this._currentFocus, blurringFocusPath)) {
|
|
152
|
-
this._setCurrentFocus(null);
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
blur: () => void = () => {
|
|
158
|
-
if (this._currentFocus) {
|
|
159
|
-
const [sectionIndex, ...inputPath] = this._currentFocus;
|
|
160
|
-
this.sectionRenderers[sectionIndex].blurPath(inputPath);
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
_sections: () => any = () => {
|
|
165
|
-
return Array.isArray(this.props.json)
|
|
166
|
-
? this.props.json
|
|
167
|
-
: [this.props.json];
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
render(): React.ReactNode {
|
|
171
|
-
const apiOptions = {
|
|
172
|
-
...ApiOptions.defaults,
|
|
173
|
-
...this.props.apiOptions,
|
|
174
|
-
isArticle: true,
|
|
175
|
-
} as const;
|
|
176
|
-
|
|
177
|
-
const classes = classNames({
|
|
178
|
-
"framework-perseus": true,
|
|
179
|
-
"perseus-article": true,
|
|
180
|
-
// NOTE(charlie): For exercises, this is applied outside of Perseus
|
|
181
|
-
// (in webapp).
|
|
182
|
-
[ApiClassNames.MOBILE]: apiOptions.isMobile,
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
// TODO(alex): Add mobile api functions and pass them down here
|
|
186
|
-
// We're using the index as the key here because we don't have a unique
|
|
187
|
-
// identifier for each section. This should be fine as we never remove
|
|
188
|
-
// or reorder sections.
|
|
189
|
-
const sections = this._sections().map((section, sectionIndex) => {
|
|
190
|
-
return (
|
|
191
|
-
<div key={sectionIndex} className="clearfix">
|
|
192
|
-
<Renderer
|
|
193
|
-
{...section}
|
|
194
|
-
ref={(elem) => {
|
|
195
|
-
if (elem) {
|
|
196
|
-
this.sectionRenderers[sectionIndex] = elem;
|
|
197
|
-
}
|
|
198
|
-
}}
|
|
199
|
-
key={sectionIndex}
|
|
200
|
-
key_={sectionIndex}
|
|
201
|
-
keypadElement={this.props.keypadElement}
|
|
202
|
-
apiOptions={{
|
|
203
|
-
...apiOptions,
|
|
204
|
-
onFocusChange: (newFocusPath, oldFocusPath) => {
|
|
205
|
-
// Prefix the paths with the relevant section index,
|
|
206
|
-
// so as to allow us to distinguish between
|
|
207
|
-
// equivalently-named inputs across Renderers.
|
|
208
|
-
this._handleFocusChange(
|
|
209
|
-
newFocusPath &&
|
|
210
|
-
[sectionIndex].concat(newFocusPath),
|
|
211
|
-
oldFocusPath &&
|
|
212
|
-
[sectionIndex].concat(oldFocusPath),
|
|
213
|
-
);
|
|
214
|
-
},
|
|
215
|
-
}}
|
|
216
|
-
linterContext={PerseusLinter.pushContextStack(
|
|
217
|
-
this.props.linterContext,
|
|
218
|
-
"article",
|
|
219
|
-
)}
|
|
220
|
-
legacyPerseusLint={this.props.legacyPerseusLint}
|
|
221
|
-
{...this.props.dependencies}
|
|
222
|
-
/>
|
|
223
|
-
</div>
|
|
224
|
-
);
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
return (
|
|
228
|
-
<div className={classes}>
|
|
229
|
-
<DependenciesContext.Provider value={this.props.dependencies}>
|
|
230
|
-
{sections}
|
|
231
|
-
</DependenciesContext.Provider>
|
|
232
|
-
</div>
|
|
233
|
-
);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
export default ArticleRenderer;
|
package/src/asset-context.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A React context for keeping track of whether an component is fully
|
|
3
|
-
* loaded. This is used to know when SvgImage and (Zoomable)TeX are finished
|
|
4
|
-
* renderering.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import * as React from "react";
|
|
8
|
-
|
|
9
|
-
type Context = {
|
|
10
|
-
// A dictionary of asset statues. See server-item-renderer.jsx for
|
|
11
|
-
// an example of its definition.
|
|
12
|
-
assetStatuses: {
|
|
13
|
-
[assetKey: string]: boolean;
|
|
14
|
-
};
|
|
15
|
-
// setAssetStatus(key, false) must be called in the constructor of
|
|
16
|
-
// any component which isn't fully rendered on initial render. This
|
|
17
|
-
// adds the asset key to asssetStatuses, see server-item-renderer.jsx.
|
|
18
|
-
// setAssetStatus(key, true) must be called when the component has
|
|
19
|
-
// fully rendered itself. See svg-image.jsx and tex.jsx.
|
|
20
|
-
setAssetStatus: (assetKey: string, loaded: boolean) => void;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const defaultContext: Context = {
|
|
24
|
-
assetStatuses: {},
|
|
25
|
-
setAssetStatus: (assetKey: string, loaded: boolean) => {},
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const context: React.Context<Context> = React.createContext(defaultContext);
|
|
29
|
-
|
|
30
|
-
export default context;
|
package/src/basic-widgets.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/* eslint-disable import/no-named-as-default */
|
|
2
|
-
// As new widgets get added here, please also make sure they get added in
|
|
3
|
-
// content_internal/perseus_traversal.py so they can be properly translated.
|
|
4
|
-
import Expression from "./widgets/expression";
|
|
5
|
-
import InputNumber from "./widgets/input-number";
|
|
6
|
-
import NumericInput from "./widgets/numeric-input";
|
|
7
|
-
import Radio from "./widgets/radio";
|
|
8
|
-
|
|
9
|
-
import type {WidgetExports} from "./types";
|
|
10
|
-
|
|
11
|
-
export default [
|
|
12
|
-
Radio,
|
|
13
|
-
InputNumber,
|
|
14
|
-
NumericInput,
|
|
15
|
-
Expression,
|
|
16
|
-
] as ReadonlyArray<WidgetExports>;
|