@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
|
@@ -0,0 +1,679 @@
|
|
|
1
|
+
// A frame, drawn. Owns the programs, two layers of instance buffers and the
|
|
2
|
+
// order of the frame — and nothing about the graph, which is `../scene.ts`'s,
|
|
3
|
+
// or about what to draw, which is `./pack.ts`'s.
|
|
4
|
+
//
|
|
5
|
+
// The two layers are the whole of the optimisation that makes a pan cheap.
|
|
6
|
+
// The **world** — edges, heads, chips, nodes — is packed and uploaded only
|
|
7
|
+
// when the element says it changed, and drawn wherever `offset` puts it; a
|
|
8
|
+
// pan changes the offset and nothing else, so its frame is a few uniforms and
|
|
9
|
+
// a handful of draw calls over buffers already on the GPU. The **overlay** —
|
|
10
|
+
// the background, the grid, the selection, the minimap and the controls — is
|
|
11
|
+
// pinned to the pane, is a few dozen boxes, and is packed every frame.
|
|
12
|
+
import type { FlowFrameStats, FlowRect, XYPosition } from '../types.js';
|
|
13
|
+
import type { FlowScene } from '../scene.js';
|
|
14
|
+
import { BOX_STRIDE, LINE_STRIDE, ScenePacker, TRI_STRIDE } from './pack.js';
|
|
15
|
+
import type {
|
|
16
|
+
DrawRange,
|
|
17
|
+
PackedScene,
|
|
18
|
+
PackLayer,
|
|
19
|
+
DrawnLabel,
|
|
20
|
+
TextResolver,
|
|
21
|
+
WaitingLabel,
|
|
22
|
+
} from './pack.js';
|
|
23
|
+
import type { LabelAtlas } from './text.js';
|
|
24
|
+
import {
|
|
25
|
+
ATTRIBUTES,
|
|
26
|
+
BOX_FRAGMENT,
|
|
27
|
+
BOX_VERTEX,
|
|
28
|
+
GRID_FRAGMENT,
|
|
29
|
+
GRID_VERTEX,
|
|
30
|
+
LINE_FRAGMENT,
|
|
31
|
+
LINE_VERTEX,
|
|
32
|
+
linkProgram,
|
|
33
|
+
TRI_FRAGMENT,
|
|
34
|
+
TRI_VERTEX,
|
|
35
|
+
} from './shaders.js';
|
|
36
|
+
import type { GL, Program } from './shaders.js';
|
|
37
|
+
import { ColorCache } from './color.js';
|
|
38
|
+
|
|
39
|
+
/** One frame's drawing, counted; `<Flow>` adds the scene's share. */
|
|
40
|
+
export type FlowGlDrawStats = Omit<
|
|
41
|
+
FlowFrameStats,
|
|
42
|
+
'sceneMs' | 'renderer' | 'bodies'
|
|
43
|
+
>;
|
|
44
|
+
|
|
45
|
+
/** Where the surface sits and how big it is: the pane's content box in
|
|
46
|
+
* logical window pixels, and the surface in device pixels. */
|
|
47
|
+
export interface FlowGlTarget {
|
|
48
|
+
origin: XYPosition;
|
|
49
|
+
scale: number;
|
|
50
|
+
width: number;
|
|
51
|
+
height: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** What the element hands the renderer for one frame. */
|
|
55
|
+
export interface FlowGlFrame {
|
|
56
|
+
/** The graph, when it changed since the last frame — null to draw the one
|
|
57
|
+
* already on the GPU where `offset` now puts it. */
|
|
58
|
+
world: FlowScene | null;
|
|
59
|
+
/** Where the world's pinned origin lands in the window, in logical
|
|
60
|
+
* pixels: the pane's origin plus the viewport's translation. */
|
|
61
|
+
offset: XYPosition;
|
|
62
|
+
/** How much the world on the GPU is magnified: the view's zoom over the
|
|
63
|
+
* zoom it was built at. 1 — or absent — except while a zoom gesture
|
|
64
|
+
* moves, when the world is drawn scaled rather than rebuilt a step. */
|
|
65
|
+
zoom?: number;
|
|
66
|
+
/** The pane's furniture, every frame. */
|
|
67
|
+
overlay: FlowScene;
|
|
68
|
+
/** How far a marching dash has moved, in the world's logical pixels — a
|
|
69
|
+
* uniform, so the dash timer's tick redraws without a rebuild. */
|
|
70
|
+
phase: number;
|
|
71
|
+
/** A zoom gesture is moving: a stream of zoom steps, not a single one —
|
|
72
|
+
* what the label atlas holds new strings back for. */
|
|
73
|
+
moving?: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* The nodes a drag is moving and their edges, lifted out of the world —
|
|
76
|
+
* which is built without them while they move — and packed on their own
|
|
77
|
+
* when they changed: absent to draw the ones already on the GPU, null for
|
|
78
|
+
* none. A drag step packs a card or two and their edges, where it packed
|
|
79
|
+
* the whole world: 3-4 ms a step at 2,000 nodes. Drawn in two halves, its
|
|
80
|
+
* edges under every card and its cards over them, as the painter orders
|
|
81
|
+
* a dragged node.
|
|
82
|
+
*/
|
|
83
|
+
lifted?: FlowScene | null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const UNIFORMS = [
|
|
87
|
+
'u_origin',
|
|
88
|
+
'u_offset',
|
|
89
|
+
'u_scale',
|
|
90
|
+
'u_zoom',
|
|
91
|
+
'u_viewport',
|
|
92
|
+
] as const;
|
|
93
|
+
|
|
94
|
+
/** The clock, through `globalThis`: `src/` compiles with `types: []`. */
|
|
95
|
+
const globals = globalThis as { performance?: { now(): number } };
|
|
96
|
+
export const now = (): number => globals.performance?.now() ?? Date.now();
|
|
97
|
+
|
|
98
|
+
const ZERO: XYPosition = { x: 0, y: 0 };
|
|
99
|
+
|
|
100
|
+
/** One layer: a packer, the three buffers its streams go into, and what it
|
|
101
|
+
* last packed. */
|
|
102
|
+
class Layer {
|
|
103
|
+
readonly packer = new ScenePacker();
|
|
104
|
+
readonly lines: unknown;
|
|
105
|
+
readonly boxes: unknown;
|
|
106
|
+
readonly tris: unknown;
|
|
107
|
+
packed: PackedScene | null = null;
|
|
108
|
+
scene: FlowScene | null = null;
|
|
109
|
+
/** Labels packed before their fields landed, not yet written in, and the
|
|
110
|
+
* atlas's generation they were last checked against. */
|
|
111
|
+
waiting: WaitingLabel[] = [];
|
|
112
|
+
checked = -1;
|
|
113
|
+
/** Labels drawn from their fields, and the atlas's count of dropped
|
|
114
|
+
* fields they were last checked against. */
|
|
115
|
+
drawn: DrawnLabel[] = [];
|
|
116
|
+
moved = -1;
|
|
117
|
+
|
|
118
|
+
constructor(private readonly gl: GL) {
|
|
119
|
+
this.lines = gl.createBuffer();
|
|
120
|
+
this.boxes = gl.createBuffer();
|
|
121
|
+
this.tris = gl.createBuffer();
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Pack and upload; answers the bytes sent. Orphaning with `bufferData`
|
|
125
|
+
* rather than `bufferSubData`: the driver hands back fresh storage
|
|
126
|
+
* instead of waiting for the last frame's draws to finish reading the
|
|
127
|
+
* old. */
|
|
128
|
+
update(scene: FlowScene, layer: PackLayer, text?: TextResolver): number {
|
|
129
|
+
const gl = this.gl;
|
|
130
|
+
const packed = this.packer.pack(scene, layer, text);
|
|
131
|
+
this.packed = packed;
|
|
132
|
+
this.scene = scene;
|
|
133
|
+
this.waiting = packed.waiting;
|
|
134
|
+
this.checked = -1;
|
|
135
|
+
this.drawn = packed.drawn;
|
|
136
|
+
this.moved = -1;
|
|
137
|
+
let bytes = 0;
|
|
138
|
+
const put = (buf: unknown, data: Float32Array, used: number): void => {
|
|
139
|
+
if (used === 0) return;
|
|
140
|
+
const view = data.subarray(0, used);
|
|
141
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
|
|
142
|
+
gl.bufferData(gl.ARRAY_BUFFER, view, gl.DYNAMIC_DRAW);
|
|
143
|
+
bytes += view.byteLength;
|
|
144
|
+
};
|
|
145
|
+
put(this.lines, packed.lines, packed.lineCount * LINE_STRIDE);
|
|
146
|
+
put(this.boxes, packed.boxes, packed.boxCount * BOX_STRIDE);
|
|
147
|
+
put(this.tris, packed.tris, packed.triCount * TRI_STRIDE);
|
|
148
|
+
return bytes;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** The box stream again, whole — orphaned as `update` does, so no draw
|
|
152
|
+
* of the last frame is waited for. Answers the bytes sent. */
|
|
153
|
+
uploadBoxes(): number {
|
|
154
|
+
const packed = this.packed;
|
|
155
|
+
if (!packed || packed.boxCount === 0) return 0;
|
|
156
|
+
const gl = this.gl;
|
|
157
|
+
const view = packed.boxes.subarray(0, packed.boxCount * BOX_STRIDE);
|
|
158
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.boxes);
|
|
159
|
+
gl.bufferData(gl.ARRAY_BUFFER, view, gl.DYNAMIC_DRAW);
|
|
160
|
+
return view.byteLength;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** Nothing to draw, until the next `update`. */
|
|
164
|
+
clear(): void {
|
|
165
|
+
this.packed = null;
|
|
166
|
+
this.scene = null;
|
|
167
|
+
this.waiting = [];
|
|
168
|
+
this.drawn = [];
|
|
169
|
+
this.checked = -1;
|
|
170
|
+
this.moved = -1;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
dispose(): void {
|
|
174
|
+
for (const buffer of [this.lines, this.boxes, this.tris]) {
|
|
175
|
+
this.gl.deleteBuffer(buffer);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export class FlowGlRenderer {
|
|
181
|
+
private readonly gl: GL;
|
|
182
|
+
private readonly line: Program;
|
|
183
|
+
private readonly box: Program;
|
|
184
|
+
private readonly tri: Program;
|
|
185
|
+
private readonly grid: Program;
|
|
186
|
+
private readonly vao: unknown;
|
|
187
|
+
private readonly quad: unknown;
|
|
188
|
+
private readonly world: Layer;
|
|
189
|
+
private readonly lifted: Layer;
|
|
190
|
+
private readonly overlay: Layer;
|
|
191
|
+
private readonly colors = new ColorCache();
|
|
192
|
+
/** Whether this context has had the atlas's texture made in it — a new
|
|
193
|
+
* renderer is a new context, into which every raster is uploaded again. */
|
|
194
|
+
private atlasBound = false;
|
|
195
|
+
|
|
196
|
+
constructor(gl: GL) {
|
|
197
|
+
this.gl = gl;
|
|
198
|
+
this.line = linkProgram(gl, LINE_VERTEX, LINE_FRAGMENT, [
|
|
199
|
+
...UNIFORMS,
|
|
200
|
+
'u_phase',
|
|
201
|
+
]);
|
|
202
|
+
this.box = linkProgram(gl, BOX_VERTEX, BOX_FRAGMENT, [
|
|
203
|
+
...UNIFORMS,
|
|
204
|
+
'u_atlas',
|
|
205
|
+
'u_spread',
|
|
206
|
+
]);
|
|
207
|
+
// the label atlas is always on unit 0
|
|
208
|
+
gl.useProgram(this.box.program);
|
|
209
|
+
gl.uniform1i(this.box.uniforms.u_atlas, 0);
|
|
210
|
+
this.tri = linkProgram(gl, TRI_VERTEX, TRI_FRAGMENT, UNIFORMS);
|
|
211
|
+
this.grid = linkProgram(gl, GRID_VERTEX, GRID_FRAGMENT, [
|
|
212
|
+
...UNIFORMS,
|
|
213
|
+
'u_grid',
|
|
214
|
+
'u_mark',
|
|
215
|
+
'u_color',
|
|
216
|
+
]);
|
|
217
|
+
// A core profile draws nothing with no vertex array bound. One is enough:
|
|
218
|
+
// every range re-points the attributes at its own offset anyway, because
|
|
219
|
+
// GLSL ES 1.00 has no base instance to do it for us.
|
|
220
|
+
this.vao = gl.createVertexArray();
|
|
221
|
+
gl.bindVertexArray(this.vao);
|
|
222
|
+
this.quad = gl.createBuffer();
|
|
223
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.quad);
|
|
224
|
+
gl.bufferData(
|
|
225
|
+
gl.ARRAY_BUFFER,
|
|
226
|
+
new Float32Array([0, -1, 1, -1, 0, 1, 1, 1]),
|
|
227
|
+
gl.STATIC_DRAW,
|
|
228
|
+
);
|
|
229
|
+
this.world = new Layer(gl);
|
|
230
|
+
this.lifted = new Layer(gl);
|
|
231
|
+
this.overlay = new Layer(gl);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/** A whole scene, in one layer, at no offset — what a test or a one-off
|
|
235
|
+
* render wants, and the same drawing the two-layer frame composes. */
|
|
236
|
+
draw(
|
|
237
|
+
scene: FlowScene,
|
|
238
|
+
target: FlowGlTarget,
|
|
239
|
+
atlas?: LabelAtlas,
|
|
240
|
+
): FlowGlDrawStats {
|
|
241
|
+
const packStart = now();
|
|
242
|
+
const bytes = this.overlay.update(
|
|
243
|
+
scene,
|
|
244
|
+
'all',
|
|
245
|
+
atlas ? (t) => atlas.quad(t) : undefined,
|
|
246
|
+
);
|
|
247
|
+
const drawStart = now();
|
|
248
|
+
this.begin(target, atlas);
|
|
249
|
+
const packed = this.overlay.packed!;
|
|
250
|
+
// Every marching edge in one scene has the same phase baked in.
|
|
251
|
+
const phase = scene.edges.find((e) => e.animated)?.dashOffset ?? 0;
|
|
252
|
+
const calls = this.ranges(
|
|
253
|
+
packed.ranges,
|
|
254
|
+
this.overlay,
|
|
255
|
+
scene,
|
|
256
|
+
ZERO,
|
|
257
|
+
1,
|
|
258
|
+
phase,
|
|
259
|
+
target,
|
|
260
|
+
);
|
|
261
|
+
this.gl.disable(this.gl.SCISSOR_TEST);
|
|
262
|
+
return this.stats(packStart, drawStart, bytes, calls, [packed], false);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/** One frame: the overlay under the world, the world at its offset, the
|
|
266
|
+
* overlay over it. */
|
|
267
|
+
drawFrame(
|
|
268
|
+
frame: FlowGlFrame,
|
|
269
|
+
target: FlowGlTarget,
|
|
270
|
+
atlas?: LabelAtlas,
|
|
271
|
+
): FlowGlDrawStats {
|
|
272
|
+
const packStart = now();
|
|
273
|
+
let bytes = 0;
|
|
274
|
+
const rebuilt = frame.world != null;
|
|
275
|
+
if (frame.world) {
|
|
276
|
+
atlas?.beginPack();
|
|
277
|
+
bytes += this.world.update(
|
|
278
|
+
frame.world,
|
|
279
|
+
'world',
|
|
280
|
+
atlas ? (t) => atlas.quad(t) : undefined,
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
if (frame.lifted) {
|
|
284
|
+
bytes += this.lifted.update(
|
|
285
|
+
frame.lifted,
|
|
286
|
+
'world',
|
|
287
|
+
atlas ? (t) => atlas.quad(t, true) : undefined,
|
|
288
|
+
);
|
|
289
|
+
} else if (frame.lifted === null) {
|
|
290
|
+
this.lifted.clear();
|
|
291
|
+
}
|
|
292
|
+
bytes += this.overlay.update(frame.overlay, 'overlay');
|
|
293
|
+
if (atlas) {
|
|
294
|
+
bytes += this.landLabels(this.world, atlas);
|
|
295
|
+
bytes += this.landLabels(this.lifted, atlas, true);
|
|
296
|
+
}
|
|
297
|
+
const drawStart = now();
|
|
298
|
+
|
|
299
|
+
this.begin(target, atlas);
|
|
300
|
+
const over = this.overlay.packed!;
|
|
301
|
+
let calls = this.ranges(
|
|
302
|
+
over.ranges.slice(0, over.split),
|
|
303
|
+
this.overlay,
|
|
304
|
+
frame.overlay,
|
|
305
|
+
ZERO,
|
|
306
|
+
1,
|
|
307
|
+
0,
|
|
308
|
+
target,
|
|
309
|
+
);
|
|
310
|
+
// The world's edges, the lifted edges, the world's cards, the lifted
|
|
311
|
+
// cards: a dragged node's edges go under every card, and it over them.
|
|
312
|
+
const world = this.world.packed;
|
|
313
|
+
const lifted = this.lifted.packed;
|
|
314
|
+
const half = (layer: Layer, first: boolean): void => {
|
|
315
|
+
const packed = layer.packed;
|
|
316
|
+
if (!packed || !layer.scene) return;
|
|
317
|
+
calls += this.ranges(
|
|
318
|
+
first
|
|
319
|
+
? packed.ranges.slice(0, packed.nodesAt)
|
|
320
|
+
: packed.ranges.slice(packed.nodesAt),
|
|
321
|
+
layer,
|
|
322
|
+
layer.scene,
|
|
323
|
+
frame.offset,
|
|
324
|
+
frame.zoom ?? 1,
|
|
325
|
+
frame.phase,
|
|
326
|
+
target,
|
|
327
|
+
);
|
|
328
|
+
};
|
|
329
|
+
half(this.world, true);
|
|
330
|
+
half(this.lifted, true);
|
|
331
|
+
half(this.world, false);
|
|
332
|
+
half(this.lifted, false);
|
|
333
|
+
calls += this.ranges(
|
|
334
|
+
over.ranges.slice(over.split),
|
|
335
|
+
this.overlay,
|
|
336
|
+
frame.overlay,
|
|
337
|
+
ZERO,
|
|
338
|
+
1,
|
|
339
|
+
0,
|
|
340
|
+
target,
|
|
341
|
+
);
|
|
342
|
+
this.gl.disable(this.gl.SCISSOR_TEST);
|
|
343
|
+
const packs = [world, lifted, over].filter((p) => p != null);
|
|
344
|
+
return this.stats(packStart, drawStart, bytes, calls, packs, rebuilt);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* The labels of a layer packed before their fields existed, drawn from
|
|
349
|
+
* them now they have landed: the flag, the place in the atlas and the
|
|
350
|
+
* quad written into each box, and the stream uploaded again.
|
|
351
|
+
* A label arriving used to be the world packed again once everything on
|
|
352
|
+
* screen had its field — every label at once, after all of them — and is
|
|
353
|
+
* now a few floats and one upload, as each lands. Answers the bytes sent.
|
|
354
|
+
*
|
|
355
|
+
* First, the other way: a label whose field the atlas dropped for one
|
|
356
|
+
* nearer the view — or set again somewhere else — is drawn as nothing
|
|
357
|
+
* and waits again, its field wanted from where it is. Only a full atlas
|
|
358
|
+
* drops anything, so a graph under the limit never walks this list.
|
|
359
|
+
*/
|
|
360
|
+
private landLabels(layer: Layer, atlas: LabelAtlas, lifted = false): number {
|
|
361
|
+
const packed = layer.packed;
|
|
362
|
+
if (!packed) return 0;
|
|
363
|
+
const d = packed.boxes;
|
|
364
|
+
let lost = 0;
|
|
365
|
+
if (layer.moved !== atlas.moves) {
|
|
366
|
+
layer.moved = atlas.moves;
|
|
367
|
+
const kept: DrawnLabel[] = [];
|
|
368
|
+
for (const l of layer.drawn) {
|
|
369
|
+
if (atlas.slotOf(l.key) === l.slot) {
|
|
370
|
+
kept.push(l);
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
d[l.index * BOX_STRIDE + 6] = 2;
|
|
374
|
+
layer.waiting.push({ index: l.index, key: l.key, text: l.text });
|
|
375
|
+
atlas.want(l.key, l.text);
|
|
376
|
+
lost++;
|
|
377
|
+
}
|
|
378
|
+
if (lost > 0) {
|
|
379
|
+
layer.drawn = kept;
|
|
380
|
+
packed.gaps.text += lost;
|
|
381
|
+
layer.checked = -1;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
if (layer.waiting.length === 0 || layer.checked === atlas.generation) {
|
|
385
|
+
return lost > 0 ? layer.uploadBoxes() : 0;
|
|
386
|
+
}
|
|
387
|
+
layer.checked = atlas.generation;
|
|
388
|
+
const still: WaitingLabel[] = [];
|
|
389
|
+
let landed = 0;
|
|
390
|
+
for (const w of layer.waiting) {
|
|
391
|
+
const q = atlas.landing(w.key, w.text, lifted);
|
|
392
|
+
if (!q) {
|
|
393
|
+
still.push(w);
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
layer.drawn.push({
|
|
397
|
+
index: w.index,
|
|
398
|
+
key: q.key,
|
|
399
|
+
text: w.text,
|
|
400
|
+
slot: q.slot,
|
|
401
|
+
});
|
|
402
|
+
// the whole quad: one the pack did not measure was a box of no size
|
|
403
|
+
const at = w.index * BOX_STRIDE;
|
|
404
|
+
d[at] = q.x;
|
|
405
|
+
d[at + 1] = q.y;
|
|
406
|
+
d[at + 2] = q.w;
|
|
407
|
+
d[at + 3] = q.h;
|
|
408
|
+
d[at + 4] = q.margin;
|
|
409
|
+
d[at + 5] = q.page;
|
|
410
|
+
d[at + 6] = 1;
|
|
411
|
+
d[at + 7] = q.texel;
|
|
412
|
+
d[at + 12] = q.u0;
|
|
413
|
+
d[at + 13] = q.v0;
|
|
414
|
+
d[at + 14] = q.u1;
|
|
415
|
+
d[at + 15] = q.v1;
|
|
416
|
+
landed++;
|
|
417
|
+
}
|
|
418
|
+
if (landed === 0) return lost > 0 ? layer.uploadBoxes() : 0;
|
|
419
|
+
layer.waiting = still;
|
|
420
|
+
packed.gaps.text -= landed;
|
|
421
|
+
return layer.uploadBoxes();
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
private stats(
|
|
425
|
+
packStart: number,
|
|
426
|
+
drawStart: number,
|
|
427
|
+
uploadBytes: number,
|
|
428
|
+
drawCalls: number,
|
|
429
|
+
packs: readonly PackedScene[],
|
|
430
|
+
worldRebuilt: boolean,
|
|
431
|
+
): FlowGlDrawStats {
|
|
432
|
+
let lines = 0;
|
|
433
|
+
let boxes = 0;
|
|
434
|
+
let triangles = 0;
|
|
435
|
+
const gaps = { text: 0, custom: 0 };
|
|
436
|
+
for (const p of packs) {
|
|
437
|
+
lines += p.lineCount;
|
|
438
|
+
boxes += p.boxCount;
|
|
439
|
+
triangles += p.triCount / 3;
|
|
440
|
+
gaps.text += p.gaps.text;
|
|
441
|
+
gaps.custom += p.gaps.custom;
|
|
442
|
+
}
|
|
443
|
+
return {
|
|
444
|
+
packMs: drawStart - packStart,
|
|
445
|
+
drawMs: now() - drawStart,
|
|
446
|
+
drawCalls,
|
|
447
|
+
lines,
|
|
448
|
+
boxes,
|
|
449
|
+
triangles,
|
|
450
|
+
uploadBytes,
|
|
451
|
+
worldRebuilt,
|
|
452
|
+
gaps,
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
private begin(target: FlowGlTarget, atlas?: LabelAtlas): void {
|
|
457
|
+
const gl = this.gl;
|
|
458
|
+
if (atlas) {
|
|
459
|
+
atlas.bind(gl, !this.atlasBound);
|
|
460
|
+
this.atlasBound = true;
|
|
461
|
+
// how many texels a field's values span, for the label ramp
|
|
462
|
+
gl.useProgram(this.box.program);
|
|
463
|
+
gl.uniform1f(this.box.uniforms.u_spread, atlas.pad);
|
|
464
|
+
}
|
|
465
|
+
gl.bindVertexArray(this.vao);
|
|
466
|
+
gl.viewport(0, 0, target.width, target.height);
|
|
467
|
+
gl.disable(gl.DEPTH_TEST);
|
|
468
|
+
gl.enable(gl.BLEND);
|
|
469
|
+
// premultiplied, which is what every colour `./color.ts` hands back is
|
|
470
|
+
gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
private ranges(
|
|
474
|
+
ranges: readonly DrawRange[],
|
|
475
|
+
layer: Layer,
|
|
476
|
+
scene: FlowScene,
|
|
477
|
+
offset: XYPosition,
|
|
478
|
+
zoom: number,
|
|
479
|
+
phase: number,
|
|
480
|
+
target: FlowGlTarget,
|
|
481
|
+
): number {
|
|
482
|
+
let calls = 0;
|
|
483
|
+
for (const range of ranges) {
|
|
484
|
+
this.scissor(range.scissor, target);
|
|
485
|
+
if (range.kind === 'grid') {
|
|
486
|
+
if (!scene.grid) continue;
|
|
487
|
+
this.drawGrid(scene, target);
|
|
488
|
+
} else if (range.kind === 'line') {
|
|
489
|
+
this.drawInstances(
|
|
490
|
+
this.line,
|
|
491
|
+
layer.lines,
|
|
492
|
+
LINE_STRIDE,
|
|
493
|
+
range,
|
|
494
|
+
offset,
|
|
495
|
+
zoom,
|
|
496
|
+
target,
|
|
497
|
+
phase,
|
|
498
|
+
);
|
|
499
|
+
} else if (range.kind === 'box') {
|
|
500
|
+
this.drawInstances(
|
|
501
|
+
this.box,
|
|
502
|
+
layer.boxes,
|
|
503
|
+
BOX_STRIDE,
|
|
504
|
+
range,
|
|
505
|
+
offset,
|
|
506
|
+
zoom,
|
|
507
|
+
target,
|
|
508
|
+
);
|
|
509
|
+
} else {
|
|
510
|
+
this.drawTriangles(layer.tris, range, offset, zoom, target);
|
|
511
|
+
}
|
|
512
|
+
calls++;
|
|
513
|
+
}
|
|
514
|
+
return calls;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
private uniforms(
|
|
518
|
+
program: Program,
|
|
519
|
+
offset: XYPosition,
|
|
520
|
+
zoom: number,
|
|
521
|
+
target: FlowGlTarget,
|
|
522
|
+
): void {
|
|
523
|
+
const gl = this.gl;
|
|
524
|
+
gl.useProgram(program.program);
|
|
525
|
+
gl.uniform2f(program.uniforms.u_origin, target.origin.x, target.origin.y);
|
|
526
|
+
gl.uniform2f(program.uniforms.u_offset, offset.x, offset.y);
|
|
527
|
+
gl.uniform1f(program.uniforms.u_scale, target.scale);
|
|
528
|
+
gl.uniform1f(program.uniforms.u_zoom, zoom);
|
|
529
|
+
gl.uniform2f(program.uniforms.u_viewport, target.width, target.height);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
/** The quad's corners at location 0, stepping per vertex. */
|
|
533
|
+
private corners(): void {
|
|
534
|
+
const gl = this.gl;
|
|
535
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.quad);
|
|
536
|
+
gl.enableVertexAttribArray(ATTRIBUTES.a_corner);
|
|
537
|
+
gl.vertexAttribPointer(ATTRIBUTES.a_corner, 2, gl.FLOAT, false, 0, 0);
|
|
538
|
+
gl.vertexAttribDivisor(ATTRIBUTES.a_corner, 0);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
private drawInstances(
|
|
542
|
+
program: Program,
|
|
543
|
+
buffer: unknown,
|
|
544
|
+
stride: number,
|
|
545
|
+
range: DrawRange,
|
|
546
|
+
offset: XYPosition,
|
|
547
|
+
zoom: number,
|
|
548
|
+
target: FlowGlTarget,
|
|
549
|
+
phase?: number,
|
|
550
|
+
): void {
|
|
551
|
+
const gl = this.gl;
|
|
552
|
+
this.uniforms(program, offset, zoom, target);
|
|
553
|
+
// only the line program declares it, and only after `uniforms` has made
|
|
554
|
+
// that program current
|
|
555
|
+
if (phase !== undefined) gl.uniform1f(program.uniforms.u_phase, phase);
|
|
556
|
+
this.corners();
|
|
557
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
558
|
+
const bytes = stride * 4;
|
|
559
|
+
const base = range.first * bytes;
|
|
560
|
+
const slots = [
|
|
561
|
+
ATTRIBUTES.a_i0,
|
|
562
|
+
ATTRIBUTES.a_i1,
|
|
563
|
+
ATTRIBUTES.a_i2,
|
|
564
|
+
ATTRIBUTES.a_i3,
|
|
565
|
+
];
|
|
566
|
+
slots.forEach((location, i) => {
|
|
567
|
+
gl.enableVertexAttribArray(location);
|
|
568
|
+
gl.vertexAttribPointer(
|
|
569
|
+
location,
|
|
570
|
+
4,
|
|
571
|
+
gl.FLOAT,
|
|
572
|
+
false,
|
|
573
|
+
bytes,
|
|
574
|
+
base + i * 16,
|
|
575
|
+
);
|
|
576
|
+
gl.vertexAttribDivisor(location, 1);
|
|
577
|
+
});
|
|
578
|
+
gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, range.count);
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
private drawTriangles(
|
|
582
|
+
buffer: unknown,
|
|
583
|
+
range: DrawRange,
|
|
584
|
+
offset: XYPosition,
|
|
585
|
+
zoom: number,
|
|
586
|
+
target: FlowGlTarget,
|
|
587
|
+
): void {
|
|
588
|
+
const gl = this.gl;
|
|
589
|
+
this.uniforms(this.tri, offset, zoom, target);
|
|
590
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
591
|
+
const bytes = TRI_STRIDE * 4;
|
|
592
|
+
// Per vertex, not per instance: a triangle is three records.
|
|
593
|
+
gl.enableVertexAttribArray(ATTRIBUTES.a_corner);
|
|
594
|
+
gl.vertexAttribPointer(ATTRIBUTES.a_corner, 2, gl.FLOAT, false, bytes, 0);
|
|
595
|
+
gl.vertexAttribDivisor(ATTRIBUTES.a_corner, 0);
|
|
596
|
+
gl.enableVertexAttribArray(ATTRIBUTES.a_i0);
|
|
597
|
+
gl.vertexAttribPointer(ATTRIBUTES.a_i0, 4, gl.FLOAT, false, bytes, 8);
|
|
598
|
+
gl.vertexAttribDivisor(ATTRIBUTES.a_i0, 0);
|
|
599
|
+
for (const location of [
|
|
600
|
+
ATTRIBUTES.a_i1,
|
|
601
|
+
ATTRIBUTES.a_i2,
|
|
602
|
+
ATTRIBUTES.a_i3,
|
|
603
|
+
]) {
|
|
604
|
+
gl.disableVertexAttribArray(location);
|
|
605
|
+
}
|
|
606
|
+
gl.drawArrays(gl.TRIANGLES, range.first, range.count);
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
private drawGrid(scene: FlowScene, target: FlowGlTarget): void {
|
|
610
|
+
const gl = this.gl;
|
|
611
|
+
const grid = scene.grid!;
|
|
612
|
+
this.uniforms(this.grid, ZERO, 1, target);
|
|
613
|
+
this.corners();
|
|
614
|
+
for (const location of [
|
|
615
|
+
ATTRIBUTES.a_i0,
|
|
616
|
+
ATTRIBUTES.a_i1,
|
|
617
|
+
ATTRIBUTES.a_i2,
|
|
618
|
+
ATTRIBUTES.a_i3,
|
|
619
|
+
]) {
|
|
620
|
+
gl.disableVertexAttribArray(location);
|
|
621
|
+
}
|
|
622
|
+
const zoom = scene.viewport.zoom;
|
|
623
|
+
const variant =
|
|
624
|
+
grid.variant === 'lines' ? 1 : grid.variant === 'cross' ? 2 : 0;
|
|
625
|
+
// A mark's on-screen size, the 2D path's own arithmetic: a dot is
|
|
626
|
+
// `size * 2 * zoom` across (at least a pixel) and a cross's arm
|
|
627
|
+
// `size * 3 * zoom` (at least two).
|
|
628
|
+
const mark =
|
|
629
|
+
variant === 0
|
|
630
|
+
? Math.max(1, Math.round(grid.size * 2 * zoom))
|
|
631
|
+
: variant === 2
|
|
632
|
+
? Math.max(2, grid.size * 3 * zoom)
|
|
633
|
+
: 1;
|
|
634
|
+
const color = this.colors.get(grid.color);
|
|
635
|
+
gl.uniform3f(
|
|
636
|
+
this.grid.uniforms.u_grid,
|
|
637
|
+
grid.origin.x,
|
|
638
|
+
grid.origin.y,
|
|
639
|
+
grid.step,
|
|
640
|
+
);
|
|
641
|
+
gl.uniform2f(this.grid.uniforms.u_mark, variant, mark);
|
|
642
|
+
gl.uniform4f(
|
|
643
|
+
this.grid.uniforms.u_color,
|
|
644
|
+
color[0],
|
|
645
|
+
color[1],
|
|
646
|
+
color[2],
|
|
647
|
+
color[3],
|
|
648
|
+
);
|
|
649
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
private scissor(rect: FlowRect | undefined, target: FlowGlTarget): void {
|
|
653
|
+
const gl = this.gl;
|
|
654
|
+
if (!rect) {
|
|
655
|
+
gl.disable(gl.SCISSOR_TEST);
|
|
656
|
+
return;
|
|
657
|
+
}
|
|
658
|
+
const s = target.scale;
|
|
659
|
+
const x = Math.floor((rect.x - target.origin.x) * s);
|
|
660
|
+
const y = Math.floor((rect.y - target.origin.y) * s);
|
|
661
|
+
const w = Math.ceil(rect.width * s);
|
|
662
|
+
const h = Math.ceil(rect.height * s);
|
|
663
|
+
gl.enable(gl.SCISSOR_TEST);
|
|
664
|
+
// GL's scissor counts up from the bottom; the scene counts down.
|
|
665
|
+
gl.scissor(x, target.height - (y + h), w, h);
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
dispose(): void {
|
|
669
|
+
const gl = this.gl;
|
|
670
|
+
gl.deleteBuffer(this.quad);
|
|
671
|
+
this.world.dispose();
|
|
672
|
+
this.lifted.dispose();
|
|
673
|
+
this.overlay.dispose();
|
|
674
|
+
for (const program of [this.line, this.box, this.tri, this.grid]) {
|
|
675
|
+
gl.deleteProgram(program.program);
|
|
676
|
+
}
|
|
677
|
+
gl.deleteVertexArray(this.vao);
|
|
678
|
+
}
|
|
679
|
+
}
|