@react-x11/components 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -38
- package/dist/charts/node.d.ts +12 -2
- package/dist/charts/node.d.ts.map +1 -1
- package/dist/charts/node.js +50 -16
- package/dist/charts/node.js.map +1 -1
- package/dist/charts/render.d.ts +12 -3
- package/dist/charts/render.d.ts.map +1 -1
- package/dist/charts/render.js +94 -25
- package/dist/charts/render.js.map +1 -1
- package/dist/code/index.d.ts.map +1 -1
- package/dist/code/index.js +3 -1
- package/dist/code/index.js.map +1 -1
- package/dist/code-editor/completion.d.ts.map +1 -1
- package/dist/code-editor/completion.js +3 -2
- package/dist/code-editor/completion.js.map +1 -1
- package/dist/code-editor/index.d.ts.map +1 -1
- package/dist/code-editor/index.js +19 -0
- package/dist/code-editor/index.js.map +1 -1
- package/dist/code-editor/node.d.ts +177 -7
- package/dist/code-editor/node.d.ts.map +1 -1
- package/dist/code-editor/node.js +1329 -164
- package/dist/code-editor/node.js.map +1 -1
- package/dist/code-language/languages/glsl.d.ts.map +1 -1
- package/dist/code-language/languages/glsl.js +10 -2
- package/dist/code-language/languages/glsl.js.map +1 -1
- package/dist/code-language/languages/javascript.d.ts.map +1 -1
- package/dist/code-language/languages/javascript.js +18 -3
- package/dist/code-language/languages/javascript.js.map +1 -1
- package/dist/code-language/languages/json.d.ts.map +1 -1
- package/dist/code-language/languages/json.js +10 -2
- package/dist/code-language/languages/json.js.map +1 -1
- package/dist/code-language/languages/shell.d.ts.map +1 -1
- package/dist/code-language/languages/shell.js +10 -2
- package/dist/code-language/languages/shell.js.map +1 -1
- package/dist/code-language/languages/sql.d.ts.map +1 -1
- package/dist/code-language/languages/sql.js +20 -2
- package/dist/code-language/languages/sql.js.map +1 -1
- package/dist/code-language/stream.d.ts +22 -0
- package/dist/code-language/stream.d.ts.map +1 -1
- package/dist/code-language/stream.js +259 -9
- package/dist/code-language/stream.js.map +1 -1
- package/dist/code-language/types.d.ts +5 -4
- package/dist/code-language/types.d.ts.map +1 -1
- package/dist/codeblock/index.d.ts +13 -2
- package/dist/codeblock/index.d.ts.map +1 -1
- package/dist/codeblock/index.js +20 -3
- package/dist/codeblock/index.js.map +1 -1
- package/dist/embed/client.d.ts +48 -3
- package/dist/embed/client.d.ts.map +1 -1
- package/dist/embed/client.js +79 -5
- package/dist/embed/client.js.map +1 -1
- package/dist/embed/index.d.ts +1 -1
- package/dist/embed/index.d.ts.map +1 -1
- package/dist/embed/index.js +1 -1
- package/dist/embed/index.js.map +1 -1
- package/dist/flow/draw.d.ts +50 -0
- package/dist/flow/draw.d.ts.map +1 -1
- package/dist/flow/draw.js +132 -33
- package/dist/flow/draw.js.map +1 -1
- package/dist/flow/gl/color.d.ts +13 -0
- package/dist/flow/gl/color.d.ts.map +1 -0
- package/dist/flow/gl/color.js +82 -0
- package/dist/flow/gl/color.js.map +1 -0
- package/dist/flow/gl/index.d.ts +60 -0
- package/dist/flow/gl/index.d.ts.map +1 -0
- package/dist/flow/gl/index.js +283 -0
- package/dist/flow/gl/index.js.map +1 -0
- package/dist/flow/gl/pack.d.ts +133 -0
- package/dist/flow/gl/pack.d.ts.map +1 -0
- package/dist/flow/gl/pack.js +408 -0
- package/dist/flow/gl/pack.js.map +1 -0
- package/dist/flow/gl/renderer.d.ts +95 -0
- package/dist/flow/gl/renderer.d.ts.map +1 -0
- package/dist/flow/gl/renderer.js +459 -0
- package/dist/flow/gl/renderer.js.map +1 -0
- package/dist/flow/gl/shaders.d.ts +79 -0
- package/dist/flow/gl/shaders.d.ts.map +1 -0
- package/dist/flow/gl/shaders.js +346 -0
- package/dist/flow/gl/shaders.js.map +1 -0
- package/dist/flow/gl/text.d.ts +318 -0
- package/dist/flow/gl/text.d.ts.map +1 -0
- package/dist/flow/gl/text.js +1103 -0
- package/dist/flow/gl/text.js.map +1 -0
- package/dist/flow/index.d.ts +1 -1
- package/dist/flow/index.d.ts.map +1 -1
- package/dist/flow/index.js +619 -64
- package/dist/flow/index.js.map +1 -1
- package/dist/flow/node.d.ts +621 -72
- package/dist/flow/node.d.ts.map +1 -1
- package/dist/flow/node.js +2253 -1018
- package/dist/flow/node.js.map +1 -1
- package/dist/flow/paint.d.ts +35 -0
- package/dist/flow/paint.d.ts.map +1 -0
- package/dist/flow/paint.js +393 -0
- package/dist/flow/paint.js.map +1 -0
- package/dist/flow/paths.d.ts +14 -0
- package/dist/flow/paths.d.ts.map +1 -1
- package/dist/flow/paths.js +45 -19
- package/dist/flow/paths.js.map +1 -1
- package/dist/flow/scene.d.ts +584 -0
- package/dist/flow/scene.d.ts.map +1 -0
- package/dist/flow/scene.js +1453 -0
- package/dist/flow/scene.js.map +1 -0
- package/dist/flow/types.d.ts +111 -1
- package/dist/flow/types.d.ts.map +1 -1
- package/dist/html/controls.d.ts +28 -0
- package/dist/html/controls.d.ts.map +1 -1
- package/dist/html/controls.js +52 -2
- package/dist/html/controls.js.map +1 -1
- package/dist/html/css/calc.d.ts +14 -0
- package/dist/html/css/calc.d.ts.map +1 -0
- package/dist/html/css/calc.js +344 -0
- package/dist/html/css/calc.js.map +1 -0
- package/dist/html/css/cascade.d.ts +240 -6
- package/dist/html/css/cascade.d.ts.map +1 -1
- package/dist/html/css/cascade.js +1327 -66
- package/dist/html/css/cascade.js.map +1 -1
- package/dist/html/css/color.d.ts +23 -0
- package/dist/html/css/color.d.ts.map +1 -0
- package/dist/html/css/color.js +740 -0
- package/dist/html/css/color.js.map +1 -0
- package/dist/html/css/content.d.ts +92 -0
- package/dist/html/css/content.d.ts.map +1 -0
- package/dist/html/css/content.js +388 -0
- package/dist/html/css/content.js.map +1 -0
- package/dist/html/css/counter-styles.d.ts +76 -0
- package/dist/html/css/counter-styles.d.ts.map +1 -0
- package/dist/html/css/counter-styles.js +893 -0
- package/dist/html/css/counter-styles.js.map +1 -0
- package/dist/html/css/decode.d.ts +12 -0
- package/dist/html/css/decode.d.ts.map +1 -0
- package/dist/html/css/decode.js +116 -0
- package/dist/html/css/decode.js.map +1 -0
- package/dist/html/css/parse.d.ts +110 -10
- package/dist/html/css/parse.d.ts.map +1 -1
- package/dist/html/css/parse.js +1473 -180
- package/dist/html/css/parse.js.map +1 -1
- package/dist/html/css/style.d.ts +498 -15
- package/dist/html/css/style.d.ts.map +1 -1
- package/dist/html/css/style.js +3698 -206
- package/dist/html/css/style.js.map +1 -1
- package/dist/html/css/ua.d.ts.map +1 -1
- package/dist/html/css/ua.js +57 -11
- package/dist/html/css/ua.js.map +1 -1
- package/dist/html/css/values.d.ts +37 -3
- package/dist/html/css/values.d.ts.map +1 -1
- package/dist/html/css/values.js +122 -48
- package/dist/html/css/values.js.map +1 -1
- package/dist/html/css/vars.d.ts +52 -0
- package/dist/html/css/vars.d.ts.map +1 -0
- package/dist/html/css/vars.js +358 -0
- package/dist/html/css/vars.js.map +1 -0
- package/dist/html/dom.d.ts +30 -4
- package/dist/html/dom.d.ts.map +1 -1
- package/dist/html/dom.js +278 -17
- package/dist/html/dom.js.map +1 -1
- package/dist/html/fonts.d.ts +106 -0
- package/dist/html/fonts.d.ts.map +1 -0
- package/dist/html/fonts.js +565 -0
- package/dist/html/fonts.js.map +1 -0
- package/dist/html/gif.d.ts +15 -0
- package/dist/html/gif.d.ts.map +1 -0
- package/dist/html/gif.js +229 -0
- package/dist/html/gif.js.map +1 -0
- package/dist/html/index.d.ts +50 -11
- package/dist/html/index.d.ts.map +1 -1
- package/dist/html/index.js +115 -9
- package/dist/html/index.js.map +1 -1
- package/dist/html/layout/block.d.ts +226 -3
- package/dist/html/layout/block.d.ts.map +1 -1
- package/dist/html/layout/block.js +2937 -197
- package/dist/html/layout/block.js.map +1 -1
- package/dist/html/layout/boxes.d.ts +340 -17
- package/dist/html/layout/boxes.d.ts.map +1 -1
- package/dist/html/layout/boxes.js +1714 -182
- package/dist/html/layout/boxes.js.map +1 -1
- package/dist/html/layout/cache.d.ts +58 -0
- package/dist/html/layout/cache.d.ts.map +1 -0
- package/dist/html/layout/cache.js +224 -0
- package/dist/html/layout/cache.js.map +1 -0
- package/dist/html/layout/collapse.d.ts +45 -0
- package/dist/html/layout/collapse.d.ts.map +1 -0
- package/dist/html/layout/collapse.js +246 -0
- package/dist/html/layout/collapse.js.map +1 -0
- package/dist/html/layout/css-grid.d.ts +7 -0
- package/dist/html/layout/css-grid.d.ts.map +1 -0
- package/dist/html/layout/css-grid.js +900 -0
- package/dist/html/layout/css-grid.js.map +1 -0
- package/dist/html/layout/flex.d.ts.map +1 -1
- package/dist/html/layout/flex.js +1025 -89
- package/dist/html/layout/flex.js.map +1 -1
- package/dist/html/layout/floats.d.ts +45 -6
- package/dist/html/layout/floats.d.ts.map +1 -1
- package/dist/html/layout/floats.js +113 -14
- package/dist/html/layout/floats.js.map +1 -1
- package/dist/html/layout/grid-lines.d.ts +39 -0
- package/dist/html/layout/grid-lines.d.ts.map +1 -0
- package/dist/html/layout/grid-lines.js +119 -0
- package/dist/html/layout/grid-lines.js.map +1 -0
- package/dist/html/layout/grid.d.ts +53 -0
- package/dist/html/layout/grid.d.ts.map +1 -0
- package/dist/html/layout/grid.js +153 -0
- package/dist/html/layout/grid.js.map +1 -0
- package/dist/html/layout/inline.d.ts +151 -1
- package/dist/html/layout/inline.d.ts.map +1 -1
- package/dist/html/layout/inline.js +3375 -174
- package/dist/html/layout/inline.js.map +1 -1
- package/dist/html/layout/shaping.d.ts +6 -0
- package/dist/html/layout/shaping.d.ts.map +1 -0
- package/dist/html/layout/shaping.js +100 -0
- package/dist/html/layout/shaping.js.map +1 -0
- package/dist/html/layout/table.d.ts +3 -0
- package/dist/html/layout/table.d.ts.map +1 -1
- package/dist/html/layout/table.js +681 -175
- package/dist/html/layout/table.js.map +1 -1
- package/dist/html/layout/tracks.d.ts +44 -0
- package/dist/html/layout/tracks.d.ts.map +1 -0
- package/dist/html/layout/tracks.js +349 -0
- package/dist/html/layout/tracks.js.map +1 -0
- package/dist/html/node.d.ts +172 -5
- package/dist/html/node.d.ts.map +1 -1
- package/dist/html/node.js +1336 -103
- package/dist/html/node.js.map +1 -1
- package/dist/html/paint.d.ts +92 -3
- package/dist/html/paint.d.ts.map +1 -1
- package/dist/html/paint.js +3503 -141
- package/dist/html/paint.js.map +1 -1
- package/dist/html/resources.d.ts +60 -14
- package/dist/html/resources.d.ts.map +1 -1
- package/dist/html/resources.js +122 -36
- package/dist/html/resources.js.map +1 -1
- package/dist/html/surfaces.d.ts +23 -0
- package/dist/html/surfaces.d.ts.map +1 -0
- package/dist/html/surfaces.js +68 -0
- package/dist/html/surfaces.js.map +1 -0
- package/dist/html/svg.d.ts +80 -0
- package/dist/html/svg.d.ts.map +1 -0
- package/dist/html/svg.js +435 -0
- package/dist/html/svg.js.map +1 -0
- package/dist/html/url.d.ts +23 -0
- package/dist/html/url.d.ts.map +1 -0
- package/dist/html/url.js +80 -0
- package/dist/html/url.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/collate.d.ts +3 -0
- package/dist/internal/collate.d.ts.map +1 -0
- package/dist/internal/collate.js +11 -0
- package/dist/internal/collate.js.map +1 -0
- package/dist/{markdown → internal/markdown}/ast.d.ts +23 -0
- package/dist/internal/markdown/ast.d.ts.map +1 -0
- package/dist/internal/markdown/ast.js +22 -0
- package/dist/internal/markdown/ast.js.map +1 -0
- package/dist/internal/markdown/parse.d.ts.map +1 -0
- package/dist/{markdown → internal/markdown}/parse.js +221 -30
- package/dist/internal/markdown/parse.js.map +1 -0
- package/dist/internal/markdown/stringify.d.ts +4 -0
- package/dist/internal/markdown/stringify.d.ts.map +1 -0
- package/dist/internal/markdown/stringify.js +684 -0
- package/dist/internal/markdown/stringify.js.map +1 -0
- package/dist/internal/markdown/tags.d.ts.map +1 -0
- package/dist/internal/markdown/tags.js.map +1 -0
- package/dist/internal/prewarm.d.ts +18 -0
- package/dist/internal/prewarm.d.ts.map +1 -0
- package/dist/internal/prewarm.js +42 -0
- package/dist/internal/prewarm.js.map +1 -0
- package/dist/internal/scroll.d.ts +3 -2
- package/dist/internal/scroll.d.ts.map +1 -1
- package/dist/internal/scroll.js +1 -0
- package/dist/internal/scroll.js.map +1 -1
- package/dist/internal/sdf.d.ts +20 -0
- package/dist/internal/sdf.d.ts.map +1 -0
- package/dist/internal/sdf.js +216 -0
- package/dist/internal/sdf.js.map +1 -0
- package/dist/internal/splice.d.ts +12 -0
- package/dist/internal/splice.d.ts.map +1 -0
- package/dist/internal/splice.js +23 -0
- package/dist/internal/splice.js.map +1 -0
- package/dist/internal/window.d.ts +12 -0
- package/dist/internal/window.d.ts.map +1 -1
- package/dist/internal/window.js +23 -6
- package/dist/internal/window.js.map +1 -1
- package/dist/maps/anchors.d.ts +103 -0
- package/dist/maps/anchors.d.ts.map +1 -0
- package/dist/maps/anchors.js +790 -0
- package/dist/maps/anchors.js.map +1 -0
- package/dist/maps/controller.d.ts +340 -0
- package/dist/maps/controller.d.ts.map +1 -0
- package/dist/maps/controller.js +822 -0
- package/dist/maps/controller.js.map +1 -0
- package/dist/maps/gl/buckets.d.ts +99 -0
- package/dist/maps/gl/buckets.d.ts.map +1 -0
- package/dist/maps/gl/buckets.js +365 -0
- package/dist/maps/gl/buckets.js.map +1 -0
- package/dist/maps/gl/build-worker.d.ts +15 -0
- package/dist/maps/gl/build-worker.d.ts.map +1 -0
- package/dist/maps/gl/build-worker.js +44 -0
- package/dist/maps/gl/build-worker.js.map +1 -0
- package/dist/maps/gl/color.d.ts +8 -0
- package/dist/maps/gl/color.d.ts.map +1 -0
- package/dist/maps/gl/color.js +57 -0
- package/dist/maps/gl/color.js.map +1 -0
- package/dist/maps/gl/cover.d.ts +70 -0
- package/dist/maps/gl/cover.d.ts.map +1 -0
- package/dist/maps/gl/cover.js +137 -0
- package/dist/maps/gl/cover.js.map +1 -0
- package/dist/maps/gl/index.d.ts +3 -0
- package/dist/maps/gl/index.d.ts.map +1 -0
- package/dist/maps/gl/index.js +20 -0
- package/dist/maps/gl/index.js.map +1 -0
- package/dist/maps/gl/markers.d.ts +28 -0
- package/dist/maps/gl/markers.d.ts.map +1 -0
- package/dist/maps/gl/markers.js +60 -0
- package/dist/maps/gl/markers.js.map +1 -0
- package/dist/maps/gl/overlays.d.ts +68 -0
- package/dist/maps/gl/overlays.d.ts.map +1 -0
- package/dist/maps/gl/overlays.js +300 -0
- package/dist/maps/gl/overlays.js.map +1 -0
- package/dist/maps/gl/pane.d.ts +12 -0
- package/dist/maps/gl/pane.d.ts.map +1 -0
- package/dist/maps/gl/pane.js +37 -0
- package/dist/maps/gl/pane.js.map +1 -0
- package/dist/maps/gl/placement.d.ts +124 -0
- package/dist/maps/gl/placement.d.ts.map +1 -0
- package/dist/maps/gl/placement.js +642 -0
- package/dist/maps/gl/placement.js.map +1 -0
- package/dist/maps/gl/renderer.d.ts +384 -0
- package/dist/maps/gl/renderer.d.ts.map +1 -0
- package/dist/maps/gl/renderer.js +1184 -0
- package/dist/maps/gl/renderer.js.map +1 -0
- package/dist/maps/gl/shaders.d.ts +121 -0
- package/dist/maps/gl/shaders.d.ts.map +1 -0
- package/dist/maps/gl/shaders.js +453 -0
- package/dist/maps/gl/shaders.js.map +1 -0
- package/dist/maps/gl/store.d.ts +125 -0
- package/dist/maps/gl/store.d.ts.map +1 -0
- package/dist/maps/gl/store.js +512 -0
- package/dist/maps/gl/store.js.map +1 -0
- package/dist/maps/gl/text.d.ts +283 -0
- package/dist/maps/gl/text.d.ts.map +1 -0
- package/dist/maps/gl/text.js +698 -0
- package/dist/maps/gl/text.js.map +1 -0
- package/dist/maps/gl/view.d.ts +345 -0
- package/dist/maps/gl/view.d.ts.map +1 -0
- package/dist/maps/gl/view.js +1209 -0
- package/dist/maps/gl/view.js.map +1 -0
- package/dist/maps/icons.d.ts +32 -0
- package/dist/maps/icons.d.ts.map +1 -0
- package/dist/maps/icons.js +151 -0
- package/dist/maps/icons.js.map +1 -0
- package/dist/maps/index.d.ts +3 -1
- package/dist/maps/index.d.ts.map +1 -1
- package/dist/maps/index.js +218 -52
- package/dist/maps/index.js.map +1 -1
- package/dist/maps/labels.d.ts +91 -18
- package/dist/maps/labels.d.ts.map +1 -1
- package/dist/maps/labels.js +376 -140
- package/dist/maps/labels.js.map +1 -1
- package/dist/maps/node.d.ts +179 -56
- package/dist/maps/node.d.ts.map +1 -1
- package/dist/maps/node.js +663 -537
- package/dist/maps/node.js.map +1 -1
- package/dist/maps/overlay.d.ts +72 -9
- package/dist/maps/overlay.d.ts.map +1 -1
- package/dist/maps/overlay.js +108 -28
- package/dist/maps/overlay.js.map +1 -1
- package/dist/maps/paint.d.ts +3 -0
- package/dist/maps/paint.d.ts.map +1 -1
- package/dist/maps/paint.js.map +1 -1
- package/dist/maps/proj.d.ts +62 -0
- package/dist/maps/proj.d.ts.map +1 -1
- package/dist/maps/proj.js +101 -0
- package/dist/maps/proj.js.map +1 -1
- package/dist/maps/renderer.d.ts +69 -0
- package/dist/maps/renderer.d.ts.map +1 -0
- package/dist/maps/renderer.js +66 -0
- package/dist/maps/renderer.js.map +1 -0
- package/dist/maps/sources.d.ts +30 -6
- package/dist/maps/sources.d.ts.map +1 -1
- package/dist/maps/sources.js +22 -3
- package/dist/maps/sources.js.map +1 -1
- package/dist/maps/style.d.ts +35 -0
- package/dist/maps/style.d.ts.map +1 -1
- package/dist/maps/style.js.map +1 -1
- package/dist/maps/styles.d.ts +12 -0
- package/dist/maps/styles.d.ts.map +1 -1
- package/dist/maps/styles.js +120 -6
- package/dist/maps/styles.js.map +1 -1
- package/dist/maps/theme.d.ts +19 -0
- package/dist/maps/theme.d.ts.map +1 -0
- package/dist/maps/theme.js +44 -0
- package/dist/maps/theme.js.map +1 -0
- package/dist/maps/tiles.d.ts +147 -27
- package/dist/maps/tiles.d.ts.map +1 -1
- package/dist/maps/tiles.js +221 -54
- package/dist/maps/tiles.js.map +1 -1
- package/dist/maps/types.d.ts +213 -21
- package/dist/maps/types.d.ts.map +1 -1
- package/dist/markdown/expressions.d.ts +1 -1
- package/dist/markdown/expressions.d.ts.map +1 -1
- package/dist/markdown/expressions.js.map +1 -1
- package/dist/markdown/index.d.ts +7 -6
- package/dist/markdown/index.d.ts.map +1 -1
- package/dist/markdown/index.js +121 -50
- package/dist/markdown/index.js.map +1 -1
- package/dist/markdown/spans.d.ts +1 -1
- package/dist/markdown/spans.d.ts.map +1 -1
- package/dist/markdown/spans.js +6 -0
- package/dist/markdown/spans.js.map +1 -1
- package/dist/media-player/index.d.ts +11 -3
- package/dist/media-player/index.d.ts.map +1 -1
- package/dist/media-player/index.js +13 -2
- package/dist/media-player/index.js.map +1 -1
- package/dist/qml/containers.d.ts.map +1 -1
- package/dist/qml/containers.js +6 -1
- package/dist/qml/containers.js.map +1 -1
- package/dist/qml/interaction.d.ts.map +1 -1
- package/dist/qml/interaction.js +38 -5
- package/dist/qml/interaction.js.map +1 -1
- package/dist/qml/layouts.d.ts.map +1 -1
- package/dist/qml/layouts.js +21 -6
- package/dist/qml/layouts.js.map +1 -1
- package/dist/qml/qtquick.d.ts.map +1 -1
- package/dist/qml/qtquick.js +9 -2
- package/dist/qml/qtquick.js.map +1 -1
- package/dist/qml/react.d.ts.map +1 -1
- package/dist/qml/react.js +9 -7
- package/dist/qml/react.js.map +1 -1
- package/dist/reorder/clock.d.ts +7 -0
- package/dist/reorder/clock.d.ts.map +1 -0
- package/dist/reorder/clock.js +26 -0
- package/dist/reorder/clock.js.map +1 -0
- package/dist/reorder/index.d.ts +25 -3
- package/dist/reorder/index.d.ts.map +1 -1
- package/dist/reorder/index.js +64 -19
- package/dist/reorder/index.js.map +1 -1
- package/dist/rich-text-editor/clipboard.d.ts +23 -0
- package/dist/rich-text-editor/clipboard.d.ts.map +1 -0
- package/dist/rich-text-editor/clipboard.js +307 -0
- package/dist/rich-text-editor/clipboard.js.map +1 -0
- package/dist/rich-text-editor/collab.d.ts +32 -0
- package/dist/rich-text-editor/collab.d.ts.map +1 -0
- package/dist/rich-text-editor/collab.js +55 -0
- package/dist/rich-text-editor/collab.js.map +1 -0
- package/dist/rich-text-editor/commands.d.ts +50 -0
- package/dist/rich-text-editor/commands.d.ts.map +1 -0
- package/dist/rich-text-editor/commands.js +376 -0
- package/dist/rich-text-editor/commands.js.map +1 -0
- package/dist/rich-text-editor/drag.d.ts +68 -0
- package/dist/rich-text-editor/drag.d.ts.map +1 -0
- package/dist/rich-text-editor/drag.js +148 -0
- package/dist/rich-text-editor/drag.js.map +1 -0
- package/dist/rich-text-editor/html.d.ts +145 -0
- package/dist/rich-text-editor/html.d.ts.map +1 -0
- package/dist/rich-text-editor/html.js +516 -0
- package/dist/rich-text-editor/html.js.map +1 -0
- package/dist/rich-text-editor/index.d.ts +252 -0
- package/dist/rich-text-editor/index.d.ts.map +1 -0
- package/dist/rich-text-editor/index.js +856 -0
- package/dist/rich-text-editor/index.js.map +1 -0
- package/dist/rich-text-editor/inline.d.ts +94 -0
- package/dist/rich-text-editor/inline.d.ts.map +1 -0
- package/dist/rich-text-editor/inline.js +252 -0
- package/dist/rich-text-editor/inline.js.map +1 -0
- package/dist/rich-text-editor/keymap.d.ts +71 -0
- package/dist/rich-text-editor/keymap.d.ts.map +1 -0
- package/dist/rich-text-editor/keymap.js +394 -0
- package/dist/rich-text-editor/keymap.js.map +1 -0
- package/dist/rich-text-editor/keys.d.ts +40 -0
- package/dist/rich-text-editor/keys.d.ts.map +1 -0
- package/dist/rich-text-editor/keys.js +202 -0
- package/dist/rich-text-editor/keys.js.map +1 -0
- package/dist/rich-text-editor/look.d.ts +71 -0
- package/dist/rich-text-editor/look.d.ts.map +1 -0
- package/dist/rich-text-editor/look.js +342 -0
- package/dist/rich-text-editor/look.js.map +1 -0
- package/dist/rich-text-editor/markdown.d.ts +18 -0
- package/dist/rich-text-editor/markdown.d.ts.map +1 -0
- package/dist/rich-text-editor/markdown.js +496 -0
- package/dist/rich-text-editor/markdown.js.map +1 -0
- package/dist/rich-text-editor/marks.d.ts +9 -0
- package/dist/rich-text-editor/marks.d.ts.map +1 -0
- package/dist/rich-text-editor/marks.js +83 -0
- package/dist/rich-text-editor/marks.js.map +1 -0
- package/dist/rich-text-editor/nodes.d.ts +135 -0
- package/dist/rich-text-editor/nodes.d.ts.map +1 -0
- package/dist/rich-text-editor/nodes.js +397 -0
- package/dist/rich-text-editor/nodes.js.map +1 -0
- package/dist/rich-text-editor/render.d.ts +68 -0
- package/dist/rich-text-editor/render.d.ts.map +1 -0
- package/dist/rich-text-editor/render.js +518 -0
- package/dist/rich-text-editor/render.js.map +1 -0
- package/dist/rich-text-editor/schema.d.ts +16 -0
- package/dist/rich-text-editor/schema.d.ts.map +1 -0
- package/dist/rich-text-editor/schema.js +386 -0
- package/dist/rich-text-editor/schema.js.map +1 -0
- package/dist/rich-text-editor/store.d.ts +11 -0
- package/dist/rich-text-editor/store.d.ts.map +1 -0
- package/dist/rich-text-editor/store.js +43 -0
- package/dist/rich-text-editor/store.js.map +1 -0
- package/dist/rich-text-editor/suggest.d.ts +127 -0
- package/dist/rich-text-editor/suggest.d.ts.map +1 -0
- package/dist/rich-text-editor/suggest.js +0 -0
- package/dist/rich-text-editor/suggest.js.map +1 -0
- package/dist/rich-text-editor/tables.d.ts +41 -0
- package/dist/rich-text-editor/tables.d.ts.map +1 -0
- package/dist/rich-text-editor/tables.js +204 -0
- package/dist/rich-text-editor/tables.js.map +1 -0
- package/dist/rich-text-editor/toolbar.d.ts +58 -0
- package/dist/rich-text-editor/toolbar.d.ts.map +1 -0
- package/dist/rich-text-editor/toolbar.js +548 -0
- package/dist/rich-text-editor/toolbar.js.map +1 -0
- package/dist/rich-text-editor/view.d.ts +368 -0
- package/dist/rich-text-editor/view.d.ts.map +1 -0
- package/dist/rich-text-editor/view.js +1968 -0
- package/dist/rich-text-editor/view.js.map +1 -0
- package/dist/rich-text-editor/virtual.d.ts +54 -0
- package/dist/rich-text-editor/virtual.d.ts.map +1 -0
- package/dist/rich-text-editor/virtual.js +279 -0
- package/dist/rich-text-editor/virtual.js.map +1 -0
- package/dist/richtext/node.d.ts +71 -4
- package/dist/richtext/node.d.ts.map +1 -1
- package/dist/richtext/node.js +233 -28
- package/dist/richtext/node.js.map +1 -1
- package/dist/richtext/runs.d.ts +13 -8
- package/dist/richtext/runs.d.ts.map +1 -1
- package/dist/richtext/runs.js +18 -8
- package/dist/richtext/runs.js.map +1 -1
- package/dist/table/index.d.ts.map +1 -1
- package/dist/table/index.js +23 -0
- package/dist/table/index.js.map +1 -1
- package/dist/table/rows.d.ts +3 -2
- package/dist/table/rows.d.ts.map +1 -1
- package/dist/table/rows.js +20 -6
- package/dist/table/rows.js.map +1 -1
- package/dist/terminal/backends.d.ts +4 -1
- package/dist/terminal/backends.d.ts.map +1 -1
- package/dist/terminal/backends.js.map +1 -1
- package/dist/terminal/index.d.ts +18 -7
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +32 -11
- package/dist/terminal/index.js.map +1 -1
- package/dist/terminal/vt/pty.d.ts +13 -2
- package/dist/terminal/vt/pty.d.ts.map +1 -1
- package/dist/terminal/vt/pty.js +18 -3
- package/dist/terminal/vt/pty.js.map +1 -1
- package/dist/terminal-output/index.d.ts.map +1 -1
- package/dist/terminal-output/index.js +6 -1
- package/dist/terminal-output/index.js.map +1 -1
- package/dist/three/canvas.d.ts.map +1 -1
- package/dist/three/canvas.js +85 -7
- package/dist/three/canvas.js.map +1 -1
- package/dist/three/events.d.ts +22 -4
- package/dist/three/events.d.ts.map +1 -1
- package/dist/three/events.js +34 -4
- package/dist/three/events.js.map +1 -1
- package/dist/tree/index.d.ts.map +1 -1
- package/dist/tree/index.js +17 -0
- package/dist/tree/index.js.map +1 -1
- package/package.json +59 -31
- package/src/charts/node.ts +68 -28
- package/src/charts/render.ts +120 -30
- package/src/code/index.ts +3 -1
- package/src/code-editor/completion.ts +3 -2
- package/src/code-editor/index.ts +19 -0
- package/src/code-editor/node.ts +1574 -184
- package/src/code-language/languages/glsl.ts +12 -2
- package/src/code-language/languages/javascript.ts +21 -4
- package/src/code-language/languages/json.ts +12 -2
- package/src/code-language/languages/shell.ts +12 -2
- package/src/code-language/languages/sql.ts +22 -2
- package/src/code-language/stream.ts +257 -17
- package/src/code-language/types.ts +5 -4
- package/src/codeblock/index.ts +20 -3
- package/src/embed/client.ts +102 -8
- package/src/embed/index.ts +2 -0
- package/src/flow/draw.ts +167 -41
- package/src/flow/gl/color.ts +85 -0
- package/src/flow/gl/index.ts +342 -0
- package/src/flow/gl/pack.ts +585 -0
- package/src/flow/gl/renderer.ts +679 -0
- package/src/flow/gl/shaders.ts +371 -0
- package/src/flow/gl/text.ts +1295 -0
- package/src/flow/index.ts +794 -67
- package/src/flow/node.ts +2496 -1256
- package/src/flow/paint.ts +511 -0
- package/src/flow/paths.ts +80 -15
- package/src/flow/scene.ts +2199 -0
- package/src/flow/types.ts +113 -1
- package/src/html/controls.ts +73 -2
- package/src/html/css/calc.ts +385 -0
- package/src/html/css/cascade.ts +1403 -62
- package/src/html/css/color.ts +755 -0
- package/src/html/css/content.ts +417 -0
- package/src/html/css/counter-styles.ts +973 -0
- package/src/html/css/decode.ts +130 -0
- package/src/html/css/parse.ts +1514 -160
- package/src/html/css/style.ts +4102 -222
- package/src/html/css/ua.ts +58 -12
- package/src/html/css/values.ts +150 -50
- package/src/html/css/vars.ts +348 -0
- package/src/html/dom.ts +284 -17
- package/src/html/fonts.ts +641 -0
- package/src/html/gif.ts +233 -0
- package/src/html/index.ts +180 -20
- package/src/html/layout/block.ts +3456 -230
- package/src/html/layout/boxes.ts +2100 -190
- package/src/html/layout/cache.ts +289 -0
- package/src/html/layout/collapse.ts +317 -0
- package/src/html/layout/css-grid.ts +1063 -0
- package/src/html/layout/flex.ts +1115 -106
- package/src/html/layout/floats.ts +128 -14
- package/src/html/layout/grid-lines.ts +141 -0
- package/src/html/layout/grid.ts +181 -0
- package/src/html/layout/inline.ts +3943 -192
- package/src/html/layout/shaping.ts +140 -0
- package/src/html/layout/table.ts +696 -186
- package/src/html/layout/tracks.ts +437 -0
- package/src/html/node.ts +1486 -121
- package/src/html/paint.ts +4293 -169
- package/src/html/resources.ts +161 -50
- package/src/html/surfaces.ts +81 -0
- package/src/html/svg.ts +493 -0
- package/src/html/url.ts +86 -0
- package/src/index.ts +4 -0
- package/src/internal/collate.ts +12 -0
- package/src/{markdown → internal/markdown}/ast.ts +35 -7
- package/src/{markdown → internal/markdown}/parse.ts +288 -35
- package/src/internal/markdown/stringify.ts +772 -0
- package/src/internal/prewarm.ts +45 -0
- package/src/internal/scroll.ts +5 -3
- package/src/internal/sdf.ts +227 -0
- package/src/internal/splice.ts +25 -0
- package/src/internal/window.ts +36 -5
- package/src/maps/anchors.ts +913 -0
- package/src/maps/controller.ts +1084 -0
- package/src/maps/gl/buckets.ts +461 -0
- package/src/maps/gl/build-worker.ts +66 -0
- package/src/maps/gl/color.ts +62 -0
- package/src/maps/gl/cover.ts +205 -0
- package/src/maps/gl/index.ts +23 -0
- package/src/maps/gl/markers.ts +83 -0
- package/src/maps/gl/overlays.ts +379 -0
- package/src/maps/gl/pane.ts +42 -0
- package/src/maps/gl/placement.ts +968 -0
- package/src/maps/gl/renderer.ts +1660 -0
- package/src/maps/gl/shaders.ts +489 -0
- package/src/maps/gl/store.ts +615 -0
- package/src/maps/gl/text.ts +868 -0
- package/src/maps/gl/view.ts +1489 -0
- package/src/maps/icons.ts +183 -0
- package/src/maps/index.ts +274 -81
- package/src/maps/labels.ts +457 -144
- package/src/maps/node.ts +832 -665
- package/src/maps/overlay.ts +148 -43
- package/src/maps/paint.ts +3 -0
- package/src/maps/proj.ts +118 -0
- package/src/maps/renderer.ts +155 -0
- package/src/maps/sources.ts +43 -6
- package/src/maps/style.ts +32 -0
- package/src/maps/styles.ts +215 -4
- package/src/maps/theme.ts +51 -0
- package/src/maps/tiles.ts +253 -62
- package/src/maps/types.ts +213 -21
- package/src/markdown/expressions.ts +5 -1
- package/src/markdown/index.ts +163 -78
- package/src/markdown/spans.ts +6 -1
- package/src/media-player/index.ts +18 -4
- package/src/qml/containers.tsx +6 -1
- package/src/qml/interaction.tsx +42 -5
- package/src/qml/layouts.tsx +21 -6
- package/src/qml/qtquick.tsx +9 -2
- package/src/qml/react.tsx +7 -5
- package/src/reorder/clock.ts +27 -0
- package/src/reorder/index.ts +100 -27
- package/src/rich-text-editor/clipboard.ts +439 -0
- package/src/rich-text-editor/collab.ts +91 -0
- package/src/rich-text-editor/commands.ts +448 -0
- package/src/rich-text-editor/dom-globals.d.ts +23 -0
- package/src/rich-text-editor/drag.ts +211 -0
- package/src/rich-text-editor/html.ts +619 -0
- package/src/rich-text-editor/index.ts +1364 -0
- package/src/rich-text-editor/inline.ts +345 -0
- package/src/rich-text-editor/keymap.ts +510 -0
- package/src/rich-text-editor/keys.ts +228 -0
- package/src/rich-text-editor/look.ts +427 -0
- package/src/rich-text-editor/markdown.ts +653 -0
- package/src/rich-text-editor/marks.ts +101 -0
- package/src/rich-text-editor/nodes.ts +497 -0
- package/src/rich-text-editor/render.ts +837 -0
- package/src/rich-text-editor/schema.ts +431 -0
- package/src/rich-text-editor/store.ts +39 -0
- package/src/rich-text-editor/suggest.ts +597 -0
- package/src/rich-text-editor/tables.ts +272 -0
- package/src/rich-text-editor/toolbar.ts +724 -0
- package/src/rich-text-editor/view.ts +2287 -0
- package/src/rich-text-editor/virtual.ts +372 -0
- package/src/richtext/node.ts +294 -44
- package/src/richtext/runs.ts +23 -12
- package/src/table/index.ts +29 -0
- package/src/table/rows.ts +18 -8
- package/src/terminal/backends.ts +4 -1
- package/src/terminal/index.ts +47 -15
- package/src/terminal/vt/pty.ts +16 -2
- package/src/terminal-output/index.ts +6 -1
- package/src/three/canvas.ts +102 -8
- package/src/three/events.ts +49 -9
- package/src/tree/index.ts +19 -0
- package/dist/markdown/ast.d.ts.map +0 -1
- package/dist/markdown/ast.js +0 -17
- package/dist/markdown/ast.js.map +0 -1
- package/dist/markdown/parse.d.ts.map +0 -1
- package/dist/markdown/parse.js.map +0 -1
- package/dist/markdown/tags.d.ts.map +0 -1
- package/dist/markdown/tags.js.map +0 -1
- /package/dist/{markdown → internal/markdown}/parse.d.ts +0 -0
- /package/dist/{markdown → internal/markdown}/tags.d.ts +0 -0
- /package/dist/{markdown → internal/markdown}/tags.js +0 -0
- /package/src/{markdown → internal/markdown}/tags.ts +0 -0
|
@@ -0,0 +1,641 @@
|
|
|
1
|
+
// `@font-face`: the families a document brings with it.
|
|
2
|
+
//
|
|
3
|
+
// A face is a resource like an image — asked for through `onResource`, as
|
|
4
|
+
// `{ kind: 'font' }`, and handed back as the file's bytes — and nothing loads
|
|
5
|
+
// without the host, as nothing else does. What is particular to fonts is
|
|
6
|
+
// where one goes once it has loaded: into the connection's font manager,
|
|
7
|
+
// where the text engine finds a family by name. That manager is the whole
|
|
8
|
+
// application's, so three rules keep a document's fonts the document's.
|
|
9
|
+
//
|
|
10
|
+
// **A face is registered under a name nothing else has.** A page that
|
|
11
|
+
// declares `font-family: Inter` must not change what `Inter` means to the
|
|
12
|
+
// window around it, to the next tab, or to a page that ships another file
|
|
13
|
+
// under the same name — an icon font called `Icons` on two sites is two sets
|
|
14
|
+
// of glyphs. So each group of faces is registered as `html webfont <letters>`
|
|
15
|
+
// and the cascade's `font-family` lists are rewritten to it (`map`). The name
|
|
16
|
+
// is keyed by the family, the unicode range and every face's URLs, weight and
|
|
17
|
+
// slant: two documents that declare a family the same way share one
|
|
18
|
+
// registration, and a document that declares it differently gets its own.
|
|
19
|
+
// (Letters only, because the name also reaches fontconfig, where `-12` would
|
|
20
|
+
// read as a size.)
|
|
21
|
+
//
|
|
22
|
+
// **A face loads when the page uses it, as a browser loads one.** A Google
|
|
23
|
+
// Fonts sheet declares a family seven times over, once per script, and a
|
|
24
|
+
// self-hosted family often declares every weight it has. The cascade reports
|
|
25
|
+
// each computed style (`note`), and after the boxes are built a face is asked
|
|
26
|
+
// for only if some style wants its family at its weight and slant and some
|
|
27
|
+
// character of the document falls in its `unicode-range` (`request`). The
|
|
28
|
+
// matching is CSS Fonts 4's (5.2): the slant first, then the nearest weight
|
|
29
|
+
// in the direction the spec prefers, and a face that fails to load is passed
|
|
30
|
+
// over for the next.
|
|
31
|
+
//
|
|
32
|
+
// **Until a face has loaded, its family is not in the list.** The text is set
|
|
33
|
+
// in the next family the author named, as `font-display: swap` has it, and
|
|
34
|
+
// the list changes when the face arrives — which is what tells every cache
|
|
35
|
+
// keyed by a family list, the text layouts', the metrics', ntk's, that the
|
|
36
|
+
// text has to be set again.
|
|
37
|
+
//
|
|
38
|
+
// A family split by `unicode-range` is registered a name per range, since the
|
|
39
|
+
// font manager picks among one name's faces by weight and slant alone, and
|
|
40
|
+
// the range that holds the most of the document's characters goes first: the
|
|
41
|
+
// first family is the one a run is set in, and the others are reached through
|
|
42
|
+
// the fallback for the characters it lacks.
|
|
43
|
+
//
|
|
44
|
+
// What stays the application's: registering a face adds it to ntk's
|
|
45
|
+
// fallback chain, where it can supply a glyph no other face has to text
|
|
46
|
+
// anywhere in the app (react-x11's `loadFont` says so), and nothing is ever
|
|
47
|
+
// unregistered — the font manager has no way to. A session that visits many
|
|
48
|
+
// sites keeps their faces, one registration per distinct declaration.
|
|
49
|
+
import { loadFont } from 'react-x11';
|
|
50
|
+
import type { Element } from 'domhandler';
|
|
51
|
+
|
|
52
|
+
import type { FontFaceRule } from './css/parse.js';
|
|
53
|
+
import type { ComputedStyle } from './css/style.js';
|
|
54
|
+
import type { ResourceRequest, ResourceResult } from './resources.js';
|
|
55
|
+
|
|
56
|
+
/** What the cascade asks of the document's families (`Cascade`). */
|
|
57
|
+
export interface FontFamilies {
|
|
58
|
+
/** A computed `font-family` list, as the text engine should see it. */
|
|
59
|
+
map(list: string): string;
|
|
60
|
+
/** A style was computed: its family, weight and slant are wanted. */
|
|
61
|
+
note(style: ComputedStyle): void;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** A `@font-face` rule, and the element whose sheet declared it — the one a
|
|
65
|
+
* request names. */
|
|
66
|
+
export interface DeclaredFace {
|
|
67
|
+
rule: FontFaceRule;
|
|
68
|
+
element: Element;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
type Ask = (
|
|
72
|
+
request: ResourceRequest,
|
|
73
|
+
) => Promise<ResourceResult | null> | ResourceResult | null;
|
|
74
|
+
|
|
75
|
+
/** The formats a font manager reads. A source hinted as anything else — an
|
|
76
|
+
* `embedded-opentype` for old Internet Explorer, an `svg` font — is not
|
|
77
|
+
* asked for; one with no hint is. */
|
|
78
|
+
const READABLE = new Set([
|
|
79
|
+
'woff2',
|
|
80
|
+
'woff',
|
|
81
|
+
'truetype',
|
|
82
|
+
'opentype',
|
|
83
|
+
'ttf',
|
|
84
|
+
'otf',
|
|
85
|
+
'collection',
|
|
86
|
+
'woff2-variations',
|
|
87
|
+
'woff-variations',
|
|
88
|
+
'truetype-variations',
|
|
89
|
+
'opentype-variations',
|
|
90
|
+
]);
|
|
91
|
+
|
|
92
|
+
interface Face {
|
|
93
|
+
rule: FontFaceRule;
|
|
94
|
+
element: Element;
|
|
95
|
+
group: Group;
|
|
96
|
+
family: Family;
|
|
97
|
+
/** Where loading got to. `idle` has not been asked for. */
|
|
98
|
+
state: 'idle' | 'loading' | 'ready' | 'failed';
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** A family's faces for one unicode range: one registered name, among whose
|
|
102
|
+
* faces the font manager picks by weight and slant. */
|
|
103
|
+
interface Group {
|
|
104
|
+
name: string;
|
|
105
|
+
ranges: [number, number][] | null;
|
|
106
|
+
faces: Face[];
|
|
107
|
+
/** How many of the document's distinct code points the range holds. */
|
|
108
|
+
coverage: number;
|
|
109
|
+
order: number;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
interface Family {
|
|
113
|
+
groups: Group[];
|
|
114
|
+
/** `weight|italic`s the styles asked for, and the ones already asked. */
|
|
115
|
+
wants: Set<string>;
|
|
116
|
+
asked: Set<string>;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** What one connection has registered, shared by every document on it. */
|
|
120
|
+
interface Registry {
|
|
121
|
+
next: number;
|
|
122
|
+
/** A group's signature → the name it is registered under. */
|
|
123
|
+
names: Map<string, string>;
|
|
124
|
+
/** Faces registered, by `faceKey`. */
|
|
125
|
+
ready: Set<string>;
|
|
126
|
+
/** Faces being loaded, by `faceKey`, so a second document waits for the
|
|
127
|
+
* first document's request rather than making its own. */
|
|
128
|
+
pending: Map<string, Promise<boolean>>;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const REGISTRIES = new WeakMap<object, Registry>();
|
|
132
|
+
|
|
133
|
+
function registryOf(app: object): Registry {
|
|
134
|
+
let registry = REGISTRIES.get(app);
|
|
135
|
+
if (!registry) {
|
|
136
|
+
registry = {
|
|
137
|
+
next: 0,
|
|
138
|
+
names: new Map(),
|
|
139
|
+
ready: new Set(),
|
|
140
|
+
pending: new Map(),
|
|
141
|
+
};
|
|
142
|
+
REGISTRIES.set(app, registry);
|
|
143
|
+
}
|
|
144
|
+
return registry;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** `0 → a`, `25 → z`, `26 → ba`: a counter as letters. */
|
|
148
|
+
function letters(n: number): string {
|
|
149
|
+
let out = '';
|
|
150
|
+
do {
|
|
151
|
+
out = String.fromCharCode(97 + (n % 26)) + out;
|
|
152
|
+
n = Math.floor(n / 26);
|
|
153
|
+
} while (n > 0);
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export class WebFonts implements FontFamilies {
|
|
158
|
+
private _app: object | null;
|
|
159
|
+
private _ask: Ask;
|
|
160
|
+
private _changed: () => void;
|
|
161
|
+
private _fallback: string;
|
|
162
|
+
private _families = new Map<string, Family>();
|
|
163
|
+
/** Every face, in the order the sheets declared them. */
|
|
164
|
+
private _faces: Face[] = [];
|
|
165
|
+
/** What `setFaces` was last handed, to tell a restyle that changed no
|
|
166
|
+
* face from one that did. */
|
|
167
|
+
private _declared = '';
|
|
168
|
+
/** Lists as the author wrote them → as the engine should see them. */
|
|
169
|
+
private _memo = new Map<string, string>();
|
|
170
|
+
/** Lists as the engine sees them → the declared families they came from,
|
|
171
|
+
* for `note`, which is handed a computed style and so the second. Two
|
|
172
|
+
* lists that come to one string share an entry, which can ask for a face
|
|
173
|
+
* a little early; never for one nothing wants. */
|
|
174
|
+
private _sources = new Map<string, Family[]>();
|
|
175
|
+
/** The document's characters, as the last `request` saw them. */
|
|
176
|
+
private _text: string | null = null;
|
|
177
|
+
private _seen = new Set<number>();
|
|
178
|
+
private _points: Uint32Array = new Uint32Array(0);
|
|
179
|
+
private _destroyed = false;
|
|
180
|
+
|
|
181
|
+
constructor(app: unknown, ask: Ask, changed: () => void, fallback: string) {
|
|
182
|
+
this._app = app !== null && typeof app === 'object' ? app : null;
|
|
183
|
+
this._ask = ask;
|
|
184
|
+
this._changed = changed;
|
|
185
|
+
this._fallback = fallback;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/** The family a list comes to when every name in it was the document's
|
|
189
|
+
* own and none has loaded — the document's default. */
|
|
190
|
+
setFallback(family: string): void {
|
|
191
|
+
if (family === this._fallback) return;
|
|
192
|
+
this._fallback = family;
|
|
193
|
+
this._forget();
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* The faces the document's sheets declare, after a restyle — in sheet
|
|
198
|
+
* order, the ones whose `@media` holds. A face declared as it was keeps
|
|
199
|
+
* what it had loaded, and so does one another document on the connection
|
|
200
|
+
* declared the same way.
|
|
201
|
+
*/
|
|
202
|
+
setFaces(declared: DeclaredFace[]): void {
|
|
203
|
+
const signature = declared
|
|
204
|
+
.map(
|
|
205
|
+
(d) => `${d.rule.family.toLowerCase()}\u0001${faceSignature(d.rule)}`,
|
|
206
|
+
)
|
|
207
|
+
.join('\u0002');
|
|
208
|
+
if (signature === this._declared) {
|
|
209
|
+
// the same faces, in elements a re-parse made again
|
|
210
|
+
this._faces.forEach((face, i) => (face.element = declared[i].element));
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
this._declared = signature;
|
|
214
|
+
|
|
215
|
+
// a family's faces, by range, in the order they were declared
|
|
216
|
+
const byFamily = new Map<string, Map<string, DeclaredFace[]>>();
|
|
217
|
+
for (const face of declared) {
|
|
218
|
+
const key = face.rule.family.toLowerCase();
|
|
219
|
+
let ranges = byFamily.get(key);
|
|
220
|
+
if (!ranges) byFamily.set(key, (ranges = new Map()));
|
|
221
|
+
const range = rangeKey(face.rule.unicodeRange);
|
|
222
|
+
let list = ranges.get(range);
|
|
223
|
+
if (!list) ranges.set(range, (list = []));
|
|
224
|
+
list.push(face);
|
|
225
|
+
}
|
|
226
|
+
const registry = this._app ? registryOf(this._app) : null;
|
|
227
|
+
const previous = this._families;
|
|
228
|
+
const families = new Map<string, Family>();
|
|
229
|
+
const made = new Map<DeclaredFace, Face>();
|
|
230
|
+
let order = 0;
|
|
231
|
+
for (const [key, ranges] of byFamily) {
|
|
232
|
+
const before = previous.get(key);
|
|
233
|
+
const family: Family = {
|
|
234
|
+
groups: [],
|
|
235
|
+
// what the styles wanted is still wanted, and asked for again: under
|
|
236
|
+
// another name it is another registration
|
|
237
|
+
wants: before ? before.wants : new Set(),
|
|
238
|
+
asked: new Set(),
|
|
239
|
+
};
|
|
240
|
+
for (const [range, members] of ranges) {
|
|
241
|
+
const groupSignature = `${key}\u0001${range}\u0001${members
|
|
242
|
+
.map((m) => faceSignature(m.rule))
|
|
243
|
+
.join('\u0002')}`;
|
|
244
|
+
let name = registry?.names.get(groupSignature);
|
|
245
|
+
if (!name) {
|
|
246
|
+
name = `html webfont ${letters(registry ? registry.next++ : order)}`;
|
|
247
|
+
registry?.names.set(groupSignature, name);
|
|
248
|
+
}
|
|
249
|
+
const group: Group = {
|
|
250
|
+
name,
|
|
251
|
+
ranges: members[0].rule.unicodeRange,
|
|
252
|
+
faces: [],
|
|
253
|
+
coverage: members[0].rule.unicodeRange ? 0 : Infinity,
|
|
254
|
+
order: order++,
|
|
255
|
+
};
|
|
256
|
+
for (const m of members) {
|
|
257
|
+
const ready = registry?.ready.has(faceKey(name, m.rule)) ?? false;
|
|
258
|
+
const face: Face = {
|
|
259
|
+
rule: m.rule,
|
|
260
|
+
element: m.element,
|
|
261
|
+
group,
|
|
262
|
+
family,
|
|
263
|
+
state: ready ? 'ready' : 'idle',
|
|
264
|
+
};
|
|
265
|
+
group.faces.push(face);
|
|
266
|
+
made.set(m, face);
|
|
267
|
+
}
|
|
268
|
+
family.groups.push(group);
|
|
269
|
+
}
|
|
270
|
+
families.set(key, family);
|
|
271
|
+
}
|
|
272
|
+
this._families = families;
|
|
273
|
+
this._faces = declared.map((d) => made.get(d)!);
|
|
274
|
+
// the ranges are new, and so is what they cover
|
|
275
|
+
if (this._text !== null) this._measure(this._text, true);
|
|
276
|
+
this._forget();
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
map(list: string): string {
|
|
280
|
+
if (!this._families.size) return list;
|
|
281
|
+
const known = this._memo.get(list);
|
|
282
|
+
if (known !== undefined) return known;
|
|
283
|
+
const out: string[] = [];
|
|
284
|
+
const used: Family[] = [];
|
|
285
|
+
for (const raw of list.split(',')) {
|
|
286
|
+
const name = raw.trim();
|
|
287
|
+
if (!name) continue;
|
|
288
|
+
const family = this._families.get(name.toLowerCase());
|
|
289
|
+
if (!family) {
|
|
290
|
+
out.push(name);
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
used.push(family);
|
|
294
|
+
for (const group of orderedGroups(family)) {
|
|
295
|
+
if (group.faces.some((f) => f.state === 'ready')) out.push(group.name);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
let mapped = out.length ? out.join(', ') : this._fallback;
|
|
299
|
+
// The generic `monospace` as the whole of a list is set smaller than any
|
|
300
|
+
// other list (the cascade's `FIXED_SIZE`), and the author's list, with a
|
|
301
|
+
// family of the document's in it, is not that list. Left as `monospace`
|
|
302
|
+
// while its family loads, `"Courier Prime", monospace` was set at 13/16
|
|
303
|
+
// and jumped to its size when the face arrived; `monospace, monospace`
|
|
304
|
+
// is the same face at the size the author's list has — normalize.css's
|
|
305
|
+
// spelling of it.
|
|
306
|
+
if (used.length && /^monospace$/i.test(mapped)) {
|
|
307
|
+
mapped = 'monospace, monospace';
|
|
308
|
+
}
|
|
309
|
+
this._memo.set(list, mapped);
|
|
310
|
+
if (used.length) {
|
|
311
|
+
const sources = this._sources.get(mapped);
|
|
312
|
+
if (!sources) this._sources.set(mapped, used);
|
|
313
|
+
else for (const f of used) if (!sources.includes(f)) sources.push(f);
|
|
314
|
+
}
|
|
315
|
+
return mapped;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
note(style: ComputedStyle): void {
|
|
319
|
+
const families = this._sources.get(style.fontFamily);
|
|
320
|
+
if (!families) return;
|
|
321
|
+
const want = `${style.fontWeight}|${style.fontStyle !== 'normal' ? 1 : 0}`;
|
|
322
|
+
for (const family of families) family.wants.add(want);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Ask for the faces the styles noted since the last call want, for the
|
|
327
|
+
* characters `text` holds — the document's own. True when the lists the
|
|
328
|
+
* boxes were styled with are out of date already: a host that answers at
|
|
329
|
+
* once registered a face before this returned, or the document's text
|
|
330
|
+
* changed which range of a family should lead. The caller builds its boxes
|
|
331
|
+
* again.
|
|
332
|
+
*/
|
|
333
|
+
request(text: string): boolean {
|
|
334
|
+
if (!this._families.size || this._destroyed) return false;
|
|
335
|
+
let stale = text !== this._text && this._measure(text, false);
|
|
336
|
+
for (const family of this._families.values()) {
|
|
337
|
+
for (const want of family.wants) {
|
|
338
|
+
if (family.asked.has(want)) continue;
|
|
339
|
+
family.asked.add(want);
|
|
340
|
+
const [weight, italic] = want.split('|');
|
|
341
|
+
for (const group of family.groups) {
|
|
342
|
+
if (group.coverage <= 0) continue;
|
|
343
|
+
if (this._pick(group, Number(weight), italic === '1')) stale = true;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
if (stale) this._forget();
|
|
348
|
+
return stale;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
destroy(): void {
|
|
352
|
+
this._destroyed = true;
|
|
353
|
+
this._families.clear();
|
|
354
|
+
this._forget();
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/** Every list mapped before this is stale: a face arrived, or the faces
|
|
358
|
+
* changed. */
|
|
359
|
+
private _forget(): void {
|
|
360
|
+
this._memo.clear();
|
|
361
|
+
this._sources.clear();
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Load the face in a group that best matches a weight and slant, passing
|
|
366
|
+
* over the ones that failed. True when one registered before this
|
|
367
|
+
* returned.
|
|
368
|
+
*/
|
|
369
|
+
private _pick(group: Group, weight: number, italic: boolean): boolean {
|
|
370
|
+
for (;;) {
|
|
371
|
+
const face = bestFace(
|
|
372
|
+
group.faces.filter((f) => f.state !== 'failed'),
|
|
373
|
+
weight,
|
|
374
|
+
italic,
|
|
375
|
+
);
|
|
376
|
+
if (!face || face.state !== 'idle') return false;
|
|
377
|
+
const outcome = this._load(face);
|
|
378
|
+
if (outcome !== 'failed') return outcome === 'ready';
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Count what of the document each group's range holds, for a new text.
|
|
384
|
+
* An append — a stream — only reads what it appended. True when a family's
|
|
385
|
+
* loaded ranges come in another order than they did.
|
|
386
|
+
*/
|
|
387
|
+
private _measure(text: string, rescan: boolean): boolean {
|
|
388
|
+
const before = rescan ? '' : this._readyOrder();
|
|
389
|
+
const from =
|
|
390
|
+
!rescan && this._text !== null && text.startsWith(this._text)
|
|
391
|
+
? this._text.length
|
|
392
|
+
: 0;
|
|
393
|
+
if (from === 0) this._seen.clear();
|
|
394
|
+
const seen = this._seen;
|
|
395
|
+
const size = seen.size;
|
|
396
|
+
for (let i = from; i < text.length; i += 1) {
|
|
397
|
+
const code = text.charCodeAt(i);
|
|
398
|
+
if (code >= 0xd800 && code <= 0xdbff && i + 1 < text.length) {
|
|
399
|
+
const low = text.charCodeAt(i + 1);
|
|
400
|
+
if (low >= 0xdc00 && low <= 0xdfff) {
|
|
401
|
+
seen.add(((code - 0xd800) << 10) + (low - 0xdc00) + 0x10000);
|
|
402
|
+
i += 1;
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
seen.add(code);
|
|
407
|
+
}
|
|
408
|
+
this._text = text;
|
|
409
|
+
if (seen.size !== size || from === 0) {
|
|
410
|
+
this._points = Uint32Array.from(seen).sort();
|
|
411
|
+
for (const family of this._families.values()) {
|
|
412
|
+
for (const group of family.groups) {
|
|
413
|
+
if (!group.ranges) continue;
|
|
414
|
+
let count = 0;
|
|
415
|
+
for (const [lo, hi] of group.ranges) {
|
|
416
|
+
count += countBetween(this._points, lo, hi);
|
|
417
|
+
}
|
|
418
|
+
// a range the text has reached only now — the Cyrillic further
|
|
419
|
+
// down a streamed page — is asked for with the weights the
|
|
420
|
+
// family was asked at before it was reached
|
|
421
|
+
if (group.coverage <= 0 && count > 0) family.asked.clear();
|
|
422
|
+
group.coverage = count;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
return !rescan && this._readyOrder() !== before;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/** The loaded groups' names, family by family, in the order `map` puts
|
|
430
|
+
* them. */
|
|
431
|
+
private _readyOrder(): string {
|
|
432
|
+
let out = '';
|
|
433
|
+
for (const family of this._families.values()) {
|
|
434
|
+
for (const group of orderedGroups(family)) {
|
|
435
|
+
if (group.faces.some((f) => f.state === 'ready'))
|
|
436
|
+
out += `${group.name},`;
|
|
437
|
+
}
|
|
438
|
+
out += ';';
|
|
439
|
+
}
|
|
440
|
+
return out;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/** Load a face, trying its sources in order: registered before this
|
|
444
|
+
* returned, waiting on the host, or failed with nothing left to try. */
|
|
445
|
+
private _load(face: Face): 'ready' | 'loading' | 'failed' {
|
|
446
|
+
const app = this._app;
|
|
447
|
+
if (!app) {
|
|
448
|
+
face.state = 'failed';
|
|
449
|
+
return 'failed';
|
|
450
|
+
}
|
|
451
|
+
const registry = registryOf(app);
|
|
452
|
+
const key = faceKey(face.group.name, face.rule);
|
|
453
|
+
if (registry.ready.has(key)) {
|
|
454
|
+
face.state = 'ready';
|
|
455
|
+
return 'ready';
|
|
456
|
+
}
|
|
457
|
+
face.state = 'loading';
|
|
458
|
+
const waiting = registry.pending.get(key);
|
|
459
|
+
if (waiting) {
|
|
460
|
+
void waiting.then((ok) => this._settled(face, ok));
|
|
461
|
+
return 'loading';
|
|
462
|
+
}
|
|
463
|
+
let settle!: (ok: boolean) => void;
|
|
464
|
+
registry.pending.set(
|
|
465
|
+
key,
|
|
466
|
+
new Promise<boolean>((resolve) => (settle = resolve)),
|
|
467
|
+
);
|
|
468
|
+
const finish = (ok: boolean): void => {
|
|
469
|
+
registry.pending.delete(key);
|
|
470
|
+
if (ok) registry.ready.add(key);
|
|
471
|
+
settle(ok);
|
|
472
|
+
};
|
|
473
|
+
|
|
474
|
+
const sources = face.rule.sources.filter(
|
|
475
|
+
(s) => s.format === null || READABLE.has(s.format),
|
|
476
|
+
);
|
|
477
|
+
let i = 0;
|
|
478
|
+
let sync = true;
|
|
479
|
+
/** Ask for the next source. `'ready'` registered it, `'waiting'` is
|
|
480
|
+
* waiting on the host, `'none'` has no source left. */
|
|
481
|
+
const next = (): 'ready' | 'waiting' | 'none' => {
|
|
482
|
+
while (i < sources.length) {
|
|
483
|
+
const source = sources[i++];
|
|
484
|
+
let answer: ReturnType<Ask>;
|
|
485
|
+
try {
|
|
486
|
+
answer = this._ask({
|
|
487
|
+
url: source.url,
|
|
488
|
+
kind: 'font',
|
|
489
|
+
element: face.element,
|
|
490
|
+
});
|
|
491
|
+
} catch {
|
|
492
|
+
continue;
|
|
493
|
+
}
|
|
494
|
+
if (isPromise(answer)) {
|
|
495
|
+
answer.then(
|
|
496
|
+
(result) => after(this._register(face, result)),
|
|
497
|
+
() => after(false),
|
|
498
|
+
);
|
|
499
|
+
return 'waiting';
|
|
500
|
+
}
|
|
501
|
+
if (this._register(face, answer)) {
|
|
502
|
+
finish(true);
|
|
503
|
+
if (sync) face.state = 'ready';
|
|
504
|
+
else this._settled(face, true);
|
|
505
|
+
return 'ready';
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
return 'none';
|
|
509
|
+
};
|
|
510
|
+
const after = (registered: boolean): void => {
|
|
511
|
+
if (registered) {
|
|
512
|
+
finish(true);
|
|
513
|
+
this._settled(face, true);
|
|
514
|
+
} else if (next() === 'none') {
|
|
515
|
+
finish(false);
|
|
516
|
+
this._settled(face, false);
|
|
517
|
+
}
|
|
518
|
+
};
|
|
519
|
+
const outcome = next();
|
|
520
|
+
sync = false;
|
|
521
|
+
if (outcome === 'none') {
|
|
522
|
+
finish(false);
|
|
523
|
+
face.state = 'failed';
|
|
524
|
+
return 'failed';
|
|
525
|
+
}
|
|
526
|
+
return outcome === 'ready' ? 'ready' : 'loading';
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/** Register a face's bytes under its group's name. False when the host
|
|
530
|
+
* declined, or the font manager could not read them — a `.woff2` on
|
|
531
|
+
* macOS, whose CoreText reads no such container, or a file that is not a
|
|
532
|
+
* font — and the next source is tried. */
|
|
533
|
+
private _register(face: Face, result: ResourceResult | null): boolean {
|
|
534
|
+
if (this._destroyed || !this._app || result?.kind !== 'font') return false;
|
|
535
|
+
const { weight, style } = face.rule;
|
|
536
|
+
try {
|
|
537
|
+
loadFont(this._app as Parameters<typeof loadFont>[0], result.bytes, {
|
|
538
|
+
family: face.group.name,
|
|
539
|
+
// a range is registered at the weight nearest regular in it: the
|
|
540
|
+
// font manager picks among a group's faces by distance from one
|
|
541
|
+
// weight, and a variable face is then set at the weight asked for
|
|
542
|
+
weight: Math.max(weight[0], Math.min(400, weight[1])),
|
|
543
|
+
style,
|
|
544
|
+
});
|
|
545
|
+
return true;
|
|
546
|
+
} catch {
|
|
547
|
+
return false;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/** A face arrived, or will not. Either way the boxes are built again: an
|
|
552
|
+
* arrival changes the lists, and a failure has the next face asked for,
|
|
553
|
+
* by a family that has to be asked again to ask it. */
|
|
554
|
+
private _settled(face: Face, ok: boolean): void {
|
|
555
|
+
if (this._destroyed) return;
|
|
556
|
+
face.state = ok ? 'ready' : 'failed';
|
|
557
|
+
if (!ok) face.family.asked.clear();
|
|
558
|
+
this._forget();
|
|
559
|
+
this._changed();
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/** A face's identity within a registered name. */
|
|
564
|
+
function faceKey(name: string, rule: FontFaceRule): string {
|
|
565
|
+
return `${name}\u0000${faceSignature(rule)}`;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
function faceSignature(rule: FontFaceRule): string {
|
|
569
|
+
const range = rangeKey(rule.unicodeRange);
|
|
570
|
+
return `${rule.sources.map((s) => s.url).join(' ')}@${rule.weight.join(
|
|
571
|
+
'-',
|
|
572
|
+
)}${rule.style}#${range}`;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
function rangeKey(ranges: [number, number][] | null): string {
|
|
576
|
+
return ranges ? ranges.map(([a, b]) => `${a}-${b}`).join(',') : '*';
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
/** A family's groups, the one holding the most of the document first. */
|
|
580
|
+
function orderedGroups(family: Family): Group[] {
|
|
581
|
+
if (family.groups.length < 2) return family.groups;
|
|
582
|
+
return [...family.groups].sort(
|
|
583
|
+
(a, b) => b.coverage - a.coverage || a.order - b.order,
|
|
584
|
+
);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
/**
|
|
588
|
+
* The face CSS Fonts 4 (5.2) matches a weight and slant with: the slant
|
|
589
|
+
* first, then a weight inside the face's range, then the nearest outside it
|
|
590
|
+
* in the direction the spec prefers — lighter below 400, heavier above 500,
|
|
591
|
+
* and between them up to 500 before down.
|
|
592
|
+
*/
|
|
593
|
+
export function bestFace<T extends { rule: FontFaceRule }>(
|
|
594
|
+
faces: T[],
|
|
595
|
+
weight: number,
|
|
596
|
+
italic: boolean,
|
|
597
|
+
): T | null {
|
|
598
|
+
let best: T | null = null;
|
|
599
|
+
let bestScore = Infinity;
|
|
600
|
+
for (const face of faces) {
|
|
601
|
+
const score =
|
|
602
|
+
weightDistance(weight, face.rule.weight) +
|
|
603
|
+
((face.rule.style === 'italic') === italic ? 0 : 10000);
|
|
604
|
+
if (score < bestScore) {
|
|
605
|
+
best = face;
|
|
606
|
+
bestScore = score;
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
return best;
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
function weightDistance(want: number, [lo, hi]: [number, number]): number {
|
|
613
|
+
if (want >= lo && want <= hi) return 0;
|
|
614
|
+
if (want >= 400 && want <= 500) {
|
|
615
|
+
if (lo > want && lo <= 500) return lo - want;
|
|
616
|
+
if (hi < want) return 1000 + (want - hi);
|
|
617
|
+
return 2000 + (lo - want);
|
|
618
|
+
}
|
|
619
|
+
if (want < 400) return hi < want ? want - hi : 1000 + (lo - want);
|
|
620
|
+
return lo > want ? lo - want : 1000 + (want - hi);
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
/** How many of the sorted `points` lie in `[lo, hi]`. */
|
|
624
|
+
function countBetween(points: Uint32Array, lo: number, hi: number): number {
|
|
625
|
+
return lowerBound(points, hi + 1) - lowerBound(points, lo);
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
function lowerBound(points: Uint32Array, value: number): number {
|
|
629
|
+
let a = 0;
|
|
630
|
+
let b = points.length;
|
|
631
|
+
while (a < b) {
|
|
632
|
+
const mid = (a + b) >> 1;
|
|
633
|
+
if (points[mid] < value) a = mid + 1;
|
|
634
|
+
else b = mid;
|
|
635
|
+
}
|
|
636
|
+
return a;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
function isPromise<T>(value: unknown): value is Promise<T> {
|
|
640
|
+
return typeof (value as Promise<T> | null)?.then === 'function';
|
|
641
|
+
}
|