@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
package/dist/flow/index.js
CHANGED
|
@@ -14,11 +14,12 @@
|
|
|
14
14
|
// an app imports the component that needs it, so `sideEffects: false` stays
|
|
15
15
|
// honest. Do not move it into `../index.ts` (AGENTS.md, "Tree-shaking is a
|
|
16
16
|
// constraint").
|
|
17
|
-
import React, { useEffect, useImperativeHandle, useMemo, useRef, useState, } from 'react';
|
|
18
|
-
import { Renderer } from 'react-x11';
|
|
17
|
+
import React, { useEffect, useLayoutEffect, useImperativeHandle, useMemo, useRef, useState, } from 'react';
|
|
18
|
+
import { Renderer, useApp, useScale, useSupports, useTheme } from 'react-x11';
|
|
19
19
|
import { registerElement, registeredElements } from 'react-x11/host';
|
|
20
20
|
import { createStyles, flattenStyle } from 'react-x11/style';
|
|
21
|
-
import { applyEdgeChanges, applyNodeChanges } from './model.js';
|
|
21
|
+
import { applyEdgeChanges, applyNodeChanges, resolvePalette } from './model.js';
|
|
22
|
+
import { CULL_MARGIN } from './scene.js';
|
|
22
23
|
import { ELEMENT, FlowGraphNode, SELF_DAMAGED_PROPS } from './node.js';
|
|
23
24
|
if (!registeredElements().includes(ELEMENT)) {
|
|
24
25
|
registerElement(ELEMENT, {
|
|
@@ -49,6 +50,19 @@ const styles = createStyles({
|
|
|
49
50
|
pane: { flexGrow: 1, overflow: 'hidden' },
|
|
50
51
|
clip: { overflow: 'hidden' },
|
|
51
52
|
fill: { flexGrow: 1 },
|
|
53
|
+
// Over the pane, holding the bodies' layer and clipping it to the pane:
|
|
54
|
+
// a 2D pan carries the layer's pixels in its blit, and what the layer can
|
|
55
|
+
// paint outside the pane — in the border round it — would be repainted
|
|
56
|
+
// on every step (`_blitPan` in ./node.ts).
|
|
57
|
+
bodiesClip: {
|
|
58
|
+
position: 'absolute',
|
|
59
|
+
left: 0,
|
|
60
|
+
top: 0,
|
|
61
|
+
right: 0,
|
|
62
|
+
bottom: 0,
|
|
63
|
+
overflow: 'hidden',
|
|
64
|
+
pointerEvents: 'box-none',
|
|
65
|
+
},
|
|
52
66
|
});
|
|
53
67
|
/**
|
|
54
68
|
* Commit a state update before returning, whatever lane the surrounding
|
|
@@ -71,6 +85,132 @@ const flushSync = typeof Renderer
|
|
|
71
85
|
.flushSyncFromReconciler === 'function'
|
|
72
86
|
? (fn) => void Renderer.flushSyncFromReconciler(fn)
|
|
73
87
|
: (fn) => fn();
|
|
88
|
+
let glModule = null;
|
|
89
|
+
let glLoading = null;
|
|
90
|
+
/** Load the GL renderer, once per process however many panes ask. A failed
|
|
91
|
+
* load is forgotten, so the next pane to ask tries again. */
|
|
92
|
+
function loadGl() {
|
|
93
|
+
glLoading ??= import('./gl/index.js').then((module) => (glModule = module), (error) => {
|
|
94
|
+
glLoading = null;
|
|
95
|
+
throw error;
|
|
96
|
+
});
|
|
97
|
+
return glLoading;
|
|
98
|
+
}
|
|
99
|
+
/** How far a card's handles and grips ink outside its box — the canvas
|
|
100
|
+
* its card is painted on in the bodies' layer reaches that far round it. */
|
|
101
|
+
const CARD_INK = CULL_MARGIN;
|
|
102
|
+
/** The grid the bodies' layer grows to, in logical pixels. Every card is
|
|
103
|
+
* placed relative to the layer's corner, so a corner that followed the
|
|
104
|
+
* cards exactly moved — and moved every card with it — whenever the one
|
|
105
|
+
* being dragged was the outermost; grown to this grid it moves only when
|
|
106
|
+
* a card crosses a line of it. */
|
|
107
|
+
const EXTENT_STEP = 256;
|
|
108
|
+
/** A number per object, for a card's cache key: a style or a handle list
|
|
109
|
+
* that changed is a new object, and its card is painted again. */
|
|
110
|
+
const serials = new WeakMap();
|
|
111
|
+
let serial = 0;
|
|
112
|
+
function serialOf(node) {
|
|
113
|
+
let n = serials.get(node);
|
|
114
|
+
if (n === undefined)
|
|
115
|
+
serials.set(node, (n = ++serial));
|
|
116
|
+
return n;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* What of a node its card draws, for the card's cache key: the label, the
|
|
120
|
+
* description, the style and the handles. A body's own data — a queue
|
|
121
|
+
* length, a chart's points — is none of it: keyed on the node object, a
|
|
122
|
+
* live body that patched its data repainted its card on every patch, the
|
|
123
|
+
* title's text shaped and drawn again for nothing. A type that paints its
|
|
124
|
+
* own card may draw anything of the node, so it is keyed on the node whole.
|
|
125
|
+
*/
|
|
126
|
+
function cardShows(node, type) {
|
|
127
|
+
if (type.paint)
|
|
128
|
+
return `n${serialOf(node)}`;
|
|
129
|
+
const data = node.data;
|
|
130
|
+
const style = node.style ? serialOf(node.style) : 0;
|
|
131
|
+
const handles = node.handles ? serialOf(node.handles) : 0;
|
|
132
|
+
return (`${style}:${handles}:${String(data?.label ?? '')}` +
|
|
133
|
+
`\u0000${String(data?.description ?? '')}`);
|
|
134
|
+
}
|
|
135
|
+
/** Roles a press means something to — the body keeps those presses. */
|
|
136
|
+
const INTERACTIVE_ROLES = new Set([
|
|
137
|
+
'button',
|
|
138
|
+
'checkbox',
|
|
139
|
+
'radio',
|
|
140
|
+
'switch',
|
|
141
|
+
'slider',
|
|
142
|
+
'spinbutton',
|
|
143
|
+
'textbox',
|
|
144
|
+
'searchbox',
|
|
145
|
+
'combobox',
|
|
146
|
+
'listbox',
|
|
147
|
+
'option',
|
|
148
|
+
'menuitem',
|
|
149
|
+
'tab',
|
|
150
|
+
'link',
|
|
151
|
+
'scrollbar',
|
|
152
|
+
]);
|
|
153
|
+
/**
|
|
154
|
+
* Whether a press on `n` is the body's own: a control, something that
|
|
155
|
+
* listens for the press, something whose cursor says it can be clicked or
|
|
156
|
+
* typed into, or something that scrolls. Everything else in a body — its
|
|
157
|
+
* padding, a label, a progress bar — is the card, and a press there is the
|
|
158
|
+
* card's: it selects and drags the node, as it would on a card with no body.
|
|
159
|
+
*/
|
|
160
|
+
function interactive(n) {
|
|
161
|
+
const props = n.props ?? {};
|
|
162
|
+
if (typeof props.onMouseDown === 'function' ||
|
|
163
|
+
typeof props.onClick === 'function' ||
|
|
164
|
+
typeof props.onPress === 'function' ||
|
|
165
|
+
typeof props.onChange === 'function' ||
|
|
166
|
+
typeof props.onMouseUp === 'function') {
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
if (typeof props.role === 'string' && INTERACTIVE_ROLES.has(props.role)) {
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
if (typeof props.tabIndex === 'number' && props.tabIndex >= 0)
|
|
173
|
+
return true;
|
|
174
|
+
const cursor = n.style?.cursor;
|
|
175
|
+
if (cursor === 'pointer' || cursor === 'text')
|
|
176
|
+
return true;
|
|
177
|
+
if (n.kind === 'textinput' || n.kind === 'textarea')
|
|
178
|
+
return true;
|
|
179
|
+
return Boolean(n.canScroll?.(0, 1) || n.canScroll?.(1, 0));
|
|
180
|
+
}
|
|
181
|
+
/** The event as the pane reads it: its coordinates taken out of the unit of
|
|
182
|
+
* the body they landed in (`scale`, the zoom) and into the window's. */
|
|
183
|
+
function inPaneUnits(ev, sink) {
|
|
184
|
+
const ratio = (ev.target?.scale ?? 1) / (sink.scale || 1);
|
|
185
|
+
return Object.assign(Object.create(ev), {
|
|
186
|
+
x: ev.x * ratio,
|
|
187
|
+
y: ev.y * ratio,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* The same node, as far as its body can tell: every field but `position`.
|
|
192
|
+
*
|
|
193
|
+
* Identity is not the test. A drag — and every commit of a controlled graph
|
|
194
|
+
* — hands the pane a *new* node object each step with only its position
|
|
195
|
+
* changed, so comparing identity called `render` on every step of every
|
|
196
|
+
* drag: 60 renders with unchanged `data` in a 60-step drag, counted by
|
|
197
|
+
* `examples/flow-stress.tsx`. Any other field that changes — `data`,
|
|
198
|
+
* `selected`, `style`, a size — still re-renders, as it must.
|
|
199
|
+
*/
|
|
200
|
+
function sameButPosition(a, b) {
|
|
201
|
+
if (a === b)
|
|
202
|
+
return true;
|
|
203
|
+
const keys = Object.keys(a);
|
|
204
|
+
if (keys.length !== Object.keys(b).length)
|
|
205
|
+
return false;
|
|
206
|
+
for (const key of keys) {
|
|
207
|
+
if (key === 'position')
|
|
208
|
+
continue;
|
|
209
|
+
if (!Object.is(a[key], b[key]))
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
74
214
|
/**
|
|
75
215
|
* One mounted node body. Memoized so that a *move* re-renders nothing: a
|
|
76
216
|
* drag or a pan changes only the overlay box's `left`/`top` — the body's
|
|
@@ -95,11 +235,94 @@ const FlowNodeBody = React.memo(function FlowNodeBody(props) {
|
|
|
95
235
|
},
|
|
96
236
|
});
|
|
97
237
|
}, (a, b) => a.type === b.type &&
|
|
98
|
-
a.node
|
|
238
|
+
sameButPosition(a.node, b.node) &&
|
|
99
239
|
a.selected === b.selected &&
|
|
100
240
|
a.zoom === b.zoom &&
|
|
101
241
|
a.width === b.width &&
|
|
102
242
|
a.height === b.height);
|
|
243
|
+
/**
|
|
244
|
+
* One mounted node: its card, painted by the pane's own 2D painter
|
|
245
|
+
* (`FlowGraphNode.paintCard`), and its body over it. A component of its own
|
|
246
|
+
* so that React can skip it: every prop is a value or a reference that
|
|
247
|
+
* holds while the card does, and a drag re-renders the card that moved.
|
|
248
|
+
*/
|
|
249
|
+
const FlowBodyCard = React.memo(function FlowBodyCard(props) {
|
|
250
|
+
const { body, node, type } = props;
|
|
251
|
+
const { card } = body;
|
|
252
|
+
// The two boxes are two units. The outer one is the pane's: it is
|
|
253
|
+
// positioned and clipped in the same logical window pixels the pane
|
|
254
|
+
// painted the card in, so the body lands on the card exactly. The inner
|
|
255
|
+
// one is the body's, and `scale` is what makes the difference between
|
|
256
|
+
// them the zoom (react-x11#449, core 2.6): every length under it is
|
|
257
|
+
// multiplied by that factor, so a body sized in graph units comes out at
|
|
258
|
+
// the size the card is drawn at, with its text shaped at that size rather
|
|
259
|
+
// than stretched.
|
|
260
|
+
const width = body.width / body.zoom;
|
|
261
|
+
const height = body.height / body.zoom;
|
|
262
|
+
const bodyBox = React.createElement('box', {
|
|
263
|
+
key: 'body',
|
|
264
|
+
style: {
|
|
265
|
+
position: 'absolute',
|
|
266
|
+
left: body.x - card.x + CARD_INK,
|
|
267
|
+
top: body.y - card.y + CARD_INK,
|
|
268
|
+
width: body.width,
|
|
269
|
+
height: body.height,
|
|
270
|
+
// A body is free to overflow what it was given — a popup's
|
|
271
|
+
// fallback, a long line — and this is what stops it spilling over
|
|
272
|
+
// the graph.
|
|
273
|
+
overflow: 'hidden',
|
|
274
|
+
// Opaque, in the card's own fill: the card painted under it shows
|
|
275
|
+
// none of what a transparent body would let through.
|
|
276
|
+
backgroundColor: props.fill,
|
|
277
|
+
},
|
|
278
|
+
}, React.createElement('box', {
|
|
279
|
+
scale: body.zoom,
|
|
280
|
+
// Sized in the unit it establishes, which is what makes it fill the
|
|
281
|
+
// outer box at every zoom.
|
|
282
|
+
style: { width, height },
|
|
283
|
+
}, React.createElement(FlowNodeBody, {
|
|
284
|
+
type,
|
|
285
|
+
node,
|
|
286
|
+
selected: body.selected,
|
|
287
|
+
zoom: body.zoom,
|
|
288
|
+
// Graph units, like everything else the body sees.
|
|
289
|
+
x: body.x / body.zoom,
|
|
290
|
+
y: body.y / body.zoom,
|
|
291
|
+
width,
|
|
292
|
+
height,
|
|
293
|
+
})));
|
|
294
|
+
// The card, just under its body: the bodies share one layer over every
|
|
295
|
+
// card the graph draws, so without it a body covered the header, border
|
|
296
|
+
// and handles of any card over its own.
|
|
297
|
+
const cardCanvas = React.createElement('canvas', {
|
|
298
|
+
key: 'card',
|
|
299
|
+
style: {
|
|
300
|
+
position: 'absolute',
|
|
301
|
+
left: 0,
|
|
302
|
+
top: 0,
|
|
303
|
+
width: card.width + CARD_INK * 2,
|
|
304
|
+
height: card.height + CARD_INK * 2,
|
|
305
|
+
pointerEvents: 'none',
|
|
306
|
+
},
|
|
307
|
+
cacheKey: props.cacheKey,
|
|
308
|
+
onDraw: props.onDraw,
|
|
309
|
+
});
|
|
310
|
+
return React.createElement('box', {
|
|
311
|
+
style: {
|
|
312
|
+
position: 'absolute',
|
|
313
|
+
left: props.left + (props.offsetX ?? 0),
|
|
314
|
+
top: props.top + (props.offsetY ?? 0),
|
|
315
|
+
width: props.width,
|
|
316
|
+
height: props.height,
|
|
317
|
+
// the card's presses are the pane's; its body's are the body's
|
|
318
|
+
pointerEvents: 'box-none',
|
|
319
|
+
...(props.hidden === undefined
|
|
320
|
+
? null
|
|
321
|
+
: { display: props.hidden ? 'none' : 'flex' }),
|
|
322
|
+
},
|
|
323
|
+
...props.handlers,
|
|
324
|
+
}, cardCanvas, bodyBox);
|
|
325
|
+
});
|
|
103
326
|
/**
|
|
104
327
|
* A directed graph.
|
|
105
328
|
*
|
|
@@ -127,8 +350,11 @@ const FlowNodeBody = React.memo(function FlowNodeBody(props) {
|
|
|
127
350
|
* uncontrolled form, where the pane owns the arrays.
|
|
128
351
|
*/
|
|
129
352
|
export function Flow(props) {
|
|
130
|
-
const { nodes, defaultNodes, edges, defaultEdges, onNodesChange, onEdgesChange, onSelectionChange, onWheel, style, ref, ...rest } = props;
|
|
353
|
+
const { nodes, defaultNodes, edges, defaultEdges, onNodesChange, onEdgesChange, onSelectionChange, onWheel, style, ref, renderer, onFrame, onError, ...rest } = props;
|
|
131
354
|
const pane = useRef(null);
|
|
355
|
+
// whether the surface draws the graph, as of the last render — read by a
|
|
356
|
+
// layout effect declared before the surface is decided
|
|
357
|
+
const drawsGlRef = useRef(false);
|
|
132
358
|
const [ownNodes, setOwnNodes] = useState(() => defaultNodes ?? []);
|
|
133
359
|
const [ownEdges, setOwnEdges] = useState(() => defaultEdges ?? []);
|
|
134
360
|
const controlledNodes = nodes !== undefined;
|
|
@@ -155,12 +381,14 @@ export function Flow(props) {
|
|
|
155
381
|
// it: the ref attaches after the commit that created the node, and a
|
|
156
382
|
// handle built once must still work for the whole mount.
|
|
157
383
|
getViewport: () => pane.current?.getViewport() ?? { x: 0, y: 0, zoom: 1 },
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
384
|
+
// the ones that move the viewport, as calls through the handle
|
|
385
|
+
// (`FlowGraphNode.fromHandle`): their bodies commit with the pan
|
|
386
|
+
setViewport: (viewport) => pane.current?.fromHandle(() => pane.current?.setViewport(viewport)),
|
|
387
|
+
zoomIn: (step) => pane.current?.fromHandle(() => pane.current?.zoomIn(step)),
|
|
388
|
+
zoomOut: (step) => pane.current?.fromHandle(() => pane.current?.zoomOut(step)),
|
|
389
|
+
zoomTo: (zoom) => pane.current?.fromHandle(() => pane.current?.zoomTo(zoom)),
|
|
390
|
+
fitView: (options) => pane.current?.fromHandle(() => pane.current?.fitView(options)),
|
|
391
|
+
setCenter: (x, y, options) => pane.current?.fromHandle(() => pane.current?.setCenter(x, y, options)),
|
|
164
392
|
screenToFlowPosition: (point) => pane.current?.screenToFlowPosition(point) ?? point,
|
|
165
393
|
flowToScreenPosition: (point) => pane.current?.flowToScreenPosition(point) ?? point,
|
|
166
394
|
getNodeBounds: (id) => pane.current?.getNodeBounds(id) ?? null,
|
|
@@ -197,21 +425,53 @@ export function Flow(props) {
|
|
|
197
425
|
flat.flexBasis !== undefined;
|
|
198
426
|
// --- mounted node bodies ------------------------------------------------
|
|
199
427
|
//
|
|
200
|
-
// Only the
|
|
201
|
-
//
|
|
202
|
-
//
|
|
428
|
+
// Only the nodes whose type asked for one cost anything: with none in the
|
|
429
|
+
// graph the pane is never given `onNodeBodies`, never computes a rect, and
|
|
430
|
+
// this half of the component is one `useState` that stays empty. Asked of
|
|
431
|
+
// the nodes and not of the registry, because the registry is an app's
|
|
432
|
+
// whole vocabulary: a type with a body that no node uses is not a body,
|
|
433
|
+
// and it cost a graph of plain cards the GL surface on XQuartz (below) —
|
|
434
|
+
// the stress example registers its widget types for every scene, and its
|
|
435
|
+
// lattices drew in 2D there, a node dragged at 20 fps where GL drags it
|
|
436
|
+
// at 75. A scan per render of the nodes, a few microseconds at 2,000.
|
|
203
437
|
const { nodeTypes } = rest;
|
|
204
|
-
const
|
|
205
|
-
|
|
206
|
-
|
|
438
|
+
const bodyTypes = useMemo(() => {
|
|
439
|
+
if (!nodeTypes)
|
|
440
|
+
return null;
|
|
441
|
+
const names = Object.keys(nodeTypes).filter((name) => nodeTypes[name]?.render != null);
|
|
442
|
+
return names.length > 0 ? new Set(names) : null;
|
|
443
|
+
}, [nodeTypes]);
|
|
444
|
+
const mounts = useMemo(() => bodyTypes != null &&
|
|
445
|
+
currentNodes.some((node) => bodyTypes.has(node.type ?? 'default')), [bodyTypes, currentNodes]);
|
|
207
446
|
const [bodies, setBodies] = useState([]);
|
|
208
|
-
//
|
|
209
|
-
//
|
|
210
|
-
|
|
447
|
+
// Where the graph's origin sits in the pane. The bodies are laid out in
|
|
448
|
+
// one box placed here, so a pan — which moves this and nothing else — is
|
|
449
|
+
// one style change rather than a render of every body.
|
|
450
|
+
const [origin, setOrigin] = useState({ x: 0, y: 0 });
|
|
451
|
+
// Hidden while a zoom moves, and nothing else about them touched — see
|
|
452
|
+
// `_holdBodies` in ./node.ts for what re-scaling them every step cost.
|
|
453
|
+
const [held, setHeld] = useState(false);
|
|
454
|
+
// Where the minimap and controls are, painted over the bodies when there
|
|
455
|
+
// are any to be over.
|
|
456
|
+
const [panels, setPanels] = useState([]);
|
|
457
|
+
const panelCanvases = useRef([]);
|
|
458
|
+
// Gesture-time emissions commit inline (see `flushSync` above), and so do a
|
|
459
|
+
// handle's — a programmatic pan (`FlowGraphNode.fromHandle`). One made
|
|
460
|
+
// while React is already committing, a pan from a layout effect, is not
|
|
461
|
+
// flushed there: the reconciler runs it at sync priority as the commit
|
|
462
|
+
// ends. The rest — the first paint, what the pane's own frames emit — take
|
|
463
|
+
// the ordinary path.
|
|
464
|
+
const handleBodies = (next, sync, at, hold) => {
|
|
465
|
+
const apply = () => {
|
|
466
|
+
// the same array on a pan: React bails out of this update
|
|
467
|
+
setBodies(next);
|
|
468
|
+
setOrigin((was) => (was.x === at.x && was.y === at.y ? was : at));
|
|
469
|
+
setHeld(hold);
|
|
470
|
+
};
|
|
211
471
|
if (sync)
|
|
212
|
-
flushSync(
|
|
472
|
+
flushSync(apply);
|
|
213
473
|
else
|
|
214
|
-
|
|
474
|
+
apply();
|
|
215
475
|
};
|
|
216
476
|
const byId = useMemo(() => {
|
|
217
477
|
const map = new Map();
|
|
@@ -220,51 +480,336 @@ export function Flow(props) {
|
|
|
220
480
|
map.set(node.id, node);
|
|
221
481
|
return map;
|
|
222
482
|
}, [mounts, currentNodes]);
|
|
223
|
-
|
|
224
|
-
|
|
483
|
+
// Every box the bodies are laid out in sits on the device-pixel grid.
|
|
484
|
+
// Layout rounds a box's two edges to whole device pixels separately, so at
|
|
485
|
+
// a fractional scale (1.25, 1.5) a box that moved by a fraction of a
|
|
486
|
+
// device pixel also changed size by one — and core moves a `<glarea>`
|
|
487
|
+
// child's pixels on its pane only when it moved and nothing else
|
|
488
|
+
// (sidorares/react-x11#644): a pan over bodies repainted every one of
|
|
489
|
+
// them, every step. On the grid, a pan moves the layer by whole pixels
|
|
490
|
+
// and every card in it by exactly as many.
|
|
491
|
+
const rootScale = useScale();
|
|
492
|
+
// the pane's own, where it is mounted: a `scale` prop above it counts
|
|
493
|
+
const deviceScale = pane.current?.scale ?? rootScale;
|
|
494
|
+
const snap = (v) => Math.round(v * deviceScale) / deviceScale;
|
|
495
|
+
// The box the bodies are laid out in covers exactly them. It has to have a
|
|
496
|
+
// real size: core culls a child whose *own* box is off screen or outside
|
|
497
|
+
// a clipping ancestor before it looks at the child's subtree, and a 0×0
|
|
498
|
+
// box at the graph's origin is off screen whenever the graph has been
|
|
499
|
+
// panned past the pane's top-left — which took every body with it.
|
|
500
|
+
const extent = useMemo(() => {
|
|
501
|
+
if (bodies.length === 0)
|
|
502
|
+
return { x: 0, y: 0, width: 0, height: 0 };
|
|
503
|
+
let x0 = Infinity;
|
|
504
|
+
let y0 = Infinity;
|
|
505
|
+
let x1 = -Infinity;
|
|
506
|
+
let y1 = -Infinity;
|
|
507
|
+
for (const { card } of bodies) {
|
|
508
|
+
x0 = Math.min(x0, card.x - CARD_INK);
|
|
509
|
+
y0 = Math.min(y0, card.y - CARD_INK);
|
|
510
|
+
x1 = Math.max(x1, card.x + card.width + CARD_INK);
|
|
511
|
+
y1 = Math.max(y1, card.y + card.height + CARD_INK);
|
|
512
|
+
}
|
|
513
|
+
const out = (v, up) => snap((up ? Math.ceil : Math.floor)(v / EXTENT_STEP) * EXTENT_STEP);
|
|
514
|
+
x0 = out(x0, false);
|
|
515
|
+
y0 = out(y0, false);
|
|
516
|
+
x1 = out(x1, true);
|
|
517
|
+
y1 = out(y1, true);
|
|
518
|
+
return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };
|
|
519
|
+
}, [bodies, deviceScale]);
|
|
520
|
+
// The fill a card is drawn in, which its body's box takes too.
|
|
521
|
+
const theme = useTheme();
|
|
522
|
+
const nodeFill = resolvePalette(theme, rest.palette).nodeBackground;
|
|
523
|
+
// One `onDraw` per card for as long as what paints cards holds: core
|
|
524
|
+
// repaints a canvas whose `onDraw` is a new function (react-x11
|
|
525
|
+
// src/nodes/canvas.js), and a closure made per render made every step of
|
|
526
|
+
// a drag repaint every card on screen and every body over them — 36
|
|
527
|
+
// claims, past the frame's rect cap, one rect the size of the pane. What a
|
|
528
|
+
// card shows is in its `cacheKey`; the palette, the theme and the node
|
|
529
|
+
// types are what paint it, and a change to any of them starts over.
|
|
530
|
+
const cardPaint = useMemo(() => ({
|
|
531
|
+
drawers: new Map(),
|
|
532
|
+
}), [theme, rest.palette, nodeTypes]);
|
|
533
|
+
const drawCard = (id) => {
|
|
534
|
+
let draw = cardPaint.drawers.get(id);
|
|
535
|
+
if (!draw) {
|
|
536
|
+
draw = (ctx, info) => pane.current?.paintCard(id, ctx, info.node.abs);
|
|
537
|
+
cardPaint.drawers.set(id, draw);
|
|
538
|
+
}
|
|
539
|
+
return draw;
|
|
540
|
+
};
|
|
541
|
+
// One card per body, each a memoized component: a drag step moves one
|
|
542
|
+
// card and hands the others the same props they had — the same body
|
|
543
|
+
// object (`_emitBodies` reuses it), the same node object, the same
|
|
544
|
+
// `onDraw` — so React re-renders the card that moved and bails out of the
|
|
545
|
+
// rest. Built as one element list per render, which a pan does not
|
|
546
|
+
// trigger: the box they sit in moves, and nothing here is asked.
|
|
547
|
+
const cards = useMemo(() => {
|
|
548
|
+
if (!mounts)
|
|
549
|
+
return null;
|
|
550
|
+
const out = [];
|
|
551
|
+
for (const body of bodies) {
|
|
225
552
|
const node = byId.get(body.id);
|
|
226
553
|
const type = node && nodeTypes?.[node.type ?? 'default'];
|
|
227
554
|
if (!node || !type?.render)
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
//
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
// units comes out at the size the card is drawn at, with its text
|
|
236
|
-
// shaped at that size rather than stretched.
|
|
237
|
-
const width = body.width / body.zoom;
|
|
238
|
-
const height = body.height / body.zoom;
|
|
239
|
-
return React.createElement('box', {
|
|
240
|
-
key: body.id,
|
|
241
|
-
style: {
|
|
242
|
-
position: 'absolute',
|
|
243
|
-
left: body.x,
|
|
244
|
-
top: body.y,
|
|
245
|
-
width: body.width,
|
|
246
|
-
height: body.height,
|
|
247
|
-
// A body is free to overflow what it was given — a popup's
|
|
248
|
-
// fallback, a long line — and this is what stops it spilling
|
|
249
|
-
// over the graph.
|
|
250
|
-
overflow: 'hidden',
|
|
251
|
-
},
|
|
252
|
-
}, React.createElement('box', {
|
|
253
|
-
scale: body.zoom,
|
|
254
|
-
// Sized in the unit it establishes, which is what makes it
|
|
255
|
-
// fill the outer box at every zoom.
|
|
256
|
-
style: { width, height },
|
|
257
|
-
}, React.createElement(FlowNodeBody, {
|
|
258
|
-
type: type,
|
|
555
|
+
continue;
|
|
556
|
+
const { card } = body;
|
|
557
|
+
// on the grid, like the layer (`snap` above)
|
|
558
|
+
const left = snap(card.x - CARD_INK);
|
|
559
|
+
const top = snap(card.y - CARD_INK);
|
|
560
|
+
out.push({
|
|
561
|
+
body,
|
|
259
562
|
node: node,
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
563
|
+
type: type,
|
|
564
|
+
left: left - extent.x,
|
|
565
|
+
top: top - extent.y,
|
|
566
|
+
// Sized from the card alone, not as the gap between two edges each
|
|
567
|
+
// put on the grid: at 1.25x a card dragged a fraction of a pixel
|
|
568
|
+
// grew or shrank by one as its edges rounded apart, and a box that
|
|
569
|
+
// changed size is no longer a box that only moved — every step of
|
|
570
|
+
// a drag measured the content floors and repainted the card where
|
|
571
|
+
// core would have moved it. The box draws nothing and takes no
|
|
572
|
+
// pointer; the canvas and the body inside it keep sizes of their
|
|
573
|
+
// own.
|
|
574
|
+
width: snap(card.width + CARD_INK * 2),
|
|
575
|
+
height: snap(card.height + CARD_INK * 2),
|
|
576
|
+
fill: node.style?.background ??
|
|
577
|
+
nodeFill,
|
|
578
|
+
// Cached until something it shows changes (`cardShows`): a new
|
|
579
|
+
// label or style repaints it, a body's own data does not.
|
|
580
|
+
cacheKey: `${body.id}:${cardShows(node, type)}:` +
|
|
581
|
+
`${card.width}x${card.height}:` +
|
|
582
|
+
`${body.zoom}:${body.selected}:${body.hovered}:` +
|
|
583
|
+
`${serialOf(cardPaint)}`,
|
|
584
|
+
onDraw: drawCard(body.id),
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
return out;
|
|
588
|
+
}, [
|
|
589
|
+
mounts,
|
|
590
|
+
bodies,
|
|
591
|
+
extent,
|
|
592
|
+
byId,
|
|
593
|
+
nodeTypes,
|
|
594
|
+
nodeFill,
|
|
595
|
+
deviceScale,
|
|
596
|
+
cardPaint,
|
|
597
|
+
]);
|
|
598
|
+
const overlays = cards?.map((props) => React.createElement(FlowBodyCard, { key: props.body.id, ...props }));
|
|
599
|
+
// A wheel over a body is a wheel over the graph. Core runs the wheel's
|
|
600
|
+
// default action on the node under the pointer and scrolls up from there,
|
|
601
|
+
// and the bodies are the pane's siblings, not its children — so over a
|
|
602
|
+
// card's body the pane never heard it, and zooming a graph whose cards
|
|
603
|
+
// are mostly bodies stalled wherever the pointer rested. Forwarded unless
|
|
604
|
+
// something between the pointer and the pane can scroll that way itself:
|
|
605
|
+
// a list inside a card keeps its wheel.
|
|
606
|
+
const forwardWheel = useMemo(() => (ev) => {
|
|
607
|
+
const node = pane.current;
|
|
608
|
+
const wheel = ev;
|
|
609
|
+
if (!node || wheel.defaultPrevented)
|
|
610
|
+
return;
|
|
611
|
+
const stop = node.parent;
|
|
612
|
+
for (let n = wheel.target; n && n !== stop; n = n.parent) {
|
|
613
|
+
if (n.canScroll?.(wheel.deltaX, wheel.deltaY))
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
616
|
+
node.defaultWheel(inPaneUnits(wheel, node));
|
|
617
|
+
wheel.preventDefault();
|
|
618
|
+
}, []);
|
|
619
|
+
// A press on a body's card-like part is a press on the card. Core runs a
|
|
620
|
+
// press's default actions — select, drag, and the drag's steps and
|
|
621
|
+
// release — on the node that took it, so a body took them all: the cards
|
|
622
|
+
// of a graph whose nodes are mostly body could not be selected or dragged
|
|
623
|
+
// by most of their area. A press that bubbles up here from something that
|
|
624
|
+
// is not a control is the pane's instead: its default is vetoed on the
|
|
625
|
+
// body, the pointer captured so the drag and the release come back here
|
|
626
|
+
// wherever they wander, and each step handed to the pane.
|
|
627
|
+
const pressing = useRef(false);
|
|
628
|
+
const forwardPress = useMemo(() => {
|
|
629
|
+
// From the pressed node up to the bodies' box — which listens for the
|
|
630
|
+
// press itself, and is where the walk stops.
|
|
631
|
+
const within = (ev, sink) => {
|
|
632
|
+
for (let n = ev.target; n && n !== sink.parent; n = n.parent) {
|
|
633
|
+
if (n.props?.onMouseDown === handlers.onMouseDown)
|
|
634
|
+
return true;
|
|
635
|
+
if (interactive(n))
|
|
636
|
+
return false;
|
|
637
|
+
}
|
|
638
|
+
return true;
|
|
639
|
+
};
|
|
640
|
+
const handlers = {
|
|
641
|
+
onMouseDown: (ev) => {
|
|
642
|
+
const press = ev;
|
|
643
|
+
const sink = pane.current;
|
|
644
|
+
if (!sink || press.defaultPrevented || (press.button ?? 1) !== 1)
|
|
645
|
+
return;
|
|
646
|
+
if (!within(press, sink))
|
|
647
|
+
return;
|
|
648
|
+
pressing.current = true;
|
|
649
|
+
press.preventDefault();
|
|
650
|
+
press.capturePointer?.();
|
|
651
|
+
sink.defaultMouseDown?.(inPaneUnits(press, sink));
|
|
652
|
+
},
|
|
653
|
+
onMouseMove: (ev) => {
|
|
654
|
+
if (!pressing.current)
|
|
655
|
+
return;
|
|
656
|
+
const sink = pane.current;
|
|
657
|
+
sink?.defaultMouseDrag?.(inPaneUnits(ev, sink));
|
|
658
|
+
},
|
|
659
|
+
onMouseUp: (ev) => {
|
|
660
|
+
if (!pressing.current)
|
|
661
|
+
return;
|
|
662
|
+
pressing.current = false;
|
|
663
|
+
const sink = pane.current;
|
|
664
|
+
sink?.defaultMouseUp?.(inPaneUnits(ev, sink));
|
|
665
|
+
},
|
|
666
|
+
};
|
|
667
|
+
return handlers;
|
|
668
|
+
}, []);
|
|
669
|
+
// what each card forwards on its own where it is the surface's child
|
|
670
|
+
const directHandlers = useMemo(() => ({ onWheel: forwardWheel, ...forwardPress }), [forwardWheel, forwardPress]);
|
|
671
|
+
const bodiesLayer = useRef(null);
|
|
672
|
+
const layer = overlays && overlays.length > 0
|
|
673
|
+
? React.createElement('box', {
|
|
674
|
+
key: 'bodies',
|
|
675
|
+
ref: bodiesLayer,
|
|
676
|
+
style: {
|
|
677
|
+
position: 'absolute',
|
|
678
|
+
left: snap(origin.x) + extent.x,
|
|
679
|
+
top: snap(origin.y) + extent.y,
|
|
680
|
+
width: extent.width,
|
|
681
|
+
height: extent.height,
|
|
682
|
+
// The box spans every body, the gaps between them and the
|
|
683
|
+
// cards' headers with them — taking the pointer itself, it ate
|
|
684
|
+
// every press in that span: no pan, no pane click, no selecting
|
|
685
|
+
// a node by its header. Its bodies take the pointer; it does not.
|
|
686
|
+
pointerEvents: 'box-none',
|
|
687
|
+
// held through a zoom gesture: see `_holdBodies` in ./node.ts
|
|
688
|
+
display: held ? 'none' : 'flex',
|
|
689
|
+
},
|
|
690
|
+
onWheel: forwardWheel,
|
|
691
|
+
...forwardPress,
|
|
692
|
+
}, overlays)
|
|
693
|
+
: null;
|
|
694
|
+
// The box a 2D pan carries along with the pane's pixels (`_blitPan`).
|
|
695
|
+
useLayoutEffect(() => {
|
|
696
|
+
pane.current?.setBodiesLayer(drawsGlRef.current ? null : bodiesLayer.current);
|
|
697
|
+
});
|
|
698
|
+
// The cards whose canvases are on screen, told to the pane once they are,
|
|
699
|
+
// so the 2D pane stops drawing them itself — and the empty set while
|
|
700
|
+
// bodies are held out of a zoom, when their cards are the pane's again.
|
|
701
|
+
// The GL world draws every card whatever this says (`_cardInLayer`).
|
|
702
|
+
useLayoutEffect(() => {
|
|
703
|
+
const shown = new Set();
|
|
704
|
+
if (mounts && !held)
|
|
705
|
+
for (const body of bodies)
|
|
706
|
+
shown.add(body.id);
|
|
707
|
+
pane.current?.setShownBodies(shown);
|
|
708
|
+
}, [mounts, held, bodies]);
|
|
709
|
+
// The minimap and the controls over the bodies: the bodies' layer is over
|
|
710
|
+
// the graph, so panels the graph drew went under any card that reached
|
|
711
|
+
// them. Painted by the pane (`paintPanels`) on canvases after the layer,
|
|
712
|
+
// which take no pointer — a press on a button is the pane's, as before.
|
|
713
|
+
const panelLayer = mounts && panels.length > 0
|
|
714
|
+
? panels.map((rect, i) => React.createElement('canvas', {
|
|
715
|
+
key: `panel-${i}`,
|
|
716
|
+
ref: (node) => {
|
|
717
|
+
panelCanvases.current[i] = node;
|
|
718
|
+
},
|
|
719
|
+
style: {
|
|
720
|
+
position: 'absolute',
|
|
721
|
+
left: rect.x,
|
|
722
|
+
top: rect.y,
|
|
723
|
+
width: rect.width,
|
|
724
|
+
height: rect.height,
|
|
725
|
+
pointerEvents: 'none',
|
|
726
|
+
},
|
|
727
|
+
onDraw: (ctx, info) => pane.current?.paintPanels(ctx, info.node.abs),
|
|
728
|
+
}))
|
|
729
|
+
: null;
|
|
730
|
+
useLayoutEffect(() => {
|
|
731
|
+
const live = panelCanvases.current
|
|
732
|
+
.slice(0, panelLayer?.length ?? 0)
|
|
733
|
+
.filter((c) => c != null);
|
|
734
|
+
pane.current?.setPanelCanvases(live);
|
|
735
|
+
}, [panelLayer?.length, panels]);
|
|
736
|
+
// On X11 a <glarea>'s children are not composited over its frame: each
|
|
737
|
+
// child gets an opaque child window, as big as the region it reaches,
|
|
738
|
+
// filled with the surface's clear colour (react-x11's src/gloverlay.js).
|
|
739
|
+
// The bodies' one box reaches every card and the gaps between them, so it
|
|
740
|
+
// became one window over the whole view: cards and bodies, and not one
|
|
741
|
+
// edge. There each card is the surface's child in its own right, placed
|
|
742
|
+
// at the origin itself, and a pane covers a card and nothing more. Where
|
|
743
|
+
// panes composite (Cocoa) the one box stays — a pan moves it alone.
|
|
744
|
+
const app = useApp();
|
|
745
|
+
const composited = typeof app?.createOverlayPane === 'function';
|
|
746
|
+
// …and on XQuartz not shown at all: the macOS window server composites
|
|
747
|
+
// every GL surface there above everything the X server draws, panes
|
|
748
|
+
// included. Core says so (`useSupports('glOverlay')` false, from the first
|
|
749
|
+
// render — sidorares/react-x11#653), and there a graph with nodes whose
|
|
750
|
+
// types mount bodies draws with the 2D renderer: for as long as it has
|
|
751
|
+
// one, not per zoom, so the surface does not come and go as bodies mount.
|
|
752
|
+
const overlaySupported = useSupports('glOverlay');
|
|
753
|
+
const cardsDirect = [];
|
|
754
|
+
if (cards && !composited) {
|
|
755
|
+
const offsetX = snap(origin.x) + extent.x;
|
|
756
|
+
const offsetY = snap(origin.y) + extent.y;
|
|
757
|
+
for (const props of cards) {
|
|
758
|
+
cardsDirect.push(React.createElement(FlowBodyCard, {
|
|
759
|
+
key: props.body.id,
|
|
760
|
+
...props,
|
|
761
|
+
offsetX,
|
|
762
|
+
offsetY,
|
|
763
|
+
hidden: held,
|
|
764
|
+
handlers: directHandlers,
|
|
765
|
+
}));
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
// --- the GL surface -----------------------------------------------------
|
|
769
|
+
//
|
|
770
|
+
// Loaded when it is asked for and not before — see `./gl/index.ts` for why
|
|
771
|
+
// the import is dynamic. Until it arrives, and for good once it has failed,
|
|
772
|
+
// the pane draws itself: `renderer` reaches the element only while a
|
|
773
|
+
// surface is there to draw, so there is never a frame with neither.
|
|
774
|
+
const wantGl = renderer === 'gl';
|
|
775
|
+
const [gl, setGl] = useState(glModule);
|
|
776
|
+
const [glFailed, setGlFailed] = useState(false);
|
|
777
|
+
const latestError = useRef(onError);
|
|
778
|
+
latestError.current = onError;
|
|
779
|
+
const failGl = useMemo(() => (error) => {
|
|
780
|
+
setGlFailed(true);
|
|
781
|
+
latestError.current?.(error);
|
|
782
|
+
}, []);
|
|
783
|
+
useEffect(() => {
|
|
784
|
+
if (!wantGl || gl || glFailed)
|
|
785
|
+
return;
|
|
786
|
+
let live = true;
|
|
787
|
+
loadGl().then((module) => {
|
|
788
|
+
if (live)
|
|
789
|
+
setGl(module);
|
|
790
|
+
}, (error) => {
|
|
791
|
+
if (live)
|
|
792
|
+
failGl(error instanceof Error ? error : new Error(String(error)));
|
|
793
|
+
});
|
|
794
|
+
return () => {
|
|
795
|
+
live = false;
|
|
796
|
+
};
|
|
797
|
+
}, [wantGl, gl, glFailed]);
|
|
798
|
+
const drawsGl = wantGl && gl != null && !glFailed && !(mounts && !overlaySupported);
|
|
799
|
+
drawsGlRef.current = drawsGl;
|
|
800
|
+
const surface = drawsGl
|
|
801
|
+
? React.createElement(gl.FlowGlSurface, {
|
|
802
|
+
key: 'gl',
|
|
803
|
+
pane,
|
|
804
|
+
clearColor: resolvePalette(theme, rest.palette).background,
|
|
805
|
+
onFrame: onFrame,
|
|
806
|
+
onError: failGl,
|
|
807
|
+
// A `<glarea>`'s children are drawn over its surface, so that is
|
|
808
|
+
// where the bodies go under GL — beside the pane, they would be
|
|
809
|
+
// under it.
|
|
810
|
+
children: composited
|
|
811
|
+
? [layer, panelLayer]
|
|
812
|
+
: [cardsDirect.length > 0 ? cardsDirect : null, panelLayer],
|
|
268
813
|
})
|
|
269
814
|
: null;
|
|
270
815
|
// The pane and the bodies are siblings rather than parent and children:
|
|
@@ -285,10 +830,20 @@ export function Flow(props) {
|
|
|
285
830
|
// `<flowgraph>` element zooms and hovers on its own.
|
|
286
831
|
onWheel,
|
|
287
832
|
onNodeBodies: mounts ? handleBodies : undefined,
|
|
833
|
+
onPanels: mounts ? setPanels : undefined,
|
|
834
|
+
renderer: drawsGl ? 'gl' : undefined,
|
|
835
|
+
// the element reports the 2D renderer's frames, the surface the GL
|
|
836
|
+
// one's — one callback either way
|
|
837
|
+
onFrame,
|
|
288
838
|
style: styles.fill,
|
|
289
839
|
role: 'group',
|
|
290
840
|
'aria-label': rest['aria-label'] ?? 'Flow graph',
|
|
291
|
-
}),
|
|
841
|
+
}),
|
|
842
|
+
// After the pane, so the surface covers exactly its box — and with the
|
|
843
|
+
// bodies inside it under GL, or beside the pane without.
|
|
844
|
+
surface, drawsGl || !layer
|
|
845
|
+
? null
|
|
846
|
+
: React.createElement('box', { key: 'bodies-clip', style: styles.bodiesClip }, layer), drawsGl ? null : panelLayer);
|
|
292
847
|
}
|
|
293
848
|
/**
|
|
294
849
|
* `useState` for nodes, with the change handler `<Flow>` wants already
|