@khanacademy/perseus 19.1.5 → 19.1.7
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/graph.d.ts +0 -1
- package/dist/components/graphie.d.ts +0 -1
- package/dist/es/index.js +319 -212
- package/dist/es/index.js.map +1 -1
- package/dist/index.js +338 -222
- package/dist/index.js.map +1 -1
- package/dist/interactive2/movable-point.d.ts +195 -1
- package/dist/interactive2/movable.d.ts +1 -1
- package/dist/interactive2/types.d.ts +4 -2
- package/dist/interactive2.d.ts +2 -1
- package/dist/server-item-renderer.d.ts +2 -2
- package/dist/util/graphie.d.ts +12 -2
- package/dist/widgets/expression.d.ts +6 -6
- package/package.json +11 -8
- package/.babelrc.js +0 -8
- package/.eslintrc.js +0 -12
- package/CHANGELOG.md +0 -1432
- 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 -400
- 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 -55
- package/src/interactive2/__tests__/movable-point.test.ts +0 -144
- 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 -224
- 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.test.ts +0 -249
- package/src/interactive2/movable.ts +0 -437
- package/src/interactive2/objective_.ts +0 -79
- package/src/interactive2/types.ts +0 -17
- 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 -1576
- package/src/util/interactive.ts +0 -4174
- 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,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This is a wrapper component for the visibility-observer.js utility which
|
|
3
|
-
* abstracts the native or polyfilled IntersectionObserver utility. The
|
|
4
|
-
* primary purpose of this comonent is to tell you whether the children of
|
|
5
|
-
* the component are visibile within a scrollable ancestor. It will notify
|
|
6
|
-
* you via an onChange event when the visibility changes, and whether the
|
|
7
|
-
* children are below or above the scroll.
|
|
8
|
-
*/
|
|
9
|
-
import * as React from "react";
|
|
10
|
-
import ReactDOM from "react-dom";
|
|
11
|
-
|
|
12
|
-
import {createVisibilityObserver} from "./create-visibility-observer";
|
|
13
|
-
import {getScrollParent} from "./get-scroll-parent";
|
|
14
|
-
|
|
15
|
-
import type {VisibilityObserver as IVisibilityObserver} from "./create-visibility-observer";
|
|
16
|
-
|
|
17
|
-
export type ScrollVisibility =
|
|
18
|
-
| "hidden-above"
|
|
19
|
-
| "hidden-below"
|
|
20
|
-
| "visible"
|
|
21
|
-
| "unknown";
|
|
22
|
-
|
|
23
|
-
type Props = {
|
|
24
|
-
children: React.ReactNode;
|
|
25
|
-
rootMargin?: string;
|
|
26
|
-
|
|
27
|
-
// In most cases, the scroll parent we want to compare against is the body. Sometimes,
|
|
28
|
-
// there will be a scroll parent which scrolls independant of the body. In that case,
|
|
29
|
-
// the math is different and we need to be told to find the scroll parent.
|
|
30
|
-
scrollParentIsNotBody?: boolean;
|
|
31
|
-
|
|
32
|
-
onChange: (visibility: ScrollVisibility) => void;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
function findPositionInScrollContainer(
|
|
36
|
-
childNode: HTMLElement,
|
|
37
|
-
bounds: DOMRectReadOnly,
|
|
38
|
-
scrollParentIsNotBody: boolean,
|
|
39
|
-
): ScrollVisibility {
|
|
40
|
-
try {
|
|
41
|
-
const scrollParent = getScrollParent(childNode);
|
|
42
|
-
if (!scrollParent) {
|
|
43
|
-
return "unknown";
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const parentRect = scrollParent.getBoundingClientRect();
|
|
47
|
-
const childRect = childNode.getBoundingClientRect();
|
|
48
|
-
|
|
49
|
-
const isAbove =
|
|
50
|
-
!scrollParentIsNotBody || scrollParent === document.body
|
|
51
|
-
? childRect.bottom < bounds.top
|
|
52
|
-
: childRect.bottom < parentRect.top;
|
|
53
|
-
|
|
54
|
-
return isAbove ? "hidden-above" : "hidden-below";
|
|
55
|
-
} catch (e) {
|
|
56
|
-
return "unknown";
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
class VisibilityObserver extends React.Component<Props> {
|
|
61
|
-
// @ts-expect-error - TS2564 - Property '_observer' has no initializer and is not definitely assigned in the constructor.
|
|
62
|
-
_observer: IVisibilityObserver;
|
|
63
|
-
// @ts-expect-error - TS2564 - Property '_node' has no initializer and is not definitely assigned in the constructor.
|
|
64
|
-
_node: HTMLElement;
|
|
65
|
-
|
|
66
|
-
static defaultProps: {onChange: () => void} = {
|
|
67
|
-
onChange: () => {},
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
componentDidMount() {
|
|
71
|
-
this._node = ReactDOM.findDOMNode(this) as unknown as HTMLElement;
|
|
72
|
-
|
|
73
|
-
this.registerVisibilityObserver();
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
componentWillUnmount() {
|
|
77
|
-
this.unregisterVisibilityObserver();
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
handleVisibilityChange: (
|
|
81
|
-
isVisible: boolean,
|
|
82
|
-
rootBounds: DOMRectReadOnly,
|
|
83
|
-
) => void = (isVisible: boolean, rootBounds: DOMRectReadOnly) => {
|
|
84
|
-
const {scrollParentIsNotBody, onChange} = this.props;
|
|
85
|
-
|
|
86
|
-
if (isVisible) {
|
|
87
|
-
onChange("visible");
|
|
88
|
-
} else {
|
|
89
|
-
const visibility = findPositionInScrollContainer(
|
|
90
|
-
this._node,
|
|
91
|
-
rootBounds,
|
|
92
|
-
!!scrollParentIsNotBody,
|
|
93
|
-
);
|
|
94
|
-
onChange(visibility);
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
registerVisibilityObserver() {
|
|
99
|
-
const {rootMargin} = this.props;
|
|
100
|
-
if (!this._node) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
this._observer = createVisibilityObserver(
|
|
105
|
-
null,
|
|
106
|
-
this.handleVisibilityChange,
|
|
107
|
-
rootMargin,
|
|
108
|
-
);
|
|
109
|
-
|
|
110
|
-
this._observer.setTargetElement(this._node);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
unregisterVisibilityObserver() {
|
|
114
|
-
if (this._observer) {
|
|
115
|
-
this._observer.disconnect();
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
render(): React.ReactNode {
|
|
120
|
-
return this.props.children;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export default VisibilityObserver;
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ZoomableTeX is a wrapper around TeX to be used on mobile. Without wrapping
|
|
3
|
-
* TeX we run into issues of measuring at the incorrect time resulting in bad
|
|
4
|
-
* measurements.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import * as React from "react";
|
|
8
|
-
|
|
9
|
-
import AssetContext from "../asset-context";
|
|
10
|
-
|
|
11
|
-
import TeX from "./tex";
|
|
12
|
-
import Zoomable from "./zoomable";
|
|
13
|
-
|
|
14
|
-
type Props = {
|
|
15
|
-
children: string;
|
|
16
|
-
};
|
|
17
|
-
type State = {
|
|
18
|
-
isRendered: boolean;
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const computeMathBounds = (
|
|
22
|
-
parentNode: HTMLElement,
|
|
23
|
-
parentBounds: {width: number; height: number},
|
|
24
|
-
) => {
|
|
25
|
-
const textElement =
|
|
26
|
-
parentNode.querySelector(".katex-html") ||
|
|
27
|
-
parentNode.querySelector(".MathJax");
|
|
28
|
-
const textBounds = {
|
|
29
|
-
// @ts-expect-error - TS2531 - Object is possibly 'null'. | TS2339 - Property 'offsetWidth' does not exist on type 'Element'.
|
|
30
|
-
width: textElement.offsetWidth,
|
|
31
|
-
// @ts-expect-error - TS2531 - Object is possibly 'null'. | TS2339 - Property 'offsetHeight' does not exist on type 'Element'.
|
|
32
|
-
height: textElement.offsetHeight,
|
|
33
|
-
} as const;
|
|
34
|
-
|
|
35
|
-
// HACK(benkomalo): when measuring math content, note that
|
|
36
|
-
// sometimes it actually peeks outside of the
|
|
37
|
-
// container in some cases. Just be conservative and use
|
|
38
|
-
// the maximum value of the text and the parent. :(
|
|
39
|
-
return {
|
|
40
|
-
width: Math.max(parentBounds.width, textBounds.width),
|
|
41
|
-
height: Math.max(parentBounds.height, textBounds.height),
|
|
42
|
-
};
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export default class ZoomableTeX extends React.Component<Props, State> {
|
|
46
|
-
constructor() {
|
|
47
|
-
// @ts-expect-error - TS2554 - Expected 1-2 arguments, but got 0.
|
|
48
|
-
super();
|
|
49
|
-
|
|
50
|
-
this.state = {isRendered: false};
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
handleRender: () => void = () => {
|
|
54
|
-
this.setState({isRendered: true});
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
render(): React.ReactNode {
|
|
58
|
-
return (
|
|
59
|
-
<Zoomable
|
|
60
|
-
readyToMeasure={this.state.isRendered}
|
|
61
|
-
computeChildBounds={computeMathBounds}
|
|
62
|
-
animateHeight={false}
|
|
63
|
-
disableEntranceAnimation={true}
|
|
64
|
-
>
|
|
65
|
-
<AssetContext.Consumer>
|
|
66
|
-
{({setAssetStatus}) => (
|
|
67
|
-
<TeX
|
|
68
|
-
onRender={this.handleRender}
|
|
69
|
-
setAssetStatus={setAssetStatus}
|
|
70
|
-
>
|
|
71
|
-
{this.props.children}
|
|
72
|
-
</TeX>
|
|
73
|
-
)}
|
|
74
|
-
</AssetContext.Consumer>
|
|
75
|
-
</Zoomable>
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @khanacademy/ts-no-error-suppressions */
|
|
2
|
-
/**
|
|
3
|
-
* Zooms child to fit with tap-to-zoom behavior.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import * as React from "react";
|
|
7
|
-
import ReactDOM from "react-dom";
|
|
8
|
-
|
|
9
|
-
type Bounds = {
|
|
10
|
-
width: number;
|
|
11
|
-
height: number;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
type Props = {
|
|
15
|
-
children: React.ReactNode;
|
|
16
|
-
animateHeight: boolean;
|
|
17
|
-
|
|
18
|
-
disableEntranceAnimation: boolean;
|
|
19
|
-
/**
|
|
20
|
-
* Optional function that allows customizations in zooming.
|
|
21
|
-
*
|
|
22
|
-
* Defaults to just using the bounding client rect of the first DOM
|
|
23
|
-
* element of this component.
|
|
24
|
-
*/
|
|
25
|
-
computeChildBounds: (
|
|
26
|
-
parentNode: HTMLElement,
|
|
27
|
-
parentBounds: Bounds,
|
|
28
|
-
) => Bounds;
|
|
29
|
-
/**
|
|
30
|
-
* Optional boolean specifying whether the component is ready to measure
|
|
31
|
-
* or not. Defaults to true for synchronous components like tables.
|
|
32
|
-
*/
|
|
33
|
-
readyToMeasure: boolean;
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
type DefaultProps = {
|
|
37
|
-
animateHeight: Props["animateHeight"];
|
|
38
|
-
computeChildBounds: Props["computeChildBounds"];
|
|
39
|
-
readyToMeasure: Props["readyToMeasure"];
|
|
40
|
-
disableEntranceAnimation: Props["disableEntranceAnimation"];
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
type State = {
|
|
44
|
-
visible: boolean;
|
|
45
|
-
marginBottomPx: number;
|
|
46
|
-
compactHeight?: number | null | undefined;
|
|
47
|
-
expandedHeight?: number | null | undefined;
|
|
48
|
-
scale?: number | null | undefined;
|
|
49
|
-
zoomed: boolean;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
class Zoomable extends React.Component<Props, State> {
|
|
53
|
-
// @ts-expect-error - TS2564 - Property '_isMounted' has no initializer and is not definitely assigned in the constructor.
|
|
54
|
-
_isMounted: boolean;
|
|
55
|
-
// @ts-expect-error - TS2564 - Property '_observer' has no initializer and is not definitely assigned in the constructor.
|
|
56
|
-
_observer: MutationObserver;
|
|
57
|
-
// @ts-expect-error - TS2564 - Property '_measuringInitialized' has no initializer and is not definitely assigned in the constructor.
|
|
58
|
-
_measuringInitialized: boolean;
|
|
59
|
-
_originalWidth: number | null | undefined;
|
|
60
|
-
// @ts-expect-error - TS2564 - Property '_node' has no initializer and is not definitely assigned in the constructor.
|
|
61
|
-
_node: HTMLElement;
|
|
62
|
-
|
|
63
|
-
static defaultProps: DefaultProps = {
|
|
64
|
-
animateHeight: false,
|
|
65
|
-
readyToMeasure: true,
|
|
66
|
-
disableEntranceAnimation: false,
|
|
67
|
-
computeChildBounds: (parentNode) => {
|
|
68
|
-
const firstChild = parentNode.firstElementChild;
|
|
69
|
-
|
|
70
|
-
return {
|
|
71
|
-
// @ts-expect-error - TS2531 - Object is possibly 'null'. | TS2339 - Property 'offsetWidth' does not exist on type 'Element'.
|
|
72
|
-
width: firstChild.offsetWidth,
|
|
73
|
-
// @ts-expect-error - TS2531 - Object is possibly 'null'. | TS2339 - Property 'offsetHeight' does not exist on type 'Element'.
|
|
74
|
-
height: firstChild.offsetHeight,
|
|
75
|
-
};
|
|
76
|
-
},
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
state: State = {
|
|
80
|
-
visible: false,
|
|
81
|
-
marginBottomPx: 0,
|
|
82
|
-
zoomed: true,
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
componentDidMount() {
|
|
86
|
-
this._isMounted = true;
|
|
87
|
-
this.maybeInitializeMeasuring();
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
componentDidUpdate() {
|
|
91
|
-
this.maybeInitializeMeasuring();
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
componentWillUnmount() {
|
|
95
|
-
window.removeEventListener("resize", this.reset);
|
|
96
|
-
if (this._observer) {
|
|
97
|
-
this._observer.disconnect();
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
this._isMounted = false;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
reset: () => void = (): void => {
|
|
104
|
-
if (!this._isMounted) {
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
if (!this.state.visible) {
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
this._originalWidth = null;
|
|
111
|
-
this.setState(
|
|
112
|
-
{
|
|
113
|
-
visible: false,
|
|
114
|
-
compactHeight: null,
|
|
115
|
-
expandedHeight: null,
|
|
116
|
-
zoomed: true,
|
|
117
|
-
},
|
|
118
|
-
() => {
|
|
119
|
-
this.measureAndScaleChildToFit(false);
|
|
120
|
-
},
|
|
121
|
-
);
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Calls measureAndScaleChildToFit and sets up a MutationObserver
|
|
126
|
-
* to call measureAndScaleChildToFit if Zoomable's children change.
|
|
127
|
-
*
|
|
128
|
-
* If the readyToMeasure prop isn't true or if measuring has already
|
|
129
|
-
* been initialized this method does nothing.
|
|
130
|
-
*/
|
|
131
|
-
maybeInitializeMeasuring() {
|
|
132
|
-
const shouldInitialize =
|
|
133
|
-
this.props.readyToMeasure && !this._measuringInitialized;
|
|
134
|
-
|
|
135
|
-
if (this._isMounted && shouldInitialize) {
|
|
136
|
-
this._measuringInitialized = true;
|
|
137
|
-
// @ts-expect-error - TS2322 - Type 'Element | Text | null' is not assignable to type 'HTMLElement'.
|
|
138
|
-
this._node = ReactDOM.findDOMNode(this);
|
|
139
|
-
|
|
140
|
-
// We call measureAndScaleChildToFit asynchronously so that the browser
|
|
141
|
-
// can apply CSS styles so that we get an accurate measurement.
|
|
142
|
-
// TODO(jeff, CP-3128): Use Wonder Blocks Timing API
|
|
143
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
144
|
-
setTimeout(() => this.measureAndScaleChildToFit(false), 0);
|
|
145
|
-
|
|
146
|
-
if (window.MutationObserver) {
|
|
147
|
-
this._observer = new MutationObserver(
|
|
148
|
-
(mutations: Array<MutationRecord>) => {
|
|
149
|
-
if (this._isMounted) {
|
|
150
|
-
for (const mutation of mutations) {
|
|
151
|
-
if (mutation.target !== this._node) {
|
|
152
|
-
// Only act on mutations of children
|
|
153
|
-
this.measureAndScaleChildToFit(
|
|
154
|
-
this.state.zoomed,
|
|
155
|
-
);
|
|
156
|
-
break;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
},
|
|
161
|
-
);
|
|
162
|
-
|
|
163
|
-
this._observer.observe(this._node, {
|
|
164
|
-
childList: true,
|
|
165
|
-
subtree: true,
|
|
166
|
-
attributes: true,
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
window.addEventListener("resize", this.reset);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
stopPropagationIfZoomed: (e: React.TouchEvent) => void = (
|
|
174
|
-
e: React.TouchEvent,
|
|
175
|
-
) => {
|
|
176
|
-
if (!this.state.zoomed) {
|
|
177
|
-
// We only allow touch events (which trigger interactive elements)
|
|
178
|
-
// to be propagated to children if we are already zoomed.
|
|
179
|
-
e.stopPropagation();
|
|
180
|
-
}
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
// TODO(benkomalo): call this on viewport width changes?
|
|
184
|
-
// https://github.com/Khan/math-input/blob/master/src/components/math-keypad.js#L43
|
|
185
|
-
measureAndScaleChildToFit(zoomed: boolean) {
|
|
186
|
-
if (!this._isMounted) {
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
const parentBounds = {
|
|
190
|
-
width: this._node.offsetWidth,
|
|
191
|
-
height: this._node.offsetHeight,
|
|
192
|
-
} as const;
|
|
193
|
-
const childBounds = this.props.computeChildBounds(
|
|
194
|
-
this._node,
|
|
195
|
-
parentBounds,
|
|
196
|
-
);
|
|
197
|
-
|
|
198
|
-
// The +1 is a fudge factor to make sure any border on the
|
|
199
|
-
// content isn't clipped by the the container it's in.
|
|
200
|
-
const childWidth = childBounds.width + 1;
|
|
201
|
-
const childHeight = childBounds.height + 1;
|
|
202
|
-
|
|
203
|
-
if (childWidth > parentBounds.width) {
|
|
204
|
-
const scale = parentBounds.width / childWidth;
|
|
205
|
-
|
|
206
|
-
this.setState({
|
|
207
|
-
scale,
|
|
208
|
-
zoomed,
|
|
209
|
-
|
|
210
|
-
compactHeight: Math.ceil(scale * childHeight),
|
|
211
|
-
expandedHeight: childHeight,
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
// TODO(charlie): Do this as a callback to `setState`. Something is
|
|
215
|
-
// going wrong with that approach in initial testing.
|
|
216
|
-
// TODO(jeff, CP-3128): Use Wonder Blocks Timing API
|
|
217
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
218
|
-
setTimeout(() => {
|
|
219
|
-
// Only show it after the next paint, to allow for CSS
|
|
220
|
-
// transitions to fade it in.
|
|
221
|
-
if (this._isMounted) {
|
|
222
|
-
this.setState({
|
|
223
|
-
visible: true,
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
});
|
|
227
|
-
} else {
|
|
228
|
-
this.setState({
|
|
229
|
-
visible: true,
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
handleClickIfZoomed: (e: React.MouseEvent) => void = (
|
|
235
|
-
e: React.MouseEvent,
|
|
236
|
-
) => {
|
|
237
|
-
if (!this.state.zoomed) {
|
|
238
|
-
e.stopPropagation();
|
|
239
|
-
this.handleClick();
|
|
240
|
-
}
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
handleClick: () => void = () => {
|
|
244
|
-
this.setState({
|
|
245
|
-
zoomed: !this.state.zoomed,
|
|
246
|
-
});
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
render(): React.ReactNode {
|
|
250
|
-
const {visible, scale, compactHeight, expandedHeight, zoomed} =
|
|
251
|
-
this.state;
|
|
252
|
-
const {animateHeight, disableEntranceAnimation} = this.props;
|
|
253
|
-
|
|
254
|
-
const property = animateHeight
|
|
255
|
-
? "opacity transform height"
|
|
256
|
-
: "opacity transform";
|
|
257
|
-
|
|
258
|
-
// Since we're not using aphrodite, we have to prefix ourselves.
|
|
259
|
-
const transitionStyle = visible
|
|
260
|
-
? {
|
|
261
|
-
transitionProperty: property,
|
|
262
|
-
transitionDuration: "0.3s",
|
|
263
|
-
transitionTimingFunction: "ease-out",
|
|
264
|
-
}
|
|
265
|
-
: {};
|
|
266
|
-
|
|
267
|
-
// Do a fancy little slide as we fade the contents in the first time.
|
|
268
|
-
const shouldSlide = !disableEntranceAnimation && !visible;
|
|
269
|
-
const translateOffset = shouldSlide ? " translate(0, 8px)" : "";
|
|
270
|
-
const opacity = shouldSlide ? 0 : 1;
|
|
271
|
-
|
|
272
|
-
const scaleString = (scale ?? 1).toString();
|
|
273
|
-
const transform = zoomed
|
|
274
|
-
? `scale(1, 1) ${translateOffset}`
|
|
275
|
-
: `scale(${scaleString}, ${scaleString}) ${translateOffset}`;
|
|
276
|
-
|
|
277
|
-
const style = {
|
|
278
|
-
display: "block",
|
|
279
|
-
width: "100%",
|
|
280
|
-
height: zoomed ? expandedHeight : compactHeight,
|
|
281
|
-
transform: transform,
|
|
282
|
-
transformOrigin: "0 0",
|
|
283
|
-
opacity: opacity,
|
|
284
|
-
WebkitTapHighlightColor: "transparent",
|
|
285
|
-
...transitionStyle,
|
|
286
|
-
} as const;
|
|
287
|
-
|
|
288
|
-
return (
|
|
289
|
-
<span
|
|
290
|
-
onClick={this.handleClick}
|
|
291
|
-
onClickCapture={this.handleClickIfZoomed}
|
|
292
|
-
onTouchCancelCapture={this.stopPropagationIfZoomed}
|
|
293
|
-
onTouchEndCapture={this.stopPropagationIfZoomed}
|
|
294
|
-
onTouchStartCapture={this.stopPropagationIfZoomed}
|
|
295
|
-
// @ts-expect-error - TS2322 - Type '{ readonly transitionProperty: string; readonly transitionDuration: string; readonly transitionTimingFunction: string; readonly display: "block"; readonly width: "100%"; readonly height: number | ... 1 more ... | undefined; readonly transform: string; readonly transformOrigin: "0 0"; readonly opacity: 0 | 1; readonl...' is not assignable to type 'CSSProperties | undefined'.
|
|
296
|
-
style={style}
|
|
297
|
-
>
|
|
298
|
-
{this.props.children}
|
|
299
|
-
</span>
|
|
300
|
-
);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
export default Zoomable;
|
package/src/components.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export {default as ButtonGroup} from "./components/button-group";
|
|
2
|
-
export {default as Graph} from "./components/graph";
|
|
3
|
-
export {default as Graphie} from "./components/graphie";
|
|
4
|
-
export {default as HUD} from "./components/hud";
|
|
5
|
-
export {default as Icon} from "./components/icon";
|
|
6
|
-
export {default as InfoTip} from "./components/info-tip";
|
|
7
|
-
export {default as InlineIcon} from "./components/inline-icon";
|
|
8
|
-
export {default as MathInput} from "./components/math-input";
|
|
9
|
-
export {default as MultiButtonGroup} from "./components/multi-button-group";
|
|
10
|
-
export {default as NumberInput} from "./components/number-input";
|
|
11
|
-
export {default as PropCheckBox} from "./components/prop-check-box";
|
|
12
|
-
export {default as RangeInput} from "./components/range-input";
|
|
13
|
-
export {default as SvgImage} from "./components/svg-image";
|
|
14
|
-
export {default as TextInput} from "./components/text-input";
|
|
15
|
-
export {default as TextListEditor} from "./components/text-list-editor";
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A React context for ensuring there is one and only one definition showing at a time
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import * as React from "react";
|
|
6
|
-
|
|
7
|
-
type DefintionContext = {
|
|
8
|
-
activeDefinitionId: string | null | undefined;
|
|
9
|
-
setActiveDefinitionId: (arg1?: string | null | undefined) => void;
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
const defaultContext: DefintionContext = {
|
|
13
|
-
activeDefinitionId: null,
|
|
14
|
-
setActiveDefinitionId: () => {},
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
const DefinitionContext: React.Context<DefintionContext> =
|
|
18
|
-
React.createContext(defaultContext);
|
|
19
|
-
|
|
20
|
-
type ProviderState = {
|
|
21
|
-
activeDefinitionId: string | null | undefined;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export type ProviderProps = {
|
|
25
|
-
children: any;
|
|
26
|
-
};
|
|
27
|
-
export class DefinitionProvider extends React.Component<
|
|
28
|
-
ProviderProps,
|
|
29
|
-
ProviderState
|
|
30
|
-
> {
|
|
31
|
-
// Context state
|
|
32
|
-
state: ProviderState = {
|
|
33
|
-
activeDefinitionId: null,
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
// Method to update state
|
|
37
|
-
setActiveDefinitionId = (activeDefinitionId?: string | null): void => {
|
|
38
|
-
this.setState((prevState: ProviderState) => ({activeDefinitionId}));
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
render(): React.ReactNode {
|
|
42
|
-
const {children} = this.props;
|
|
43
|
-
const {activeDefinitionId} = this.state;
|
|
44
|
-
const {setActiveDefinitionId} = this;
|
|
45
|
-
|
|
46
|
-
return (
|
|
47
|
-
<DefinitionContext.Provider
|
|
48
|
-
value={{
|
|
49
|
-
activeDefinitionId,
|
|
50
|
-
setActiveDefinitionId,
|
|
51
|
-
}}
|
|
52
|
-
>
|
|
53
|
-
{children}
|
|
54
|
-
</DefinitionContext.Provider>
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export const DefinitionConsumer = DefinitionContext.Consumer;
|
package/src/dependencies.ts
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
|
|
3
|
-
import type {PerseusDependencies, PerseusDependenciesV2} from "./types";
|
|
4
|
-
|
|
5
|
-
let _dependencies: PerseusDependencies | null | undefined = null;
|
|
6
|
-
|
|
7
|
-
export const setDependencies = (dependencies: PerseusDependencies) => {
|
|
8
|
-
_dependencies = dependencies;
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export const getDependencies = (): PerseusDependencies => {
|
|
12
|
-
if (_dependencies) {
|
|
13
|
-
return _dependencies;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
throw new Error(
|
|
17
|
-
[
|
|
18
|
-
"Perseus has not been provided required dependencies.",
|
|
19
|
-
"setDependencies(dependencies) must be called first.",
|
|
20
|
-
"Make sure Perseus is being imported from javascript/perseus/perseus.js.",
|
|
21
|
-
].join("\n"),
|
|
22
|
-
);
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export type DependencyProps = Partial<
|
|
26
|
-
React.ContextType<typeof DependenciesContext>
|
|
27
|
-
>;
|
|
28
|
-
|
|
29
|
-
export const DependenciesContext = React.createContext<PerseusDependenciesV2>({
|
|
30
|
-
analytics: {onAnalyticsEvent: async () => {}},
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* useDependencies provides easy access to the current Perseus dependencies.
|
|
35
|
-
*/
|
|
36
|
-
export const useDependencies = (): PerseusDependenciesV2 => {
|
|
37
|
-
const deps = React.useContext(DependenciesContext);
|
|
38
|
-
|
|
39
|
-
return deps;
|
|
40
|
-
};
|
package/src/error-boundary.tsx
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
|
|
3
|
-
import {Errors, Log} from "./logging/log";
|
|
4
|
-
|
|
5
|
-
type Props = {
|
|
6
|
-
children: React.ReactNode;
|
|
7
|
-
metadata?: Record<string, string>;
|
|
8
|
-
|
|
9
|
-
// A callback that is called when the error boundary traps an error.
|
|
10
|
-
onError?: (error: Error, info: any) => void;
|
|
11
|
-
};
|
|
12
|
-
type State = {
|
|
13
|
-
error: string;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
class ErrorBoundary extends React.Component<Props, State> {
|
|
17
|
-
constructor(props: Props) {
|
|
18
|
-
super(props);
|
|
19
|
-
this.state = {error: ""};
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
componentDidCatch(error: Error, info: any) {
|
|
23
|
-
this.setState({error: error.toString()});
|
|
24
|
-
this.props.onError?.(error, info);
|
|
25
|
-
Log.error(
|
|
26
|
-
// NOTE(jeremy): We concatenate the error messsage here. Typical
|
|
27
|
-
// Khan Academy error handling guidance says that you should never
|
|
28
|
-
// "build" the error message that might be sent to our error
|
|
29
|
-
// reporting tool (currently Sentry). However, if we don't
|
|
30
|
-
// differentiate between the different errors that are thrown, they
|
|
31
|
-
// all end up being grouped as a single Sentry event, which is very
|
|
32
|
-
// unhelpful.
|
|
33
|
-
"Unhandled Perseus error: " + error.message,
|
|
34
|
-
Errors.Internal,
|
|
35
|
-
{
|
|
36
|
-
cause: error,
|
|
37
|
-
loggedMetadata: {
|
|
38
|
-
componentStack:
|
|
39
|
-
!!info && "componentStack" in info
|
|
40
|
-
? info.componentStack
|
|
41
|
-
: "componentStack not provided",
|
|
42
|
-
...this.props.metadata,
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
render(): React.ReactNode {
|
|
49
|
-
if (this.state.error) {
|
|
50
|
-
// TODO(djf): perhaps we should have one error boundary for
|
|
51
|
-
// inline elements and one for block elements. This one uses
|
|
52
|
-
// a <span> and effectively converts block elements with
|
|
53
|
-
// errors into inline elements.
|
|
54
|
-
// TODO(michaelpolyak): Link error icon to "Report a problem".
|
|
55
|
-
return (
|
|
56
|
-
<svg height="16" width="16" viewBox="0 0 16 16" role={"img"}>
|
|
57
|
-
<title>Rendering Error!</title>
|
|
58
|
-
<path
|
|
59
|
-
d="m8 16c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm0-3c0.55 0 1-0.45 1-1s-0.45-1-1-1-1 0.45-1 1 0.45 1 1 1zm0-9c-0.55 0-1 0.45-1 1v4c0 0.55.45 1 1 1s1-0.45 1-1v-4c0-0.55-0.45-1-1-1z"
|
|
60
|
-
fill="#d92916"
|
|
61
|
-
fillRule="evenodd"
|
|
62
|
-
/>
|
|
63
|
-
</svg>
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
return this.props.children;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export default ErrorBoundary;
|