@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/src/markdown/index.ts
CHANGED
|
@@ -10,8 +10,10 @@
|
|
|
10
10
|
// pipeline is remark → rehype → DOM with Tailwind classes — an HTML pass
|
|
11
11
|
// and a DOM renderer, neither of which exists here. What was worth taking
|
|
12
12
|
// was taken: its `remend` package's unterminated-markdown behaviour is
|
|
13
|
-
// implemented natively by `parse.ts`, as parser
|
|
14
|
-
// repair pre-pass (one pass instead of
|
|
13
|
+
// implemented natively by `src/internal/markdown/parse.ts`, as parser
|
|
14
|
+
// tolerance rather than a repair pre-pass (one pass instead of
|
|
15
|
+
// repair-then-reparse). The parser is shared with `<RichTextEditor>`, which
|
|
16
|
+
// reads and writes the same markdown this renders.
|
|
15
17
|
//
|
|
16
18
|
// So: `parse.ts` → AST → this file renders `<box>` structure with one
|
|
17
19
|
// `<richtext>` per run of inline text, inside one `selectable` root. During
|
|
@@ -51,7 +53,7 @@ import type {
|
|
|
51
53
|
InlineNode,
|
|
52
54
|
ListBlock,
|
|
53
55
|
TableBlock,
|
|
54
|
-
} from '
|
|
56
|
+
} from '../internal/markdown/ast.js';
|
|
55
57
|
import {
|
|
56
58
|
registerRichText,
|
|
57
59
|
RICHTEXT_ELEMENT,
|
|
@@ -67,14 +69,15 @@ import {
|
|
|
67
69
|
import type { CodeBlockLook } from '../codeblock/index.js';
|
|
68
70
|
import type { Language } from '../code-language/index.js';
|
|
69
71
|
|
|
70
|
-
import { parse } from '
|
|
72
|
+
import { parse } from '../internal/markdown/parse.js';
|
|
71
73
|
import { evaluator, resolveExpressions } from './expressions.js';
|
|
72
74
|
import type { Evaluate } from './expressions.js';
|
|
73
|
-
import { SPREAD_PREFIX } from '
|
|
75
|
+
import { SPREAD_PREFIX } from '../internal/markdown/ast.js';
|
|
74
76
|
import { runsOf, plainTextOf } from './spans.js';
|
|
75
77
|
import type { InlineStyles } from './spans.js';
|
|
76
78
|
import { useLinkClicks } from '../richtext/index.js';
|
|
77
79
|
import { hx } from './hx.js';
|
|
80
|
+
import { useFontPrewarm } from '../internal/prewarm.js';
|
|
78
81
|
|
|
79
82
|
export type {
|
|
80
83
|
AttributeValue,
|
|
@@ -85,11 +88,11 @@ export type {
|
|
|
85
88
|
InlineNode,
|
|
86
89
|
Document as MarkdownDocument,
|
|
87
90
|
ParseOptions,
|
|
88
|
-
} from '
|
|
89
|
-
export { SPREAD_PREFIX } from '
|
|
90
|
-
export { scanTag } from '
|
|
91
|
-
export type { ScannedTag, ScanResult } from '
|
|
92
|
-
export { parse, parseInline } from '
|
|
91
|
+
} from '../internal/markdown/ast.js';
|
|
92
|
+
export { SPREAD_PREFIX } from '../internal/markdown/ast.js';
|
|
93
|
+
export { scanTag } from '../internal/markdown/tags.js';
|
|
94
|
+
export type { ScannedTag, ScanResult } from '../internal/markdown/tags.js';
|
|
95
|
+
export { parse, parseInline } from '../internal/markdown/parse.js';
|
|
93
96
|
|
|
94
97
|
const h = React.createElement;
|
|
95
98
|
|
|
@@ -190,7 +193,8 @@ export interface MarkdownProps {
|
|
|
190
193
|
* usual case.
|
|
191
194
|
*
|
|
192
195
|
* Block position only: a tag on its own line(s) is a component, and one in
|
|
193
|
-
* the middle of a sentence is still text. See `ComponentInline` in
|
|
196
|
+
* the middle of a sentence is still text. See `ComponentInline` in
|
|
197
|
+
* src/internal/markdown/ast.ts.
|
|
194
198
|
*
|
|
195
199
|
* Give the map a stable identity — a new object per render defeats the
|
|
196
200
|
* block cache, the same way a new `fences` map does.
|
|
@@ -362,7 +366,12 @@ function renderBlocks(blocks: BlockNode[], ctx: RenderCtx): ReactNode[] {
|
|
|
362
366
|
return blocks.map((b, i) => renderBlock(b, ctx, i));
|
|
363
367
|
}
|
|
364
368
|
|
|
365
|
-
function renderBlock(
|
|
369
|
+
function renderBlock(
|
|
370
|
+
block: BlockNode,
|
|
371
|
+
ctx: RenderCtx,
|
|
372
|
+
key: number,
|
|
373
|
+
first = key === 0,
|
|
374
|
+
): ReactNode {
|
|
366
375
|
const look = ctx.look;
|
|
367
376
|
switch (block.type) {
|
|
368
377
|
case 'paragraph':
|
|
@@ -375,7 +384,7 @@ function renderBlock(block: BlockNode, ctx: RenderCtx, key: number): ReactNode {
|
|
|
375
384
|
weight: 700,
|
|
376
385
|
});
|
|
377
386
|
return richtext(key, runsOf(block.children, s), {
|
|
378
|
-
marginTop:
|
|
387
|
+
marginTop: first ? 0 : Math.round(look.blockGap * 0.6),
|
|
379
388
|
});
|
|
380
389
|
}
|
|
381
390
|
|
|
@@ -507,7 +516,7 @@ function renderCode(
|
|
|
507
516
|
flexDirection: 'column',
|
|
508
517
|
},
|
|
509
518
|
},
|
|
510
|
-
richtext('code', runs, codeTextStyle(code), false),
|
|
519
|
+
richtext('code', runs, codeTextStyle(code, false), false),
|
|
511
520
|
);
|
|
512
521
|
}
|
|
513
522
|
|
|
@@ -550,38 +559,46 @@ function renderList(list: ListBlock, ctx: RenderCtx, key: number): ReactNode {
|
|
|
550
559
|
),
|
|
551
560
|
);
|
|
552
561
|
} else {
|
|
562
|
+
// the text itself, sized as the column the box around it used to be:
|
|
563
|
+
// a list is a few boxes per item, and at 600 KB there were 1,582 of
|
|
564
|
+
// these for yoga to lay out and absolutize on every width change
|
|
553
565
|
marker = hx(
|
|
554
|
-
'
|
|
555
|
-
{
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
},
|
|
566
|
+
'text',
|
|
567
|
+
{
|
|
568
|
+
selectable: false,
|
|
569
|
+
style: {
|
|
570
|
+
flexShrink: 0,
|
|
571
|
+
width: markerWidth,
|
|
572
|
+
color: look.dim,
|
|
573
|
+
fontSize: look.inline.size,
|
|
574
|
+
fontFamily: look.inline.family,
|
|
564
575
|
},
|
|
565
|
-
|
|
566
|
-
|
|
576
|
+
},
|
|
577
|
+
list.ordered ? `${list.start + i}.` : '•',
|
|
567
578
|
);
|
|
568
579
|
}
|
|
580
|
+
const only = item.children.length === 1 ? item.children[0] : undefined;
|
|
569
581
|
return hx(
|
|
570
582
|
'box',
|
|
571
583
|
{ key: i, style: STYLES.itemRow },
|
|
572
584
|
marker,
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
+
// An item that is one paragraph — nearly every item — is the
|
|
586
|
+
// paragraph, taking the rest of the row; the column is for an item of
|
|
587
|
+
// several blocks, which needs the gap between them.
|
|
588
|
+
only?.type === 'paragraph'
|
|
589
|
+
? richtext(0, runsOf(only.children, look.inline), STYLES.itemText)
|
|
590
|
+
: hx(
|
|
591
|
+
'box',
|
|
592
|
+
{
|
|
593
|
+
style: {
|
|
594
|
+
...STYLES.column,
|
|
595
|
+
gap: Math.round(look.blockGap * 0.4),
|
|
596
|
+
flexGrow: 1,
|
|
597
|
+
flexShrink: 1,
|
|
598
|
+
},
|
|
599
|
+
},
|
|
600
|
+
...renderBlocks(item.children, ctx),
|
|
601
|
+
),
|
|
585
602
|
);
|
|
586
603
|
});
|
|
587
604
|
return hx('box', { key, style: { ...STYLES.column, gap } }, ...items);
|
|
@@ -595,6 +612,7 @@ function renderTable(
|
|
|
595
612
|
const look = ctx.look;
|
|
596
613
|
const size = look.inline.size;
|
|
597
614
|
const padX = Math.round(size * 0.6);
|
|
615
|
+
const padY = Math.round(size * 0.35);
|
|
598
616
|
const cols = table.align.length;
|
|
599
617
|
|
|
600
618
|
// Column widths: max-content per column, measured through the app's font
|
|
@@ -642,24 +660,19 @@ function renderTable(
|
|
|
642
660
|
borderTopColor: divided ? look.border : undefined,
|
|
643
661
|
},
|
|
644
662
|
},
|
|
663
|
+
// A cell is its text. The padding it needs is a margin: the cell has
|
|
664
|
+
// no background or border of its own — the row paints both — so the
|
|
665
|
+
// space around the text looks the same either way, and there is no
|
|
666
|
+
// box per cell for yoga to lay out.
|
|
645
667
|
...cells.map((cell, c) =>
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
paddingTop: Math.round(size * 0.35),
|
|
655
|
-
paddingBottom: Math.round(size * 0.35),
|
|
656
|
-
},
|
|
657
|
-
},
|
|
658
|
-
richtext('c', runsOf(cell, s), {
|
|
659
|
-
textAlign: table.align[c] ?? undefined,
|
|
660
|
-
flexGrow: 1,
|
|
661
|
-
}),
|
|
662
|
-
),
|
|
668
|
+
richtext(c, runsOf(cell, s), {
|
|
669
|
+
textAlign: table.align[c] ?? undefined,
|
|
670
|
+
width: widths[c] - padX * 2,
|
|
671
|
+
marginLeft: padX,
|
|
672
|
+
marginRight: padX,
|
|
673
|
+
marginTop: padY,
|
|
674
|
+
marginBottom: padY,
|
|
675
|
+
}),
|
|
663
676
|
),
|
|
664
677
|
);
|
|
665
678
|
|
|
@@ -693,14 +706,26 @@ function renderTable(
|
|
|
693
706
|
const STYLES = {
|
|
694
707
|
column: { flexDirection: 'column' },
|
|
695
708
|
itemRow: { flexDirection: 'row' },
|
|
709
|
+
itemText: { flexGrow: 1, flexShrink: 1 },
|
|
696
710
|
markerBox: { flexDirection: 'row', flexShrink: 0 },
|
|
697
711
|
} as const satisfies Record<string, Style>;
|
|
698
712
|
|
|
699
713
|
// --- the component ---------------------------------------------------------
|
|
700
714
|
|
|
715
|
+
/** What the last render made for one top-level block. */
|
|
716
|
+
interface RenderedBlock {
|
|
717
|
+
raw: string;
|
|
718
|
+
live: boolean;
|
|
719
|
+
first: boolean;
|
|
720
|
+
key: number;
|
|
721
|
+
element: ReactNode;
|
|
722
|
+
}
|
|
723
|
+
|
|
701
724
|
interface BlockCache {
|
|
702
725
|
epoch: string;
|
|
703
|
-
|
|
726
|
+
blocks: RenderedBlock[];
|
|
727
|
+
/** a key no block has had */
|
|
728
|
+
next: number;
|
|
704
729
|
}
|
|
705
730
|
|
|
706
731
|
/**
|
|
@@ -722,6 +747,14 @@ export function Markdown(props: MarkdownProps): ReactElement {
|
|
|
722
747
|
// same widening `hx.ts` documents for the `theme` prop.
|
|
723
748
|
const theme = useTheme() as unknown as Record<string, unknown>;
|
|
724
749
|
const app = useApp() as { fonts?: FontsMeasureLike } | null;
|
|
750
|
+
// a document with code in it sets that code in the mono family, and its
|
|
751
|
+
// render is the head start (a fence or a code span needs a backtick or a
|
|
752
|
+
// tilde fence; an indented block is rare enough to find its own way)
|
|
753
|
+
useFontPrewarm(
|
|
754
|
+
source.includes('`') || source.includes('~~~')
|
|
755
|
+
? (props.monoFamily ?? 'monospace')
|
|
756
|
+
: null,
|
|
757
|
+
);
|
|
725
758
|
|
|
726
759
|
const links = useLinkClicks(onLink);
|
|
727
760
|
const menu = useSelectionMenu(selectable);
|
|
@@ -757,12 +790,19 @@ export function Markdown(props: MarkdownProps): ReactElement {
|
|
|
757
790
|
[scope],
|
|
758
791
|
);
|
|
759
792
|
|
|
793
|
+
// The last parse, which the next one resumes from: an edit or a streamed
|
|
794
|
+
// chunk reads the blocks around the change, and a 600 KB document is not
|
|
795
|
+
// read again whole for one paragraph (ParseOptions.previous). Only ever a
|
|
796
|
+
// hint — a parse resumed from it answers what a parse from scratch would.
|
|
797
|
+
const lastParse = React.useRef<Document | null>(null);
|
|
760
798
|
const doc: Document = React.useMemo(() => {
|
|
761
799
|
const parsed = parse(source, {
|
|
762
800
|
partial,
|
|
763
801
|
...(isComponent ? { isComponent } : null),
|
|
764
802
|
...(evaluate ? { expressions: true } : null),
|
|
803
|
+
...(lastParse.current ? { previous: lastParse.current } : null),
|
|
765
804
|
});
|
|
805
|
+
lastParse.current = parsed;
|
|
766
806
|
// Expressions resolve to text here rather than during the render, so
|
|
767
807
|
// every `runsOf` caller downstream keeps seeing an inline tree it
|
|
768
808
|
// already understands. `raws` is carried through, so the block cache
|
|
@@ -771,10 +811,18 @@ export function Markdown(props: MarkdownProps): ReactElement {
|
|
|
771
811
|
return evaluate ? resolveExpressions(parsed, evaluate) : parsed;
|
|
772
812
|
}, [source, partial, isComponent, evaluate]);
|
|
773
813
|
|
|
774
|
-
// Per-block element cache
|
|
775
|
-
// is the live tail
|
|
776
|
-
//
|
|
777
|
-
//
|
|
814
|
+
// Per-block element cache: a block whose raw source is what it was (and
|
|
815
|
+
// is still the live tail, or not, and still first, or not) is the same
|
|
816
|
+
// ReactElement, so React bails out and the retained nodes keep their
|
|
817
|
+
// layout caches. Streaming appends re-render only the block that changed.
|
|
818
|
+
//
|
|
819
|
+
// Each block keeps its React key from one render to the next, found by
|
|
820
|
+
// lining the blocks up with the last render's from both ends: those the
|
|
821
|
+
// change left alone keep theirs, and the changed ones in the middle take
|
|
822
|
+
// the keys of the ones they replace, in order, so an edited paragraph is
|
|
823
|
+
// updated where it stands. Keyed by index, a paragraph inserted mid-way
|
|
824
|
+
// moved every block after it onto another block's key, and all of them
|
|
825
|
+
// were rendered and laid out again: a second, in a 600 KB document.
|
|
778
826
|
const cacheRef = React.useRef<BlockCache | null>(null);
|
|
779
827
|
const fonts = app?.fonts ?? null;
|
|
780
828
|
// Neither the fences map nor `resolveLanguage` can be part of a string
|
|
@@ -809,13 +857,35 @@ export function Markdown(props: MarkdownProps): ReactElement {
|
|
|
809
857
|
}
|
|
810
858
|
const epoch = `${look.key}|${fonts ? 'f' : '-'}|${seamsRef.current.gen}`;
|
|
811
859
|
if (!cacheRef.current || cacheRef.current.epoch !== epoch) {
|
|
812
|
-
|
|
860
|
+
// the keys carry over, so a new epoch updates each block in place
|
|
861
|
+
cacheRef.current = {
|
|
862
|
+
epoch,
|
|
863
|
+
blocks: (cacheRef.current?.blocks ?? []).map((b) => ({
|
|
864
|
+
...b,
|
|
865
|
+
element: undefined,
|
|
866
|
+
})),
|
|
867
|
+
next: cacheRef.current?.next ?? 0,
|
|
868
|
+
};
|
|
813
869
|
}
|
|
814
870
|
const cache = cacheRef.current;
|
|
815
871
|
|
|
816
872
|
const children: ReactNode[] = [];
|
|
817
873
|
{
|
|
818
|
-
const
|
|
874
|
+
const was = cache.blocks;
|
|
875
|
+
const n = doc.blocks.length;
|
|
876
|
+
let head = 0;
|
|
877
|
+
while (head < n && head < was.length && was[head].raw === doc.raws[head]) {
|
|
878
|
+
head += 1;
|
|
879
|
+
}
|
|
880
|
+
let tail = 0;
|
|
881
|
+
while (
|
|
882
|
+
tail < n - head &&
|
|
883
|
+
tail < was.length - head &&
|
|
884
|
+
was[was.length - 1 - tail].raw === doc.raws[n - 1 - tail]
|
|
885
|
+
) {
|
|
886
|
+
tail += 1;
|
|
887
|
+
}
|
|
888
|
+
const kept: RenderedBlock[] = [];
|
|
819
889
|
const ctx: RenderCtx = {
|
|
820
890
|
look,
|
|
821
891
|
fonts,
|
|
@@ -824,24 +894,39 @@ export function Markdown(props: MarkdownProps): ReactElement {
|
|
|
824
894
|
components: props.components,
|
|
825
895
|
...(evaluate ? { evaluate } : null),
|
|
826
896
|
};
|
|
827
|
-
for (let i = 0; i <
|
|
828
|
-
const
|
|
829
|
-
const
|
|
830
|
-
const
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
897
|
+
for (let i = 0; i < n; i += 1) {
|
|
898
|
+
const raw = doc.raws[i];
|
|
899
|
+
const live = partial && i === n - 1;
|
|
900
|
+
const first = i === 0;
|
|
901
|
+
// the block this one stands for in the last render, if any
|
|
902
|
+
const before =
|
|
903
|
+
i < head
|
|
904
|
+
? was[i]
|
|
905
|
+
: i >= n - tail
|
|
906
|
+
? was[was.length - n + i]
|
|
907
|
+
: i < was.length - tail
|
|
908
|
+
? was[i]
|
|
909
|
+
: undefined;
|
|
910
|
+
const key = before ? before.key : cache.next++;
|
|
911
|
+
const element =
|
|
912
|
+
before &&
|
|
913
|
+
before.element !== undefined &&
|
|
914
|
+
before.raw === raw &&
|
|
915
|
+
before.live === live &&
|
|
916
|
+
before.first === first
|
|
917
|
+
? before.element
|
|
918
|
+
: renderBlock(
|
|
919
|
+
doc.blocks[i],
|
|
920
|
+
live ? { ...ctx, live } : ctx,
|
|
921
|
+
key,
|
|
922
|
+
first,
|
|
923
|
+
);
|
|
841
924
|
children.push(element);
|
|
842
|
-
|
|
925
|
+
kept.push({ raw, live, first, key, element });
|
|
843
926
|
}
|
|
844
|
-
|
|
927
|
+
// what the next render lines up against; the rest falls away with the
|
|
928
|
+
// text that made it
|
|
929
|
+
cache.blocks = kept;
|
|
845
930
|
}
|
|
846
931
|
|
|
847
932
|
const rootStyle: Style = {
|
package/src/markdown/spans.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Inline AST → the styled runs `<richtext>` renders. Pure: all the colour
|
|
2
2
|
// and font decisions arrive in `InlineStyles`, which `index.ts` derives
|
|
3
3
|
// from the theme once per render.
|
|
4
|
-
import type { InlineNode } from '
|
|
4
|
+
import type { InlineNode } from '../internal/markdown/ast.js';
|
|
5
5
|
import type { TextRun } from '../richtext/node.js';
|
|
6
6
|
|
|
7
7
|
/** The resolved look of inline text, for one block. */
|
|
@@ -88,6 +88,11 @@ function pushRun(
|
|
|
88
88
|
out: TextRun[],
|
|
89
89
|
): void {
|
|
90
90
|
if (text.length === 0) return;
|
|
91
|
+
// A tab in running text reads as a space, as HTML sets it, and each text
|
|
92
|
+
// engine draws U+0009 as whatever its font has for it: a box in ntk's
|
|
93
|
+
// fonts, CoreText's own stops 28 points apart. It is laid out as the
|
|
94
|
+
// space it reads as, the same length, so every offset holds.
|
|
95
|
+
if (text.includes('\t')) text = text.replace(/\t/g, ' ');
|
|
91
96
|
const inLink = st.href !== undefined;
|
|
92
97
|
const color = st.code ? s.codeColor : inLink ? s.linkColor : s.color;
|
|
93
98
|
const run: TextRun = {
|
|
@@ -32,12 +32,13 @@ import React, {
|
|
|
32
32
|
useState,
|
|
33
33
|
} from 'react';
|
|
34
34
|
import type { ReactElement, ReactNode, Ref } from 'react';
|
|
35
|
-
import { useTheme } from 'react-x11';
|
|
35
|
+
import { useApp, useTheme } from 'react-x11';
|
|
36
36
|
import type { ForeignProps } from 'react-x11';
|
|
37
37
|
import type { Style } from 'react-x11/style';
|
|
38
38
|
|
|
39
39
|
import {
|
|
40
40
|
BackendUnavailableError,
|
|
41
|
+
canHostXEmbed,
|
|
41
42
|
resolveBackend,
|
|
42
43
|
useEmbeddedClient,
|
|
43
44
|
} from '../embed/index.js';
|
|
@@ -129,10 +130,13 @@ export interface MediaPlayerProps {
|
|
|
129
130
|
onPlayingChange?: (playing: boolean) => void;
|
|
130
131
|
/** The player process ended. */
|
|
131
132
|
onExit?: (info: ExitInfo) => void;
|
|
132
|
-
/** Spawn failures, control-channel failures,
|
|
133
|
-
*
|
|
133
|
+
/** Spawn failures, control-channel failures, the `BackendUnavailableError`
|
|
134
|
+
* for a machine with neither player installed, and the
|
|
135
|
+
* `EmbedUnsupportedError` for a react-x11 backend that cannot embed a
|
|
136
|
+
* player's window at all. */
|
|
134
137
|
onError?: (err: Error) => void;
|
|
135
|
-
/** Rendered instead of the surface when no
|
|
138
|
+
/** Rendered instead of the surface when no player is available — none
|
|
139
|
+
* installed, or none can be embedded on this react-x11 backend. */
|
|
136
140
|
fallback?: ReactNode;
|
|
137
141
|
/** False holds off spawning entirely. */
|
|
138
142
|
enabled?: boolean;
|
|
@@ -164,6 +168,11 @@ export interface MediaPlayerProps {
|
|
|
164
168
|
*
|
|
165
169
|
* The player's window stacks above everything drawn in this one, so nothing 2D
|
|
166
170
|
* can overlap it — see "Controls" at the top of this file.
|
|
171
|
+
*
|
|
172
|
+
* **X11 only.** Both players are embedded by window id, which is XEmbed's
|
|
173
|
+
* mechanism; on a react-x11 backend with none — the native macOS one — the
|
|
174
|
+
* player is `'unavailable'` from the first render and `fallback` shows,
|
|
175
|
+
* rather than a player spawned at a window id that does not exist.
|
|
167
176
|
*/
|
|
168
177
|
export function MediaPlayer(props: MediaPlayerProps): ReactElement {
|
|
169
178
|
const {
|
|
@@ -174,6 +183,7 @@ export function MediaPlayer(props: MediaPlayerProps): ReactElement {
|
|
|
174
183
|
stopSignal,
|
|
175
184
|
} = props;
|
|
176
185
|
const theme = useTheme() as unknown as Record<string, unknown>;
|
|
186
|
+
const embeddable = canHostXEmbed(useApp());
|
|
177
187
|
|
|
178
188
|
const control = useRef<PlayerControl | null>(null);
|
|
179
189
|
// Bumped when a control channel opens or closes. The prop-syncing effects
|
|
@@ -358,6 +368,10 @@ export function MediaPlayer(props: MediaPlayerProps): ReactElement {
|
|
|
358
368
|
if (client.status === 'unavailable' && props.fallback !== undefined) {
|
|
359
369
|
return h(React.Fragment, null, props.fallback);
|
|
360
370
|
}
|
|
371
|
+
// No XEmbed on this app, and no `fallback`: an empty box holds the layout
|
|
372
|
+
// rather than a `<foreign>` with no socket to be — see the same branch in
|
|
373
|
+
// `../terminal/index.ts`.
|
|
374
|
+
if (!embeddable) return hx('box', { style: styles });
|
|
361
375
|
|
|
362
376
|
const foreign: ForeignElementProps = {
|
|
363
377
|
onReady: client.handleReady,
|
package/src/qml/containers.tsx
CHANGED
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
} from './view-utils.js';
|
|
26
26
|
import { delegateExtras, resolveModel } from './models.js';
|
|
27
27
|
import { warn } from './globals.js';
|
|
28
|
+
import { scaleOf } from '../internal/units.js';
|
|
28
29
|
|
|
29
30
|
// --- positioners -----------------------------------------------------------
|
|
30
31
|
|
|
@@ -126,7 +127,11 @@ function FlickableView({ inst }: { inst: QmlInstance }): ReactElement {
|
|
|
126
127
|
useEffect(() => {
|
|
127
128
|
const node = hostNode(inst) as ScrollableNode | null;
|
|
128
129
|
if (!node || typeof node.scrollTo !== 'function') return;
|
|
129
|
-
|
|
130
|
+
// The node's offsets are device pixels; `contentX`/`contentY`,
|
|
131
|
+
// `scrollTo` and `onScroll`'s payload are logical. Compared raw, every
|
|
132
|
+
// scroll the pane made came back to it as a `scrollTo` to where it was.
|
|
133
|
+
const s = scaleOf(node);
|
|
134
|
+
if (node.scrollX / s !== cx || node.scrollY / s !== cy)
|
|
130
135
|
node.scrollTo({ x: cx, y: cy });
|
|
131
136
|
}, [inst, cx, cy]);
|
|
132
137
|
return (
|
package/src/qml/interaction.tsx
CHANGED
|
@@ -29,6 +29,7 @@ import {
|
|
|
29
29
|
qmlColor,
|
|
30
30
|
str,
|
|
31
31
|
} from './view-utils.js';
|
|
32
|
+
import { scaleOf } from '../internal/units.js';
|
|
32
33
|
|
|
33
34
|
// --- Keys + focus ----------------------------------------------------------
|
|
34
35
|
|
|
@@ -56,6 +57,7 @@ interface PointerEventLike {
|
|
|
56
57
|
interface WheelEventLike extends PointerEventLike {
|
|
57
58
|
deltaX?: number;
|
|
58
59
|
deltaY?: number;
|
|
60
|
+
smooth?: boolean;
|
|
59
61
|
}
|
|
60
62
|
|
|
61
63
|
// Qt's modifier flags, so `mouse.modifiers & Qt.ShiftModifier` reads as
|
|
@@ -130,6 +132,20 @@ export function keyFocusProps(inst: QmlInstance): Record<string, unknown> {
|
|
|
130
132
|
|
|
131
133
|
// --- MouseArea -------------------------------------------------------------
|
|
132
134
|
|
|
135
|
+
// The wheel, from react-x11's units into Qt's. react-x11 hands a handler
|
|
136
|
+
// logical pixels, 48 to a notch (its `WheelEvent` declaration), positive
|
|
137
|
+
// where the content advances: down, and right. Qt's `angleDelta` is eighths
|
|
138
|
+
// of a degree, 120 to a notch, positive where the wheel turns away from the
|
|
139
|
+
// user: up, and *left* — xcb's plugin maps button 6 to +120, and
|
|
140
|
+
// `QWheelEvent::inverted` and `QAbstractSlider` both say a scroll to the
|
|
141
|
+
// right is negative. (The QML WheelEvent page says "up/right"; every
|
|
142
|
+
// platform plugin disagrees.) So both axes flip, and a notch down is -120.
|
|
143
|
+
const ANGLE_PER_PX = 120 / 48;
|
|
144
|
+
|
|
145
|
+
/** One axis of Qt's wheel from react-x11's: flipped, times `per`. */
|
|
146
|
+
const qtWheelAxis = (px: number | undefined, per = 1): number =>
|
|
147
|
+
px ? -px * per : 0; // an axis that did not move is 0, not -0
|
|
148
|
+
|
|
133
149
|
function MouseAreaView({ inst }: { inst: QmlInstance }): ReactElement {
|
|
134
150
|
const enabled = inst.slot('enabled').peek() !== false;
|
|
135
151
|
const hoverEnabled = inst.slot('hoverEnabled').peek() === true;
|
|
@@ -137,10 +153,16 @@ function MouseAreaView({ inst }: { inst: QmlInstance }): ReactElement {
|
|
|
137
153
|
applyMotion(inst, style);
|
|
138
154
|
|
|
139
155
|
const mouse = (e: PointerEventLike) => {
|
|
140
|
-
|
|
156
|
+
// `e.x` is logical and `abs` device (react-x11's docs/scale.md), so the
|
|
157
|
+
// area's origin is divided into the event's unit first. Not
|
|
158
|
+
// `getClientRects()`, the same box already divided: it answers nothing
|
|
159
|
+
// for a box with no area, and a 0×0 MouseArea still hears a click on a
|
|
160
|
+
// child that hangs outside it.
|
|
161
|
+
const node = hostNode(inst);
|
|
162
|
+
const s = scaleOf(node);
|
|
141
163
|
return {
|
|
142
|
-
x: e.x - (abs
|
|
143
|
-
y: e.y - (abs
|
|
164
|
+
x: e.x - (node?.abs.x ?? 0) / s,
|
|
165
|
+
y: e.y - (node?.abs.y ?? 0) / s,
|
|
144
166
|
button: e.button,
|
|
145
167
|
modifiers: modifiersOf(e),
|
|
146
168
|
accepted: true,
|
|
@@ -170,7 +192,18 @@ function MouseAreaView({ inst }: { inst: QmlInstance }): ReactElement {
|
|
|
170
192
|
handlers.onWheel = (e: WheelEventLike) => {
|
|
171
193
|
inst.emit('wheel', {
|
|
172
194
|
...mouse(e),
|
|
173
|
-
angleDelta: {
|
|
195
|
+
angleDelta: {
|
|
196
|
+
x: qtWheelAxis(e.deltaX, ANGLE_PER_PX),
|
|
197
|
+
y: qtWheelAxis(e.deltaY, ANGLE_PER_PX),
|
|
198
|
+
},
|
|
199
|
+
// Pixels only where a device measured them — a touchpad, a
|
|
200
|
+
// high-resolution wheel: react-x11's `smooth`. A notch's 48 are a
|
|
201
|
+
// toolkit's choice rather than a measurement, so a notched wheel
|
|
202
|
+
// leaves (0, 0), as Qt's X11 plugin does, and a handler falls back
|
|
203
|
+
// to angleDelta the way Qt's docs tell it to.
|
|
204
|
+
pixelDelta: e.smooth
|
|
205
|
+
? { x: qtWheelAxis(e.deltaX), y: qtWheelAxis(e.deltaY) }
|
|
206
|
+
: { x: 0, y: 0 },
|
|
174
207
|
});
|
|
175
208
|
};
|
|
176
209
|
if (hoverEnabled) {
|
|
@@ -229,7 +262,11 @@ function useImplicitLineHeight(inst: QmlInstance, text: string): void {
|
|
|
229
262
|
text || 'Mg',
|
|
230
263
|
node.resolvedTextStyle(),
|
|
231
264
|
);
|
|
232
|
-
|
|
265
|
+
// Laid out at the resolved size, which is the device one (TextView,
|
|
266
|
+
// in qtquick.tsx), so the height is divided back into logical pixels.
|
|
267
|
+
inst.slots
|
|
268
|
+
.get('implicitHeight')
|
|
269
|
+
?.assign(Math.ceil(probe.height / scaleOf(node)) + 8);
|
|
233
270
|
} catch {
|
|
234
271
|
// No fonts loaded (headless without the fonts option): leave 0.
|
|
235
272
|
}
|
package/src/qml/layouts.tsx
CHANGED
|
@@ -35,23 +35,38 @@ import {
|
|
|
35
35
|
cancelAfterLayout,
|
|
36
36
|
type LayoutTick,
|
|
37
37
|
} from '../internal/timers.js';
|
|
38
|
+
import { scaleOf } from '../internal/units.js';
|
|
38
39
|
|
|
39
40
|
function isRow(inst: QmlInstance): boolean {
|
|
40
41
|
return inst.typeInfo.name === 'RowLayout';
|
|
41
42
|
}
|
|
42
43
|
|
|
43
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Reflect yoga's answers into the managed children's geometry slots.
|
|
46
|
+
*
|
|
47
|
+
* `abs` is device pixels and the slots are the logical ones the document is
|
|
48
|
+
* written in (react-x11's docs/scale.md), and this is not only read-back:
|
|
49
|
+
* an author `width:` is the item's size hint and the slot this writes, so a
|
|
50
|
+
* device number here came back as a hint twice the size and the row drew
|
|
51
|
+
* it that way. Divided once, after the subtraction: `(a - b) / s` rounds
|
|
52
|
+
* once where `a / s - b / s` rounds three times, and at a scale of 1.25
|
|
53
|
+
* half the positions would read like 78.39999999999999 rather than 78.4.
|
|
54
|
+
* And from `abs` rather than `getClientRects()`, which answers nothing for
|
|
55
|
+
* a box with no area: a 0×0 item in a row still has an `x`.
|
|
56
|
+
*/
|
|
44
57
|
function feedbackLayout(inst: QmlInstance): void {
|
|
45
58
|
if (inst.destroyed) return;
|
|
46
|
-
const
|
|
59
|
+
const container = hostNode(inst);
|
|
60
|
+
const containerAbs = container?.abs;
|
|
47
61
|
if (!containerAbs) return;
|
|
62
|
+
const s = scaleOf(container);
|
|
48
63
|
for (const child of inst.visualChildren()) {
|
|
49
64
|
const abs = hostNode(child)?.abs;
|
|
50
65
|
if (!abs) continue; // a custom view without captureNode: skip quietly
|
|
51
|
-
child.slots.get('x')?.reflect(abs.x - containerAbs.x);
|
|
52
|
-
child.slots.get('y')?.reflect(abs.y - containerAbs.y);
|
|
53
|
-
child.slots.get('width')?.reflect(abs.width);
|
|
54
|
-
child.slots.get('height')?.reflect(abs.height);
|
|
66
|
+
child.slots.get('x')?.reflect((abs.x - containerAbs.x) / s);
|
|
67
|
+
child.slots.get('y')?.reflect((abs.y - containerAbs.y) / s);
|
|
68
|
+
child.slots.get('width')?.reflect(abs.width / s);
|
|
69
|
+
child.slots.get('height')?.reflect(abs.height / s);
|
|
55
70
|
}
|
|
56
71
|
}
|
|
57
72
|
|
package/src/qml/qtquick.tsx
CHANGED
|
@@ -40,6 +40,7 @@ import { layoutTypes } from './layouts.js';
|
|
|
40
40
|
import { modelTypes } from './models.js';
|
|
41
41
|
import { stateTypes } from './states.js';
|
|
42
42
|
import { cancel, schedule, warn } from './globals.js';
|
|
43
|
+
import { scaleOf } from '../internal/units.js';
|
|
43
44
|
|
|
44
45
|
// Qt namespace constants used from expressions (`Qt.LeftButton`,
|
|
45
46
|
// `mouse.modifiers & Qt.ShiftModifier`, `Qt.AlignHCenter`).
|
|
@@ -120,8 +121,14 @@ function TextView({ inst }: { inst: QmlInstance }): ReactElement {
|
|
|
120
121
|
if (!node?.app?.fonts || !node.resolvedTextStyle) return;
|
|
121
122
|
try {
|
|
122
123
|
const layout = node.app.fonts.layout(text, node.resolvedTextStyle());
|
|
123
|
-
|
|
124
|
-
|
|
124
|
+
// The resolved size is the device one — the cascade resolves a
|
|
125
|
+
// theme's size once, at the root, in device pixels — so at scale 2 a
|
|
126
|
+
// `font.pixelSize: 20` is laid out at 40 and measured in device
|
|
127
|
+
// pixels. Divided back into the logical ones an implicit size is read
|
|
128
|
+
// in, or every binding on it reads double.
|
|
129
|
+
const s = scaleOf(node);
|
|
130
|
+
inst.slots.get('implicitWidth')?.assign(Math.ceil(layout.width / s));
|
|
131
|
+
inst.slots.get('implicitHeight')?.assign(Math.ceil(layout.height / s));
|
|
125
132
|
} catch {
|
|
126
133
|
// No fonts loaded (headless without the fonts option): leave 0.
|
|
127
134
|
}
|