@react-x11/components 0.9.0 → 0.11.0
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/README.md +10 -4
- package/dist/charts/node.d.ts +11 -1
- package/dist/charts/node.d.ts.map +1 -1
- package/dist/charts/node.js +44 -14
- package/dist/charts/node.js.map +1 -1
- package/dist/charts/render.d.ts +12 -3
- package/dist/charts/render.d.ts.map +1 -1
- package/dist/charts/render.js +94 -25
- package/dist/charts/render.js.map +1 -1
- package/dist/code/index.d.ts.map +1 -1
- package/dist/code/index.js +27 -24
- package/dist/code/index.js.map +1 -1
- package/dist/code-editor/completion.d.ts.map +1 -1
- package/dist/code-editor/completion.js +3 -2
- package/dist/code-editor/completion.js.map +1 -1
- package/dist/code-editor/index.d.ts.map +1 -1
- package/dist/code-editor/index.js +19 -0
- package/dist/code-editor/index.js.map +1 -1
- package/dist/code-editor/node.d.ts +177 -7
- package/dist/code-editor/node.d.ts.map +1 -1
- package/dist/code-editor/node.js +1329 -164
- package/dist/code-editor/node.js.map +1 -1
- package/dist/code-language/index.d.ts +1 -1
- package/dist/code-language/index.d.ts.map +1 -1
- package/dist/code-language/index.js +1 -1
- package/dist/code-language/index.js.map +1 -1
- package/dist/code-language/languages/glsl.d.ts.map +1 -1
- package/dist/code-language/languages/glsl.js +10 -2
- package/dist/code-language/languages/glsl.js.map +1 -1
- package/dist/code-language/languages/javascript.d.ts.map +1 -1
- package/dist/code-language/languages/javascript.js +18 -3
- package/dist/code-language/languages/javascript.js.map +1 -1
- package/dist/code-language/languages/json.d.ts.map +1 -1
- package/dist/code-language/languages/json.js +10 -2
- package/dist/code-language/languages/json.js.map +1 -1
- package/dist/code-language/languages/shell.d.ts.map +1 -1
- package/dist/code-language/languages/shell.js +10 -2
- package/dist/code-language/languages/shell.js.map +1 -1
- package/dist/code-language/languages/sql.d.ts.map +1 -1
- package/dist/code-language/languages/sql.js +20 -2
- package/dist/code-language/languages/sql.js.map +1 -1
- package/dist/code-language/runs.d.ts +31 -0
- package/dist/code-language/runs.d.ts.map +1 -1
- package/dist/code-language/runs.js +105 -0
- package/dist/code-language/runs.js.map +1 -1
- package/dist/code-language/stream.d.ts +22 -0
- package/dist/code-language/stream.d.ts.map +1 -1
- package/dist/code-language/stream.js +259 -9
- package/dist/code-language/stream.js.map +1 -1
- package/dist/code-language/types.d.ts +5 -4
- package/dist/code-language/types.d.ts.map +1 -1
- package/dist/codeblock/index.d.ts +26 -2
- package/dist/codeblock/index.d.ts.map +1 -1
- package/dist/codeblock/index.js +57 -4
- package/dist/codeblock/index.js.map +1 -1
- package/dist/flow/draw.d.ts +50 -0
- package/dist/flow/draw.d.ts.map +1 -1
- package/dist/flow/draw.js +132 -33
- package/dist/flow/draw.js.map +1 -1
- package/dist/flow/gl/color.d.ts +13 -0
- package/dist/flow/gl/color.d.ts.map +1 -0
- package/dist/flow/gl/color.js +82 -0
- package/dist/flow/gl/color.js.map +1 -0
- package/dist/flow/gl/index.d.ts +60 -0
- package/dist/flow/gl/index.d.ts.map +1 -0
- package/dist/flow/gl/index.js +283 -0
- package/dist/flow/gl/index.js.map +1 -0
- package/dist/flow/gl/pack.d.ts +133 -0
- package/dist/flow/gl/pack.d.ts.map +1 -0
- package/dist/flow/gl/pack.js +408 -0
- package/dist/flow/gl/pack.js.map +1 -0
- package/dist/flow/gl/renderer.d.ts +95 -0
- package/dist/flow/gl/renderer.d.ts.map +1 -0
- package/dist/flow/gl/renderer.js +459 -0
- package/dist/flow/gl/renderer.js.map +1 -0
- package/dist/flow/gl/shaders.d.ts +79 -0
- package/dist/flow/gl/shaders.d.ts.map +1 -0
- package/dist/flow/gl/shaders.js +346 -0
- package/dist/flow/gl/shaders.js.map +1 -0
- package/dist/flow/gl/text.d.ts +318 -0
- package/dist/flow/gl/text.d.ts.map +1 -0
- package/dist/flow/gl/text.js +1103 -0
- package/dist/flow/gl/text.js.map +1 -0
- package/dist/flow/index.d.ts +1 -1
- package/dist/flow/index.d.ts.map +1 -1
- package/dist/flow/index.js +619 -64
- package/dist/flow/index.js.map +1 -1
- package/dist/flow/node.d.ts +621 -72
- package/dist/flow/node.d.ts.map +1 -1
- package/dist/flow/node.js +2253 -1018
- package/dist/flow/node.js.map +1 -1
- package/dist/flow/paint.d.ts +35 -0
- package/dist/flow/paint.d.ts.map +1 -0
- package/dist/flow/paint.js +393 -0
- package/dist/flow/paint.js.map +1 -0
- package/dist/flow/paths.d.ts +14 -0
- package/dist/flow/paths.d.ts.map +1 -1
- package/dist/flow/paths.js +45 -19
- package/dist/flow/paths.js.map +1 -1
- package/dist/flow/scene.d.ts +584 -0
- package/dist/flow/scene.d.ts.map +1 -0
- package/dist/flow/scene.js +1453 -0
- package/dist/flow/scene.js.map +1 -0
- package/dist/flow/types.d.ts +111 -1
- package/dist/flow/types.d.ts.map +1 -1
- package/dist/html/controls.d.ts +28 -0
- package/dist/html/controls.d.ts.map +1 -1
- package/dist/html/controls.js +52 -2
- package/dist/html/controls.js.map +1 -1
- package/dist/html/css/calc.d.ts +14 -0
- package/dist/html/css/calc.d.ts.map +1 -0
- package/dist/html/css/calc.js +344 -0
- package/dist/html/css/calc.js.map +1 -0
- package/dist/html/css/cascade.d.ts +262 -6
- package/dist/html/css/cascade.d.ts.map +1 -1
- package/dist/html/css/cascade.js +1373 -67
- package/dist/html/css/cascade.js.map +1 -1
- package/dist/html/css/color.d.ts +23 -0
- package/dist/html/css/color.d.ts.map +1 -0
- package/dist/html/css/color.js +740 -0
- package/dist/html/css/color.js.map +1 -0
- package/dist/html/css/content.d.ts +92 -0
- package/dist/html/css/content.d.ts.map +1 -0
- package/dist/html/css/content.js +388 -0
- package/dist/html/css/content.js.map +1 -0
- package/dist/html/css/counter-styles.d.ts +76 -0
- package/dist/html/css/counter-styles.d.ts.map +1 -0
- package/dist/html/css/counter-styles.js +893 -0
- package/dist/html/css/counter-styles.js.map +1 -0
- package/dist/html/css/decode.d.ts +12 -0
- package/dist/html/css/decode.d.ts.map +1 -0
- package/dist/html/css/decode.js +116 -0
- package/dist/html/css/decode.js.map +1 -0
- package/dist/html/css/parse.d.ts +110 -10
- package/dist/html/css/parse.d.ts.map +1 -1
- package/dist/html/css/parse.js +1473 -180
- package/dist/html/css/parse.js.map +1 -1
- package/dist/html/css/style.d.ts +501 -15
- package/dist/html/css/style.d.ts.map +1 -1
- package/dist/html/css/style.js +3729 -206
- package/dist/html/css/style.js.map +1 -1
- package/dist/html/css/ua.d.ts.map +1 -1
- package/dist/html/css/ua.js +65 -16
- package/dist/html/css/ua.js.map +1 -1
- package/dist/html/css/values.d.ts +37 -3
- package/dist/html/css/values.d.ts.map +1 -1
- package/dist/html/css/values.js +122 -48
- package/dist/html/css/values.js.map +1 -1
- package/dist/html/css/vars.d.ts +52 -0
- package/dist/html/css/vars.d.ts.map +1 -0
- package/dist/html/css/vars.js +358 -0
- package/dist/html/css/vars.js.map +1 -0
- package/dist/html/dom.d.ts +30 -4
- package/dist/html/dom.d.ts.map +1 -1
- package/dist/html/dom.js +278 -17
- package/dist/html/dom.js.map +1 -1
- package/dist/html/fonts.d.ts +106 -0
- package/dist/html/fonts.d.ts.map +1 -0
- package/dist/html/fonts.js +565 -0
- package/dist/html/fonts.js.map +1 -0
- package/dist/html/gif.d.ts +15 -0
- package/dist/html/gif.d.ts.map +1 -0
- package/dist/html/gif.js +229 -0
- package/dist/html/gif.js.map +1 -0
- package/dist/html/index.d.ts +50 -11
- package/dist/html/index.d.ts.map +1 -1
- package/dist/html/index.js +115 -9
- package/dist/html/index.js.map +1 -1
- package/dist/html/layout/block.d.ts +226 -3
- package/dist/html/layout/block.d.ts.map +1 -1
- package/dist/html/layout/block.js +3077 -219
- package/dist/html/layout/block.js.map +1 -1
- package/dist/html/layout/boxes.d.ts +367 -17
- package/dist/html/layout/boxes.d.ts.map +1 -1
- package/dist/html/layout/boxes.js +1742 -182
- package/dist/html/layout/boxes.js.map +1 -1
- package/dist/html/layout/cache.d.ts +58 -0
- package/dist/html/layout/cache.d.ts.map +1 -0
- package/dist/html/layout/cache.js +224 -0
- package/dist/html/layout/cache.js.map +1 -0
- package/dist/html/layout/collapse.d.ts +45 -0
- package/dist/html/layout/collapse.d.ts.map +1 -0
- package/dist/html/layout/collapse.js +246 -0
- package/dist/html/layout/collapse.js.map +1 -0
- package/dist/html/layout/css-grid.d.ts +7 -0
- package/dist/html/layout/css-grid.d.ts.map +1 -0
- package/dist/html/layout/css-grid.js +900 -0
- package/dist/html/layout/css-grid.js.map +1 -0
- package/dist/html/layout/flex.d.ts.map +1 -1
- package/dist/html/layout/flex.js +1025 -89
- package/dist/html/layout/flex.js.map +1 -1
- package/dist/html/layout/floats.d.ts +45 -6
- package/dist/html/layout/floats.d.ts.map +1 -1
- package/dist/html/layout/floats.js +113 -14
- package/dist/html/layout/floats.js.map +1 -1
- package/dist/html/layout/grid-lines.d.ts +39 -0
- package/dist/html/layout/grid-lines.d.ts.map +1 -0
- package/dist/html/layout/grid-lines.js +119 -0
- package/dist/html/layout/grid-lines.js.map +1 -0
- package/dist/html/layout/grid.d.ts +53 -0
- package/dist/html/layout/grid.d.ts.map +1 -0
- package/dist/html/layout/grid.js +153 -0
- package/dist/html/layout/grid.js.map +1 -0
- package/dist/html/layout/inline.d.ts +154 -1
- package/dist/html/layout/inline.d.ts.map +1 -1
- package/dist/html/layout/inline.js +3598 -175
- package/dist/html/layout/inline.js.map +1 -1
- package/dist/html/layout/shaping.d.ts +6 -0
- package/dist/html/layout/shaping.d.ts.map +1 -0
- package/dist/html/layout/shaping.js +100 -0
- package/dist/html/layout/shaping.js.map +1 -0
- package/dist/html/layout/table.d.ts +3 -0
- package/dist/html/layout/table.d.ts.map +1 -1
- package/dist/html/layout/table.js +681 -175
- package/dist/html/layout/table.js.map +1 -1
- package/dist/html/layout/tracks.d.ts +44 -0
- package/dist/html/layout/tracks.d.ts.map +1 -0
- package/dist/html/layout/tracks.js +349 -0
- package/dist/html/layout/tracks.js.map +1 -0
- package/dist/html/node.d.ts +169 -4
- package/dist/html/node.d.ts.map +1 -1
- package/dist/html/node.js +1429 -137
- package/dist/html/node.js.map +1 -1
- package/dist/html/paint.d.ts +92 -3
- package/dist/html/paint.d.ts.map +1 -1
- package/dist/html/paint.js +3635 -107
- package/dist/html/paint.js.map +1 -1
- package/dist/html/resources.d.ts +60 -14
- package/dist/html/resources.d.ts.map +1 -1
- package/dist/html/resources.js +122 -36
- package/dist/html/resources.js.map +1 -1
- package/dist/html/surfaces.d.ts +23 -0
- package/dist/html/surfaces.d.ts.map +1 -0
- package/dist/html/surfaces.js +68 -0
- package/dist/html/surfaces.js.map +1 -0
- package/dist/html/svg.d.ts +80 -0
- package/dist/html/svg.d.ts.map +1 -0
- package/dist/html/svg.js +442 -0
- package/dist/html/svg.js.map +1 -0
- package/dist/html/url.d.ts +23 -0
- package/dist/html/url.d.ts.map +1 -0
- package/dist/html/url.js +80 -0
- package/dist/html/url.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/codelines.d.ts +42 -0
- package/dist/internal/codelines.d.ts.map +1 -0
- package/dist/internal/codelines.js +170 -0
- package/dist/internal/codelines.js.map +1 -0
- package/dist/internal/collate.d.ts +3 -0
- package/dist/internal/collate.d.ts.map +1 -0
- package/dist/internal/collate.js +11 -0
- package/dist/internal/collate.js.map +1 -0
- package/dist/internal/markdown/ast.d.ts +11 -0
- package/dist/internal/markdown/ast.d.ts.map +1 -1
- package/dist/internal/markdown/parse.d.ts.map +1 -1
- package/dist/internal/markdown/parse.js +109 -8
- package/dist/internal/markdown/parse.js.map +1 -1
- package/dist/internal/prewarm.d.ts +18 -0
- package/dist/internal/prewarm.d.ts.map +1 -0
- package/dist/internal/prewarm.js +42 -0
- package/dist/internal/prewarm.js.map +1 -0
- package/dist/internal/sdf.d.ts +20 -0
- package/dist/internal/sdf.d.ts.map +1 -0
- package/dist/internal/sdf.js +216 -0
- package/dist/internal/sdf.js.map +1 -0
- package/dist/internal/splice.d.ts +12 -0
- package/dist/internal/splice.d.ts.map +1 -0
- package/dist/internal/splice.js +23 -0
- package/dist/internal/splice.js.map +1 -0
- package/dist/internal/window.d.ts +12 -0
- package/dist/internal/window.d.ts.map +1 -1
- package/dist/internal/window.js +23 -6
- package/dist/internal/window.js.map +1 -1
- package/dist/maps/anchors.d.ts +6 -1
- package/dist/maps/anchors.d.ts.map +1 -1
- package/dist/maps/anchors.js +260 -1
- package/dist/maps/anchors.js.map +1 -1
- package/dist/maps/controller.d.ts +57 -0
- package/dist/maps/controller.d.ts.map +1 -1
- package/dist/maps/controller.js +97 -18
- package/dist/maps/controller.js.map +1 -1
- package/dist/maps/gl/buckets.d.ts +5 -1
- package/dist/maps/gl/buckets.d.ts.map +1 -1
- package/dist/maps/gl/buckets.js +5 -2
- package/dist/maps/gl/buckets.js.map +1 -1
- package/dist/maps/gl/build-worker.d.ts +2 -0
- package/dist/maps/gl/build-worker.d.ts.map +1 -1
- package/dist/maps/gl/build-worker.js +1 -1
- package/dist/maps/gl/build-worker.js.map +1 -1
- package/dist/maps/gl/cover.d.ts +23 -4
- package/dist/maps/gl/cover.d.ts.map +1 -1
- package/dist/maps/gl/cover.js +61 -48
- package/dist/maps/gl/cover.js.map +1 -1
- package/dist/maps/gl/placement.d.ts +21 -8
- package/dist/maps/gl/placement.d.ts.map +1 -1
- package/dist/maps/gl/placement.js +133 -58
- package/dist/maps/gl/placement.js.map +1 -1
- package/dist/maps/gl/renderer.d.ts +36 -4
- package/dist/maps/gl/renderer.d.ts.map +1 -1
- package/dist/maps/gl/renderer.js +81 -24
- package/dist/maps/gl/renderer.js.map +1 -1
- package/dist/maps/gl/shaders.d.ts +18 -17
- package/dist/maps/gl/shaders.d.ts.map +1 -1
- package/dist/maps/gl/shaders.js +34 -32
- package/dist/maps/gl/shaders.js.map +1 -1
- package/dist/maps/gl/store.d.ts +10 -0
- package/dist/maps/gl/store.d.ts.map +1 -1
- package/dist/maps/gl/store.js +47 -4
- package/dist/maps/gl/store.js.map +1 -1
- package/dist/maps/gl/text.d.ts +153 -24
- package/dist/maps/gl/text.d.ts.map +1 -1
- package/dist/maps/gl/text.js +379 -63
- package/dist/maps/gl/text.js.map +1 -1
- package/dist/maps/gl/view.d.ts +293 -2
- package/dist/maps/gl/view.d.ts.map +1 -1
- package/dist/maps/gl/view.js +317 -82
- package/dist/maps/gl/view.js.map +1 -1
- package/dist/maps/icons.d.ts +32 -0
- package/dist/maps/icons.d.ts.map +1 -0
- package/dist/maps/icons.js +151 -0
- package/dist/maps/icons.js.map +1 -0
- package/dist/maps/index.d.ts +2 -0
- package/dist/maps/index.d.ts.map +1 -1
- package/dist/maps/index.js +2 -0
- package/dist/maps/index.js.map +1 -1
- package/dist/maps/labels.d.ts +56 -4
- package/dist/maps/labels.d.ts.map +1 -1
- package/dist/maps/labels.js +213 -46
- package/dist/maps/labels.js.map +1 -1
- package/dist/maps/node.d.ts +17 -0
- package/dist/maps/node.d.ts.map +1 -1
- package/dist/maps/node.js +64 -30
- package/dist/maps/node.js.map +1 -1
- package/dist/maps/proj.d.ts +48 -0
- package/dist/maps/proj.d.ts.map +1 -1
- package/dist/maps/proj.js +73 -0
- package/dist/maps/proj.js.map +1 -1
- package/dist/maps/sources.d.ts +5 -3
- package/dist/maps/sources.d.ts.map +1 -1
- package/dist/maps/sources.js +5 -3
- package/dist/maps/sources.js.map +1 -1
- package/dist/maps/style.d.ts +35 -0
- package/dist/maps/style.d.ts.map +1 -1
- package/dist/maps/style.js.map +1 -1
- package/dist/maps/styles.d.ts +12 -0
- package/dist/maps/styles.d.ts.map +1 -1
- package/dist/maps/styles.js +120 -6
- package/dist/maps/styles.js.map +1 -1
- package/dist/maps/tiles.d.ts +31 -11
- package/dist/maps/tiles.d.ts.map +1 -1
- package/dist/maps/tiles.js +61 -27
- package/dist/maps/tiles.js.map +1 -1
- package/dist/maps/types.d.ts +28 -4
- package/dist/maps/types.d.ts.map +1 -1
- package/dist/markdown/index.d.ts.map +1 -1
- package/dist/markdown/index.js +209 -68
- package/dist/markdown/index.js.map +1 -1
- package/dist/markdown/spans.d.ts.map +1 -1
- package/dist/markdown/spans.js +6 -0
- package/dist/markdown/spans.js.map +1 -1
- package/dist/qml/containers.d.ts.map +1 -1
- package/dist/qml/containers.js +6 -1
- package/dist/qml/containers.js.map +1 -1
- package/dist/qml/interaction.d.ts.map +1 -1
- package/dist/qml/interaction.js +38 -5
- package/dist/qml/interaction.js.map +1 -1
- package/dist/qml/layouts.d.ts.map +1 -1
- package/dist/qml/layouts.js +21 -6
- package/dist/qml/layouts.js.map +1 -1
- package/dist/qml/qtquick.d.ts.map +1 -1
- package/dist/qml/qtquick.js +9 -2
- package/dist/qml/qtquick.js.map +1 -1
- package/dist/qml/react.d.ts.map +1 -1
- package/dist/qml/react.js +9 -7
- package/dist/qml/react.js.map +1 -1
- package/dist/reorder/clock.d.ts +7 -0
- package/dist/reorder/clock.d.ts.map +1 -0
- package/dist/reorder/clock.js +26 -0
- package/dist/reorder/clock.js.map +1 -0
- package/dist/reorder/index.d.ts +25 -3
- package/dist/reorder/index.d.ts.map +1 -1
- package/dist/reorder/index.js +64 -19
- package/dist/reorder/index.js.map +1 -1
- package/dist/rich-text-editor/index.d.ts +0 -11
- package/dist/rich-text-editor/index.d.ts.map +1 -1
- package/dist/rich-text-editor/index.js +38 -9
- package/dist/rich-text-editor/index.js.map +1 -1
- package/dist/rich-text-editor/keymap.d.ts.map +1 -1
- package/dist/rich-text-editor/keymap.js +2 -1
- package/dist/rich-text-editor/keymap.js.map +1 -1
- package/dist/rich-text-editor/keys.d.ts +17 -6
- package/dist/rich-text-editor/keys.d.ts.map +1 -1
- package/dist/rich-text-editor/keys.js +135 -26
- package/dist/rich-text-editor/keys.js.map +1 -1
- package/dist/rich-text-editor/markdown.d.ts.map +1 -1
- package/dist/rich-text-editor/markdown.js +30 -1
- package/dist/rich-text-editor/markdown.js.map +1 -1
- package/dist/rich-text-editor/marks.d.ts +9 -0
- package/dist/rich-text-editor/marks.d.ts.map +1 -0
- package/dist/rich-text-editor/marks.js +83 -0
- package/dist/rich-text-editor/marks.js.map +1 -0
- package/dist/rich-text-editor/render.d.ts.map +1 -1
- package/dist/rich-text-editor/render.js +28 -10
- package/dist/rich-text-editor/render.js.map +1 -1
- package/dist/rich-text-editor/replace.d.ts +13 -0
- package/dist/rich-text-editor/replace.d.ts.map +1 -0
- package/dist/rich-text-editor/replace.js +64 -0
- package/dist/rich-text-editor/replace.js.map +1 -0
- package/dist/rich-text-editor/toolbar.d.ts.map +1 -1
- package/dist/rich-text-editor/toolbar.js +1 -1
- package/dist/rich-text-editor/toolbar.js.map +1 -1
- package/dist/rich-text-editor/virtual.d.ts.map +1 -1
- package/dist/rich-text-editor/virtual.js +17 -0
- package/dist/rich-text-editor/virtual.js.map +1 -1
- package/dist/richtext/node.d.ts +46 -2
- package/dist/richtext/node.d.ts.map +1 -1
- package/dist/richtext/node.js +187 -4
- package/dist/richtext/node.js.map +1 -1
- package/dist/richtext/runs.d.ts +13 -8
- package/dist/richtext/runs.d.ts.map +1 -1
- package/dist/richtext/runs.js +18 -8
- package/dist/richtext/runs.js.map +1 -1
- package/dist/table/index.d.ts.map +1 -1
- package/dist/table/index.js +23 -0
- package/dist/table/index.js.map +1 -1
- package/dist/table/rows.d.ts +3 -2
- package/dist/table/rows.d.ts.map +1 -1
- package/dist/table/rows.js +20 -6
- package/dist/table/rows.js.map +1 -1
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +4 -0
- package/dist/terminal/index.js.map +1 -1
- package/dist/terminal/vt/pty.d.ts +13 -2
- package/dist/terminal/vt/pty.d.ts.map +1 -1
- package/dist/terminal/vt/pty.js +18 -3
- package/dist/terminal/vt/pty.js.map +1 -1
- package/dist/terminal-output/index.d.ts.map +1 -1
- package/dist/terminal-output/index.js +103 -23
- package/dist/terminal-output/index.js.map +1 -1
- package/dist/terminal-output/runs.d.ts +4 -1
- package/dist/terminal-output/runs.d.ts.map +1 -1
- package/dist/terminal-output/runs.js +5 -1
- package/dist/terminal-output/runs.js.map +1 -1
- package/dist/three/canvas.d.ts.map +1 -1
- package/dist/three/canvas.js +85 -7
- package/dist/three/canvas.js.map +1 -1
- package/dist/three/events.d.ts +22 -4
- package/dist/three/events.d.ts.map +1 -1
- package/dist/three/events.js +34 -4
- package/dist/three/events.js.map +1 -1
- package/dist/tree/index.d.ts.map +1 -1
- package/dist/tree/index.js +17 -0
- package/dist/tree/index.js.map +1 -1
- package/package.json +42 -33
- package/src/charts/node.ts +62 -26
- package/src/charts/render.ts +120 -30
- package/src/code/index.ts +36 -32
- package/src/code-editor/completion.ts +3 -2
- package/src/code-editor/index.ts +19 -0
- package/src/code-editor/node.ts +1574 -184
- package/src/code-language/index.ts +1 -1
- package/src/code-language/languages/glsl.ts +12 -2
- package/src/code-language/languages/javascript.ts +21 -4
- package/src/code-language/languages/json.ts +12 -2
- package/src/code-language/languages/shell.ts +12 -2
- package/src/code-language/languages/sql.ts +22 -2
- package/src/code-language/runs.ts +111 -1
- package/src/code-language/stream.ts +257 -17
- package/src/code-language/types.ts +5 -4
- package/src/codeblock/index.ts +68 -4
- package/src/flow/draw.ts +167 -41
- package/src/flow/gl/color.ts +85 -0
- package/src/flow/gl/index.ts +342 -0
- package/src/flow/gl/pack.ts +585 -0
- package/src/flow/gl/renderer.ts +679 -0
- package/src/flow/gl/shaders.ts +371 -0
- package/src/flow/gl/text.ts +1295 -0
- package/src/flow/index.ts +794 -67
- package/src/flow/node.ts +2496 -1256
- package/src/flow/paint.ts +511 -0
- package/src/flow/paths.ts +80 -15
- package/src/flow/scene.ts +2199 -0
- package/src/flow/types.ts +113 -1
- package/src/html/controls.ts +73 -2
- package/src/html/css/calc.ts +385 -0
- package/src/html/css/cascade.ts +1481 -62
- package/src/html/css/color.ts +755 -0
- package/src/html/css/content.ts +417 -0
- package/src/html/css/counter-styles.ts +973 -0
- package/src/html/css/decode.ts +130 -0
- package/src/html/css/parse.ts +1514 -160
- package/src/html/css/style.ts +4131 -223
- package/src/html/css/ua.ts +66 -17
- package/src/html/css/values.ts +150 -50
- package/src/html/css/vars.ts +348 -0
- package/src/html/dom.ts +284 -17
- package/src/html/fonts.ts +641 -0
- package/src/html/gif.ts +233 -0
- package/src/html/index.ts +180 -20
- package/src/html/layout/block.ts +3560 -208
- package/src/html/layout/boxes.ts +2141 -190
- package/src/html/layout/cache.ts +289 -0
- package/src/html/layout/collapse.ts +317 -0
- package/src/html/layout/css-grid.ts +1063 -0
- package/src/html/layout/flex.ts +1115 -106
- package/src/html/layout/floats.ts +128 -14
- package/src/html/layout/grid-lines.ts +141 -0
- package/src/html/layout/grid.ts +181 -0
- package/src/html/layout/inline.ts +4187 -192
- package/src/html/layout/shaping.ts +140 -0
- package/src/html/layout/table.ts +696 -186
- package/src/html/layout/tracks.ts +437 -0
- package/src/html/node.ts +1585 -156
- package/src/html/paint.ts +4582 -267
- package/src/html/resources.ts +161 -50
- package/src/html/surfaces.ts +81 -0
- package/src/html/svg.ts +504 -0
- package/src/html/url.ts +86 -0
- package/src/index.ts +2 -0
- package/src/internal/codelines.ts +200 -0
- package/src/internal/collate.ts +12 -0
- package/src/internal/markdown/ast.ts +11 -0
- package/src/internal/markdown/parse.ts +154 -11
- package/src/internal/prewarm.ts +45 -0
- package/src/internal/sdf.ts +227 -0
- package/src/internal/splice.ts +25 -0
- package/src/internal/window.ts +36 -5
- package/src/maps/anchors.ts +307 -1
- package/src/maps/controller.ts +116 -31
- package/src/maps/gl/buckets.ts +5 -1
- package/src/maps/gl/build-worker.ts +13 -2
- package/src/maps/gl/cover.ts +79 -44
- package/src/maps/gl/placement.ts +221 -69
- package/src/maps/gl/renderer.ts +104 -20
- package/src/maps/gl/shaders.ts +35 -32
- package/src/maps/gl/store.ts +66 -17
- package/src/maps/gl/text.ts +444 -71
- package/src/maps/gl/view.ts +361 -96
- package/src/maps/icons.ts +183 -0
- package/src/maps/index.ts +4 -0
- package/src/maps/labels.ts +269 -49
- package/src/maps/node.ts +82 -49
- package/src/maps/proj.ts +87 -0
- package/src/maps/sources.ts +5 -3
- package/src/maps/style.ts +32 -0
- package/src/maps/styles.ts +215 -4
- package/src/maps/tiles.ts +64 -31
- package/src/maps/types.ts +28 -4
- package/src/markdown/index.ts +293 -92
- package/src/markdown/spans.ts +5 -0
- package/src/qml/containers.tsx +6 -1
- package/src/qml/interaction.tsx +42 -5
- package/src/qml/layouts.tsx +21 -6
- package/src/qml/qtquick.tsx +9 -2
- package/src/qml/react.tsx +7 -5
- package/src/reorder/clock.ts +27 -0
- package/src/reorder/index.ts +100 -27
- package/src/rich-text-editor/index.ts +37 -12
- package/src/rich-text-editor/keymap.ts +1 -1
- package/src/rich-text-editor/keys.ts +135 -26
- package/src/rich-text-editor/markdown.ts +36 -1
- package/src/rich-text-editor/marks.ts +101 -0
- package/src/rich-text-editor/render.ts +49 -12
- package/src/rich-text-editor/replace.ts +85 -0
- package/src/rich-text-editor/toolbar.ts +1 -1
- package/src/rich-text-editor/virtual.ts +25 -0
- package/src/richtext/node.ts +235 -14
- package/src/richtext/runs.ts +23 -12
- package/src/table/index.ts +29 -0
- package/src/table/rows.ts +18 -8
- package/src/terminal/index.ts +4 -0
- package/src/terminal/vt/pty.ts +16 -2
- package/src/terminal-output/index.ts +129 -31
- package/src/terminal-output/runs.ts +16 -2
- package/src/three/canvas.ts +102 -8
- package/src/three/events.ts +49 -9
- package/src/tree/index.ts +19 -0
package/src/html/svg.ts
ADDED
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
// SVG, drawn.
|
|
2
|
+
//
|
|
3
|
+
// An inline `<svg>` and an SVG image are drawn by ntk's `SvgView`, over the
|
|
4
|
+
// same 2d context as the rest of the document — the drawing core's own
|
|
5
|
+
// `<svg>` element uses. It is reached through `react-x11/ntk`, which
|
|
6
|
+
// re-exports ntk whole: `SvgView` is a runtime export the subpath's
|
|
7
|
+
// declarations do not name, so it is read off the namespace and probed, the
|
|
8
|
+
// way `resources.ts` reaches `decodeImage`. Without it an SVG is a box of its
|
|
9
|
+
// size with nothing drawn in it, which is what it was before.
|
|
10
|
+
//
|
|
11
|
+
// What is here is the part CSS and SVG own between them: an SVG's intrinsic
|
|
12
|
+
// width, height and ratio, which size its box (CSS 2.1 10.3.2, SVG 2's
|
|
13
|
+
// intrinsic sizing), and its viewport — the `viewBox` scaled into the box
|
|
14
|
+
// as `preserveAspectRatio` says, and clipped to it.
|
|
15
|
+
import { parseDocument } from 'htmlparser2';
|
|
16
|
+
import { Element, Text } from 'domhandler';
|
|
17
|
+
import type { ChildNode } from 'domhandler';
|
|
18
|
+
import * as ntk from 'react-x11/ntk';
|
|
19
|
+
import { isSvgRoot } from './dom.js';
|
|
20
|
+
import { inkColor, isTransparent, parseColor } from './css/values.js';
|
|
21
|
+
|
|
22
|
+
export { isSvgRoot };
|
|
23
|
+
|
|
24
|
+
/** What an image says about its own size, in CSS pixels: a width and a
|
|
25
|
+
* height — a raster image always has both, an SVG those that are absolute
|
|
26
|
+
* lengths — and its ratio, width over height, or 0 where it has none. */
|
|
27
|
+
export interface IntrinsicSize {
|
|
28
|
+
width: number | null;
|
|
29
|
+
height: number | null;
|
|
30
|
+
ratio: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function svgAttr(el: Element, name: string): string | undefined {
|
|
34
|
+
// an XML parse keeps SVG's camelCase, an HTML one lowercases it
|
|
35
|
+
return el.attribs[name] ?? el.attribs[name.toLowerCase()];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** CSS pixels per unit, for the absolute units. */
|
|
39
|
+
const ABSOLUTE: Record<string, number> = {
|
|
40
|
+
'': 1,
|
|
41
|
+
px: 1,
|
|
42
|
+
pt: 4 / 3,
|
|
43
|
+
pc: 16,
|
|
44
|
+
in: 96,
|
|
45
|
+
cm: 96 / 2.54,
|
|
46
|
+
mm: 96 / 25.4,
|
|
47
|
+
q: 96 / 101.6,
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const LENGTH = /^\s*([+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?)\s*([a-z]*)\s*$/i;
|
|
51
|
+
|
|
52
|
+
/** An SVG `width` or `height` in CSS pixels, where it is an absolute length.
|
|
53
|
+
* A percentage, `auto` and anything unparseable are no length at all, and
|
|
54
|
+
* a negative one is an error, which is the same. */
|
|
55
|
+
function absoluteLength(
|
|
56
|
+
value: string | undefined,
|
|
57
|
+
fontSize: number,
|
|
58
|
+
): number | null {
|
|
59
|
+
if (value === undefined) return null;
|
|
60
|
+
const m = LENGTH.exec(value);
|
|
61
|
+
if (!m) return null;
|
|
62
|
+
const n = parseFloat(m[1]);
|
|
63
|
+
const unit = m[2].toLowerCase();
|
|
64
|
+
let px: number;
|
|
65
|
+
if (unit in ABSOLUTE) px = n * ABSOLUTE[unit];
|
|
66
|
+
else if (unit === 'em') px = n * fontSize;
|
|
67
|
+
else if (unit === 'ex') px = (n * fontSize) / 2;
|
|
68
|
+
else return null;
|
|
69
|
+
return px >= 0 ? px : null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* The `width`/`height` of an inline `<svg>` as CSS: they are presentation
|
|
74
|
+
* attributes for the properties of the same names (SVG 2, 5.1.1), so
|
|
75
|
+
* `height="50%"` is a percentage of the containing block like a style's.
|
|
76
|
+
* A bare number is pixels; null for what CSS would not parse.
|
|
77
|
+
*/
|
|
78
|
+
export function svgSizeHint(value: string): string | null {
|
|
79
|
+
const v = value.trim();
|
|
80
|
+
if (/^[+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?%$/i.test(v)) return v;
|
|
81
|
+
const m = LENGTH.exec(v);
|
|
82
|
+
if (!m) return null;
|
|
83
|
+
return m[2] ? v : `${parseFloat(m[1])}px`;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function viewBoxParts(el: Element): [number, number, number, number] | null {
|
|
87
|
+
const parts = (svgAttr(el, 'viewBox') ?? '')
|
|
88
|
+
.trim()
|
|
89
|
+
.split(/[\s,]+/)
|
|
90
|
+
.map(Number);
|
|
91
|
+
if (parts.length !== 4 || !parts.every(Number.isFinite)) return null;
|
|
92
|
+
return [parts[0], parts[1], parts[2], parts[3]];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function viewBoxOf(el: Element): [number, number, number, number] | null {
|
|
96
|
+
const parts = viewBoxParts(el);
|
|
97
|
+
// a zero or negative extent: as though there were none (see `drawsNothing`)
|
|
98
|
+
return parts && parts[2] > 0 && parts[3] > 0 ? parts : null;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Whether a `viewBox` with a zero width or height disables the drawing,
|
|
102
|
+
* as SVG has it: a negative one is an error and as though there were no
|
|
103
|
+
* `viewBox`, but a zero one is a drawing of nothing. */
|
|
104
|
+
function drawsNothing(el: Element): boolean {
|
|
105
|
+
const parts = viewBoxParts(el);
|
|
106
|
+
return (
|
|
107
|
+
parts !== null &&
|
|
108
|
+
parts[2] >= 0 &&
|
|
109
|
+
parts[3] >= 0 &&
|
|
110
|
+
(parts[2] === 0 || parts[3] === 0)
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* An SVG root's intrinsic size and ratio (SVG 2, "Intrinsic sizing
|
|
116
|
+
* properties of the viewport of SVG images"): its `width` and `height` where
|
|
117
|
+
* they are absolute, and a ratio from those two, or else from its `viewBox`.
|
|
118
|
+
* `fontSize` is what an `em` in them is, in CSS pixels.
|
|
119
|
+
*/
|
|
120
|
+
export function svgIntrinsics(el: Element, fontSize = 16): IntrinsicSize {
|
|
121
|
+
const width = absoluteLength(svgAttr(el, 'width'), fontSize);
|
|
122
|
+
const height = absoluteLength(svgAttr(el, 'height'), fontSize);
|
|
123
|
+
let ratio = 0;
|
|
124
|
+
if (width !== null && height !== null && width > 0 && height > 0) {
|
|
125
|
+
ratio = width / height;
|
|
126
|
+
} else {
|
|
127
|
+
const box = viewBoxOf(el);
|
|
128
|
+
if (box) ratio = box[2] / box[3];
|
|
129
|
+
}
|
|
130
|
+
return { width, height, ratio };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** The slice of ntk's `SvgView` this draws with. */
|
|
134
|
+
interface SvgViewLike {
|
|
135
|
+
naturalWidth: number;
|
|
136
|
+
naturalHeight: number;
|
|
137
|
+
setSvgDom(element: Element): unknown;
|
|
138
|
+
draw(
|
|
139
|
+
ctx: unknown,
|
|
140
|
+
x: number,
|
|
141
|
+
y: number,
|
|
142
|
+
w: number,
|
|
143
|
+
h: number,
|
|
144
|
+
opts?: { color?: string },
|
|
145
|
+
): void;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
type SvgViewConstructor = new (window: null) => SvgViewLike;
|
|
149
|
+
|
|
150
|
+
function svgViewClass(): SvgViewConstructor | null {
|
|
151
|
+
const ctor = (ntk as unknown as Record<string, unknown>).SvgView;
|
|
152
|
+
return typeof ctor === 'function' ? (ctor as SvgViewConstructor) : null;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** The context slice an SVG needs besides what `SvgView` itself calls. */
|
|
156
|
+
interface ClipContext {
|
|
157
|
+
save(): void;
|
|
158
|
+
restore(): void;
|
|
159
|
+
beginPath?(): void;
|
|
160
|
+
rect?(x: number, y: number, w: number, h: number): void;
|
|
161
|
+
clip?(): void;
|
|
162
|
+
fill?: unknown;
|
|
163
|
+
fillStyle?: unknown;
|
|
164
|
+
fillRect?(x: number, y: number, w: number, h: number): void;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const ALIGN = /^x(Min|Mid|Max)Y(Min|Mid|Max)$/;
|
|
168
|
+
const AT: Record<string, number> = { Min: 0, Mid: 0.5, Max: 1 };
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* One SVG drawing: an inline `<svg>` element, or an SVG image's document.
|
|
172
|
+
* The `SvgView` is made at the first draw, so a document whose drawings are
|
|
173
|
+
* never scrolled to never pays for them.
|
|
174
|
+
*/
|
|
175
|
+
export class SvgDrawing {
|
|
176
|
+
readonly intrinsics: IntrinsicSize;
|
|
177
|
+
private readonly _root: Element;
|
|
178
|
+
private _view: SvgViewLike | null = null;
|
|
179
|
+
/** What the view was last handed the tree for: the root's child count
|
|
180
|
+
* and last child — a streamed document grows an inline drawing after its
|
|
181
|
+
* first paint — and, for a drawing with percentages in it, the viewport
|
|
182
|
+
* they were resolved against. */
|
|
183
|
+
private _seen = -1;
|
|
184
|
+
private _seenLast: ChildNode | null = null;
|
|
185
|
+
private _seenViewport = '';
|
|
186
|
+
/** Whether a length in the tree is a percentage of the viewport; null
|
|
187
|
+
* until the tree is first read. */
|
|
188
|
+
private _percent: boolean | null = null;
|
|
189
|
+
private _failed = false;
|
|
190
|
+
/** An SVG image's own document, rather than an element of this one. */
|
|
191
|
+
private readonly _standalone: boolean;
|
|
192
|
+
/** The background an image's root gives its canvas; undefined until it
|
|
193
|
+
* is first read. */
|
|
194
|
+
private _canvas: string | null | undefined = undefined;
|
|
195
|
+
|
|
196
|
+
constructor(root: Element, intrinsics: IntrinsicSize, standalone = false) {
|
|
197
|
+
this._root = root;
|
|
198
|
+
this.intrinsics = intrinsics;
|
|
199
|
+
this._standalone = standalone;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Draw into a rectangle — the box's content box, in device pixels —
|
|
204
|
+
* clipped to it. The `viewBox`, where there is one, is fitted to it as
|
|
205
|
+
* `preserveAspectRatio` says; without one a user unit is a CSS pixel,
|
|
206
|
+
* which is `scale` device pixels. `color` is `currentColor`.
|
|
207
|
+
*/
|
|
208
|
+
draw(
|
|
209
|
+
ctx: ClipContext,
|
|
210
|
+
x: number,
|
|
211
|
+
y: number,
|
|
212
|
+
w: number,
|
|
213
|
+
h: number,
|
|
214
|
+
scale: number,
|
|
215
|
+
color?: string,
|
|
216
|
+
): void {
|
|
217
|
+
if (this._failed || !(w > 0 && h > 0)) return;
|
|
218
|
+
// the mock backend has no path API, and SvgView draws paths
|
|
219
|
+
if (!ctx.beginPath || !ctx.rect || !ctx.clip || !ctx.fill) return;
|
|
220
|
+
const root = this._root;
|
|
221
|
+
if (drawsNothing(root)) return;
|
|
222
|
+
if (this._standalone) {
|
|
223
|
+
// the root's background is the canvas's, and an image's canvas is
|
|
224
|
+
// all of the rectangle, wherever its viewport and `viewBox` put the
|
|
225
|
+
// drawing (CSS 2.1 14.2): an inline one's is its box's, painted by
|
|
226
|
+
// the document
|
|
227
|
+
this._canvas ??= canvasBackground(root);
|
|
228
|
+
if (this._canvas && ctx.fillRect) {
|
|
229
|
+
ctx.save();
|
|
230
|
+
ctx.fillStyle = inkColor(this._canvas, color ?? '#000000');
|
|
231
|
+
ctx.fillRect(x, y, w, h);
|
|
232
|
+
ctx.restore();
|
|
233
|
+
}
|
|
234
|
+
// An image's root fills the rectangle it is drawn into, whatever its
|
|
235
|
+
// own `width` and `height` say: they are what its intrinsic size was
|
|
236
|
+
// read from (`svgIntrinsics`), and the rectangle is the concrete size
|
|
237
|
+
// the image was then given — a background's tile, an `<img>`'s box.
|
|
238
|
+
// Blink sizes an SVG embedded as an image to its container the same
|
|
239
|
+
// way. Drawn as two fifths of it, `width="40%"` left the rest of a
|
|
240
|
+
// `background-size: contain` empty. An inline root's percentages are
|
|
241
|
+
// its box's, already (`svgSizeHint`).
|
|
242
|
+
}
|
|
243
|
+
const box = viewBoxOf(root);
|
|
244
|
+
// the viewport in user units, which a percentage is of
|
|
245
|
+
const view = box
|
|
246
|
+
? this._viewFor(box[2], box[3])
|
|
247
|
+
: this._viewFor(w / scale, h / scale);
|
|
248
|
+
if (!view) return;
|
|
249
|
+
ctx.save();
|
|
250
|
+
try {
|
|
251
|
+
ctx.beginPath();
|
|
252
|
+
ctx.rect(x, y, w, h);
|
|
253
|
+
ctx.clip();
|
|
254
|
+
const opts = color ? { color } : undefined;
|
|
255
|
+
if (!box) {
|
|
256
|
+
view.draw(
|
|
257
|
+
ctx,
|
|
258
|
+
x,
|
|
259
|
+
y,
|
|
260
|
+
view.naturalWidth * scale,
|
|
261
|
+
view.naturalHeight * scale,
|
|
262
|
+
opts,
|
|
263
|
+
);
|
|
264
|
+
} else {
|
|
265
|
+
const fit = (svgAttr(root, 'preserveAspectRatio') ?? '')
|
|
266
|
+
.trim()
|
|
267
|
+
.split(/\s+/);
|
|
268
|
+
if (fit[0] === 'defer') fit.shift();
|
|
269
|
+
if (fit[0] === 'none') {
|
|
270
|
+
view.draw(ctx, x, y, w, h, opts);
|
|
271
|
+
} else {
|
|
272
|
+
const align = ALIGN.exec(fit[0] ?? '') ?? ['xMidYMid', 'Mid', 'Mid'];
|
|
273
|
+
const sx = w / box[2];
|
|
274
|
+
const sy = h / box[3];
|
|
275
|
+
const s = fit[1] === 'slice' ? Math.max(sx, sy) : Math.min(sx, sy);
|
|
276
|
+
const dw = box[2] * s;
|
|
277
|
+
const dh = box[3] * s;
|
|
278
|
+
view.draw(
|
|
279
|
+
ctx,
|
|
280
|
+
x + (w - dw) * AT[align[1]],
|
|
281
|
+
y + (h - dh) * AT[align[2]],
|
|
282
|
+
dw,
|
|
283
|
+
dh,
|
|
284
|
+
opts,
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
} catch {
|
|
289
|
+
// a drawing ntk cannot read is left undrawn, once, rather than thrown
|
|
290
|
+
// out of paint on every frame, where nothing could catch it
|
|
291
|
+
this._failed = true;
|
|
292
|
+
} finally {
|
|
293
|
+
ctx.restore();
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
private _viewFor(width: number, height: number): SvgViewLike | null {
|
|
298
|
+
const root = this._root;
|
|
299
|
+
const count = root.children.length;
|
|
300
|
+
const last = root.lastChild;
|
|
301
|
+
const grown = count !== this._seen || last !== this._seenLast;
|
|
302
|
+
if (grown || this._percent === null) this._percent = hasPercent(root);
|
|
303
|
+
const viewport = this._percent ? `${width}x${height}` : '';
|
|
304
|
+
if (this._view && !grown && viewport === this._seenViewport) {
|
|
305
|
+
return this._view;
|
|
306
|
+
}
|
|
307
|
+
const View = svgViewClass();
|
|
308
|
+
if (!View) {
|
|
309
|
+
this._failed = true;
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
try {
|
|
313
|
+
const view = this._view ?? new View(null);
|
|
314
|
+
view.setSvgDom(
|
|
315
|
+
this._percent || root.name.includes(':')
|
|
316
|
+
? copyTree(root, this._percent ? [width, height] : null)
|
|
317
|
+
: root,
|
|
318
|
+
);
|
|
319
|
+
this._view = view;
|
|
320
|
+
this._seen = count;
|
|
321
|
+
this._seenLast = last;
|
|
322
|
+
this._seenViewport = viewport;
|
|
323
|
+
return view;
|
|
324
|
+
} catch {
|
|
325
|
+
this._failed = true;
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* The colour an SVG image's root element sets as its background, in its
|
|
333
|
+
* `style` attribute — the one place an image can say it, since
|
|
334
|
+
* `background-color` is no presentation attribute — or null for none.
|
|
335
|
+
*/
|
|
336
|
+
function canvasBackground(root: Element): string | null {
|
|
337
|
+
const style = root.attribs.style;
|
|
338
|
+
if (!style) return null;
|
|
339
|
+
let found: string | null = null;
|
|
340
|
+
for (const declaration of style.split(';')) {
|
|
341
|
+
const colon = declaration.indexOf(':');
|
|
342
|
+
if (colon < 0) continue;
|
|
343
|
+
const name = declaration.slice(0, colon).trim().toLowerCase();
|
|
344
|
+
if (name !== 'background-color' && name !== 'background') continue;
|
|
345
|
+
// a `background` shorthand that is a colour alone, as an image's is
|
|
346
|
+
const color = parseColor(declaration.slice(colon + 1));
|
|
347
|
+
found = color && !isTransparent(color) ? color : null;
|
|
348
|
+
}
|
|
349
|
+
return found;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/** Drawings of inline `<svg>` elements, per element: the element is the
|
|
353
|
+
* document's, and outlives the box trees built over it. */
|
|
354
|
+
const INLINE = new WeakMap<Element, SvgDrawing>();
|
|
355
|
+
|
|
356
|
+
/** The drawing of an inline `<svg>`. */
|
|
357
|
+
export function inlineDrawing(el: Element): SvgDrawing {
|
|
358
|
+
let drawing = INLINE.get(el);
|
|
359
|
+
if (!drawing) {
|
|
360
|
+
drawing = new SvgDrawing(el, svgIntrinsics(el));
|
|
361
|
+
INLINE.set(el, drawing);
|
|
362
|
+
}
|
|
363
|
+
return drawing;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/** The geometry a percentage of the viewport can give, and of which of its
|
|
367
|
+
* dimensions: its width, its height, or its normalized diagonal (SVG 2,
|
|
368
|
+
* 8.9, "Units"). */
|
|
369
|
+
const PERCENT_OF: Record<string, 'x' | 'y' | 'd'> = {
|
|
370
|
+
x: 'x',
|
|
371
|
+
width: 'x',
|
|
372
|
+
cx: 'x',
|
|
373
|
+
rx: 'x',
|
|
374
|
+
x1: 'x',
|
|
375
|
+
x2: 'x',
|
|
376
|
+
y: 'y',
|
|
377
|
+
height: 'y',
|
|
378
|
+
cy: 'y',
|
|
379
|
+
ry: 'y',
|
|
380
|
+
y1: 'y',
|
|
381
|
+
y2: 'y',
|
|
382
|
+
r: 'd',
|
|
383
|
+
'stroke-width': 'd',
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
/** What a percentage in it means is not the viewport's: a gradient's are
|
|
387
|
+
* of the box it paints, and `SvgView` reads those itself. */
|
|
388
|
+
const OWN_UNITS = new Set(['lineargradient', 'radialgradient', 'pattern']);
|
|
389
|
+
|
|
390
|
+
function localName(name: string): string {
|
|
391
|
+
const i = name.indexOf(':');
|
|
392
|
+
return (i < 0 ? name : name.slice(i + 1)).toLowerCase();
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/** Whether a length under the root is a percentage `SvgView` would read as
|
|
396
|
+
* a number: it resolves none against the viewport, so `width="100%"` was
|
|
397
|
+
* a hundred user units. */
|
|
398
|
+
function hasPercent(root: Element): boolean {
|
|
399
|
+
const walk = (el: Element): boolean => {
|
|
400
|
+
for (const child of el.children) {
|
|
401
|
+
if (child.type !== 'tag') continue;
|
|
402
|
+
const tag = child as Element;
|
|
403
|
+
if (OWN_UNITS.has(localName(tag.name))) continue;
|
|
404
|
+
for (const name in tag.attribs) {
|
|
405
|
+
if (PERCENT_OF[name] && tag.attribs[name].trim().endsWith('%')) {
|
|
406
|
+
return true;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
if (walk(tag)) return true;
|
|
410
|
+
}
|
|
411
|
+
return false;
|
|
412
|
+
};
|
|
413
|
+
return walk(root);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* The tree `SvgView` reads, where the document's own will not do: with
|
|
418
|
+
* local names — `SvgView` knows `rect`, not `svg:rect`, and a prefix is
|
|
419
|
+
* dropped only where it is bound to SVG — and with its percentages resolved
|
|
420
|
+
* against a viewport of `[width, height]` user units, where one is given.
|
|
421
|
+
*/
|
|
422
|
+
function copyTree(root: Element, viewport: [number, number] | null): Element {
|
|
423
|
+
const colon = root.name.indexOf(':');
|
|
424
|
+
const prefix = colon < 0 ? null : `${root.name.slice(0, colon)}:`;
|
|
425
|
+
const strip = (name: string): string =>
|
|
426
|
+
prefix && name.startsWith(prefix) ? name.slice(prefix.length) : name;
|
|
427
|
+
const diagonal = viewport
|
|
428
|
+
? Math.sqrt((viewport[0] ** 2 + viewport[1] ** 2) / 2)
|
|
429
|
+
: 0;
|
|
430
|
+
const copy = (el: Element, resolve: boolean): Element => {
|
|
431
|
+
const here = resolve && !OWN_UNITS.has(localName(el.name));
|
|
432
|
+
const attribs = { ...el.attribs };
|
|
433
|
+
if (here && viewport && el !== root) {
|
|
434
|
+
for (const name in attribs) {
|
|
435
|
+
const axis = PERCENT_OF[name];
|
|
436
|
+
const value = attribs[name].trim();
|
|
437
|
+
if (!axis || !value.endsWith('%')) continue;
|
|
438
|
+
const pct = parseFloat(value);
|
|
439
|
+
if (!Number.isFinite(pct)) continue;
|
|
440
|
+
const of =
|
|
441
|
+
axis === 'x' ? viewport[0] : axis === 'y' ? viewport[1] : diagonal;
|
|
442
|
+
attribs[name] = String((pct / 100) * of);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
const children: ChildNode[] = [];
|
|
446
|
+
for (const child of el.children) {
|
|
447
|
+
if (child.type === 'tag') children.push(copy(child as Element, here));
|
|
448
|
+
else if (child.type === 'text') children.push(new Text(child.data));
|
|
449
|
+
}
|
|
450
|
+
return new Element(strip(el.name), attribs, children);
|
|
451
|
+
};
|
|
452
|
+
return copy(root, true);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* An SVG image's bytes as a drawing, or null for bytes that are not SVG —
|
|
457
|
+
* which is how a PNG or a JPEG goes on to the image decoder. Nothing names
|
|
458
|
+
* the type, so it is sniffed: markup, with an `<svg>` root.
|
|
459
|
+
*/
|
|
460
|
+
export function svgFromBytes(bytes: Uint8Array): SvgDrawing | null {
|
|
461
|
+
let i = bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf ? 3 : 0;
|
|
462
|
+
while (
|
|
463
|
+
bytes[i] === 0x20 ||
|
|
464
|
+
bytes[i] === 0x09 ||
|
|
465
|
+
bytes[i] === 0x0a ||
|
|
466
|
+
bytes[i] === 0x0d
|
|
467
|
+
) {
|
|
468
|
+
i += 1;
|
|
469
|
+
}
|
|
470
|
+
if (bytes[i] !== 0x3c) return null;
|
|
471
|
+
const text = textOf(bytes);
|
|
472
|
+
if (!/<(?:[a-z0-9_-]+:)?svg[\s>/]/i.test(text)) return null;
|
|
473
|
+
try {
|
|
474
|
+
const doc = parseDocument(text, { xmlMode: true });
|
|
475
|
+
const root = findRoot(doc.children);
|
|
476
|
+
return root ? new SvgDrawing(root, svgIntrinsics(root), true) : null;
|
|
477
|
+
} catch {
|
|
478
|
+
return null;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
function findRoot(nodes: ChildNode[]): Element | null {
|
|
483
|
+
for (const node of nodes) {
|
|
484
|
+
if (node.type !== 'tag') continue;
|
|
485
|
+
const el = node as Element;
|
|
486
|
+
if (isSvgRoot(el)) return el;
|
|
487
|
+
const inner = findRoot(el.children);
|
|
488
|
+
if (inner) return inner;
|
|
489
|
+
}
|
|
490
|
+
return null;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
type DecoderConstructor = new (label: string) => {
|
|
494
|
+
decode(input: Uint8Array): string;
|
|
495
|
+
};
|
|
496
|
+
|
|
497
|
+
function textOf(bytes: Uint8Array): string {
|
|
498
|
+
const Decoder = (globalThis as { TextDecoder?: DecoderConstructor })
|
|
499
|
+
.TextDecoder;
|
|
500
|
+
if (Decoder) return new Decoder('utf-8').decode(bytes);
|
|
501
|
+
let out = '';
|
|
502
|
+
for (const b of bytes) out += String.fromCharCode(b);
|
|
503
|
+
return out;
|
|
504
|
+
}
|
package/src/html/url.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// URLs, resolved against a base — when there is one.
|
|
2
|
+
//
|
|
3
|
+
// A document has no base of its own: `<Html>` is handed a string, not a
|
|
4
|
+
// response. The host knows where the string came from, and says so with the
|
|
5
|
+
// `baseUrl` prop; a `<base href>` in the document moves it, as HTML's does.
|
|
6
|
+
// Without either every URL goes to `onResource` and `onLink` exactly as the
|
|
7
|
+
// document wrote it, which is what a host rendering mail or a help page wants
|
|
8
|
+
// and what this component did before it had a base to resolve against.
|
|
9
|
+
//
|
|
10
|
+
// A stylesheet is the other base. `url(../img/a.png)` in `/css/site.css`
|
|
11
|
+
// names `/img/a.png` whichever page linked the sheet, and nothing downstream
|
|
12
|
+
// of the parse knows which sheet a computed value came from — so a sheet
|
|
13
|
+
// whose own URL is known has its `url()`s made absolute as it is parsed
|
|
14
|
+
// (`absoluteUrls` in css/parse.ts), and everything after sees an absolute URL
|
|
15
|
+
// that resolving again leaves as it is.
|
|
16
|
+
//
|
|
17
|
+
// The resolving is WHATWG's, through the runtime's own `URL`: Node, Bun and
|
|
18
|
+
// every browser have one. `types: []` keeps node's declarations out of the
|
|
19
|
+
// build, so it is reached structurally, as `TextDecoder` is in svg.ts.
|
|
20
|
+
|
|
21
|
+
interface UrlLike {
|
|
22
|
+
readonly href: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
type UrlConstructor = new (url: string, base?: string) => UrlLike;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* `url` against `base`, or `url` untouched where there is no base, the
|
|
29
|
+
* runtime has no `URL`, or the pair makes no URL. A `data:` URL is returned
|
|
30
|
+
* as it is rather than put through the parser: it can be a font or an image
|
|
31
|
+
* hundreds of kilobytes long, and it is absolute already.
|
|
32
|
+
*/
|
|
33
|
+
export function resolveUrl(
|
|
34
|
+
url: string,
|
|
35
|
+
base: string | null | undefined,
|
|
36
|
+
): string {
|
|
37
|
+
if (!base) return url;
|
|
38
|
+
// read when asked rather than at import: nothing here runs on load
|
|
39
|
+
const URLClass = (globalThis as { URL?: UrlConstructor }).URL;
|
|
40
|
+
if (!URLClass) return url;
|
|
41
|
+
// HTML strips an attribute's URL of the ASCII white space around it
|
|
42
|
+
const trimmed = url.replace(/^[\t\n\f\r ]+|[\t\n\f\r ]+$/g, '');
|
|
43
|
+
if (/^data:/i.test(trimmed)) return trimmed;
|
|
44
|
+
try {
|
|
45
|
+
return new URLClass(trimmed, base).href;
|
|
46
|
+
} catch {
|
|
47
|
+
return url;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Resolutions against one base, remembered. The paint asks for every image
|
|
53
|
+
* it draws by the URL the markup wrote, on every frame, and a WHATWG parse
|
|
54
|
+
* per image per frame is work for nothing: the answer changes only when the
|
|
55
|
+
* base does, and then the whole memo goes.
|
|
56
|
+
*/
|
|
57
|
+
export class UrlResolver {
|
|
58
|
+
private _base: string | null = null;
|
|
59
|
+
private _memo = new Map<string, string>();
|
|
60
|
+
|
|
61
|
+
get base(): string | null {
|
|
62
|
+
return this._base;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Set the base. True when it changed — everything resolved before is
|
|
66
|
+
* stale then, and so is anything keyed by what it resolved to. */
|
|
67
|
+
setBase(base: string | null): boolean {
|
|
68
|
+
if (base === this._base) return false;
|
|
69
|
+
this._base = base;
|
|
70
|
+
this._memo.clear();
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
resolve(url: string): string {
|
|
75
|
+
if (this._base === null) return url;
|
|
76
|
+
let out = this._memo.get(url);
|
|
77
|
+
if (out === undefined) {
|
|
78
|
+
out = resolveUrl(url, this._base);
|
|
79
|
+
// a document names a bounded number of URLs; a stream of generated
|
|
80
|
+
// ones (a cache-busting query per frame) must not grow this forever
|
|
81
|
+
if (this._memo.size > 4096) this._memo.clear();
|
|
82
|
+
this._memo.set(url, out);
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
}
|