@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/resources.ts
CHANGED
|
@@ -13,35 +13,62 @@
|
|
|
13
13
|
// these requests", which an application cannot audit and a user did not ask
|
|
14
14
|
// for. The host already knows its proxy, its cache, its offline policy and
|
|
15
15
|
// whether this document is trusted; this does not.
|
|
16
|
-
import
|
|
16
|
+
import * as ntk from 'react-x11/ntk';
|
|
17
|
+
import { decodeStylesheet } from './css/decode.js';
|
|
18
|
+
import type { DecodedStylesheet } from './css/decode.js';
|
|
19
|
+
import { svgFromBytes } from './svg.js';
|
|
20
|
+
import type { IntrinsicSize } from './svg.js';
|
|
21
|
+
import { decodeGif } from './gif.js';
|
|
22
|
+
import type { UrlResolver } from './url.js';
|
|
17
23
|
import type { Element } from 'domhandler';
|
|
18
24
|
|
|
19
25
|
/** What the host is asked for. */
|
|
20
26
|
export interface ResourceRequest {
|
|
21
|
-
/**
|
|
22
|
-
*
|
|
27
|
+
/**
|
|
28
|
+
* The URL. As the document wrote it, where the document has no base — no
|
|
29
|
+
* `baseUrl` prop and no `<base href>` — because then this has none and
|
|
30
|
+
* the host does. Absolute where it has one: resolved against the
|
|
31
|
+
* document's base, or, for a `url()` in a stylesheet that came from
|
|
32
|
+
* somewhere, against the stylesheet's own URL, as CSS resolves it.
|
|
33
|
+
*/
|
|
23
34
|
url: string;
|
|
24
|
-
|
|
25
|
-
|
|
35
|
+
/** An `<img>`, an `<object>`, a background or a list marker; a
|
|
36
|
+
* `<link rel=stylesheet>` or an `@import`; an `@font-face` source. */
|
|
37
|
+
kind: 'image' | 'stylesheet' | 'font';
|
|
38
|
+
/** The element that referred to it, for a host that wants the context:
|
|
39
|
+
* for a font, the `<style>` or `<link>` whose sheet declared it. */
|
|
26
40
|
element: Element;
|
|
27
41
|
}
|
|
28
42
|
|
|
29
43
|
/**
|
|
30
|
-
* What the host hands back. A stylesheet is text
|
|
31
|
-
*
|
|
32
|
-
*
|
|
44
|
+
* What the host hands back. A stylesheet is text, or bytes this decodes as
|
|
45
|
+
* CSS says to — with `charset`, the encoding the protocol named, if it named
|
|
46
|
+
* one (`css/decode.ts`) — and may say the URL it finally came from, after
|
|
47
|
+
* redirects, which is what the relative URLs in it resolve against. An image
|
|
48
|
+
* is bytes, which this decodes — PNG, JPEG, GIF or SVG — or an
|
|
49
|
+
* already-decoded ntk `Image` for a host with its own cache. A font is the
|
|
50
|
+
* file's bytes: TrueType, OpenType, WOFF or WOFF2 (see `fonts.ts`).
|
|
33
51
|
*/
|
|
34
52
|
export type ResourceResult =
|
|
35
|
-
| { kind: 'stylesheet'; text: string }
|
|
53
|
+
| { kind: 'stylesheet'; text: string; url?: string }
|
|
54
|
+
| { kind: 'stylesheet'; bytes: Uint8Array; charset?: string; url?: string }
|
|
36
55
|
| { kind: 'image'; bytes: Uint8Array }
|
|
37
|
-
| { kind: 'image'; image: unknown; width: number; height: number }
|
|
56
|
+
| { kind: 'image'; image: unknown; width: number; height: number }
|
|
57
|
+
| { kind: 'font'; bytes: Uint8Array };
|
|
38
58
|
|
|
39
59
|
interface Entry {
|
|
40
60
|
state: 'pending' | 'ready' | 'failed';
|
|
61
|
+
/** A stylesheet's own URL, after redirects, as the host said it. */
|
|
62
|
+
url?: string;
|
|
41
63
|
text?: string;
|
|
64
|
+
/** A stylesheet handed over as bytes, decoded when it is first read: what
|
|
65
|
+
* it falls back to is the referrer's, known only then. */
|
|
66
|
+
bytes?: Uint8Array;
|
|
67
|
+
charset?: string;
|
|
68
|
+
decoded?: { fallbacks: string; sheet: DecodedStylesheet };
|
|
69
|
+
/** An ntk `Image`, or an `SvgDrawing`. */
|
|
42
70
|
image?: unknown;
|
|
43
|
-
|
|
44
|
-
height?: number;
|
|
71
|
+
size?: IntrinsicSize;
|
|
45
72
|
}
|
|
46
73
|
|
|
47
74
|
/** The ntk `Image` slice this uses. Structural, as everywhere else here. */
|
|
@@ -56,32 +83,54 @@ interface ImageConstructor {
|
|
|
56
83
|
new (...args: unknown[]): ImageLike;
|
|
57
84
|
}
|
|
58
85
|
|
|
86
|
+
/**
|
|
87
|
+
* The resources a document asked for, by URL — resolved against the
|
|
88
|
+
* document's base (`url.ts`) on the way in and on every lookup, so a caller
|
|
89
|
+
* names a resource by what the document wrote and the host is asked for,
|
|
90
|
+
* and caches by, what it resolves to.
|
|
91
|
+
*/
|
|
59
92
|
export class ResourceStore {
|
|
60
93
|
private _entries = new Map<string, Entry>();
|
|
61
94
|
private _ask: (
|
|
62
95
|
request: ResourceRequest,
|
|
63
96
|
) => Promise<ResourceResult | null> | ResourceResult | null;
|
|
64
|
-
private _changed: () => void;
|
|
97
|
+
private _changed: (what: 'stylesheet' | 'image') => void;
|
|
98
|
+
private _urls: UrlResolver | null;
|
|
65
99
|
private _destroyed = false;
|
|
66
100
|
|
|
101
|
+
/**
|
|
102
|
+
* `changed` is told when a resource arrives after the request that asked
|
|
103
|
+
* for it returned, and which kind: a stylesheet changes the cascade and an
|
|
104
|
+
* image the boxes, and a host answering over a network answers every one
|
|
105
|
+
* of them later.
|
|
106
|
+
*/
|
|
67
107
|
constructor(
|
|
68
108
|
ask: (
|
|
69
109
|
request: ResourceRequest,
|
|
70
110
|
) => Promise<ResourceResult | null> | ResourceResult | null,
|
|
71
|
-
changed: () => void,
|
|
111
|
+
changed: (what: 'stylesheet' | 'image') => void,
|
|
112
|
+
urls: UrlResolver | null = null,
|
|
72
113
|
) {
|
|
73
114
|
this._ask = ask;
|
|
74
115
|
this._changed = changed;
|
|
116
|
+
this._urls = urls;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** A URL as the document wrote it, as the store keys it. */
|
|
120
|
+
private _key(url: string): string {
|
|
121
|
+
return this._urls ? this._urls.resolve(url) : url;
|
|
75
122
|
}
|
|
76
123
|
|
|
77
124
|
/** Ask for a resource, once per URL. */
|
|
78
125
|
request(request: ResourceRequest): void {
|
|
79
|
-
if (this._destroyed ||
|
|
126
|
+
if (this._destroyed || !request.url) return;
|
|
127
|
+
const url = this._key(request.url);
|
|
128
|
+
if (this._entries.has(url)) return;
|
|
80
129
|
const entry: Entry = { state: 'pending' };
|
|
81
|
-
this._entries.set(
|
|
130
|
+
this._entries.set(url, entry);
|
|
82
131
|
let answer: Promise<ResourceResult | null> | ResourceResult | null;
|
|
83
132
|
try {
|
|
84
|
-
answer = this._ask(request);
|
|
133
|
+
answer = this._ask(url === request.url ? request : { ...request, url });
|
|
85
134
|
} catch {
|
|
86
135
|
entry.state = 'failed';
|
|
87
136
|
return;
|
|
@@ -92,14 +141,14 @@ export class ResourceStore {
|
|
|
92
141
|
}
|
|
93
142
|
if (isPromise(answer)) {
|
|
94
143
|
answer.then(
|
|
95
|
-
(result) => this._settle(
|
|
144
|
+
(result) => this._settle(url, entry, result),
|
|
96
145
|
() => {
|
|
97
146
|
entry.state = 'failed';
|
|
98
147
|
},
|
|
99
148
|
);
|
|
100
149
|
return;
|
|
101
150
|
}
|
|
102
|
-
this._settle(
|
|
151
|
+
this._settle(url, entry, answer, true);
|
|
103
152
|
}
|
|
104
153
|
|
|
105
154
|
private _settle(
|
|
@@ -109,23 +158,36 @@ export class ResourceStore {
|
|
|
109
158
|
synchronous = false,
|
|
110
159
|
): void {
|
|
111
160
|
if (this._destroyed) return;
|
|
112
|
-
|
|
113
|
-
if (!result) {
|
|
161
|
+
// a font is `fonts.ts`'s to ask for, and never comes through here
|
|
162
|
+
if (!result || result.kind === 'font') {
|
|
114
163
|
entry.state = 'failed';
|
|
115
164
|
return;
|
|
116
165
|
}
|
|
117
166
|
if (result.kind === 'stylesheet') {
|
|
118
|
-
entry.
|
|
167
|
+
entry.url = result.url || url;
|
|
168
|
+
if ('bytes' in result) {
|
|
169
|
+
entry.bytes = result.bytes;
|
|
170
|
+
entry.charset = result.charset;
|
|
171
|
+
} else {
|
|
172
|
+
entry.text = result.text;
|
|
173
|
+
}
|
|
119
174
|
entry.state = 'ready';
|
|
120
|
-
if (!synchronous) this._changed();
|
|
175
|
+
if (!synchronous) this._changed('stylesheet');
|
|
121
176
|
return;
|
|
122
177
|
}
|
|
123
178
|
if ('image' in result) {
|
|
124
179
|
entry.image = result.image;
|
|
125
|
-
entry.
|
|
126
|
-
entry.height = result.height;
|
|
180
|
+
entry.size = rasterSize(result.width, result.height);
|
|
127
181
|
entry.state = 'ready';
|
|
128
|
-
if (!synchronous) this._changed();
|
|
182
|
+
if (!synchronous) this._changed('image');
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const svg = svgFromBytes(result.bytes);
|
|
186
|
+
if (svg) {
|
|
187
|
+
entry.image = svg;
|
|
188
|
+
entry.size = svg.intrinsics;
|
|
189
|
+
entry.state = 'ready';
|
|
190
|
+
if (!synchronous) this._changed('image');
|
|
129
191
|
return;
|
|
130
192
|
}
|
|
131
193
|
const decoded = decodeImage(result.bytes);
|
|
@@ -134,10 +196,9 @@ export class ResourceStore {
|
|
|
134
196
|
(image) => {
|
|
135
197
|
if (this._destroyed) return;
|
|
136
198
|
entry.image = image;
|
|
137
|
-
entry.
|
|
138
|
-
entry.height = image.height;
|
|
199
|
+
entry.size = rasterSize(image.width, image.height);
|
|
139
200
|
entry.state = 'ready';
|
|
140
|
-
this._changed();
|
|
201
|
+
this._changed('image');
|
|
141
202
|
},
|
|
142
203
|
() => {
|
|
143
204
|
entry.state = 'failed';
|
|
@@ -150,29 +211,61 @@ export class ResourceStore {
|
|
|
150
211
|
return;
|
|
151
212
|
}
|
|
152
213
|
entry.image = decoded;
|
|
153
|
-
entry.
|
|
154
|
-
entry.height = decoded.height;
|
|
214
|
+
entry.size = rasterSize(decoded.width, decoded.height);
|
|
155
215
|
entry.state = 'ready';
|
|
156
|
-
if (!synchronous) this._changed();
|
|
216
|
+
if (!synchronous) this._changed('image');
|
|
157
217
|
}
|
|
158
218
|
|
|
159
|
-
/** A loaded stylesheet
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
219
|
+
/** A loaded stylesheet, as text, or null while it has not arrived.
|
|
220
|
+
* `fallbacks` are the encodings the referrer says, most specific first,
|
|
221
|
+
* for bytes that name none of their own. */
|
|
222
|
+
stylesheet(
|
|
223
|
+
url: string,
|
|
224
|
+
fallbacks: readonly (string | undefined)[] = [],
|
|
225
|
+
): DecodedStylesheet | null {
|
|
226
|
+
const entry = this._entries.get(this._key(url));
|
|
227
|
+
if (entry?.state !== 'ready') return null;
|
|
228
|
+
if (!entry.bytes) {
|
|
229
|
+
if (entry.text === undefined) return null;
|
|
230
|
+
// decoded by the host, from an encoding it did not say: what it
|
|
231
|
+
// imports falls back to the referrer's
|
|
232
|
+
return { text: entry.text, encoding: fallbacks.find(Boolean) ?? 'utf-8' };
|
|
233
|
+
}
|
|
234
|
+
const key = fallbacks.join('\u0001');
|
|
235
|
+
if (entry.decoded?.fallbacks !== key) {
|
|
236
|
+
entry.decoded = {
|
|
237
|
+
fallbacks: key,
|
|
238
|
+
sheet: decodeStylesheet(entry.bytes, entry.charset, fallbacks),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
return entry.decoded.sheet;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* The URL a loaded stylesheet's own relative URLs resolve against: where
|
|
246
|
+
* the host said it came from, or where it was asked for. Null while it
|
|
247
|
+
* has not arrived, or where that is not an absolute URL — a sheet asked
|
|
248
|
+
* for by a relative one, from a document with no base, whose URLs are
|
|
249
|
+
* left as they are written.
|
|
250
|
+
*/
|
|
251
|
+
sheetBase(url: string): string | null {
|
|
252
|
+
const entry = this._entries.get(this._key(url));
|
|
253
|
+
const base = entry?.state === 'ready' ? entry.url : undefined;
|
|
254
|
+
return base && /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(base) ? base : null;
|
|
163
255
|
}
|
|
164
256
|
|
|
165
257
|
/** A loaded image, for the paint pass. */
|
|
166
258
|
image(url: string): unknown | null {
|
|
167
|
-
|
|
259
|
+
if (!url) return null;
|
|
260
|
+
const entry = this._entries.get(this._key(url));
|
|
168
261
|
return entry?.state === 'ready' ? (entry.image ?? null) : null;
|
|
169
262
|
}
|
|
170
263
|
|
|
171
264
|
/** A loaded image's intrinsic size, for the box builder. */
|
|
172
|
-
imageSize(url: string):
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
return
|
|
265
|
+
imageSize(url: string): IntrinsicSize | null {
|
|
266
|
+
if (!url) return null;
|
|
267
|
+
const entry = this._entries.get(this._key(url));
|
|
268
|
+
return entry?.state === 'ready' ? (entry.size ?? null) : null;
|
|
176
269
|
}
|
|
177
270
|
|
|
178
271
|
destroy(): void {
|
|
@@ -181,29 +274,47 @@ export class ResourceStore {
|
|
|
181
274
|
}
|
|
182
275
|
}
|
|
183
276
|
|
|
277
|
+
/** A raster image's size: both dimensions, and their ratio. */
|
|
278
|
+
function rasterSize(width: number, height: number): IntrinsicSize {
|
|
279
|
+
return {
|
|
280
|
+
width,
|
|
281
|
+
height,
|
|
282
|
+
ratio: width > 0 && height > 0 ? width / height : 0,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
|
|
184
286
|
function isPromise<T>(value: unknown): value is Promise<T> {
|
|
185
287
|
return typeof (value as Promise<T> | null)?.then === 'function';
|
|
186
288
|
}
|
|
187
289
|
|
|
188
290
|
/**
|
|
189
|
-
* Decode image bytes through ntk
|
|
291
|
+
* Decode image bytes through ntk — PNG and JPEG — or, for a GIF, here: its
|
|
292
|
+
* first frame (`gif.ts`), handed to ntk's `Image` as the RGBA it takes.
|
|
190
293
|
*
|
|
191
|
-
* `decodeImage` is ntk's own front door — the one its `HtmlView` used
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
* this
|
|
294
|
+
* `decodeImage` is ntk's own front door — the one its `HtmlView` used. It is
|
|
295
|
+
* a **named** export of `react-x11/ntk`, which re-exports ntk with
|
|
296
|
+
* `export *`, and it is not in that subpath's declarations, so it is read off
|
|
297
|
+
* the module namespace and probed at run time; a version that dropped it
|
|
298
|
+
* falls back to the `Image` constructor shapes. It is not a property of the
|
|
299
|
+
* default export: this read it there, found nothing, and every image a host
|
|
300
|
+
* handed over as bytes drew as an empty frame. A host that would rather
|
|
301
|
+
* decode images itself hands back `{ image, width, height }` and never
|
|
302
|
+
* reaches this.
|
|
197
303
|
*/
|
|
198
304
|
function decodeImage(bytes: Uint8Array): ImageLike | Promise<ImageLike> | null {
|
|
199
305
|
try {
|
|
200
|
-
const
|
|
306
|
+
const gif = decodeGif(bytes);
|
|
307
|
+
if (gif) {
|
|
308
|
+
const ctor = ntk.Image as unknown as ImageConstructor | undefined;
|
|
309
|
+
return ctor ? new ctor(gif) : null;
|
|
310
|
+
}
|
|
311
|
+
const decode = (ntk as unknown as Record<string, unknown>).decodeImage;
|
|
201
312
|
if (typeof decode === 'function') {
|
|
202
313
|
return (decode as (b: Uint8Array) => ImageLike | Promise<ImageLike>)(
|
|
203
314
|
bytes,
|
|
204
315
|
);
|
|
205
316
|
}
|
|
206
|
-
const ctor = Image as unknown as ImageConstructor | undefined;
|
|
317
|
+
const ctor = ntk.Image as unknown as ImageConstructor | undefined;
|
|
207
318
|
if (!ctor) return null;
|
|
208
319
|
if (typeof ctor.fromBuffer === 'function') return ctor.fromBuffer(bytes);
|
|
209
320
|
if (typeof ctor.decode === 'function') return ctor.decode(bytes);
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Drawings kept on offscreen surfaces of their own, made once for a key and
|
|
2
|
+
// composited after: how a blurred shadow is drawn a second time without its
|
|
3
|
+
// blur. ntk bakes a shadow's blur on every fill of a path — a path has no
|
|
4
|
+
// short name to cache it by — which put 500ms on each repaint of a grid of
|
|
5
|
+
// thirty cards; the name is the shadow's geometry and colour, which only
|
|
6
|
+
// the painter knows, so the cache is here.
|
|
7
|
+
|
|
8
|
+
import { Surface } from 'react-x11/ntk';
|
|
9
|
+
|
|
10
|
+
/** ntk's `Surface`, as this uses it. */
|
|
11
|
+
interface SurfaceLike {
|
|
12
|
+
getContext(kind: '2d'): unknown;
|
|
13
|
+
destroy?(): void;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface Kept {
|
|
17
|
+
surface: SurfaceLike;
|
|
18
|
+
pixels: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Surfaces by key, the least recently drawn given up first once they hold
|
|
23
|
+
* more than `budget` pixels. One too large for a quarter of the budget is
|
|
24
|
+
* not made, and the caller draws the thing itself; so does one on a backend
|
|
25
|
+
* with no offscreen surface — the headless mock — after the first attempt.
|
|
26
|
+
*/
|
|
27
|
+
export class SurfaceCache {
|
|
28
|
+
private readonly kept = new Map<string, Kept>();
|
|
29
|
+
private pixels = 0;
|
|
30
|
+
private unavailable = false;
|
|
31
|
+
|
|
32
|
+
constructor(
|
|
33
|
+
private readonly app: unknown,
|
|
34
|
+
private readonly budget = 8 * 1024 * 1024,
|
|
35
|
+
) {}
|
|
36
|
+
|
|
37
|
+
get(
|
|
38
|
+
key: string,
|
|
39
|
+
width: number,
|
|
40
|
+
height: number,
|
|
41
|
+
draw: (ctx: unknown) => void,
|
|
42
|
+
): SurfaceLike | null {
|
|
43
|
+
const hit = this.kept.get(key);
|
|
44
|
+
if (hit) {
|
|
45
|
+
// re-inserted: a Map iterates in insertion order, oldest first
|
|
46
|
+
this.kept.delete(key);
|
|
47
|
+
this.kept.set(key, hit);
|
|
48
|
+
return hit.surface;
|
|
49
|
+
}
|
|
50
|
+
const pixels = width * height;
|
|
51
|
+
if (this.unavailable || !(width > 0 && height > 0)) return null;
|
|
52
|
+
if (pixels > this.budget / 4) return null;
|
|
53
|
+
let surface: SurfaceLike;
|
|
54
|
+
try {
|
|
55
|
+
surface = new Surface(this.app as never, {
|
|
56
|
+
width,
|
|
57
|
+
height,
|
|
58
|
+
}) as unknown as SurfaceLike;
|
|
59
|
+
} catch {
|
|
60
|
+
this.unavailable = true;
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
// a new surface is transparent: ntk clears its pixmap as it makes it
|
|
64
|
+
draw(surface.getContext('2d'));
|
|
65
|
+
this.kept.set(key, { surface, pixels });
|
|
66
|
+
this.pixels += pixels;
|
|
67
|
+
for (const [oldest, entry] of this.kept) {
|
|
68
|
+
if (this.pixels <= this.budget || entry.surface === surface) break;
|
|
69
|
+
this.kept.delete(oldest);
|
|
70
|
+
this.pixels -= entry.pixels;
|
|
71
|
+
entry.surface.destroy?.();
|
|
72
|
+
}
|
|
73
|
+
return surface;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
destroy(): void {
|
|
77
|
+
for (const entry of this.kept.values()) entry.surface.destroy?.();
|
|
78
|
+
this.kept.clear();
|
|
79
|
+
this.pixels = 0;
|
|
80
|
+
}
|
|
81
|
+
}
|