@react-x11/components 0.8.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 +105 -38
- package/dist/charts/node.d.ts +12 -2
- package/dist/charts/node.d.ts.map +1 -1
- package/dist/charts/node.js +50 -16
- 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/embed/client.d.ts +48 -3
- package/dist/embed/client.d.ts.map +1 -1
- package/dist/embed/client.js +79 -5
- package/dist/embed/client.js.map +1 -1
- package/dist/embed/index.d.ts +1 -1
- package/dist/embed/index.d.ts.map +1 -1
- package/dist/embed/index.js +1 -1
- package/dist/embed/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 +172 -5
- package/dist/html/node.d.ts.map +1 -1
- package/dist/html/node.js +1336 -103
- 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 +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +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/{markdown → internal/markdown}/ast.d.ts +23 -0
- package/dist/internal/markdown/ast.d.ts.map +1 -0
- package/dist/internal/markdown/ast.js +22 -0
- package/dist/internal/markdown/ast.js.map +1 -0
- package/dist/internal/markdown/parse.d.ts.map +1 -0
- package/dist/{markdown → internal/markdown}/parse.js +221 -30
- package/dist/internal/markdown/parse.js.map +1 -0
- package/dist/internal/markdown/stringify.d.ts +4 -0
- package/dist/internal/markdown/stringify.d.ts.map +1 -0
- package/dist/internal/markdown/stringify.js +684 -0
- package/dist/internal/markdown/stringify.js.map +1 -0
- package/dist/internal/markdown/tags.d.ts.map +1 -0
- package/dist/internal/markdown/tags.js.map +1 -0
- 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/scroll.d.ts +3 -2
- package/dist/internal/scroll.d.ts.map +1 -1
- package/dist/internal/scroll.js +1 -0
- package/dist/internal/scroll.js.map +1 -1
- 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 +103 -0
- package/dist/maps/anchors.d.ts.map +1 -0
- package/dist/maps/anchors.js +790 -0
- package/dist/maps/anchors.js.map +1 -0
- package/dist/maps/controller.d.ts +340 -0
- package/dist/maps/controller.d.ts.map +1 -0
- package/dist/maps/controller.js +822 -0
- package/dist/maps/controller.js.map +1 -0
- package/dist/maps/gl/buckets.d.ts +99 -0
- package/dist/maps/gl/buckets.d.ts.map +1 -0
- package/dist/maps/gl/buckets.js +365 -0
- package/dist/maps/gl/buckets.js.map +1 -0
- package/dist/maps/gl/build-worker.d.ts +15 -0
- package/dist/maps/gl/build-worker.d.ts.map +1 -0
- package/dist/maps/gl/build-worker.js +44 -0
- package/dist/maps/gl/build-worker.js.map +1 -0
- package/dist/maps/gl/color.d.ts +8 -0
- package/dist/maps/gl/color.d.ts.map +1 -0
- package/dist/maps/gl/color.js +57 -0
- package/dist/maps/gl/color.js.map +1 -0
- package/dist/maps/gl/cover.d.ts +70 -0
- package/dist/maps/gl/cover.d.ts.map +1 -0
- package/dist/maps/gl/cover.js +137 -0
- package/dist/maps/gl/cover.js.map +1 -0
- package/dist/maps/gl/index.d.ts +3 -0
- package/dist/maps/gl/index.d.ts.map +1 -0
- package/dist/maps/gl/index.js +20 -0
- package/dist/maps/gl/index.js.map +1 -0
- package/dist/maps/gl/markers.d.ts +28 -0
- package/dist/maps/gl/markers.d.ts.map +1 -0
- package/dist/maps/gl/markers.js +60 -0
- package/dist/maps/gl/markers.js.map +1 -0
- package/dist/maps/gl/overlays.d.ts +68 -0
- package/dist/maps/gl/overlays.d.ts.map +1 -0
- package/dist/maps/gl/overlays.js +300 -0
- package/dist/maps/gl/overlays.js.map +1 -0
- package/dist/maps/gl/pane.d.ts +12 -0
- package/dist/maps/gl/pane.d.ts.map +1 -0
- package/dist/maps/gl/pane.js +37 -0
- package/dist/maps/gl/pane.js.map +1 -0
- package/dist/maps/gl/placement.d.ts +124 -0
- package/dist/maps/gl/placement.d.ts.map +1 -0
- package/dist/maps/gl/placement.js +642 -0
- package/dist/maps/gl/placement.js.map +1 -0
- package/dist/maps/gl/renderer.d.ts +384 -0
- package/dist/maps/gl/renderer.d.ts.map +1 -0
- package/dist/maps/gl/renderer.js +1184 -0
- package/dist/maps/gl/renderer.js.map +1 -0
- package/dist/maps/gl/shaders.d.ts +121 -0
- package/dist/maps/gl/shaders.d.ts.map +1 -0
- package/dist/maps/gl/shaders.js +453 -0
- package/dist/maps/gl/shaders.js.map +1 -0
- package/dist/maps/gl/store.d.ts +125 -0
- package/dist/maps/gl/store.d.ts.map +1 -0
- package/dist/maps/gl/store.js +512 -0
- package/dist/maps/gl/store.js.map +1 -0
- package/dist/maps/gl/text.d.ts +283 -0
- package/dist/maps/gl/text.d.ts.map +1 -0
- package/dist/maps/gl/text.js +698 -0
- package/dist/maps/gl/text.js.map +1 -0
- package/dist/maps/gl/view.d.ts +345 -0
- package/dist/maps/gl/view.d.ts.map +1 -0
- package/dist/maps/gl/view.js +1209 -0
- package/dist/maps/gl/view.js.map +1 -0
- 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 +3 -1
- package/dist/maps/index.d.ts.map +1 -1
- package/dist/maps/index.js +218 -52
- package/dist/maps/index.js.map +1 -1
- package/dist/maps/labels.d.ts +91 -18
- package/dist/maps/labels.d.ts.map +1 -1
- package/dist/maps/labels.js +376 -140
- package/dist/maps/labels.js.map +1 -1
- package/dist/maps/node.d.ts +179 -56
- package/dist/maps/node.d.ts.map +1 -1
- package/dist/maps/node.js +663 -537
- package/dist/maps/node.js.map +1 -1
- package/dist/maps/overlay.d.ts +72 -9
- package/dist/maps/overlay.d.ts.map +1 -1
- package/dist/maps/overlay.js +108 -28
- package/dist/maps/overlay.js.map +1 -1
- package/dist/maps/paint.d.ts +3 -0
- package/dist/maps/paint.d.ts.map +1 -1
- package/dist/maps/paint.js.map +1 -1
- package/dist/maps/proj.d.ts +62 -0
- package/dist/maps/proj.d.ts.map +1 -1
- package/dist/maps/proj.js +101 -0
- package/dist/maps/proj.js.map +1 -1
- package/dist/maps/renderer.d.ts +69 -0
- package/dist/maps/renderer.d.ts.map +1 -0
- package/dist/maps/renderer.js +66 -0
- package/dist/maps/renderer.js.map +1 -0
- package/dist/maps/sources.d.ts +30 -6
- package/dist/maps/sources.d.ts.map +1 -1
- package/dist/maps/sources.js +22 -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/theme.d.ts +19 -0
- package/dist/maps/theme.d.ts.map +1 -0
- package/dist/maps/theme.js +44 -0
- package/dist/maps/theme.js.map +1 -0
- package/dist/maps/tiles.d.ts +147 -27
- package/dist/maps/tiles.d.ts.map +1 -1
- package/dist/maps/tiles.js +221 -54
- package/dist/maps/tiles.js.map +1 -1
- package/dist/maps/types.d.ts +213 -21
- package/dist/maps/types.d.ts.map +1 -1
- package/dist/markdown/expressions.d.ts +1 -1
- package/dist/markdown/expressions.d.ts.map +1 -1
- package/dist/markdown/expressions.js.map +1 -1
- package/dist/markdown/index.d.ts +7 -6
- package/dist/markdown/index.d.ts.map +1 -1
- package/dist/markdown/index.js +121 -50
- package/dist/markdown/index.js.map +1 -1
- package/dist/markdown/spans.d.ts +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/media-player/index.d.ts +11 -3
- package/dist/media-player/index.d.ts.map +1 -1
- package/dist/media-player/index.js +13 -2
- package/dist/media-player/index.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/clipboard.d.ts +23 -0
- package/dist/rich-text-editor/clipboard.d.ts.map +1 -0
- package/dist/rich-text-editor/clipboard.js +307 -0
- package/dist/rich-text-editor/clipboard.js.map +1 -0
- package/dist/rich-text-editor/collab.d.ts +32 -0
- package/dist/rich-text-editor/collab.d.ts.map +1 -0
- package/dist/rich-text-editor/collab.js +55 -0
- package/dist/rich-text-editor/collab.js.map +1 -0
- package/dist/rich-text-editor/commands.d.ts +50 -0
- package/dist/rich-text-editor/commands.d.ts.map +1 -0
- package/dist/rich-text-editor/commands.js +376 -0
- package/dist/rich-text-editor/commands.js.map +1 -0
- package/dist/rich-text-editor/drag.d.ts +68 -0
- package/dist/rich-text-editor/drag.d.ts.map +1 -0
- package/dist/rich-text-editor/drag.js +148 -0
- package/dist/rich-text-editor/drag.js.map +1 -0
- package/dist/rich-text-editor/html.d.ts +145 -0
- package/dist/rich-text-editor/html.d.ts.map +1 -0
- package/dist/rich-text-editor/html.js +516 -0
- package/dist/rich-text-editor/html.js.map +1 -0
- package/dist/rich-text-editor/index.d.ts +252 -0
- package/dist/rich-text-editor/index.d.ts.map +1 -0
- package/dist/rich-text-editor/index.js +856 -0
- package/dist/rich-text-editor/index.js.map +1 -0
- package/dist/rich-text-editor/inline.d.ts +94 -0
- package/dist/rich-text-editor/inline.d.ts.map +1 -0
- package/dist/rich-text-editor/inline.js +252 -0
- package/dist/rich-text-editor/inline.js.map +1 -0
- package/dist/rich-text-editor/keymap.d.ts +71 -0
- package/dist/rich-text-editor/keymap.d.ts.map +1 -0
- package/dist/rich-text-editor/keymap.js +394 -0
- package/dist/rich-text-editor/keymap.js.map +1 -0
- package/dist/rich-text-editor/keys.d.ts +40 -0
- package/dist/rich-text-editor/keys.d.ts.map +1 -0
- package/dist/rich-text-editor/keys.js +202 -0
- package/dist/rich-text-editor/keys.js.map +1 -0
- package/dist/rich-text-editor/look.d.ts +71 -0
- package/dist/rich-text-editor/look.d.ts.map +1 -0
- package/dist/rich-text-editor/look.js +342 -0
- package/dist/rich-text-editor/look.js.map +1 -0
- package/dist/rich-text-editor/markdown.d.ts +18 -0
- package/dist/rich-text-editor/markdown.d.ts.map +1 -0
- package/dist/rich-text-editor/markdown.js +496 -0
- package/dist/rich-text-editor/markdown.js.map +1 -0
- 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/nodes.d.ts +135 -0
- package/dist/rich-text-editor/nodes.d.ts.map +1 -0
- package/dist/rich-text-editor/nodes.js +397 -0
- package/dist/rich-text-editor/nodes.js.map +1 -0
- package/dist/rich-text-editor/render.d.ts +68 -0
- package/dist/rich-text-editor/render.d.ts.map +1 -0
- package/dist/rich-text-editor/render.js +518 -0
- package/dist/rich-text-editor/render.js.map +1 -0
- package/dist/rich-text-editor/schema.d.ts +16 -0
- package/dist/rich-text-editor/schema.d.ts.map +1 -0
- package/dist/rich-text-editor/schema.js +386 -0
- package/dist/rich-text-editor/schema.js.map +1 -0
- package/dist/rich-text-editor/store.d.ts +11 -0
- package/dist/rich-text-editor/store.d.ts.map +1 -0
- package/dist/rich-text-editor/store.js +43 -0
- package/dist/rich-text-editor/store.js.map +1 -0
- package/dist/rich-text-editor/suggest.d.ts +127 -0
- package/dist/rich-text-editor/suggest.d.ts.map +1 -0
- package/dist/rich-text-editor/suggest.js +0 -0
- package/dist/rich-text-editor/suggest.js.map +1 -0
- package/dist/rich-text-editor/tables.d.ts +41 -0
- package/dist/rich-text-editor/tables.d.ts.map +1 -0
- package/dist/rich-text-editor/tables.js +204 -0
- package/dist/rich-text-editor/tables.js.map +1 -0
- package/dist/rich-text-editor/toolbar.d.ts +58 -0
- package/dist/rich-text-editor/toolbar.d.ts.map +1 -0
- package/dist/rich-text-editor/toolbar.js +548 -0
- package/dist/rich-text-editor/toolbar.js.map +1 -0
- package/dist/rich-text-editor/view.d.ts +368 -0
- package/dist/rich-text-editor/view.d.ts.map +1 -0
- package/dist/rich-text-editor/view.js +1968 -0
- package/dist/rich-text-editor/view.js.map +1 -0
- package/dist/rich-text-editor/virtual.d.ts +54 -0
- package/dist/rich-text-editor/virtual.d.ts.map +1 -0
- package/dist/rich-text-editor/virtual.js +279 -0
- package/dist/rich-text-editor/virtual.js.map +1 -0
- package/dist/richtext/node.d.ts +71 -4
- package/dist/richtext/node.d.ts.map +1 -1
- package/dist/richtext/node.js +233 -28
- 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/backends.d.ts +4 -1
- package/dist/terminal/backends.d.ts.map +1 -1
- package/dist/terminal/backends.js.map +1 -1
- package/dist/terminal/index.d.ts +18 -7
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +32 -11
- 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 +59 -31
- package/src/charts/node.ts +68 -28
- 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/embed/client.ts +102 -8
- package/src/embed/index.ts +2 -0
- 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 +1486 -121
- 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 +4 -0
- package/src/internal/collate.ts +12 -0
- package/src/{markdown → internal/markdown}/ast.ts +35 -7
- package/src/{markdown → internal/markdown}/parse.ts +288 -35
- package/src/internal/markdown/stringify.ts +772 -0
- package/src/internal/prewarm.ts +45 -0
- package/src/internal/scroll.ts +5 -3
- 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 +913 -0
- package/src/maps/controller.ts +1084 -0
- package/src/maps/gl/buckets.ts +461 -0
- package/src/maps/gl/build-worker.ts +66 -0
- package/src/maps/gl/color.ts +62 -0
- package/src/maps/gl/cover.ts +205 -0
- package/src/maps/gl/index.ts +23 -0
- package/src/maps/gl/markers.ts +83 -0
- package/src/maps/gl/overlays.ts +379 -0
- package/src/maps/gl/pane.ts +42 -0
- package/src/maps/gl/placement.ts +968 -0
- package/src/maps/gl/renderer.ts +1660 -0
- package/src/maps/gl/shaders.ts +489 -0
- package/src/maps/gl/store.ts +615 -0
- package/src/maps/gl/text.ts +868 -0
- package/src/maps/gl/view.ts +1489 -0
- package/src/maps/icons.ts +183 -0
- package/src/maps/index.ts +274 -81
- package/src/maps/labels.ts +457 -144
- package/src/maps/node.ts +832 -665
- package/src/maps/overlay.ts +148 -43
- package/src/maps/paint.ts +3 -0
- package/src/maps/proj.ts +118 -0
- package/src/maps/renderer.ts +155 -0
- package/src/maps/sources.ts +43 -6
- package/src/maps/style.ts +32 -0
- package/src/maps/styles.ts +215 -4
- package/src/maps/theme.ts +51 -0
- package/src/maps/tiles.ts +253 -62
- package/src/maps/types.ts +213 -21
- package/src/markdown/expressions.ts +5 -1
- package/src/markdown/index.ts +163 -78
- package/src/markdown/spans.ts +6 -1
- package/src/media-player/index.ts +18 -4
- 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/clipboard.ts +439 -0
- package/src/rich-text-editor/collab.ts +91 -0
- package/src/rich-text-editor/commands.ts +448 -0
- package/src/rich-text-editor/dom-globals.d.ts +23 -0
- package/src/rich-text-editor/drag.ts +211 -0
- package/src/rich-text-editor/html.ts +619 -0
- package/src/rich-text-editor/index.ts +1364 -0
- package/src/rich-text-editor/inline.ts +345 -0
- package/src/rich-text-editor/keymap.ts +510 -0
- package/src/rich-text-editor/keys.ts +228 -0
- package/src/rich-text-editor/look.ts +427 -0
- package/src/rich-text-editor/markdown.ts +653 -0
- package/src/rich-text-editor/marks.ts +101 -0
- package/src/rich-text-editor/nodes.ts +497 -0
- package/src/rich-text-editor/render.ts +837 -0
- package/src/rich-text-editor/schema.ts +431 -0
- package/src/rich-text-editor/store.ts +39 -0
- package/src/rich-text-editor/suggest.ts +597 -0
- package/src/rich-text-editor/tables.ts +272 -0
- package/src/rich-text-editor/toolbar.ts +724 -0
- package/src/rich-text-editor/view.ts +2287 -0
- package/src/rich-text-editor/virtual.ts +372 -0
- package/src/richtext/node.ts +294 -44
- package/src/richtext/runs.ts +23 -12
- package/src/table/index.ts +29 -0
- package/src/table/rows.ts +18 -8
- package/src/terminal/backends.ts +4 -1
- package/src/terminal/index.ts +47 -15
- 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/dist/markdown/ast.d.ts.map +0 -1
- package/dist/markdown/ast.js +0 -17
- package/dist/markdown/ast.js.map +0 -1
- package/dist/markdown/parse.d.ts.map +0 -1
- package/dist/markdown/parse.js.map +0 -1
- package/dist/markdown/tags.d.ts.map +0 -1
- package/dist/markdown/tags.js.map +0 -1
- /package/dist/{markdown → internal/markdown}/parse.d.ts +0 -0
- /package/dist/{markdown → internal/markdown}/tags.d.ts +0 -0
- /package/dist/{markdown → internal/markdown}/tags.js +0 -0
- /package/src/{markdown → internal/markdown}/tags.ts +0 -0
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
// The second half of drawing: a {@link FlowScene} issued through a
|
|
2
|
+
// `FlowPainter`.
|
|
3
|
+
//
|
|
4
|
+
// `./scene.ts` decided what the frame shows; this decides how few requests
|
|
5
|
+
// show it. That division is deliberate — every batching rule below is a
|
|
6
|
+
// property of *this* renderer, measured against ntk's 2D context, and none
|
|
7
|
+
// of it would be right for a GPU (`docs/prd-flow-gl.md`). A scene is
|
|
8
|
+
// renderer-neutral precisely because the buckets live here.
|
|
9
|
+
//
|
|
10
|
+
// Z-order is the order of the calls, and it is load-bearing: the grid, then
|
|
11
|
+
// every edge's stroke, then every arrowhead, then every label chip, then
|
|
12
|
+
// every label, then the nodes, then the pane's furniture. An edge label that
|
|
13
|
+
// drew with its own edge would be crossed out by the next edge over.
|
|
14
|
+
import type { FlowPainter, StrokeOptions, XYPosition } from './types.js';
|
|
15
|
+
import type {
|
|
16
|
+
FlowScene,
|
|
17
|
+
SceneEdge,
|
|
18
|
+
SceneGrid,
|
|
19
|
+
SceneNodeItem,
|
|
20
|
+
SceneRect,
|
|
21
|
+
SceneRule,
|
|
22
|
+
SceneText,
|
|
23
|
+
} from './scene.js';
|
|
24
|
+
|
|
25
|
+
/** How a renderer draws the grid, when it can do better than the runs below
|
|
26
|
+
* — the element's pattern-tile path (ntk#263). Answers whether it did. */
|
|
27
|
+
export type GridPainter = (painter: FlowPainter, grid: SceneGrid) => boolean;
|
|
28
|
+
|
|
29
|
+
function paintRect(painter: FlowPainter, item: SceneRect): void {
|
|
30
|
+
painter.rect(
|
|
31
|
+
item.rect.x,
|
|
32
|
+
item.rect.y,
|
|
33
|
+
item.rect.width,
|
|
34
|
+
item.rect.height,
|
|
35
|
+
item.radius,
|
|
36
|
+
{ fill: item.fill, stroke: item.stroke, lineWidth: item.lineWidth },
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function paintText(painter: FlowPainter, item: SceneText): void {
|
|
41
|
+
painter.text(item.text, item.x, item.y, {
|
|
42
|
+
size: item.size,
|
|
43
|
+
color: item.color,
|
|
44
|
+
weight: item.weight,
|
|
45
|
+
align: item.align,
|
|
46
|
+
baseline: item.baseline,
|
|
47
|
+
maxWidth: item.maxWidth,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Strokes grouped by the pen that will draw them, for a pane whose edges are
|
|
53
|
+
* stroked a pen at a time (`FlowScene.batch`, `EDGE_BATCH` in `scene.ts`).
|
|
54
|
+
*
|
|
55
|
+
* Everything a graph strokes is the same two or three pens — the default
|
|
56
|
+
* edge, the selected one, the animated dash — so grouping collapses a
|
|
57
|
+
* per-edge request into a per-pen one. The key carries the dash *and* its
|
|
58
|
+
* offset: two edges marching out of phase cannot share a path, because the
|
|
59
|
+
* offset is set on the context, not on the subpath. And it leads with the
|
|
60
|
+
* layer, so that the pens are stroked in the same order by every pass —
|
|
61
|
+
* the order a pass happened to meet them in put the default pen over the
|
|
62
|
+
* selected one in one pass and under it in the next.
|
|
63
|
+
*/
|
|
64
|
+
class StrokeBuckets {
|
|
65
|
+
private readonly byPen = new Map<
|
|
66
|
+
string,
|
|
67
|
+
{ options: StrokeOptions; runs: (readonly XYPosition[])[] }
|
|
68
|
+
>();
|
|
69
|
+
|
|
70
|
+
push(
|
|
71
|
+
points: readonly XYPosition[],
|
|
72
|
+
layer: number,
|
|
73
|
+
stroke: string,
|
|
74
|
+
lineWidth: number,
|
|
75
|
+
dash: readonly number[] | undefined,
|
|
76
|
+
dashOffset: number,
|
|
77
|
+
): void {
|
|
78
|
+
const key = `${layer}|${stroke}|${lineWidth}|${dash?.join(',') ?? ''}|${dashOffset}`;
|
|
79
|
+
let entry = this.byPen.get(key);
|
|
80
|
+
if (!entry) {
|
|
81
|
+
entry = { options: { stroke, lineWidth, dash, dashOffset }, runs: [] };
|
|
82
|
+
this.byPen.set(key, entry);
|
|
83
|
+
}
|
|
84
|
+
entry.runs.push(points);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
paint(painter: FlowPainter): void {
|
|
88
|
+
for (const key of [...this.byPen.keys()].sort()) {
|
|
89
|
+
const { options, runs } = this.byPen.get(key)!;
|
|
90
|
+
painter.strokeRuns(runs, options);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Arrowheads piled by colour: the filled heads and the open ones share one,
|
|
96
|
+
* and differ only in which list they land in. */
|
|
97
|
+
interface MarkerBucket {
|
|
98
|
+
color: string;
|
|
99
|
+
lineWidth: number;
|
|
100
|
+
filled: (readonly XYPosition[])[];
|
|
101
|
+
open: (readonly XYPosition[])[];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** The runs a pass strokes of an edge — the part of the route it reaches,
|
|
105
|
+
* where it reaches only part. */
|
|
106
|
+
function runsOf(edge: SceneEdge): readonly (readonly XYPosition[])[] {
|
|
107
|
+
return edge.runs ?? [edge.points];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function paintEdges(
|
|
111
|
+
painter: FlowPainter,
|
|
112
|
+
edges: readonly SceneEdge[],
|
|
113
|
+
batch: boolean,
|
|
114
|
+
): void {
|
|
115
|
+
if (batch) paintEdgesByPen(painter, edges);
|
|
116
|
+
else paintEdgesInOrder(painter, edges);
|
|
117
|
+
|
|
118
|
+
// The chips and then the labels, both above every edge — which is the
|
|
119
|
+
// point of a chip. The text is not collected, because a glyph run is
|
|
120
|
+
// already one request and nothing is gained by holding it.
|
|
121
|
+
for (const edge of edges) {
|
|
122
|
+
if (edge.chip) paintRect(painter, edge.chip);
|
|
123
|
+
}
|
|
124
|
+
for (const edge of edges) {
|
|
125
|
+
if (edge.label) paintText(painter, edge.label);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Every run of a pen as one path, and every arrowhead of a colour. A pass
|
|
131
|
+
* draws the pens it reaches in the same order and with the same compositing
|
|
132
|
+
* as the whole pane does: where two of a pen's runs overlap, their coverage
|
|
133
|
+
* adds, in a pass as in a repaint.
|
|
134
|
+
*/
|
|
135
|
+
function paintEdgesByPen(
|
|
136
|
+
painter: FlowPainter,
|
|
137
|
+
edges: readonly SceneEdge[],
|
|
138
|
+
): void {
|
|
139
|
+
const strokes = new StrokeBuckets();
|
|
140
|
+
const markers = new Map<string, MarkerBucket>();
|
|
141
|
+
for (const edge of edges) {
|
|
142
|
+
const layer = edge.layer ?? 0;
|
|
143
|
+
// a dashed run picking its pattern up where it starts along the edge
|
|
144
|
+
const runs = runsOf(edge);
|
|
145
|
+
for (let i = 0; i < runs.length; i++) {
|
|
146
|
+
const points = runs[i];
|
|
147
|
+
if (points.length < 2) continue;
|
|
148
|
+
strokes.push(
|
|
149
|
+
points,
|
|
150
|
+
layer,
|
|
151
|
+
edge.stroke,
|
|
152
|
+
edge.lineWidth,
|
|
153
|
+
edge.dash,
|
|
154
|
+
edge.dashOffset + (edge.runStarts?.[i] ?? 0),
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
for (const marker of edge.markers) {
|
|
158
|
+
const key = `${layer}|${marker.color}|${marker.lineWidth}`;
|
|
159
|
+
let bucket = markers.get(key);
|
|
160
|
+
if (!bucket) {
|
|
161
|
+
bucket = {
|
|
162
|
+
color: marker.color,
|
|
163
|
+
lineWidth: marker.lineWidth,
|
|
164
|
+
filled: [],
|
|
165
|
+
open: [],
|
|
166
|
+
};
|
|
167
|
+
markers.set(key, bucket);
|
|
168
|
+
}
|
|
169
|
+
(marker.filled ? bucket.filled : bucket.open).push(marker.points);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
strokes.paint(painter);
|
|
173
|
+
for (const key of [...markers.keys()].sort()) {
|
|
174
|
+
const bucket = markers.get(key)!;
|
|
175
|
+
if (bucket.filled.length > 0) {
|
|
176
|
+
painter.polygons(bucket.filled, { fill: bucket.color });
|
|
177
|
+
}
|
|
178
|
+
if (bucket.open.length > 0) {
|
|
179
|
+
painter.strokeRuns(bucket.open, {
|
|
180
|
+
stroke: bucket.color,
|
|
181
|
+
lineWidth: bucket.lineWidth,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* An edge at a time, in the graph's order, and the arrowheads after all of
|
|
189
|
+
* them: what a pane with few edges draws, where a path per pen would be a
|
|
190
|
+
* mask the size of the pane (`EDGE_BATCH`). One edge is still one path,
|
|
191
|
+
* however many pieces a pass cut it into: a step edge that doubles back
|
|
192
|
+
* along its own line adds its two legs' coverage in one path and lays one
|
|
193
|
+
* over the other in two, and a pass that drew the pieces apart drew the
|
|
194
|
+
* shared line lighter at its edges than a repaint did. A dashed edge's
|
|
195
|
+
* pieces are the exception — each picks its pattern up where it starts, and
|
|
196
|
+
* a dash offset is the context's, not a subpath's.
|
|
197
|
+
*/
|
|
198
|
+
function paintEdgesInOrder(
|
|
199
|
+
painter: FlowPainter,
|
|
200
|
+
edges: readonly SceneEdge[],
|
|
201
|
+
): void {
|
|
202
|
+
for (const edge of edges) {
|
|
203
|
+
const runs = runsOf(edge);
|
|
204
|
+
const pen = {
|
|
205
|
+
stroke: edge.stroke,
|
|
206
|
+
lineWidth: edge.lineWidth,
|
|
207
|
+
dash: edge.dash,
|
|
208
|
+
dashOffset: edge.dashOffset,
|
|
209
|
+
};
|
|
210
|
+
if (edge.dash && edge.runStarts) {
|
|
211
|
+
for (let i = 0; i < runs.length; i++) {
|
|
212
|
+
if (runs[i].length < 2) continue;
|
|
213
|
+
painter.polyline(runs[i], {
|
|
214
|
+
...pen,
|
|
215
|
+
dashOffset: edge.dashOffset + (edge.runStarts[i] ?? 0),
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
} else if (runs.length === 1) {
|
|
219
|
+
painter.polyline(runs[0], pen);
|
|
220
|
+
} else {
|
|
221
|
+
painter.strokeRuns(runs, pen);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
for (const edge of edges) {
|
|
225
|
+
for (const marker of edge.markers) {
|
|
226
|
+
if (marker.filled) {
|
|
227
|
+
painter.polygon(marker.points, { fill: marker.color });
|
|
228
|
+
} else {
|
|
229
|
+
painter.strokeRuns([marker.points], {
|
|
230
|
+
stroke: marker.color,
|
|
231
|
+
lineWidth: marker.lineWidth,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function paintInk(
|
|
239
|
+
painter: FlowPainter,
|
|
240
|
+
ink: readonly (SceneText | SceneRule)[],
|
|
241
|
+
): void {
|
|
242
|
+
for (const item of ink) {
|
|
243
|
+
if (item.kind === 'text') paintText(painter, item);
|
|
244
|
+
else {
|
|
245
|
+
painter.strokeRuns([item.points], {
|
|
246
|
+
stroke: item.color,
|
|
247
|
+
lineWidth: item.lineWidth,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/** One node — card, ink, handles, grips — as the scene paints it; the
|
|
254
|
+
* scene is read for its zoom and palette only. */
|
|
255
|
+
export function paintNodeItem(
|
|
256
|
+
painter: FlowPainter,
|
|
257
|
+
item: SceneNodeItem,
|
|
258
|
+
scene: Pick<FlowScene, 'viewport' | 'palette'>,
|
|
259
|
+
): void {
|
|
260
|
+
paintNode(painter, item, scene as FlowScene);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function paintNode(
|
|
264
|
+
painter: FlowPainter,
|
|
265
|
+
item: SceneNodeItem,
|
|
266
|
+
scene: FlowScene,
|
|
267
|
+
): void {
|
|
268
|
+
if (item.custom) {
|
|
269
|
+
// Never batched: a type that draws its own body is drawing whatever it
|
|
270
|
+
// likes, in an order only it knows.
|
|
271
|
+
item.custom.type.paint!({
|
|
272
|
+
node: item.custom.node,
|
|
273
|
+
rect: item.rect,
|
|
274
|
+
zoom: scene.viewport.zoom,
|
|
275
|
+
selected: item.selected,
|
|
276
|
+
hovered: item.hovered,
|
|
277
|
+
palette: scene.palette,
|
|
278
|
+
painter,
|
|
279
|
+
handles: item.custom.anchors,
|
|
280
|
+
});
|
|
281
|
+
} else if (item.card) {
|
|
282
|
+
paintRect(painter, item.card.shape);
|
|
283
|
+
if (item.card.accent) paintRect(painter, item.card.accent);
|
|
284
|
+
paintInk(painter, item.ink);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Handles are drawn one disc at a time, and that is the measured answer
|
|
288
|
+
// rather than the obvious one. Batching them into a single path halved the
|
|
289
|
+
// requests and made the frame *slower*: a path's mask is its bounding box,
|
|
290
|
+
// so forty dots scattered across the pane rasterize to a paneful of mask —
|
|
291
|
+
// three quarters of a megabyte — where forty small ones cost a kilobyte
|
|
292
|
+
// each. Batching pays for the edges because an edge already spans that
|
|
293
|
+
// box; it does not pay for anything small and scattered.
|
|
294
|
+
for (const handle of item.handles) {
|
|
295
|
+
painter.circle(handle.at.x, handle.at.y, handle.radius, {
|
|
296
|
+
fill: handle.fill,
|
|
297
|
+
stroke: handle.stroke,
|
|
298
|
+
lineWidth: handle.lineWidth,
|
|
299
|
+
});
|
|
300
|
+
if (handle.label) paintText(painter, handle.label);
|
|
301
|
+
}
|
|
302
|
+
for (const grip of item.grips) paintRect(painter, grip);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/** The runs a grid variant is made of, when there is no faster path.
|
|
306
|
+
* `mark` is a mark's size on screen — the scene's is in graph units. */
|
|
307
|
+
function gridRuns(
|
|
308
|
+
grid: SceneGrid,
|
|
309
|
+
mark: number,
|
|
310
|
+
): {
|
|
311
|
+
runs: XYPosition[][];
|
|
312
|
+
dots: XYPosition[];
|
|
313
|
+
} {
|
|
314
|
+
const { step, origin, region: r, variant } = grid;
|
|
315
|
+
// Alignment stays anchored to the viewport origin, so the region never
|
|
316
|
+
// changes where a dot falls.
|
|
317
|
+
const firstX = origin.x + Math.ceil((r.x - origin.x) / step) * step;
|
|
318
|
+
const firstY = origin.y + Math.ceil((r.y - origin.y) / step) * step;
|
|
319
|
+
const runs: XYPosition[][] = [];
|
|
320
|
+
const dots: XYPosition[] = [];
|
|
321
|
+
|
|
322
|
+
if (variant === 'lines') {
|
|
323
|
+
for (let gx = firstX; gx <= r.x + r.width; gx += step) {
|
|
324
|
+
runs.push([
|
|
325
|
+
{ x: gx, y: r.y },
|
|
326
|
+
{ x: gx, y: r.y + r.height },
|
|
327
|
+
]);
|
|
328
|
+
}
|
|
329
|
+
for (let gy = firstY; gy <= r.y + r.height; gy += step) {
|
|
330
|
+
runs.push([
|
|
331
|
+
{ x: r.x, y: gy },
|
|
332
|
+
{ x: r.x + r.width, y: gy },
|
|
333
|
+
]);
|
|
334
|
+
}
|
|
335
|
+
return { runs, dots };
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (variant === 'cross') {
|
|
339
|
+
const arm = Math.max(2, mark * 3);
|
|
340
|
+
for (let gx = firstX; gx <= r.x + r.width; gx += step) {
|
|
341
|
+
for (let gy = firstY; gy <= r.y + r.height; gy += step) {
|
|
342
|
+
runs.push([
|
|
343
|
+
{ x: gx - arm, y: gy },
|
|
344
|
+
{ x: gx + arm, y: gy },
|
|
345
|
+
]);
|
|
346
|
+
runs.push([
|
|
347
|
+
{ x: gx, y: gy - arm },
|
|
348
|
+
{ x: gx, y: gy + arm },
|
|
349
|
+
]);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return { runs, dots };
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
for (let gx = firstX; gx <= r.x + r.width; gx += step) {
|
|
356
|
+
for (let gy = firstY; gy <= r.y + r.height; gy += step) {
|
|
357
|
+
dots.push({ x: gx, y: gy });
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return { runs, dots };
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/** The grid, the slow and universal way. A mark's size arrives in graph
|
|
364
|
+
* units, so it is sized against the same zoom the pitch was. */
|
|
365
|
+
export function paintGrid(
|
|
366
|
+
painter: FlowPainter,
|
|
367
|
+
grid: SceneGrid,
|
|
368
|
+
zoom: number,
|
|
369
|
+
): void {
|
|
370
|
+
const { runs, dots } = gridRuns(grid, grid.size * zoom);
|
|
371
|
+
if (runs.length > 0) {
|
|
372
|
+
painter.strokeRuns(runs, { stroke: grid.color, lineWidth: 1 });
|
|
373
|
+
}
|
|
374
|
+
if (dots.length > 0) {
|
|
375
|
+
painter.dots(
|
|
376
|
+
dots,
|
|
377
|
+
Math.max(1, Math.round(grid.size * 2 * zoom)),
|
|
378
|
+
grid.color,
|
|
379
|
+
);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Draw a scene.
|
|
385
|
+
*
|
|
386
|
+
* `grid` is the element's accelerated grid painter, if it has one: it
|
|
387
|
+
* answers false when it could not, and the runs path takes over.
|
|
388
|
+
*/
|
|
389
|
+
export function paintScene(
|
|
390
|
+
painter: FlowPainter,
|
|
391
|
+
scene: FlowScene,
|
|
392
|
+
grid?: GridPainter,
|
|
393
|
+
): void {
|
|
394
|
+
if (!scene.region) return;
|
|
395
|
+
paintGround(painter, scene, grid);
|
|
396
|
+
paintGraph(painter, scene);
|
|
397
|
+
paintFloat(painter, scene);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/** Under the graph, pinned to the pane: the background and the grid. */
|
|
401
|
+
export function paintGround(
|
|
402
|
+
painter: FlowPainter,
|
|
403
|
+
scene: FlowScene,
|
|
404
|
+
grid?: GridPainter,
|
|
405
|
+
): void {
|
|
406
|
+
if (scene.background) paintRect(painter, scene.background);
|
|
407
|
+
if (scene.grid && !(grid?.(painter, scene.grid) ?? false)) {
|
|
408
|
+
paintGrid(painter, scene.grid, scene.viewport.zoom);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/** The graph: edges, nodes, and the line a connection gesture draws. What
|
|
413
|
+
* a 2D zoom gesture composites scaled from one paint of it. */
|
|
414
|
+
export function paintGraph(painter: FlowPainter, scene: FlowScene): void {
|
|
415
|
+
paintGraphEdges(painter, scene);
|
|
416
|
+
paintGraphNodes(painter, scene);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/** The graph's edges alone: the first half of `paintGraph`, which a drag's
|
|
420
|
+
* pictures take apart so the dragged node's edges go between them. */
|
|
421
|
+
export function paintGraphEdges(painter: FlowPainter, scene: FlowScene): void {
|
|
422
|
+
paintEdges(painter, scene.edges, scene.batch);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/** The graph's nodes, and the connection line over them: the second half. */
|
|
426
|
+
export function paintGraphNodes(painter: FlowPainter, scene: FlowScene): void {
|
|
427
|
+
for (const item of scene.nodes) paintNode(painter, item, scene);
|
|
428
|
+
if (scene.connection) {
|
|
429
|
+
painter.polyline(scene.connection.points, {
|
|
430
|
+
stroke: scene.connection.stroke,
|
|
431
|
+
lineWidth: scene.connection.lineWidth,
|
|
432
|
+
dash: scene.connection.dash,
|
|
433
|
+
});
|
|
434
|
+
const tip = scene.connection.tip;
|
|
435
|
+
painter.circle(tip.at.x, tip.at.y, tip.radius, { fill: tip.fill });
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/** Over the graph, pinned to the pane: the selection box and the panels. */
|
|
440
|
+
export function paintFloat(painter: FlowPainter, scene: FlowScene): void {
|
|
441
|
+
if (scene.selection) paintRect(painter, scene.selection);
|
|
442
|
+
paintPanels(painter, scene);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/** The panels that float over the graph — the minimap and the controls —
|
|
446
|
+
* alone: the last of a scene's paint, and what `<Flow>` paints on its own
|
|
447
|
+
* canvases over mounted bodies (`FlowGraphNode.paintPanels`). */
|
|
448
|
+
export function paintPanels(
|
|
449
|
+
painter: FlowPainter,
|
|
450
|
+
scene: Pick<FlowScene, 'miniMap' | 'controls'>,
|
|
451
|
+
): void {
|
|
452
|
+
if (scene.miniMap) {
|
|
453
|
+
const map = scene.miniMap;
|
|
454
|
+
paintRect(painter, map.panel);
|
|
455
|
+
painter.save();
|
|
456
|
+
painter.clipRect(
|
|
457
|
+
map.panel.rect.x,
|
|
458
|
+
map.panel.rect.y,
|
|
459
|
+
map.panel.rect.width,
|
|
460
|
+
map.panel.rect.height,
|
|
461
|
+
4,
|
|
462
|
+
);
|
|
463
|
+
// A run of square, unstroked nodes of one colour is one path and one
|
|
464
|
+
// fill — every node of a graph's minimap is usually one run, and a call
|
|
465
|
+
// apiece was 400 of them on every repaint of a drag. The scene says
|
|
466
|
+
// which run a node is in, worked out over the whole graph, so a pass
|
|
467
|
+
// that kept a few of a run fills them as the whole run's path does.
|
|
468
|
+
const nodes = map.nodes;
|
|
469
|
+
for (let i = 0; i < nodes.length;) {
|
|
470
|
+
const first = nodes[i];
|
|
471
|
+
let end = i + 1;
|
|
472
|
+
while (end < nodes.length && nodes[end].run === first.run) end++;
|
|
473
|
+
if (first.batched) {
|
|
474
|
+
const shapes: XYPosition[][] = [];
|
|
475
|
+
for (let k = i; k < end; k++) {
|
|
476
|
+
const { x, y, width, height } = nodes[k].rect;
|
|
477
|
+
shapes.push([
|
|
478
|
+
{ x, y },
|
|
479
|
+
{ x: x + width, y },
|
|
480
|
+
{ x: x + width, y: y + height },
|
|
481
|
+
{ x, y: y + height },
|
|
482
|
+
]);
|
|
483
|
+
}
|
|
484
|
+
painter.polygons(shapes, { fill: first.fill });
|
|
485
|
+
} else {
|
|
486
|
+
paintRect(painter, first);
|
|
487
|
+
}
|
|
488
|
+
i = end;
|
|
489
|
+
}
|
|
490
|
+
paintRect(painter, map.view);
|
|
491
|
+
painter.restore();
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
if (scene.controls) {
|
|
495
|
+
paintRect(painter, scene.controls.panel);
|
|
496
|
+
for (const rule of scene.controls.rules) {
|
|
497
|
+
painter.strokeRuns([rule.points], {
|
|
498
|
+
stroke: rule.color,
|
|
499
|
+
lineWidth: rule.lineWidth,
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
// One path per button rather than one for the panel: a button's marks
|
|
503
|
+
// share a tiny mask, and the panel's would span every button.
|
|
504
|
+
for (const glyph of scene.controls.glyphs) {
|
|
505
|
+
painter.strokeRuns(glyph.runs, {
|
|
506
|
+
stroke: glyph.color,
|
|
507
|
+
lineWidth: glyph.lineWidth,
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
}
|
package/src/flow/paths.ts
CHANGED
|
@@ -5,8 +5,11 @@
|
|
|
5
5
|
// representation means one implementation of each rather than four;
|
|
6
6
|
// - ntk's `bezierCurveTo` flattens to segments anyway, so sampling costs
|
|
7
7
|
// nothing a curve was not already paying;
|
|
8
|
-
// - the sample count comes off the on-screen
|
|
9
|
-
//
|
|
8
|
+
// - the sample count comes off the curve's on-screen **shape** (Wang's
|
|
9
|
+
// formula, `segmentsFor`): enough that no chord strays more than
|
|
10
|
+
// `tolerance` screen pixels from the true curve, so a curve is as smooth
|
|
11
|
+
// as the zoom can show and no smoother — a gentle one gets a few
|
|
12
|
+
// segments, a tight bend zoomed in gets hundreds.
|
|
10
13
|
//
|
|
11
14
|
// Everything here works in whatever space its inputs are in. The pane builds
|
|
12
15
|
// paths in **screen** space, so the pixel-shaped constants it passes in
|
|
@@ -31,6 +34,35 @@ export interface PathOptions {
|
|
|
31
34
|
/** Both ends are on the same node: route a loop rather than a line back
|
|
32
35
|
* on itself. */
|
|
33
36
|
loop?: boolean;
|
|
37
|
+
/** How far, in the endpoints' units, a chord may stray from the curve it
|
|
38
|
+
* stands for. {@link CURVE_TOLERANCE} when left out. */
|
|
39
|
+
tolerance?: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* A fifth of a screen pixel: under a device pixel at a display scale of 2,
|
|
44
|
+
* so a curve's chords are invisible at any zoom. The count was a fixed
|
|
45
|
+
* `clamp(length / 6, 8, 48)` before — 48 chords of 10–20 px each for a
|
|
46
|
+
* curve across a zoomed-in pane, and no more samples in a tight bend than
|
|
47
|
+
* along a straight run, which is what a faceted S-bend looked like.
|
|
48
|
+
*/
|
|
49
|
+
export const CURVE_TOLERANCE = 0.2;
|
|
50
|
+
|
|
51
|
+
/** Segments past this many are not worth their vertices whatever the
|
|
52
|
+
* formula says — a curve thousands of pixels long, most of it off screen. */
|
|
53
|
+
const MAX_SEGMENTS = 512;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Wang's formula: the fewest uniform-t segments that keep a degree-`degree`
|
|
57
|
+
* Bézier within `tolerance` of its chords. `m` is the largest second
|
|
58
|
+
* difference of the control points — how hard the curve bends, in the
|
|
59
|
+
* curve's own units — so it answers for shape and for zoom at once.
|
|
60
|
+
*/
|
|
61
|
+
function segmentsFor(m: number, degree: number, tolerance: number): number {
|
|
62
|
+
const n = Math.ceil(
|
|
63
|
+
Math.sqrt((degree * (degree - 1) * m) / (8 * Math.max(tolerance, 1e-3))),
|
|
64
|
+
);
|
|
65
|
+
return Math.max(1, Math.min(MAX_SEGMENTS, n));
|
|
34
66
|
}
|
|
35
67
|
|
|
36
68
|
const BEZIER_CURVATURE = 0.25;
|
|
@@ -94,6 +126,16 @@ function shoulder(distance: number, scale: number): number {
|
|
|
94
126
|
return BEZIER_CURVATURE * 25 * Math.sqrt(scale * -distance);
|
|
95
127
|
}
|
|
96
128
|
|
|
129
|
+
/** A `'bezier'` edge's two control points — the curve `edgePath` samples,
|
|
130
|
+
* exported so a test can hold the samples to the curve itself. */
|
|
131
|
+
export function bezierControls(
|
|
132
|
+
source: PathEnd,
|
|
133
|
+
target: PathEnd,
|
|
134
|
+
scale: number,
|
|
135
|
+
): [XYPosition, XYPosition] {
|
|
136
|
+
return [control(source, target, scale), control(target, source, scale)];
|
|
137
|
+
}
|
|
138
|
+
|
|
97
139
|
function control(end: PathEnd, other: XYPosition, scale: number): XYPosition {
|
|
98
140
|
switch (end.position) {
|
|
99
141
|
case 'left':
|
|
@@ -112,14 +154,13 @@ function sampleCubic(
|
|
|
112
154
|
c0: XYPosition,
|
|
113
155
|
c1: XYPosition,
|
|
114
156
|
p1: XYPosition,
|
|
157
|
+
tolerance: number,
|
|
115
158
|
): XYPosition[] {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
Math.hypot(p1.x - c1.x, p1.y - c1.y);
|
|
122
|
-
const steps = Math.max(8, Math.min(48, Math.round(rough / 6)));
|
|
159
|
+
const m = Math.max(
|
|
160
|
+
Math.hypot(p0.x - 2 * c0.x + c1.x, p0.y - 2 * c0.y + c1.y),
|
|
161
|
+
Math.hypot(c0.x - 2 * c1.x + p1.x, c0.y - 2 * c1.y + p1.y),
|
|
162
|
+
);
|
|
163
|
+
const steps = segmentsFor(m, 3, tolerance);
|
|
123
164
|
const points: XYPosition[] = [];
|
|
124
165
|
for (let i = 0; i <= steps; i++) {
|
|
125
166
|
const t = i / steps;
|
|
@@ -189,6 +230,7 @@ function stepPoints(
|
|
|
189
230
|
function roundCorners(
|
|
190
231
|
points: readonly XYPosition[],
|
|
191
232
|
radius: number,
|
|
233
|
+
tolerance: number,
|
|
192
234
|
): XYPosition[] {
|
|
193
235
|
if (points.length < 3 || radius <= 0) return points as XYPosition[];
|
|
194
236
|
const out: XYPosition[] = [points[0]];
|
|
@@ -213,7 +255,14 @@ function roundCorners(
|
|
|
213
255
|
x: corner.x + ((next.x - corner.x) / outLen) * r,
|
|
214
256
|
y: corner.y + ((next.y - corner.y) / outLen) * r,
|
|
215
257
|
};
|
|
216
|
-
|
|
258
|
+
const m = Math.hypot(
|
|
259
|
+
start.x - 2 * corner.x + end.x,
|
|
260
|
+
start.y - 2 * corner.y + end.y,
|
|
261
|
+
);
|
|
262
|
+
out.push(
|
|
263
|
+
start,
|
|
264
|
+
...sampleQuadratic(start, corner, end, segmentsFor(m, 2, tolerance)),
|
|
265
|
+
);
|
|
217
266
|
}
|
|
218
267
|
out.push(points[points.length - 1]);
|
|
219
268
|
return dedupe(out);
|
|
@@ -226,6 +275,7 @@ function loopPoints(
|
|
|
226
275
|
source: PathEnd,
|
|
227
276
|
target: PathEnd,
|
|
228
277
|
offset: number,
|
|
278
|
+
tolerance: number,
|
|
229
279
|
): XYPosition[] {
|
|
230
280
|
const sd = handleDirection(source.position);
|
|
231
281
|
const td = handleDirection(target.position);
|
|
@@ -238,7 +288,7 @@ function loopPoints(
|
|
|
238
288
|
x: target.x + td.x * reach + td.y * reach * 0.7,
|
|
239
289
|
y: target.y + td.y * reach - td.x * reach * 0.7,
|
|
240
290
|
};
|
|
241
|
-
return dedupe(sampleCubic(source, c0, c1, target));
|
|
291
|
+
return dedupe(sampleCubic(source, c0, c1, target, tolerance));
|
|
242
292
|
}
|
|
243
293
|
|
|
244
294
|
/** The polyline for one edge. */
|
|
@@ -248,7 +298,14 @@ export function edgePath(
|
|
|
248
298
|
target: PathEnd,
|
|
249
299
|
options: PathOptions,
|
|
250
300
|
): XYPosition[] {
|
|
251
|
-
if (options.loop)
|
|
301
|
+
if (options.loop) {
|
|
302
|
+
return loopPoints(
|
|
303
|
+
source,
|
|
304
|
+
target,
|
|
305
|
+
options.stepOffset,
|
|
306
|
+
options.tolerance ?? CURVE_TOLERANCE,
|
|
307
|
+
);
|
|
308
|
+
}
|
|
252
309
|
switch (type) {
|
|
253
310
|
case 'straight':
|
|
254
311
|
return dedupe([
|
|
@@ -261,11 +318,19 @@ export function edgePath(
|
|
|
261
318
|
return roundCorners(
|
|
262
319
|
stepPoints(source, target, options.stepOffset),
|
|
263
320
|
options.radius,
|
|
321
|
+
options.tolerance ?? CURVE_TOLERANCE,
|
|
264
322
|
);
|
|
265
323
|
default: {
|
|
266
|
-
const c0 =
|
|
267
|
-
|
|
268
|
-
|
|
324
|
+
const [c0, c1] = bezierControls(source, target, options.scale);
|
|
325
|
+
return dedupe(
|
|
326
|
+
sampleCubic(
|
|
327
|
+
source,
|
|
328
|
+
c0,
|
|
329
|
+
c1,
|
|
330
|
+
target,
|
|
331
|
+
options.tolerance ?? CURVE_TOLERANCE,
|
|
332
|
+
),
|
|
333
|
+
);
|
|
269
334
|
}
|
|
270
335
|
}
|
|
271
336
|
}
|