@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/maps/gl/view.ts
CHANGED
|
@@ -63,7 +63,7 @@ import type { OverlayBucket } from './overlays.js';
|
|
|
63
63
|
import { GL_PANE } from './pane.js';
|
|
64
64
|
import { LABEL_INSTANCE, LabelPlacer } from './placement.js';
|
|
65
65
|
import type { LabelBatch, PlacementFrame } from './placement.js';
|
|
66
|
-
import { GlMapRenderer } from './renderer.js';
|
|
66
|
+
import { GlMapRenderer, gatesAt } from './renderer.js';
|
|
67
67
|
import type {
|
|
68
68
|
AttributionDraw,
|
|
69
69
|
FadeFrame,
|
|
@@ -72,7 +72,7 @@ import type {
|
|
|
72
72
|
RenderTile,
|
|
73
73
|
} from './renderer.js';
|
|
74
74
|
import { GlTileStore } from './store.js';
|
|
75
|
-
import { LabelAtlas, SurfaceTextEngine } from './text.js';
|
|
75
|
+
import { LabelAtlas, SurfaceTextEngine, fieldBase } from './text.js';
|
|
76
76
|
|
|
77
77
|
const h = React.createElement;
|
|
78
78
|
|
|
@@ -193,6 +193,12 @@ const BUILD_BUDGET_MS = 6;
|
|
|
193
193
|
* — the one label cost that can be large (the first strings on X11 load
|
|
194
194
|
* fonts and rasterize glyphs in JS). Placement's remainder waits a frame. */
|
|
195
195
|
const TEXT_BUDGET_MOVING_MS = 1;
|
|
196
|
+
/** Milliseconds a frame may spend making label fields (`text.ts`), about
|
|
197
|
+
* 0.2 ms each, when there are any to make. */
|
|
198
|
+
const FIELD_BUDGET_MS = 4;
|
|
199
|
+
/** With `labelsWhileMoving`: milliseconds a frame may spend setting the
|
|
200
|
+
* text of names it has just placed, so they draw in it. */
|
|
201
|
+
const LIVE_TEXT_BUDGET_MS = 8;
|
|
196
202
|
const TEXT_BUDGET_SETTLED_MS = 4;
|
|
197
203
|
/**
|
|
198
204
|
* How often a moving view is placed again, in milliseconds — every other
|
|
@@ -246,12 +252,161 @@ const EMPTY_COVER: CoverResult = {
|
|
|
246
252
|
};
|
|
247
253
|
|
|
248
254
|
/** Which levels a frame shows: one, or two while the second fades in. */
|
|
249
|
-
interface LevelPlan {
|
|
255
|
+
export interface LevelPlan {
|
|
250
256
|
base: CoverResult;
|
|
251
257
|
next: CoverResult | null;
|
|
252
258
|
alpha: number;
|
|
253
259
|
}
|
|
254
260
|
|
|
261
|
+
/**
|
|
262
|
+
* The level fade: which level the frame is drawn from, and the one fading
|
|
263
|
+
* in over it.
|
|
264
|
+
*
|
|
265
|
+
* A new level is waited for — briefly, until every tile of it in view has
|
|
266
|
+
* answered — so the fade shows it arriving rather than a stand-in for it;
|
|
267
|
+
* then it fades in over the level it replaces, with an ease at both ends.
|
|
268
|
+
* A level more than one step away is not faded (the view it would fade
|
|
269
|
+
* from is sixteen times the tiles), and a change of target halfway
|
|
270
|
+
* through a fade takes the half-shown level as the one it fades from.
|
|
271
|
+
*
|
|
272
|
+
* What it cannot carry is a layer the style starts or stops drawing, which
|
|
273
|
+
* is {@link GateFader}'s: see there for why that is a separate thing and
|
|
274
|
+
* not a scene of its own.
|
|
275
|
+
*/
|
|
276
|
+
export class LevelFader {
|
|
277
|
+
/** The level the frame is drawn from, once one has been drawn. */
|
|
278
|
+
shown: number | null = null;
|
|
279
|
+
private _fade: {
|
|
280
|
+
to: number;
|
|
281
|
+
start: number | null;
|
|
282
|
+
waitSince: number;
|
|
283
|
+
} | null = null;
|
|
284
|
+
|
|
285
|
+
/** Whether a fade is running or waiting to start. */
|
|
286
|
+
get fading(): boolean {
|
|
287
|
+
return this._fade !== null;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
plan(
|
|
291
|
+
target: CoverResult,
|
|
292
|
+
cover: (level: number) => CoverResult,
|
|
293
|
+
options: { at: number; fadeMs: number },
|
|
294
|
+
): LevelPlan {
|
|
295
|
+
const { at, fadeMs } = options;
|
|
296
|
+
const to = target.level;
|
|
297
|
+
const plain = { base: target, next: null, alpha: 0 };
|
|
298
|
+
if (fadeMs <= 0 || this.shown === null || Math.abs(to - this.shown) > 1) {
|
|
299
|
+
this.shown = to;
|
|
300
|
+
this._fade = null;
|
|
301
|
+
return plain;
|
|
302
|
+
}
|
|
303
|
+
if (to === this.shown) {
|
|
304
|
+
this._fade = null;
|
|
305
|
+
return plain;
|
|
306
|
+
}
|
|
307
|
+
let fade = this._fade;
|
|
308
|
+
if (!fade || fade.to !== to) {
|
|
309
|
+
if (fade && fade.start !== null && (at - fade.start) / fadeMs >= 0.5) {
|
|
310
|
+
this.shown = fade.to;
|
|
311
|
+
}
|
|
312
|
+
if (this.shown === to) {
|
|
313
|
+
this._fade = null;
|
|
314
|
+
return plain;
|
|
315
|
+
}
|
|
316
|
+
fade = this._fade = { to, start: null, waitSince: at };
|
|
317
|
+
}
|
|
318
|
+
const base = cover(this.shown);
|
|
319
|
+
if (fade.start === null) {
|
|
320
|
+
if (target.missing.length > 0 && at - fade.waitSince < FADE_WAIT_MS) {
|
|
321
|
+
return { base, next: null, alpha: 0 };
|
|
322
|
+
}
|
|
323
|
+
fade.start = at;
|
|
324
|
+
}
|
|
325
|
+
const p = (at - fade.start) / fadeMs;
|
|
326
|
+
if (p >= 1) {
|
|
327
|
+
this.shown = to;
|
|
328
|
+
this._fade = null;
|
|
329
|
+
return plain;
|
|
330
|
+
}
|
|
331
|
+
return { base, next: target, alpha: p * p * (3 - 2 * p) };
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* The zoom gate's fade: how much of each style layer to draw, as the camera
|
|
337
|
+
* zooms past the `minZoom` and `maxZoom` the style gives them.
|
|
338
|
+
*
|
|
339
|
+
* **Why this is not a scene.** A level fade cross-fades two whole pictures,
|
|
340
|
+
* and a picture is the natural unit for a change of level. A layer ending
|
|
341
|
+
* is not: `minZoom` is a zoom, the pyramid changes level at a different
|
|
342
|
+
* zoom, and the two flips land on different frames — so carrying the gate
|
|
343
|
+
* as a second scene means a fade retargeted in the middle of another one,
|
|
344
|
+
* which can only either snap to the arriving scene or restart from the
|
|
345
|
+
* outgoing one. Both are a step in the picture, and stepping is what the
|
|
346
|
+
* fade is for. That is what made buildings vanish for one wheel notch and
|
|
347
|
+
* come back for the next. An opacity per layer has no such conflict: each
|
|
348
|
+
* layer's number moves on its own, through any number of level fades, and
|
|
349
|
+
* both scenes of a level fade draw with the same numbers — so the one
|
|
350
|
+
* thing an opacity ramp is bad at, a map dissolving layer by layer, cannot
|
|
351
|
+
* happen here, because only the layers actually crossing a gate move.
|
|
352
|
+
*/
|
|
353
|
+
export class GateFader {
|
|
354
|
+
/** Per style layer, in the prepared style's order. */
|
|
355
|
+
private _alpha: number[] = [];
|
|
356
|
+
private _at: number | null = null;
|
|
357
|
+
private _fading = false;
|
|
358
|
+
|
|
359
|
+
/** Whether any layer is between the gate's ends — a frame to ask for. */
|
|
360
|
+
get fading(): boolean {
|
|
361
|
+
return this._fading;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* The frame's `layerAlpha`, or null for "what the gate says" — which is
|
|
366
|
+
* every frame where nothing is crossing one, and every frame at all with
|
|
367
|
+
* the fade turned off.
|
|
368
|
+
*/
|
|
369
|
+
step(
|
|
370
|
+
style: PreparedStyle,
|
|
371
|
+
options: {
|
|
372
|
+
at: number;
|
|
373
|
+
fadeMs: number;
|
|
374
|
+
zoom: number;
|
|
375
|
+
/** Adaptive quality's, from the rung this frame is drawn at. */
|
|
376
|
+
detail: number;
|
|
377
|
+
},
|
|
378
|
+
): readonly number[] | null {
|
|
379
|
+
const { at, fadeMs, zoom, detail } = options;
|
|
380
|
+
const targets = gatesAt(style, zoom, detail);
|
|
381
|
+
// The first frame, a restyle that changes the layer count, and the fade
|
|
382
|
+
// turned off: the gate, with nothing to advance.
|
|
383
|
+
const first = this._at === null || this._alpha.length !== targets.length;
|
|
384
|
+
if (fadeMs <= 0 || first) {
|
|
385
|
+
this._alpha = targets;
|
|
386
|
+
this._at = at;
|
|
387
|
+
this._fading = false;
|
|
388
|
+
return null;
|
|
389
|
+
}
|
|
390
|
+
const step = (at - (this._at ?? at)) / fadeMs;
|
|
391
|
+
this._at = at;
|
|
392
|
+
let fading = false;
|
|
393
|
+
let moved = false;
|
|
394
|
+
for (let i = 0; i < targets.length; i++) {
|
|
395
|
+
const to = targets[i];
|
|
396
|
+
const from = this._alpha[i];
|
|
397
|
+
if (from !== to) {
|
|
398
|
+
const next =
|
|
399
|
+
to > from ? Math.min(to, from + step) : Math.max(to, from - step);
|
|
400
|
+
this._alpha[i] = next;
|
|
401
|
+
if (next !== to) fading = true;
|
|
402
|
+
}
|
|
403
|
+
if (this._alpha[i] !== to) moved = true;
|
|
404
|
+
}
|
|
405
|
+
this._fading = fading;
|
|
406
|
+
return moved ? this._alpha : null;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
255
410
|
/** One source on the map, as a frame found it. */
|
|
256
411
|
interface SourceCover {
|
|
257
412
|
source: MapSource;
|
|
@@ -278,7 +433,13 @@ export interface GlMapPaneProps {
|
|
|
278
433
|
children?: ReactNode;
|
|
279
434
|
}
|
|
280
435
|
|
|
281
|
-
|
|
436
|
+
/**
|
|
437
|
+
* The driver: everything a frame is, between the controller's camera and
|
|
438
|
+
* the renderer. Exported for the tests that drive it against a recording
|
|
439
|
+
* GL table — there is no other way to see a whole frame's decisions, and
|
|
440
|
+
* this host cannot render one (indirect GLX has no shaders).
|
|
441
|
+
*/
|
|
442
|
+
export class GlMapDriver implements MapView {
|
|
282
443
|
props: GlMapPaneProps;
|
|
283
444
|
theme: unknown = null;
|
|
284
445
|
private readonly _controller: MapController;
|
|
@@ -301,13 +462,18 @@ class GlMapDriver implements MapView {
|
|
|
301
462
|
private _zoomedAt = -Infinity;
|
|
302
463
|
private _rung = 0;
|
|
303
464
|
private readonly _cost = new CostModel();
|
|
304
|
-
private
|
|
305
|
-
private
|
|
306
|
-
to: number;
|
|
307
|
-
start: number | null;
|
|
308
|
-
waitSince: number;
|
|
309
|
-
} | null = null;
|
|
465
|
+
private readonly _fader = new LevelFader();
|
|
466
|
+
private readonly _gates = new GateFader();
|
|
310
467
|
private readonly _placer = new LabelPlacer();
|
|
468
|
+
/** Places the labels of the view a glide stops at, and shows nothing:
|
|
469
|
+
* what it asks the atlas for is measured and set while the glide is
|
|
470
|
+
* still being drawn. */
|
|
471
|
+
private readonly _scout = new LabelPlacer();
|
|
472
|
+
/** The destination the scout last placed, and whether that placement
|
|
473
|
+
* measured everything it offered — a frame's text budget can run out
|
|
474
|
+
* first, and then the next frame places it again. */
|
|
475
|
+
private _scoutedFor = '';
|
|
476
|
+
private _scoutDone = false;
|
|
311
477
|
private readonly _markers = new MarkerBatcher();
|
|
312
478
|
/** The overlays' bucket, and what it was built from. */
|
|
313
479
|
private _overlay: {
|
|
@@ -323,7 +489,7 @@ class GlMapDriver implements MapView {
|
|
|
323
489
|
/** The attribution's one instance. */
|
|
324
490
|
private readonly _attributionText = new Float32Array(LABEL_INSTANCE);
|
|
325
491
|
/** An attribution a frame could not draw yet — its string not measured,
|
|
326
|
-
* or its
|
|
492
|
+
* or its field not in the texture — and the size it is drawn at. */
|
|
327
493
|
private _attributionWanted: { text: string; size: number } | null = null;
|
|
328
494
|
/** When labels were last placed. */
|
|
329
495
|
private _placedAt = -Infinity;
|
|
@@ -544,6 +710,9 @@ class GlMapDriver implements MapView {
|
|
|
544
710
|
this._frame(gl, info);
|
|
545
711
|
} finally {
|
|
546
712
|
controller.painting = false;
|
|
713
|
+
// `onFrame` ran inside that, and a camera animation drives itself
|
|
714
|
+
// from it — so whatever it asked for is scheduled here.
|
|
715
|
+
controller.paintEnded();
|
|
547
716
|
}
|
|
548
717
|
} catch (error) {
|
|
549
718
|
// Core hands an `onDraw` throw to `<glarea onError>` and nothing else;
|
|
@@ -604,69 +773,30 @@ class GlMapDriver implements MapView {
|
|
|
604
773
|
return out;
|
|
605
774
|
}
|
|
606
775
|
|
|
776
|
+
/**
|
|
777
|
+
* How long a moving frame may take, or null for "as long as it likes".
|
|
778
|
+
*
|
|
779
|
+
* **On unless turned off.** A renderer with no budget spends whatever a
|
|
780
|
+
* frame costs and asks for the next one on the following compositor tick
|
|
781
|
+
* regardless, so at the expensive end of a zoom sweep it takes the whole
|
|
782
|
+
* thread — and the app around it stops getting its timers. Measured on a
|
|
783
|
+
* fly across ten levels: without a budget the loop went a second at a time
|
|
784
|
+
* without running a `setTimeout`, and nothing inside it was slow, because
|
|
785
|
+
* the cost was spread over a hundred frames rather than spent in one call.
|
|
786
|
+
* With the budget, none. An embedding app should not have to know that to
|
|
787
|
+
* keep its own clock.
|
|
788
|
+
*
|
|
789
|
+
* What it costs is detail while the camera moves, and only while it moves:
|
|
790
|
+
* the frame after it settles draws everything again.
|
|
791
|
+
*/
|
|
607
792
|
private _budget(): number | null {
|
|
608
793
|
const adaptive = this.props.map.adaptive;
|
|
609
|
-
if (
|
|
794
|
+
if (adaptive === false) return null;
|
|
610
795
|
return typeof adaptive === 'object'
|
|
611
796
|
? (adaptive.budgetMs ?? DEFAULT_BUDGET_MS)
|
|
612
797
|
: DEFAULT_BUDGET_MS;
|
|
613
798
|
}
|
|
614
799
|
|
|
615
|
-
/**
|
|
616
|
-
* The level fade: which level the frame is drawn from, and the one fading
|
|
617
|
-
* in over it.
|
|
618
|
-
*
|
|
619
|
-
* A new level is waited for — briefly, until every tile of it in view has
|
|
620
|
-
* answered — so the fade shows it arriving rather than a stand-in for it;
|
|
621
|
-
* then it fades in over the level it replaces, with an ease at both ends.
|
|
622
|
-
* A level more than one step away is not faded (the view it would fade
|
|
623
|
-
* from is sixteen times the tiles), and a change of target halfway
|
|
624
|
-
* through a fade takes the half-shown level as the one it fades from.
|
|
625
|
-
*/
|
|
626
|
-
private _planLevels(
|
|
627
|
-
target: CoverResult,
|
|
628
|
-
cover: (level: number) => CoverResult,
|
|
629
|
-
at: number,
|
|
630
|
-
): LevelPlan {
|
|
631
|
-
const fadeMs = this.props.map.levelFade ?? 0;
|
|
632
|
-
const to = target.level;
|
|
633
|
-
const plain = { base: target, next: null, alpha: 0 };
|
|
634
|
-
if (fadeMs <= 0 || this._shown === null || Math.abs(to - this._shown) > 1) {
|
|
635
|
-
this._shown = to;
|
|
636
|
-
this._fade = null;
|
|
637
|
-
return plain;
|
|
638
|
-
}
|
|
639
|
-
if (to === this._shown) {
|
|
640
|
-
this._fade = null;
|
|
641
|
-
return plain;
|
|
642
|
-
}
|
|
643
|
-
let fade = this._fade;
|
|
644
|
-
if (!fade || fade.to !== to) {
|
|
645
|
-
if (fade && fade.start !== null && (at - fade.start) / fadeMs >= 0.5) {
|
|
646
|
-
this._shown = fade.to;
|
|
647
|
-
}
|
|
648
|
-
if (this._shown === to) {
|
|
649
|
-
this._fade = null;
|
|
650
|
-
return plain;
|
|
651
|
-
}
|
|
652
|
-
fade = this._fade = { to, start: null, waitSince: at };
|
|
653
|
-
}
|
|
654
|
-
const base = cover(this._shown);
|
|
655
|
-
if (fade.start === null) {
|
|
656
|
-
if (target.missing.length > 0 && at - fade.waitSince < FADE_WAIT_MS) {
|
|
657
|
-
return { base, next: null, alpha: 0 };
|
|
658
|
-
}
|
|
659
|
-
fade.start = at;
|
|
660
|
-
}
|
|
661
|
-
const p = (at - fade.start) / fadeMs;
|
|
662
|
-
if (p >= 1) {
|
|
663
|
-
this._shown = to;
|
|
664
|
-
this._fade = null;
|
|
665
|
-
return plain;
|
|
666
|
-
}
|
|
667
|
-
return { base, next: target, alpha: p * p * (3 - 2 * p) };
|
|
668
|
-
}
|
|
669
|
-
|
|
670
800
|
private _frame(gl: unknown, info: DrawInfo): void {
|
|
671
801
|
const map = this.props.map;
|
|
672
802
|
const controller = this._controller;
|
|
@@ -716,6 +846,24 @@ class GlMapDriver implements MapView {
|
|
|
716
846
|
return { source, store, pyramid, target };
|
|
717
847
|
});
|
|
718
848
|
|
|
849
|
+
// Where a wheel's glide stops, while one is running: its tiles are
|
|
850
|
+
// asked for after the view's own, so the view the glide lands on is
|
|
851
|
+
// loaded — and its labels set, below — by the time it gets there.
|
|
852
|
+
const destination = moving ? controller.destination() : null;
|
|
853
|
+
const ahead = destination
|
|
854
|
+
? covers.map((c) => {
|
|
855
|
+
const cover = renderCover(
|
|
856
|
+
destination,
|
|
857
|
+
pane,
|
|
858
|
+
scale,
|
|
859
|
+
c.pyramid,
|
|
860
|
+
c.store,
|
|
861
|
+
);
|
|
862
|
+
c.store.want(cover.missing);
|
|
863
|
+
return cover;
|
|
864
|
+
})
|
|
865
|
+
: null;
|
|
866
|
+
|
|
719
867
|
// The level fade and adaptive quality are the first source's — the
|
|
720
868
|
// basemap's; a pyramid over it is drawn at its own level throughout.
|
|
721
869
|
const primary = covers[0] ?? null;
|
|
@@ -725,8 +873,9 @@ class GlMapDriver implements MapView {
|
|
|
725
873
|
level,
|
|
726
874
|
})
|
|
727
875
|
: EMPTY_COVER;
|
|
876
|
+
const fadeMs = map.levelFade ?? 0;
|
|
728
877
|
const plan: LevelPlan = primary
|
|
729
|
-
? this.
|
|
878
|
+
? this._fader.plan(primary.target, coverAt, { at, fadeMs })
|
|
730
879
|
: { base: EMPTY_COVER, next: null, alpha: 0 };
|
|
731
880
|
if (primary && plan.base !== primary.target) {
|
|
732
881
|
primary.store.want(plan.base.missing);
|
|
@@ -769,13 +918,28 @@ class GlMapDriver implements MapView {
|
|
|
769
918
|
};
|
|
770
919
|
let rung = 0;
|
|
771
920
|
let predictedMs = 0;
|
|
921
|
+
// An overview of the view: its ancestors every other level up to the
|
|
922
|
+
// pyramid's root, asked for after the view's own tiles and looked up
|
|
923
|
+
// every frame, so they stay loaded. A view is a speck at those levels,
|
|
924
|
+
// so this is a tile or two a level. It is what a fast zoom out lands
|
|
925
|
+
// on: a trackpad's momentum can cross fifteen levels in a quarter of a
|
|
926
|
+
// second, and every level it passes that has no tile draws the style's
|
|
927
|
+
// background alone — a frame of one flat colour, labels gone with the
|
|
928
|
+
// tiles, where a coarser tile would have drawn the place, blurred. With
|
|
929
|
+
// one level of it in reach two levels up, a hole is always filled from
|
|
930
|
+
// above (`renderCover`'s ancestors reach eight). The level just above
|
|
931
|
+
// the view comes first: it is also what the ladder's last rungs draw.
|
|
932
|
+
if (primary) {
|
|
933
|
+
const top = primary.pyramid.minZoom;
|
|
934
|
+
for (
|
|
935
|
+
let level = primary.target.level - 1;
|
|
936
|
+
level >= top;
|
|
937
|
+
level = level - 2 < top && level > top ? top : level - 2
|
|
938
|
+
) {
|
|
939
|
+
primary.store.want(coverAt(level).missing);
|
|
940
|
+
}
|
|
941
|
+
}
|
|
772
942
|
if (budget !== null && moving && primary) {
|
|
773
|
-
// The coarser level is what the ladder's last rungs draw, so ask for
|
|
774
|
-
// it too — after the view's own tiles, which come first.
|
|
775
|
-
primary.store.want(
|
|
776
|
-
coverAt(Math.max(primary.pyramid.minZoom, primary.target.level - 1))
|
|
777
|
-
.missing,
|
|
778
|
-
);
|
|
779
943
|
const predict = (r: number): number => {
|
|
780
944
|
const built = build(r);
|
|
781
945
|
const work =
|
|
@@ -789,6 +953,24 @@ class GlMapDriver implements MapView {
|
|
|
789
953
|
this._rung = rung;
|
|
790
954
|
const { frame, fade } = build(rung);
|
|
791
955
|
|
|
956
|
+
// A layer crossing a gate — the style's `minZoom`, or this rung's
|
|
957
|
+
// `detail` — is ramped rather than cut, and both of a level fade's
|
|
958
|
+
// scenes draw it at the same ramp. Decided after the rung, because the
|
|
959
|
+
// rung is one of the gates: a moving frame that drops the style's
|
|
960
|
+
// newest layers to make its budget would otherwise take them out in
|
|
961
|
+
// one frame and hand them back in one more when the camera settled,
|
|
962
|
+
// which is a flicker on exactly the layers a zoom is looking at.
|
|
963
|
+
const layerAlpha = this._gates.step(prepared, {
|
|
964
|
+
at,
|
|
965
|
+
fadeMs,
|
|
966
|
+
zoom: camera.zoom,
|
|
967
|
+
detail: QUALITY_LADDER[rung].detail,
|
|
968
|
+
});
|
|
969
|
+
if (layerAlpha) {
|
|
970
|
+
frame.layerAlpha = layerAlpha;
|
|
971
|
+
if (fade) fade.frame.layerAlpha = layerAlpha;
|
|
972
|
+
}
|
|
973
|
+
|
|
792
974
|
// The text: the labels, and the attribution, set in the same atlas.
|
|
793
975
|
let labels: LabelBatch | null = null;
|
|
794
976
|
let attribution: AttributionDraw | null = null;
|
|
@@ -798,14 +980,31 @@ class GlMapDriver implements MapView {
|
|
|
798
980
|
try {
|
|
799
981
|
const atlas = this._atlasFor(info.node, style, scale);
|
|
800
982
|
if (atlas) {
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
983
|
+
// Live labels measure at the settled budget while moving too:
|
|
984
|
+
// what they admit mid-zoom has to be measured mid-zoom.
|
|
985
|
+
const live = map.labelsWhileMoving === true;
|
|
986
|
+
const textDeadline =
|
|
987
|
+
now() +
|
|
988
|
+
(moving && !live ? TEXT_BUDGET_MOVING_MS : TEXT_BUDGET_SETTLED_MS);
|
|
989
|
+
atlas.beginFrame(textDeadline);
|
|
804
990
|
// The attribution before the names: it is one string, measured
|
|
805
991
|
// once, and a frame whose budget went on names would leave it
|
|
806
992
|
// for a later one — for as long as names keep arriving.
|
|
807
993
|
attribution = this._attributionFor(atlas, frame);
|
|
808
994
|
labels = this._labelsFor(atlas, frame, fade, at, moving);
|
|
995
|
+
if (destination && ahead) {
|
|
996
|
+
this._scoutFor(atlas, frame, destination, ahead, at);
|
|
997
|
+
} else if (this._scoutedFor !== '') {
|
|
998
|
+
this._scout.reset();
|
|
999
|
+
this._scoutedFor = '';
|
|
1000
|
+
}
|
|
1001
|
+
// The fields of strings already read back, on a budget of their
|
|
1002
|
+
// own: the text budget moving is 1 ms, five fields, and a jump
|
|
1003
|
+
// somewhere new reads back sixty names at once — they came in
|
|
1004
|
+
// over two hundred milliseconds that way, against none for the
|
|
1005
|
+
// coverage rasters fields replaced. This frame's draw uploads
|
|
1006
|
+
// what it makes.
|
|
1007
|
+
atlas.makeFields(Math.max(textDeadline, now() + FIELD_BUDGET_MS));
|
|
809
1008
|
this._pumpSoon();
|
|
810
1009
|
}
|
|
811
1010
|
} catch (error) {
|
|
@@ -928,7 +1127,7 @@ class GlMapDriver implements MapView {
|
|
|
928
1127
|
uploadBytes: stats.uploadBytes,
|
|
929
1128
|
offscreen: stats.offscreen,
|
|
930
1129
|
level,
|
|
931
|
-
shownLevel: this.
|
|
1130
|
+
shownLevel: this._fader.shown ?? level,
|
|
932
1131
|
fade: stats.fade,
|
|
933
1132
|
quality: rung,
|
|
934
1133
|
predictedMs,
|
|
@@ -940,21 +1139,29 @@ class GlMapDriver implements MapView {
|
|
|
940
1139
|
textPending: this._atlas?.pending ?? false,
|
|
941
1140
|
},
|
|
942
1141
|
};
|
|
943
|
-
// A label still fading, strings this frame had no budget to measure,
|
|
944
|
-
//
|
|
945
|
-
// in flight asks for one itself when it lands.
|
|
1142
|
+
// A label still fading, strings this frame had no budget to measure,
|
|
1143
|
+
// fields still to be made, or fields still to go into the texture want
|
|
1144
|
+
// the next frame; a batch in flight asks for one itself when it lands.
|
|
946
1145
|
const labelling =
|
|
947
1146
|
labels !== null &&
|
|
948
1147
|
(this._placer.animating ||
|
|
949
1148
|
this._atlas?.starved === true ||
|
|
1149
|
+
this._atlas?.fielding === true ||
|
|
950
1150
|
this._atlas?.uploading === true);
|
|
951
1151
|
// An attribution this frame could not draw may have gone into the
|
|
952
1152
|
// texture during it — the upload happens as the labels draw, after the
|
|
953
1153
|
// frame chose what to draw — and then it is the next frame's.
|
|
954
1154
|
const wanted = this._attributionWanted;
|
|
955
1155
|
const attributing =
|
|
956
|
-
wanted !== null && this._atlas?.entry(wanted.text
|
|
957
|
-
if (
|
|
1156
|
+
wanted !== null && this._atlas?.entry(wanted.text) != null;
|
|
1157
|
+
if (
|
|
1158
|
+
more ||
|
|
1159
|
+
this._fader.fading ||
|
|
1160
|
+
this._gates.fading ||
|
|
1161
|
+
labelling ||
|
|
1162
|
+
attributing
|
|
1163
|
+
)
|
|
1164
|
+
this.request();
|
|
958
1165
|
if (!this._announced) {
|
|
959
1166
|
this._announced = true;
|
|
960
1167
|
this._pane?.notifyA11ySceneChanged?.();
|
|
@@ -1035,9 +1242,9 @@ class GlMapDriver implements MapView {
|
|
|
1035
1242
|
this._noText = true;
|
|
1036
1243
|
return null;
|
|
1037
1244
|
}
|
|
1038
|
-
//
|
|
1039
|
-
//
|
|
1040
|
-
this._atlas = new LabelAtlas(engine, {
|
|
1245
|
+
// Fields set at a base size that follows the display's scale, so a
|
|
1246
|
+
// label on a 2x panel is sampled from a field twice as fine.
|
|
1247
|
+
this._atlas = new LabelAtlas(engine, { base: fieldBase(scale) });
|
|
1041
1248
|
this._atlas.onChange = this.request;
|
|
1042
1249
|
this._atlasKey = key;
|
|
1043
1250
|
this._placer.reset();
|
|
@@ -1056,6 +1263,7 @@ class GlMapDriver implements MapView {
|
|
|
1056
1263
|
at: number,
|
|
1057
1264
|
moving: boolean,
|
|
1058
1265
|
): LabelBatch {
|
|
1266
|
+
const live = this.props.map.labelsWhileMoving === true;
|
|
1059
1267
|
const from = fade && fade.alpha >= 0.5 ? fade.frame : frame;
|
|
1060
1268
|
const centre = project(this._controller.camera().center);
|
|
1061
1269
|
const placement: PlacementFrame = {
|
|
@@ -1070,21 +1278,76 @@ class GlMapDriver implements MapView {
|
|
|
1070
1278
|
// The projection's world, which the cover lays every source out on.
|
|
1071
1279
|
world: worldSize(frame.zoom, DEFAULT_TILE_SIZE) * frame.scale,
|
|
1072
1280
|
now: at,
|
|
1073
|
-
|
|
1074
|
-
|
|
1281
|
+
// Live: every name the view offers, at every step of a zoom.
|
|
1282
|
+
admit: live || at - this._zoomedAt >= ZOOM_QUIET_MS,
|
|
1075
1283
|
};
|
|
1076
|
-
if (!moving || at - this._placedAt >= PLACE_INTERVAL_MS) {
|
|
1284
|
+
if (live || !moving || at - this._placedAt >= PLACE_INTERVAL_MS) {
|
|
1077
1285
|
this._placer.place(placement, atlas);
|
|
1078
1286
|
this._placedAt = at;
|
|
1079
1287
|
}
|
|
1288
|
+
// Live: what placement asked for is set now, before the batch, so a
|
|
1289
|
+
// name placed in this frame is drawn in it — its field goes into the
|
|
1290
|
+
// texture ahead of the cap, before this frame's labels draw.
|
|
1291
|
+
if (live) atlas.setNow(now() + LIVE_TEXT_BUDGET_MS);
|
|
1080
1292
|
return this._placer.batch(placement, atlas);
|
|
1081
1293
|
}
|
|
1082
1294
|
|
|
1295
|
+
/**
|
|
1296
|
+
* Render ahead: place the labels of the view a glide stops at, so that
|
|
1297
|
+
* every string it will show is measured and asked of the atlas while the
|
|
1298
|
+
* glide's own frames are drawn. Nothing it places is drawn — the frame's
|
|
1299
|
+
* placer places the destination again when it gets there, and finds every
|
|
1300
|
+
* box measured and every field in the texture, so the labels fade in
|
|
1301
|
+
* when the view settles rather than a readback and an upload after.
|
|
1302
|
+
*
|
|
1303
|
+
* A fresh placement each time (the scout keeps no labels between runs;
|
|
1304
|
+
* holding a place is for what is on screen), and not every frame: when
|
|
1305
|
+
* the destination moves — another notch — or more of its tiles land, or
|
|
1306
|
+
* the last placement ran out of the frame's text budget before it had
|
|
1307
|
+
* measured everything. It measures out of that budget, after the frame's
|
|
1308
|
+
* own labels.
|
|
1309
|
+
*/
|
|
1310
|
+
private _scoutFor(
|
|
1311
|
+
atlas: LabelAtlas,
|
|
1312
|
+
frame: RenderFrame,
|
|
1313
|
+
destination: MapCamera,
|
|
1314
|
+
covers: readonly CoverResult[],
|
|
1315
|
+
at: number,
|
|
1316
|
+
): void {
|
|
1317
|
+
// The destination is recomputed from each frame's camera, so its last
|
|
1318
|
+
// digits wander; to a millionth of a degree it is the same place. And
|
|
1319
|
+
// it is a different question once more of its tiles are in hand.
|
|
1320
|
+
let held = 0;
|
|
1321
|
+
for (const c of covers) held += c.own;
|
|
1322
|
+
const key = `${destination.zoom}|${destination.center.lon.toFixed(6)}|${destination.center.lat.toFixed(6)}|${held}`;
|
|
1323
|
+
if (key === this._scoutedFor && this._scoutDone) return;
|
|
1324
|
+
this._scoutedFor = key;
|
|
1325
|
+
const centre = project(destination.center);
|
|
1326
|
+
this._scout.reset();
|
|
1327
|
+
this._scout.place(
|
|
1328
|
+
{
|
|
1329
|
+
width: frame.width,
|
|
1330
|
+
height: frame.height,
|
|
1331
|
+
scale: frame.scale,
|
|
1332
|
+
zoom: destination.zoom,
|
|
1333
|
+
style: frame.style,
|
|
1334
|
+
tiles: covers.flatMap((c) => c.tiles),
|
|
1335
|
+
centerX: centre.x,
|
|
1336
|
+
centerY: centre.y,
|
|
1337
|
+
world: worldSize(destination.zoom, DEFAULT_TILE_SIZE) * frame.scale,
|
|
1338
|
+
now: at,
|
|
1339
|
+
admit: true,
|
|
1340
|
+
},
|
|
1341
|
+
atlas,
|
|
1342
|
+
);
|
|
1343
|
+
this._scoutDone = !atlas.starved;
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1083
1346
|
/**
|
|
1084
1347
|
* The attribution, as the retained renderer draws it: the same box on the
|
|
1085
1348
|
* same pixels (`attributionLayout`), the text in the labels' face, from
|
|
1086
1349
|
* the labels' atlas. Null while there is none to draw — `attribution=""`,
|
|
1087
|
-
* or no source that names one — and until its
|
|
1350
|
+
* or no source that names one — and until its field is in the texture,
|
|
1088
1351
|
* so the box and its text arrive together.
|
|
1089
1352
|
*/
|
|
1090
1353
|
private _attributionFor(
|
|
@@ -1098,7 +1361,7 @@ class GlMapDriver implements MapView {
|
|
|
1098
1361
|
const s = frame.scale;
|
|
1099
1362
|
const size = ATTRIBUTION_SIZE * s;
|
|
1100
1363
|
const box = atlas.measure(text, size);
|
|
1101
|
-
const entry = box ? atlas.entry(text
|
|
1364
|
+
const entry = box ? atlas.entry(text) : null;
|
|
1102
1365
|
if (!box || !entry) {
|
|
1103
1366
|
this._attributionWanted = { text, size };
|
|
1104
1367
|
return null;
|
|
@@ -1109,12 +1372,13 @@ class GlMapDriver implements MapView {
|
|
|
1109
1372
|
s,
|
|
1110
1373
|
);
|
|
1111
1374
|
const palette = overlayPalette(this.theme);
|
|
1112
|
-
// The string sits `pad` inside its
|
|
1113
|
-
//
|
|
1114
|
-
// string's corner on the layout's.
|
|
1375
|
+
// The string sits `pad` texels inside its field, the field is drawn
|
|
1376
|
+
// `k` device pixels a texel, and a level label's quad is centred on its
|
|
1377
|
+
// anchor: this anchor puts the string's corner on the layout's.
|
|
1378
|
+
const k = size / atlas.base;
|
|
1115
1379
|
const d = this._attributionText;
|
|
1116
|
-
d[0] = at.x
|
|
1117
|
-
d[1] = at.y
|
|
1380
|
+
d[0] = at.x + (entry.width / 2 - atlas.pad) * k;
|
|
1381
|
+
d[1] = at.y + (entry.height / 2 - atlas.pad) * k;
|
|
1118
1382
|
d[2] = 1;
|
|
1119
1383
|
d[3] = 0;
|
|
1120
1384
|
d[4] = entry.x;
|
|
@@ -1124,6 +1388,7 @@ class GlMapDriver implements MapView {
|
|
|
1124
1388
|
d.set(premultiplied(parseColor(palette.text) ?? BLACK), 8);
|
|
1125
1389
|
d.fill(0, 12, 17); // no halo: the box is what it reads against
|
|
1126
1390
|
d[17] = 1;
|
|
1391
|
+
d[18] = k;
|
|
1127
1392
|
return {
|
|
1128
1393
|
box: at.box,
|
|
1129
1394
|
boxColor: premultiplied(
|