@khanacademy/perseus 19.1.5 → 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/es/index.js +1 -1
- package/dist/index.js +1 -1
- 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,437 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Movable
|
|
3
|
-
*
|
|
4
|
-
* A Movable Something, that sends onMove events based on the
|
|
5
|
-
* mouse coordinate (graphie unscaled, non-pixel-value) of the
|
|
6
|
-
* move.
|
|
7
|
-
*
|
|
8
|
-
* Other MovableThings should generally have a Movable field, and
|
|
9
|
-
* let this class handle all of the virtual mouse events, and then
|
|
10
|
-
* take appropriate action in onMoveStart, onMove, onMoveEnd
|
|
11
|
-
*/
|
|
12
|
-
import {point as kpoint} from "@khanacademy/kmath";
|
|
13
|
-
import $ from "jquery";
|
|
14
|
-
import _ from "underscore";
|
|
15
|
-
|
|
16
|
-
import {Errors} from "../logging/log";
|
|
17
|
-
import {PerseusError} from "../perseus-error";
|
|
18
|
-
|
|
19
|
-
import InteractiveUtil from "./interactive-util";
|
|
20
|
-
|
|
21
|
-
import type {Constraint, ConstraintCallbacks, Coord} from "./types";
|
|
22
|
-
import type {Graphie} from "../util/graphie";
|
|
23
|
-
|
|
24
|
-
const normalizeOptions = InteractiveUtil.normalizeOptions;
|
|
25
|
-
|
|
26
|
-
const assert = InteractiveUtil.assert;
|
|
27
|
-
|
|
28
|
-
// Default "props" and "state". Both are added to this.state.
|
|
29
|
-
// However, properties in DEFAULT_PROPS are updated on `modify()`,
|
|
30
|
-
// while those in DEFAULT_STATE persist and are not updated.
|
|
31
|
-
// Things that the user might want to change should be on "props",
|
|
32
|
-
// while things used to render the movable should be on "state".
|
|
33
|
-
const DEFAULT_PROPS = {
|
|
34
|
-
cursor: null,
|
|
35
|
-
} as const;
|
|
36
|
-
const DEFAULT_STATE = {
|
|
37
|
-
added: false,
|
|
38
|
-
isHovering: false,
|
|
39
|
-
isMouseOver: false,
|
|
40
|
-
isDragging: false,
|
|
41
|
-
mouseTarget: null,
|
|
42
|
-
} as const;
|
|
43
|
-
|
|
44
|
-
export interface State {
|
|
45
|
-
added?: boolean;
|
|
46
|
-
isHovering?: boolean;
|
|
47
|
-
isMouseOver?: boolean;
|
|
48
|
-
isDragging?: boolean;
|
|
49
|
-
mouseTarget?: {
|
|
50
|
-
toFront(): void;
|
|
51
|
-
toBack(): void;
|
|
52
|
-
remove(): void;
|
|
53
|
-
getMouseTarget(): Element;
|
|
54
|
-
} | null;
|
|
55
|
-
// TODO(benchristel): I don't think cursor is used
|
|
56
|
-
cursor?: null;
|
|
57
|
-
id: string;
|
|
58
|
-
add?: (() => void)[];
|
|
59
|
-
// TODO(benchristel): I don't see any evidence that implementers of
|
|
60
|
-
// modify do anything with the second argument. Remove it?
|
|
61
|
-
modify?: ((state: State, prevState?: State) => void)[];
|
|
62
|
-
draw?: ((state: State, prevState?: State) => void)[];
|
|
63
|
-
remove?: (() => void)[];
|
|
64
|
-
// TODO(benchristel): callers pass the position twice to onMoveStart.
|
|
65
|
-
// But I don't see any implementers expecting two arguments. Remove the
|
|
66
|
-
// second argument.
|
|
67
|
-
onMoveStart?: ((position: Coord, positionAgain: Coord) => void)[];
|
|
68
|
-
onMove?: ((end: Coord, start: Coord) => void)[];
|
|
69
|
-
onMoveEnd?: ((end: Coord, start: Coord) => void)[];
|
|
70
|
-
onClick?: ((position: Coord, start: Coord) => void)[];
|
|
71
|
-
constraints?: Constraint[];
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export class Movable<Options extends Record<string, any>> {
|
|
75
|
-
graphie: Graphie;
|
|
76
|
-
state: State;
|
|
77
|
-
prevState: State | undefined;
|
|
78
|
-
// TODO(benchristel): delete _listenerMap; it's unused
|
|
79
|
-
_listenerMap: Record<string, number> = {};
|
|
80
|
-
|
|
81
|
-
constructor(graphie: Graphie, options: Options) {
|
|
82
|
-
this.graphie = graphie;
|
|
83
|
-
this.state = {
|
|
84
|
-
id: _.uniqueId("movable"),
|
|
85
|
-
};
|
|
86
|
-
this.modify({...DEFAULT_STATE, ...options});
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
modify(options: Options) {
|
|
90
|
-
this.update({...this._createDefaultState(), ...options});
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
_createDefaultState() {
|
|
94
|
-
return {
|
|
95
|
-
id: this.state.id,
|
|
96
|
-
add: [],
|
|
97
|
-
modify: [],
|
|
98
|
-
draw: [],
|
|
99
|
-
remove: [],
|
|
100
|
-
onMoveStart: [],
|
|
101
|
-
onMove: [],
|
|
102
|
-
onMoveEnd: [],
|
|
103
|
-
onClick: [],
|
|
104
|
-
|
|
105
|
-
// We only update props here, because we want things on state to
|
|
106
|
-
// be persistent, and updated appropriately in modify()
|
|
107
|
-
...DEFAULT_PROPS,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
update(options: Options) {
|
|
112
|
-
const graphie = this.graphie;
|
|
113
|
-
|
|
114
|
-
const prevState = this.cloneState();
|
|
115
|
-
const state = Object.assign(this.state, normalizeOptions(options));
|
|
116
|
-
|
|
117
|
-
// the invisible shape in front of the point that gets mouse events
|
|
118
|
-
if (state.mouseTarget && !prevState.mouseTarget) {
|
|
119
|
-
let $mouseTarget;
|
|
120
|
-
if (state.mouseTarget.getMouseTarget) {
|
|
121
|
-
$mouseTarget = $(state.mouseTarget.getMouseTarget());
|
|
122
|
-
} else {
|
|
123
|
-
$mouseTarget = $(state.mouseTarget[0]);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
const isMouse = !("ontouchstart" in window);
|
|
127
|
-
|
|
128
|
-
if (isMouse) {
|
|
129
|
-
$mouseTarget.on("vmouseover", () => {
|
|
130
|
-
state.isMouseOver = true;
|
|
131
|
-
if (!graphie.isDragging) {
|
|
132
|
-
state.isHovering = true;
|
|
133
|
-
}
|
|
134
|
-
if (this.state.added) {
|
|
135
|
-
// Avoid drawing if the point has been removed
|
|
136
|
-
this.draw();
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
$mouseTarget.on("vmouseout", () => {
|
|
141
|
-
state.isMouseOver = false;
|
|
142
|
-
if (!state.isDragging) {
|
|
143
|
-
state.isHovering = false;
|
|
144
|
-
}
|
|
145
|
-
if (this.state.added) {
|
|
146
|
-
// Avoid drawing if the point has been removed
|
|
147
|
-
this.draw();
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// Prevent the page from scrolling when we grab and drag the
|
|
153
|
-
// movable object on a mobile device.
|
|
154
|
-
$mouseTarget[0].addEventListener(
|
|
155
|
-
"touchstart",
|
|
156
|
-
function (event) {
|
|
157
|
-
event.preventDefault();
|
|
158
|
-
},
|
|
159
|
-
{passive: false},
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
$mouseTarget.on("vmousedown", (e) => {
|
|
163
|
-
if (e.which !== 0 && e.which !== 1) {
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
e.preventDefault();
|
|
167
|
-
|
|
168
|
-
const mouseCoord = graphie.getMouseCoord(e);
|
|
169
|
-
this.grab(mouseCoord);
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
if (state.mouseTarget && state.cursor !== undefined) {
|
|
174
|
-
let $mouseTarget;
|
|
175
|
-
if (state.mouseTarget.getMouseTarget) {
|
|
176
|
-
$mouseTarget = $(state.mouseTarget.getMouseTarget());
|
|
177
|
-
} else {
|
|
178
|
-
$mouseTarget = $(state.mouseTarget[0]);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// "" removes the css cursor if state.cursor is null
|
|
182
|
-
$mouseTarget.css("cursor", state.cursor || "");
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// Trigger an add event if this hasn't been added before
|
|
186
|
-
if (!state.added) {
|
|
187
|
-
// TODO(benchristel): No one seems to handle the modify event. Can
|
|
188
|
-
// we delete this?
|
|
189
|
-
// @ts-expect-error - TS2345: Argument of type '{}' is not assignable to parameter of type 'State'.
|
|
190
|
-
this._fireEvent(state.modify, this.cloneState(), {});
|
|
191
|
-
state.added = true;
|
|
192
|
-
|
|
193
|
-
// Update the state for `added` and in case the add event
|
|
194
|
-
// changed it
|
|
195
|
-
this.prevState = this.cloneState();
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
// Trigger a modify event
|
|
199
|
-
this._fireEvent(state.modify, this.cloneState(), this.prevState);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
cloneState(): State {
|
|
203
|
-
return {...this.state};
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Fire an onSomething type event to all functions in listeners
|
|
208
|
-
*/
|
|
209
|
-
_fireEvent<F extends (...args: any[]) => any>(
|
|
210
|
-
listeners: F[] | undefined,
|
|
211
|
-
...args: Parameters<F>
|
|
212
|
-
) {
|
|
213
|
-
if (listeners == null) {
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
for (const listener of listeners) {
|
|
217
|
-
listener.call(this, ...args);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Call all draw functions, and update our prevState for the next
|
|
223
|
-
* draw function
|
|
224
|
-
*/
|
|
225
|
-
draw() {
|
|
226
|
-
const currState = this.cloneState();
|
|
227
|
-
this._fireEvent(this.state.draw, currState, this.prevState);
|
|
228
|
-
this.prevState = currState;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Simulates a mouse grab event on the movable object.
|
|
233
|
-
*/
|
|
234
|
-
grab(coord: Coord) {
|
|
235
|
-
assert(kpoint.is(coord));
|
|
236
|
-
const graphie = this.graphie;
|
|
237
|
-
const state: State = this.state;
|
|
238
|
-
|
|
239
|
-
state.isHovering = true;
|
|
240
|
-
state.isDragging = true;
|
|
241
|
-
graphie.isDragging = true;
|
|
242
|
-
|
|
243
|
-
const startMouseCoord = coord;
|
|
244
|
-
let prevMouseCoord = startMouseCoord;
|
|
245
|
-
this._fireEvent(state.onMoveStart, startMouseCoord, startMouseCoord);
|
|
246
|
-
|
|
247
|
-
const moveHandler = (
|
|
248
|
-
e: Readonly<{
|
|
249
|
-
pageX?: number;
|
|
250
|
-
pageY?: number;
|
|
251
|
-
preventDefault(): void;
|
|
252
|
-
}>,
|
|
253
|
-
) => {
|
|
254
|
-
e.preventDefault();
|
|
255
|
-
|
|
256
|
-
const mouseCoord = graphie.getMouseCoord(e);
|
|
257
|
-
this._fireEvent(state.onMove, mouseCoord, prevMouseCoord);
|
|
258
|
-
this.draw();
|
|
259
|
-
prevMouseCoord = mouseCoord;
|
|
260
|
-
};
|
|
261
|
-
|
|
262
|
-
const upHandler = () => {
|
|
263
|
-
$(document).unbind("vmousemove", moveHandler);
|
|
264
|
-
$(document).unbind("vmouseup", upHandler);
|
|
265
|
-
if (state.isHovering) {
|
|
266
|
-
this._fireEvent(state.onClick, prevMouseCoord, startMouseCoord);
|
|
267
|
-
}
|
|
268
|
-
state.isHovering = this.state.isMouseOver;
|
|
269
|
-
state.isDragging = false;
|
|
270
|
-
graphie.isDragging = false;
|
|
271
|
-
this._fireEvent(state.onMoveEnd, prevMouseCoord, startMouseCoord);
|
|
272
|
-
this.draw();
|
|
273
|
-
};
|
|
274
|
-
|
|
275
|
-
$(document).bind("vmousemove", moveHandler);
|
|
276
|
-
$(document).bind("vmouseup", upHandler);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
_applyConstraints(
|
|
280
|
-
current: Coord,
|
|
281
|
-
previous: Coord,
|
|
282
|
-
extraOptions?: ConstraintCallbacks,
|
|
283
|
-
) {
|
|
284
|
-
let skipRemaining = false;
|
|
285
|
-
|
|
286
|
-
return (this.state.constraints ?? []).reduce(
|
|
287
|
-
(memo: Coord | false, constraint) => {
|
|
288
|
-
// A move that has been cancelled won't be propagated to later
|
|
289
|
-
// constraints calls
|
|
290
|
-
if (memo === false) {
|
|
291
|
-
return false;
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
if (skipRemaining) {
|
|
295
|
-
return memo;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
const result = constraint.call(this, memo, previous, {
|
|
299
|
-
onSkipRemaining: () => {
|
|
300
|
-
skipRemaining = true;
|
|
301
|
-
},
|
|
302
|
-
...extraOptions,
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
if (result === false) {
|
|
306
|
-
// Returning false cancels the move
|
|
307
|
-
return false;
|
|
308
|
-
}
|
|
309
|
-
if (kpoint.is(result, 2)) {
|
|
310
|
-
// Returning a coord from constraints overrides the move
|
|
311
|
-
return result;
|
|
312
|
-
}
|
|
313
|
-
if (result === true || result == null) {
|
|
314
|
-
// Returning true or undefined allow the move to occur
|
|
315
|
-
return memo;
|
|
316
|
-
}
|
|
317
|
-
// Anything else is an error
|
|
318
|
-
throw new PerseusError(
|
|
319
|
-
"Constraint returned invalid result: " + result,
|
|
320
|
-
Errors.Internal,
|
|
321
|
-
);
|
|
322
|
-
},
|
|
323
|
-
current,
|
|
324
|
-
);
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
// Change z-order to back
|
|
328
|
-
toBack() {
|
|
329
|
-
if (this.state.mouseTarget) {
|
|
330
|
-
this.state.mouseTarget.toBack();
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// Change z-order to front
|
|
335
|
-
toFront() {
|
|
336
|
-
if (this.state.mouseTarget) {
|
|
337
|
-
this.state.mouseTarget.toFront();
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
/**
|
|
342
|
-
* Add a listener to any event: startMove, constraints, onMove, onMoveEnd,
|
|
343
|
-
* etc. If a listener is already bound to the given eventName and id, then
|
|
344
|
-
* it is overwritten by func.
|
|
345
|
-
*
|
|
346
|
-
* eventName: the string name of the event to listen to. one of:
|
|
347
|
-
* "onMoveStart", "onMove", "onMoveEnd", "draw", "remove"
|
|
348
|
-
*
|
|
349
|
-
* id: a string id that can be used to remove this event at a later time
|
|
350
|
-
* note: adding multiple listeners with the same id is undefined behavior
|
|
351
|
-
*
|
|
352
|
-
* func: the function to call when the event happens, which is called
|
|
353
|
-
* with the event's standard parameters [usually (coord, prevCoord) or
|
|
354
|
-
* (state, prevState)]
|
|
355
|
-
*/
|
|
356
|
-
listen(eventName: string, id: string, func: () => unknown) {
|
|
357
|
-
this._listenerMap = this._listenerMap || {};
|
|
358
|
-
|
|
359
|
-
// If there's an existing handler, replace it by using its index in
|
|
360
|
-
// `this.state[eventName]`; otherwise, add this handler to the end
|
|
361
|
-
const key = getKey(eventName, id);
|
|
362
|
-
const index = (this._listenerMap[key] =
|
|
363
|
-
this._listenerMap[key] || this.state[eventName].length);
|
|
364
|
-
this.state[eventName][index] = func;
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
/**
|
|
368
|
-
* Remove a previously added listener, by the id specified in the
|
|
369
|
-
* corresponding listen() call
|
|
370
|
-
*
|
|
371
|
-
* If the given id has not been registered already, this is a no-op
|
|
372
|
-
*/
|
|
373
|
-
unlisten(eventName: string, id: string) {
|
|
374
|
-
this._listenerMap = this._listenerMap || {};
|
|
375
|
-
|
|
376
|
-
const key = getKey(eventName, id);
|
|
377
|
-
const index = this._listenerMap[key];
|
|
378
|
-
if (index !== undefined) {
|
|
379
|
-
// Remove handler from list of event handlers and listenerMap
|
|
380
|
-
this.state[eventName].splice(index, 1);
|
|
381
|
-
delete this._listenerMap[key];
|
|
382
|
-
|
|
383
|
-
// Re-index existing events: if they occur after `index`, decrement
|
|
384
|
-
const keys = _.keys(this._listenerMap);
|
|
385
|
-
keys.forEach((key) => {
|
|
386
|
-
if (
|
|
387
|
-
getEventName(key) === eventName &&
|
|
388
|
-
this._listenerMap[key] > index
|
|
389
|
-
) {
|
|
390
|
-
this._listenerMap[key]--;
|
|
391
|
-
}
|
|
392
|
-
});
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
remove() {
|
|
397
|
-
this.state.added = false;
|
|
398
|
-
this._fireEvent(this.state.remove);
|
|
399
|
-
if (this.state.mouseTarget) {
|
|
400
|
-
$(this.state.mouseTarget).off();
|
|
401
|
-
this.state.mouseTarget.remove();
|
|
402
|
-
this.state.mouseTarget = null;
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
cursor() {
|
|
407
|
-
return this.state.cursor;
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
added() {
|
|
411
|
-
return this.state.added;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
isHovering() {
|
|
415
|
-
return this.state.isHovering;
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
isMouseOver() {
|
|
419
|
-
return this.state.isMouseOver;
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
isDragging() {
|
|
423
|
-
return this.state.isDragging;
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
mouseTarget() {
|
|
427
|
-
return this.state.mouseTarget;
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
function getKey(eventName: string, id: string): string {
|
|
432
|
-
return eventName + ":" + id;
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
function getEventName(key: string): string {
|
|
436
|
-
return key.split(":")[0];
|
|
437
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A work-in-progress of _ methods for objects.
|
|
3
|
-
* That is, they take an object as a parameter,
|
|
4
|
-
* and return an object instead of an array.
|
|
5
|
-
*
|
|
6
|
-
* TODO(aria): Move this out of interactive2
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import _ from "underscore";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Does a pluck on keys inside objects in an object
|
|
13
|
-
*
|
|
14
|
-
* Ex:
|
|
15
|
-
* tools = {
|
|
16
|
-
* translation: {
|
|
17
|
-
* enabled: true
|
|
18
|
-
* },
|
|
19
|
-
* rotation: {
|
|
20
|
-
* enabled: false
|
|
21
|
-
* }
|
|
22
|
-
* };
|
|
23
|
-
* pluckObject(tools, "enabled") returns {
|
|
24
|
-
* translation: true
|
|
25
|
-
* rotation: false
|
|
26
|
-
* }
|
|
27
|
-
*/
|
|
28
|
-
const pluck = function (table: any, subKey: string): any {
|
|
29
|
-
return _.object(
|
|
30
|
-
_.map(table, function (value, key) {
|
|
31
|
-
return [key, value[subKey]];
|
|
32
|
-
}),
|
|
33
|
-
);
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Maps an object to an object
|
|
38
|
-
*
|
|
39
|
-
* > mapObject({a: '1', b: '2'}, (value, key) => {
|
|
40
|
-
* return value + 1;
|
|
41
|
-
* });
|
|
42
|
-
* {a: 2, b: 3}
|
|
43
|
-
*/
|
|
44
|
-
const mapObject = function <K extends string, V, U>(
|
|
45
|
-
obj: Partial<Record<K, V>>,
|
|
46
|
-
lambda: (arg1: V, arg2: K) => U,
|
|
47
|
-
): Partial<Record<K, U>> {
|
|
48
|
-
const result: Record<string, any> = {};
|
|
49
|
-
_.each(_.keys(obj), function (key) {
|
|
50
|
-
// @ts-expect-error - TS2345 - Argument of type 'string' is not assignable to parameter of type 'K'.
|
|
51
|
-
result[key] = lambda(obj[key], key);
|
|
52
|
-
});
|
|
53
|
-
return result;
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Maps an array to an object
|
|
58
|
-
*
|
|
59
|
-
* > mapObjectFromArray(['a', 'b'], function(elem) {
|
|
60
|
-
* return elem + elem;
|
|
61
|
-
* });
|
|
62
|
-
* {a: 'aa', b: 'bb'}
|
|
63
|
-
*/
|
|
64
|
-
const mapObjectFromArray = function <K extends string, V>(
|
|
65
|
-
arr: ReadonlyArray<K>,
|
|
66
|
-
lambda: (arg1: K) => V,
|
|
67
|
-
): Partial<Record<K, V>> {
|
|
68
|
-
const result: Record<string, any> = {};
|
|
69
|
-
_.each(arr, function (elem) {
|
|
70
|
-
result[elem] = lambda(elem);
|
|
71
|
-
});
|
|
72
|
-
return result;
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
export default {
|
|
76
|
-
pluck: pluck,
|
|
77
|
-
mapObject: mapObject,
|
|
78
|
-
mapObjectFromArray: mapObjectFromArray,
|
|
79
|
-
};
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type {Movable} from "./movable";
|
|
2
|
-
|
|
3
|
-
export type Coord = [number, number]; // x, y
|
|
4
|
-
export type Line = [Coord, Coord]; // start, end
|
|
5
|
-
export type Constraint = (
|
|
6
|
-
this: Movable<any>,
|
|
7
|
-
current: Coord | boolean,
|
|
8
|
-
previous: Coord,
|
|
9
|
-
options: ConstraintCallbacks,
|
|
10
|
-
) => Coord | boolean | undefined;
|
|
11
|
-
|
|
12
|
-
// TODO(benchristel): these callbacks feel overcomplicated. Can we
|
|
13
|
-
// get rid of them?
|
|
14
|
-
export type ConstraintCallbacks = {
|
|
15
|
-
onSkipRemaining(): void;
|
|
16
|
-
onOutOfBounds?: () => void;
|
|
17
|
-
};
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @babel/no-invalid-this */
|
|
2
|
-
/**
|
|
3
|
-
* Default methods for a wrapped movable.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import {vector as kvector} from "@khanacademy/kmath";
|
|
7
|
-
import $ from "jquery";
|
|
8
|
-
import _ from "underscore";
|
|
9
|
-
|
|
10
|
-
import InteractiveUtil from "./interactive-util";
|
|
11
|
-
import objective_ from "./objective_";
|
|
12
|
-
|
|
13
|
-
/*
|
|
14
|
-
* These functions, when called on the wrapped object, simply pass the
|
|
15
|
-
* arguments to the underlying Raphael object.
|
|
16
|
-
*/
|
|
17
|
-
const PASS_TO_RAPHAEL = ["attr", "animate"];
|
|
18
|
-
|
|
19
|
-
const WrappedDefaults: any = _.extend(
|
|
20
|
-
{
|
|
21
|
-
transform: function (transformation) {
|
|
22
|
-
const prefixedTransform = InteractiveUtil.getPrefixedTransform();
|
|
23
|
-
// @ts-expect-error - TS2538 - Type 'null' cannot be used as an index type. | TS2538 - Type 'undefined' cannot be used as an index type.
|
|
24
|
-
this.wrapper.style[prefixedTransform] = transformation;
|
|
25
|
-
},
|
|
26
|
-
|
|
27
|
-
toFront: function () {
|
|
28
|
-
const parentNode = this.wrapper.parentNode;
|
|
29
|
-
// TODO(emily): Sometimes, we call `.remove()` but then hold a
|
|
30
|
-
// reference to this object, and sometimes call `.toFront` on it.
|
|
31
|
-
// Notably, this happens in the reflection transformation in the
|
|
32
|
-
// Transformer widget. This is a hacky fix. Make this less bad.
|
|
33
|
-
if (parentNode) {
|
|
34
|
-
parentNode.appendChild(this.wrapper);
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
toBack: function () {
|
|
39
|
-
const parentNode = this.wrapper.parentNode;
|
|
40
|
-
if (parentNode.firstChild !== this.wrapper) {
|
|
41
|
-
parentNode.insertBefore(this.wrapper, parentNode.firstChild);
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
|
|
45
|
-
remove: function () {
|
|
46
|
-
this.visibleShape.remove();
|
|
47
|
-
$(this.wrapper).remove();
|
|
48
|
-
},
|
|
49
|
-
|
|
50
|
-
getMouseTarget: function () {
|
|
51
|
-
return this.visibleShape[0];
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
moveTo: function (point) {
|
|
55
|
-
const delta = kvector.subtract(
|
|
56
|
-
this.graphie.scalePoint(point),
|
|
57
|
-
this.graphie.scalePoint(this.initialPoint),
|
|
58
|
-
);
|
|
59
|
-
const do3dTransform = InteractiveUtil.getCanUse3dTransform();
|
|
60
|
-
const transformation =
|
|
61
|
-
"translateX(" +
|
|
62
|
-
delta[0] +
|
|
63
|
-
"px) " +
|
|
64
|
-
"translateY(" +
|
|
65
|
-
delta[1] +
|
|
66
|
-
"px)" +
|
|
67
|
-
(do3dTransform ? " translateZ(0)" : "");
|
|
68
|
-
this.transform(transformation);
|
|
69
|
-
},
|
|
70
|
-
|
|
71
|
-
hide: function () {
|
|
72
|
-
this.visibleShape.hide();
|
|
73
|
-
},
|
|
74
|
-
|
|
75
|
-
show: function () {
|
|
76
|
-
this.visibleShape.show();
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
objective_.mapObjectFromArray(PASS_TO_RAPHAEL, function (attribute) {
|
|
80
|
-
return function (...args) {
|
|
81
|
-
// @ts-expect-error - TS2683 - 'this' implicitly has type 'any' because it does not have a type annotation.
|
|
82
|
-
this.visibleShape[attribute](...args);
|
|
83
|
-
};
|
|
84
|
-
}),
|
|
85
|
-
);
|
|
86
|
-
|
|
87
|
-
export default WrappedDefaults;
|