@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/codeblock/index.ts
CHANGED
|
@@ -15,7 +15,11 @@
|
|
|
15
15
|
// A shared module, not a component: no element registration, no React, and
|
|
16
16
|
// nothing imported from either of its consumers (a component never imports
|
|
17
17
|
// another component).
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
codeRuns,
|
|
20
|
+
autoTokenStyles,
|
|
21
|
+
CodeRunCache,
|
|
22
|
+
} from '../code-language/index.js';
|
|
19
23
|
import type { Language, TokenStyles } from '../code-language/index.js';
|
|
20
24
|
import type { TextRun } from '../richtext/index.js';
|
|
21
25
|
import { tint } from 'react-x11/style';
|
|
@@ -130,6 +134,49 @@ export function codeBlockRuns(
|
|
|
130
134
|
}).map((run) => ({ ...run, family: look.family, size: look.size }));
|
|
131
135
|
}
|
|
132
136
|
|
|
137
|
+
/**
|
|
138
|
+
* `codeBlockRuns` kept between calls, for a block of code that changes a
|
|
139
|
+
* little at a time — a fence being streamed, a source being appended to:
|
|
140
|
+
* the tokenizer is told which lines changed and the rest keep their runs
|
|
141
|
+
* (`CodeRunCache`). Call `dispose()` when done with it.
|
|
142
|
+
*/
|
|
143
|
+
export class CodeBlockRunCache {
|
|
144
|
+
private cache: CodeRunCache<TextRun> | null = null;
|
|
145
|
+
private family: string | undefined;
|
|
146
|
+
private size: number | undefined;
|
|
147
|
+
|
|
148
|
+
runs(
|
|
149
|
+
source: string,
|
|
150
|
+
look: CodeBlockLook,
|
|
151
|
+
options: CodeBlockRunOptions = {},
|
|
152
|
+
): TextRun[] {
|
|
153
|
+
if (!this.cache || this.family !== look.family || this.size !== look.size) {
|
|
154
|
+
this.cache?.dispose();
|
|
155
|
+
const { family, size } = look;
|
|
156
|
+
this.family = family;
|
|
157
|
+
this.size = size;
|
|
158
|
+
this.cache = new CodeRunCache<TextRun>((run) => ({
|
|
159
|
+
...run,
|
|
160
|
+
family,
|
|
161
|
+
size,
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
const { lang = '', language, resolveLanguage, highlight = true } = options;
|
|
165
|
+
return this.cache.runs(source, highlight ? lang : '', {
|
|
166
|
+
styles: look.styles,
|
|
167
|
+
color: look.color,
|
|
168
|
+
...(highlight && language ? { language } : null),
|
|
169
|
+
...(highlight && resolveLanguage ? { resolveLanguage } : null),
|
|
170
|
+
resolveToken: look.resolveToken,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
dispose(): void {
|
|
175
|
+
this.cache?.dispose();
|
|
176
|
+
this.cache = null;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
133
180
|
/** The block's own box: fill, radius, padding. What surrounds it — a row
|
|
134
181
|
* with a gutter, a column in a document — is the component's. */
|
|
135
182
|
export function codeBlockStyle(look: CodeBlockLook): Style {
|
|
@@ -140,7 +187,24 @@ export function codeBlockStyle(look: CodeBlockLook): Style {
|
|
|
140
187
|
};
|
|
141
188
|
}
|
|
142
189
|
|
|
143
|
-
/**
|
|
144
|
-
|
|
145
|
-
|
|
190
|
+
/**
|
|
191
|
+
* The style the runs are laid out with, in both components — `wrap` as the
|
|
192
|
+
* `<richtext>` is given it.
|
|
193
|
+
*
|
|
194
|
+
* Unwrapped, the text is as wide as its longest line, and at least as wide
|
|
195
|
+
* as its viewport. Stretched to the viewport, as a column stretches what it
|
|
196
|
+
* holds, its box held none of a line past the viewport's edge: the viewport
|
|
197
|
+
* had nothing to scroll to, and core, asked whether the text reached past
|
|
198
|
+
* the viewport, heard that it did not and left it unclipped — so a fence,
|
|
199
|
+
* with nothing round it to clip it either, drew the rest of a long line
|
|
200
|
+
* across whatever stood beside the document.
|
|
201
|
+
*/
|
|
202
|
+
export function codeTextStyle(look: CodeBlockLook, wrap = true): Style {
|
|
203
|
+
return wrap
|
|
204
|
+
? { lineHeight: look.lineHeight }
|
|
205
|
+
: {
|
|
206
|
+
lineHeight: look.lineHeight,
|
|
207
|
+
alignSelf: 'flex-start',
|
|
208
|
+
minWidth: '100%',
|
|
209
|
+
};
|
|
146
210
|
}
|
package/src/flow/draw.ts
CHANGED
|
@@ -38,6 +38,8 @@ interface CanvasLike {
|
|
|
38
38
|
lineDashOffset?: number;
|
|
39
39
|
save(): void;
|
|
40
40
|
restore(): void;
|
|
41
|
+
translate(x: number, y: number): void;
|
|
42
|
+
scale(x: number, y: number): void;
|
|
41
43
|
beginPath(): void;
|
|
42
44
|
closePath(): void;
|
|
43
45
|
moveTo(x: number, y: number): void;
|
|
@@ -56,6 +58,17 @@ interface LayoutLike {
|
|
|
56
58
|
width: number;
|
|
57
59
|
height: number;
|
|
58
60
|
draw(ctx: unknown, x: number, y: number): void;
|
|
61
|
+
/** The engine's own coverage of the layout, one byte a device pixel, with
|
|
62
|
+
* `pad` round its box — where the engine answers it (react-x11#673). */
|
|
63
|
+
coverage?(options?: { pad?: number }): TextCoverage | null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** A layout's coverage: `width` × `height` bytes, the layout's origin at
|
|
67
|
+
* (pad, pad). */
|
|
68
|
+
export interface TextCoverage {
|
|
69
|
+
width: number;
|
|
70
|
+
height: number;
|
|
71
|
+
data: Uint8Array;
|
|
59
72
|
}
|
|
60
73
|
|
|
61
74
|
/** One shaped string, kept between frames. `width` and `height` are
|
|
@@ -99,6 +112,14 @@ export interface PainterOptions {
|
|
|
99
112
|
* no amount of batching on the wire would have fixed.
|
|
100
113
|
*/
|
|
101
114
|
cache: Map<string, CachedText>;
|
|
115
|
+
/**
|
|
116
|
+
* While a zoom gesture moves: a label may be drawn from a layout shaped
|
|
117
|
+
* at another size, scaled to the one asked for, rather than shaped again
|
|
118
|
+
* at every step. The pane sets it only where the context scales text
|
|
119
|
+
* with its transform (`scalesText`), and paints the exact sizes once the
|
|
120
|
+
* gesture rests.
|
|
121
|
+
*/
|
|
122
|
+
approximateText?: boolean;
|
|
102
123
|
}
|
|
103
124
|
|
|
104
125
|
function isCanvas(ctx: unknown): ctx is CanvasLike {
|
|
@@ -111,6 +132,13 @@ function isCanvas(ctx: unknown): ctx is CanvasLike {
|
|
|
111
132
|
/** Bound, so a pathological graph cannot turn the width cache into a leak. */
|
|
112
133
|
const CACHE_LIMIT = 4000;
|
|
113
134
|
|
|
135
|
+
/** The sizes each string has been shaped at, per cache — what a label drawn
|
|
136
|
+
* mid-zoom looks for instead of shaping itself again (`approximateText`). */
|
|
137
|
+
const shapedSizes = new WeakMap<
|
|
138
|
+
Map<string, CachedText>,
|
|
139
|
+
Map<string, number[]>
|
|
140
|
+
>();
|
|
141
|
+
|
|
114
142
|
/**
|
|
115
143
|
* A logical value on the device grid.
|
|
116
144
|
*
|
|
@@ -126,6 +154,20 @@ export function toDevice(value: number, scale: number): number {
|
|
|
126
154
|
return Math.abs(out - whole) < 1e-6 ? whole : out;
|
|
127
155
|
}
|
|
128
156
|
|
|
157
|
+
/**
|
|
158
|
+
* `Math.round` for a place on the device grid, deaf to floating-point noise
|
|
159
|
+
* at a half. A pan moves the graph by whole device pixels, and its blit
|
|
160
|
+
* takes a shift within a hair of whole as whole (`toDevice`: the viewport
|
|
161
|
+
* `-66.4` panned 27 down is `-39.400000000000006`). A place worked out from
|
|
162
|
+
* the new viewport can then sit a hair below the half the old one sat on,
|
|
163
|
+
* or above it, and round the other way — a node or a label a pixel from
|
|
164
|
+
* where the copy put it. Nudged past any such hair, a half rounds up on
|
|
165
|
+
* both sides of the blit.
|
|
166
|
+
*/
|
|
167
|
+
export function snapToGrid(value: number): number {
|
|
168
|
+
return Math.round(value + 1e-4);
|
|
169
|
+
}
|
|
170
|
+
|
|
129
171
|
function fontStyle(
|
|
130
172
|
opts: PainterOptions,
|
|
131
173
|
options: TextOptions | undefined,
|
|
@@ -146,8 +188,11 @@ function fontStyle(
|
|
|
146
188
|
* repaint — a node with no explicit size is measured when the graph changes,
|
|
147
189
|
* which is also when a hit test has to know how big it is — so measuring
|
|
148
190
|
* cannot live behind the painter the way drawing does.
|
|
191
|
+
*
|
|
192
|
+
* Exported for the GL renderer's label atlas (`./gl/text.ts`), which draws
|
|
193
|
+
* the layout it measured onto a staging surface of its own.
|
|
149
194
|
*/
|
|
150
|
-
function shape(
|
|
195
|
+
export function shape(
|
|
151
196
|
opts: PainterOptions,
|
|
152
197
|
text: string,
|
|
153
198
|
options: TextOptions | undefined,
|
|
@@ -159,11 +204,16 @@ function shape(
|
|
|
159
204
|
// The colour is part of the key: it is baked into the layout, so two
|
|
160
205
|
// labels that differ only in ink are two shaped runs. The scale is not:
|
|
161
206
|
// it is constant for the life of the pane that owns the cache.
|
|
162
|
-
const
|
|
207
|
+
const base = `${family}|${options?.weight ?? 400}|${options?.color ?? opts.color}|${text}`;
|
|
208
|
+
const key = `${size}|${base}`;
|
|
163
209
|
const hit = cache.get(key);
|
|
164
210
|
if (hit) return hit;
|
|
165
211
|
const layout = fonts.layout(text, fontStyle(opts, options));
|
|
166
|
-
|
|
212
|
+
let sizes = shapedSizes.get(cache);
|
|
213
|
+
if (cache.size >= CACHE_LIMIT) {
|
|
214
|
+
cache.clear();
|
|
215
|
+
sizes?.clear();
|
|
216
|
+
}
|
|
167
217
|
const s = opts.scale;
|
|
168
218
|
const entry = {
|
|
169
219
|
width: layout.width / s,
|
|
@@ -171,22 +221,86 @@ function shape(
|
|
|
171
221
|
layout,
|
|
172
222
|
};
|
|
173
223
|
cache.set(key, entry);
|
|
224
|
+
if (!sizes) shapedSizes.set(cache, (sizes = new Map()));
|
|
225
|
+
const shaped = sizes.get(base);
|
|
226
|
+
if (shaped) shaped.push(size);
|
|
227
|
+
else sizes.set(base, [size]);
|
|
174
228
|
return entry;
|
|
175
229
|
}
|
|
176
230
|
|
|
231
|
+
/**
|
|
232
|
+
* The layout a label is drawn from, and the scale it is drawn at: its own
|
|
233
|
+
* size where it has one, and mid-zoom (`approximateText`) the size nearest
|
|
234
|
+
* it that was shaped already — the one the gesture started from, for every
|
|
235
|
+
* label on screen. Shaping is most of what a zoom step costs in text, and
|
|
236
|
+
* a step that re-shapes every label at a size the next step moves off was
|
|
237
|
+
* paying it for nothing.
|
|
238
|
+
*/
|
|
239
|
+
function shapeNear(
|
|
240
|
+
opts: PainterOptions,
|
|
241
|
+
text: string,
|
|
242
|
+
options: TextOptions | undefined,
|
|
243
|
+
): { entry: CachedText; scale: number } | null {
|
|
244
|
+
if (opts.approximateText) {
|
|
245
|
+
const size = options?.size ?? 13;
|
|
246
|
+
const family = options?.family ?? opts.family;
|
|
247
|
+
const base = `${family}|${options?.weight ?? 400}|${options?.color ?? opts.color}|${text}`;
|
|
248
|
+
const exact = opts.cache.get(`${size}|${base}`);
|
|
249
|
+
if (exact) return { entry: exact, scale: 1 };
|
|
250
|
+
const shaped = shapedSizes.get(opts.cache)?.get(base);
|
|
251
|
+
if (shaped && shaped.length > 0) {
|
|
252
|
+
let best = shaped[0];
|
|
253
|
+
for (const at of shaped) {
|
|
254
|
+
if (Math.abs(Math.log(at / size)) < Math.abs(Math.log(best / size))) {
|
|
255
|
+
best = at;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const entry = opts.cache.get(`${best}|${base}`);
|
|
259
|
+
if (entry) return { entry, scale: size / best };
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
const entry = shape(opts, text, options);
|
|
263
|
+
return entry ? { entry, scale: 1 } : null;
|
|
264
|
+
}
|
|
265
|
+
|
|
177
266
|
export function measureText(
|
|
178
267
|
opts: PainterOptions,
|
|
179
268
|
text: string,
|
|
180
269
|
options?: TextOptions,
|
|
181
270
|
): { width: number; height: number } {
|
|
182
271
|
const size = options?.size ?? 13;
|
|
183
|
-
const
|
|
184
|
-
if (!
|
|
272
|
+
const near = shapeNear(opts, text, options);
|
|
273
|
+
if (!near) {
|
|
185
274
|
// No font stack to ask. An estimate keeps layout plausible rather than
|
|
186
275
|
// collapsing every node to its own padding.
|
|
187
276
|
return { width: text.length * size * 0.55, height: size * 1.3 };
|
|
188
277
|
}
|
|
189
|
-
|
|
278
|
+
const { entry, scale } = near;
|
|
279
|
+
return { width: entry.width * scale, height: entry.height * scale };
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Cut a string to fit `max` logical pixels, with an ellipsis. Linear from
|
|
284
|
+
* the end rather than a binary search: labels that need it are short, and
|
|
285
|
+
* the widths it walks through are the ones the cache already holds.
|
|
286
|
+
*
|
|
287
|
+
* Both renderers call this, so a label cut on one is cut the same on the
|
|
288
|
+
* other — the GL one sets whatever this returns as a raster.
|
|
289
|
+
*/
|
|
290
|
+
export function fitText(
|
|
291
|
+
opts: PainterOptions,
|
|
292
|
+
text: string,
|
|
293
|
+
options: TextOptions | undefined,
|
|
294
|
+
max: number,
|
|
295
|
+
): string {
|
|
296
|
+
if (measureText(opts, text, options).width <= max) return text;
|
|
297
|
+
let cut = text.length;
|
|
298
|
+
while (cut > 1) {
|
|
299
|
+
cut--;
|
|
300
|
+
const candidate = `${text.slice(0, cut).trimEnd()}…`;
|
|
301
|
+
if (measureText(opts, candidate, options).width <= max) return candidate;
|
|
302
|
+
}
|
|
303
|
+
return '…';
|
|
190
304
|
}
|
|
191
305
|
|
|
192
306
|
class Painter implements FlowPainter {
|
|
@@ -230,6 +344,14 @@ class Painter implements FlowPainter {
|
|
|
230
344
|
const { ctx } = this;
|
|
231
345
|
ctx.strokeStyle = options.stroke ?? this.opts.color;
|
|
232
346
|
ctx.lineWidth = this.d(options.lineWidth ?? 1);
|
|
347
|
+
// Every stroke says how it joins and ends; `polyline` and `strokeRuns`
|
|
348
|
+
// then round both. A context keeps whatever the last stroke set, so a
|
|
349
|
+
// pass that drew an edge before a handle stroked the handle with round
|
|
350
|
+
// joins and caps, and one that reached no edge — a node's own box,
|
|
351
|
+
// repainted by itself — stroked it mitred and butt-ended, and the same
|
|
352
|
+
// ring came out two ways depending on what else the pass drew.
|
|
353
|
+
ctx.lineJoin = 'miter';
|
|
354
|
+
ctx.lineCap = 'butt';
|
|
233
355
|
if (typeof ctx.setLineDash === 'function') {
|
|
234
356
|
ctx.setLineDash(options.dash ? options.dash.map((v) => this.d(v)) : []);
|
|
235
357
|
if ('lineDashOffset' in ctx) {
|
|
@@ -321,6 +443,10 @@ class Painter implements FlowPainter {
|
|
|
321
443
|
const { ctx } = this;
|
|
322
444
|
ctx.beginPath();
|
|
323
445
|
ctx.arc(this.d(x), this.d(y), this.d(r), 0, Math.PI * 2);
|
|
446
|
+
// Closed, so the ring is one loop with a join where it started: open,
|
|
447
|
+
// its two ends meet edge to edge, and a stroke with butt ends shows a
|
|
448
|
+
// hairline where they touch.
|
|
449
|
+
ctx.closePath();
|
|
324
450
|
if (options.fill) {
|
|
325
451
|
ctx.fillStyle = options.fill;
|
|
326
452
|
ctx.fill();
|
|
@@ -367,6 +493,15 @@ class Painter implements FlowPainter {
|
|
|
367
493
|
}
|
|
368
494
|
if (!any) return;
|
|
369
495
|
this.applyStroke(options);
|
|
496
|
+
// Set, not inherited: this was whatever the last `polyline` left, so a
|
|
497
|
+
// pass that stroked an edge alone before the zoom controls drew their
|
|
498
|
+
// glyphs with round ends, and one that reached only the controls drew
|
|
499
|
+
// them square — a panel repainted by itself, as a pan repaints its
|
|
500
|
+
// pinned furniture every frame, came out lighter than the panel it
|
|
501
|
+
// replaced. The same for batched edges, whose joins changed with what
|
|
502
|
+
// the pass had drawn first.
|
|
503
|
+
ctx.lineJoin = 'round';
|
|
504
|
+
ctx.lineCap = 'round';
|
|
370
505
|
ctx.stroke();
|
|
371
506
|
this.clearDash();
|
|
372
507
|
}
|
|
@@ -431,46 +566,37 @@ class Painter implements FlowPainter {
|
|
|
431
566
|
return measureText(this.opts, text, options);
|
|
432
567
|
}
|
|
433
568
|
|
|
434
|
-
/** Cut a string to fit, with an ellipsis. Linear from the end rather than
|
|
435
|
-
* a binary search: labels that need it are short, and the widths it walks
|
|
436
|
-
* through are the ones the cache already holds. */
|
|
437
|
-
private fit(
|
|
438
|
-
text: string,
|
|
439
|
-
options: TextOptions | undefined,
|
|
440
|
-
max: number,
|
|
441
|
-
): string {
|
|
442
|
-
if (this.measureText(text, options).width <= max) return text;
|
|
443
|
-
let cut = text.length;
|
|
444
|
-
while (cut > 1) {
|
|
445
|
-
cut--;
|
|
446
|
-
const candidate = `${text.slice(0, cut).trimEnd()}…`;
|
|
447
|
-
if (this.measureText(candidate, options).width <= max) return candidate;
|
|
448
|
-
}
|
|
449
|
-
return '…';
|
|
450
|
-
}
|
|
451
|
-
|
|
452
569
|
text(text: string, x: number, y: number, options?: TextOptions): void {
|
|
453
570
|
if (!text) return;
|
|
454
571
|
const shown = options?.maxWidth
|
|
455
|
-
? this.
|
|
572
|
+
? fitText(this.opts, text, options, options.maxWidth)
|
|
456
573
|
: text;
|
|
457
|
-
const
|
|
458
|
-
if (!
|
|
459
|
-
const
|
|
574
|
+
const near = shapeNear(this.opts, shown, options);
|
|
575
|
+
if (!near) return;
|
|
576
|
+
const { entry, scale } = near;
|
|
577
|
+
const width = entry.width * scale;
|
|
578
|
+
const height = entry.height * scale;
|
|
460
579
|
const align = options?.align ?? 'left';
|
|
461
|
-
const dx =
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
)
|
|
580
|
+
const dx = align === 'center' ? -width / 2 : align === 'right' ? -width : 0;
|
|
581
|
+
const dy = options?.baseline === 'middle' ? -height / 2 : 0;
|
|
582
|
+
if (scale === 1) {
|
|
583
|
+
// Rounded on the device grid, where the glyphs land.
|
|
584
|
+
entry.layout.draw(
|
|
585
|
+
this.raw,
|
|
586
|
+
snapToGrid(this.d(x + dx)),
|
|
587
|
+
snapToGrid(this.d(y + dy)),
|
|
588
|
+
);
|
|
589
|
+
return;
|
|
590
|
+
}
|
|
591
|
+
// Mid-zoom, a layout shaped at another size, scaled through the context
|
|
592
|
+
// — which draws it as outlines, glyphs and all (`scalesText`). Not on
|
|
593
|
+
// the grid: the whole label is moving, and it is set exactly at rest.
|
|
594
|
+
const ctx = this.ctx;
|
|
595
|
+
ctx.save();
|
|
596
|
+
ctx.translate(this.d(x + dx), this.d(y + dy));
|
|
597
|
+
ctx.scale(scale, scale);
|
|
598
|
+
entry.layout.draw(this.raw, 0, 0);
|
|
599
|
+
ctx.restore();
|
|
474
600
|
}
|
|
475
601
|
}
|
|
476
602
|
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// CSS colours as the premultiplied floats a blend of ONE, ONE_MINUS_SRC_ALPHA
|
|
2
|
+
// wants.
|
|
3
|
+
//
|
|
4
|
+
// Through ntk's own parser where it can be reached, because a graph's colours
|
|
5
|
+
// come from three places and only one of them is ours: the palette (hex and
|
|
6
|
+
// `rgba()`), `tint()` (`rgba()`), and an application's node and edge styles —
|
|
7
|
+
// which are CSS, so `red` and `hsl(...)` are fair game and the 2D renderer
|
|
8
|
+
// draws them. `cssColorStraight` is exported by ntk at runtime but not
|
|
9
|
+
// declared by `react-x11/ntk`'s types, so it is probed rather than imported,
|
|
10
|
+
// the way `src/flow/index.ts` probes the reconciler's escape hatch; the local
|
|
11
|
+
// parser below is what a core that drops it degrades to.
|
|
12
|
+
import * as ntk from 'react-x11/ntk';
|
|
13
|
+
|
|
14
|
+
/** `[r, g, b, a]`, premultiplied, each in `0..1`. */
|
|
15
|
+
export type Rgba = readonly [number, number, number, number];
|
|
16
|
+
|
|
17
|
+
const CLEAR: Rgba = [0, 0, 0, 0];
|
|
18
|
+
|
|
19
|
+
type Parser = (value: string) => readonly number[] | null;
|
|
20
|
+
|
|
21
|
+
const ntkParser: Parser | null = (() => {
|
|
22
|
+
const candidate = (ntk as unknown as { cssColorStraight?: unknown })
|
|
23
|
+
.cssColorStraight;
|
|
24
|
+
return typeof candidate === 'function' ? (candidate as Parser) : null;
|
|
25
|
+
})();
|
|
26
|
+
|
|
27
|
+
/** Hex and `rgb()`/`rgba()` — every colour the default palette produces. */
|
|
28
|
+
function localParse(value: string): readonly number[] | null {
|
|
29
|
+
const v = value.trim().toLowerCase();
|
|
30
|
+
if (v === 'transparent') return [0, 0, 0, 0];
|
|
31
|
+
if (v.startsWith('#')) {
|
|
32
|
+
const h = v.slice(1);
|
|
33
|
+
if (!/^[0-9a-f]+$/.test(h)) return null;
|
|
34
|
+
if (h.length === 3 || h.length === 4) {
|
|
35
|
+
const c = (i: number) => parseInt(h[i] + h[i], 16) / 255;
|
|
36
|
+
return [c(0), c(1), c(2), h.length === 4 ? c(3) : 1];
|
|
37
|
+
}
|
|
38
|
+
if (h.length === 6 || h.length === 8) {
|
|
39
|
+
const c = (i: number) => parseInt(h.slice(i * 2, i * 2 + 2), 16) / 255;
|
|
40
|
+
return [c(0), c(1), c(2), h.length === 8 ? c(3) : 1];
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const m = /^rgba?\(([^)]*)\)$/.exec(v);
|
|
45
|
+
if (!m) return null;
|
|
46
|
+
const parts = m[1].split(/[\s,/]+/).filter(Boolean);
|
|
47
|
+
if (parts.length < 3) return null;
|
|
48
|
+
const channel = (p: string) =>
|
|
49
|
+
p.endsWith('%') ? parseFloat(p) / 100 : parseFloat(p) / 255;
|
|
50
|
+
const alpha =
|
|
51
|
+
parts[3] === undefined
|
|
52
|
+
? 1
|
|
53
|
+
: parts[3].endsWith('%')
|
|
54
|
+
? parseFloat(parts[3]) / 100
|
|
55
|
+
: parseFloat(parts[3]);
|
|
56
|
+
return [channel(parts[0]), channel(parts[1]), channel(parts[2]), alpha];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* A colour cache. A frame asks for the same few colours thousands of times —
|
|
61
|
+
* every edge in one pen, every card in one fill — so parsing is once per
|
|
62
|
+
* distinct string, and the cache is bounded against an application that
|
|
63
|
+
* generates colours.
|
|
64
|
+
*/
|
|
65
|
+
export class ColorCache {
|
|
66
|
+
private readonly map = new Map<string, Rgba>();
|
|
67
|
+
|
|
68
|
+
get(value: string | undefined): Rgba {
|
|
69
|
+
if (!value) return CLEAR;
|
|
70
|
+
let rgba = this.map.get(value);
|
|
71
|
+
if (rgba) return rgba;
|
|
72
|
+
const parsed = (ntkParser ?? localParse)(value) ?? localParse(value);
|
|
73
|
+
// An unknown colour draws nothing rather than black: the same answer
|
|
74
|
+
// the 2D context gives a `fillStyle` it cannot read.
|
|
75
|
+
if (!parsed) {
|
|
76
|
+
rgba = CLEAR;
|
|
77
|
+
} else {
|
|
78
|
+
const a = parsed[3] ?? 1;
|
|
79
|
+
rgba = [parsed[0] * a, parsed[1] * a, parsed[2] * a, a];
|
|
80
|
+
}
|
|
81
|
+
if (this.map.size > 512) this.map.clear();
|
|
82
|
+
this.map.set(value, rgba);
|
|
83
|
+
return rgba;
|
|
84
|
+
}
|
|
85
|
+
}
|