@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/flow/types.ts
CHANGED
|
@@ -509,6 +509,12 @@ export interface NodeBodyRect extends FlowRect {
|
|
|
509
509
|
* units. */
|
|
510
510
|
zoom: number;
|
|
511
511
|
selected: boolean;
|
|
512
|
+
/** The whole card the body sits in, in the same frame as the body's rect:
|
|
513
|
+
* `<Flow>` paints it (`paintCard`) under the body, so card and body are
|
|
514
|
+
* stacked together. */
|
|
515
|
+
card: FlowRect;
|
|
516
|
+
/** The pointer is over the node — its card paints its hover border. */
|
|
517
|
+
hovered: boolean;
|
|
512
518
|
}
|
|
513
519
|
|
|
514
520
|
// --- the imperative surface ------------------------------------------------
|
|
@@ -649,11 +655,117 @@ export interface FlowProps<N = FlowNodeData, E = unknown> {
|
|
|
649
655
|
* between the drawn half and the mounted one, and the raw `<flowgraph>`
|
|
650
656
|
* element is the only reason it is a prop rather than a private method.
|
|
651
657
|
*
|
|
658
|
+
* Each rect is relative to `origin`: where the graph's own origin sits in
|
|
659
|
+
* the pane, which is the viewport's translation. A pan moves the origin
|
|
660
|
+
* and nothing else, and re-sends the same `bodies` array — so the bodies
|
|
661
|
+
* can be laid out in one box at `origin` that a pan moves, rather than
|
|
662
|
+
* each moved by a render of its own.
|
|
663
|
+
*
|
|
652
664
|
* `sync` is true when the change came out of a live gesture — a drag
|
|
653
665
|
* step, a wheel tick, an arrow key. Motion dispatches at continuous
|
|
654
666
|
* priority, which React may hold across several frames while the pane
|
|
655
667
|
* paints each step immediately; a gesture-time receiver must commit
|
|
656
668
|
* synchronously or the mounted bodies visibly trail the drawn cards.
|
|
669
|
+
*
|
|
670
|
+
* `held` is true while a zoom is moving: the bodies are to stay mounted
|
|
671
|
+
* and be hidden, and `bodies`/`origin` are the last ones sent, unchanged.
|
|
672
|
+
* The next call, once the zoom has rested, has `held` false and the
|
|
673
|
+
* bodies at the new scale.
|
|
674
|
+
*/
|
|
675
|
+
/**
|
|
676
|
+
* Where the minimap and the controls are, relative to the pane's top-left
|
|
677
|
+
* — sent when that changes. `<Flow>` paints them on canvases of its own
|
|
678
|
+
* over the node bodies (`setPanelCanvases`).
|
|
679
|
+
* @internal
|
|
680
|
+
*/
|
|
681
|
+
onPanels?: (rects: readonly FlowRect[]) => void;
|
|
682
|
+
onNodeBodies?: (
|
|
683
|
+
bodies: readonly NodeBodyRect[],
|
|
684
|
+
sync: boolean,
|
|
685
|
+
origin: XYPosition,
|
|
686
|
+
held: boolean,
|
|
687
|
+
) => void;
|
|
688
|
+
/**
|
|
689
|
+
* Which renderer draws the graph. `'retained'` (the default) draws through
|
|
690
|
+
* the 2D context, everywhere a window can. `'gl'` draws through a
|
|
691
|
+
* `<glarea>`, every frame from the whole scene, and needs direct GL —
|
|
692
|
+
* `useSupports('shaders')`; where it has none, or its surface fails, the
|
|
693
|
+
* pane falls back to `'retained'` and says so through `onError`.
|
|
694
|
+
*
|
|
695
|
+
* **Not yet a replacement.** The GL renderer draws the graph — cards,
|
|
696
|
+
* edges, arrowheads, handles, labels, the grid, the minimap — but not yet
|
|
697
|
+
* a node type's own `paint`, nor a mounted body over the surface. Labels
|
|
698
|
+
* are drawn from distance fields, sharp at every zoom, and a string drawn
|
|
699
|
+
* for the first time arrives a frame or two after the frame that asked
|
|
700
|
+
* for it; `onFrame`'s `gaps` counts what a frame left out.
|
|
701
|
+
* `docs/prd-flow-gl.md` has the plan and the numbers.
|
|
702
|
+
*/
|
|
703
|
+
renderer?: 'retained' | 'gl';
|
|
704
|
+
/**
|
|
705
|
+
* Every frame the pane drew, on either renderer, with what it cost this
|
|
706
|
+
* thread — `<Map onFrame>`'s shape, for the same reason: one callback an
|
|
707
|
+
* application can read an FPS off without caring which renderer drew.
|
|
708
|
+
*
|
|
709
|
+
* A frame, not a paint: the 2D renderer may paint several damage rects in
|
|
710
|
+
* one window flush, and those are reported once, summed. Both renderers
|
|
711
|
+
* draw on change and not otherwise, so an idle pane reports nothing.
|
|
712
|
+
*/
|
|
713
|
+
onFrame?: (stats: FlowFrameStats) => void;
|
|
714
|
+
/**
|
|
715
|
+
* How mounted node bodies ride a zoom gesture. Re-scaling a body is a
|
|
716
|
+
* restyle, a layout and a repaint of its whole subtree on every step —
|
|
717
|
+
* about a millisecond each — so each step predicts what the bodies on
|
|
718
|
+
* screen would add, and over the budget they sit the gesture out: mounted,
|
|
719
|
+
* state intact, off screen, back at the new scale once the zoom rests.
|
|
720
|
+
*
|
|
721
|
+
* `true` (the default) budgets 8 ms a step; `{ budgetMs }` picks another,
|
|
722
|
+
* `0` holding them through every gesture zoom; `false` never holds them —
|
|
723
|
+
* every body zooms live, whatever it costs. A pan or a programmatic
|
|
724
|
+
* viewport change never holds them.
|
|
657
725
|
*/
|
|
658
|
-
|
|
726
|
+
adaptive?: boolean | { budgetMs?: number };
|
|
727
|
+
/** The GL renderer could not draw, and the pane went back to the 2D one. */
|
|
728
|
+
onError?: (error: Error) => void;
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
/** One frame — see {@link FlowProps.onFrame}. The draw-call and buffer
|
|
732
|
+
* counts are the GL renderer's, and always `0` on the retained one. */
|
|
733
|
+
export interface FlowFrameStats {
|
|
734
|
+
/** Which renderer drew the frame. */
|
|
735
|
+
renderer: 'retained' | 'gl';
|
|
736
|
+
/** Milliseconds building the scene: routing, culling, colours. */
|
|
737
|
+
sceneMs: number;
|
|
738
|
+
/** Milliseconds packing it into instance streams — `0` on the retained
|
|
739
|
+
* renderer, which packs nothing. */
|
|
740
|
+
packMs: number;
|
|
741
|
+
/** Milliseconds issuing it: the 2D calls, or the uploads and draws. */
|
|
742
|
+
drawMs: number;
|
|
743
|
+
drawCalls: number;
|
|
744
|
+
lines: number;
|
|
745
|
+
boxes: number;
|
|
746
|
+
triangles: number;
|
|
747
|
+
/** Bytes handed to the GPU this frame. */
|
|
748
|
+
uploadBytes: number;
|
|
749
|
+
/** Whether the graph was rebuilt and re-uploaded this frame, rather than
|
|
750
|
+
* drawn from the GPU where a pan moved it. False on a pan. */
|
|
751
|
+
worldRebuilt: boolean;
|
|
752
|
+
/** What the frame could not draw yet: strings, and nodes whose type
|
|
753
|
+
* paints itself. */
|
|
754
|
+
gaps: { text: number; custom: number };
|
|
755
|
+
/** The mounted bodies' budget (`adaptive`) as the frame found it. */
|
|
756
|
+
bodies: FlowBodyBudget;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
/** Where mounted node bodies stand against `adaptive`'s budget. */
|
|
760
|
+
export interface FlowBodyBudget {
|
|
761
|
+
/** Bodies on screen. */
|
|
762
|
+
count: number;
|
|
763
|
+
/** Sitting the current zoom gesture out. */
|
|
764
|
+
held: boolean;
|
|
765
|
+
/** What re-scaling one body adds to a zoom step, learned from frames. */
|
|
766
|
+
perBodyMs: number;
|
|
767
|
+
/** `count × perBodyMs`: what a zoom step would pay to re-scale them. */
|
|
768
|
+
predictedMs: number;
|
|
769
|
+
/** The budget that is held against — `Infinity` when `adaptive` is off. */
|
|
770
|
+
budgetMs: number;
|
|
659
771
|
}
|
package/src/html/controls.ts
CHANGED
|
@@ -23,6 +23,7 @@ import type { Element } from 'domhandler';
|
|
|
23
23
|
|
|
24
24
|
import { attr, tagOf } from './dom.js';
|
|
25
25
|
import type { ComputedStyle } from './css/style.js';
|
|
26
|
+
import { isTransparent } from './css/values.js';
|
|
26
27
|
import type { BoxTree, ReplacedKind } from './layout/boxes.js';
|
|
27
28
|
import type { FontsLike } from './layout/inline.js';
|
|
28
29
|
|
|
@@ -46,6 +47,24 @@ export interface ControlRect {
|
|
|
46
47
|
y: number;
|
|
47
48
|
width: number;
|
|
48
49
|
height: number;
|
|
50
|
+
/**
|
|
51
|
+
* Set on a text field whose own box the author styled — gave it a border
|
|
52
|
+
* or a background (`styledField`). The document draws that box, and the
|
|
53
|
+
* widget goes bare inside its content box, here, with no frame or fill
|
|
54
|
+
* of its own and its text in the element's colour and font.
|
|
55
|
+
*/
|
|
56
|
+
bare?: BareField;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Where a styled text field's widget goes, and how its text looks. */
|
|
60
|
+
export interface BareField {
|
|
61
|
+
x: number;
|
|
62
|
+
y: number;
|
|
63
|
+
width: number;
|
|
64
|
+
height: number;
|
|
65
|
+
color: string;
|
|
66
|
+
fontFamily: string;
|
|
67
|
+
fontSize: number;
|
|
49
68
|
}
|
|
50
69
|
|
|
51
70
|
/** The rectangles every control in a laid-out document landed on. */
|
|
@@ -54,18 +73,59 @@ export function controlRectsOf(tree: BoxTree): ControlRect[] {
|
|
|
54
73
|
for (const box of tree.controls) {
|
|
55
74
|
if (!box.el) continue;
|
|
56
75
|
if (box.width <= 0 || box.height <= 0) continue;
|
|
57
|
-
|
|
76
|
+
const rect: ControlRect = {
|
|
58
77
|
element: box.el,
|
|
59
78
|
kind: box.replaced,
|
|
60
79
|
x: box.x,
|
|
61
80
|
y: box.y,
|
|
62
81
|
width: box.width,
|
|
63
82
|
height: box.height,
|
|
64
|
-
}
|
|
83
|
+
};
|
|
84
|
+
if (styledField(box.replaced, box.style)) {
|
|
85
|
+
rect.bare = {
|
|
86
|
+
x: box.contentX,
|
|
87
|
+
y: box.contentY,
|
|
88
|
+
width: box.contentWidth,
|
|
89
|
+
height: box.contentHeight,
|
|
90
|
+
color: box.style.color,
|
|
91
|
+
fontFamily: box.style.fontFamily,
|
|
92
|
+
fontSize: box.style.fontSize,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
out.push(rect);
|
|
65
96
|
}
|
|
66
97
|
return out;
|
|
67
98
|
}
|
|
68
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Whether a text field's box is the author's to draw: one given a border or
|
|
102
|
+
* a background of its own, which the UA sheet gives no control, or set to
|
|
103
|
+
* `appearance: none`, which says so outright. A browser drops a field's
|
|
104
|
+
* native look for the author's then (CSS UI 4 7.1, `appearance`), and so
|
|
105
|
+
* does this: the widget's frame and fill would hide the author's, and what
|
|
106
|
+
* they would draw is the theme's rather than the page's. `appearance: none`
|
|
107
|
+
* is how a design system writes every field it has — meetup.com's search
|
|
108
|
+
* pill holds two with no background, only one of them with a border.
|
|
109
|
+
*/
|
|
110
|
+
export function styledField(kind: ReplacedKind, style: ComputedStyle): boolean {
|
|
111
|
+
if (kind !== 'input' && kind !== 'textarea') return false;
|
|
112
|
+
return (
|
|
113
|
+
style.appearance === 'none' ||
|
|
114
|
+
!isTransparent(style.backgroundColor) ||
|
|
115
|
+
!!style.backgroundImage ||
|
|
116
|
+
!!style.backgroundGradient ||
|
|
117
|
+
!!style.backgroundImages ||
|
|
118
|
+
edged(style.borderTopStyle, style.borderTopWidth) ||
|
|
119
|
+
edged(style.borderRightStyle, style.borderRightWidth) ||
|
|
120
|
+
edged(style.borderBottomStyle, style.borderBottomWidth) ||
|
|
121
|
+
edged(style.borderLeftStyle, style.borderLeftWidth)
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function edged(style: ComputedStyle['borderTopStyle'], width: number): boolean {
|
|
126
|
+
return style !== 'none' && style !== 'hidden' && width > 0;
|
|
127
|
+
}
|
|
128
|
+
|
|
69
129
|
/**
|
|
70
130
|
* The size a control's box takes in the flow.
|
|
71
131
|
*
|
|
@@ -119,9 +179,17 @@ export function measureControl(
|
|
|
119
179
|
height: lineHeight + chrome,
|
|
120
180
|
};
|
|
121
181
|
}
|
|
182
|
+
// a field the author drew the box of is its text and no more, as a
|
|
183
|
+
// browser's is: the room around it is the author's border and padding
|
|
122
184
|
case 'textarea': {
|
|
123
185
|
const cols = numberAttr(el, 'cols') ?? 30;
|
|
124
186
|
const rows = numberAttr(el, 'rows') ?? 3;
|
|
187
|
+
if (styledField(kind, style)) {
|
|
188
|
+
return {
|
|
189
|
+
width: Math.round(ch * cols),
|
|
190
|
+
height: Math.round(lineHeight * rows),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
125
193
|
return {
|
|
126
194
|
width: Math.round(ch * cols + padding * 2 + chrome),
|
|
127
195
|
height: Math.round(lineHeight * rows + chrome),
|
|
@@ -129,6 +197,9 @@ export function measureControl(
|
|
|
129
197
|
}
|
|
130
198
|
case 'input': {
|
|
131
199
|
const size = numberAttr(el, 'size') ?? 20;
|
|
200
|
+
if (styledField(kind, style)) {
|
|
201
|
+
return { width: Math.round(ch * size), height: lineHeight };
|
|
202
|
+
}
|
|
132
203
|
return {
|
|
133
204
|
width: Math.round(ch * size + padding * 2 + chrome),
|
|
134
205
|
height: lineHeight + chrome,
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
// `calc()`, `min()`, `max()` and `clamp()` (CSS Values 4 10), read down to
|
|
2
|
+
// what a length here can hold: device pixels, or a percentage of what
|
|
3
|
+
// layout knows with pixels added (`Pct.px`) — every `calc()` that adds and
|
|
4
|
+
// scales, which is what documents write: `calc(100% - 2em)`. A comparison
|
|
5
|
+
// with a percentage in it, `min(100%, 600px)`, is a different sum at every
|
|
6
|
+
// width, and is kept as one (`Pct.of`) for layout to resolve; sums and
|
|
7
|
+
// scales distribute into it, so `calc(min(100%, 600px) - 2rem)` is
|
|
8
|
+
// `min(100% - 2rem, 600px - 2rem)`.
|
|
9
|
+
|
|
10
|
+
import type { Len } from './values.js';
|
|
11
|
+
|
|
12
|
+
/** A sum: a number, or a length as pixels plus a percentage. */
|
|
13
|
+
interface Linear {
|
|
14
|
+
kind: 'linear';
|
|
15
|
+
length: boolean;
|
|
16
|
+
px: number;
|
|
17
|
+
pct: number;
|
|
18
|
+
/** A percentage was written, even where the sum cancels it: against a
|
|
19
|
+
* height nothing sets, `calc(40px + 10% - 20% / 2)` is still `auto`. */
|
|
20
|
+
hasPct: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** `min()` or `max()` of lengths, a percentage among them. */
|
|
24
|
+
interface Compare {
|
|
25
|
+
kind: 'compare';
|
|
26
|
+
max: boolean;
|
|
27
|
+
args: Term[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
type Term = Linear | Compare;
|
|
31
|
+
|
|
32
|
+
type Token =
|
|
33
|
+
| { t: 'num'; value: number; unit: string }
|
|
34
|
+
| { t: 'op'; value: '+' | '-' | '*' | '/' }
|
|
35
|
+
| { t: 'open'; fn: string }
|
|
36
|
+
| { t: 'close' }
|
|
37
|
+
| { t: 'comma' }
|
|
38
|
+
| { t: 'space' };
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* A math function's value as a length, or null where it is none — a
|
|
42
|
+
* number, a type that does not add up, a division by zero. `dimension`
|
|
43
|
+
* reads one `10px` or `2em` as this package's lengths do.
|
|
44
|
+
*/
|
|
45
|
+
export function parseMath(
|
|
46
|
+
value: string,
|
|
47
|
+
dimension: (token: string) => number | null,
|
|
48
|
+
): Len | null {
|
|
49
|
+
const term = parseTerm(value, dimension);
|
|
50
|
+
if (!term || !isLength(term)) return null;
|
|
51
|
+
return toLen(term);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** A math function's value as a number (`calc(1 + 0.5)`), or null. */
|
|
55
|
+
export function parseMathNumber(value: string): number | null {
|
|
56
|
+
const term = parseTerm(value, () => null);
|
|
57
|
+
if (!term || term.kind !== 'linear' || term.length) return null;
|
|
58
|
+
return censor(term.px);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function parseTerm(
|
|
62
|
+
value: string,
|
|
63
|
+
dimension: (token: string) => number | null,
|
|
64
|
+
): Term | null {
|
|
65
|
+
const tokens = tokenize(value);
|
|
66
|
+
if (!tokens) return null;
|
|
67
|
+
const parser = new Parser(tokens, dimension);
|
|
68
|
+
const term = parser.value();
|
|
69
|
+
return term && parser.pos === tokens.length ? term : null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function isLength(term: Term): boolean {
|
|
73
|
+
return term.kind === 'linear' ? term.length : true;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function toLen(term: Term): Len | null {
|
|
77
|
+
if (term.kind === 'compare') {
|
|
78
|
+
const args: Len[] = [];
|
|
79
|
+
for (const arg of term.args) {
|
|
80
|
+
const len = toLen(arg);
|
|
81
|
+
if (len === null) return null;
|
|
82
|
+
args.push(len);
|
|
83
|
+
}
|
|
84
|
+
return { pct: 0, of: { max: term.max, args } };
|
|
85
|
+
}
|
|
86
|
+
if (!term.hasPct) return censor(term.px);
|
|
87
|
+
return { pct: censor(term.pct), px: censor(term.px) };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const NUMBER = /^[+-]?(?:\d*\.\d+|\d+)(?:e[+-]?\d+)?/;
|
|
91
|
+
|
|
92
|
+
const CONSTANT = /^(?:-?infinity|nan|pi|e)(?![a-z0-9_(-])/;
|
|
93
|
+
|
|
94
|
+
const CONSTANTS: Record<string, number> = {
|
|
95
|
+
infinity: Infinity,
|
|
96
|
+
'-infinity': -Infinity,
|
|
97
|
+
nan: NaN,
|
|
98
|
+
pi: Math.PI,
|
|
99
|
+
e: Math.E,
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* What a calculation that is no finite number comes to (CSS Values 4,
|
|
104
|
+
* 10.9): NaN is 0, and an infinity the largest length there is — which,
|
|
105
|
+
* as in a browser, is still a length: a radius of it is a pill.
|
|
106
|
+
*/
|
|
107
|
+
function censor(n: number): number {
|
|
108
|
+
if (Number.isNaN(n)) return 0;
|
|
109
|
+
if (n === Infinity) return LARGEST;
|
|
110
|
+
if (n === -Infinity) return -LARGEST;
|
|
111
|
+
return n;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** The largest length a browser holds, 2^25 pixels less a little: what a
|
|
115
|
+
* calculation's infinity comes to, and what any length is kept within
|
|
116
|
+
* (`parseLength`, `resolve`). */
|
|
117
|
+
export const LARGEST = 33554428;
|
|
118
|
+
|
|
119
|
+
function tokenize(text: string): Token[] | null {
|
|
120
|
+
const out: Token[] = [];
|
|
121
|
+
let i = 0;
|
|
122
|
+
while (i < text.length) {
|
|
123
|
+
const c = text[i];
|
|
124
|
+
if (c === ' ' || c === '\t' || c === '\n' || c === '\r' || c === '\f') {
|
|
125
|
+
while (i < text.length && /[ \t\n\r\f]/.test(text[i])) i += 1;
|
|
126
|
+
if (out.length && out[out.length - 1].t !== 'space') {
|
|
127
|
+
out.push({ t: 'space' });
|
|
128
|
+
}
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (c === '(') {
|
|
132
|
+
out.push({ t: 'open', fn: '' });
|
|
133
|
+
i += 1;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (c === ')' || c === ',') {
|
|
137
|
+
if (out.length && out[out.length - 1].t === 'space') out.pop();
|
|
138
|
+
out.push(c === ')' ? { t: 'close' } : { t: 'comma' });
|
|
139
|
+
i += 1;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (c === '*' || c === '/') {
|
|
143
|
+
out.push({ t: 'op', value: c });
|
|
144
|
+
i += 1;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
// a sign belongs to the number after it, as the tokenizer reads it:
|
|
148
|
+
// `1px -2px` is two values, and `1px - 2px` a difference
|
|
149
|
+
const m = NUMBER.exec(text.slice(i));
|
|
150
|
+
if (m) {
|
|
151
|
+
i += m[0].length;
|
|
152
|
+
const unit = /^(?:%|[a-z]+)/.exec(text.slice(i))?.[0] ?? '';
|
|
153
|
+
i += unit.length;
|
|
154
|
+
out.push({ t: 'num', value: Number(m[0]), unit });
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const name = /^-?[a-z][a-z0-9-]*\(/.exec(text.slice(i))?.[0];
|
|
158
|
+
if (name) {
|
|
159
|
+
out.push({ t: 'open', fn: name.slice(0, -1) });
|
|
160
|
+
i += name.length;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
// the numbers CSS Values 4 names (10.7.1): Tailwind 4 writes a pill's
|
|
164
|
+
// radius as `calc(infinity * 1px)`
|
|
165
|
+
const constant = CONSTANT.exec(text.slice(i))?.[0];
|
|
166
|
+
if (constant) {
|
|
167
|
+
out.push({ t: 'num', value: CONSTANTS[constant], unit: '' });
|
|
168
|
+
i += constant.length;
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (c === '+' || c === '-') {
|
|
172
|
+
out.push({ t: 'op', value: c });
|
|
173
|
+
i += 1;
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
return out;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
class Parser {
|
|
182
|
+
pos = 0;
|
|
183
|
+
constructor(
|
|
184
|
+
private tokens: Token[],
|
|
185
|
+
private dimension: (token: string) => number | null,
|
|
186
|
+
) {}
|
|
187
|
+
|
|
188
|
+
private peek(): Token | undefined {
|
|
189
|
+
return this.tokens[this.pos];
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
private skipSpace(): void {
|
|
193
|
+
if (this.peek()?.t === 'space') this.pos += 1;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/** A whole math function, `calc(…)` and the rest. */
|
|
197
|
+
value(): Term | null {
|
|
198
|
+
this.skipSpace();
|
|
199
|
+
const open = this.peek();
|
|
200
|
+
if (open?.t !== 'open' || !open.fn) return null;
|
|
201
|
+
const term = this.fn();
|
|
202
|
+
this.skipSpace();
|
|
203
|
+
return term;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
private fn(): Term | null {
|
|
207
|
+
const open = this.tokens[this.pos] as { t: 'open'; fn: string };
|
|
208
|
+
this.pos += 1;
|
|
209
|
+
const fn = open.fn.replace(/^-webkit-/, '');
|
|
210
|
+
const args: Term[] = [];
|
|
211
|
+
for (;;) {
|
|
212
|
+
const sum = this.sum();
|
|
213
|
+
if (!sum) return null;
|
|
214
|
+
args.push(sum);
|
|
215
|
+
const next = this.peek();
|
|
216
|
+
if (next?.t === 'comma') {
|
|
217
|
+
this.pos += 1;
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
if (next?.t !== 'close') return null;
|
|
221
|
+
this.pos += 1;
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
switch (fn) {
|
|
225
|
+
case '':
|
|
226
|
+
case 'calc':
|
|
227
|
+
return args.length === 1 ? args[0] : null;
|
|
228
|
+
case 'min':
|
|
229
|
+
case 'max':
|
|
230
|
+
return compare(args, fn === 'max');
|
|
231
|
+
case 'clamp': {
|
|
232
|
+
if (args.length !== 3) return null;
|
|
233
|
+
const upper = compare([args[1], args[2]], false);
|
|
234
|
+
return upper && compare([args[0], upper], true);
|
|
235
|
+
}
|
|
236
|
+
default:
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
private sum(): Term | null {
|
|
242
|
+
this.skipSpace();
|
|
243
|
+
let left = this.product();
|
|
244
|
+
if (!left) return null;
|
|
245
|
+
for (;;) {
|
|
246
|
+
const at = this.pos;
|
|
247
|
+
// `+` and `-` need white space on both sides
|
|
248
|
+
if (this.peek()?.t !== 'space') break;
|
|
249
|
+
this.pos += 1;
|
|
250
|
+
const op = this.peek();
|
|
251
|
+
if (op?.t !== 'op' || (op.value !== '+' && op.value !== '-')) {
|
|
252
|
+
this.pos = at;
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
this.pos += 1;
|
|
256
|
+
if (this.peek()?.t !== 'space') return null;
|
|
257
|
+
this.pos += 1;
|
|
258
|
+
const right = this.product();
|
|
259
|
+
if (!right) return null;
|
|
260
|
+
left = add(left, right, op.value === '+' ? 1 : -1);
|
|
261
|
+
if (!left) return null;
|
|
262
|
+
}
|
|
263
|
+
this.skipSpace();
|
|
264
|
+
return left;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
private product(): Term | null {
|
|
268
|
+
let left = this.unit();
|
|
269
|
+
if (!left) return null;
|
|
270
|
+
for (;;) {
|
|
271
|
+
const at = this.pos;
|
|
272
|
+
this.skipSpace();
|
|
273
|
+
const op = this.peek();
|
|
274
|
+
if (op?.t !== 'op' || (op.value !== '*' && op.value !== '/')) {
|
|
275
|
+
this.pos = at;
|
|
276
|
+
return left;
|
|
277
|
+
}
|
|
278
|
+
this.pos += 1;
|
|
279
|
+
this.skipSpace();
|
|
280
|
+
const right = this.unit();
|
|
281
|
+
if (!right) return null;
|
|
282
|
+
if (op.value === '*') {
|
|
283
|
+
// one side a number, which scales the other
|
|
284
|
+
if (isNumber(left)) left = scale(right, left.px);
|
|
285
|
+
else if (isNumber(right)) left = scale(left, right.px);
|
|
286
|
+
else return null;
|
|
287
|
+
} else {
|
|
288
|
+
if (!isNumber(right) || right.px === 0) return null;
|
|
289
|
+
left = scale(left, 1 / right.px);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
private unit(): Term | null {
|
|
295
|
+
const token = this.peek();
|
|
296
|
+
if (!token) return null;
|
|
297
|
+
if (token.t === 'open') return this.fn();
|
|
298
|
+
if (token.t !== 'num') return null;
|
|
299
|
+
this.pos += 1;
|
|
300
|
+
if (token.unit === '') return linear(false, token.value, 0, false);
|
|
301
|
+
if (token.unit === '%') return linear(true, 0, token.value, true);
|
|
302
|
+
const px = this.dimension(`${token.value}${token.unit}`);
|
|
303
|
+
return px === null ? null : linear(true, px, 0, false);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
function linear(
|
|
308
|
+
length: boolean,
|
|
309
|
+
px: number,
|
|
310
|
+
pct: number,
|
|
311
|
+
hasPct: boolean,
|
|
312
|
+
): Linear {
|
|
313
|
+
return { kind: 'linear', length, px, pct, hasPct };
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
function isNumber(term: Term): term is Linear {
|
|
317
|
+
return term.kind === 'linear' && !term.length;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/** `a + b`, or `a - b` for a sign of -1, distributed into a comparison. */
|
|
321
|
+
function add(a: Term, b: Term, sign: 1 | -1): Term | null {
|
|
322
|
+
if (isLength(a) !== isLength(b)) return null;
|
|
323
|
+
if (a.kind === 'compare') {
|
|
324
|
+
const args: Term[] = [];
|
|
325
|
+
for (const arg of a.args) {
|
|
326
|
+
const sum = add(arg, b, sign);
|
|
327
|
+
if (!sum) return null;
|
|
328
|
+
args.push(sum);
|
|
329
|
+
}
|
|
330
|
+
return { kind: 'compare', max: a.max, args };
|
|
331
|
+
}
|
|
332
|
+
if (b.kind === 'compare') {
|
|
333
|
+
// `a - min(x, y)` is `max(a - x, a - y)`
|
|
334
|
+
const args: Term[] = [];
|
|
335
|
+
for (const arg of b.args) {
|
|
336
|
+
const sum = add(a, arg, sign);
|
|
337
|
+
if (!sum) return null;
|
|
338
|
+
args.push(sum);
|
|
339
|
+
}
|
|
340
|
+
return { kind: 'compare', max: sign === 1 ? b.max : !b.max, args };
|
|
341
|
+
}
|
|
342
|
+
return linear(
|
|
343
|
+
a.length,
|
|
344
|
+
a.px + sign * b.px,
|
|
345
|
+
a.pct + sign * b.pct,
|
|
346
|
+
a.hasPct || b.hasPct,
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/** `term * k`, distributed into a comparison, which a negative `k` turns
|
|
351
|
+
* over. */
|
|
352
|
+
function scale(term: Term, k: number): Term {
|
|
353
|
+
if (term.kind === 'compare') {
|
|
354
|
+
return {
|
|
355
|
+
kind: 'compare',
|
|
356
|
+
max: k < 0 ? !term.max : term.max,
|
|
357
|
+
args: term.args.map((arg) => scale(arg, k)),
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
// nought stays nought, so that an infinity scaling a length is not also
|
|
361
|
+
// a NaN of the percentage it has none of
|
|
362
|
+
return linear(
|
|
363
|
+
term.length,
|
|
364
|
+
term.px === 0 ? 0 : term.px * k,
|
|
365
|
+
term.pct === 0 ? 0 : term.pct * k,
|
|
366
|
+
term.hasPct,
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/** `min()` or `max()` of terms of one type: a number where no percentage
|
|
371
|
+
* is among them, and a comparison for layout where one is. */
|
|
372
|
+
function compare(args: Term[], max: boolean): Term | null {
|
|
373
|
+
const length = isLength(args[0]);
|
|
374
|
+
if (args.some((a) => isLength(a) !== length)) return null;
|
|
375
|
+
if (args.every((a) => a.kind === 'linear' && !a.hasPct)) {
|
|
376
|
+
const values = args.map((a) => (a as Linear).px);
|
|
377
|
+
return linear(
|
|
378
|
+
length,
|
|
379
|
+
max ? Math.max(...values) : Math.min(...values),
|
|
380
|
+
0,
|
|
381
|
+
false,
|
|
382
|
+
);
|
|
383
|
+
}
|
|
384
|
+
return { kind: 'compare', max, args };
|
|
385
|
+
}
|