@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,511 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @khanacademy/ts-no-error-suppressions */
|
|
2
|
-
import * as i18n from "@khanacademy/wonder-blocks-i18n";
|
|
3
|
-
import {StyleSheet, css} from "aphrodite";
|
|
4
|
-
import classNames from "classnames";
|
|
5
|
-
import * as React from "react";
|
|
6
|
-
import {useRef, useEffect} from "react";
|
|
7
|
-
import ReactDOM from "react-dom";
|
|
8
|
-
import _ from "underscore";
|
|
9
|
-
|
|
10
|
-
import {ClassNames as ApiClassNames} from "../../perseus-api";
|
|
11
|
-
import * as styleConstants from "../../styles/constants";
|
|
12
|
-
import mediaQueries from "../../styles/media-queries";
|
|
13
|
-
import sharedStyles from "../../styles/shared";
|
|
14
|
-
import Util from "../../util";
|
|
15
|
-
import {scrollElementIntoView} from "../../util/scroll-utils";
|
|
16
|
-
|
|
17
|
-
import Choice from "./choice";
|
|
18
|
-
import ChoiceNoneAbove from "./choice-none-above";
|
|
19
|
-
|
|
20
|
-
import type {PerseusRadioWidgetOptions} from "../../perseus-types";
|
|
21
|
-
import type {APIOptions} from "../../types";
|
|
22
|
-
import type {StyleDeclaration} from "aphrodite";
|
|
23
|
-
|
|
24
|
-
const {captureScratchpadTouchStart} = Util;
|
|
25
|
-
|
|
26
|
-
// exported for tests
|
|
27
|
-
export type ChoiceType = {
|
|
28
|
-
checked: boolean;
|
|
29
|
-
crossedOut: boolean;
|
|
30
|
-
content: React.ReactNode;
|
|
31
|
-
rationale: React.ReactNode;
|
|
32
|
-
hasRationale: boolean;
|
|
33
|
-
showRationale: boolean;
|
|
34
|
-
showCorrectness: boolean;
|
|
35
|
-
correct: boolean;
|
|
36
|
-
isNoneOfTheAbove: boolean;
|
|
37
|
-
highlighted: boolean;
|
|
38
|
-
previouslyAnswered: boolean;
|
|
39
|
-
revealNoneOfTheAbove: boolean;
|
|
40
|
-
disabled: boolean;
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
export type FocusFunction = (
|
|
44
|
-
choiceIndex?: number | null | undefined,
|
|
45
|
-
) => boolean;
|
|
46
|
-
|
|
47
|
-
type Props = {
|
|
48
|
-
apiOptions: APIOptions;
|
|
49
|
-
choices: ReadonlyArray<ChoiceType>;
|
|
50
|
-
deselectEnabled?: boolean;
|
|
51
|
-
editMode: boolean;
|
|
52
|
-
labelWrap: boolean;
|
|
53
|
-
countChoices: boolean | null | undefined;
|
|
54
|
-
numCorrect: number;
|
|
55
|
-
multipleSelect: boolean;
|
|
56
|
-
// the logic checks whether this exists,
|
|
57
|
-
// so it must be optional
|
|
58
|
-
reviewModeRubric?: PerseusRadioWidgetOptions;
|
|
59
|
-
// A callback indicating that this choice has changed. Its argument is
|
|
60
|
-
// an object with two keys: `checked` and `crossedOut`. Each contains
|
|
61
|
-
// an array of boolean values, specifying the new checked and
|
|
62
|
-
// crossed-out value of each choice.
|
|
63
|
-
onChange: (newValues: {
|
|
64
|
-
checked: ReadonlyArray<boolean>;
|
|
65
|
-
crossedOut: ReadonlyArray<boolean>;
|
|
66
|
-
}) => void;
|
|
67
|
-
registerFocusFunction?: (arg1: FocusFunction) => void;
|
|
68
|
-
// Whether this widget was the most recently used widget in this
|
|
69
|
-
// Renderer. Determines whether we'll auto-scroll the page upon
|
|
70
|
-
// entering review mode.
|
|
71
|
-
isLastUsedWidget?: boolean;
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
function getInstructionsText(
|
|
75
|
-
multipleSelect: boolean,
|
|
76
|
-
countChoices: boolean | null | undefined,
|
|
77
|
-
numCorrect: number,
|
|
78
|
-
): string {
|
|
79
|
-
if (multipleSelect) {
|
|
80
|
-
if (countChoices) {
|
|
81
|
-
return i18n._("Choose %(numCorrect)s answers:", {
|
|
82
|
-
numCorrect: numCorrect,
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
return i18n._("Choose all answers that apply:");
|
|
86
|
-
}
|
|
87
|
-
return i18n._("Choose 1 answer:");
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
const BaseRadio = function (props: Props): React.ReactElement {
|
|
91
|
-
const {
|
|
92
|
-
apiOptions,
|
|
93
|
-
reviewModeRubric,
|
|
94
|
-
choices,
|
|
95
|
-
editMode,
|
|
96
|
-
multipleSelect,
|
|
97
|
-
labelWrap,
|
|
98
|
-
countChoices,
|
|
99
|
-
numCorrect,
|
|
100
|
-
isLastUsedWidget,
|
|
101
|
-
registerFocusFunction,
|
|
102
|
-
} = props;
|
|
103
|
-
|
|
104
|
-
// useEffect doesn't have previous props
|
|
105
|
-
const prevReviewModeRubric = useRef();
|
|
106
|
-
const choiceRefs = useRef([]);
|
|
107
|
-
|
|
108
|
-
useEffect(() => {
|
|
109
|
-
// Switching into review mode can sometimes cause the selected answer
|
|
110
|
-
// to scroll out of view - for example, when we reveal all those tall
|
|
111
|
-
// rationales. This can be disorienting for the user.
|
|
112
|
-
//
|
|
113
|
-
// So, if this widget just switched into review mode, ensure that the
|
|
114
|
-
// checked choice (or first checked choice, if there are multiple) is
|
|
115
|
-
// scrolled into view.
|
|
116
|
-
//
|
|
117
|
-
// This only happens if the `canScrollPage` API option is set (so that
|
|
118
|
-
// call sites aren't surprised by scrolling), and if this widget was
|
|
119
|
-
// the most recently used widget (because, if the user has since
|
|
120
|
-
// touched something else, they're probably not trying to keep their
|
|
121
|
-
// eye on this widget anymore).
|
|
122
|
-
if (
|
|
123
|
-
apiOptions.canScrollPage &&
|
|
124
|
-
isLastUsedWidget &&
|
|
125
|
-
reviewModeRubric &&
|
|
126
|
-
!prevReviewModeRubric.current
|
|
127
|
-
) {
|
|
128
|
-
const checkedIndex = choices.findIndex((c) => c.checked);
|
|
129
|
-
if (checkedIndex >= 0) {
|
|
130
|
-
const ref = choiceRefs.current[checkedIndex];
|
|
131
|
-
// note(matthew): we know this is only getting passed
|
|
132
|
-
// to a WB Clickable button, so we force it to be of
|
|
133
|
-
// type HTMLButtonElement
|
|
134
|
-
// @ts-expect-error - TS2339 - Property 'current' does not exist on type 'never'.
|
|
135
|
-
const anyNode = ReactDOM.findDOMNode(ref.current) as any;
|
|
136
|
-
const buttonNode = anyNode as
|
|
137
|
-
| HTMLButtonElement
|
|
138
|
-
| null
|
|
139
|
-
| undefined;
|
|
140
|
-
if (buttonNode) {
|
|
141
|
-
scrollElementIntoView(buttonNode);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// @ts-expect-error - TS2322 - Type 'PerseusRadioWidgetOptions | undefined' is not assignable to type 'undefined'.
|
|
147
|
-
prevReviewModeRubric.current = reviewModeRubric;
|
|
148
|
-
}, [apiOptions, choices, isLastUsedWidget, reviewModeRubric]);
|
|
149
|
-
|
|
150
|
-
// When a particular choice's `onChange` handler is called, indicating a
|
|
151
|
-
// change in a single choice's values, we need to call our `onChange`
|
|
152
|
-
// handler in order to notify our parent. However, our API with our parent
|
|
153
|
-
// is that we always provide *all* values for *all* choices, even if just
|
|
154
|
-
// one choice's values changed. (This is because sometimes an interaction
|
|
155
|
-
// with one choice can affect many choices, like how checking a new answer
|
|
156
|
-
// will usually cause the old answer to become unchecked.)
|
|
157
|
-
//
|
|
158
|
-
// So, given the new values for a particular choice, compute the new values
|
|
159
|
-
// for all choices, and pass them to `onChange`.
|
|
160
|
-
//
|
|
161
|
-
// `newValues` is an object with two keys: `checked` and `crossedOut`. Each
|
|
162
|
-
// contains a boolean value specifying the new checked and crossed-out
|
|
163
|
-
// value of this choice.
|
|
164
|
-
function updateChoice(
|
|
165
|
-
choiceIndex: number,
|
|
166
|
-
newValues: Readonly<{
|
|
167
|
-
checked: boolean;
|
|
168
|
-
crossedOut: boolean;
|
|
169
|
-
}>,
|
|
170
|
-
): void {
|
|
171
|
-
const {multipleSelect, choices, onChange} = props;
|
|
172
|
-
|
|
173
|
-
// Get the baseline `checked` values. If we're checking a new answer
|
|
174
|
-
// and multiple-select is not on, we should clear all choices to be
|
|
175
|
-
// unchecked. Otherwise, we should copy the old checked values.
|
|
176
|
-
let newCheckedList;
|
|
177
|
-
if (newValues.checked && !multipleSelect) {
|
|
178
|
-
newCheckedList = choices.map((_) => false);
|
|
179
|
-
} else {
|
|
180
|
-
newCheckedList = choices.map((c) => c.checked);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// Get the baseline `crossedOut` values.
|
|
184
|
-
const newCrossedOutList = choices.map((c) => c.crossedOut);
|
|
185
|
-
|
|
186
|
-
// Update this choice's `checked` and `crossedOut` values.
|
|
187
|
-
newCheckedList[choiceIndex] = newValues.checked;
|
|
188
|
-
newCrossedOutList[choiceIndex] = newValues.crossedOut;
|
|
189
|
-
|
|
190
|
-
onChange({
|
|
191
|
-
checked: newCheckedList,
|
|
192
|
-
crossedOut: newCrossedOutList,
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// register a callback with the parent that allows
|
|
197
|
-
// the parent to focus an individual choice
|
|
198
|
-
registerFocusFunction?.((choiceIndex: number | null | undefined) => {
|
|
199
|
-
const ref = choiceRefs.current[choiceIndex || 0];
|
|
200
|
-
// note(matthew): we know this is only getting passed
|
|
201
|
-
// to a WB Clickable button, so we force it to be of
|
|
202
|
-
// type HTMLButtonElement
|
|
203
|
-
// @ts-expect-error - TS2339 - Property 'current' does not exist on type 'never'.
|
|
204
|
-
const anyNode = ReactDOM.findDOMNode(ref.current) as any;
|
|
205
|
-
const buttonNode = anyNode as HTMLButtonElement | null | undefined;
|
|
206
|
-
|
|
207
|
-
if (buttonNode) {
|
|
208
|
-
buttonNode.focus();
|
|
209
|
-
} else {
|
|
210
|
-
return false;
|
|
211
|
-
}
|
|
212
|
-
return true;
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
// some commonly used shorthands
|
|
216
|
-
const reviewMode = !!reviewModeRubric;
|
|
217
|
-
const isMobile = apiOptions.isMobile;
|
|
218
|
-
|
|
219
|
-
const firstChoiceHighlighted = choices[0].highlighted;
|
|
220
|
-
const lastChoiceHighlighted = choices[choices.length - 1].highlighted;
|
|
221
|
-
|
|
222
|
-
const className: ReadonlyArray<string> = classNames(
|
|
223
|
-
"perseus-widget-radio",
|
|
224
|
-
!editMode && "perseus-rendered-radio",
|
|
225
|
-
css(
|
|
226
|
-
styles.radio,
|
|
227
|
-
styles.responsiveRadioContainer,
|
|
228
|
-
firstChoiceHighlighted &&
|
|
229
|
-
isMobile &&
|
|
230
|
-
styles.radioContainerFirstHighlighted,
|
|
231
|
-
lastChoiceHighlighted &&
|
|
232
|
-
isMobile &&
|
|
233
|
-
styles.radioContainerLastHighlighted,
|
|
234
|
-
),
|
|
235
|
-
);
|
|
236
|
-
|
|
237
|
-
const instructionsClassName: ReadonlyArray<string> = classNames(
|
|
238
|
-
"instructions",
|
|
239
|
-
css(styles.instructions, isMobile && styles.instructionsMobile),
|
|
240
|
-
);
|
|
241
|
-
const instructions = getInstructionsText(
|
|
242
|
-
multipleSelect,
|
|
243
|
-
countChoices,
|
|
244
|
-
numCorrect,
|
|
245
|
-
);
|
|
246
|
-
|
|
247
|
-
const responsiveClassName = css(styles.responsiveFieldset);
|
|
248
|
-
const fieldset = (
|
|
249
|
-
<fieldset
|
|
250
|
-
className={`perseus-widget-radio-fieldset ${responsiveClassName}`}
|
|
251
|
-
>
|
|
252
|
-
<legend className="perseus-sr-only">{instructions}</legend>
|
|
253
|
-
{/* @ts-expect-error - TS2322 - Type 'readonly string[]' is not assignable to type 'string'. */}
|
|
254
|
-
<div className={instructionsClassName} aria-hidden="true">
|
|
255
|
-
{instructions}
|
|
256
|
-
</div>
|
|
257
|
-
{/* @ts-expect-error - TS2322 - Type 'readonly string[]' is not assignable to type 'string'. */}
|
|
258
|
-
<ul className={className} style={{listStyle: "none"}}>
|
|
259
|
-
{choices.map((choice, i) => {
|
|
260
|
-
let Element = Choice;
|
|
261
|
-
const ref = React.createRef<any>();
|
|
262
|
-
// @ts-expect-error - TS2322 - Type 'RefObject<unknown>' is not assignable to type 'never'.
|
|
263
|
-
choiceRefs.current[i] = ref;
|
|
264
|
-
const elementProps = {
|
|
265
|
-
apiOptions: apiOptions,
|
|
266
|
-
multipleSelect: multipleSelect,
|
|
267
|
-
checked: choice.checked,
|
|
268
|
-
crossedOut: choice.crossedOut,
|
|
269
|
-
previouslyAnswered: choice.previouslyAnswered,
|
|
270
|
-
reviewMode,
|
|
271
|
-
correct: choice.correct,
|
|
272
|
-
rationale: choice.rationale,
|
|
273
|
-
content: choice.content,
|
|
274
|
-
disabled: apiOptions.readOnly || choice.disabled,
|
|
275
|
-
showCorrectness: reviewMode || !!choice.showCorrectness,
|
|
276
|
-
showRationale:
|
|
277
|
-
choice.hasRationale &&
|
|
278
|
-
(reviewMode || choice.showRationale),
|
|
279
|
-
pos: i,
|
|
280
|
-
onChange: (newValues) => {
|
|
281
|
-
// editMode selection is handled in clickHandler
|
|
282
|
-
if (editMode) {
|
|
283
|
-
return;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
updateChoice(i, newValues);
|
|
287
|
-
},
|
|
288
|
-
} as const;
|
|
289
|
-
|
|
290
|
-
if (choice.isNoneOfTheAbove) {
|
|
291
|
-
Element = ChoiceNoneAbove;
|
|
292
|
-
_.extend(elementProps, {
|
|
293
|
-
showContent: choice.revealNoneOfTheAbove,
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
const nextChoice = choices[i + 1];
|
|
298
|
-
const nextChoiceHighlighted =
|
|
299
|
-
!!nextChoice && nextChoice.highlighted;
|
|
300
|
-
|
|
301
|
-
const aphroditeClassName = (checked: boolean) => {
|
|
302
|
-
// Whether or not to show correctness borders
|
|
303
|
-
// for this choice and the next choice.
|
|
304
|
-
return css(
|
|
305
|
-
sharedStyles.aboveScratchpad,
|
|
306
|
-
styles.item,
|
|
307
|
-
styles.responsiveItem,
|
|
308
|
-
checked && styles.selectedItem,
|
|
309
|
-
checked &&
|
|
310
|
-
choice.highlighted &&
|
|
311
|
-
styles.aboveBackdrop,
|
|
312
|
-
checked &&
|
|
313
|
-
choice.highlighted &&
|
|
314
|
-
apiOptions.isMobile &&
|
|
315
|
-
styles.aboveBackdropMobile,
|
|
316
|
-
nextChoiceHighlighted &&
|
|
317
|
-
apiOptions.isMobile &&
|
|
318
|
-
styles.nextHighlighted,
|
|
319
|
-
);
|
|
320
|
-
};
|
|
321
|
-
|
|
322
|
-
// HACK(abdulrahman): Preloads the selection-state
|
|
323
|
-
// css because of a bug that causes iOS to lag
|
|
324
|
-
// when selecting the button for the first time.
|
|
325
|
-
aphroditeClassName(true);
|
|
326
|
-
|
|
327
|
-
let correctnessClass;
|
|
328
|
-
// reviewMode is only true if there's a rubric
|
|
329
|
-
// but TypeScript doesn't understand that
|
|
330
|
-
if (reviewMode && reviewModeRubric) {
|
|
331
|
-
correctnessClass = reviewModeRubric.choices[i].correct
|
|
332
|
-
? ApiClassNames.CORRECT
|
|
333
|
-
: ApiClassNames.INCORRECT;
|
|
334
|
-
}
|
|
335
|
-
const className: ReadonlyArray<string> = classNames(
|
|
336
|
-
aphroditeClassName(choice.checked),
|
|
337
|
-
// TODO(aria): Make test case for these API
|
|
338
|
-
// classNames
|
|
339
|
-
ApiClassNames.RADIO.OPTION,
|
|
340
|
-
choice.checked && ApiClassNames.RADIO.SELECTED,
|
|
341
|
-
correctnessClass,
|
|
342
|
-
);
|
|
343
|
-
|
|
344
|
-
// In edit mode, the Choice renders a Div in order to
|
|
345
|
-
// allow for the contentEditable area to be selected
|
|
346
|
-
// (label forces any clicks inside to select the input
|
|
347
|
-
// element) We have to add some extra behavior to make
|
|
348
|
-
// sure that we can still check the choice.
|
|
349
|
-
let listElem = null;
|
|
350
|
-
let clickHandler = null;
|
|
351
|
-
if (editMode) {
|
|
352
|
-
// @ts-expect-error - TS2322 - Type '(e: any) => void' is not assignable to type 'null'.
|
|
353
|
-
clickHandler = (e: any) => {
|
|
354
|
-
// Traverse the parent nodes of the clicked
|
|
355
|
-
// element.
|
|
356
|
-
let elem = e.target;
|
|
357
|
-
while (elem && elem !== listElem) {
|
|
358
|
-
// If the clicked element is inside of the
|
|
359
|
-
// radio icon, then we want to trigger the
|
|
360
|
-
// check by flipping the choice of the icon.
|
|
361
|
-
if (elem.getAttribute("data-is-radio-icon")) {
|
|
362
|
-
updateChoice(i, {
|
|
363
|
-
checked: !choice.checked,
|
|
364
|
-
crossedOut: choice.crossedOut,
|
|
365
|
-
});
|
|
366
|
-
return;
|
|
367
|
-
}
|
|
368
|
-
elem = elem.parentNode;
|
|
369
|
-
}
|
|
370
|
-
};
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
// TODO(mattdr): Index isn't a *good* choice of key
|
|
374
|
-
// here; is there a better one? Can we use choice
|
|
375
|
-
// content somehow? Would changing our choice of key
|
|
376
|
-
// somehow break something happening inside a choice's
|
|
377
|
-
// child Renderers, by changing when we mount/unmount?
|
|
378
|
-
return (
|
|
379
|
-
<li
|
|
380
|
-
key={i}
|
|
381
|
-
// @ts-expect-error - TS2322 - Type 'HTMLLIElement | null' is not assignable to type 'null'.
|
|
382
|
-
ref={(e) => (listElem = e)}
|
|
383
|
-
// @ts-expect-error - TS2322 - Type 'readonly string[]' is not assignable to type 'string'.
|
|
384
|
-
className={className}
|
|
385
|
-
// @ts-expect-error - TS2322 - Type 'null' is not assignable to type 'MouseEventHandler<HTMLLIElement> | undefined'.
|
|
386
|
-
onClick={clickHandler}
|
|
387
|
-
// @ts-expect-error - TS2322 - Type '((e: TouchEvent) => void) | null' is not assignable to type 'TouchEventHandler<HTMLLIElement> | undefined'.
|
|
388
|
-
onTouchStart={
|
|
389
|
-
!labelWrap ? null : captureScratchpadTouchStart
|
|
390
|
-
}
|
|
391
|
-
>
|
|
392
|
-
<Element {...elementProps} ref={ref} />
|
|
393
|
-
</li>
|
|
394
|
-
);
|
|
395
|
-
})}
|
|
396
|
-
</ul>
|
|
397
|
-
</fieldset>
|
|
398
|
-
);
|
|
399
|
-
|
|
400
|
-
// Allow for horizontal scrolling if content is too wide, which may be
|
|
401
|
-
// an issue especially on phones.
|
|
402
|
-
return <div className={css(styles.responsiveContainer)}>{fieldset}</div>;
|
|
403
|
-
};
|
|
404
|
-
|
|
405
|
-
BaseRadio.defaultProps = {
|
|
406
|
-
editMode: false,
|
|
407
|
-
multipleSelect: false,
|
|
408
|
-
};
|
|
409
|
-
|
|
410
|
-
const styles: StyleDeclaration = StyleSheet.create({
|
|
411
|
-
instructions: {
|
|
412
|
-
display: "block",
|
|
413
|
-
color: styleConstants.gray17,
|
|
414
|
-
fontSize: 14,
|
|
415
|
-
lineHeight: 1.25,
|
|
416
|
-
fontFamily: "inherit",
|
|
417
|
-
fontStyle: "normal",
|
|
418
|
-
fontWeight: "bold",
|
|
419
|
-
marginBottom: 16,
|
|
420
|
-
},
|
|
421
|
-
|
|
422
|
-
instructionsMobile: {
|
|
423
|
-
fontSize: 18,
|
|
424
|
-
[mediaQueries.smOrSmaller]: {
|
|
425
|
-
fontSize: 16,
|
|
426
|
-
},
|
|
427
|
-
// TODO(emily): We want this to match choice text, which turns
|
|
428
|
-
// to 20px at min-width 1200px, but this media query is
|
|
429
|
-
// min-width 1280px because our media queries don't exactly
|
|
430
|
-
// match pure. Make those match up.
|
|
431
|
-
[mediaQueries.xl]: {
|
|
432
|
-
fontSize: 20,
|
|
433
|
-
},
|
|
434
|
-
},
|
|
435
|
-
|
|
436
|
-
radio: {
|
|
437
|
-
padding: 0,
|
|
438
|
-
},
|
|
439
|
-
|
|
440
|
-
responsiveRadioContainer: {
|
|
441
|
-
borderBottom: `1px solid ${styleConstants.radioBorderColor}`,
|
|
442
|
-
borderTop: `1px solid ${styleConstants.radioBorderColor}`,
|
|
443
|
-
width: "auto",
|
|
444
|
-
[mediaQueries.smOrSmaller]: {
|
|
445
|
-
marginLeft: styleConstants.negativePhoneMargin,
|
|
446
|
-
marginRight: styleConstants.negativePhoneMargin,
|
|
447
|
-
},
|
|
448
|
-
},
|
|
449
|
-
|
|
450
|
-
radioContainerFirstHighlighted: {
|
|
451
|
-
borderTop: `1px solid rgba(0, 0, 0, 0)`,
|
|
452
|
-
},
|
|
453
|
-
|
|
454
|
-
radioContainerLastHighlighted: {
|
|
455
|
-
borderBottom: `1px solid rgba(0, 0, 0, 0)`,
|
|
456
|
-
},
|
|
457
|
-
|
|
458
|
-
item: {
|
|
459
|
-
marginLeft: 20,
|
|
460
|
-
},
|
|
461
|
-
|
|
462
|
-
responsiveItem: {
|
|
463
|
-
marginLeft: 0,
|
|
464
|
-
padding: 0,
|
|
465
|
-
|
|
466
|
-
":not(:last-child)": {
|
|
467
|
-
borderBottom: `1px solid ${styleConstants.radioBorderColor}`,
|
|
468
|
-
},
|
|
469
|
-
},
|
|
470
|
-
selectedItem: {
|
|
471
|
-
background: "white",
|
|
472
|
-
},
|
|
473
|
-
|
|
474
|
-
aboveBackdrop: {
|
|
475
|
-
position: "relative",
|
|
476
|
-
// HACK(emily): We want selected choices to show up above our
|
|
477
|
-
// exercise backdrop, but below the exercise footer and
|
|
478
|
-
// "feedback popover" that shows up. This z-index is carefully
|
|
479
|
-
// coordinated between here and webapp. :(
|
|
480
|
-
zIndex: 1062,
|
|
481
|
-
},
|
|
482
|
-
|
|
483
|
-
aboveBackdropMobile: {
|
|
484
|
-
boxShadow:
|
|
485
|
-
"0 0 4px 0 rgba(0, 0, 0, 0.2)," + "0 0 2px 0 rgba(0, 0, 0, 0.1)",
|
|
486
|
-
|
|
487
|
-
":not(:last-child)": {
|
|
488
|
-
borderBottom: `1px solid rgba(0, 0, 0, 0)`,
|
|
489
|
-
},
|
|
490
|
-
},
|
|
491
|
-
|
|
492
|
-
nextHighlighted: {
|
|
493
|
-
":not(:last-child)": {
|
|
494
|
-
borderBottom: `1px solid rgba(0, 0, 0, 0)`,
|
|
495
|
-
},
|
|
496
|
-
},
|
|
497
|
-
|
|
498
|
-
responsiveContainer: {
|
|
499
|
-
overflow: "auto",
|
|
500
|
-
marginLeft: styleConstants.negativePhoneMargin,
|
|
501
|
-
paddingLeft: styleConstants.phoneMargin,
|
|
502
|
-
// paddingRight is handled by responsiveFieldset
|
|
503
|
-
},
|
|
504
|
-
|
|
505
|
-
responsiveFieldset: {
|
|
506
|
-
paddingRight: styleConstants.phoneMargin,
|
|
507
|
-
minWidth: "auto",
|
|
508
|
-
},
|
|
509
|
-
});
|
|
510
|
-
|
|
511
|
-
export default BaseRadio;
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import * as i18n from "@khanacademy/wonder-blocks-i18n";
|
|
2
|
-
|
|
3
|
-
function getA11yText(
|
|
4
|
-
letter: string,
|
|
5
|
-
checked: boolean,
|
|
6
|
-
correct: boolean,
|
|
7
|
-
crossedOut: boolean,
|
|
8
|
-
showCorrectness: boolean,
|
|
9
|
-
): string {
|
|
10
|
-
// There are two pieces of metadata we want to add to each a11yText:
|
|
11
|
-
// whether the answer was checked/crossed-out/neither, and whether the
|
|
12
|
-
// answer is correct/incorrect/not-yet-revealed.
|
|
13
|
-
//
|
|
14
|
-
// Translation is tricky for cross-product situations like this, so
|
|
15
|
-
// we've just enumerated all 9 possibilities as separate strings.
|
|
16
|
-
if (showCorrectness && correct) {
|
|
17
|
-
if (checked) {
|
|
18
|
-
return i18n._("(Choice %(letter)s, Checked, Correct)", {
|
|
19
|
-
letter,
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
if (crossedOut) {
|
|
23
|
-
return i18n._("(Choice %(letter)s, Crossed out, Correct)", {
|
|
24
|
-
letter,
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
return i18n._("(Choice %(letter)s, Correct)", {
|
|
28
|
-
letter,
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
if (showCorrectness && !correct) {
|
|
32
|
-
if (checked) {
|
|
33
|
-
return i18n._("(Choice %(letter)s, Checked, Incorrect)", {
|
|
34
|
-
letter,
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
if (crossedOut) {
|
|
38
|
-
return i18n._("(Choice %(letter)s, Crossed out, Incorrect)", {
|
|
39
|
-
letter,
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
return i18n._("(Choice %(letter)s, Incorrect)", {
|
|
43
|
-
letter,
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
if (checked) {
|
|
47
|
-
return i18n._("(Choice %(letter)s, Checked)", {
|
|
48
|
-
letter,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
if (crossedOut) {
|
|
52
|
-
return i18n._("(Choice %(letter)s, Crossed out)", {
|
|
53
|
-
letter,
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
return i18n._("(Choice %(letter)s)", {
|
|
57
|
-
letter,
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export default getA11yText;
|