@react-x11/components 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -4
- package/dist/charts/node.d.ts +11 -1
- package/dist/charts/node.d.ts.map +1 -1
- package/dist/charts/node.js +44 -14
- package/dist/charts/node.js.map +1 -1
- package/dist/charts/render.d.ts +12 -3
- package/dist/charts/render.d.ts.map +1 -1
- package/dist/charts/render.js +94 -25
- package/dist/charts/render.js.map +1 -1
- package/dist/code/index.d.ts.map +1 -1
- package/dist/code/index.js +27 -24
- package/dist/code/index.js.map +1 -1
- package/dist/code-editor/completion.d.ts.map +1 -1
- package/dist/code-editor/completion.js +3 -2
- package/dist/code-editor/completion.js.map +1 -1
- package/dist/code-editor/index.d.ts.map +1 -1
- package/dist/code-editor/index.js +19 -0
- package/dist/code-editor/index.js.map +1 -1
- package/dist/code-editor/node.d.ts +177 -7
- package/dist/code-editor/node.d.ts.map +1 -1
- package/dist/code-editor/node.js +1329 -164
- package/dist/code-editor/node.js.map +1 -1
- package/dist/code-language/index.d.ts +1 -1
- package/dist/code-language/index.d.ts.map +1 -1
- package/dist/code-language/index.js +1 -1
- package/dist/code-language/index.js.map +1 -1
- package/dist/code-language/languages/glsl.d.ts.map +1 -1
- package/dist/code-language/languages/glsl.js +10 -2
- package/dist/code-language/languages/glsl.js.map +1 -1
- package/dist/code-language/languages/javascript.d.ts.map +1 -1
- package/dist/code-language/languages/javascript.js +18 -3
- package/dist/code-language/languages/javascript.js.map +1 -1
- package/dist/code-language/languages/json.d.ts.map +1 -1
- package/dist/code-language/languages/json.js +10 -2
- package/dist/code-language/languages/json.js.map +1 -1
- package/dist/code-language/languages/shell.d.ts.map +1 -1
- package/dist/code-language/languages/shell.js +10 -2
- package/dist/code-language/languages/shell.js.map +1 -1
- package/dist/code-language/languages/sql.d.ts.map +1 -1
- package/dist/code-language/languages/sql.js +20 -2
- package/dist/code-language/languages/sql.js.map +1 -1
- package/dist/code-language/runs.d.ts +31 -0
- package/dist/code-language/runs.d.ts.map +1 -1
- package/dist/code-language/runs.js +105 -0
- package/dist/code-language/runs.js.map +1 -1
- package/dist/code-language/stream.d.ts +22 -0
- package/dist/code-language/stream.d.ts.map +1 -1
- package/dist/code-language/stream.js +259 -9
- package/dist/code-language/stream.js.map +1 -1
- package/dist/code-language/types.d.ts +5 -4
- package/dist/code-language/types.d.ts.map +1 -1
- package/dist/codeblock/index.d.ts +26 -2
- package/dist/codeblock/index.d.ts.map +1 -1
- package/dist/codeblock/index.js +57 -4
- package/dist/codeblock/index.js.map +1 -1
- package/dist/flow/draw.d.ts +50 -0
- package/dist/flow/draw.d.ts.map +1 -1
- package/dist/flow/draw.js +132 -33
- package/dist/flow/draw.js.map +1 -1
- package/dist/flow/gl/color.d.ts +13 -0
- package/dist/flow/gl/color.d.ts.map +1 -0
- package/dist/flow/gl/color.js +82 -0
- package/dist/flow/gl/color.js.map +1 -0
- package/dist/flow/gl/index.d.ts +60 -0
- package/dist/flow/gl/index.d.ts.map +1 -0
- package/dist/flow/gl/index.js +283 -0
- package/dist/flow/gl/index.js.map +1 -0
- package/dist/flow/gl/pack.d.ts +133 -0
- package/dist/flow/gl/pack.d.ts.map +1 -0
- package/dist/flow/gl/pack.js +408 -0
- package/dist/flow/gl/pack.js.map +1 -0
- package/dist/flow/gl/renderer.d.ts +95 -0
- package/dist/flow/gl/renderer.d.ts.map +1 -0
- package/dist/flow/gl/renderer.js +459 -0
- package/dist/flow/gl/renderer.js.map +1 -0
- package/dist/flow/gl/shaders.d.ts +79 -0
- package/dist/flow/gl/shaders.d.ts.map +1 -0
- package/dist/flow/gl/shaders.js +346 -0
- package/dist/flow/gl/shaders.js.map +1 -0
- package/dist/flow/gl/text.d.ts +318 -0
- package/dist/flow/gl/text.d.ts.map +1 -0
- package/dist/flow/gl/text.js +1103 -0
- package/dist/flow/gl/text.js.map +1 -0
- package/dist/flow/index.d.ts +1 -1
- package/dist/flow/index.d.ts.map +1 -1
- package/dist/flow/index.js +619 -64
- package/dist/flow/index.js.map +1 -1
- package/dist/flow/node.d.ts +621 -72
- package/dist/flow/node.d.ts.map +1 -1
- package/dist/flow/node.js +2253 -1018
- package/dist/flow/node.js.map +1 -1
- package/dist/flow/paint.d.ts +35 -0
- package/dist/flow/paint.d.ts.map +1 -0
- package/dist/flow/paint.js +393 -0
- package/dist/flow/paint.js.map +1 -0
- package/dist/flow/paths.d.ts +14 -0
- package/dist/flow/paths.d.ts.map +1 -1
- package/dist/flow/paths.js +45 -19
- package/dist/flow/paths.js.map +1 -1
- package/dist/flow/scene.d.ts +584 -0
- package/dist/flow/scene.d.ts.map +1 -0
- package/dist/flow/scene.js +1453 -0
- package/dist/flow/scene.js.map +1 -0
- package/dist/flow/types.d.ts +111 -1
- package/dist/flow/types.d.ts.map +1 -1
- package/dist/html/controls.d.ts +28 -0
- package/dist/html/controls.d.ts.map +1 -1
- package/dist/html/controls.js +52 -2
- package/dist/html/controls.js.map +1 -1
- package/dist/html/css/calc.d.ts +14 -0
- package/dist/html/css/calc.d.ts.map +1 -0
- package/dist/html/css/calc.js +344 -0
- package/dist/html/css/calc.js.map +1 -0
- package/dist/html/css/cascade.d.ts +262 -6
- package/dist/html/css/cascade.d.ts.map +1 -1
- package/dist/html/css/cascade.js +1373 -67
- package/dist/html/css/cascade.js.map +1 -1
- package/dist/html/css/color.d.ts +23 -0
- package/dist/html/css/color.d.ts.map +1 -0
- package/dist/html/css/color.js +740 -0
- package/dist/html/css/color.js.map +1 -0
- package/dist/html/css/content.d.ts +92 -0
- package/dist/html/css/content.d.ts.map +1 -0
- package/dist/html/css/content.js +388 -0
- package/dist/html/css/content.js.map +1 -0
- package/dist/html/css/counter-styles.d.ts +76 -0
- package/dist/html/css/counter-styles.d.ts.map +1 -0
- package/dist/html/css/counter-styles.js +893 -0
- package/dist/html/css/counter-styles.js.map +1 -0
- package/dist/html/css/decode.d.ts +12 -0
- package/dist/html/css/decode.d.ts.map +1 -0
- package/dist/html/css/decode.js +116 -0
- package/dist/html/css/decode.js.map +1 -0
- package/dist/html/css/parse.d.ts +110 -10
- package/dist/html/css/parse.d.ts.map +1 -1
- package/dist/html/css/parse.js +1473 -180
- package/dist/html/css/parse.js.map +1 -1
- package/dist/html/css/style.d.ts +501 -15
- package/dist/html/css/style.d.ts.map +1 -1
- package/dist/html/css/style.js +3729 -206
- package/dist/html/css/style.js.map +1 -1
- package/dist/html/css/ua.d.ts.map +1 -1
- package/dist/html/css/ua.js +65 -16
- package/dist/html/css/ua.js.map +1 -1
- package/dist/html/css/values.d.ts +37 -3
- package/dist/html/css/values.d.ts.map +1 -1
- package/dist/html/css/values.js +122 -48
- package/dist/html/css/values.js.map +1 -1
- package/dist/html/css/vars.d.ts +52 -0
- package/dist/html/css/vars.d.ts.map +1 -0
- package/dist/html/css/vars.js +358 -0
- package/dist/html/css/vars.js.map +1 -0
- package/dist/html/dom.d.ts +30 -4
- package/dist/html/dom.d.ts.map +1 -1
- package/dist/html/dom.js +278 -17
- package/dist/html/dom.js.map +1 -1
- package/dist/html/fonts.d.ts +106 -0
- package/dist/html/fonts.d.ts.map +1 -0
- package/dist/html/fonts.js +565 -0
- package/dist/html/fonts.js.map +1 -0
- package/dist/html/gif.d.ts +15 -0
- package/dist/html/gif.d.ts.map +1 -0
- package/dist/html/gif.js +229 -0
- package/dist/html/gif.js.map +1 -0
- package/dist/html/index.d.ts +50 -11
- package/dist/html/index.d.ts.map +1 -1
- package/dist/html/index.js +115 -9
- package/dist/html/index.js.map +1 -1
- package/dist/html/layout/block.d.ts +226 -3
- package/dist/html/layout/block.d.ts.map +1 -1
- package/dist/html/layout/block.js +3077 -219
- package/dist/html/layout/block.js.map +1 -1
- package/dist/html/layout/boxes.d.ts +367 -17
- package/dist/html/layout/boxes.d.ts.map +1 -1
- package/dist/html/layout/boxes.js +1742 -182
- package/dist/html/layout/boxes.js.map +1 -1
- package/dist/html/layout/cache.d.ts +58 -0
- package/dist/html/layout/cache.d.ts.map +1 -0
- package/dist/html/layout/cache.js +224 -0
- package/dist/html/layout/cache.js.map +1 -0
- package/dist/html/layout/collapse.d.ts +45 -0
- package/dist/html/layout/collapse.d.ts.map +1 -0
- package/dist/html/layout/collapse.js +246 -0
- package/dist/html/layout/collapse.js.map +1 -0
- package/dist/html/layout/css-grid.d.ts +7 -0
- package/dist/html/layout/css-grid.d.ts.map +1 -0
- package/dist/html/layout/css-grid.js +900 -0
- package/dist/html/layout/css-grid.js.map +1 -0
- package/dist/html/layout/flex.d.ts.map +1 -1
- package/dist/html/layout/flex.js +1025 -89
- package/dist/html/layout/flex.js.map +1 -1
- package/dist/html/layout/floats.d.ts +45 -6
- package/dist/html/layout/floats.d.ts.map +1 -1
- package/dist/html/layout/floats.js +113 -14
- package/dist/html/layout/floats.js.map +1 -1
- package/dist/html/layout/grid-lines.d.ts +39 -0
- package/dist/html/layout/grid-lines.d.ts.map +1 -0
- package/dist/html/layout/grid-lines.js +119 -0
- package/dist/html/layout/grid-lines.js.map +1 -0
- package/dist/html/layout/grid.d.ts +53 -0
- package/dist/html/layout/grid.d.ts.map +1 -0
- package/dist/html/layout/grid.js +153 -0
- package/dist/html/layout/grid.js.map +1 -0
- package/dist/html/layout/inline.d.ts +154 -1
- package/dist/html/layout/inline.d.ts.map +1 -1
- package/dist/html/layout/inline.js +3598 -175
- package/dist/html/layout/inline.js.map +1 -1
- package/dist/html/layout/shaping.d.ts +6 -0
- package/dist/html/layout/shaping.d.ts.map +1 -0
- package/dist/html/layout/shaping.js +100 -0
- package/dist/html/layout/shaping.js.map +1 -0
- package/dist/html/layout/table.d.ts +3 -0
- package/dist/html/layout/table.d.ts.map +1 -1
- package/dist/html/layout/table.js +681 -175
- package/dist/html/layout/table.js.map +1 -1
- package/dist/html/layout/tracks.d.ts +44 -0
- package/dist/html/layout/tracks.d.ts.map +1 -0
- package/dist/html/layout/tracks.js +349 -0
- package/dist/html/layout/tracks.js.map +1 -0
- package/dist/html/node.d.ts +169 -4
- package/dist/html/node.d.ts.map +1 -1
- package/dist/html/node.js +1429 -137
- package/dist/html/node.js.map +1 -1
- package/dist/html/paint.d.ts +92 -3
- package/dist/html/paint.d.ts.map +1 -1
- package/dist/html/paint.js +3635 -107
- package/dist/html/paint.js.map +1 -1
- package/dist/html/resources.d.ts +60 -14
- package/dist/html/resources.d.ts.map +1 -1
- package/dist/html/resources.js +122 -36
- package/dist/html/resources.js.map +1 -1
- package/dist/html/surfaces.d.ts +23 -0
- package/dist/html/surfaces.d.ts.map +1 -0
- package/dist/html/surfaces.js +68 -0
- package/dist/html/surfaces.js.map +1 -0
- package/dist/html/svg.d.ts +80 -0
- package/dist/html/svg.d.ts.map +1 -0
- package/dist/html/svg.js +442 -0
- package/dist/html/svg.js.map +1 -0
- package/dist/html/url.d.ts +23 -0
- package/dist/html/url.d.ts.map +1 -0
- package/dist/html/url.js +80 -0
- package/dist/html/url.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/codelines.d.ts +42 -0
- package/dist/internal/codelines.d.ts.map +1 -0
- package/dist/internal/codelines.js +170 -0
- package/dist/internal/codelines.js.map +1 -0
- package/dist/internal/collate.d.ts +3 -0
- package/dist/internal/collate.d.ts.map +1 -0
- package/dist/internal/collate.js +11 -0
- package/dist/internal/collate.js.map +1 -0
- package/dist/internal/markdown/ast.d.ts +11 -0
- package/dist/internal/markdown/ast.d.ts.map +1 -1
- package/dist/internal/markdown/parse.d.ts.map +1 -1
- package/dist/internal/markdown/parse.js +109 -8
- package/dist/internal/markdown/parse.js.map +1 -1
- package/dist/internal/prewarm.d.ts +18 -0
- package/dist/internal/prewarm.d.ts.map +1 -0
- package/dist/internal/prewarm.js +42 -0
- package/dist/internal/prewarm.js.map +1 -0
- package/dist/internal/sdf.d.ts +20 -0
- package/dist/internal/sdf.d.ts.map +1 -0
- package/dist/internal/sdf.js +216 -0
- package/dist/internal/sdf.js.map +1 -0
- package/dist/internal/splice.d.ts +12 -0
- package/dist/internal/splice.d.ts.map +1 -0
- package/dist/internal/splice.js +23 -0
- package/dist/internal/splice.js.map +1 -0
- package/dist/internal/window.d.ts +12 -0
- package/dist/internal/window.d.ts.map +1 -1
- package/dist/internal/window.js +23 -6
- package/dist/internal/window.js.map +1 -1
- package/dist/maps/anchors.d.ts +6 -1
- package/dist/maps/anchors.d.ts.map +1 -1
- package/dist/maps/anchors.js +260 -1
- package/dist/maps/anchors.js.map +1 -1
- package/dist/maps/controller.d.ts +57 -0
- package/dist/maps/controller.d.ts.map +1 -1
- package/dist/maps/controller.js +97 -18
- package/dist/maps/controller.js.map +1 -1
- package/dist/maps/gl/buckets.d.ts +5 -1
- package/dist/maps/gl/buckets.d.ts.map +1 -1
- package/dist/maps/gl/buckets.js +5 -2
- package/dist/maps/gl/buckets.js.map +1 -1
- package/dist/maps/gl/build-worker.d.ts +2 -0
- package/dist/maps/gl/build-worker.d.ts.map +1 -1
- package/dist/maps/gl/build-worker.js +1 -1
- package/dist/maps/gl/build-worker.js.map +1 -1
- package/dist/maps/gl/cover.d.ts +23 -4
- package/dist/maps/gl/cover.d.ts.map +1 -1
- package/dist/maps/gl/cover.js +61 -48
- package/dist/maps/gl/cover.js.map +1 -1
- package/dist/maps/gl/placement.d.ts +21 -8
- package/dist/maps/gl/placement.d.ts.map +1 -1
- package/dist/maps/gl/placement.js +133 -58
- package/dist/maps/gl/placement.js.map +1 -1
- package/dist/maps/gl/renderer.d.ts +36 -4
- package/dist/maps/gl/renderer.d.ts.map +1 -1
- package/dist/maps/gl/renderer.js +81 -24
- package/dist/maps/gl/renderer.js.map +1 -1
- package/dist/maps/gl/shaders.d.ts +18 -17
- package/dist/maps/gl/shaders.d.ts.map +1 -1
- package/dist/maps/gl/shaders.js +34 -32
- package/dist/maps/gl/shaders.js.map +1 -1
- package/dist/maps/gl/store.d.ts +10 -0
- package/dist/maps/gl/store.d.ts.map +1 -1
- package/dist/maps/gl/store.js +47 -4
- package/dist/maps/gl/store.js.map +1 -1
- package/dist/maps/gl/text.d.ts +153 -24
- package/dist/maps/gl/text.d.ts.map +1 -1
- package/dist/maps/gl/text.js +379 -63
- package/dist/maps/gl/text.js.map +1 -1
- package/dist/maps/gl/view.d.ts +293 -2
- package/dist/maps/gl/view.d.ts.map +1 -1
- package/dist/maps/gl/view.js +317 -82
- package/dist/maps/gl/view.js.map +1 -1
- package/dist/maps/icons.d.ts +32 -0
- package/dist/maps/icons.d.ts.map +1 -0
- package/dist/maps/icons.js +151 -0
- package/dist/maps/icons.js.map +1 -0
- package/dist/maps/index.d.ts +2 -0
- package/dist/maps/index.d.ts.map +1 -1
- package/dist/maps/index.js +2 -0
- package/dist/maps/index.js.map +1 -1
- package/dist/maps/labels.d.ts +56 -4
- package/dist/maps/labels.d.ts.map +1 -1
- package/dist/maps/labels.js +213 -46
- package/dist/maps/labels.js.map +1 -1
- package/dist/maps/node.d.ts +17 -0
- package/dist/maps/node.d.ts.map +1 -1
- package/dist/maps/node.js +64 -30
- package/dist/maps/node.js.map +1 -1
- package/dist/maps/proj.d.ts +48 -0
- package/dist/maps/proj.d.ts.map +1 -1
- package/dist/maps/proj.js +73 -0
- package/dist/maps/proj.js.map +1 -1
- package/dist/maps/sources.d.ts +5 -3
- package/dist/maps/sources.d.ts.map +1 -1
- package/dist/maps/sources.js +5 -3
- package/dist/maps/sources.js.map +1 -1
- package/dist/maps/style.d.ts +35 -0
- package/dist/maps/style.d.ts.map +1 -1
- package/dist/maps/style.js.map +1 -1
- package/dist/maps/styles.d.ts +12 -0
- package/dist/maps/styles.d.ts.map +1 -1
- package/dist/maps/styles.js +120 -6
- package/dist/maps/styles.js.map +1 -1
- package/dist/maps/tiles.d.ts +31 -11
- package/dist/maps/tiles.d.ts.map +1 -1
- package/dist/maps/tiles.js +61 -27
- package/dist/maps/tiles.js.map +1 -1
- package/dist/maps/types.d.ts +28 -4
- package/dist/maps/types.d.ts.map +1 -1
- package/dist/markdown/index.d.ts.map +1 -1
- package/dist/markdown/index.js +209 -68
- package/dist/markdown/index.js.map +1 -1
- package/dist/markdown/spans.d.ts.map +1 -1
- package/dist/markdown/spans.js +6 -0
- package/dist/markdown/spans.js.map +1 -1
- package/dist/qml/containers.d.ts.map +1 -1
- package/dist/qml/containers.js +6 -1
- package/dist/qml/containers.js.map +1 -1
- package/dist/qml/interaction.d.ts.map +1 -1
- package/dist/qml/interaction.js +38 -5
- package/dist/qml/interaction.js.map +1 -1
- package/dist/qml/layouts.d.ts.map +1 -1
- package/dist/qml/layouts.js +21 -6
- package/dist/qml/layouts.js.map +1 -1
- package/dist/qml/qtquick.d.ts.map +1 -1
- package/dist/qml/qtquick.js +9 -2
- package/dist/qml/qtquick.js.map +1 -1
- package/dist/qml/react.d.ts.map +1 -1
- package/dist/qml/react.js +9 -7
- package/dist/qml/react.js.map +1 -1
- package/dist/reorder/clock.d.ts +7 -0
- package/dist/reorder/clock.d.ts.map +1 -0
- package/dist/reorder/clock.js +26 -0
- package/dist/reorder/clock.js.map +1 -0
- package/dist/reorder/index.d.ts +25 -3
- package/dist/reorder/index.d.ts.map +1 -1
- package/dist/reorder/index.js +64 -19
- package/dist/reorder/index.js.map +1 -1
- package/dist/rich-text-editor/index.d.ts +0 -11
- package/dist/rich-text-editor/index.d.ts.map +1 -1
- package/dist/rich-text-editor/index.js +38 -9
- package/dist/rich-text-editor/index.js.map +1 -1
- package/dist/rich-text-editor/keymap.d.ts.map +1 -1
- package/dist/rich-text-editor/keymap.js +2 -1
- package/dist/rich-text-editor/keymap.js.map +1 -1
- package/dist/rich-text-editor/keys.d.ts +17 -6
- package/dist/rich-text-editor/keys.d.ts.map +1 -1
- package/dist/rich-text-editor/keys.js +135 -26
- package/dist/rich-text-editor/keys.js.map +1 -1
- package/dist/rich-text-editor/markdown.d.ts.map +1 -1
- package/dist/rich-text-editor/markdown.js +30 -1
- package/dist/rich-text-editor/markdown.js.map +1 -1
- package/dist/rich-text-editor/marks.d.ts +9 -0
- package/dist/rich-text-editor/marks.d.ts.map +1 -0
- package/dist/rich-text-editor/marks.js +83 -0
- package/dist/rich-text-editor/marks.js.map +1 -0
- package/dist/rich-text-editor/render.d.ts.map +1 -1
- package/dist/rich-text-editor/render.js +28 -10
- package/dist/rich-text-editor/render.js.map +1 -1
- package/dist/rich-text-editor/replace.d.ts +13 -0
- package/dist/rich-text-editor/replace.d.ts.map +1 -0
- package/dist/rich-text-editor/replace.js +64 -0
- package/dist/rich-text-editor/replace.js.map +1 -0
- package/dist/rich-text-editor/toolbar.d.ts.map +1 -1
- package/dist/rich-text-editor/toolbar.js +1 -1
- package/dist/rich-text-editor/toolbar.js.map +1 -1
- package/dist/rich-text-editor/virtual.d.ts.map +1 -1
- package/dist/rich-text-editor/virtual.js +17 -0
- package/dist/rich-text-editor/virtual.js.map +1 -1
- package/dist/richtext/node.d.ts +46 -2
- package/dist/richtext/node.d.ts.map +1 -1
- package/dist/richtext/node.js +187 -4
- package/dist/richtext/node.js.map +1 -1
- package/dist/richtext/runs.d.ts +13 -8
- package/dist/richtext/runs.d.ts.map +1 -1
- package/dist/richtext/runs.js +18 -8
- package/dist/richtext/runs.js.map +1 -1
- package/dist/table/index.d.ts.map +1 -1
- package/dist/table/index.js +23 -0
- package/dist/table/index.js.map +1 -1
- package/dist/table/rows.d.ts +3 -2
- package/dist/table/rows.d.ts.map +1 -1
- package/dist/table/rows.js +20 -6
- package/dist/table/rows.js.map +1 -1
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +4 -0
- package/dist/terminal/index.js.map +1 -1
- package/dist/terminal/vt/pty.d.ts +13 -2
- package/dist/terminal/vt/pty.d.ts.map +1 -1
- package/dist/terminal/vt/pty.js +18 -3
- package/dist/terminal/vt/pty.js.map +1 -1
- package/dist/terminal-output/index.d.ts.map +1 -1
- package/dist/terminal-output/index.js +103 -23
- package/dist/terminal-output/index.js.map +1 -1
- package/dist/terminal-output/runs.d.ts +4 -1
- package/dist/terminal-output/runs.d.ts.map +1 -1
- package/dist/terminal-output/runs.js +5 -1
- package/dist/terminal-output/runs.js.map +1 -1
- package/dist/three/canvas.d.ts.map +1 -1
- package/dist/three/canvas.js +85 -7
- package/dist/three/canvas.js.map +1 -1
- package/dist/three/events.d.ts +22 -4
- package/dist/three/events.d.ts.map +1 -1
- package/dist/three/events.js +34 -4
- package/dist/three/events.js.map +1 -1
- package/dist/tree/index.d.ts.map +1 -1
- package/dist/tree/index.js +17 -0
- package/dist/tree/index.js.map +1 -1
- package/package.json +42 -33
- package/src/charts/node.ts +62 -26
- package/src/charts/render.ts +120 -30
- package/src/code/index.ts +36 -32
- package/src/code-editor/completion.ts +3 -2
- package/src/code-editor/index.ts +19 -0
- package/src/code-editor/node.ts +1574 -184
- package/src/code-language/index.ts +1 -1
- package/src/code-language/languages/glsl.ts +12 -2
- package/src/code-language/languages/javascript.ts +21 -4
- package/src/code-language/languages/json.ts +12 -2
- package/src/code-language/languages/shell.ts +12 -2
- package/src/code-language/languages/sql.ts +22 -2
- package/src/code-language/runs.ts +111 -1
- package/src/code-language/stream.ts +257 -17
- package/src/code-language/types.ts +5 -4
- package/src/codeblock/index.ts +68 -4
- package/src/flow/draw.ts +167 -41
- package/src/flow/gl/color.ts +85 -0
- package/src/flow/gl/index.ts +342 -0
- package/src/flow/gl/pack.ts +585 -0
- package/src/flow/gl/renderer.ts +679 -0
- package/src/flow/gl/shaders.ts +371 -0
- package/src/flow/gl/text.ts +1295 -0
- package/src/flow/index.ts +794 -67
- package/src/flow/node.ts +2496 -1256
- package/src/flow/paint.ts +511 -0
- package/src/flow/paths.ts +80 -15
- package/src/flow/scene.ts +2199 -0
- package/src/flow/types.ts +113 -1
- package/src/html/controls.ts +73 -2
- package/src/html/css/calc.ts +385 -0
- package/src/html/css/cascade.ts +1481 -62
- package/src/html/css/color.ts +755 -0
- package/src/html/css/content.ts +417 -0
- package/src/html/css/counter-styles.ts +973 -0
- package/src/html/css/decode.ts +130 -0
- package/src/html/css/parse.ts +1514 -160
- package/src/html/css/style.ts +4131 -223
- package/src/html/css/ua.ts +66 -17
- package/src/html/css/values.ts +150 -50
- package/src/html/css/vars.ts +348 -0
- package/src/html/dom.ts +284 -17
- package/src/html/fonts.ts +641 -0
- package/src/html/gif.ts +233 -0
- package/src/html/index.ts +180 -20
- package/src/html/layout/block.ts +3560 -208
- package/src/html/layout/boxes.ts +2141 -190
- package/src/html/layout/cache.ts +289 -0
- package/src/html/layout/collapse.ts +317 -0
- package/src/html/layout/css-grid.ts +1063 -0
- package/src/html/layout/flex.ts +1115 -106
- package/src/html/layout/floats.ts +128 -14
- package/src/html/layout/grid-lines.ts +141 -0
- package/src/html/layout/grid.ts +181 -0
- package/src/html/layout/inline.ts +4187 -192
- package/src/html/layout/shaping.ts +140 -0
- package/src/html/layout/table.ts +696 -186
- package/src/html/layout/tracks.ts +437 -0
- package/src/html/node.ts +1585 -156
- package/src/html/paint.ts +4582 -267
- package/src/html/resources.ts +161 -50
- package/src/html/surfaces.ts +81 -0
- package/src/html/svg.ts +504 -0
- package/src/html/url.ts +86 -0
- package/src/index.ts +2 -0
- package/src/internal/codelines.ts +200 -0
- package/src/internal/collate.ts +12 -0
- package/src/internal/markdown/ast.ts +11 -0
- package/src/internal/markdown/parse.ts +154 -11
- package/src/internal/prewarm.ts +45 -0
- package/src/internal/sdf.ts +227 -0
- package/src/internal/splice.ts +25 -0
- package/src/internal/window.ts +36 -5
- package/src/maps/anchors.ts +307 -1
- package/src/maps/controller.ts +116 -31
- package/src/maps/gl/buckets.ts +5 -1
- package/src/maps/gl/build-worker.ts +13 -2
- package/src/maps/gl/cover.ts +79 -44
- package/src/maps/gl/placement.ts +221 -69
- package/src/maps/gl/renderer.ts +104 -20
- package/src/maps/gl/shaders.ts +35 -32
- package/src/maps/gl/store.ts +66 -17
- package/src/maps/gl/text.ts +444 -71
- package/src/maps/gl/view.ts +361 -96
- package/src/maps/icons.ts +183 -0
- package/src/maps/index.ts +4 -0
- package/src/maps/labels.ts +269 -49
- package/src/maps/node.ts +82 -49
- package/src/maps/proj.ts +87 -0
- package/src/maps/sources.ts +5 -3
- package/src/maps/style.ts +32 -0
- package/src/maps/styles.ts +215 -4
- package/src/maps/tiles.ts +64 -31
- package/src/maps/types.ts +28 -4
- package/src/markdown/index.ts +293 -92
- package/src/markdown/spans.ts +5 -0
- package/src/qml/containers.tsx +6 -1
- package/src/qml/interaction.tsx +42 -5
- package/src/qml/layouts.tsx +21 -6
- package/src/qml/qtquick.tsx +9 -2
- package/src/qml/react.tsx +7 -5
- package/src/reorder/clock.ts +27 -0
- package/src/reorder/index.ts +100 -27
- package/src/rich-text-editor/index.ts +37 -12
- package/src/rich-text-editor/keymap.ts +1 -1
- package/src/rich-text-editor/keys.ts +135 -26
- package/src/rich-text-editor/markdown.ts +36 -1
- package/src/rich-text-editor/marks.ts +101 -0
- package/src/rich-text-editor/render.ts +49 -12
- package/src/rich-text-editor/replace.ts +85 -0
- package/src/rich-text-editor/toolbar.ts +1 -1
- package/src/rich-text-editor/virtual.ts +25 -0
- package/src/richtext/node.ts +235 -14
- package/src/richtext/runs.ts +23 -12
- package/src/table/index.ts +29 -0
- package/src/table/rows.ts +18 -8
- package/src/terminal/index.ts +4 -0
- package/src/terminal/vt/pty.ts +16 -2
- package/src/terminal-output/index.ts +129 -31
- package/src/terminal-output/runs.ts +16 -2
- package/src/three/canvas.ts +102 -8
- package/src/three/events.ts +49 -9
- package/src/tree/index.ts +19 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// Icons: the pictogram a symbol layer can set beside a point's name — the
|
|
2
|
+
// bus on a bus stop, so that "Lyons Ave/Yuille St" reads as a stop and not
|
|
3
|
+
// as a street.
|
|
4
|
+
//
|
|
5
|
+
// An icon is two pieces, each one colour: a rounded **plate** in the layer's
|
|
6
|
+
// colour and a **glyph** over it, white by default. Two single-colour pieces
|
|
7
|
+
// rather than one picture because that is what both renderers already draw
|
|
8
|
+
// text as: the retained renderer fills a path, and the GL renderer keeps a
|
|
9
|
+
// coverage raster in its label atlas and colours it in the shader — so an
|
|
10
|
+
// icon is two more of those, and one raster serves every palette.
|
|
11
|
+
//
|
|
12
|
+
// Both renderers trace the same paths from here, the way both take their
|
|
13
|
+
// label anchors from `./anchors.ts`: a map switched from one renderer to the
|
|
14
|
+
// other draws the same bus.
|
|
15
|
+
|
|
16
|
+
/** The pictograms a symbol layer can name. */
|
|
17
|
+
export type MapIcon = 'bus' | 'tram' | 'train' | 'ferry' | 'airport';
|
|
18
|
+
|
|
19
|
+
/** Every {@link MapIcon}, for a style editor's picker. */
|
|
20
|
+
export const MAP_ICONS: readonly MapIcon[] = [
|
|
21
|
+
'bus',
|
|
22
|
+
'tram',
|
|
23
|
+
'train',
|
|
24
|
+
'ferry',
|
|
25
|
+
'airport',
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
/** Logical pixels across a plate, where the layer does not say. */
|
|
29
|
+
export const DEFAULT_ICON_SIZE = 14;
|
|
30
|
+
export const DEFAULT_ICON_COLOR = '#2a6fb8';
|
|
31
|
+
export const DEFAULT_ICON_GLYPH_COLOR = '#ffffff';
|
|
32
|
+
/** Logical pixels between an icon's plate and the name set beside it. */
|
|
33
|
+
export const ICON_GAP = 3;
|
|
34
|
+
|
|
35
|
+
/** The slice of a 2D context an icon is traced with — `MapCanvas`'s, and
|
|
36
|
+
* the offscreen surface's the GL atlas rasterizes on. */
|
|
37
|
+
export interface IconPathContext {
|
|
38
|
+
beginPath(): void;
|
|
39
|
+
moveTo(x: number, y: number): void;
|
|
40
|
+
lineTo(x: number, y: number): void;
|
|
41
|
+
arc(x: number, y: number, r: number, from: number, to: number): void;
|
|
42
|
+
closePath(): void;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** The grid a glyph is drawn on: a plate is this many units across. */
|
|
46
|
+
const GRID = 16;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Each glyph as polygons on the {@link GRID}, `[x0, y0, x1, y1, …]`.
|
|
50
|
+
*
|
|
51
|
+
* Solid shapes only, and a window is where no shape is: a glyph is filled
|
|
52
|
+
* with the non-zero rule, where a hole would take a second winding, and
|
|
53
|
+
* {@link wound} turns every polygon the same way so that two that touch
|
|
54
|
+
* fill as one rather than cancelling.
|
|
55
|
+
*/
|
|
56
|
+
const GLYPHS: Record<MapIcon, readonly (readonly number[])[]> = {
|
|
57
|
+
// Head on: a roof, the windscreen between two pillars, the lower panel,
|
|
58
|
+
// wheels and mirrors.
|
|
59
|
+
bus: [
|
|
60
|
+
[4, 3.5, 5, 2.5, 11, 2.5, 12, 3.5, 12, 4.6, 4, 4.6],
|
|
61
|
+
rect(4, 4.6, 1.2, 4),
|
|
62
|
+
rect(10.8, 4.6, 1.2, 4),
|
|
63
|
+
rect(4, 8.6, 8, 3.6),
|
|
64
|
+
rect(4.6, 12.2, 2, 1.4),
|
|
65
|
+
rect(9.4, 12.2, 2, 1.4),
|
|
66
|
+
rect(2.9, 5, 0.8, 2),
|
|
67
|
+
rect(12.3, 5, 0.8, 2),
|
|
68
|
+
],
|
|
69
|
+
// A car under its pantograph, on rails.
|
|
70
|
+
tram: [
|
|
71
|
+
rect(5.4, 1.4, 5.2, 0.8),
|
|
72
|
+
rect(7.6, 2.2, 0.8, 1.4),
|
|
73
|
+
[4.5, 4.6, 5.5, 3.6, 10.5, 3.6, 11.5, 4.6, 11.5, 5.4, 4.5, 5.4],
|
|
74
|
+
rect(4.5, 5.4, 1.1, 3.6),
|
|
75
|
+
rect(10.4, 5.4, 1.1, 3.6),
|
|
76
|
+
rect(4.5, 9, 7, 3),
|
|
77
|
+
[5.6, 12, 6.9, 12, 5.8, 14.2, 4.5, 14.2],
|
|
78
|
+
[9.1, 12, 10.4, 12, 11.5, 14.2, 10.2, 14.2],
|
|
79
|
+
],
|
|
80
|
+
// A locomotive's rounded nose, with its rails splayed wider than a tram's.
|
|
81
|
+
train: [
|
|
82
|
+
[4, 5, 4.6, 3, 6, 2.2, 10, 2.2, 11.4, 3, 12, 5, 12, 5.6, 4, 5.6],
|
|
83
|
+
rect(4, 5.6, 1.2, 3),
|
|
84
|
+
rect(10.8, 5.6, 1.2, 3),
|
|
85
|
+
rect(4, 8.6, 8, 3),
|
|
86
|
+
[5, 11.6, 6.4, 11.6, 4.8, 14.2, 3.4, 14.2],
|
|
87
|
+
[9.6, 11.6, 11, 11.6, 12.6, 14.2, 11.2, 14.2],
|
|
88
|
+
],
|
|
89
|
+
// Side on: a hull, a deckhouse, a funnel.
|
|
90
|
+
ferry: [
|
|
91
|
+
[2, 9, 14, 9, 12.2, 12.6, 3.8, 12.6],
|
|
92
|
+
rect(4.4, 6, 6.8, 3),
|
|
93
|
+
rect(6.2, 3.6, 2.2, 2.4),
|
|
94
|
+
],
|
|
95
|
+
// An aircraft from above, nose up.
|
|
96
|
+
airport: [
|
|
97
|
+
[
|
|
98
|
+
8, 1.8, 8.9, 2.8, 8.9, 6.6, 14, 9.6, 14, 10.8, 8.9, 9.3, 8.9, 12.3, 10.6,
|
|
99
|
+
13.6, 10.6, 14.4, 8, 13.7, 5.4, 14.4, 5.4, 13.6, 7.1, 12.3, 7.1, 9.3, 2,
|
|
100
|
+
10.8, 2, 9.6, 7.1, 6.6, 7.1, 2.8,
|
|
101
|
+
],
|
|
102
|
+
],
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
function rect(x: number, y: number, w: number, h: number): number[] {
|
|
106
|
+
return [x, y, x + w, y, x + w, y + h, x, y + h];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** The polygon wound clockwise on screen (y down) — positive shoelace
|
|
110
|
+
* area — whichever way it was written. */
|
|
111
|
+
function wound(points: readonly number[]): readonly number[] {
|
|
112
|
+
let area = 0;
|
|
113
|
+
const n = points.length / 2;
|
|
114
|
+
for (let i = 0; i < n; i++) {
|
|
115
|
+
const j = (i + 1) % n;
|
|
116
|
+
area +=
|
|
117
|
+
points[i * 2] * points[j * 2 + 1] - points[j * 2] * points[i * 2 + 1];
|
|
118
|
+
}
|
|
119
|
+
if (area >= 0) return points;
|
|
120
|
+
const out: number[] = [];
|
|
121
|
+
for (let i = n - 1; i >= 0; i--) out.push(points[i * 2], points[i * 2 + 1]);
|
|
122
|
+
return out;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const WOUND = {} as Record<MapIcon, readonly (readonly number[])[]>;
|
|
126
|
+
for (const name of MAP_ICONS) WOUND[name] = GLYPHS[name].map(wound);
|
|
127
|
+
|
|
128
|
+
/** Whether `name` is an icon this module draws — a style is data, and may
|
|
129
|
+
* come from a file that names one this version does not have. */
|
|
130
|
+
export function isMapIcon(name: unknown): name is MapIcon {
|
|
131
|
+
return (
|
|
132
|
+
typeof name === 'string' &&
|
|
133
|
+
Object.prototype.hasOwnProperty.call(GLYPHS, name)
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Trace a plate `size` across, centred on `cx, cy`: a square with corners
|
|
139
|
+
* rounded by a fifth of it. Adds to the current path; the caller begins it
|
|
140
|
+
* and fills it.
|
|
141
|
+
*/
|
|
142
|
+
export function tracePlate(
|
|
143
|
+
ctx: IconPathContext,
|
|
144
|
+
cx: number,
|
|
145
|
+
cy: number,
|
|
146
|
+
size: number,
|
|
147
|
+
): void {
|
|
148
|
+
const x = cx - size / 2;
|
|
149
|
+
const y = cy - size / 2;
|
|
150
|
+
const r = size * 0.2;
|
|
151
|
+
const e = size - r;
|
|
152
|
+
ctx.moveTo(x + r, y);
|
|
153
|
+
ctx.lineTo(x + e, y);
|
|
154
|
+
ctx.arc(x + e, y + r, r, -Math.PI / 2, 0);
|
|
155
|
+
ctx.lineTo(x + size, y + e);
|
|
156
|
+
ctx.arc(x + e, y + e, r, 0, Math.PI / 2);
|
|
157
|
+
ctx.lineTo(x + r, y + size);
|
|
158
|
+
ctx.arc(x + r, y + e, r, Math.PI / 2, Math.PI);
|
|
159
|
+
ctx.lineTo(x, y + r);
|
|
160
|
+
ctx.arc(x + r, y + r, r, Math.PI, Math.PI * 1.5);
|
|
161
|
+
ctx.closePath();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** Trace `icon`'s glyph over a plate `size` across, centred on `cx, cy`.
|
|
165
|
+
* Adds to the current path, as {@link tracePlate} does. */
|
|
166
|
+
export function traceGlyph(
|
|
167
|
+
ctx: IconPathContext,
|
|
168
|
+
icon: MapIcon,
|
|
169
|
+
cx: number,
|
|
170
|
+
cy: number,
|
|
171
|
+
size: number,
|
|
172
|
+
): void {
|
|
173
|
+
const unit = size / GRID;
|
|
174
|
+
const x = cx - size / 2;
|
|
175
|
+
const y = cy - size / 2;
|
|
176
|
+
for (const shape of WOUND[icon]) {
|
|
177
|
+
ctx.moveTo(x + shape[0] * unit, y + shape[1] * unit);
|
|
178
|
+
for (let i = 2; i < shape.length; i += 2) {
|
|
179
|
+
ctx.lineTo(x + shape[i] * unit, y + shape[i + 1] * unit);
|
|
180
|
+
}
|
|
181
|
+
ctx.closePath();
|
|
182
|
+
}
|
|
183
|
+
}
|
package/src/maps/index.ts
CHANGED
|
@@ -171,6 +171,7 @@ const NOT_FOR_THE_ELEMENT: readonly string[] = [
|
|
|
171
171
|
'buildWorkers',
|
|
172
172
|
'antialias',
|
|
173
173
|
'fillRule',
|
|
174
|
+
'labelsWhileMoving',
|
|
174
175
|
'onAfterDraw',
|
|
175
176
|
];
|
|
176
177
|
|
|
@@ -426,6 +427,8 @@ export {
|
|
|
426
427
|
|
|
427
428
|
export { compileFilter, resolveZoomed } from './style.js';
|
|
428
429
|
|
|
430
|
+
export { MAP_ICONS } from './icons.js';
|
|
431
|
+
|
|
429
432
|
export {
|
|
430
433
|
decodePolyline,
|
|
431
434
|
geoJsonOverlays,
|
|
@@ -479,6 +482,7 @@ export type {
|
|
|
479
482
|
SymbolLayer,
|
|
480
483
|
Zoomed,
|
|
481
484
|
} from './style.js';
|
|
485
|
+
export type { MapIcon } from './icons.js';
|
|
482
486
|
export type {
|
|
483
487
|
MapPalette,
|
|
484
488
|
OpenMapTilesStyleOptions,
|
package/src/maps/labels.ts
CHANGED
|
@@ -36,6 +36,16 @@ import type { GlLabelData } from './anchors.js';
|
|
|
36
36
|
import type { MapCanvas } from './paint.js';
|
|
37
37
|
import type { VectorTile } from './mvt.js';
|
|
38
38
|
import type { PreparedStyle, PreparedLayer } from './paint.js';
|
|
39
|
+
import {
|
|
40
|
+
DEFAULT_ICON_COLOR,
|
|
41
|
+
DEFAULT_ICON_GLYPH_COLOR,
|
|
42
|
+
DEFAULT_ICON_SIZE,
|
|
43
|
+
ICON_GAP,
|
|
44
|
+
isMapIcon,
|
|
45
|
+
traceGlyph,
|
|
46
|
+
tracePlate,
|
|
47
|
+
} from './icons.js';
|
|
48
|
+
import type { MapIcon } from './icons.js';
|
|
39
49
|
import { resolveZoomed } from './style.js';
|
|
40
50
|
import type { MapStyleLayer, SymbolLayer, Zoomed } from './style.js';
|
|
41
51
|
import type { TileId, Transform } from './proj.js';
|
|
@@ -105,17 +115,32 @@ export interface LabelCandidate {
|
|
|
105
115
|
haloWidth: number;
|
|
106
116
|
/** Pixels within which this text may not repeat. */
|
|
107
117
|
repeat: number;
|
|
118
|
+
/** The icon on the point, where the layer sets one — absent, or null, for
|
|
119
|
+
* a label that is text alone and for every name along a street. */
|
|
120
|
+
icon?: LabelIcon | null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** A point label's icon at a zoom: logical pixels across, and colours. */
|
|
124
|
+
export interface LabelIcon {
|
|
125
|
+
name: MapIcon;
|
|
126
|
+
size: number;
|
|
127
|
+
color: string;
|
|
128
|
+
glyph: string;
|
|
108
129
|
}
|
|
109
130
|
|
|
110
131
|
/** A candidate that won its place, with the box it occupies in world
|
|
111
|
-
* pixels at the zoom it was placed for — its turned text's bounding box.
|
|
132
|
+
* pixels at the zoom it was placed for — its turned text's bounding box.
|
|
133
|
+
* Not shaped: the placement covers every tile loaded, most of it outside
|
|
134
|
+
* the pane, and a label is shaped when it is first drawn. */
|
|
112
135
|
export interface PlacedLabel extends LabelCandidate {
|
|
113
136
|
/** World pixels: `mercator × worldSize`. */
|
|
114
137
|
wx: number;
|
|
115
138
|
wy: number;
|
|
116
139
|
width: number;
|
|
117
140
|
height: number;
|
|
118
|
-
|
|
141
|
+
/** How far right of the anchor the box's centre is, in world pixels: half
|
|
142
|
+
* the icon and the gap, for a name set beside an icon; 0 otherwise. */
|
|
143
|
+
ox?: number;
|
|
119
144
|
}
|
|
120
145
|
|
|
121
146
|
function num<T extends number>(
|
|
@@ -141,10 +166,14 @@ const anchorCache = new WeakMap<
|
|
|
141
166
|
{ prepared: PreparedStyle; data: GlLabelData }
|
|
142
167
|
>();
|
|
143
168
|
|
|
144
|
-
function anchorsOf(
|
|
169
|
+
function anchorsOf(
|
|
170
|
+
tile: VectorTile,
|
|
171
|
+
prepared: PreparedStyle,
|
|
172
|
+
id: TileId,
|
|
173
|
+
): GlLabelData {
|
|
145
174
|
const hit = anchorCache.get(tile);
|
|
146
175
|
if (hit && hit.prepared === prepared) return hit.data;
|
|
147
|
-
const data = buildTileLabels(tile, prepared, EXTENT);
|
|
176
|
+
const data = buildTileLabels(tile, prepared, EXTENT, id);
|
|
148
177
|
anchorCache.set(tile, { prepared, data });
|
|
149
178
|
return data;
|
|
150
179
|
}
|
|
@@ -158,6 +187,7 @@ interface LayerPaint {
|
|
|
158
187
|
haloWidth: number;
|
|
159
188
|
rank: number;
|
|
160
189
|
repeat: number;
|
|
190
|
+
icon: LabelIcon | null;
|
|
161
191
|
}
|
|
162
192
|
|
|
163
193
|
function paintAt(
|
|
@@ -180,6 +210,18 @@ function paintAt(
|
|
|
180
210
|
haloWidth: num(symbol.textHaloWidth, zoom, 1),
|
|
181
211
|
rank: symbol.rank ?? 0,
|
|
182
212
|
repeat: symbol.repeatDistance ?? 250,
|
|
213
|
+
icon: isMapIcon(symbol.icon)
|
|
214
|
+
? {
|
|
215
|
+
name: symbol.icon,
|
|
216
|
+
size: num(symbol.iconSize, zoom, DEFAULT_ICON_SIZE),
|
|
217
|
+
color: symbol.iconColor
|
|
218
|
+
? resolveZoomed(symbol.iconColor, zoom)
|
|
219
|
+
: DEFAULT_ICON_COLOR,
|
|
220
|
+
glyph: symbol.iconGlyphColor
|
|
221
|
+
? resolveZoomed(symbol.iconGlyphColor, zoom)
|
|
222
|
+
: DEFAULT_ICON_GLYPH_COLOR,
|
|
223
|
+
}
|
|
224
|
+
: null,
|
|
183
225
|
};
|
|
184
226
|
}
|
|
185
227
|
|
|
@@ -197,7 +239,7 @@ export function collectLabels(
|
|
|
197
239
|
zoom: number,
|
|
198
240
|
): LabelCandidate[] {
|
|
199
241
|
const out: LabelCandidate[] = [];
|
|
200
|
-
const data = anchorsOf(tile, prepared);
|
|
242
|
+
const data = anchorsOf(tile, prepared, id);
|
|
201
243
|
const n = tileCountAt(id.z);
|
|
202
244
|
const key = tileKey(id);
|
|
203
245
|
// Tile units to normalized mercator.
|
|
@@ -235,14 +277,85 @@ export function collectLabels(
|
|
|
235
277
|
halo: paint.halo,
|
|
236
278
|
haloWidth: paint.haloWidth,
|
|
237
279
|
repeat: paint.repeat,
|
|
280
|
+
icon: point ? paint.icon : null,
|
|
238
281
|
});
|
|
239
282
|
}
|
|
240
283
|
return out;
|
|
241
284
|
}
|
|
242
285
|
|
|
243
|
-
/**
|
|
286
|
+
/** What a string measures, in logical pixels — all placement needs of it. */
|
|
287
|
+
interface LabelMetrics {
|
|
288
|
+
width: number;
|
|
289
|
+
height: number;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* A cache bounded in **two generations** rather than by clearing: what was
|
|
294
|
+
* stored since the last turn is the young one, a lookup that finds an entry
|
|
295
|
+
* in the old one brings it back, and a full young generation becomes the
|
|
296
|
+
* old one as the old one is dropped. So what is in use survives the turn,
|
|
297
|
+
* and the bound is twice a generation.
|
|
298
|
+
*/
|
|
299
|
+
class Generations<V> {
|
|
300
|
+
private _young = new Map<string, V>();
|
|
301
|
+
private _old = new Map<string, V>();
|
|
302
|
+
constructor(private readonly _size: number) {}
|
|
303
|
+
|
|
304
|
+
get(key: string): V | undefined {
|
|
305
|
+
const hit = this._young.get(key);
|
|
306
|
+
if (hit !== undefined) return hit;
|
|
307
|
+
const kept = this._old.get(key);
|
|
308
|
+
if (kept !== undefined) this.set(key, kept);
|
|
309
|
+
return kept;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
set(key: string, value: V): void {
|
|
313
|
+
if (this._young.size >= this._size) {
|
|
314
|
+
this._old = this._young;
|
|
315
|
+
this._young = new Map();
|
|
316
|
+
}
|
|
317
|
+
this._young.set(key, value);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
clear(): void {
|
|
321
|
+
this._young = new Map();
|
|
322
|
+
this._old = new Map();
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/** Shaped strings a generation holds. Each is a layout the text engine
|
|
327
|
+
* keeps — a native one under CoreText — so this is the bound that
|
|
328
|
+
* matters, and it is the one the cache always had. */
|
|
329
|
+
const SHAPED_GENERATION = 2000;
|
|
330
|
+
/** Measurements a generation holds: two numbers each, so many more of
|
|
331
|
+
* them, enough for every label of a zoom across the levels. */
|
|
332
|
+
const MEASURED_GENERATION = 8000;
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Cache of shaped strings, owned by the element — and of what they
|
|
336
|
+
* measure, which is kept apart and far longer.
|
|
337
|
+
*
|
|
338
|
+
* Placement asks the size of every candidate on the map, most of which
|
|
339
|
+
* are never drawn, and it asks again at every step of a zoom; drawing
|
|
340
|
+
* needs the layouts of the few hundred that won their place. With one
|
|
341
|
+
* cache for both, bounded by clearing it, a wheel zoom through six levels —
|
|
342
|
+
* some 8,000 strings, every label of every level at its own size and in
|
|
343
|
+
* its halo's colour — crossed the bound every few hundred milliseconds and
|
|
344
|
+
* threw away what the next placement needed: 43,000 strings shaped in four
|
|
345
|
+
* seconds, the worst frames of the zoom spent on text it had shaped
|
|
346
|
+
* already. Measurements now outlive the layouts they were read from, and
|
|
347
|
+
* both caches turn over in generations (`Generations`).
|
|
348
|
+
*/
|
|
244
349
|
export class LabelShaper {
|
|
245
|
-
private readonly
|
|
350
|
+
private readonly _shaped = new Generations<ShapedLabel>(SHAPED_GENERATION);
|
|
351
|
+
private readonly _measured = new Generations<LabelMetrics>(
|
|
352
|
+
MEASURED_GENERATION,
|
|
353
|
+
);
|
|
354
|
+
/** What each placed label was drawn with, text and halo: kept with the
|
|
355
|
+
* placement, so a pan's frames, which draw one placement over and over,
|
|
356
|
+
* look nothing up. */
|
|
357
|
+
private _drawn = new WeakMap<PlacedLabel, ShapedLabel>();
|
|
358
|
+
private _haloed = new WeakMap<PlacedLabel, ShapedLabel>();
|
|
246
359
|
private _fonts: FontsLike | null;
|
|
247
360
|
private _family: string;
|
|
248
361
|
/** Device pixels per logical pixel. Text is shaped at the device size the
|
|
@@ -269,7 +382,41 @@ export class LabelShaper {
|
|
|
269
382
|
this._fonts = fonts;
|
|
270
383
|
this._family = family;
|
|
271
384
|
this._scale = scale;
|
|
272
|
-
this.
|
|
385
|
+
this._shaped.clear();
|
|
386
|
+
this._measured.clear();
|
|
387
|
+
this._drawn = new WeakMap();
|
|
388
|
+
this._haloed = new WeakMap();
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/** The layout a placed label's text is drawn with — or, with `halo`, its
|
|
392
|
+
* halo's — or null on a backend with no font manager. */
|
|
393
|
+
drawn(label: PlacedLabel, halo = false): ShapedLabel | null {
|
|
394
|
+
const kept = halo ? this._haloed : this._drawn;
|
|
395
|
+
const hit = kept.get(label);
|
|
396
|
+
if (hit) return hit;
|
|
397
|
+
const color = halo ? label.halo : label.color;
|
|
398
|
+
if (color === undefined) return null;
|
|
399
|
+
const shaped = this.shape(label.text, label.size, color);
|
|
400
|
+
if (shaped) kept.set(label, shaped);
|
|
401
|
+
return shaped;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/** What one label measures, logical pixels, or null on a backend with no
|
|
405
|
+
* font manager — shaped only when it has never been measured. A string
|
|
406
|
+
* measures the same in any colour, so a name and its halo share it.
|
|
407
|
+
*
|
|
408
|
+
* The layout it was measured from is not kept: most candidates never
|
|
409
|
+
* win a place, and theirs would push the layouts of the ones that did
|
|
410
|
+
* out of the cache drawing reads from. */
|
|
411
|
+
measure(text: string, size: number, color: string): LabelMetrics | null {
|
|
412
|
+
const key = `${this._family}|${size}|${text}`;
|
|
413
|
+
const hit = this._measured.get(key);
|
|
414
|
+
if (hit) return hit;
|
|
415
|
+
const shaped = this._shapeNow(text, size, color);
|
|
416
|
+
if (!shaped) return null;
|
|
417
|
+
const metrics = { width: shaped.width, height: shaped.height };
|
|
418
|
+
this._measured.set(key, metrics);
|
|
419
|
+
return metrics;
|
|
273
420
|
}
|
|
274
421
|
|
|
275
422
|
/** Shape one label, or null on a backend with no font manager. Widths
|
|
@@ -278,13 +425,20 @@ export class LabelShaper {
|
|
|
278
425
|
const fonts = this._fonts;
|
|
279
426
|
if (!fonts) return null;
|
|
280
427
|
const key = `${this._family}|${size}|${color}|${text}`;
|
|
281
|
-
const hit = this.
|
|
428
|
+
const hit = this._shaped.get(key);
|
|
282
429
|
if (hit) return hit;
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
430
|
+
const shaped = this._shapeNow(text, size, color);
|
|
431
|
+
if (shaped) this._shaped.set(key, shaped);
|
|
432
|
+
return shaped;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
private _shapeNow(
|
|
436
|
+
text: string,
|
|
437
|
+
size: number,
|
|
438
|
+
color: string,
|
|
439
|
+
): ShapedLabel | null {
|
|
440
|
+
const fonts = this._fonts;
|
|
441
|
+
if (!fonts) return null;
|
|
288
442
|
const layout = fonts.layout(text, {
|
|
289
443
|
family: this._family,
|
|
290
444
|
size: size * this._scale,
|
|
@@ -292,13 +446,11 @@ export class LabelShaper {
|
|
|
292
446
|
style: 'normal',
|
|
293
447
|
color,
|
|
294
448
|
});
|
|
295
|
-
|
|
449
|
+
return {
|
|
296
450
|
width: layout.width / this._scale,
|
|
297
451
|
height: layout.height / this._scale,
|
|
298
452
|
layout,
|
|
299
453
|
};
|
|
300
|
-
this._cache.set(key, shaped);
|
|
301
|
-
return shaped;
|
|
302
454
|
}
|
|
303
455
|
}
|
|
304
456
|
|
|
@@ -358,22 +510,14 @@ export function placeLabels(
|
|
|
358
510
|
if (candidate.dev * worldSize > candidate.size * STRAIGHT_FRACTION) {
|
|
359
511
|
continue;
|
|
360
512
|
}
|
|
361
|
-
const shaped = shaper.shape(
|
|
362
|
-
candidate.text,
|
|
363
|
-
candidate.size,
|
|
364
|
-
candidate.color,
|
|
365
|
-
);
|
|
366
|
-
if (!shaped) return placed; // no font manager: nothing can be measured
|
|
367
|
-
// Longer than the straight stretch it would sit on, with a margin past
|
|
368
|
-
// each end: it would hang off the street, over whatever the street
|
|
369
|
-
// turns into.
|
|
370
|
-
const need = shaped.width / 2 + shaped.height * LINE_MARGIN;
|
|
371
|
-
if (candidate.avail * worldSize < need) continue;
|
|
372
513
|
const wx = candidate.mx * worldSize;
|
|
373
514
|
const wy = candidate.my * worldSize;
|
|
374
|
-
// The repeat test
|
|
375
|
-
//
|
|
376
|
-
//
|
|
515
|
+
// The repeat test first, because it is the cheapest one and because it
|
|
516
|
+
// is what rejects most of a street layer: a long street offers its name
|
|
517
|
+
// every block, none of them overlapping. Ahead of the shaping, which it
|
|
518
|
+
// does not need — a street's every block shaped its name, and a wheel
|
|
519
|
+
// zoom re-places at every step, so that was thousands of strings a
|
|
520
|
+
// frame asked of the cache.
|
|
377
521
|
if (candidate.repeat > 0) {
|
|
378
522
|
const already = byText.get(candidate.key);
|
|
379
523
|
if (already) {
|
|
@@ -390,16 +534,37 @@ export function placeLabels(
|
|
|
390
534
|
if (tooClose) continue;
|
|
391
535
|
}
|
|
392
536
|
}
|
|
537
|
+
const measured = shaper.measure(
|
|
538
|
+
candidate.text,
|
|
539
|
+
candidate.size,
|
|
540
|
+
candidate.color,
|
|
541
|
+
);
|
|
542
|
+
if (!measured) return placed; // no font manager: nothing can be measured
|
|
543
|
+
// Longer than the straight stretch it would sit on, with a margin past
|
|
544
|
+
// each end: it would hang off the street, over whatever the street
|
|
545
|
+
// turns into.
|
|
546
|
+
const need = measured.width / 2 + measured.height * LINE_MARGIN;
|
|
547
|
+
if (candidate.avail * worldSize < need) continue;
|
|
393
548
|
// The turned text's bounding box: what it covers, as far as another
|
|
394
|
-
// label can tell.
|
|
549
|
+
// label can tell. With an icon, the box around the icon on the point
|
|
550
|
+
// and the text beside it — the two give way as one, or a stop's name
|
|
551
|
+
// would be set with nothing to say it is a stop.
|
|
395
552
|
const angle = levelled(candidate.angle);
|
|
396
|
-
const
|
|
397
|
-
|
|
553
|
+
const icon = candidate.icon ?? null;
|
|
554
|
+
let w = measured.width + padding * 2;
|
|
555
|
+
let h = measured.height + padding * 2;
|
|
556
|
+
let ox = 0;
|
|
557
|
+
if (icon) {
|
|
558
|
+
const full = icon.size + ICON_GAP + measured.width;
|
|
559
|
+
ox = (full - icon.size) / 2;
|
|
560
|
+
w = full + padding * 2;
|
|
561
|
+
h = Math.max(icon.size, measured.height) + padding * 2;
|
|
562
|
+
}
|
|
398
563
|
const cos = Math.abs(Math.cos(angle));
|
|
399
564
|
const sin = Math.abs(Math.sin(angle));
|
|
400
565
|
const width = w * cos + h * sin;
|
|
401
566
|
const height = w * sin + h * cos;
|
|
402
|
-
const left = wx - width / 2;
|
|
567
|
+
const left = wx + ox - width / 2;
|
|
403
568
|
const top = wy - height / 2;
|
|
404
569
|
const x0 = Math.floor(left / CELL);
|
|
405
570
|
const x1 = Math.floor((left + width) / CELL);
|
|
@@ -411,11 +576,13 @@ export function placeLabels(
|
|
|
411
576
|
const bucket = grid.get(cellKey(cx, cy));
|
|
412
577
|
if (!bucket) continue;
|
|
413
578
|
for (const other of bucket) {
|
|
579
|
+
const otherLeft = other.wx + (other.ox ?? 0) - other.width / 2;
|
|
580
|
+
const otherTop = other.wy - other.height / 2;
|
|
414
581
|
if (
|
|
415
|
-
left <
|
|
416
|
-
left + width >
|
|
417
|
-
top <
|
|
418
|
-
top + height >
|
|
582
|
+
left < otherLeft + other.width &&
|
|
583
|
+
left + width > otherLeft &&
|
|
584
|
+
top < otherTop + other.height &&
|
|
585
|
+
top + height > otherTop
|
|
419
586
|
) {
|
|
420
587
|
free = false;
|
|
421
588
|
break;
|
|
@@ -429,9 +596,9 @@ export function placeLabels(
|
|
|
429
596
|
angle,
|
|
430
597
|
wx,
|
|
431
598
|
wy,
|
|
599
|
+
ox,
|
|
432
600
|
width,
|
|
433
601
|
height,
|
|
434
|
-
shaped,
|
|
435
602
|
};
|
|
436
603
|
placed.push(entry);
|
|
437
604
|
if (candidate.repeat > 0) {
|
|
@@ -482,30 +649,51 @@ export function drawLabels(
|
|
|
482
649
|
for (const label of placed) {
|
|
483
650
|
const cx = originX + label.wx;
|
|
484
651
|
const cy = originY + label.wy;
|
|
652
|
+
// The box's centre, which is right of the point where an icon is on it.
|
|
653
|
+
const bx = cx + (label.ox ?? 0);
|
|
485
654
|
const halfW = label.width / 2;
|
|
486
655
|
const halfH = label.height / 2;
|
|
487
656
|
if (
|
|
488
|
-
|
|
657
|
+
bx + halfW < pane.x ||
|
|
489
658
|
cy + halfH < pane.y ||
|
|
490
|
-
|
|
659
|
+
bx - halfW > pane.x + pane.width ||
|
|
491
660
|
cy - halfH > pane.y + pane.height
|
|
492
661
|
) {
|
|
493
662
|
continue;
|
|
494
663
|
}
|
|
495
664
|
if (
|
|
496
665
|
clip &&
|
|
497
|
-
(
|
|
666
|
+
(bx + halfW < clip.x ||
|
|
498
667
|
cy + halfH < clip.y ||
|
|
499
|
-
|
|
668
|
+
bx - halfW > clip.x + clip.width ||
|
|
500
669
|
cy - halfH > clip.y + clip.height)
|
|
501
670
|
) {
|
|
502
671
|
continue;
|
|
503
672
|
}
|
|
504
|
-
|
|
505
|
-
|
|
673
|
+
// Shaped here, for the labels in the pane: the few hundred a frame
|
|
674
|
+
// draws, where the placement holds every name on the tiles loaded.
|
|
675
|
+
const shaped = shaper.drawn(label);
|
|
676
|
+
if (!shaped) continue;
|
|
677
|
+
const { width, height } = shaped;
|
|
678
|
+
const icon = label.icon ?? null;
|
|
679
|
+
const turned = !icon && label.angle !== 0 && turns;
|
|
680
|
+
const haloed = label.halo !== undefined && label.haloWidth > 0;
|
|
506
681
|
let dx: number;
|
|
507
682
|
let dy: number;
|
|
508
|
-
if (
|
|
683
|
+
if (icon) {
|
|
684
|
+
// The icon on the point, and the name level beside it.
|
|
685
|
+
drawIcon(
|
|
686
|
+
ctx,
|
|
687
|
+
icon,
|
|
688
|
+
Math.round(cx * scale),
|
|
689
|
+
Math.round(cy * scale),
|
|
690
|
+
icon.size * scale,
|
|
691
|
+
haloed ? label.halo : undefined,
|
|
692
|
+
Math.max(1, Math.round(label.haloWidth * scale)),
|
|
693
|
+
);
|
|
694
|
+
dx = Math.round((cx + icon.size / 2 + ICON_GAP) * scale);
|
|
695
|
+
dy = Math.round((cy - height / 2) * scale);
|
|
696
|
+
} else if (turned) {
|
|
509
697
|
ctx.save();
|
|
510
698
|
ctx.translate!(cx * scale, cy * scale);
|
|
511
699
|
ctx.rotate!(label.angle);
|
|
@@ -516,7 +704,7 @@ export function drawLabels(
|
|
|
516
704
|
dy = Math.round((cy - height / 2) * scale);
|
|
517
705
|
}
|
|
518
706
|
if (label.halo !== undefined && label.haloWidth > 0) {
|
|
519
|
-
const halo = shaper.
|
|
707
|
+
const halo = shaper.drawn(label, true);
|
|
520
708
|
if (halo) {
|
|
521
709
|
const offset = Math.max(1, Math.round(label.haloWidth * scale));
|
|
522
710
|
halo.layout.draw(ctx, dx - offset, dy);
|
|
@@ -525,11 +713,43 @@ export function drawLabels(
|
|
|
525
713
|
halo.layout.draw(ctx, dx, dy + offset);
|
|
526
714
|
}
|
|
527
715
|
}
|
|
528
|
-
|
|
716
|
+
shaped.layout.draw(ctx, dx, dy);
|
|
529
717
|
if (turned) ctx.restore();
|
|
530
718
|
drawn++;
|
|
531
719
|
}
|
|
532
720
|
return drawn;
|
|
533
721
|
}
|
|
534
722
|
|
|
723
|
+
/**
|
|
724
|
+
* An icon on its point, in device pixels: the plate, over a plate of the
|
|
725
|
+
* halo's colour a halo wider where the layer has one — the same ground a
|
|
726
|
+
* name's halo gives it over a road — and the glyph on the plate.
|
|
727
|
+
*/
|
|
728
|
+
function drawIcon(
|
|
729
|
+
ctx: MapCanvas,
|
|
730
|
+
icon: LabelIcon,
|
|
731
|
+
x: number,
|
|
732
|
+
y: number,
|
|
733
|
+
size: number,
|
|
734
|
+
halo: string | undefined,
|
|
735
|
+
reach: number,
|
|
736
|
+
): void {
|
|
737
|
+
ctx.save();
|
|
738
|
+
if (halo !== undefined) {
|
|
739
|
+
ctx.fillStyle = halo;
|
|
740
|
+
ctx.beginPath();
|
|
741
|
+
tracePlate(ctx, x, y, size + reach * 2);
|
|
742
|
+
ctx.fill();
|
|
743
|
+
}
|
|
744
|
+
ctx.fillStyle = icon.color;
|
|
745
|
+
ctx.beginPath();
|
|
746
|
+
tracePlate(ctx, x, y, size);
|
|
747
|
+
ctx.fill();
|
|
748
|
+
ctx.fillStyle = icon.glyph;
|
|
749
|
+
ctx.beginPath();
|
|
750
|
+
traceGlyph(ctx, icon.name, x, y, size);
|
|
751
|
+
ctx.fill();
|
|
752
|
+
ctx.restore();
|
|
753
|
+
}
|
|
754
|
+
|
|
535
755
|
export type { PreparedLayer };
|