@react-x11/components 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -4
- package/dist/charts/node.d.ts +11 -1
- package/dist/charts/node.d.ts.map +1 -1
- package/dist/charts/node.js +44 -14
- package/dist/charts/node.js.map +1 -1
- package/dist/charts/render.d.ts +12 -3
- package/dist/charts/render.d.ts.map +1 -1
- package/dist/charts/render.js +94 -25
- package/dist/charts/render.js.map +1 -1
- package/dist/code/index.d.ts.map +1 -1
- package/dist/code/index.js +27 -24
- package/dist/code/index.js.map +1 -1
- package/dist/code-editor/completion.d.ts.map +1 -1
- package/dist/code-editor/completion.js +3 -2
- package/dist/code-editor/completion.js.map +1 -1
- package/dist/code-editor/index.d.ts.map +1 -1
- package/dist/code-editor/index.js +19 -0
- package/dist/code-editor/index.js.map +1 -1
- package/dist/code-editor/node.d.ts +177 -7
- package/dist/code-editor/node.d.ts.map +1 -1
- package/dist/code-editor/node.js +1329 -164
- package/dist/code-editor/node.js.map +1 -1
- package/dist/code-language/index.d.ts +1 -1
- package/dist/code-language/index.d.ts.map +1 -1
- package/dist/code-language/index.js +1 -1
- package/dist/code-language/index.js.map +1 -1
- package/dist/code-language/languages/glsl.d.ts.map +1 -1
- package/dist/code-language/languages/glsl.js +10 -2
- package/dist/code-language/languages/glsl.js.map +1 -1
- package/dist/code-language/languages/javascript.d.ts.map +1 -1
- package/dist/code-language/languages/javascript.js +18 -3
- package/dist/code-language/languages/javascript.js.map +1 -1
- package/dist/code-language/languages/json.d.ts.map +1 -1
- package/dist/code-language/languages/json.js +10 -2
- package/dist/code-language/languages/json.js.map +1 -1
- package/dist/code-language/languages/shell.d.ts.map +1 -1
- package/dist/code-language/languages/shell.js +10 -2
- package/dist/code-language/languages/shell.js.map +1 -1
- package/dist/code-language/languages/sql.d.ts.map +1 -1
- package/dist/code-language/languages/sql.js +20 -2
- package/dist/code-language/languages/sql.js.map +1 -1
- package/dist/code-language/runs.d.ts +31 -0
- package/dist/code-language/runs.d.ts.map +1 -1
- package/dist/code-language/runs.js +105 -0
- package/dist/code-language/runs.js.map +1 -1
- package/dist/code-language/stream.d.ts +22 -0
- package/dist/code-language/stream.d.ts.map +1 -1
- package/dist/code-language/stream.js +259 -9
- package/dist/code-language/stream.js.map +1 -1
- package/dist/code-language/types.d.ts +5 -4
- package/dist/code-language/types.d.ts.map +1 -1
- package/dist/codeblock/index.d.ts +26 -2
- package/dist/codeblock/index.d.ts.map +1 -1
- package/dist/codeblock/index.js +57 -4
- package/dist/codeblock/index.js.map +1 -1
- package/dist/flow/draw.d.ts +50 -0
- package/dist/flow/draw.d.ts.map +1 -1
- package/dist/flow/draw.js +132 -33
- package/dist/flow/draw.js.map +1 -1
- package/dist/flow/gl/color.d.ts +13 -0
- package/dist/flow/gl/color.d.ts.map +1 -0
- package/dist/flow/gl/color.js +82 -0
- package/dist/flow/gl/color.js.map +1 -0
- package/dist/flow/gl/index.d.ts +60 -0
- package/dist/flow/gl/index.d.ts.map +1 -0
- package/dist/flow/gl/index.js +283 -0
- package/dist/flow/gl/index.js.map +1 -0
- package/dist/flow/gl/pack.d.ts +133 -0
- package/dist/flow/gl/pack.d.ts.map +1 -0
- package/dist/flow/gl/pack.js +408 -0
- package/dist/flow/gl/pack.js.map +1 -0
- package/dist/flow/gl/renderer.d.ts +95 -0
- package/dist/flow/gl/renderer.d.ts.map +1 -0
- package/dist/flow/gl/renderer.js +459 -0
- package/dist/flow/gl/renderer.js.map +1 -0
- package/dist/flow/gl/shaders.d.ts +79 -0
- package/dist/flow/gl/shaders.d.ts.map +1 -0
- package/dist/flow/gl/shaders.js +346 -0
- package/dist/flow/gl/shaders.js.map +1 -0
- package/dist/flow/gl/text.d.ts +318 -0
- package/dist/flow/gl/text.d.ts.map +1 -0
- package/dist/flow/gl/text.js +1103 -0
- package/dist/flow/gl/text.js.map +1 -0
- package/dist/flow/index.d.ts +1 -1
- package/dist/flow/index.d.ts.map +1 -1
- package/dist/flow/index.js +619 -64
- package/dist/flow/index.js.map +1 -1
- package/dist/flow/node.d.ts +621 -72
- package/dist/flow/node.d.ts.map +1 -1
- package/dist/flow/node.js +2253 -1018
- package/dist/flow/node.js.map +1 -1
- package/dist/flow/paint.d.ts +35 -0
- package/dist/flow/paint.d.ts.map +1 -0
- package/dist/flow/paint.js +393 -0
- package/dist/flow/paint.js.map +1 -0
- package/dist/flow/paths.d.ts +14 -0
- package/dist/flow/paths.d.ts.map +1 -1
- package/dist/flow/paths.js +45 -19
- package/dist/flow/paths.js.map +1 -1
- package/dist/flow/scene.d.ts +584 -0
- package/dist/flow/scene.d.ts.map +1 -0
- package/dist/flow/scene.js +1453 -0
- package/dist/flow/scene.js.map +1 -0
- package/dist/flow/types.d.ts +111 -1
- package/dist/flow/types.d.ts.map +1 -1
- package/dist/html/controls.d.ts +28 -0
- package/dist/html/controls.d.ts.map +1 -1
- package/dist/html/controls.js +52 -2
- package/dist/html/controls.js.map +1 -1
- package/dist/html/css/calc.d.ts +14 -0
- package/dist/html/css/calc.d.ts.map +1 -0
- package/dist/html/css/calc.js +344 -0
- package/dist/html/css/calc.js.map +1 -0
- package/dist/html/css/cascade.d.ts +262 -6
- package/dist/html/css/cascade.d.ts.map +1 -1
- package/dist/html/css/cascade.js +1373 -67
- package/dist/html/css/cascade.js.map +1 -1
- package/dist/html/css/color.d.ts +23 -0
- package/dist/html/css/color.d.ts.map +1 -0
- package/dist/html/css/color.js +740 -0
- package/dist/html/css/color.js.map +1 -0
- package/dist/html/css/content.d.ts +92 -0
- package/dist/html/css/content.d.ts.map +1 -0
- package/dist/html/css/content.js +388 -0
- package/dist/html/css/content.js.map +1 -0
- package/dist/html/css/counter-styles.d.ts +76 -0
- package/dist/html/css/counter-styles.d.ts.map +1 -0
- package/dist/html/css/counter-styles.js +893 -0
- package/dist/html/css/counter-styles.js.map +1 -0
- package/dist/html/css/decode.d.ts +12 -0
- package/dist/html/css/decode.d.ts.map +1 -0
- package/dist/html/css/decode.js +116 -0
- package/dist/html/css/decode.js.map +1 -0
- package/dist/html/css/parse.d.ts +110 -10
- package/dist/html/css/parse.d.ts.map +1 -1
- package/dist/html/css/parse.js +1473 -180
- package/dist/html/css/parse.js.map +1 -1
- package/dist/html/css/style.d.ts +501 -15
- package/dist/html/css/style.d.ts.map +1 -1
- package/dist/html/css/style.js +3729 -206
- package/dist/html/css/style.js.map +1 -1
- package/dist/html/css/ua.d.ts.map +1 -1
- package/dist/html/css/ua.js +65 -16
- package/dist/html/css/ua.js.map +1 -1
- package/dist/html/css/values.d.ts +37 -3
- package/dist/html/css/values.d.ts.map +1 -1
- package/dist/html/css/values.js +122 -48
- package/dist/html/css/values.js.map +1 -1
- package/dist/html/css/vars.d.ts +52 -0
- package/dist/html/css/vars.d.ts.map +1 -0
- package/dist/html/css/vars.js +358 -0
- package/dist/html/css/vars.js.map +1 -0
- package/dist/html/dom.d.ts +30 -4
- package/dist/html/dom.d.ts.map +1 -1
- package/dist/html/dom.js +278 -17
- package/dist/html/dom.js.map +1 -1
- package/dist/html/fonts.d.ts +106 -0
- package/dist/html/fonts.d.ts.map +1 -0
- package/dist/html/fonts.js +565 -0
- package/dist/html/fonts.js.map +1 -0
- package/dist/html/gif.d.ts +15 -0
- package/dist/html/gif.d.ts.map +1 -0
- package/dist/html/gif.js +229 -0
- package/dist/html/gif.js.map +1 -0
- package/dist/html/index.d.ts +50 -11
- package/dist/html/index.d.ts.map +1 -1
- package/dist/html/index.js +115 -9
- package/dist/html/index.js.map +1 -1
- package/dist/html/layout/block.d.ts +226 -3
- package/dist/html/layout/block.d.ts.map +1 -1
- package/dist/html/layout/block.js +3077 -219
- package/dist/html/layout/block.js.map +1 -1
- package/dist/html/layout/boxes.d.ts +367 -17
- package/dist/html/layout/boxes.d.ts.map +1 -1
- package/dist/html/layout/boxes.js +1742 -182
- package/dist/html/layout/boxes.js.map +1 -1
- package/dist/html/layout/cache.d.ts +58 -0
- package/dist/html/layout/cache.d.ts.map +1 -0
- package/dist/html/layout/cache.js +224 -0
- package/dist/html/layout/cache.js.map +1 -0
- package/dist/html/layout/collapse.d.ts +45 -0
- package/dist/html/layout/collapse.d.ts.map +1 -0
- package/dist/html/layout/collapse.js +246 -0
- package/dist/html/layout/collapse.js.map +1 -0
- package/dist/html/layout/css-grid.d.ts +7 -0
- package/dist/html/layout/css-grid.d.ts.map +1 -0
- package/dist/html/layout/css-grid.js +900 -0
- package/dist/html/layout/css-grid.js.map +1 -0
- package/dist/html/layout/flex.d.ts.map +1 -1
- package/dist/html/layout/flex.js +1025 -89
- package/dist/html/layout/flex.js.map +1 -1
- package/dist/html/layout/floats.d.ts +45 -6
- package/dist/html/layout/floats.d.ts.map +1 -1
- package/dist/html/layout/floats.js +113 -14
- package/dist/html/layout/floats.js.map +1 -1
- package/dist/html/layout/grid-lines.d.ts +39 -0
- package/dist/html/layout/grid-lines.d.ts.map +1 -0
- package/dist/html/layout/grid-lines.js +119 -0
- package/dist/html/layout/grid-lines.js.map +1 -0
- package/dist/html/layout/grid.d.ts +53 -0
- package/dist/html/layout/grid.d.ts.map +1 -0
- package/dist/html/layout/grid.js +153 -0
- package/dist/html/layout/grid.js.map +1 -0
- package/dist/html/layout/inline.d.ts +154 -1
- package/dist/html/layout/inline.d.ts.map +1 -1
- package/dist/html/layout/inline.js +3598 -175
- package/dist/html/layout/inline.js.map +1 -1
- package/dist/html/layout/shaping.d.ts +6 -0
- package/dist/html/layout/shaping.d.ts.map +1 -0
- package/dist/html/layout/shaping.js +100 -0
- package/dist/html/layout/shaping.js.map +1 -0
- package/dist/html/layout/table.d.ts +3 -0
- package/dist/html/layout/table.d.ts.map +1 -1
- package/dist/html/layout/table.js +681 -175
- package/dist/html/layout/table.js.map +1 -1
- package/dist/html/layout/tracks.d.ts +44 -0
- package/dist/html/layout/tracks.d.ts.map +1 -0
- package/dist/html/layout/tracks.js +349 -0
- package/dist/html/layout/tracks.js.map +1 -0
- package/dist/html/node.d.ts +169 -4
- package/dist/html/node.d.ts.map +1 -1
- package/dist/html/node.js +1429 -137
- package/dist/html/node.js.map +1 -1
- package/dist/html/paint.d.ts +92 -3
- package/dist/html/paint.d.ts.map +1 -1
- package/dist/html/paint.js +3635 -107
- package/dist/html/paint.js.map +1 -1
- package/dist/html/resources.d.ts +60 -14
- package/dist/html/resources.d.ts.map +1 -1
- package/dist/html/resources.js +122 -36
- package/dist/html/resources.js.map +1 -1
- package/dist/html/surfaces.d.ts +23 -0
- package/dist/html/surfaces.d.ts.map +1 -0
- package/dist/html/surfaces.js +68 -0
- package/dist/html/surfaces.js.map +1 -0
- package/dist/html/svg.d.ts +80 -0
- package/dist/html/svg.d.ts.map +1 -0
- package/dist/html/svg.js +442 -0
- package/dist/html/svg.js.map +1 -0
- package/dist/html/url.d.ts +23 -0
- package/dist/html/url.d.ts.map +1 -0
- package/dist/html/url.js +80 -0
- package/dist/html/url.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/codelines.d.ts +42 -0
- package/dist/internal/codelines.d.ts.map +1 -0
- package/dist/internal/codelines.js +170 -0
- package/dist/internal/codelines.js.map +1 -0
- package/dist/internal/collate.d.ts +3 -0
- package/dist/internal/collate.d.ts.map +1 -0
- package/dist/internal/collate.js +11 -0
- package/dist/internal/collate.js.map +1 -0
- package/dist/internal/markdown/ast.d.ts +11 -0
- package/dist/internal/markdown/ast.d.ts.map +1 -1
- package/dist/internal/markdown/parse.d.ts.map +1 -1
- package/dist/internal/markdown/parse.js +109 -8
- package/dist/internal/markdown/parse.js.map +1 -1
- package/dist/internal/prewarm.d.ts +18 -0
- package/dist/internal/prewarm.d.ts.map +1 -0
- package/dist/internal/prewarm.js +42 -0
- package/dist/internal/prewarm.js.map +1 -0
- package/dist/internal/sdf.d.ts +20 -0
- package/dist/internal/sdf.d.ts.map +1 -0
- package/dist/internal/sdf.js +216 -0
- package/dist/internal/sdf.js.map +1 -0
- package/dist/internal/splice.d.ts +12 -0
- package/dist/internal/splice.d.ts.map +1 -0
- package/dist/internal/splice.js +23 -0
- package/dist/internal/splice.js.map +1 -0
- package/dist/internal/window.d.ts +12 -0
- package/dist/internal/window.d.ts.map +1 -1
- package/dist/internal/window.js +23 -6
- package/dist/internal/window.js.map +1 -1
- package/dist/maps/anchors.d.ts +6 -1
- package/dist/maps/anchors.d.ts.map +1 -1
- package/dist/maps/anchors.js +260 -1
- package/dist/maps/anchors.js.map +1 -1
- package/dist/maps/controller.d.ts +57 -0
- package/dist/maps/controller.d.ts.map +1 -1
- package/dist/maps/controller.js +97 -18
- package/dist/maps/controller.js.map +1 -1
- package/dist/maps/gl/buckets.d.ts +5 -1
- package/dist/maps/gl/buckets.d.ts.map +1 -1
- package/dist/maps/gl/buckets.js +5 -2
- package/dist/maps/gl/buckets.js.map +1 -1
- package/dist/maps/gl/build-worker.d.ts +2 -0
- package/dist/maps/gl/build-worker.d.ts.map +1 -1
- package/dist/maps/gl/build-worker.js +1 -1
- package/dist/maps/gl/build-worker.js.map +1 -1
- package/dist/maps/gl/cover.d.ts +23 -4
- package/dist/maps/gl/cover.d.ts.map +1 -1
- package/dist/maps/gl/cover.js +61 -48
- package/dist/maps/gl/cover.js.map +1 -1
- package/dist/maps/gl/placement.d.ts +21 -8
- package/dist/maps/gl/placement.d.ts.map +1 -1
- package/dist/maps/gl/placement.js +133 -58
- package/dist/maps/gl/placement.js.map +1 -1
- package/dist/maps/gl/renderer.d.ts +36 -4
- package/dist/maps/gl/renderer.d.ts.map +1 -1
- package/dist/maps/gl/renderer.js +81 -24
- package/dist/maps/gl/renderer.js.map +1 -1
- package/dist/maps/gl/shaders.d.ts +18 -17
- package/dist/maps/gl/shaders.d.ts.map +1 -1
- package/dist/maps/gl/shaders.js +34 -32
- package/dist/maps/gl/shaders.js.map +1 -1
- package/dist/maps/gl/store.d.ts +10 -0
- package/dist/maps/gl/store.d.ts.map +1 -1
- package/dist/maps/gl/store.js +47 -4
- package/dist/maps/gl/store.js.map +1 -1
- package/dist/maps/gl/text.d.ts +153 -24
- package/dist/maps/gl/text.d.ts.map +1 -1
- package/dist/maps/gl/text.js +379 -63
- package/dist/maps/gl/text.js.map +1 -1
- package/dist/maps/gl/view.d.ts +293 -2
- package/dist/maps/gl/view.d.ts.map +1 -1
- package/dist/maps/gl/view.js +317 -82
- package/dist/maps/gl/view.js.map +1 -1
- package/dist/maps/icons.d.ts +32 -0
- package/dist/maps/icons.d.ts.map +1 -0
- package/dist/maps/icons.js +151 -0
- package/dist/maps/icons.js.map +1 -0
- package/dist/maps/index.d.ts +2 -0
- package/dist/maps/index.d.ts.map +1 -1
- package/dist/maps/index.js +2 -0
- package/dist/maps/index.js.map +1 -1
- package/dist/maps/labels.d.ts +56 -4
- package/dist/maps/labels.d.ts.map +1 -1
- package/dist/maps/labels.js +213 -46
- package/dist/maps/labels.js.map +1 -1
- package/dist/maps/node.d.ts +17 -0
- package/dist/maps/node.d.ts.map +1 -1
- package/dist/maps/node.js +64 -30
- package/dist/maps/node.js.map +1 -1
- package/dist/maps/proj.d.ts +48 -0
- package/dist/maps/proj.d.ts.map +1 -1
- package/dist/maps/proj.js +73 -0
- package/dist/maps/proj.js.map +1 -1
- package/dist/maps/sources.d.ts +5 -3
- package/dist/maps/sources.d.ts.map +1 -1
- package/dist/maps/sources.js +5 -3
- package/dist/maps/sources.js.map +1 -1
- package/dist/maps/style.d.ts +35 -0
- package/dist/maps/style.d.ts.map +1 -1
- package/dist/maps/style.js.map +1 -1
- package/dist/maps/styles.d.ts +12 -0
- package/dist/maps/styles.d.ts.map +1 -1
- package/dist/maps/styles.js +120 -6
- package/dist/maps/styles.js.map +1 -1
- package/dist/maps/tiles.d.ts +31 -11
- package/dist/maps/tiles.d.ts.map +1 -1
- package/dist/maps/tiles.js +61 -27
- package/dist/maps/tiles.js.map +1 -1
- package/dist/maps/types.d.ts +28 -4
- package/dist/maps/types.d.ts.map +1 -1
- package/dist/markdown/index.d.ts.map +1 -1
- package/dist/markdown/index.js +209 -68
- package/dist/markdown/index.js.map +1 -1
- package/dist/markdown/spans.d.ts.map +1 -1
- package/dist/markdown/spans.js +6 -0
- package/dist/markdown/spans.js.map +1 -1
- package/dist/qml/containers.d.ts.map +1 -1
- package/dist/qml/containers.js +6 -1
- package/dist/qml/containers.js.map +1 -1
- package/dist/qml/interaction.d.ts.map +1 -1
- package/dist/qml/interaction.js +38 -5
- package/dist/qml/interaction.js.map +1 -1
- package/dist/qml/layouts.d.ts.map +1 -1
- package/dist/qml/layouts.js +21 -6
- package/dist/qml/layouts.js.map +1 -1
- package/dist/qml/qtquick.d.ts.map +1 -1
- package/dist/qml/qtquick.js +9 -2
- package/dist/qml/qtquick.js.map +1 -1
- package/dist/qml/react.d.ts.map +1 -1
- package/dist/qml/react.js +9 -7
- package/dist/qml/react.js.map +1 -1
- package/dist/reorder/clock.d.ts +7 -0
- package/dist/reorder/clock.d.ts.map +1 -0
- package/dist/reorder/clock.js +26 -0
- package/dist/reorder/clock.js.map +1 -0
- package/dist/reorder/index.d.ts +25 -3
- package/dist/reorder/index.d.ts.map +1 -1
- package/dist/reorder/index.js +64 -19
- package/dist/reorder/index.js.map +1 -1
- package/dist/rich-text-editor/index.d.ts +0 -11
- package/dist/rich-text-editor/index.d.ts.map +1 -1
- package/dist/rich-text-editor/index.js +38 -9
- package/dist/rich-text-editor/index.js.map +1 -1
- package/dist/rich-text-editor/keymap.d.ts.map +1 -1
- package/dist/rich-text-editor/keymap.js +2 -1
- package/dist/rich-text-editor/keymap.js.map +1 -1
- package/dist/rich-text-editor/keys.d.ts +17 -6
- package/dist/rich-text-editor/keys.d.ts.map +1 -1
- package/dist/rich-text-editor/keys.js +135 -26
- package/dist/rich-text-editor/keys.js.map +1 -1
- package/dist/rich-text-editor/markdown.d.ts.map +1 -1
- package/dist/rich-text-editor/markdown.js +30 -1
- package/dist/rich-text-editor/markdown.js.map +1 -1
- package/dist/rich-text-editor/marks.d.ts +9 -0
- package/dist/rich-text-editor/marks.d.ts.map +1 -0
- package/dist/rich-text-editor/marks.js +83 -0
- package/dist/rich-text-editor/marks.js.map +1 -0
- package/dist/rich-text-editor/render.d.ts.map +1 -1
- package/dist/rich-text-editor/render.js +28 -10
- package/dist/rich-text-editor/render.js.map +1 -1
- package/dist/rich-text-editor/replace.d.ts +13 -0
- package/dist/rich-text-editor/replace.d.ts.map +1 -0
- package/dist/rich-text-editor/replace.js +64 -0
- package/dist/rich-text-editor/replace.js.map +1 -0
- package/dist/rich-text-editor/toolbar.d.ts.map +1 -1
- package/dist/rich-text-editor/toolbar.js +1 -1
- package/dist/rich-text-editor/toolbar.js.map +1 -1
- package/dist/rich-text-editor/virtual.d.ts.map +1 -1
- package/dist/rich-text-editor/virtual.js +17 -0
- package/dist/rich-text-editor/virtual.js.map +1 -1
- package/dist/richtext/node.d.ts +46 -2
- package/dist/richtext/node.d.ts.map +1 -1
- package/dist/richtext/node.js +187 -4
- package/dist/richtext/node.js.map +1 -1
- package/dist/richtext/runs.d.ts +13 -8
- package/dist/richtext/runs.d.ts.map +1 -1
- package/dist/richtext/runs.js +18 -8
- package/dist/richtext/runs.js.map +1 -1
- package/dist/table/index.d.ts.map +1 -1
- package/dist/table/index.js +23 -0
- package/dist/table/index.js.map +1 -1
- package/dist/table/rows.d.ts +3 -2
- package/dist/table/rows.d.ts.map +1 -1
- package/dist/table/rows.js +20 -6
- package/dist/table/rows.js.map +1 -1
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +4 -0
- package/dist/terminal/index.js.map +1 -1
- package/dist/terminal/vt/pty.d.ts +13 -2
- package/dist/terminal/vt/pty.d.ts.map +1 -1
- package/dist/terminal/vt/pty.js +18 -3
- package/dist/terminal/vt/pty.js.map +1 -1
- package/dist/terminal-output/index.d.ts.map +1 -1
- package/dist/terminal-output/index.js +103 -23
- package/dist/terminal-output/index.js.map +1 -1
- package/dist/terminal-output/runs.d.ts +4 -1
- package/dist/terminal-output/runs.d.ts.map +1 -1
- package/dist/terminal-output/runs.js +5 -1
- package/dist/terminal-output/runs.js.map +1 -1
- package/dist/three/canvas.d.ts.map +1 -1
- package/dist/three/canvas.js +85 -7
- package/dist/three/canvas.js.map +1 -1
- package/dist/three/events.d.ts +22 -4
- package/dist/three/events.d.ts.map +1 -1
- package/dist/three/events.js +34 -4
- package/dist/three/events.js.map +1 -1
- package/dist/tree/index.d.ts.map +1 -1
- package/dist/tree/index.js +17 -0
- package/dist/tree/index.js.map +1 -1
- package/package.json +42 -33
- package/src/charts/node.ts +62 -26
- package/src/charts/render.ts +120 -30
- package/src/code/index.ts +36 -32
- package/src/code-editor/completion.ts +3 -2
- package/src/code-editor/index.ts +19 -0
- package/src/code-editor/node.ts +1574 -184
- package/src/code-language/index.ts +1 -1
- package/src/code-language/languages/glsl.ts +12 -2
- package/src/code-language/languages/javascript.ts +21 -4
- package/src/code-language/languages/json.ts +12 -2
- package/src/code-language/languages/shell.ts +12 -2
- package/src/code-language/languages/sql.ts +22 -2
- package/src/code-language/runs.ts +111 -1
- package/src/code-language/stream.ts +257 -17
- package/src/code-language/types.ts +5 -4
- package/src/codeblock/index.ts +68 -4
- package/src/flow/draw.ts +167 -41
- package/src/flow/gl/color.ts +85 -0
- package/src/flow/gl/index.ts +342 -0
- package/src/flow/gl/pack.ts +585 -0
- package/src/flow/gl/renderer.ts +679 -0
- package/src/flow/gl/shaders.ts +371 -0
- package/src/flow/gl/text.ts +1295 -0
- package/src/flow/index.ts +794 -67
- package/src/flow/node.ts +2496 -1256
- package/src/flow/paint.ts +511 -0
- package/src/flow/paths.ts +80 -15
- package/src/flow/scene.ts +2199 -0
- package/src/flow/types.ts +113 -1
- package/src/html/controls.ts +73 -2
- package/src/html/css/calc.ts +385 -0
- package/src/html/css/cascade.ts +1481 -62
- package/src/html/css/color.ts +755 -0
- package/src/html/css/content.ts +417 -0
- package/src/html/css/counter-styles.ts +973 -0
- package/src/html/css/decode.ts +130 -0
- package/src/html/css/parse.ts +1514 -160
- package/src/html/css/style.ts +4131 -223
- package/src/html/css/ua.ts +66 -17
- package/src/html/css/values.ts +150 -50
- package/src/html/css/vars.ts +348 -0
- package/src/html/dom.ts +284 -17
- package/src/html/fonts.ts +641 -0
- package/src/html/gif.ts +233 -0
- package/src/html/index.ts +180 -20
- package/src/html/layout/block.ts +3560 -208
- package/src/html/layout/boxes.ts +2141 -190
- package/src/html/layout/cache.ts +289 -0
- package/src/html/layout/collapse.ts +317 -0
- package/src/html/layout/css-grid.ts +1063 -0
- package/src/html/layout/flex.ts +1115 -106
- package/src/html/layout/floats.ts +128 -14
- package/src/html/layout/grid-lines.ts +141 -0
- package/src/html/layout/grid.ts +181 -0
- package/src/html/layout/inline.ts +4187 -192
- package/src/html/layout/shaping.ts +140 -0
- package/src/html/layout/table.ts +696 -186
- package/src/html/layout/tracks.ts +437 -0
- package/src/html/node.ts +1585 -156
- package/src/html/paint.ts +4582 -267
- package/src/html/resources.ts +161 -50
- package/src/html/surfaces.ts +81 -0
- package/src/html/svg.ts +504 -0
- package/src/html/url.ts +86 -0
- package/src/index.ts +2 -0
- package/src/internal/codelines.ts +200 -0
- package/src/internal/collate.ts +12 -0
- package/src/internal/markdown/ast.ts +11 -0
- package/src/internal/markdown/parse.ts +154 -11
- package/src/internal/prewarm.ts +45 -0
- package/src/internal/sdf.ts +227 -0
- package/src/internal/splice.ts +25 -0
- package/src/internal/window.ts +36 -5
- package/src/maps/anchors.ts +307 -1
- package/src/maps/controller.ts +116 -31
- package/src/maps/gl/buckets.ts +5 -1
- package/src/maps/gl/build-worker.ts +13 -2
- package/src/maps/gl/cover.ts +79 -44
- package/src/maps/gl/placement.ts +221 -69
- package/src/maps/gl/renderer.ts +104 -20
- package/src/maps/gl/shaders.ts +35 -32
- package/src/maps/gl/store.ts +66 -17
- package/src/maps/gl/text.ts +444 -71
- package/src/maps/gl/view.ts +361 -96
- package/src/maps/icons.ts +183 -0
- package/src/maps/index.ts +4 -0
- package/src/maps/labels.ts +269 -49
- package/src/maps/node.ts +82 -49
- package/src/maps/proj.ts +87 -0
- package/src/maps/sources.ts +5 -3
- package/src/maps/style.ts +32 -0
- package/src/maps/styles.ts +215 -4
- package/src/maps/tiles.ts +64 -31
- package/src/maps/types.ts +28 -4
- package/src/markdown/index.ts +293 -92
- package/src/markdown/spans.ts +5 -0
- package/src/qml/containers.tsx +6 -1
- package/src/qml/interaction.tsx +42 -5
- package/src/qml/layouts.tsx +21 -6
- package/src/qml/qtquick.tsx +9 -2
- package/src/qml/react.tsx +7 -5
- package/src/reorder/clock.ts +27 -0
- package/src/reorder/index.ts +100 -27
- package/src/rich-text-editor/index.ts +37 -12
- package/src/rich-text-editor/keymap.ts +1 -1
- package/src/rich-text-editor/keys.ts +135 -26
- package/src/rich-text-editor/markdown.ts +36 -1
- package/src/rich-text-editor/marks.ts +101 -0
- package/src/rich-text-editor/render.ts +49 -12
- package/src/rich-text-editor/replace.ts +85 -0
- package/src/rich-text-editor/toolbar.ts +1 -1
- package/src/rich-text-editor/virtual.ts +25 -0
- package/src/richtext/node.ts +235 -14
- package/src/richtext/runs.ts +23 -12
- package/src/table/index.ts +29 -0
- package/src/table/rows.ts +18 -8
- package/src/terminal/index.ts +4 -0
- package/src/terminal/vt/pty.ts +16 -2
- package/src/terminal-output/index.ts +129 -31
- package/src/terminal-output/runs.ts +16 -2
- package/src/three/canvas.ts +102 -8
- package/src/three/events.ts +49 -9
- package/src/tree/index.ts +19 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
// Code drawn as a column of blocks of lines, under `<Code>` and
|
|
2
|
+
// `<Markdown>`'s fences.
|
|
3
|
+
//
|
|
4
|
+
// One `<richtext>` for a whole block of code is laid out whole whenever any
|
|
5
|
+
// of it changes, and a code block that streams — a model writing a fence a
|
|
6
|
+
// token at a time, a log of source — changes at its end every time: 0.4 s
|
|
7
|
+
// for a line appended to 5,000 in either component. As blocks, a change
|
|
8
|
+
// lays out the blocks it touches. The runs are tokenized afresh on every
|
|
9
|
+
// change, so a block is kept by what it holds rather than by identity: while
|
|
10
|
+
// its runs are the same text in the same styles, its element is the one
|
|
11
|
+
// already drawn.
|
|
12
|
+
import React from 'react';
|
|
13
|
+
import type { ReactElement } from 'react';
|
|
14
|
+
import type { Style } from 'react-x11/style';
|
|
15
|
+
|
|
16
|
+
import { RICHTEXT_ELEMENT } from '../richtext/index.js';
|
|
17
|
+
import type { RichTextProps, TextRun } from '../richtext/index.js';
|
|
18
|
+
|
|
19
|
+
const h = React.createElement;
|
|
20
|
+
|
|
21
|
+
/** Lines a block of code holds. */
|
|
22
|
+
export const CODE_BLOCK_LINES = 256;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Runs split into blocks of `lines` whole lines: the text cut at every
|
|
26
|
+
* `lines`th newline, that newline left out, so the blocks stacked are the
|
|
27
|
+
* text again. A newline that ends the whole text stays in its block, where
|
|
28
|
+
* it draws the empty last line it always drew.
|
|
29
|
+
*/
|
|
30
|
+
export function codeBlocks(
|
|
31
|
+
runs: readonly TextRun[],
|
|
32
|
+
lines = CODE_BLOCK_LINES,
|
|
33
|
+
): TextRun[][] {
|
|
34
|
+
let last = runs.length - 1;
|
|
35
|
+
while (last >= 0 && runs[last]!.text === '') last--;
|
|
36
|
+
const blocks: TextRun[][] = [];
|
|
37
|
+
let block: TextRun[] = [];
|
|
38
|
+
let count = 0;
|
|
39
|
+
for (let r = 0; r < runs.length; r++) {
|
|
40
|
+
const run = runs[r]!;
|
|
41
|
+
let from = 0;
|
|
42
|
+
let search = 0;
|
|
43
|
+
for (;;) {
|
|
44
|
+
const nl = run.text.indexOf('\n', search);
|
|
45
|
+
if (nl < 0) break;
|
|
46
|
+
search = nl + 1;
|
|
47
|
+
if (++count < lines) continue;
|
|
48
|
+
// the text's own last newline is a line of its own, and stays
|
|
49
|
+
if (r === last && nl === run.text.length - 1) break;
|
|
50
|
+
if (nl > from) block.push(piece(run, from, nl));
|
|
51
|
+
blocks.push(block);
|
|
52
|
+
block = [];
|
|
53
|
+
count = 0;
|
|
54
|
+
from = nl + 1;
|
|
55
|
+
}
|
|
56
|
+
if (from < run.text.length) {
|
|
57
|
+
block.push(from === 0 ? run : piece(run, from, run.text.length));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
blocks.push(block);
|
|
61
|
+
return blocks;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function piece(run: TextRun, from: number, to: number): TextRun {
|
|
65
|
+
return { ...run, text: run.text.slice(from, to) };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Whether two runs are the same text in the same style, field for field. */
|
|
69
|
+
function sameRun(a: TextRun, b: TextRun): boolean {
|
|
70
|
+
if (a === b) return true;
|
|
71
|
+
const x = a as unknown as Record<string, unknown>;
|
|
72
|
+
const y = b as unknown as Record<string, unknown>;
|
|
73
|
+
for (const key in x) if (x[key] !== y[key]) return false;
|
|
74
|
+
for (const key in y) if (!(key in x) && y[key] !== undefined) return false;
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function sameRuns(a: readonly TextRun[], b: readonly TextRun[]): boolean {
|
|
79
|
+
if (a.length !== b.length) return false;
|
|
80
|
+
for (let i = 0; i < a.length; i++) if (!sameRun(a[i]!, b[i]!)) return false;
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function sameStyle(a: Style, b: Style): boolean {
|
|
85
|
+
return sameRun(a as unknown as TextRun, b as unknown as TextRun);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface CodeLinesProps {
|
|
89
|
+
runs: readonly TextRun[];
|
|
90
|
+
/** Every block's style, compared by value: a style object built afresh
|
|
91
|
+
* each render keeps the blocks. */
|
|
92
|
+
style: Style;
|
|
93
|
+
/** `false` lays each block out unwrapped, as `<richtext>` takes it. */
|
|
94
|
+
wrap?: boolean;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** The blocks' elements from the last render, and what they were built of. */
|
|
98
|
+
interface Kept {
|
|
99
|
+
style: Style;
|
|
100
|
+
wrap: boolean | undefined;
|
|
101
|
+
blocks: TextRun[][];
|
|
102
|
+
elements: ReactElement[];
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* The runs of a block of code, drawn as blocks of lines (`codeBlocks`),
|
|
107
|
+
* each a `<richtext>` kept while its runs are the same. A selection runs
|
|
108
|
+
* across the blocks and copies as one text, since core joins text elements
|
|
109
|
+
* stacked one above the other with a newline.
|
|
110
|
+
*/
|
|
111
|
+
export function CodeLines(props: CodeLinesProps): ReactElement {
|
|
112
|
+
const { style, wrap } = props;
|
|
113
|
+
const kept = React.useRef<Kept | null>(null);
|
|
114
|
+
const was =
|
|
115
|
+
kept.current &&
|
|
116
|
+
kept.current.wrap === wrap &&
|
|
117
|
+
sameStyle(kept.current.style, style)
|
|
118
|
+
? kept.current
|
|
119
|
+
: null;
|
|
120
|
+
const blocks = codeBlocks(props.runs);
|
|
121
|
+
const elements = blocks.map((block, i) => {
|
|
122
|
+
const before = was?.blocks[i];
|
|
123
|
+
if (before && sameRuns(before, block)) {
|
|
124
|
+
blocks[i] = before;
|
|
125
|
+
return was.elements[i]!;
|
|
126
|
+
}
|
|
127
|
+
const blockProps: RichTextProps = { runs: block, style };
|
|
128
|
+
if (wrap === false) blockProps.wrap = false;
|
|
129
|
+
return h(RICHTEXT_ELEMENT, {
|
|
130
|
+
key: i,
|
|
131
|
+
...blockProps,
|
|
132
|
+
} as Record<string, unknown>);
|
|
133
|
+
});
|
|
134
|
+
kept.current = { style, wrap, blocks, elements };
|
|
135
|
+
return h(React.Fragment, null, ...elements);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export interface CodeGutterProps {
|
|
139
|
+
/** Lines in the code beside it. */
|
|
140
|
+
lines: number;
|
|
141
|
+
/** How a number is set: the code's family and size, a dimmer colour. */
|
|
142
|
+
run: Omit<TextRun, 'text'>;
|
|
143
|
+
style: Style;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* The line numbers beside `CodeLines`, blocked the same way so that the two
|
|
148
|
+
* stay in register a block at a time, and a number not rebuilt for a line
|
|
149
|
+
* appended far below it. Each number is followed by a newline, the last as
|
|
150
|
+
* well, as the gutter always was.
|
|
151
|
+
*/
|
|
152
|
+
export function CodeGutter(props: CodeGutterProps): ReactElement {
|
|
153
|
+
const { lines, run, style } = props;
|
|
154
|
+
const kept = React.useRef<{
|
|
155
|
+
run: Omit<TextRun, 'text'>;
|
|
156
|
+
style: Style;
|
|
157
|
+
byStart: Map<string, ReactElement>;
|
|
158
|
+
} | null>(null);
|
|
159
|
+
if (
|
|
160
|
+
!kept.current ||
|
|
161
|
+
!sameRun(kept.current.run as TextRun, run as TextRun) ||
|
|
162
|
+
!sameStyle(kept.current.style, style)
|
|
163
|
+
) {
|
|
164
|
+
kept.current = { run, style, byStart: new Map() };
|
|
165
|
+
}
|
|
166
|
+
const byStart = kept.current.byStart;
|
|
167
|
+
const elements: ReactElement[] = [];
|
|
168
|
+
const used = new Set<string>();
|
|
169
|
+
for (let start = 0; start < lines || start === 0; start += CODE_BLOCK_LINES) {
|
|
170
|
+
const end = Math.min(start + CODE_BLOCK_LINES, lines);
|
|
171
|
+
const key = `${start}:${end}`;
|
|
172
|
+
used.add(key);
|
|
173
|
+
let element = byStart.get(key);
|
|
174
|
+
if (!element) {
|
|
175
|
+
const runs: TextRun[] = [];
|
|
176
|
+
for (let i = start; i < end; i++) {
|
|
177
|
+
runs.push({ ...run, text: `${i + 1}\n` } as TextRun);
|
|
178
|
+
}
|
|
179
|
+
// the newline that ends a block is the gap to the next one
|
|
180
|
+
if (end < lines && runs.length > 0) {
|
|
181
|
+
const tail = runs[runs.length - 1]!;
|
|
182
|
+
runs[runs.length - 1] = { ...tail, text: tail.text.slice(0, -1) };
|
|
183
|
+
}
|
|
184
|
+
element = h(RICHTEXT_ELEMENT, {
|
|
185
|
+
key: start,
|
|
186
|
+
// The numbering is chrome, not text: `selectable={false}` keeps it
|
|
187
|
+
// out of a drag and out of the copied text.
|
|
188
|
+
selectable: false,
|
|
189
|
+
runs,
|
|
190
|
+
wrap: false,
|
|
191
|
+
style,
|
|
192
|
+
} as Record<string, unknown>);
|
|
193
|
+
byStart.set(key, element);
|
|
194
|
+
}
|
|
195
|
+
elements.push(element);
|
|
196
|
+
if (lines === 0) break;
|
|
197
|
+
}
|
|
198
|
+
for (const key of byStart.keys()) if (!used.has(key)) byStart.delete(key);
|
|
199
|
+
return h(React.Fragment, null, ...elements);
|
|
200
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Text compared the way `String#localeCompare` with no locale compares it,
|
|
2
|
+
// with one collator for every comparison. ECMA-402 defines that call as a
|
|
3
|
+
// new `Intl.Collator()`'s `compare`, and V8 made the collator on every call:
|
|
4
|
+
// most of a 100,000-row table sort, and all of a completion list's with
|
|
5
|
+
// nothing typed yet. Made on first use, so importing constructs nothing.
|
|
6
|
+
|
|
7
|
+
let collator: Intl.Collator | null = null;
|
|
8
|
+
|
|
9
|
+
/** `a.localeCompare(b)`, without a collator a call. */
|
|
10
|
+
export function compareText(a: string, b: string): number {
|
|
11
|
+
return (collator ??= new Intl.Collator()).compare(a, b);
|
|
12
|
+
}
|
|
@@ -253,4 +253,15 @@ export interface ParseOptions {
|
|
|
253
253
|
* evaluates nothing — an expression is kept as source.
|
|
254
254
|
*/
|
|
255
255
|
expressions?: boolean;
|
|
256
|
+
/**
|
|
257
|
+
* What this document last parsed into, when the new source is an edit of
|
|
258
|
+
* that one: the parse then reads only the blocks around the change and
|
|
259
|
+
* takes the rest from `previous`, the same objects. The answer is the
|
|
260
|
+
* one a parse from scratch gives, whatever the edit; `previous` only
|
|
261
|
+
* decides how much of it has to be worked out again. Ignored when it came
|
|
262
|
+
* from different options or from somewhere other than `parse`, and with
|
|
263
|
+
* `isComponent`: a component's open tag looks for its close as far as the
|
|
264
|
+
* end of the document, so no block before an edit is settled.
|
|
265
|
+
*/
|
|
266
|
+
previous?: Document;
|
|
256
267
|
}
|
|
@@ -181,31 +181,168 @@ function indentOf(line: string): number {
|
|
|
181
181
|
|
|
182
182
|
export function parse(source: string, options: ParseOptions = {}): Document {
|
|
183
183
|
const partial = options.partial !== false;
|
|
184
|
+
const isComponent = options.isComponent ?? NO_COMPONENTS;
|
|
185
|
+
const expressions = options.expressions === true;
|
|
184
186
|
const normalized = source.replace(/\r\n?/g, '\n');
|
|
185
187
|
const lines = normalized.split('\n').map(expandLeadingTabs);
|
|
188
|
+
const previous = options.previous;
|
|
189
|
+
const was = previous ? resumable.get(previous) : undefined;
|
|
190
|
+
// Not with components: an open tag looks for its close to the end of the
|
|
191
|
+
// document (`componentCloseLine`), so a close added anywhere below can
|
|
192
|
+
// change what it is, and the block before an edit is no longer settled.
|
|
193
|
+
if (
|
|
194
|
+
previous &&
|
|
195
|
+
was &&
|
|
196
|
+
was.partial === partial &&
|
|
197
|
+
was.expressions === expressions &&
|
|
198
|
+
isComponent === NO_COMPONENTS &&
|
|
199
|
+
was.isComponent === NO_COMPONENTS
|
|
200
|
+
) {
|
|
201
|
+
return resume(previous, was, lines);
|
|
202
|
+
}
|
|
186
203
|
const blocks: BlockNode[] = [];
|
|
187
204
|
const ranges: Array<[number, number]> = [];
|
|
188
|
-
|
|
205
|
+
const blanks = new Uint8Array(lines.length);
|
|
206
|
+
parseBlocks(lines, partial, blocks, ranges, isComponent, expressions, {
|
|
207
|
+
from: 0,
|
|
208
|
+
blanks,
|
|
209
|
+
});
|
|
210
|
+
return remember(
|
|
211
|
+
{ blocks, raws: ranges.map(([a, b]) => lines.slice(a, b).join('\n')) },
|
|
212
|
+
{ lines, ranges, blanks, partial, isComponent, expressions },
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// --- resuming --------------------------------------------------------------
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* What a parse leaves for the next parse of the same document to start from
|
|
220
|
+
* (`ParseOptions.previous`).
|
|
221
|
+
*
|
|
222
|
+
* The block loop carries one thing from a block to the next, the paragraph
|
|
223
|
+
* it is gathering, and it looks only forwards: a block's extent is decided
|
|
224
|
+
* by the lines up to the first line of the block after it. So `blanks`
|
|
225
|
+
* marks the lines where the loop stood on a blank line at the top level with
|
|
226
|
+
* no paragraph open. Two parses standing on such a line, with the same lines
|
|
227
|
+
* from there to the end, produce the same blocks from there on. That is the
|
|
228
|
+
* point where an edit's re-parse can stop and take the rest from before.
|
|
229
|
+
*/
|
|
230
|
+
interface Resumable {
|
|
231
|
+
lines: string[];
|
|
232
|
+
/** each top-level block's [start, endExcl) line range */
|
|
233
|
+
ranges: Array<[number, number]>;
|
|
234
|
+
/** 1 on each line where the top-level loop stood blank with no paragraph */
|
|
235
|
+
blanks: Uint8Array;
|
|
236
|
+
partial: boolean;
|
|
237
|
+
isComponent: (name: string) => boolean;
|
|
238
|
+
expressions: boolean;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/** Kept beside the documents rather than in them, so a Document stays the
|
|
242
|
+
* plain data every caller and test compares. */
|
|
243
|
+
const resumable = new WeakMap<Document, Resumable>();
|
|
244
|
+
|
|
245
|
+
function remember(doc: Document, state: Resumable): Document {
|
|
246
|
+
resumable.set(doc, state);
|
|
247
|
+
return doc;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Parse `lines` as an edit of `previous`: from one block before the first
|
|
252
|
+
* line that changed, until the loop stands where the previous parse stood
|
|
253
|
+
* in the lines the edit left alone — or to the end, when it never does (an
|
|
254
|
+
* unclosed fence swallows the rest of a document either way).
|
|
255
|
+
*/
|
|
256
|
+
function resume(previous: Document, was: Resumable, lines: string[]): Document {
|
|
257
|
+
const old = was.lines;
|
|
258
|
+
const oldN = old.length;
|
|
259
|
+
const n = lines.length;
|
|
260
|
+
const shortest = Math.min(oldN, n);
|
|
261
|
+
let first = 0;
|
|
262
|
+
while (first < shortest && old[first] === lines[first]) first += 1;
|
|
263
|
+
if (first === oldN && first === n) return previous;
|
|
264
|
+
// lines at the end the edit did not touch, never counting the prefix twice
|
|
265
|
+
let same = 0;
|
|
266
|
+
while (
|
|
267
|
+
same < shortest - first &&
|
|
268
|
+
old[oldN - 1 - same] === lines[n - 1 - same]
|
|
269
|
+
) {
|
|
270
|
+
same += 1;
|
|
271
|
+
}
|
|
272
|
+
const shift = n - oldN;
|
|
273
|
+
const suffix = n - same;
|
|
274
|
+
|
|
275
|
+
// The first block that reaches the change, and the one before it: a
|
|
276
|
+
// block's extent is decided by the lines up to the next block's first —
|
|
277
|
+
// a list looks past blank lines to see whether it goes on — so the block
|
|
278
|
+
// before the first one touched cannot have depended on the change.
|
|
279
|
+
const { ranges } = was;
|
|
280
|
+
let lo = 0;
|
|
281
|
+
let hi = ranges.length;
|
|
282
|
+
while (lo < hi) {
|
|
283
|
+
const mid = (lo + hi) >> 1;
|
|
284
|
+
if (ranges[mid][1] <= first) lo = mid + 1;
|
|
285
|
+
else hi = mid;
|
|
286
|
+
}
|
|
287
|
+
const kept = Math.max(0, lo - 1);
|
|
288
|
+
const from = kept === 0 ? 0 : ranges[kept][0];
|
|
289
|
+
|
|
290
|
+
const blanks = new Uint8Array(n);
|
|
291
|
+
blanks.set(was.blanks.subarray(0, from));
|
|
292
|
+
const blocks: BlockNode[] = previous.blocks.slice(0, kept);
|
|
293
|
+
const raws = previous.raws.slice(0, kept);
|
|
294
|
+
const next: Array<[number, number]> = ranges.slice(0, kept);
|
|
295
|
+
const fresh: Array<[number, number]> = [];
|
|
296
|
+
const stop = parseBlocks(
|
|
189
297
|
lines,
|
|
190
|
-
partial,
|
|
298
|
+
was.partial,
|
|
191
299
|
blocks,
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
300
|
+
fresh,
|
|
301
|
+
was.isComponent,
|
|
302
|
+
was.expressions,
|
|
303
|
+
{
|
|
304
|
+
from,
|
|
305
|
+
blanks,
|
|
306
|
+
resync: (i) => i >= suffix && was.blanks[i - shift] === 1,
|
|
307
|
+
},
|
|
195
308
|
);
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
}
|
|
309
|
+
for (const [a, b] of fresh) {
|
|
310
|
+
raws.push(lines.slice(a, b).join('\n'));
|
|
311
|
+
next.push([a, b]);
|
|
312
|
+
}
|
|
313
|
+
if (stop < n) {
|
|
314
|
+
// the previous parse from the same place over the same lines: its
|
|
315
|
+
// blocks, where they now are
|
|
316
|
+
const at = stop - shift;
|
|
317
|
+
blanks.set(was.blanks.subarray(at), stop);
|
|
318
|
+
let j = ranges.length;
|
|
319
|
+
while (j > 0 && ranges[j - 1][0] >= at) j -= 1;
|
|
320
|
+
for (; j < ranges.length; j += 1) {
|
|
321
|
+
blocks.push(previous.blocks[j]);
|
|
322
|
+
raws.push(previous.raws[j]);
|
|
323
|
+
next.push([ranges[j][0] + shift, ranges[j][1] + shift]);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
return remember({ blocks, raws }, { ...was, lines, ranges: next, blanks });
|
|
200
327
|
}
|
|
201
328
|
|
|
202
329
|
// --- block layer -----------------------------------------------------------
|
|
203
330
|
|
|
331
|
+
/** The top-level call's extra: where to start, where to record the blank
|
|
332
|
+
* lines it stands on, and when to stop (`resume`). */
|
|
333
|
+
interface TopLevel {
|
|
334
|
+
from: number;
|
|
335
|
+
blanks: Uint8Array;
|
|
336
|
+
resync?: (line: number) => boolean;
|
|
337
|
+
}
|
|
338
|
+
|
|
204
339
|
/**
|
|
205
340
|
* Parse a run of lines into blocks. `tailOpen` says the end of `lines` is
|
|
206
341
|
* the live end of a streaming document — the license for every "complete it
|
|
207
342
|
* anyway" rule. `ranges`, when given, receives each block's [start, endExcl)
|
|
208
343
|
* line range (only the top-level call wants them, for the streaming cache).
|
|
344
|
+
* Returns the line it stopped at: the end, or where `top.resync` said the
|
|
345
|
+
* rest would come out as it did before.
|
|
209
346
|
*/
|
|
210
347
|
function parseBlocks(
|
|
211
348
|
lines: string[],
|
|
@@ -214,8 +351,9 @@ function parseBlocks(
|
|
|
214
351
|
ranges?: Array<[number, number]>,
|
|
215
352
|
isComponent: (name: string) => boolean = NO_COMPONENTS,
|
|
216
353
|
expressions = false,
|
|
217
|
-
|
|
218
|
-
|
|
354
|
+
top?: TopLevel,
|
|
355
|
+
): number {
|
|
356
|
+
let i = top?.from ?? 0;
|
|
219
357
|
const n = lines.length;
|
|
220
358
|
|
|
221
359
|
let paraStart = -1;
|
|
@@ -245,6 +383,10 @@ function parseBlocks(
|
|
|
245
383
|
|
|
246
384
|
if (RE_BLANK.test(line)) {
|
|
247
385
|
flushPara(i);
|
|
386
|
+
if (top) {
|
|
387
|
+
if (top.resync?.(i)) return i;
|
|
388
|
+
top.blanks[i] = 1;
|
|
389
|
+
}
|
|
248
390
|
i += 1;
|
|
249
391
|
continue;
|
|
250
392
|
}
|
|
@@ -571,6 +713,7 @@ function parseBlocks(
|
|
|
571
713
|
}
|
|
572
714
|
|
|
573
715
|
flushPara(n);
|
|
716
|
+
return n;
|
|
574
717
|
}
|
|
575
718
|
|
|
576
719
|
// --- lists -----------------------------------------------------------------
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// A font family, warmed before the first layout sets text in it.
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import { useApp } from 'react-x11';
|
|
4
|
+
|
|
5
|
+
/** The one method this needs of `app.fonts`, which ntk's FontManager has
|
|
6
|
+
* from the release that added it, and other font managers may not. */
|
|
7
|
+
interface PrewarmingFonts {
|
|
8
|
+
prewarm?: (family: string) => void;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Start matching `family`'s faces now, off the event loop, so that the first
|
|
13
|
+
* layout setting text in it takes the answer instead of stalling on the
|
|
14
|
+
* system's font matcher — ntk's `FontManager#prewarm`. fontconfig answers in
|
|
15
|
+
* 20–40 ms on a Linux desktop and in 80–150 on XQuartz, and nothing warms a
|
|
16
|
+
* family but sans-serif until a layout asks for it.
|
|
17
|
+
*
|
|
18
|
+
* Called while rendering, as React's own resource hints are: a component
|
|
19
|
+
* renders ahead of the frame that lays it out, and a long document's render
|
|
20
|
+
* is hundreds of milliseconds of head start that an effect would give away.
|
|
21
|
+
* Once per family; nothing where the app's fonts have nothing to look up
|
|
22
|
+
* (fonts in memory, a native text engine) or predate the method.
|
|
23
|
+
*/
|
|
24
|
+
export function useFontPrewarm(family: string | null | undefined): void {
|
|
25
|
+
const fonts = (useApp() as { fonts?: PrewarmingFonts } | null)?.fonts;
|
|
26
|
+
useMemo(() => {
|
|
27
|
+
if (family) fonts?.prewarm?.(family);
|
|
28
|
+
}, [fonts, family]);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** The font family a style names, read the way core flattens one — the last
|
|
32
|
+
* entry of an array that names it wins — or `fallback`. */
|
|
33
|
+
export function styleFamily(style: unknown, fallback: string): string {
|
|
34
|
+
let family = fallback;
|
|
35
|
+
const visit = (entry: unknown): void => {
|
|
36
|
+
if (Array.isArray(entry)) {
|
|
37
|
+
for (const e of entry) visit(e);
|
|
38
|
+
} else if (entry && typeof entry === 'object') {
|
|
39
|
+
const named = (entry as { fontFamily?: unknown }).fontFamily;
|
|
40
|
+
if (typeof named === 'string') family = named;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
visit(style);
|
|
44
|
+
return family;
|
|
45
|
+
}
|