@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,249 +0,0 @@
|
|
|
1
|
-
/* eslint-disable react/sort-comp */
|
|
2
|
-
import * as PerseusLinter from "@khanacademy/perseus-linter";
|
|
3
|
-
import * as React from "react";
|
|
4
|
-
import _ from "underscore";
|
|
5
|
-
|
|
6
|
-
import {ClassNames as ApiClassNames} from "../perseus-api";
|
|
7
|
-
import Renderer from "../renderer";
|
|
8
|
-
import Util from "../util";
|
|
9
|
-
|
|
10
|
-
import MathInput from "./math-input";
|
|
11
|
-
import MathOutput from "./math-output";
|
|
12
|
-
import TextInput from "./text-input";
|
|
13
|
-
import Tooltip, {HorizontalDirection, VerticalDirection} from "./tooltip";
|
|
14
|
-
|
|
15
|
-
import type {LinterContextProps} from "@khanacademy/perseus-linter";
|
|
16
|
-
import type {StyleType} from "@khanacademy/wonder-blocks-core";
|
|
17
|
-
|
|
18
|
-
const {captureScratchpadTouchStart} = Util;
|
|
19
|
-
|
|
20
|
-
type Props = {
|
|
21
|
-
type: "math" | "text" | "tex";
|
|
22
|
-
value: string;
|
|
23
|
-
onChange: any;
|
|
24
|
-
className: string;
|
|
25
|
-
examples: ReadonlyArray<string>;
|
|
26
|
-
shouldShowExamples: boolean;
|
|
27
|
-
convertDotToTimes?: boolean;
|
|
28
|
-
buttonSet?: string;
|
|
29
|
-
buttonsVisible?: "always" | "never" | "focused";
|
|
30
|
-
labelText?: string;
|
|
31
|
-
onFocus: () => void;
|
|
32
|
-
onBlur: () => void;
|
|
33
|
-
disabled: boolean;
|
|
34
|
-
style?: StyleType;
|
|
35
|
-
id: string;
|
|
36
|
-
linterContext: LinterContextProps;
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
type DefaultProps = {
|
|
40
|
-
type: Props["type"];
|
|
41
|
-
shouldShowExamples: Props["shouldShowExamples"];
|
|
42
|
-
onFocus: Props["onFocus"];
|
|
43
|
-
onBlur: Props["onBlur"];
|
|
44
|
-
disabled: Props["disabled"];
|
|
45
|
-
linterContext: Props["linterContext"];
|
|
46
|
-
className: Props["className"];
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
type State = {
|
|
50
|
-
focused: boolean;
|
|
51
|
-
showExamples: boolean;
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
class InputWithExamples extends React.Component<Props, State> {
|
|
55
|
-
static defaultProps: DefaultProps = {
|
|
56
|
-
type: "text",
|
|
57
|
-
shouldShowExamples: true,
|
|
58
|
-
onFocus: function () {},
|
|
59
|
-
onBlur: function () {},
|
|
60
|
-
disabled: false,
|
|
61
|
-
linterContext: PerseusLinter.linterContextDefault,
|
|
62
|
-
className: "",
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
state: State = {
|
|
66
|
-
focused: false,
|
|
67
|
-
showExamples: false,
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
_getUniqueId: () => string = () => {
|
|
71
|
-
return `input-with-examples-${btoa(this.props.id).replace(/=/g, "")}`;
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
_getInputClassName: () => string = () => {
|
|
75
|
-
// <MathOutput> is a special component that manages its own class and
|
|
76
|
-
// state, as it's a <span> that wants to act like an <input>.
|
|
77
|
-
if (this.props.type === "tex") {
|
|
78
|
-
return this.props.className;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Otherwise, we need to add these INPUT and FOCUSED tags here.
|
|
82
|
-
let className = ApiClassNames.INPUT + " " + ApiClassNames.INTERACTIVE;
|
|
83
|
-
if (this.state.focused) {
|
|
84
|
-
className += " " + ApiClassNames.FOCUSED;
|
|
85
|
-
}
|
|
86
|
-
if (this.props.className) {
|
|
87
|
-
className += " " + this.props.className;
|
|
88
|
-
}
|
|
89
|
-
return className;
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
_getPropsForInputType: () => any = () => {
|
|
93
|
-
// Minimal set of props, used by each input type
|
|
94
|
-
const id = this._getUniqueId();
|
|
95
|
-
const inputProps = {
|
|
96
|
-
id: id,
|
|
97
|
-
"aria-describedby": id,
|
|
98
|
-
ref: "input",
|
|
99
|
-
className: this._getInputClassName(),
|
|
100
|
-
labelText: this.props.labelText,
|
|
101
|
-
value: this.props.value,
|
|
102
|
-
onFocus: this._handleFocus,
|
|
103
|
-
onBlur: this._handleBlur,
|
|
104
|
-
disabled: this.props.disabled,
|
|
105
|
-
style: this.props.style,
|
|
106
|
-
} as const;
|
|
107
|
-
|
|
108
|
-
if (this.props.type === "tex") {
|
|
109
|
-
return inputProps;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// Add useful props required for MATH and TEXT modes
|
|
113
|
-
_.extend(inputProps, {
|
|
114
|
-
onChange: this.props.onChange,
|
|
115
|
-
onTouchStart: captureScratchpadTouchStart,
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
// And add final props that are MATH- and TEXT-specific
|
|
119
|
-
if (this.props.type === "math") {
|
|
120
|
-
return _.extend(
|
|
121
|
-
{
|
|
122
|
-
buttonSet: this.props.buttonSet,
|
|
123
|
-
buttonsVisible: this.props.buttonsVisible,
|
|
124
|
-
convertDotToTimes: this.props.convertDotToTimes,
|
|
125
|
-
},
|
|
126
|
-
inputProps,
|
|
127
|
-
);
|
|
128
|
-
}
|
|
129
|
-
if (this.props.type === "text") {
|
|
130
|
-
return _.extend(
|
|
131
|
-
{
|
|
132
|
-
autoCapitalize: "off",
|
|
133
|
-
autoComplete: "off",
|
|
134
|
-
autoCorrect: "off",
|
|
135
|
-
spellCheck: "false",
|
|
136
|
-
},
|
|
137
|
-
inputProps,
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
|
|
142
|
-
_getComponentForInputType: () => any = () => {
|
|
143
|
-
switch (this.props.type) {
|
|
144
|
-
case "tex":
|
|
145
|
-
return MathOutput;
|
|
146
|
-
|
|
147
|
-
case "math":
|
|
148
|
-
return MathInput;
|
|
149
|
-
|
|
150
|
-
case "text":
|
|
151
|
-
return TextInput;
|
|
152
|
-
|
|
153
|
-
default:
|
|
154
|
-
this.props.type as never;
|
|
155
|
-
return null;
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
_renderInput: () => any = () => {
|
|
160
|
-
const inputProps = this._getPropsForInputType();
|
|
161
|
-
const InputComponent = this._getComponentForInputType();
|
|
162
|
-
return <InputComponent {...inputProps} />;
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
render(): React.ReactNode {
|
|
166
|
-
const input = this._renderInput();
|
|
167
|
-
|
|
168
|
-
// Static rendering, which doesn't include the 'tooltip' logic that the
|
|
169
|
-
// other types require, and is hence handled separately.
|
|
170
|
-
if (this.props.type === "tex") {
|
|
171
|
-
return input;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
// Else, we need to be able to show examples
|
|
175
|
-
const examplesContent = _.map(this.props.examples, (example) => {
|
|
176
|
-
return "- " + example;
|
|
177
|
-
}).join("\n");
|
|
178
|
-
|
|
179
|
-
const showExamples =
|
|
180
|
-
this.props.shouldShowExamples && this.state.showExamples;
|
|
181
|
-
|
|
182
|
-
return (
|
|
183
|
-
<Tooltip
|
|
184
|
-
// eslint-disable-next-line react/no-string-refs
|
|
185
|
-
ref="tooltip"
|
|
186
|
-
className="perseus-formats-tooltip preview-measure"
|
|
187
|
-
horizontalPosition={HorizontalDirection.Left}
|
|
188
|
-
horizontalAlign={HorizontalDirection.Left}
|
|
189
|
-
verticalPosition={VerticalDirection.Bottom}
|
|
190
|
-
arrowSize={10}
|
|
191
|
-
borderColor="#ccc"
|
|
192
|
-
show={showExamples}
|
|
193
|
-
>
|
|
194
|
-
{input}
|
|
195
|
-
<div id={this._getUniqueId()}>
|
|
196
|
-
<Renderer
|
|
197
|
-
content={examplesContent}
|
|
198
|
-
linterContext={PerseusLinter.pushContextStack(
|
|
199
|
-
this.props.linterContext,
|
|
200
|
-
"input-with-examples",
|
|
201
|
-
)}
|
|
202
|
-
/>
|
|
203
|
-
</div>
|
|
204
|
-
</Tooltip>
|
|
205
|
-
);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
_handleFocus: () => void = () => {
|
|
209
|
-
this.props.onFocus();
|
|
210
|
-
this.setState({
|
|
211
|
-
focused: true,
|
|
212
|
-
showExamples: true,
|
|
213
|
-
});
|
|
214
|
-
};
|
|
215
|
-
|
|
216
|
-
show: () => void = () => {
|
|
217
|
-
this.setState({showExamples: true});
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
hide: () => void = () => {
|
|
221
|
-
this.setState({showExamples: false});
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
_handleBlur: () => void = () => {
|
|
225
|
-
this.props.onBlur();
|
|
226
|
-
this.setState({
|
|
227
|
-
focused: false,
|
|
228
|
-
showExamples: false,
|
|
229
|
-
});
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
focus: () => void = () => {
|
|
233
|
-
// eslint-disable-next-line react/no-string-refs
|
|
234
|
-
// @ts-expect-error - TS2339 - Property 'focus' does not exist on type 'ReactInstance'.
|
|
235
|
-
this.refs.input.focus();
|
|
236
|
-
};
|
|
237
|
-
|
|
238
|
-
blur: () => void = () => {
|
|
239
|
-
// eslint-disable-next-line react/no-string-refs
|
|
240
|
-
// @ts-expect-error - TS2339 - Property 'blur' does not exist on type 'ReactInstance'.
|
|
241
|
-
this.refs.input.blur();
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
handleChange: (arg1: any) => void = (e) => {
|
|
245
|
-
this.props.onChange(e.target.value);
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
export default InputWithExamples;
|
package/src/components/lint.tsx
DELETED
|
@@ -1,459 +0,0 @@
|
|
|
1
|
-
import {StyleSheet, css} from "aphrodite";
|
|
2
|
-
import * as React from "react";
|
|
3
|
-
import ReactDOM from "react-dom";
|
|
4
|
-
|
|
5
|
-
import * as constants from "../styles/constants";
|
|
6
|
-
|
|
7
|
-
import InlineIcon from "./inline-icon";
|
|
8
|
-
|
|
9
|
-
const exclamationIcon = {
|
|
10
|
-
path: "M6 11a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm0-9a1 1 0 0 1 1 1v4a1 1 0 1 1-2 0V3a1 1 0 0 1 1-1z",
|
|
11
|
-
height: 12,
|
|
12
|
-
width: 12,
|
|
13
|
-
} as const;
|
|
14
|
-
|
|
15
|
-
enum Severity {
|
|
16
|
-
Error = 1,
|
|
17
|
-
Warning = 2,
|
|
18
|
-
Recommendation = 3,
|
|
19
|
-
OfflineReportingOnly = 4,
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
type Props = {
|
|
23
|
-
// The children are the linty content we're highlighting
|
|
24
|
-
children: React.ReactNode;
|
|
25
|
-
// Inline lint is highlighted differently than block lint.
|
|
26
|
-
inline?: boolean;
|
|
27
|
-
// This is the text that appears in the tooltip
|
|
28
|
-
message: string;
|
|
29
|
-
// This is used as the fragment id (hash) in the URL of the link
|
|
30
|
-
ruleName: string;
|
|
31
|
-
// Lint warnings inside tables are handled specially
|
|
32
|
-
insideTable: boolean;
|
|
33
|
-
// Should lint highlighting be rendered as a block to the left of
|
|
34
|
-
// the lint instead of on the right gutter?
|
|
35
|
-
blockHighlight?: boolean;
|
|
36
|
-
// How important this lint message is for the editor. Severity goes
|
|
37
|
-
// from 1 (indicating an error) to 4 (offline reporting only)
|
|
38
|
-
severity?: Severity;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
type State = {
|
|
42
|
-
tooltipAbove: boolean;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* This component renders "lint" nodes in a markdown parse tree. Lint nodes
|
|
47
|
-
* are inserted into the tree by the Perseus linter (see
|
|
48
|
-
* perseus-linter/src/index).
|
|
49
|
-
*
|
|
50
|
-
* This component serves multiple purposes
|
|
51
|
-
*
|
|
52
|
-
* 1) It renders a small circle in the right margin to indicate that there
|
|
53
|
-
* is lint on (or near) that line.
|
|
54
|
-
*
|
|
55
|
-
* 2) The area around the circle is hoverable: when the mouse moves over it
|
|
56
|
-
* the linty content is highlighted and a tooltip is displayed that explains
|
|
57
|
-
* what the problem is.
|
|
58
|
-
*
|
|
59
|
-
* 3) The hoverable area is also an HTML <a> tag. Clicking on it opens
|
|
60
|
-
* a new tab and links to additional details about the specific lint rule.
|
|
61
|
-
*
|
|
62
|
-
* The CSS required to position the circles in the right margin is tricky
|
|
63
|
-
* and it does not always work perfectly. When lint occurs on a block element
|
|
64
|
-
* that has a right margin (like anything blockquoted) the circle will appear
|
|
65
|
-
* to the left of where it belongs. And if there is more
|
|
66
|
-
**/
|
|
67
|
-
class Lint extends React.Component<Props, State> {
|
|
68
|
-
_positionTimeout: number | undefined;
|
|
69
|
-
|
|
70
|
-
state: State = {
|
|
71
|
-
tooltipAbove: true,
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
componentDidMount() {
|
|
75
|
-
// TODO(somewhatabstract): Use WB timing
|
|
76
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
77
|
-
this._positionTimeout = window.setTimeout(this.getPosition);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
componentWillUnmount() {
|
|
81
|
-
// TODO(somewhatabstract): Use WB timing
|
|
82
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
83
|
-
window.clearTimeout(this._positionTimeout);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// We can't call setState in componentDidMount without risking a render
|
|
87
|
-
// thrash, and we can't call getBoundingClientRect in render, so we
|
|
88
|
-
// borrow a timeout approach from learnstorm-dashboard.jsx and set our
|
|
89
|
-
// state once the component has mounted and we can get what we need.
|
|
90
|
-
getPosition: () => void = () => {
|
|
91
|
-
// @ts-expect-error - TS2531 - Object is possibly 'null'. | TS2339 - Property 'getBoundingClientRect' does not exist on type 'Element | Text'.
|
|
92
|
-
const rect = ReactDOM.findDOMNode(this).getBoundingClientRect();
|
|
93
|
-
// TODO(scottgrant): This is a magic number! We don't know the size
|
|
94
|
-
// of the tooltip at this point, so we're arbitrarily choosing a
|
|
95
|
-
// point at which to flip the tooltip's position.
|
|
96
|
-
this.setState({tooltipAbove: rect.top > 100});
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
// Render the <a> element that holds the indicator icon and the tooltip
|
|
100
|
-
// We pass different styles for the inline and block cases
|
|
101
|
-
renderLink: (arg1: any) => React.ReactElement = (style) => {
|
|
102
|
-
const tooltipAbove = this.state.tooltipAbove;
|
|
103
|
-
|
|
104
|
-
let severityStyle;
|
|
105
|
-
let warningText;
|
|
106
|
-
let warningTextStyle;
|
|
107
|
-
if (this.props.severity === Severity.Error) {
|
|
108
|
-
severityStyle = styles.indicatorError;
|
|
109
|
-
warningText = "Error";
|
|
110
|
-
warningTextStyle = styles.publishBlockingError;
|
|
111
|
-
} else if (this.props.severity === Severity.Warning) {
|
|
112
|
-
severityStyle = styles.indicatorWarning;
|
|
113
|
-
warningText = "Warning";
|
|
114
|
-
warningTextStyle = styles.warning;
|
|
115
|
-
} else {
|
|
116
|
-
severityStyle = styles.indicatorGuideline;
|
|
117
|
-
warningText = "Recommendation";
|
|
118
|
-
warningTextStyle = styles.warning;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
return (
|
|
122
|
-
<a
|
|
123
|
-
href={`https://khanacademy.org/r/linter-rules#${this.props.ruleName}`}
|
|
124
|
-
target="lint-help-window"
|
|
125
|
-
className={css(style)}
|
|
126
|
-
>
|
|
127
|
-
<span className={css(styles.indicator, severityStyle)}>
|
|
128
|
-
{this.props.severity === 1 && (
|
|
129
|
-
<InlineIcon {...exclamationIcon} />
|
|
130
|
-
)}
|
|
131
|
-
</span>
|
|
132
|
-
<div
|
|
133
|
-
className={css(
|
|
134
|
-
styles.tooltip,
|
|
135
|
-
tooltipAbove && styles.tooltipAbove,
|
|
136
|
-
)}
|
|
137
|
-
>
|
|
138
|
-
{this.props.message.split("\n\n").map((m, i) => (
|
|
139
|
-
<p key={i} className={css(styles.tooltipParagraph)}>
|
|
140
|
-
<span className={css(warningTextStyle)}>
|
|
141
|
-
{warningText}:{" "}
|
|
142
|
-
</span>
|
|
143
|
-
{m}
|
|
144
|
-
</p>
|
|
145
|
-
))}
|
|
146
|
-
<div
|
|
147
|
-
className={css(
|
|
148
|
-
styles.tail,
|
|
149
|
-
tooltipAbove && styles.tailAbove,
|
|
150
|
-
)}
|
|
151
|
-
/>
|
|
152
|
-
</div>
|
|
153
|
-
</a>
|
|
154
|
-
);
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
// The main render method surrounds linty content with a block or
|
|
158
|
-
// inline container and the link element that displays the indicator
|
|
159
|
-
// and holds the tooltip.
|
|
160
|
-
render(): React.ReactNode {
|
|
161
|
-
const {children, inline, blockHighlight, insideTable} = this.props;
|
|
162
|
-
|
|
163
|
-
if (insideTable) {
|
|
164
|
-
// If we're inside a table, then linty nodes just get
|
|
165
|
-
// a simple wrapper that allows them to be highlighted
|
|
166
|
-
if (inline) {
|
|
167
|
-
return <span data-lint-inside-table="true">{children}</span>;
|
|
168
|
-
}
|
|
169
|
-
return <div data-lint-inside-table="true">{children}</div>;
|
|
170
|
-
}
|
|
171
|
-
if (blockHighlight) {
|
|
172
|
-
return (
|
|
173
|
-
<span
|
|
174
|
-
className={css(
|
|
175
|
-
styles.lintContainer,
|
|
176
|
-
styles.lintContainerBlock,
|
|
177
|
-
)}
|
|
178
|
-
>
|
|
179
|
-
{this.renderLink(styles.radioWidgetHoverTarget)}
|
|
180
|
-
<span>{children}</span>
|
|
181
|
-
</span>
|
|
182
|
-
);
|
|
183
|
-
}
|
|
184
|
-
if (inline) {
|
|
185
|
-
return (
|
|
186
|
-
<span className={css(styles.lintContainer)}>
|
|
187
|
-
{this.renderLink(styles.inlineHoverTarget)}
|
|
188
|
-
<span>{children}</span>
|
|
189
|
-
</span>
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
return (
|
|
193
|
-
<div className={css(styles.lintContainer)}>
|
|
194
|
-
{this.renderLink(styles.hoverTarget)}
|
|
195
|
-
<div>{children}</div>
|
|
196
|
-
</div>
|
|
197
|
-
);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
const styles = StyleSheet.create({
|
|
202
|
-
// This is the class of the outermost element.
|
|
203
|
-
// We use relative positioning so that the lint indicator can be
|
|
204
|
-
// positioned absolutely relative to the position of the linty container.
|
|
205
|
-
lintContainer: {
|
|
206
|
-
position: "relative",
|
|
207
|
-
},
|
|
208
|
-
|
|
209
|
-
// Some elements that might be inline with bad parent styling are treated
|
|
210
|
-
// as block elements so they render and are visible.
|
|
211
|
-
lintContainerBlock: {
|
|
212
|
-
display: "block",
|
|
213
|
-
},
|
|
214
|
-
|
|
215
|
-
// This is the main class for block lint. It is applied to the link element
|
|
216
|
-
// that is also the hover target.
|
|
217
|
-
hoverTarget: {
|
|
218
|
-
// Absolute positioning relative to the lintContainer element
|
|
219
|
-
position: "absolute",
|
|
220
|
-
// Top of the hover target is aligned with the top of the linty block
|
|
221
|
-
top: 0,
|
|
222
|
-
|
|
223
|
-
// We want the hover target in the right margin. It is 24px wide, but
|
|
224
|
-
// we have to offset it another 16px because of margins in the
|
|
225
|
-
// Perseus content. I'm not sure where the 16px margin is set
|
|
226
|
-
// so if that changes, this number will also have to be changed.
|
|
227
|
-
// This is the part of the CSS that doesn't work right when
|
|
228
|
-
// applied to things like blockquotes that have different right
|
|
229
|
-
// margins.
|
|
230
|
-
right: -40,
|
|
231
|
-
|
|
232
|
-
// The hover target is a 24x24 block element.
|
|
233
|
-
display: "block",
|
|
234
|
-
width: 24,
|
|
235
|
-
height: 24,
|
|
236
|
-
|
|
237
|
-
// The indicator is in a span inside the hover target.
|
|
238
|
-
// This style changes its color on hover
|
|
239
|
-
":hover > span": {
|
|
240
|
-
backgroundColor: constants.warningColorHover,
|
|
241
|
-
},
|
|
242
|
-
|
|
243
|
-
// The tooltip is in a div element inside the hover target.
|
|
244
|
-
// This style displays it on hover
|
|
245
|
-
":hover div": {
|
|
246
|
-
display: "block",
|
|
247
|
-
},
|
|
248
|
-
|
|
249
|
-
// The linty content is in a <div> sibling that follows the
|
|
250
|
-
// hover target. This style highlights it on hover. We do an outline
|
|
251
|
-
// rather than a border so we don't affect the layout. We could also
|
|
252
|
-
// set the background color, but we don't because we can't reliably
|
|
253
|
-
// set the text color of this block element. We could use
|
|
254
|
-
// filter: invert(100%) if we want more visual change on hover here.
|
|
255
|
-
":hover ~ div": {
|
|
256
|
-
outline: "1px solid " + constants.warningColor,
|
|
257
|
-
},
|
|
258
|
-
|
|
259
|
-
// If the div sibling is a table, then we may be displaying
|
|
260
|
-
// lint warnings about errors inside that table. In that case
|
|
261
|
-
// we want to highlight any linty descendants of the table
|
|
262
|
-
":hover ~ div div[data-lint-inside-table]": {
|
|
263
|
-
outline: "1px solid " + constants.warningColor,
|
|
264
|
-
},
|
|
265
|
-
|
|
266
|
-
":hover ~ div span[data-lint-inside-table]": {
|
|
267
|
-
backgroundColor: constants.warningColor,
|
|
268
|
-
color: constants.white,
|
|
269
|
-
},
|
|
270
|
-
},
|
|
271
|
-
|
|
272
|
-
// This is how we position the hover target for inline lint.
|
|
273
|
-
inlineHoverTarget: {
|
|
274
|
-
// For inline lint we position the hover target with a float:right
|
|
275
|
-
// We can't use absolute positioning as we do in the block case
|
|
276
|
-
// because the horizontal position is not predictable in the
|
|
277
|
-
// inline case.
|
|
278
|
-
float: "right",
|
|
279
|
-
|
|
280
|
-
// We still have to make the hover target relative so that the
|
|
281
|
-
// tooltip can be positioned relative to it.
|
|
282
|
-
position: "relative",
|
|
283
|
-
|
|
284
|
-
// See the comment above about the extra 16px of offset needed here.
|
|
285
|
-
marginRight: -40,
|
|
286
|
-
|
|
287
|
-
// The hover target is a 24x24 block. Same as the block case
|
|
288
|
-
display: "block",
|
|
289
|
-
width: 24,
|
|
290
|
-
height: 24,
|
|
291
|
-
|
|
292
|
-
// The indicator is in a span inside the hover target.
|
|
293
|
-
// This style changes its color on hover.
|
|
294
|
-
// This is the same as the block case.
|
|
295
|
-
":hover > span": {
|
|
296
|
-
backgroundColor: constants.warningColorHover,
|
|
297
|
-
},
|
|
298
|
-
|
|
299
|
-
// The tooltip is in a div element inside the hover target.
|
|
300
|
-
// This style displays it on hover. This is the same as the block case.
|
|
301
|
-
":hover div": {
|
|
302
|
-
display: "block",
|
|
303
|
-
},
|
|
304
|
-
|
|
305
|
-
// The linty content is in a <span> sibling that follows the
|
|
306
|
-
// hover target. This style highlights it on hover. In this case
|
|
307
|
-
// we can just set the foreground and background color to really
|
|
308
|
-
// draw attention to the linty content.
|
|
309
|
-
":hover ~ span": {
|
|
310
|
-
backgroundColor: constants.warningColor,
|
|
311
|
-
color: constants.white,
|
|
312
|
-
},
|
|
313
|
-
},
|
|
314
|
-
|
|
315
|
-
radioWidgetHoverTarget: {
|
|
316
|
-
// These lint targets appear in radio checkboxes, and are not able to
|
|
317
|
-
// position a lint icon in the right-most gutter thanks to a parent
|
|
318
|
-
// overflow rule. We position these icons to the left of the block
|
|
319
|
-
// where there is some room.
|
|
320
|
-
position: "absolute",
|
|
321
|
-
left: -40,
|
|
322
|
-
|
|
323
|
-
// The hover target is a 24x24 block. Same as the block case
|
|
324
|
-
display: "block",
|
|
325
|
-
width: 24,
|
|
326
|
-
height: 24,
|
|
327
|
-
|
|
328
|
-
// By specifying a fixed minimum width, the tooltip will hover in a
|
|
329
|
-
// readable position above and to the right.
|
|
330
|
-
minWidth: 264,
|
|
331
|
-
|
|
332
|
-
// The indicator is in a span inside the hover target.
|
|
333
|
-
// This style changes its color on hover.
|
|
334
|
-
// This is the same as the block case.
|
|
335
|
-
":hover > span": {
|
|
336
|
-
backgroundColor: constants.warningColorHover,
|
|
337
|
-
},
|
|
338
|
-
|
|
339
|
-
// The tooltip is in a div element inside the hover target.
|
|
340
|
-
// This style displays it on hover. This is the same as the block case.
|
|
341
|
-
// We specify a fixed-width because of some parent styling.
|
|
342
|
-
":hover > div": {
|
|
343
|
-
display: "block",
|
|
344
|
-
padding: 8,
|
|
345
|
-
width: 280,
|
|
346
|
-
},
|
|
347
|
-
|
|
348
|
-
// Move the tooltip tail to an appropriate position relative to the
|
|
349
|
-
// tooltip.
|
|
350
|
-
":hover > div > div": {
|
|
351
|
-
left: 8,
|
|
352
|
-
},
|
|
353
|
-
|
|
354
|
-
// The linty content is in a <span> sibling that follows the
|
|
355
|
-
// hover target. This style highlights it on hover. In this case
|
|
356
|
-
// we can just set the foreground and background color to really
|
|
357
|
-
// draw attention to the linty content.
|
|
358
|
-
":hover ~ span": {
|
|
359
|
-
backgroundColor: constants.warningColor,
|
|
360
|
-
color: constants.white,
|
|
361
|
-
},
|
|
362
|
-
},
|
|
363
|
-
|
|
364
|
-
// This is the class for the lint indicator in the margin.
|
|
365
|
-
indicator: {
|
|
366
|
-
alignItems: "center",
|
|
367
|
-
borderRadius: 4,
|
|
368
|
-
color: "white",
|
|
369
|
-
display: "flex",
|
|
370
|
-
fontSize: 12,
|
|
371
|
-
height: 8,
|
|
372
|
-
justifyContent: "center",
|
|
373
|
-
margin: 8,
|
|
374
|
-
width: 8,
|
|
375
|
-
},
|
|
376
|
-
indicatorError: {
|
|
377
|
-
backgroundColor: "#be2612",
|
|
378
|
-
borderRadius: 8,
|
|
379
|
-
height: 16,
|
|
380
|
-
width: 16,
|
|
381
|
-
},
|
|
382
|
-
indicatorWarning: {
|
|
383
|
-
backgroundColor: "#f86700",
|
|
384
|
-
},
|
|
385
|
-
indicatorGuideline: {
|
|
386
|
-
backgroundColor: "#ffbe26",
|
|
387
|
-
},
|
|
388
|
-
|
|
389
|
-
// These are the styles for the tooltip
|
|
390
|
-
tooltip: {
|
|
391
|
-
// Absolute positioning relative to the lint indicator circle.
|
|
392
|
-
position: "absolute",
|
|
393
|
-
right: -12,
|
|
394
|
-
|
|
395
|
-
// The tooltip is hidden by default; only displayed on hover
|
|
396
|
-
display: "none",
|
|
397
|
-
|
|
398
|
-
// When it is displayed, it goes on top!
|
|
399
|
-
zIndex: 1000,
|
|
400
|
-
|
|
401
|
-
// These styles control what the tooltip looks like
|
|
402
|
-
color: constants.white,
|
|
403
|
-
backgroundColor: constants.gray17,
|
|
404
|
-
opacity: 0.9,
|
|
405
|
-
fontFamily: constants.baseFontFamily,
|
|
406
|
-
fontSize: "12px",
|
|
407
|
-
lineHeight: "15px",
|
|
408
|
-
width: "320px",
|
|
409
|
-
borderRadius: "4px",
|
|
410
|
-
},
|
|
411
|
-
// If we're going to render the tooltip above the warning circle, we use
|
|
412
|
-
// the previous rules in tooltip, but change the position slightly.
|
|
413
|
-
tooltipAbove: {
|
|
414
|
-
bottom: 32,
|
|
415
|
-
},
|
|
416
|
-
|
|
417
|
-
// We give the tooltip a little triangular "tail" that points down at
|
|
418
|
-
// the lint indicator circle. This is inside the tooltip and positioned
|
|
419
|
-
// relative to it. It also shares the opacity of the tooltip. We're using
|
|
420
|
-
// the standard CSS trick for drawing triangles with a thick border.
|
|
421
|
-
tail: {
|
|
422
|
-
position: "absolute",
|
|
423
|
-
top: -12,
|
|
424
|
-
right: 16,
|
|
425
|
-
width: 0,
|
|
426
|
-
height: 0,
|
|
427
|
-
|
|
428
|
-
// This is the CSS triangle trick
|
|
429
|
-
borderLeft: "8px solid transparent",
|
|
430
|
-
borderRight: "8px solid transparent",
|
|
431
|
-
borderBottom: "12px solid " + constants.gray17,
|
|
432
|
-
},
|
|
433
|
-
tailAbove: {
|
|
434
|
-
bottom: -12,
|
|
435
|
-
borderBottom: "none",
|
|
436
|
-
borderTop: "12px solid " + constants.gray17,
|
|
437
|
-
top: "auto",
|
|
438
|
-
},
|
|
439
|
-
|
|
440
|
-
// Each warning in the tooltip is its own <p>. They are 12 pixels from
|
|
441
|
-
// the edges of the tooltip and 12 pixels from each other.
|
|
442
|
-
tooltipParagraph: {
|
|
443
|
-
margin: 12,
|
|
444
|
-
},
|
|
445
|
-
|
|
446
|
-
// The text "Warning" inside the tooltip is highlighted like this
|
|
447
|
-
warning: {
|
|
448
|
-
color: constants.warningColor,
|
|
449
|
-
fontFamily: constants.boldFontFamily,
|
|
450
|
-
},
|
|
451
|
-
|
|
452
|
-
// The text "Publish-blocking error" instide the tooltip is highlighted
|
|
453
|
-
// like this
|
|
454
|
-
publishBlockingError: {
|
|
455
|
-
color: constants.publishBlockingErrorColor,
|
|
456
|
-
},
|
|
457
|
-
});
|
|
458
|
-
|
|
459
|
-
export default Lint;
|