@react-x11/components 0.9.0 → 0.10.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 +3 -1
- 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/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/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 +13 -2
- package/dist/codeblock/index.d.ts.map +1 -1
- package/dist/codeblock/index.js +20 -3
- 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 +240 -6
- package/dist/html/css/cascade.d.ts.map +1 -1
- package/dist/html/css/cascade.js +1327 -66
- 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 +498 -15
- package/dist/html/css/style.d.ts.map +1 -1
- package/dist/html/css/style.js +3698 -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 +57 -11
- 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 +2937 -197
- package/dist/html/layout/block.js.map +1 -1
- package/dist/html/layout/boxes.d.ts +340 -17
- package/dist/html/layout/boxes.d.ts.map +1 -1
- package/dist/html/layout/boxes.js +1714 -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 +151 -1
- package/dist/html/layout/inline.d.ts.map +1 -1
- package/dist/html/layout/inline.js +3375 -174
- 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 +1331 -100
- 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 +3503 -141
- 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 +435 -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/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 +112 -43
- 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 +35 -1
- 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/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/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 +6 -1
- package/dist/terminal-output/index.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 +3 -1
- 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/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/stream.ts +257 -17
- package/src/code-language/types.ts +5 -4
- package/src/codeblock/index.ts +20 -3
- 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 +1403 -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 +4102 -222
- package/src/html/css/ua.ts +58 -12
- 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 +3456 -230
- package/src/html/layout/boxes.ts +2100 -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 +3943 -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 +1481 -118
- package/src/html/paint.ts +4293 -169
- package/src/html/resources.ts +161 -50
- package/src/html/surfaces.ts +81 -0
- package/src/html/svg.ts +493 -0
- package/src/html/url.ts +86 -0
- package/src/index.ts +2 -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 +149 -67
- 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 +34 -1
- package/src/rich-text-editor/keymap.ts +1 -1
- package/src/rich-text-editor/keys.ts +135 -26
- package/src/rich-text-editor/marks.ts +101 -0
- package/src/rich-text-editor/render.ts +49 -12
- 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 +6 -1
- package/src/three/canvas.ts +102 -8
- package/src/three/events.ts +49 -9
- package/src/tree/index.ts +19 -0
package/src/maps/anchors.ts
CHANGED
|
@@ -36,8 +36,10 @@
|
|
|
36
36
|
// Everything leaves as one Float32Array and a string table, so a worker can
|
|
37
37
|
// hand it over with the buckets (see `./gl/store.ts`).
|
|
38
38
|
import { GeomType, GeometryBuffer } from './mvt.js';
|
|
39
|
-
import type { FeatureCursor, VectorTile } from './mvt.js';
|
|
39
|
+
import type { FeatureCursor, VectorTile, VectorTileLayer } from './mvt.js';
|
|
40
40
|
import type { PreparedStyle } from './paint.js';
|
|
41
|
+
import { latFromMercatorY } from './proj.js';
|
|
42
|
+
import type { TileId } from './proj.js';
|
|
41
43
|
import type { SymbolLayer } from './style.js';
|
|
42
44
|
|
|
43
45
|
// --- the fit rules both renderers place by ------------------------------------
|
|
@@ -241,6 +243,10 @@ export function buildTileLabels(
|
|
|
241
243
|
tile: VectorTile,
|
|
242
244
|
prepared: PreparedStyle,
|
|
243
245
|
extent: number,
|
|
246
|
+
/** Which tile: what turns a `snapInto` distance in metres into tile
|
|
247
|
+
* units. Without it no distance can be known, and only a point already
|
|
248
|
+
* inside a polygon moves. */
|
|
249
|
+
id?: TileId,
|
|
244
250
|
): GlLabelData {
|
|
245
251
|
const started = now();
|
|
246
252
|
const texts: string[] = [];
|
|
@@ -259,6 +265,11 @@ export function buildTileLabels(
|
|
|
259
265
|
const groups = new Map<number, LineGroup>();
|
|
260
266
|
// Which name first touched each vertex, or -1 once a second did.
|
|
261
267
|
const touched = new Map<number, number>();
|
|
268
|
+
// A layer that snaps into polygons collects its points first — x, y,
|
|
269
|
+
// text, priority — since which point a polygon belongs to depends on
|
|
270
|
+
// every other point that could claim it.
|
|
271
|
+
const snap = symbol.snapInto;
|
|
272
|
+
const snaps: number[] | null = snap ? [] : null;
|
|
262
273
|
|
|
263
274
|
for (let f = 0; f < source.length; f++) {
|
|
264
275
|
source.seek(f, cursor);
|
|
@@ -309,10 +320,23 @@ export function buildTileLabels(
|
|
|
309
320
|
if (!anchor) continue;
|
|
310
321
|
const x = anchor.x * k;
|
|
311
322
|
const y = anchor.y * k;
|
|
323
|
+
if (snaps && cursor.type === GeomType.Point) {
|
|
324
|
+
// The buffer's points too, and judged before the tile's square:
|
|
325
|
+
// a polygon near the edge is claimed by points on either side of
|
|
326
|
+
// it, and both tiles that hold it must see the same claims.
|
|
327
|
+
snaps.push(x, y, t, priority);
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
312
330
|
if (x < 0 || y < 0 || x >= extent || y >= extent) continue;
|
|
313
331
|
out.point(x, y, t, i, priority);
|
|
314
332
|
}
|
|
315
333
|
|
|
334
|
+
if (snap && snaps) {
|
|
335
|
+
const polygons = tile.layers.get(snap.sourceLayer);
|
|
336
|
+
const within = (snap.within ?? SNAP_WITHIN) / metresPerUnit(id, extent);
|
|
337
|
+
snapPoints(polygons, within, snaps, extent, i, out, buffer);
|
|
338
|
+
}
|
|
339
|
+
|
|
316
340
|
for (const group of groups.values()) {
|
|
317
341
|
for (const chain of mergeParts(group.parts)) {
|
|
318
342
|
anchorChain(chain, touched, extent, group, i, out);
|
|
@@ -323,6 +347,288 @@ export function buildTileLabels(
|
|
|
323
347
|
return { texts, anchors: out.take(), count: out.count, ms: now() - started };
|
|
324
348
|
}
|
|
325
349
|
|
|
350
|
+
/** How far a point is taken to belong to a polygon it is outside, metres,
|
|
351
|
+
* where the layer does not say. An address point in the lot sits a few
|
|
352
|
+
* metres off its house; much past this, the nearest building is as often
|
|
353
|
+
* a neighbour's — the house the number is for not being mapped at all. */
|
|
354
|
+
const SNAP_WITHIN = 15;
|
|
355
|
+
/** The earth's circumference at the equator, metres (Web Mercator's). */
|
|
356
|
+
const EQUATOR = 40075016.686;
|
|
357
|
+
|
|
358
|
+
/** Metres on the ground per tile unit, at the tile's middle row. */
|
|
359
|
+
function metresPerUnit(id: TileId | undefined, extent: number): number {
|
|
360
|
+
const n = 2 ** (id?.z ?? 0);
|
|
361
|
+
const lat = id ? latFromMercatorY((id.y + 0.5) / n) : 0;
|
|
362
|
+
return (EQUATOR * Math.cos((lat * Math.PI) / 180)) / (n * extent);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/** One polygon's outer ring, in tile units: its points, its box, and the
|
|
366
|
+
* point inside it a label moved into it is set on. */
|
|
367
|
+
interface SnapRing {
|
|
368
|
+
points: number[];
|
|
369
|
+
x0: number;
|
|
370
|
+
y0: number;
|
|
371
|
+
x1: number;
|
|
372
|
+
y1: number;
|
|
373
|
+
cx: number;
|
|
374
|
+
cy: number;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/** The grid rings are found by, in tile units: a z14 tile is 16 cells a
|
|
378
|
+
* side, a few dozen buildings each. */
|
|
379
|
+
const SNAP_CELL = 256;
|
|
380
|
+
const snapCell = (gx: number, gy: number): number =>
|
|
381
|
+
(gx + 1024) * 4096 + (gy + 1024);
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Point labels moved into the polygon each one belongs to — a house number
|
|
385
|
+
* into its house.
|
|
386
|
+
*
|
|
387
|
+
* A point inside a polygon belongs to it; one outside, to the nearest
|
|
388
|
+
* polygon whose outline is within `within` tile units. It moves only if it
|
|
389
|
+
* is the **one** point its polygon is claimed by: a duplex's two numbers, or
|
|
390
|
+
* a garage nearer the street than the house, would otherwise pile several
|
|
391
|
+
* numbers onto one roof — and collision would then keep one of them, on a
|
|
392
|
+
* building that is not only its own. Every point that does not move stays
|
|
393
|
+
* exactly where the data put it.
|
|
394
|
+
*
|
|
395
|
+
* `points` are the whole tile's, buffer included, so a polygon near the edge
|
|
396
|
+
* is claimed alike in both tiles that hold it; each point is then anchored
|
|
397
|
+
* only in the tile its own position is in, as every other point is. One
|
|
398
|
+
* whose polygon's middle is in the next tile over stays put rather than
|
|
399
|
+
* move out of the tile that offers it.
|
|
400
|
+
*/
|
|
401
|
+
function snapPoints(
|
|
402
|
+
polygons: VectorTileLayer | undefined,
|
|
403
|
+
within: number,
|
|
404
|
+
points: readonly number[],
|
|
405
|
+
extent: number,
|
|
406
|
+
layer: number,
|
|
407
|
+
out: AnchorWriter,
|
|
408
|
+
buffer: GeometryBuffer,
|
|
409
|
+
): void {
|
|
410
|
+
const count = points.length / 4;
|
|
411
|
+
const target = new Int32Array(count).fill(-1);
|
|
412
|
+
const rings = polygons ? snapRings(polygons, extent, buffer) : [];
|
|
413
|
+
if (rings.length > 0) {
|
|
414
|
+
const grid = new Map<number, number[]>();
|
|
415
|
+
rings.forEach((ring, r) => {
|
|
416
|
+
for (let gx = cellOf(ring.x0); gx <= cellOf(ring.x1); gx++) {
|
|
417
|
+
for (let gy = cellOf(ring.y0); gy <= cellOf(ring.y1); gy++) {
|
|
418
|
+
const key = snapCell(gx, gy);
|
|
419
|
+
const list = grid.get(key);
|
|
420
|
+
if (list) list.push(r);
|
|
421
|
+
else grid.set(key, [r]);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
const claims = new Int32Array(rings.length);
|
|
426
|
+
// Which query last looked at each ring: a ring spanning several cells
|
|
427
|
+
// is one candidate, not several.
|
|
428
|
+
const seen = new Int32Array(rings.length).fill(-1);
|
|
429
|
+
for (let p = 0; p < count; p++) {
|
|
430
|
+
const r = ownerOf(
|
|
431
|
+
rings,
|
|
432
|
+
grid,
|
|
433
|
+
seen,
|
|
434
|
+
p,
|
|
435
|
+
points[p * 4],
|
|
436
|
+
points[p * 4 + 1],
|
|
437
|
+
within,
|
|
438
|
+
);
|
|
439
|
+
if (r >= 0) {
|
|
440
|
+
target[p] = r;
|
|
441
|
+
claims[r]++;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
for (let p = 0; p < count; p++) {
|
|
445
|
+
if (target[p] >= 0 && claims[target[p]] !== 1) target[p] = -1;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
for (let p = 0; p < count; p++) {
|
|
449
|
+
let x = points[p * 4];
|
|
450
|
+
let y = points[p * 4 + 1];
|
|
451
|
+
if (x < 0 || y < 0 || x >= extent || y >= extent) continue;
|
|
452
|
+
const r = target[p];
|
|
453
|
+
if (r >= 0) {
|
|
454
|
+
const ring = rings[r];
|
|
455
|
+
if (
|
|
456
|
+
ring.cx >= 0 &&
|
|
457
|
+
ring.cy >= 0 &&
|
|
458
|
+
ring.cx < extent &&
|
|
459
|
+
ring.cy < extent
|
|
460
|
+
) {
|
|
461
|
+
x = ring.cx;
|
|
462
|
+
y = ring.cy;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
out.point(x, y, points[p * 4 + 2], layer, points[p * 4 + 3]);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
const cellOf = (v: number): number => Math.floor(v / SNAP_CELL);
|
|
470
|
+
|
|
471
|
+
/** Every polygon's outer rings, in tile units. Holes are not a building's
|
|
472
|
+
* own ground, and a courtyard is not where a number goes. */
|
|
473
|
+
function snapRings(
|
|
474
|
+
source: VectorTileLayer,
|
|
475
|
+
extent: number,
|
|
476
|
+
buffer: GeometryBuffer,
|
|
477
|
+
): SnapRing[] {
|
|
478
|
+
const k = extent / source.extent;
|
|
479
|
+
const cursor = source.feature(0);
|
|
480
|
+
const rings: SnapRing[] = [];
|
|
481
|
+
for (let f = 0; f < source.length; f++) {
|
|
482
|
+
source.seek(f, cursor);
|
|
483
|
+
if (cursor.type !== GeomType.Polygon) continue;
|
|
484
|
+
cursor.readGeometry(buffer);
|
|
485
|
+
for (let part = 0; part < buffer.parts; part++) {
|
|
486
|
+
if (buffer.areas[part] <= 0) continue;
|
|
487
|
+
const from = buffer.starts[part];
|
|
488
|
+
const to = buffer.starts[part + 1];
|
|
489
|
+
if (to - from < 3) continue;
|
|
490
|
+
const points: number[] = [];
|
|
491
|
+
let x0 = Infinity;
|
|
492
|
+
let y0 = Infinity;
|
|
493
|
+
let x1 = -Infinity;
|
|
494
|
+
let y1 = -Infinity;
|
|
495
|
+
for (let p = from; p < to; p++) {
|
|
496
|
+
const x = buffer.coords[p * 2] * k;
|
|
497
|
+
const y = buffer.coords[p * 2 + 1] * k;
|
|
498
|
+
points.push(x, y);
|
|
499
|
+
if (x < x0) x0 = x;
|
|
500
|
+
if (x > x1) x1 = x;
|
|
501
|
+
if (y < y0) y0 = y;
|
|
502
|
+
if (y > y1) y1 = y;
|
|
503
|
+
}
|
|
504
|
+
const [cx, cy] = interiorPoint(points, x0, y0, x1, y1);
|
|
505
|
+
rings.push({ points, x0, y0, x1, y1, cx, cy });
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
return rings;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* A point inside a ring to set a label on: its centroid, which is inside
|
|
513
|
+
* for all but the most contorted outline — 99.8% of the building rings in
|
|
514
|
+
* the tiles this was measured on — and where it is not, the middle of the
|
|
515
|
+
* widest span of the ring along the centroid's row.
|
|
516
|
+
*/
|
|
517
|
+
function interiorPoint(
|
|
518
|
+
points: readonly number[],
|
|
519
|
+
x0: number,
|
|
520
|
+
y0: number,
|
|
521
|
+
x1: number,
|
|
522
|
+
y1: number,
|
|
523
|
+
): [number, number] {
|
|
524
|
+
let area = 0;
|
|
525
|
+
let sx = 0;
|
|
526
|
+
let sy = 0;
|
|
527
|
+
const n = points.length;
|
|
528
|
+
for (let i = 0, j = n - 2; i < n; j = i, i += 2) {
|
|
529
|
+
const cross = points[j] * points[i + 1] - points[i] * points[j + 1];
|
|
530
|
+
area += cross;
|
|
531
|
+
sx += (points[j] + points[i]) * cross;
|
|
532
|
+
sy += (points[j + 1] + points[i + 1]) * cross;
|
|
533
|
+
}
|
|
534
|
+
if (area === 0) return [(x0 + x1) / 2, (y0 + y1) / 2];
|
|
535
|
+
const cx = sx / (3 * area);
|
|
536
|
+
const cy = sy / (3 * area);
|
|
537
|
+
if (insideRing(points, cx, cy)) return [cx, cy];
|
|
538
|
+
const crossings: number[] = [];
|
|
539
|
+
for (let i = 0, j = n - 2; i < n; j = i, i += 2) {
|
|
540
|
+
const ay = points[j + 1];
|
|
541
|
+
const by = points[i + 1];
|
|
542
|
+
if (ay > cy !== by > cy) {
|
|
543
|
+
crossings.push(
|
|
544
|
+
points[j] + ((cy - ay) / (by - ay)) * (points[i] - points[j]),
|
|
545
|
+
);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
crossings.sort((a, b) => a - b);
|
|
549
|
+
let best = -1;
|
|
550
|
+
let mid = (x0 + x1) / 2;
|
|
551
|
+
for (let c = 0; c + 1 < crossings.length; c += 2) {
|
|
552
|
+
const span = crossings[c + 1] - crossings[c];
|
|
553
|
+
if (span > best) {
|
|
554
|
+
best = span;
|
|
555
|
+
mid = (crossings[c] + crossings[c + 1]) / 2;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
return [mid, cy];
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/** Even-odd: whether `x, y` is inside the ring. */
|
|
562
|
+
function insideRing(points: readonly number[], x: number, y: number): boolean {
|
|
563
|
+
let inside = false;
|
|
564
|
+
const n = points.length;
|
|
565
|
+
for (let i = 0, j = n - 2; i < n; j = i, i += 2) {
|
|
566
|
+
const xi = points[i];
|
|
567
|
+
const yi = points[i + 1];
|
|
568
|
+
const xj = points[j];
|
|
569
|
+
const yj = points[j + 1];
|
|
570
|
+
if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) {
|
|
571
|
+
inside = !inside;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
return inside;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
/** How far `x, y` is from the ring's outline. */
|
|
578
|
+
function distanceToRing(points: readonly number[], x: number, y: number) {
|
|
579
|
+
let best = Infinity;
|
|
580
|
+
const n = points.length;
|
|
581
|
+
for (let i = 0, j = n - 2; i < n; j = i, i += 2) {
|
|
582
|
+
const ax = points[j];
|
|
583
|
+
const ay = points[j + 1];
|
|
584
|
+
const dx = points[i] - ax;
|
|
585
|
+
const dy = points[i + 1] - ay;
|
|
586
|
+
const length = dx * dx + dy * dy;
|
|
587
|
+
const t =
|
|
588
|
+
length > 0
|
|
589
|
+
? Math.max(0, Math.min(1, ((x - ax) * dx + (y - ay) * dy) / length))
|
|
590
|
+
: 0;
|
|
591
|
+
const d = Math.hypot(x - ax - t * dx, y - ay - t * dy);
|
|
592
|
+
if (d < best) best = d;
|
|
593
|
+
}
|
|
594
|
+
return best;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/** The ring a point belongs to — the one it is inside, else the nearest
|
|
598
|
+
* within `within` — or -1. */
|
|
599
|
+
function ownerOf(
|
|
600
|
+
rings: readonly SnapRing[],
|
|
601
|
+
grid: Map<number, number[]>,
|
|
602
|
+
seen: Int32Array,
|
|
603
|
+
query: number,
|
|
604
|
+
x: number,
|
|
605
|
+
y: number,
|
|
606
|
+
within: number,
|
|
607
|
+
): number {
|
|
608
|
+
let best = -1;
|
|
609
|
+
let bestDistance = within;
|
|
610
|
+
for (let gx = cellOf(x - within); gx <= cellOf(x + within); gx++) {
|
|
611
|
+
for (let gy = cellOf(y - within); gy <= cellOf(y + within); gy++) {
|
|
612
|
+
for (const r of grid.get(snapCell(gx, gy)) ?? []) {
|
|
613
|
+
if (seen[r] === query) continue;
|
|
614
|
+
seen[r] = query;
|
|
615
|
+
const ring = rings[r];
|
|
616
|
+
// Past the box by more than the distance allowed: not a candidate.
|
|
617
|
+
const bx = Math.max(ring.x0 - x, 0, x - ring.x1);
|
|
618
|
+
const by = Math.max(ring.y0 - y, 0, y - ring.y1);
|
|
619
|
+
if (bx > bestDistance || by > bestDistance) continue;
|
|
620
|
+
if (bx === 0 && by === 0 && insideRing(ring.points, x, y)) return r;
|
|
621
|
+
const d = distanceToRing(ring.points, x, y);
|
|
622
|
+
if (d <= bestDistance) {
|
|
623
|
+
best = r;
|
|
624
|
+
bestDistance = d;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
return best;
|
|
630
|
+
}
|
|
631
|
+
|
|
326
632
|
/**
|
|
327
633
|
* Where a point-like feature's label goes: the point, or for a polygon the
|
|
328
634
|
* middle of its largest ring's box — a cheap stand-in for the pole of
|
package/src/maps/controller.ts
CHANGED
|
@@ -240,18 +240,6 @@ const timers = globalThis as {
|
|
|
240
240
|
performance?: { now(): number };
|
|
241
241
|
};
|
|
242
242
|
|
|
243
|
-
/**
|
|
244
|
-
* The clock a glide is measured on.
|
|
245
|
-
*
|
|
246
|
-
* `performance.now()` rather than the `Date.now()` the settle window uses:
|
|
247
|
-
* this one is compared across two frames of a 60Hz display, and `Date.now()`
|
|
248
|
-
* counts whole milliseconds, so a sixth of the step would be error. Reached
|
|
249
|
-
* through `globalThis` because `src/` compiles with `types: []`.
|
|
250
|
-
*/
|
|
251
|
-
function now(): number {
|
|
252
|
-
return timers.performance?.now() ?? Date.now();
|
|
253
|
-
}
|
|
254
|
-
|
|
255
243
|
/**
|
|
256
244
|
* The settle timer, unref'd where the runtime allows it.
|
|
257
245
|
*
|
|
@@ -266,6 +254,29 @@ function arm(tick: () => void, ms: number): unknown {
|
|
|
266
254
|
return handle;
|
|
267
255
|
}
|
|
268
256
|
|
|
257
|
+
/**
|
|
258
|
+
* The clock a glide is measured on, and the timer that steps it.
|
|
259
|
+
*
|
|
260
|
+
* `performance.now()` rather than the `Date.now()` the settle window uses:
|
|
261
|
+
* this one is compared across two frames of a 60Hz display, and `Date.now()`
|
|
262
|
+
* counts whole milliseconds, so a sixth of the step would be error. Reached
|
|
263
|
+
* through `globalThis` because `src/` compiles with `types: []`.
|
|
264
|
+
*
|
|
265
|
+
* One object, exported from this module though not from the package, so a
|
|
266
|
+
* test can stand in for both and step a glide a frame at a time. The glide
|
|
267
|
+
* is wall-clock time on purpose, and a runner slow enough to spend the whole
|
|
268
|
+
* of one inside a single `await` finds it over before it can look.
|
|
269
|
+
*/
|
|
270
|
+
export const glideClock = {
|
|
271
|
+
now(): number {
|
|
272
|
+
return timers.performance?.now() ?? Date.now();
|
|
273
|
+
},
|
|
274
|
+
arm,
|
|
275
|
+
disarm(handle: unknown): void {
|
|
276
|
+
timers.clearTimeout?.(handle);
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
|
|
269
280
|
function clamp(value: number, low: number, high: number): number {
|
|
270
281
|
return value < low ? low : value > high ? high : value;
|
|
271
282
|
}
|
|
@@ -287,6 +298,10 @@ export class MapController {
|
|
|
287
298
|
* claims nothing and starts no gesture.
|
|
288
299
|
*/
|
|
289
300
|
painting = false;
|
|
301
|
+
/** A camera move made while `painting`, waiting for the frame to end —
|
|
302
|
+
* `previous` is the camera the *first* such move started from, so the
|
|
303
|
+
* view is told the whole delta however many were fused. */
|
|
304
|
+
private _paintMove: { previous: MapCamera } | null = null;
|
|
290
305
|
|
|
291
306
|
private _props: MapControllerProps = {};
|
|
292
307
|
/** The camera, when the application does not control it. */
|
|
@@ -361,7 +376,7 @@ export class MapController {
|
|
|
361
376
|
dispose(): void {
|
|
362
377
|
if (this._settleTimer !== null) timers.clearTimeout?.(this._settleTimer);
|
|
363
378
|
this._settleTimer = null;
|
|
364
|
-
if (this._glideTimer !== null)
|
|
379
|
+
if (this._glideTimer !== null) glideClock.disarm(this._glideTimer);
|
|
365
380
|
this._glideTimer = null;
|
|
366
381
|
this._glide = null;
|
|
367
382
|
}
|
|
@@ -443,11 +458,49 @@ export class MapController {
|
|
|
443
458
|
const controlled = this._props.camera !== undefined;
|
|
444
459
|
if (!controlled) this._camera = camera;
|
|
445
460
|
this._props.onCameraChange?.(camera);
|
|
446
|
-
if (this.painting)
|
|
461
|
+
if (this.painting) {
|
|
462
|
+
// A camera set from **inside** a frame, which is how every camera
|
|
463
|
+
// animation is written: the map's own `onFrame` is the clock, and the
|
|
464
|
+
// GL view calls it while it is still painting. Re-entering the paint
|
|
465
|
+
// is not on, but returning here used to drop the move's *scheduling*
|
|
466
|
+
// as well as its redraw — so the animation had nothing to ask for the
|
|
467
|
+
// next frame with, and stopped until something unrelated re-rendered.
|
|
468
|
+
//
|
|
469
|
+
// In the maps-gl example that something was the status bar's
|
|
470
|
+
// half-second interval, and it showed as exactly that: frames every
|
|
471
|
+
// 11ms, then a 511ms hole with the next request arriving at +508 —
|
|
472
|
+
// nobody asking, rather than anyone being slow. Manual panning never
|
|
473
|
+
// hit it because an input event is not inside a paint.
|
|
474
|
+
//
|
|
475
|
+
// So the move is remembered, with the camera it started from, and
|
|
476
|
+
// finished when the frame ends.
|
|
477
|
+
this._paintMove ??= { previous };
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
447
480
|
this.touch();
|
|
448
481
|
if (!controlled) this._view?.moved(previous, camera, blit);
|
|
449
482
|
}
|
|
450
483
|
|
|
484
|
+
/**
|
|
485
|
+
* A frame finished: do whatever `apply` deferred because it was painting.
|
|
486
|
+
* Called from both painters (`gl/view.ts`, `node.ts`) wherever `painting`
|
|
487
|
+
* goes back to false.
|
|
488
|
+
*
|
|
489
|
+
* Never a blit. A blit needs the exact transform it is shifting from, and
|
|
490
|
+
* what is flushed here may be several moves fused into one; a full redraw
|
|
491
|
+
* of a frame that was going to be drawn anyway costs nothing next to
|
|
492
|
+
* getting that wrong.
|
|
493
|
+
*/
|
|
494
|
+
paintEnded(): void {
|
|
495
|
+
const move = this._paintMove;
|
|
496
|
+
if (!move) return;
|
|
497
|
+
this._paintMove = null;
|
|
498
|
+
this.touch();
|
|
499
|
+
if (this._props.camera === undefined) {
|
|
500
|
+
this._view?.moved(move.previous, this.camera(), false);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
451
504
|
getCamera(): MapCamera {
|
|
452
505
|
const camera = this.camera();
|
|
453
506
|
return { center: { ...camera.center }, zoom: camera.zoom };
|
|
@@ -501,6 +554,17 @@ export class MapController {
|
|
|
501
554
|
this._maxZoom(),
|
|
502
555
|
);
|
|
503
556
|
if (zoom === camera.zoom) return;
|
|
557
|
+
this.apply(this._zoomedAbout(camera, zoom, x, y), false);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/** `camera` at `zoom`, with the point at pane-local `x`, `y` where it
|
|
561
|
+
* was: what {@link zoomAbout} moves to, and what a glide arrives at. */
|
|
562
|
+
private _zoomedAbout(
|
|
563
|
+
camera: MapCamera,
|
|
564
|
+
zoom: number,
|
|
565
|
+
x: number,
|
|
566
|
+
y: number,
|
|
567
|
+
): MapCamera {
|
|
504
568
|
const before = this.transform(camera);
|
|
505
569
|
const anchor = unprojectPoint(before, x, y);
|
|
506
570
|
const after = this.transform({ center: camera.center, zoom });
|
|
@@ -509,21 +573,42 @@ export class MapController {
|
|
|
509
573
|
const moved = projectLngLat(after, anchor);
|
|
510
574
|
const dx = (moved.x - x) / after.world;
|
|
511
575
|
const dy = (moved.y - y) / after.world;
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
576
|
+
return {
|
|
577
|
+
zoom,
|
|
578
|
+
center: unprojectPoint(
|
|
579
|
+
{
|
|
580
|
+
...after,
|
|
581
|
+
centerX: after.centerX + dx,
|
|
582
|
+
centerY: after.centerY + dy,
|
|
583
|
+
},
|
|
584
|
+
after.paneX,
|
|
585
|
+
after.paneY,
|
|
586
|
+
),
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
* Where the camera is going, when that is known before it gets there: the
|
|
592
|
+
* end of a wheel's glide. Null while nothing is gliding — a touchpad's
|
|
593
|
+
* stream, a drag or an application's own animation go wherever the next
|
|
594
|
+
* event says, and the view has only the camera to go on.
|
|
595
|
+
*
|
|
596
|
+
* What a renderer does with it is get there first: the tiles and label
|
|
597
|
+
* rasters of the view the glide stops at are asked for while the frames
|
|
598
|
+
* of the glide are still being drawn, so the settle has them in hand.
|
|
599
|
+
*/
|
|
600
|
+
destination(): MapCamera | null {
|
|
601
|
+
const glide = this._glide;
|
|
602
|
+
if (!glide || !glide.easing) return null;
|
|
603
|
+
const camera = this.camera();
|
|
604
|
+
if (glide.applied !== camera.zoom) return null;
|
|
605
|
+
const zoom = clamp(
|
|
606
|
+
quantizeZoom(glide.target),
|
|
607
|
+
this._minZoom(),
|
|
608
|
+
this._maxZoom(),
|
|
526
609
|
);
|
|
610
|
+
if (zoom === camera.zoom) return null;
|
|
611
|
+
return this._zoomedAbout(camera, zoom, glide.x, glide.y);
|
|
527
612
|
}
|
|
528
613
|
|
|
529
614
|
/**
|
|
@@ -550,7 +635,7 @@ export class MapController {
|
|
|
550
635
|
y: number,
|
|
551
636
|
smooth: boolean,
|
|
552
637
|
): void {
|
|
553
|
-
const at = now();
|
|
638
|
+
const at = glideClock.now();
|
|
554
639
|
const camera = this.camera();
|
|
555
640
|
const glide = this._glide;
|
|
556
641
|
// Where this delta counts from: the target the wheel has already asked
|
|
@@ -590,13 +675,13 @@ export class MapController {
|
|
|
590
675
|
this._glideTimer = null;
|
|
591
676
|
const glide = this._glide;
|
|
592
677
|
if (glide?.easing !== true) return;
|
|
593
|
-
const at = now();
|
|
678
|
+
const at = glideClock.now();
|
|
594
679
|
// `stepZoom` clears the record when the target is reached or the
|
|
595
680
|
// camera refuses a step, and this re-arms only while one is left.
|
|
596
681
|
this.stepZoom(at, at - glide.at);
|
|
597
682
|
this._armGlide();
|
|
598
683
|
};
|
|
599
|
-
this._glideTimer = arm(tick, GLIDE_TICK_MS);
|
|
684
|
+
this._glideTimer = glideClock.arm(tick, GLIDE_TICK_MS);
|
|
600
685
|
}
|
|
601
686
|
|
|
602
687
|
/**
|
package/src/maps/gl/buckets.ts
CHANGED
|
@@ -38,6 +38,7 @@ import { GeomType, GeometryBuffer } from '../mvt.js';
|
|
|
38
38
|
import type { FeatureCursor, VectorTile } from '../mvt.js';
|
|
39
39
|
import type { PreparedLayer, PreparedStyle } from '../paint.js';
|
|
40
40
|
import type { MapStyleLayer } from '../style.js';
|
|
41
|
+
import type { TileId } from '../proj.js';
|
|
41
42
|
import { buildTileLabels } from '../anchors.js';
|
|
42
43
|
import type { GlLabelData } from '../anchors.js';
|
|
43
44
|
|
|
@@ -324,6 +325,9 @@ interface Group {
|
|
|
324
325
|
export function buildTileBuckets(
|
|
325
326
|
tile: VectorTile,
|
|
326
327
|
prepared: PreparedStyle,
|
|
328
|
+
/** Which tile — what a label layer's `snapInto` distance is measured
|
|
329
|
+
* against (`../anchors.ts`). */
|
|
330
|
+
id?: TileId,
|
|
327
331
|
): GlTileData {
|
|
328
332
|
const started = now();
|
|
329
333
|
const line = new Stream(1024);
|
|
@@ -445,7 +449,7 @@ export function buildTileBuckets(
|
|
|
445
449
|
fill: fill.take(),
|
|
446
450
|
fillRecords: fill.count,
|
|
447
451
|
draws,
|
|
448
|
-
labels: buildTileLabels(tile, prepared, TILE_EXTENT),
|
|
452
|
+
labels: buildTileLabels(tile, prepared, TILE_EXTENT, id),
|
|
449
453
|
stats: {
|
|
450
454
|
features,
|
|
451
455
|
lineRecords: line.count,
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
// specifier would make every build depend on Node's type declarations.
|
|
13
13
|
import { prepareStyle } from '../paint.js';
|
|
14
14
|
import type { PreparedStyle } from '../paint.js';
|
|
15
|
+
import type { TileId } from '../proj.js';
|
|
15
16
|
import { parseVectorTile } from '../sources.js';
|
|
16
17
|
import type { MapStyleLayer } from '../style.js';
|
|
17
18
|
import { buildTileBuckets } from './buckets.js';
|
|
@@ -19,7 +20,13 @@ import { buildTileBuckets } from './buckets.js';
|
|
|
19
20
|
/** What the store sends. */
|
|
20
21
|
export type BuildRequest =
|
|
21
22
|
| { type: 'style'; id: number; layers: MapStyleLayer[] }
|
|
22
|
-
| {
|
|
23
|
+
| {
|
|
24
|
+
type: 'build';
|
|
25
|
+
job: number;
|
|
26
|
+
style: number;
|
|
27
|
+
bytes: Uint8Array;
|
|
28
|
+
tile: TileId;
|
|
29
|
+
};
|
|
23
30
|
|
|
24
31
|
interface Port {
|
|
25
32
|
on(event: 'message', listener: (message: unknown) => void): void;
|
|
@@ -45,7 +52,11 @@ parentPort?.on('message', (message) => {
|
|
|
45
52
|
try {
|
|
46
53
|
const prepared = styles.get(request.style);
|
|
47
54
|
if (!prepared) throw new Error(`style ${request.style} was never sent`);
|
|
48
|
-
const data = buildTileBuckets(
|
|
55
|
+
const data = buildTileBuckets(
|
|
56
|
+
parseVectorTile(request.bytes),
|
|
57
|
+
prepared,
|
|
58
|
+
request.tile,
|
|
59
|
+
);
|
|
49
60
|
const transfer = [data.line, data.fill];
|
|
50
61
|
if (data.labels) transfer.push(data.labels.anchors.buffer as ArrayBuffer);
|
|
51
62
|
parentPort.postMessage({ job: request.job, data }, transfer);
|