@react-x11/components 0.1.0 → 0.2.1
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 +979 -21
- package/dist/ansi/cast.d.ts +48 -0
- package/dist/ansi/cast.d.ts.map +1 -0
- package/dist/ansi/cast.js +135 -0
- package/dist/ansi/cast.js.map +1 -0
- package/dist/ansi/index.d.ts +10 -0
- package/dist/ansi/index.d.ts.map +1 -0
- package/dist/ansi/index.js +27 -0
- package/dist/ansi/index.js.map +1 -0
- package/dist/ansi/palette.d.ts +79 -0
- package/dist/ansi/palette.d.ts.map +1 -0
- package/dist/ansi/palette.js +155 -0
- package/dist/ansi/palette.js.map +1 -0
- package/dist/ansi/parse.d.ts +114 -0
- package/dist/ansi/parse.d.ts.map +1 -0
- package/dist/ansi/parse.js +687 -0
- package/dist/ansi/parse.js.map +1 -0
- package/dist/ansi/sgr.d.ts +87 -0
- package/dist/ansi/sgr.d.ts.map +1 -0
- package/dist/ansi/sgr.js +302 -0
- package/dist/ansi/sgr.js.map +1 -0
- package/dist/ansi/utf8.d.ts +15 -0
- package/dist/ansi/utf8.d.ts.map +1 -0
- package/dist/ansi/utf8.js +82 -0
- package/dist/ansi/utf8.js.map +1 -0
- package/dist/calendar/Calendar.d.ts +136 -0
- package/dist/calendar/Calendar.d.ts.map +1 -0
- package/dist/calendar/Calendar.js +460 -0
- package/dist/calendar/Calendar.js.map +1 -0
- package/dist/calendar/DatePicker.d.ts +52 -0
- package/dist/calendar/DatePicker.d.ts.map +1 -0
- package/dist/calendar/DatePicker.js +257 -0
- package/dist/calendar/DatePicker.js.map +1 -0
- package/dist/calendar/dates.d.ts +90 -0
- package/dist/calendar/dates.d.ts.map +1 -0
- package/dist/calendar/dates.js +236 -0
- package/dist/calendar/dates.js.map +1 -0
- package/dist/calendar/index.d.ts +8 -0
- package/dist/calendar/index.d.ts.map +1 -0
- package/dist/calendar/index.js +15 -0
- package/dist/calendar/index.js.map +1 -0
- package/dist/charts/components.d.ts +141 -0
- package/dist/charts/components.d.ts.map +1 -0
- package/dist/charts/components.js +580 -0
- package/dist/charts/components.js.map +1 -0
- package/dist/charts/data.d.ts +198 -0
- package/dist/charts/data.d.ts.map +1 -0
- package/dist/charts/data.js +616 -0
- package/dist/charts/data.js.map +1 -0
- package/dist/charts/hx.d.ts +21 -0
- package/dist/charts/hx.d.ts.map +1 -0
- package/dist/charts/hx.js +15 -0
- package/dist/charts/hx.js.map +1 -0
- package/dist/charts/index.d.ts +27 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +38 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/charts/node.d.ts +96 -0
- package/dist/charts/node.d.ts.map +1 -0
- package/dist/charts/node.js +720 -0
- package/dist/charts/node.js.map +1 -0
- package/dist/charts/render.d.ts +153 -0
- package/dist/charts/render.d.ts.map +1 -0
- package/dist/charts/render.js +762 -0
- package/dist/charts/render.js.map +1 -0
- package/dist/charts/scale.d.ts +42 -0
- package/dist/charts/scale.d.ts.map +1 -0
- package/dist/charts/scale.js +173 -0
- package/dist/charts/scale.js.map +1 -0
- package/dist/charts/spec.d.ts +91 -0
- package/dist/charts/spec.d.ts.map +1 -0
- package/dist/charts/spec.js +33 -0
- package/dist/charts/spec.js.map +1 -0
- package/dist/charts/timers.d.ts +6 -0
- package/dist/charts/timers.d.ts.map +1 -0
- package/dist/charts/timers.js +14 -0
- package/dist/charts/timers.js.map +1 -0
- package/dist/code/hx.d.ts +24 -0
- package/dist/code/hx.d.ts.map +1 -0
- package/dist/code/hx.js +25 -0
- package/dist/code/hx.js.map +1 -0
- package/dist/code/index.d.ts +45 -0
- package/dist/code/index.d.ts.map +1 -0
- package/dist/code/index.js +93 -0
- package/dist/code/index.js.map +1 -0
- package/dist/code-editor/completion.d.ts +26 -0
- package/dist/code-editor/completion.d.ts.map +1 -0
- package/dist/code-editor/completion.js +129 -0
- package/dist/code-editor/completion.js.map +1 -0
- package/dist/code-editor/doc.d.ts +35 -0
- package/dist/code-editor/doc.d.ts.map +1 -0
- package/dist/code-editor/doc.js +162 -0
- package/dist/code-editor/doc.js.map +1 -0
- package/dist/code-editor/hx.d.ts +13 -0
- package/dist/code-editor/hx.d.ts.map +1 -0
- package/dist/code-editor/hx.js +10 -0
- package/dist/code-editor/hx.js.map +1 -0
- package/dist/code-editor/index.d.ts +88 -0
- package/dist/code-editor/index.d.ts.map +1 -0
- package/dist/code-editor/index.js +401 -0
- package/dist/code-editor/index.js.map +1 -0
- package/dist/code-editor/node.d.ts +343 -0
- package/dist/code-editor/node.d.ts.map +1 -0
- package/dist/code-editor/node.js +1521 -0
- package/dist/code-editor/node.js.map +1 -0
- package/dist/code-language/hljs.d.ts +47 -0
- package/dist/code-language/hljs.d.ts.map +1 -0
- package/dist/code-language/hljs.js +211 -0
- package/dist/code-language/hljs.js.map +1 -0
- package/dist/code-language/index.d.ts +22 -0
- package/dist/code-language/index.d.ts.map +1 -0
- package/dist/code-language/index.js +20 -0
- package/dist/code-language/index.js.map +1 -0
- package/dist/code-language/languages/glsl.d.ts +4 -0
- package/dist/code-language/languages/glsl.d.ts.map +1 -0
- package/dist/code-language/languages/glsl.js +99 -0
- package/dist/code-language/languages/glsl.js.map +1 -0
- package/dist/code-language/languages/javascript.d.ts +10 -0
- package/dist/code-language/languages/javascript.d.ts.map +1 -0
- package/dist/code-language/languages/javascript.js +360 -0
- package/dist/code-language/languages/javascript.js.map +1 -0
- package/dist/code-language/languages/json.d.ts +4 -0
- package/dist/code-language/languages/json.d.ts.map +1 -0
- package/dist/code-language/languages/json.js +68 -0
- package/dist/code-language/languages/json.js.map +1 -0
- package/dist/code-language/languages/shell.d.ts +4 -0
- package/dist/code-language/languages/shell.d.ts.map +1 -0
- package/dist/code-language/languages/shell.js +189 -0
- package/dist/code-language/languages/shell.js.map +1 -0
- package/dist/code-language/languages/sql.d.ts +11 -0
- package/dist/code-language/languages/sql.d.ts.map +1 -0
- package/dist/code-language/languages/sql.js +133 -0
- package/dist/code-language/languages/sql.js.map +1 -0
- package/dist/code-language/lezer.d.ts +24 -0
- package/dist/code-language/lezer.d.ts.map +1 -0
- package/dist/code-language/lezer.js +148 -0
- package/dist/code-language/lezer.js.map +1 -0
- package/dist/code-language/registry.d.ts +19 -0
- package/dist/code-language/registry.d.ts.map +1 -0
- package/dist/code-language/registry.js +56 -0
- package/dist/code-language/registry.js.map +1 -0
- package/dist/code-language/runs.d.ts +35 -0
- package/dist/code-language/runs.d.ts.map +1 -0
- package/dist/code-language/runs.js +88 -0
- package/dist/code-language/runs.js.map +1 -0
- package/dist/code-language/stream.d.ts +70 -0
- package/dist/code-language/stream.d.ts.map +1 -0
- package/dist/code-language/stream.js +243 -0
- package/dist/code-language/stream.js.map +1 -0
- package/dist/code-language/textmate.d.ts +27 -0
- package/dist/code-language/textmate.d.ts.map +1 -0
- package/dist/code-language/textmate.js +86 -0
- package/dist/code-language/textmate.js.map +1 -0
- package/dist/code-language/theme.d.ts +26 -0
- package/dist/code-language/theme.d.ts.map +1 -0
- package/dist/code-language/theme.js +108 -0
- package/dist/code-language/theme.js.map +1 -0
- package/dist/code-language/timers.d.ts +7 -0
- package/dist/code-language/timers.d.ts.map +1 -0
- package/dist/code-language/timers.js +22 -0
- package/dist/code-language/timers.js.map +1 -0
- package/dist/code-language/types.d.ts +173 -0
- package/dist/code-language/types.d.ts.map +1 -0
- package/dist/code-language/types.js +41 -0
- package/dist/code-language/types.js.map +1 -0
- package/dist/codeblock/index.d.ts +69 -0
- package/dist/codeblock/index.d.ts.map +1 -0
- package/dist/codeblock/index.js +85 -0
- package/dist/codeblock/index.js.map +1 -0
- package/dist/color-picker/ColorField.d.ts +39 -0
- package/dist/color-picker/ColorField.d.ts.map +1 -0
- package/dist/color-picker/ColorField.js +239 -0
- package/dist/color-picker/ColorField.js.map +1 -0
- package/dist/color-picker/ColorPicker.d.ts +109 -0
- package/dist/color-picker/ColorPicker.d.ts.map +1 -0
- package/dist/color-picker/ColorPicker.js +757 -0
- package/dist/color-picker/ColorPicker.js.map +1 -0
- package/dist/color-picker/color.d.ts +105 -0
- package/dist/color-picker/color.d.ts.map +1 -0
- package/dist/color-picker/color.js +313 -0
- package/dist/color-picker/color.js.map +1 -0
- package/dist/color-picker/index.d.ts +8 -0
- package/dist/color-picker/index.d.ts.map +1 -0
- package/dist/color-picker/index.js +19 -0
- package/dist/color-picker/index.js.map +1 -0
- package/dist/desktop-calendar/eds.d.ts +102 -0
- package/dist/desktop-calendar/eds.d.ts.map +1 -0
- package/dist/desktop-calendar/eds.js +356 -0
- package/dist/desktop-calendar/eds.js.map +1 -0
- package/dist/desktop-calendar/ical.d.ts +63 -0
- package/dist/desktop-calendar/ical.d.ts.map +1 -0
- package/dist/desktop-calendar/ical.js +57 -0
- package/dist/desktop-calendar/ical.js.map +1 -0
- package/dist/desktop-calendar/index.d.ts +72 -0
- package/dist/desktop-calendar/index.d.ts.map +1 -0
- package/dist/desktop-calendar/index.js +213 -0
- package/dist/desktop-calendar/index.js.map +1 -0
- package/dist/embed/client.d.ts +121 -0
- package/dist/embed/client.d.ts.map +1 -0
- package/dist/embed/client.js +203 -0
- package/dist/embed/client.js.map +1 -0
- package/dist/embed/host.d.ts +96 -0
- package/dist/embed/host.d.ts.map +1 -0
- package/dist/embed/host.js +266 -0
- package/dist/embed/host.js.map +1 -0
- package/dist/embed/index.d.ts +5 -0
- package/dist/embed/index.d.ts.map +1 -0
- package/dist/embed/index.js +13 -0
- package/dist/embed/index.js.map +1 -0
- package/dist/embed/timers.d.ts +6 -0
- package/dist/embed/timers.d.ts.map +1 -0
- package/dist/embed/timers.js +16 -0
- package/dist/embed/timers.js.map +1 -0
- package/dist/flow/draw.d.ts +45 -0
- package/dist/flow/draw.d.ts.map +1 -0
- package/dist/flow/draw.js +295 -0
- package/dist/flow/draw.js.map +1 -0
- package/dist/flow/index.d.ts +64 -0
- package/dist/flow/index.d.ts.map +1 -0
- package/dist/flow/index.js +306 -0
- package/dist/flow/index.js.map +1 -0
- package/dist/flow/model.d.ts +158 -0
- package/dist/flow/model.d.ts.map +1 -0
- package/dist/flow/model.js +566 -0
- package/dist/flow/model.js.map +1 -0
- package/dist/flow/node.d.ts +429 -0
- package/dist/flow/node.d.ts.map +1 -0
- package/dist/flow/node.js +3025 -0
- package/dist/flow/node.js.map +1 -0
- package/dist/flow/paths.d.ts +43 -0
- package/dist/flow/paths.d.ts.map +1 -0
- package/dist/flow/paths.js +327 -0
- package/dist/flow/paths.js.map +1 -0
- package/dist/flow/types.d.ts +561 -0
- package/dist/flow/types.d.ts.map +1 -0
- package/dist/flow/types.js +2 -0
- package/dist/flow/types.js.map +1 -0
- package/dist/formula/hx.d.ts +24 -0
- package/dist/formula/hx.d.ts.map +1 -0
- package/dist/formula/hx.js +25 -0
- package/dist/formula/hx.js.map +1 -0
- package/dist/formula/index.d.ts +74 -0
- package/dist/formula/index.d.ts.map +1 -0
- package/dist/formula/index.js +155 -0
- package/dist/formula/index.js.map +1 -0
- package/dist/formula/katex.d.ts +78 -0
- package/dist/formula/katex.d.ts.map +1 -0
- package/dist/formula/katex.js +130 -0
- package/dist/formula/katex.js.map +1 -0
- package/dist/formula/layout.d.ts +103 -0
- package/dist/formula/layout.d.ts.map +1 -0
- package/dist/formula/layout.js +716 -0
- package/dist/formula/layout.js.map +1 -0
- package/dist/formula/node.d.ts +50 -0
- package/dist/formula/node.d.ts.map +1 -0
- package/dist/formula/node.js +351 -0
- package/dist/formula/node.js.map +1 -0
- package/dist/html/controls.d.ts +48 -0
- package/dist/html/controls.d.ts.map +1 -0
- package/dist/html/controls.js +195 -0
- package/dist/html/controls.js.map +1 -0
- package/dist/html/css/cascade.d.ts +51 -0
- package/dist/html/css/cascade.d.ts.map +1 -0
- package/dist/html/css/cascade.js +552 -0
- package/dist/html/css/cascade.js.map +1 -0
- package/dist/html/css/parse.d.ts +74 -0
- package/dist/html/css/parse.d.ts.map +1 -0
- package/dist/html/css/parse.js +464 -0
- package/dist/html/css/parse.js.map +1 -0
- package/dist/html/css/style.d.ts +142 -0
- package/dist/html/css/style.d.ts.map +1 -0
- package/dist/html/css/style.js +1145 -0
- package/dist/html/css/style.js.map +1 -0
- package/dist/html/css/ua.d.ts +5 -0
- package/dist/html/css/ua.d.ts.map +1 -0
- package/dist/html/css/ua.js +171 -0
- package/dist/html/css/ua.js.map +1 -0
- package/dist/html/css/values.d.ts +78 -0
- package/dist/html/css/values.d.ts.map +1 -0
- package/dist/html/css/values.js +330 -0
- package/dist/html/css/values.js.map +1 -0
- package/dist/html/dom.d.ts +112 -0
- package/dist/html/dom.d.ts.map +1 -0
- package/dist/html/dom.js +374 -0
- package/dist/html/dom.js.map +1 -0
- package/dist/html/hx.d.ts +24 -0
- package/dist/html/hx.d.ts.map +1 -0
- package/dist/html/hx.js +29 -0
- package/dist/html/hx.js.map +1 -0
- package/dist/html/index.d.ts +137 -0
- package/dist/html/index.d.ts.map +1 -0
- package/dist/html/index.js +339 -0
- package/dist/html/index.js.map +1 -0
- package/dist/html/layout/block.d.ts +58 -0
- package/dist/html/layout/block.d.ts.map +1 -0
- package/dist/html/layout/block.js +724 -0
- package/dist/html/layout/block.js.map +1 -0
- package/dist/html/layout/boxes.d.ts +261 -0
- package/dist/html/layout/boxes.d.ts.map +1 -0
- package/dist/html/layout/boxes.js +725 -0
- package/dist/html/layout/boxes.js.map +1 -0
- package/dist/html/layout/flex.d.ts +16 -0
- package/dist/html/layout/flex.d.ts.map +1 -0
- package/dist/html/layout/flex.js +242 -0
- package/dist/html/layout/flex.js.map +1 -0
- package/dist/html/layout/floats.d.ts +50 -0
- package/dist/html/layout/floats.d.ts.map +1 -0
- package/dist/html/layout/floats.js +110 -0
- package/dist/html/layout/floats.js.map +1 -0
- package/dist/html/layout/inline.d.ts +44 -0
- package/dist/html/layout/inline.d.ts.map +1 -0
- package/dist/html/layout/inline.js +700 -0
- package/dist/html/layout/inline.js.map +1 -0
- package/dist/html/layout/table.d.ts +5 -0
- package/dist/html/layout/table.d.ts.map +1 -0
- package/dist/html/layout/table.js +340 -0
- package/dist/html/layout/table.js.map +1 -0
- package/dist/html/node.d.ts +149 -0
- package/dist/html/node.d.ts.map +1 -0
- package/dist/html/node.js +861 -0
- package/dist/html/node.js.map +1 -0
- package/dist/html/paint.d.ts +48 -0
- package/dist/html/paint.d.ts.map +1 -0
- package/dist/html/paint.js +495 -0
- package/dist/html/paint.js.map +1 -0
- package/dist/html/resources.d.ts +48 -0
- package/dist/html/resources.d.ts.map +1 -0
- package/dist/html/resources.js +156 -0
- package/dist/html/resources.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/heights.d.ts +88 -0
- package/dist/internal/heights.d.ts.map +1 -0
- package/dist/internal/heights.js +203 -0
- package/dist/internal/heights.js.map +1 -0
- package/dist/internal/hx.d.ts +24 -0
- package/dist/internal/hx.d.ts.map +1 -0
- package/dist/internal/hx.js +27 -0
- package/dist/internal/hx.js.map +1 -0
- package/dist/internal/scroll.d.ts +62 -0
- package/dist/internal/scroll.d.ts.map +1 -0
- package/dist/internal/scroll.js +224 -0
- package/dist/internal/scroll.js.map +1 -0
- package/dist/internal/text.d.ts +6 -0
- package/dist/internal/text.d.ts.map +1 -0
- package/dist/internal/text.js +44 -0
- package/dist/internal/text.js.map +1 -0
- package/dist/internal/timers.d.ts +8 -0
- package/dist/internal/timers.d.ts.map +1 -0
- package/dist/internal/timers.js +22 -0
- package/dist/internal/timers.js.map +1 -0
- package/dist/internal/widget.d.ts +40 -0
- package/dist/internal/widget.d.ts.map +1 -0
- package/dist/internal/widget.js +44 -0
- package/dist/internal/widget.js.map +1 -0
- package/dist/markdown/ast.d.ts +126 -0
- package/dist/markdown/ast.d.ts.map +1 -0
- package/dist/markdown/ast.js +8 -0
- package/dist/markdown/ast.js.map +1 -0
- package/dist/markdown/hx.d.ts +24 -0
- package/dist/markdown/hx.d.ts.map +1 -0
- package/dist/markdown/hx.js +25 -0
- package/dist/markdown/hx.js.map +1 -0
- package/dist/markdown/index.d.ts +90 -0
- package/dist/markdown/index.d.ts.map +1 -0
- package/dist/markdown/index.js +413 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/markdown/parse.d.ts +8 -0
- package/dist/markdown/parse.d.ts.map +1 -0
- package/dist/markdown/parse.js +911 -0
- package/dist/markdown/parse.js.map +1 -0
- package/dist/markdown/spans.d.ts +20 -0
- package/dist/markdown/spans.d.ts.map +1 -0
- package/dist/markdown/spans.js +96 -0
- package/dist/markdown/spans.js.map +1 -0
- package/dist/media-player/backends.d.ts +64 -0
- package/dist/media-player/backends.d.ts.map +1 -0
- package/dist/media-player/backends.js +110 -0
- package/dist/media-player/backends.js.map +1 -0
- package/dist/media-player/control.d.ts +40 -0
- package/dist/media-player/control.d.ts.map +1 -0
- package/dist/media-player/control.js +44 -0
- package/dist/media-player/control.js.map +1 -0
- package/dist/media-player/hx.d.ts +24 -0
- package/dist/media-player/hx.d.ts.map +1 -0
- package/dist/media-player/hx.js +25 -0
- package/dist/media-player/hx.js.map +1 -0
- package/dist/media-player/index.d.ts +107 -0
- package/dist/media-player/index.d.ts.map +1 -0
- package/dist/media-player/index.js +219 -0
- package/dist/media-player/index.js.map +1 -0
- package/dist/media-player/mpv.d.ts +4 -0
- package/dist/media-player/mpv.d.ts.map +1 -0
- package/dist/media-player/mpv.js +120 -0
- package/dist/media-player/mpv.js.map +1 -0
- package/dist/media-player/vlc.d.ts +8 -0
- package/dist/media-player/vlc.d.ts.map +1 -0
- package/dist/media-player/vlc.js +83 -0
- package/dist/media-player/vlc.js.map +1 -0
- package/dist/richtext/index.d.ts +19 -0
- package/dist/richtext/index.d.ts.map +1 -0
- package/dist/richtext/index.js +4 -0
- package/dist/richtext/index.js.map +1 -0
- package/dist/richtext/links.d.ts +12 -0
- package/dist/richtext/links.d.ts.map +1 -0
- package/dist/richtext/links.js +64 -0
- package/dist/richtext/links.js.map +1 -0
- package/dist/richtext/menu.d.ts +11 -0
- package/dist/richtext/menu.d.ts.map +1 -0
- package/dist/richtext/menu.js +43 -0
- package/dist/richtext/menu.js.map +1 -0
- package/dist/richtext/node.d.ts +151 -0
- package/dist/richtext/node.d.ts.map +1 -0
- package/dist/richtext/node.js +255 -0
- package/dist/richtext/node.js.map +1 -0
- package/dist/richtext/runs.d.ts +92 -0
- package/dist/richtext/runs.d.ts.map +1 -0
- package/dist/richtext/runs.js +158 -0
- package/dist/richtext/runs.js.map +1 -0
- package/dist/table/hx.d.ts +24 -0
- package/dist/table/hx.d.ts.map +1 -0
- package/dist/table/hx.js +25 -0
- package/dist/table/hx.js.map +1 -0
- package/dist/table/index.d.ts +169 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/table/index.js +890 -0
- package/dist/table/index.js.map +1 -0
- package/dist/table/rows.d.ts +136 -0
- package/dist/table/rows.d.ts.map +1 -0
- package/dist/table/rows.js +146 -0
- package/dist/table/rows.js.map +1 -0
- package/dist/terminal/backends.d.ts +105 -0
- package/dist/terminal/backends.d.ts.map +1 -0
- package/dist/terminal/backends.js +185 -0
- package/dist/terminal/backends.js.map +1 -0
- package/dist/terminal/hx.d.ts +24 -0
- package/dist/terminal/hx.d.ts.map +1 -0
- package/dist/terminal/hx.js +25 -0
- package/dist/terminal/hx.js.map +1 -0
- package/dist/terminal/index.d.ts +160 -0
- package/dist/terminal/index.d.ts.map +1 -0
- package/dist/terminal/index.js +344 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/terminal/title.d.ts +24 -0
- package/dist/terminal/title.d.ts.map +1 -0
- package/dist/terminal/title.js +129 -0
- package/dist/terminal/title.js.map +1 -0
- package/dist/terminal/vt/colors.d.ts +63 -0
- package/dist/terminal/vt/colors.d.ts.map +1 -0
- package/dist/terminal/vt/colors.js +203 -0
- package/dist/terminal/vt/colors.js.map +1 -0
- package/dist/terminal/vt/diff.d.ts +117 -0
- package/dist/terminal/vt/diff.d.ts.map +1 -0
- package/dist/terminal/vt/diff.js +358 -0
- package/dist/terminal/vt/diff.js.map +1 -0
- package/dist/terminal/vt/fonts.d.ts +92 -0
- package/dist/terminal/vt/fonts.d.ts.map +1 -0
- package/dist/terminal/vt/fonts.js +178 -0
- package/dist/terminal/vt/fonts.js.map +1 -0
- package/dist/terminal/vt/index.d.ts +78 -0
- package/dist/terminal/vt/index.d.ts.map +1 -0
- package/dist/terminal/vt/index.js +312 -0
- package/dist/terminal/vt/index.js.map +1 -0
- package/dist/terminal/vt/keys.d.ts +74 -0
- package/dist/terminal/vt/keys.d.ts.map +1 -0
- package/dist/terminal/vt/keys.js +309 -0
- package/dist/terminal/vt/keys.js.map +1 -0
- package/dist/terminal/vt/mouse.d.ts +44 -0
- package/dist/terminal/vt/mouse.d.ts.map +1 -0
- package/dist/terminal/vt/mouse.js +106 -0
- package/dist/terminal/vt/mouse.js.map +1 -0
- package/dist/terminal/vt/node.d.ts +246 -0
- package/dist/terminal/vt/node.d.ts.map +1 -0
- package/dist/terminal/vt/node.js +1068 -0
- package/dist/terminal/vt/node.js.map +1 -0
- package/dist/terminal/vt/pty.d.ts +81 -0
- package/dist/terminal/vt/pty.d.ts.map +1 -0
- package/dist/terminal/vt/pty.js +201 -0
- package/dist/terminal/vt/pty.js.map +1 -0
- package/dist/terminal/vt/renderer.d.ts +179 -0
- package/dist/terminal/vt/renderer.d.ts.map +1 -0
- package/dist/terminal/vt/renderer.js +357 -0
- package/dist/terminal/vt/renderer.js.map +1 -0
- package/dist/terminal/vt/timers.d.ts +6 -0
- package/dist/terminal/vt/timers.d.ts.map +1 -0
- package/dist/terminal/vt/timers.js +16 -0
- package/dist/terminal/vt/timers.js.map +1 -0
- package/dist/terminal/vt/xterm.d.ts +142 -0
- package/dist/terminal/vt/xterm.d.ts.map +1 -0
- package/dist/terminal/vt/xterm.js +32 -0
- package/dist/terminal/vt/xterm.js.map +1 -0
- package/dist/terminal-output/hx.d.ts +24 -0
- package/dist/terminal-output/hx.d.ts.map +1 -0
- package/dist/terminal-output/hx.js +25 -0
- package/dist/terminal-output/hx.js.map +1 -0
- package/dist/terminal-output/index.d.ts +92 -0
- package/dist/terminal-output/index.d.ts.map +1 -0
- package/dist/terminal-output/index.js +179 -0
- package/dist/terminal-output/index.js.map +1 -0
- package/dist/terminal-output/runs.d.ts +27 -0
- package/dist/terminal-output/runs.d.ts.map +1 -0
- package/dist/terminal-output/runs.js +66 -0
- package/dist/terminal-output/runs.js.map +1 -0
- package/dist/three/canvas.d.ts +46 -0
- package/dist/three/canvas.d.ts.map +1 -0
- package/dist/three/canvas.js +305 -0
- package/dist/three/canvas.js.map +1 -0
- package/dist/three/events.d.ts +64 -0
- package/dist/three/events.d.ts.map +1 -0
- package/dist/three/events.js +146 -0
- package/dist/three/events.js.map +1 -0
- package/dist/three/geometries.d.ts +89 -0
- package/dist/three/geometries.d.ts.map +1 -0
- package/dist/three/geometries.js +345 -0
- package/dist/three/geometries.js.map +1 -0
- package/dist/three/globals.d.ts +7 -0
- package/dist/three/globals.d.ts.map +1 -0
- package/dist/three/globals.js +20 -0
- package/dist/three/globals.js.map +1 -0
- package/dist/three/hx.d.ts +9 -0
- package/dist/three/hx.d.ts.map +1 -0
- package/dist/three/hx.js +10 -0
- package/dist/three/hx.js.map +1 -0
- package/dist/three/index.d.ts +22 -0
- package/dist/three/index.d.ts.map +1 -0
- package/dist/three/index.js +24 -0
- package/dist/three/index.js.map +1 -0
- package/dist/three/jsx-dev-runtime.d.ts +19 -0
- package/dist/three/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/three/jsx-dev-runtime.js +2 -0
- package/dist/three/jsx-dev-runtime.js.map +1 -0
- package/dist/three/jsx-runtime.d.ts +19 -0
- package/dist/three/jsx-runtime.d.ts.map +1 -0
- package/dist/three/jsx-runtime.js +2 -0
- package/dist/three/jsx-runtime.js.map +1 -0
- package/dist/three/jsx.d.ts +198 -0
- package/dist/three/jsx.d.ts.map +1 -0
- package/dist/three/jsx.js +2 -0
- package/dist/three/jsx.js.map +1 -0
- package/dist/three/materials.d.ts +125 -0
- package/dist/three/materials.d.ts.map +1 -0
- package/dist/three/materials.js +229 -0
- package/dist/three/materials.js.map +1 -0
- package/dist/three/math.d.ts +146 -0
- package/dist/three/math.d.ts.map +1 -0
- package/dist/three/math.js +464 -0
- package/dist/three/math.js.map +1 -0
- package/dist/three/objects.d.ts +185 -0
- package/dist/three/objects.d.ts.map +1 -0
- package/dist/three/objects.js +309 -0
- package/dist/three/objects.js.map +1 -0
- package/dist/three/passes.d.ts +54 -0
- package/dist/three/passes.d.ts.map +1 -0
- package/dist/three/passes.js +78 -0
- package/dist/three/passes.js.map +1 -0
- package/dist/three/postprocess.d.ts +85 -0
- package/dist/three/postprocess.d.ts.map +1 -0
- package/dist/three/postprocess.js +503 -0
- package/dist/three/postprocess.js.map +1 -0
- package/dist/three/raycast.d.ts +24 -0
- package/dist/three/raycast.d.ts.map +1 -0
- package/dist/three/raycast.js +138 -0
- package/dist/three/raycast.js.map +1 -0
- package/dist/three/reconciler.d.ts +48 -0
- package/dist/three/reconciler.d.ts.map +1 -0
- package/dist/three/reconciler.js +416 -0
- package/dist/three/reconciler.js.map +1 -0
- package/dist/three/renderer-direct.d.ts +102 -0
- package/dist/three/renderer-direct.d.ts.map +1 -0
- package/dist/three/renderer-direct.js +782 -0
- package/dist/three/renderer-direct.js.map +1 -0
- package/dist/three/renderer-indirect.d.ts +68 -0
- package/dist/three/renderer-indirect.d.ts.map +1 -0
- package/dist/three/renderer-indirect.js +438 -0
- package/dist/three/renderer-indirect.js.map +1 -0
- package/dist/three/store.d.ts +81 -0
- package/dist/three/store.d.ts.map +1 -0
- package/dist/three/store.js +110 -0
- package/dist/three/store.js.map +1 -0
- package/dist/timeline/hx.d.ts +18 -0
- package/dist/timeline/hx.d.ts.map +1 -0
- package/dist/timeline/hx.js +10 -0
- package/dist/timeline/hx.js.map +1 -0
- package/dist/timeline/index.d.ts +152 -0
- package/dist/timeline/index.d.ts.map +1 -0
- package/dist/timeline/index.js +383 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/tray-host/hx.d.ts +24 -0
- package/dist/tray-host/hx.d.ts.map +1 -0
- package/dist/tray-host/hx.js +25 -0
- package/dist/tray-host/hx.js.map +1 -0
- package/dist/tray-host/index.d.ts +110 -0
- package/dist/tray-host/index.d.ts.map +1 -0
- package/dist/tray-host/index.js +191 -0
- package/dist/tray-host/index.js.map +1 -0
- package/dist/tray-host/manager.d.ts +137 -0
- package/dist/tray-host/manager.d.ts.map +1 -0
- package/dist/tray-host/manager.js +462 -0
- package/dist/tray-host/manager.js.map +1 -0
- package/dist/tray-host/notify.d.ts +22 -0
- package/dist/tray-host/notify.d.ts.map +1 -0
- package/dist/tray-host/notify.js +74 -0
- package/dist/tray-host/notify.js.map +1 -0
- package/dist/tray-host/protocol.d.ts +106 -0
- package/dist/tray-host/protocol.d.ts.map +1 -0
- package/dist/tray-host/protocol.js +191 -0
- package/dist/tray-host/protocol.js.map +1 -0
- package/dist/tree/hx.d.ts +24 -0
- package/dist/tree/hx.d.ts.map +1 -0
- package/dist/tree/hx.js +25 -0
- package/dist/tree/hx.js.map +1 -0
- package/dist/tree/index.d.ts +221 -0
- package/dist/tree/index.d.ts.map +1 -0
- package/dist/tree/index.js +751 -0
- package/dist/tree/index.js.map +1 -0
- package/dist/tree/internal.d.ts +18 -0
- package/dist/tree/internal.d.ts.map +1 -0
- package/dist/tree/internal.js +66 -0
- package/dist/tree/internal.js.map +1 -0
- package/dist/tree/rows.d.ts +177 -0
- package/dist/tree/rows.d.ts.map +1 -0
- package/dist/tree/rows.js +179 -0
- package/dist/tree/rows.js.map +1 -0
- package/package.json +166 -12
- package/src/ansi/cast.ts +159 -0
- package/src/ansi/index.ts +53 -0
- package/src/ansi/palette.ts +226 -0
- package/src/ansi/parse.ts +780 -0
- package/src/ansi/sgr.ts +380 -0
- package/src/ansi/utf8.ts +84 -0
- package/src/calendar/Calendar.ts +744 -0
- package/src/calendar/DatePicker.ts +368 -0
- package/src/calendar/dates.ts +307 -0
- package/src/calendar/index.ts +51 -0
- package/src/charts/components.ts +864 -0
- package/src/charts/data.ts +776 -0
- package/src/charts/hx.ts +39 -0
- package/src/charts/index.ts +99 -0
- package/src/charts/node.ts +932 -0
- package/src/charts/render.ts +982 -0
- package/src/charts/scale.ts +214 -0
- package/src/charts/spec.ts +122 -0
- package/src/charts/timers.ts +24 -0
- package/src/code/hx.ts +51 -0
- package/src/code/index.ts +174 -0
- package/src/code-editor/completion.ts +161 -0
- package/src/code-editor/doc.ts +198 -0
- package/src/code-editor/hx.ts +26 -0
- package/src/code-editor/index.ts +615 -0
- package/src/code-editor/node.ts +1926 -0
- package/src/code-language/hljs.ts +302 -0
- package/src/code-language/index.ts +51 -0
- package/src/code-language/languages/glsl.ts +120 -0
- package/src/code-language/languages/javascript.ts +419 -0
- package/src/code-language/languages/json.ts +72 -0
- package/src/code-language/languages/shell.ts +221 -0
- package/src/code-language/languages/sql.ts +165 -0
- package/src/code-language/lezer.ts +190 -0
- package/src/code-language/registry.ts +66 -0
- package/src/code-language/runs.ts +128 -0
- package/src/code-language/stream.ts +306 -0
- package/src/code-language/textmate.ts +134 -0
- package/src/code-language/theme.ts +124 -0
- package/src/code-language/timers.ts +36 -0
- package/src/code-language/types.ts +252 -0
- package/src/codeblock/index.ts +146 -0
- package/src/color-picker/ColorField.ts +333 -0
- package/src/color-picker/ColorPicker.ts +1069 -0
- package/src/color-picker/color.ts +399 -0
- package/src/color-picker/index.ts +50 -0
- package/src/desktop-calendar/eds.ts +484 -0
- package/src/desktop-calendar/ical.ts +119 -0
- package/src/desktop-calendar/index.ts +287 -0
- package/src/embed/client.ts +311 -0
- package/src/embed/host.ts +432 -0
- package/src/embed/index.ts +33 -0
- package/src/embed/timers.ts +32 -0
- package/src/flow/draw.ts +418 -0
- package/src/flow/index.ts +473 -0
- package/src/flow/model.ts +687 -0
- package/src/flow/node.ts +3694 -0
- package/src/flow/paths.ts +403 -0
- package/src/flow/types.ts +634 -0
- package/src/formula/hx.ts +51 -0
- package/src/formula/index.ts +243 -0
- package/src/formula/katex.ts +209 -0
- package/src/formula/layout.ts +876 -0
- package/src/formula/node.ts +467 -0
- package/src/html/controls.ts +244 -0
- package/src/html/css/cascade.ts +606 -0
- package/src/html/css/parse.ts +500 -0
- package/src/html/css/style.ts +1371 -0
- package/src/html/css/ua.ts +174 -0
- package/src/html/css/values.ts +358 -0
- package/src/html/dom.ts +410 -0
- package/src/html/hx.ts +55 -0
- package/src/html/index.ts +545 -0
- package/src/html/layout/block.ts +876 -0
- package/src/html/layout/boxes.ts +981 -0
- package/src/html/layout/flex.ts +297 -0
- package/src/html/layout/floats.ts +125 -0
- package/src/html/layout/inline.ts +870 -0
- package/src/html/layout/table.ts +380 -0
- package/src/html/node.ts +967 -0
- package/src/html/paint.ts +605 -0
- package/src/html/resources.ts +214 -0
- package/src/index.ts +638 -0
- package/src/internal/heights.ts +222 -0
- package/src/internal/hx.ts +53 -0
- package/src/internal/scroll.ts +288 -0
- package/src/internal/text.ts +44 -0
- package/src/internal/timers.ts +44 -0
- package/src/internal/widget.ts +92 -0
- package/src/markdown/ast.ts +163 -0
- package/src/markdown/hx.ts +51 -0
- package/src/markdown/index.ts +686 -0
- package/src/markdown/parse.ts +1037 -0
- package/src/markdown/spans.ts +143 -0
- package/src/media-player/backends.ts +155 -0
- package/src/media-player/control.ts +70 -0
- package/src/media-player/hx.ts +51 -0
- package/src/media-player/index.ts +378 -0
- package/src/media-player/mpv.ts +146 -0
- package/src/media-player/vlc.ts +97 -0
- package/src/richtext/index.ts +42 -0
- package/src/richtext/links.ts +78 -0
- package/src/richtext/menu.ts +49 -0
- package/src/richtext/node.ts +406 -0
- package/src/richtext/runs.ts +253 -0
- package/src/table/hx.ts +51 -0
- package/src/table/index.ts +1270 -0
- package/src/table/rows.ts +275 -0
- package/src/terminal/backends.ts +242 -0
- package/src/terminal/hx.ts +51 -0
- package/src/terminal/index.ts +574 -0
- package/src/terminal/title.ts +172 -0
- package/src/terminal/vt/colors.ts +247 -0
- package/src/terminal/vt/diff.ts +467 -0
- package/src/terminal/vt/fonts.ts +233 -0
- package/src/terminal/vt/index.ts +443 -0
- package/src/terminal/vt/keys.ts +369 -0
- package/src/terminal/vt/mouse.ts +144 -0
- package/src/terminal/vt/node.ts +1242 -0
- package/src/terminal/vt/pty.ts +334 -0
- package/src/terminal/vt/renderer.ts +555 -0
- package/src/terminal/vt/timers.ts +31 -0
- package/src/terminal/vt/xterm.ts +193 -0
- package/src/terminal-output/hx.ts +51 -0
- package/src/terminal-output/index.ts +340 -0
- package/src/terminal-output/runs.ts +79 -0
- package/src/three/canvas.ts +451 -0
- package/src/three/events.ts +197 -0
- package/src/three/geometries.ts +429 -0
- package/src/three/globals.ts +34 -0
- package/src/three/hx.ts +22 -0
- package/src/three/index.ts +98 -0
- package/src/three/jsx-dev-runtime.ts +27 -0
- package/src/three/jsx-runtime.ts +38 -0
- package/src/three/jsx.ts +275 -0
- package/src/three/materials.ts +270 -0
- package/src/three/math.ts +585 -0
- package/src/three/objects.ts +397 -0
- package/src/three/passes.ts +90 -0
- package/src/three/postprocess.ts +677 -0
- package/src/three/raycast.ts +189 -0
- package/src/three/react-reconciler.d.ts +50 -0
- package/src/three/reconciler.ts +624 -0
- package/src/three/renderer-direct.ts +1055 -0
- package/src/three/renderer-indirect.ts +570 -0
- package/src/three/store.ts +207 -0
- package/src/timeline/hx.ts +31 -0
- package/src/timeline/index.ts +603 -0
- package/src/tray-host/hx.ts +51 -0
- package/src/tray-host/index.ts +331 -0
- package/src/tray-host/manager.ts +639 -0
- package/src/tray-host/notify.ts +102 -0
- package/src/tray-host/protocol.ts +235 -0
- package/src/tree/hx.ts +51 -0
- package/src/tree/index.ts +1127 -0
- package/src/tree/internal.ts +87 -0
- package/src/tree/rows.ts +334 -0
- package/src/index.d.ts +0 -2
- package/src/index.js +0 -9
- package/src/sparkline/index.d.ts +0 -29
- package/src/sparkline/index.js +0 -50
- package/src/sparkline/node.js +0 -72
|
@@ -0,0 +1,700 @@
|
|
|
1
|
+
import { codeUnitOffsets } from '../../internal/text.js';
|
|
2
|
+
import { inkColor, isTransparent } from '../css/values.js';
|
|
3
|
+
/**
|
|
4
|
+
* The text behind a layout, for the one caller that needs it: a selection
|
|
5
|
+
* band has to turn a document offset into a **code point** index, which is
|
|
6
|
+
* what ntk's caret API speaks, and that conversion needs the string.
|
|
7
|
+
*
|
|
8
|
+
* Kept as the runs rather than the joined text, and joined on demand, because
|
|
9
|
+
* the first paint never asks — only a selection does — and joining every
|
|
10
|
+
* paragraph up front would be a string allocation per block for a feature
|
|
11
|
+
* most documents are read without using.
|
|
12
|
+
*/
|
|
13
|
+
const LAYOUT_RUNS = new WeakMap();
|
|
14
|
+
/** Code-unit → code-point offsets for a layout's text, built once. */
|
|
15
|
+
export function layoutOffsets(layout) {
|
|
16
|
+
const held = LAYOUT_RUNS.get(layout);
|
|
17
|
+
if (!held)
|
|
18
|
+
return EMPTY_OFFSETS;
|
|
19
|
+
if (typeof held[0] === 'number' || held.length === 0)
|
|
20
|
+
return held;
|
|
21
|
+
const offsets = codeUnitOffsets(held.map((r) => r.text).join(''));
|
|
22
|
+
LAYOUT_RUNS.set(layout, offsets);
|
|
23
|
+
return offsets;
|
|
24
|
+
}
|
|
25
|
+
const EMPTY_OFFSETS = [0];
|
|
26
|
+
/**
|
|
27
|
+
* Lay out one inline formatting context. Coordinates in the result are
|
|
28
|
+
* relative to the containing block's content box; the caller translates.
|
|
29
|
+
*/
|
|
30
|
+
export function layoutInline(block, options) {
|
|
31
|
+
const fonts = options.fonts;
|
|
32
|
+
const items = [];
|
|
33
|
+
collect(block, items);
|
|
34
|
+
if (!items.length || !fonts)
|
|
35
|
+
return EMPTY;
|
|
36
|
+
const style = block.style;
|
|
37
|
+
const base = {
|
|
38
|
+
family: style.fontFamily,
|
|
39
|
+
size: style.fontSize,
|
|
40
|
+
weight: style.fontWeight,
|
|
41
|
+
style: style.fontStyle,
|
|
42
|
+
color: style.color,
|
|
43
|
+
};
|
|
44
|
+
const lineHeightMul = lineHeightMultiplier(fonts, style);
|
|
45
|
+
const align = alignFor(style);
|
|
46
|
+
const indent = indentOf(style, options.width);
|
|
47
|
+
const hasAtomics = items.some((i) => i.kind === 'atomic');
|
|
48
|
+
const floated = options.floats?.intersects(options.startY, Infinity) ?? false;
|
|
49
|
+
// The text-only, float-free, unindented case: one call, every line — or
|
|
50
|
+
// one call per *chunk*, when the text is long and carries hard breaks.
|
|
51
|
+
if (!hasAtomics && !floated && !indent) {
|
|
52
|
+
// `hasAtomics` is false, so every item is text; the cast is that fact.
|
|
53
|
+
const textItems = items;
|
|
54
|
+
let total = 0;
|
|
55
|
+
let hasNewline = false;
|
|
56
|
+
for (const item of textItems) {
|
|
57
|
+
total += item.length;
|
|
58
|
+
if (!hasNewline && item.run.text.includes('\n'))
|
|
59
|
+
hasNewline = true;
|
|
60
|
+
}
|
|
61
|
+
if (!total)
|
|
62
|
+
return EMPTY;
|
|
63
|
+
if (total > CHUNK_TRIGGER_CHARS && hasNewline) {
|
|
64
|
+
return layoutChunked(textItems, base, style, options.width, lineHeightMul, align, fonts);
|
|
65
|
+
}
|
|
66
|
+
const runs = [];
|
|
67
|
+
const spans = new SpanMap();
|
|
68
|
+
for (const item of textItems) {
|
|
69
|
+
spans.add(item.box.textStart, item.run.text.length);
|
|
70
|
+
runs.push(item.run);
|
|
71
|
+
}
|
|
72
|
+
const layout = fonts.layout(runs, base, {
|
|
73
|
+
maxWidth: wraps(style) ? options.width : undefined,
|
|
74
|
+
lineHeight: lineHeightMul,
|
|
75
|
+
align,
|
|
76
|
+
direction: style.direction,
|
|
77
|
+
});
|
|
78
|
+
LAYOUT_RUNS.set(layout, runs);
|
|
79
|
+
const lines = [];
|
|
80
|
+
const widest = emitLayout(layout, spans, 0, 0, lines);
|
|
81
|
+
return { lines, height: layout.height, width: widest };
|
|
82
|
+
}
|
|
83
|
+
// --- the general case: line at a time -------------------------------------
|
|
84
|
+
const lines = [];
|
|
85
|
+
let widest = 0;
|
|
86
|
+
let y = 0;
|
|
87
|
+
let index = 0;
|
|
88
|
+
let offset = 0;
|
|
89
|
+
let open = openLine(indent);
|
|
90
|
+
const close = () => {
|
|
91
|
+
const line = finishLine(open, y);
|
|
92
|
+
if (!line) {
|
|
93
|
+
open = openLine(0);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
lines.push(line);
|
|
97
|
+
widest = Math.max(widest, line.width);
|
|
98
|
+
y += line.height;
|
|
99
|
+
open = openLine(0);
|
|
100
|
+
};
|
|
101
|
+
while (index < items.length) {
|
|
102
|
+
const band = bandAt(options, y, style.fontSize * 1.4);
|
|
103
|
+
const available = band.right - band.left;
|
|
104
|
+
const item = items[index];
|
|
105
|
+
if (item.kind === 'atomic') {
|
|
106
|
+
const box = item.box;
|
|
107
|
+
const outer = box.width + box.marginLeft + box.marginRight;
|
|
108
|
+
if (open.x > 0 && open.x + outer > available) {
|
|
109
|
+
close();
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
open.atomics.push({ box, x: band.left + open.x + box.marginLeft, y: 0 });
|
|
113
|
+
open.x += outer;
|
|
114
|
+
index += 1;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const segment = segmentFrom(items, index, offset);
|
|
118
|
+
// `segmentFrom` always passes at least the text item it started on, so
|
|
119
|
+
// this advances even when the slice came out empty — which is what stops
|
|
120
|
+
// a zero-length tail from spinning the loop.
|
|
121
|
+
if (!segment.runs.length) {
|
|
122
|
+
index = segment.nextIndex;
|
|
123
|
+
offset = 0;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
// Once nothing ahead can narrow a line — no atomic left, an empty line
|
|
127
|
+
// in hand, and no float at or below this y — the rest of the segment is
|
|
128
|
+
// one layout, every line of it. This is the exit that keeps the loop
|
|
129
|
+
// below from being quadratic on an ordinary paragraph: it runs line by
|
|
130
|
+
// line only while it has to.
|
|
131
|
+
const tailIsPlain = segment.nextIndex >= items.length &&
|
|
132
|
+
open.x === 0 &&
|
|
133
|
+
!open.atomics.length &&
|
|
134
|
+
!(options.floats?.intersects(options.startY + y, Infinity) ?? false);
|
|
135
|
+
if (tailIsPlain) {
|
|
136
|
+
const layout = fonts.layout(segment.runs, base, {
|
|
137
|
+
maxWidth: wraps(style) ? Math.max(1, available) : undefined,
|
|
138
|
+
lineHeight: lineHeightMul,
|
|
139
|
+
align,
|
|
140
|
+
direction: style.direction,
|
|
141
|
+
});
|
|
142
|
+
LAYOUT_RUNS.set(layout, segment.runs);
|
|
143
|
+
for (let i = 0; i < layout.lines.length; i += 1) {
|
|
144
|
+
const natural = layout.lines[i];
|
|
145
|
+
const text = {
|
|
146
|
+
layout,
|
|
147
|
+
layoutLine: i,
|
|
148
|
+
drawX: band.left,
|
|
149
|
+
drawY: y,
|
|
150
|
+
textStart: segment.spans.documentAt(natural.start),
|
|
151
|
+
textEnd: segment.spans.documentAt(natural.end),
|
|
152
|
+
layoutStart: natural.start,
|
|
153
|
+
};
|
|
154
|
+
lines.push({
|
|
155
|
+
x: band.left + natural.x,
|
|
156
|
+
y: y + natural.y,
|
|
157
|
+
width: natural.width,
|
|
158
|
+
height: natural.height,
|
|
159
|
+
baseline: natural.baseline,
|
|
160
|
+
texts: [text],
|
|
161
|
+
textStart: text.textStart,
|
|
162
|
+
textEnd: text.textEnd,
|
|
163
|
+
atomics: [],
|
|
164
|
+
});
|
|
165
|
+
widest = Math.max(widest, natural.width);
|
|
166
|
+
}
|
|
167
|
+
y += layout.height;
|
|
168
|
+
index = segment.nextIndex;
|
|
169
|
+
offset = 0;
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
// One line: `maxLines: 1` cuts the layout at the first break and its
|
|
173
|
+
// `truncated` flag answers "did the segment wrap" — so a line costs one
|
|
174
|
+
// layout of one line, not a layout of the whole remaining tail plus a
|
|
175
|
+
// re-cut (which is what an earlier shape paid, per line, beside every
|
|
176
|
+
// float). ntk's shaping memo makes the successive cuts cheap; only the
|
|
177
|
+
// line breaker re-runs.
|
|
178
|
+
const room = Math.max(1, available - open.x);
|
|
179
|
+
const fragment = fonts.layout(segment.runs, base, {
|
|
180
|
+
maxWidth: wraps(style) ? room : undefined,
|
|
181
|
+
lineHeight: lineHeightMul,
|
|
182
|
+
// A fragment that does not start at the line's left edge cannot be
|
|
183
|
+
// aligned by the text layout: the alignment belongs to the whole line,
|
|
184
|
+
// which only this loop can see.
|
|
185
|
+
align: open.x > 0 ? 'left' : align,
|
|
186
|
+
direction: style.direction,
|
|
187
|
+
maxLines: 1,
|
|
188
|
+
});
|
|
189
|
+
LAYOUT_RUNS.set(fragment, segment.runs);
|
|
190
|
+
const first = fragment.lines[0];
|
|
191
|
+
if (!first) {
|
|
192
|
+
index = segment.nextIndex;
|
|
193
|
+
offset = 0;
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
open.texts.push({
|
|
197
|
+
layout: fragment,
|
|
198
|
+
layoutLine: 0,
|
|
199
|
+
// The layout's own `first.x` carries the alignment offset, so the
|
|
200
|
+
// origin is the band edge plus the cursor — subtracting `first.x`
|
|
201
|
+
// here would left-align a centred line. Mid-line continuations were
|
|
202
|
+
// laid out `left`, where `first.x` is zero and the two agree.
|
|
203
|
+
drawX: band.left + open.x,
|
|
204
|
+
drawY: 0, // filled in by `finishLine`, which is where the top is known
|
|
205
|
+
textStart: segment.spans.documentAt(first.start),
|
|
206
|
+
textEnd: segment.spans.documentAt(first.end),
|
|
207
|
+
layoutStart: first.start,
|
|
208
|
+
});
|
|
209
|
+
open.x += first.width;
|
|
210
|
+
open.left = band.left;
|
|
211
|
+
if (!fragment.truncated) {
|
|
212
|
+
// It fitted: the cursor stays on this line for whatever comes next.
|
|
213
|
+
//
|
|
214
|
+
// With one correction first. ntk strips a line's trailing whitespace —
|
|
215
|
+
// right at a real line end, wrong here, where the "line" is only a
|
|
216
|
+
// fragment and an atomic follows on the same one: `Name <input>` laid
|
|
217
|
+
// the space out to width zero and the control sat flush against the
|
|
218
|
+
// label (nbsp included; ntk's whitespace set has U+00A0 in it). The
|
|
219
|
+
// stripped advance is measured back and added to the cursor.
|
|
220
|
+
if (segment.nextIndex < items.length) {
|
|
221
|
+
let trailing = '';
|
|
222
|
+
for (let i = segment.runs.length - 1; i >= 0; i -= 1) {
|
|
223
|
+
const text = segment.runs[i].text;
|
|
224
|
+
const m = /[ \t\u00A0]+$/.exec(text);
|
|
225
|
+
if (!m)
|
|
226
|
+
break;
|
|
227
|
+
trailing = m[0] + trailing;
|
|
228
|
+
if (m[0].length < text.length)
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
if (trailing) {
|
|
232
|
+
open.x +=
|
|
233
|
+
spaceAdvance(fonts, segment.runs[segment.runs.length - 1]) *
|
|
234
|
+
trailing.length;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
index = segment.nextIndex;
|
|
238
|
+
offset = 0;
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
close();
|
|
242
|
+
const advanced = advance(items, index, offset, first.end);
|
|
243
|
+
index = advanced.index;
|
|
244
|
+
offset = advanced.offset;
|
|
245
|
+
}
|
|
246
|
+
if (open.texts.length || open.atomics.length)
|
|
247
|
+
close();
|
|
248
|
+
return { lines, height: y, width: widest };
|
|
249
|
+
}
|
|
250
|
+
const EMPTY = { lines: [], height: 0, width: 0 };
|
|
251
|
+
/** Append one layout's lines as LineBoxes at an offset; returns the widest. */
|
|
252
|
+
function emitLayout(layout, spans, xOff, yOff, lines) {
|
|
253
|
+
let widest = 0;
|
|
254
|
+
for (let i = 0; i < layout.lines.length; i += 1) {
|
|
255
|
+
const natural = layout.lines[i];
|
|
256
|
+
const text = {
|
|
257
|
+
layout,
|
|
258
|
+
layoutLine: i,
|
|
259
|
+
drawX: xOff,
|
|
260
|
+
drawY: yOff,
|
|
261
|
+
textStart: spans.documentAt(natural.start),
|
|
262
|
+
textEnd: spans.documentAt(natural.end),
|
|
263
|
+
layoutStart: natural.start,
|
|
264
|
+
};
|
|
265
|
+
lines.push({
|
|
266
|
+
x: xOff + natural.x,
|
|
267
|
+
y: yOff + natural.y,
|
|
268
|
+
width: natural.width,
|
|
269
|
+
height: natural.height,
|
|
270
|
+
baseline: natural.baseline,
|
|
271
|
+
texts: [text],
|
|
272
|
+
textStart: text.textStart,
|
|
273
|
+
textEnd: text.textEnd,
|
|
274
|
+
atomics: [],
|
|
275
|
+
});
|
|
276
|
+
widest = Math.max(widest, natural.width);
|
|
277
|
+
}
|
|
278
|
+
return widest;
|
|
279
|
+
}
|
|
280
|
+
/** Chunking kicks in past this much text (with hard breaks in it). The
|
|
281
|
+
* chunk bounds are sized to the *drawing*, not the layout: a chunk is one
|
|
282
|
+
* glyph batch, an expose submits every batch it touches whole, and a strip
|
|
283
|
+
* two lines tall should not pay for five hundred — 64 hard lines is a
|
|
284
|
+
* couple of viewports, measured at well under a millisecond a batch. */
|
|
285
|
+
const CHUNK_TRIGGER_CHARS = 16384;
|
|
286
|
+
const CHUNK_MAX_CHARS = 8192;
|
|
287
|
+
const CHUNK_MAX_HARD_LINES = 64;
|
|
288
|
+
/**
|
|
289
|
+
* A long hard-broken text — a `<pre>` holding a log, a wall of `<br>`s — laid
|
|
290
|
+
* out as a sequence of layouts split at newline boundaries.
|
|
291
|
+
*
|
|
292
|
+
* Two reasons, and either would suffice. A single `TextLayout` spanning
|
|
293
|
+
* hundreds of thousands of pixels cannot be *drawn*: ntk emits a layout as
|
|
294
|
+
* one glyph batch, X carries the positions as Int16, and the skip guard that
|
|
295
|
+
* keeps that from crashing would keep the whole thing blank instead. And a
|
|
296
|
+
* monolithic layout defeats viewport culling — every paint would hold the
|
|
297
|
+
* one object every line shares. Splitting at hard breaks is exact (line
|
|
298
|
+
* breaking never crosses a required break), so the chunk seams are
|
|
299
|
+
* invisible; each chunk stays a single batch a viewport can keep whole.
|
|
300
|
+
*/
|
|
301
|
+
function layoutChunked(items, base, style, width, lineHeightMul, align, fonts) {
|
|
302
|
+
const lines = [];
|
|
303
|
+
let widest = 0;
|
|
304
|
+
let y = 0;
|
|
305
|
+
let chunkRuns = [];
|
|
306
|
+
let chunkSpans = new SpanMap();
|
|
307
|
+
let chars = 0;
|
|
308
|
+
let hardLines = 0;
|
|
309
|
+
const flush = () => {
|
|
310
|
+
if (!chunkRuns.length)
|
|
311
|
+
return;
|
|
312
|
+
const layout = fonts.layout(chunkRuns, base, {
|
|
313
|
+
maxWidth: wraps(style) ? width : undefined,
|
|
314
|
+
lineHeight: lineHeightMul,
|
|
315
|
+
align,
|
|
316
|
+
direction: style.direction,
|
|
317
|
+
});
|
|
318
|
+
LAYOUT_RUNS.set(layout, chunkRuns);
|
|
319
|
+
widest = Math.max(widest, emitLayout(layout, chunkSpans, 0, y, lines));
|
|
320
|
+
y += layout.height;
|
|
321
|
+
chunkRuns = [];
|
|
322
|
+
chunkSpans = new SpanMap();
|
|
323
|
+
chars = 0;
|
|
324
|
+
hardLines = 0;
|
|
325
|
+
};
|
|
326
|
+
for (const item of items) {
|
|
327
|
+
let text = item.run.text;
|
|
328
|
+
let docStart = item.box.textStart;
|
|
329
|
+
while (text.length) {
|
|
330
|
+
// Scan up to the budgets, remembering the last newline: the split has
|
|
331
|
+
// to land just after one for the chunking to be exact.
|
|
332
|
+
let i = 0;
|
|
333
|
+
let lastBreak = -1;
|
|
334
|
+
let lines2 = hardLines;
|
|
335
|
+
let taken = chars;
|
|
336
|
+
while (i < text.length &&
|
|
337
|
+
taken < CHUNK_MAX_CHARS &&
|
|
338
|
+
lines2 < CHUNK_MAX_HARD_LINES) {
|
|
339
|
+
if (text.charCodeAt(i) === 10) {
|
|
340
|
+
lines2 += 1;
|
|
341
|
+
lastBreak = i;
|
|
342
|
+
}
|
|
343
|
+
i += 1;
|
|
344
|
+
taken += 1;
|
|
345
|
+
}
|
|
346
|
+
if (i >= text.length) {
|
|
347
|
+
// the rest of this run fits the open chunk
|
|
348
|
+
chunkRuns.push(text === item.run.text ? item.run : { ...item.run, text });
|
|
349
|
+
chunkSpans.add(docStart, text.length);
|
|
350
|
+
chars = taken;
|
|
351
|
+
hardLines = lines2;
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
if (lastBreak < 0) {
|
|
355
|
+
if (chunkRuns.length) {
|
|
356
|
+
// no break inside the budget: close the chunk, retry with room
|
|
357
|
+
flush();
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
// a single unbroken stretch larger than a whole chunk: take it to
|
|
361
|
+
// its next newline (or its end) and let the overflow guard judge it
|
|
362
|
+
const next = text.indexOf('\n', i);
|
|
363
|
+
const end = next < 0 ? text.length : next + 1;
|
|
364
|
+
chunkRuns.push({ ...item.run, text: text.slice(0, end) });
|
|
365
|
+
chunkSpans.add(docStart, end);
|
|
366
|
+
flush();
|
|
367
|
+
docStart += end;
|
|
368
|
+
text = text.slice(end);
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
const cut = lastBreak + 1;
|
|
372
|
+
chunkRuns.push({ ...item.run, text: text.slice(0, cut) });
|
|
373
|
+
chunkSpans.add(docStart, cut);
|
|
374
|
+
flush();
|
|
375
|
+
docStart += cut;
|
|
376
|
+
text = text.slice(cut);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
flush();
|
|
380
|
+
return { lines, height: y, width: widest };
|
|
381
|
+
}
|
|
382
|
+
function openLine(indent) {
|
|
383
|
+
return { x: indent, left: 0, texts: [], atomics: [] };
|
|
384
|
+
}
|
|
385
|
+
function finishLine(open, y) {
|
|
386
|
+
if (!open.texts.length && !open.atomics.length)
|
|
387
|
+
return null;
|
|
388
|
+
let ascent = 0;
|
|
389
|
+
let descent = 0;
|
|
390
|
+
let height = 0;
|
|
391
|
+
for (const text of open.texts) {
|
|
392
|
+
const natural = text.layout.lines[text.layoutLine];
|
|
393
|
+
ascent = Math.max(ascent, natural.baseline);
|
|
394
|
+
descent = Math.max(descent, natural.height - natural.baseline);
|
|
395
|
+
height = Math.max(height, natural.height);
|
|
396
|
+
}
|
|
397
|
+
for (const placed of open.atomics) {
|
|
398
|
+
const h = placed.box.height + placed.box.marginTop + placed.box.marginBottom;
|
|
399
|
+
const va = placed.box.style.verticalAlign;
|
|
400
|
+
if (va === 'top' || va === 'bottom' || va === 'middle')
|
|
401
|
+
height = Math.max(height, h);
|
|
402
|
+
else
|
|
403
|
+
ascent = Math.max(ascent, h);
|
|
404
|
+
}
|
|
405
|
+
height = Math.max(height, ascent + descent);
|
|
406
|
+
const baseline = Math.max(ascent, (height - ascent - descent) / 2 + ascent);
|
|
407
|
+
let textStart = Infinity;
|
|
408
|
+
let textEnd = 0;
|
|
409
|
+
for (const text of open.texts) {
|
|
410
|
+
textStart = Math.min(textStart, text.textStart);
|
|
411
|
+
textEnd = Math.max(textEnd, text.textEnd);
|
|
412
|
+
}
|
|
413
|
+
const line = {
|
|
414
|
+
x: open.left,
|
|
415
|
+
y,
|
|
416
|
+
width: open.x,
|
|
417
|
+
height,
|
|
418
|
+
baseline,
|
|
419
|
+
texts: open.texts,
|
|
420
|
+
textStart: Number.isFinite(textStart) ? textStart : 0,
|
|
421
|
+
textEnd,
|
|
422
|
+
atomics: open.atomics,
|
|
423
|
+
};
|
|
424
|
+
for (const placed of open.atomics)
|
|
425
|
+
placed.y = y + alignAtomic(placed.box, line);
|
|
426
|
+
// Every fragment on this line shares the line's baseline, whatever its own
|
|
427
|
+
// layout thinks: that is what makes a small `<sup>` beside body text sit on
|
|
428
|
+
// the same baseline rather than on its own.
|
|
429
|
+
for (const text of open.texts) {
|
|
430
|
+
const natural = text.layout.lines[text.layoutLine];
|
|
431
|
+
text.drawY = y + baseline - natural.baseline - natural.y;
|
|
432
|
+
}
|
|
433
|
+
return line;
|
|
434
|
+
}
|
|
435
|
+
/** Where an atomic's top edge sits, relative to the line box top. */
|
|
436
|
+
function alignAtomic(box, line) {
|
|
437
|
+
const h = box.height + box.marginTop + box.marginBottom;
|
|
438
|
+
switch (box.style.verticalAlign) {
|
|
439
|
+
case 'top':
|
|
440
|
+
return 0;
|
|
441
|
+
case 'bottom':
|
|
442
|
+
return line.height - h;
|
|
443
|
+
case 'middle':
|
|
444
|
+
return (line.height - h) / 2;
|
|
445
|
+
case 'sub':
|
|
446
|
+
return line.baseline - h + line.height * 0.1;
|
|
447
|
+
case 'super':
|
|
448
|
+
return line.baseline - h - line.height * 0.25;
|
|
449
|
+
default:
|
|
450
|
+
if (typeof box.style.verticalAlign === 'number') {
|
|
451
|
+
return line.baseline - h - box.style.verticalAlign;
|
|
452
|
+
}
|
|
453
|
+
return line.baseline - h;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
// --- gathering --------------------------------------------------------------
|
|
457
|
+
/** Flatten an inline subtree into a stream of runs, atomics and breaks. */
|
|
458
|
+
function collect(box, out) {
|
|
459
|
+
for (const child of box.children) {
|
|
460
|
+
if (child.outOfFlow || child.isFloat)
|
|
461
|
+
continue;
|
|
462
|
+
switch (child.kind) {
|
|
463
|
+
case 'text':
|
|
464
|
+
if (child.text) {
|
|
465
|
+
out.push({
|
|
466
|
+
kind: 'text',
|
|
467
|
+
run: runFor(child.text, child.style, child.el),
|
|
468
|
+
box: child,
|
|
469
|
+
length: child.text.length,
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
break;
|
|
473
|
+
case 'break':
|
|
474
|
+
// A `<br>` is a newline *character* in the stream, not a control
|
|
475
|
+
// item: ntk's breaker treats `\n` as a required break, gives the
|
|
476
|
+
// blank line between two of them real font metrics, and both paths
|
|
477
|
+
// — the one-layout fast path and the line-at-a-time one — then
|
|
478
|
+
// handle it identically. (An earlier shape kept breaks as their own
|
|
479
|
+
// item kind and the fast path, which only reads text items, dropped
|
|
480
|
+
// them: `a<br>b` rendered as one line.) The box builder gave the
|
|
481
|
+
// break its slot in the document index, so the span map lines up.
|
|
482
|
+
out.push({
|
|
483
|
+
kind: 'text',
|
|
484
|
+
run: {
|
|
485
|
+
text: '\n',
|
|
486
|
+
family: child.style.fontFamily,
|
|
487
|
+
size: child.style.fontSize,
|
|
488
|
+
},
|
|
489
|
+
box: child,
|
|
490
|
+
length: 1,
|
|
491
|
+
});
|
|
492
|
+
break;
|
|
493
|
+
case 'inline':
|
|
494
|
+
collect(child, out);
|
|
495
|
+
break;
|
|
496
|
+
default:
|
|
497
|
+
// Everything else that reached an inline context is inline-level and
|
|
498
|
+
// atomic: a replaced element, an `inline-block`, an `inline-table`.
|
|
499
|
+
out.push({ kind: 'atomic', box: child });
|
|
500
|
+
break;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
/** The `TextRun` one styled piece of text becomes. */
|
|
505
|
+
function runFor(text, style, owner) {
|
|
506
|
+
// ntk hands unknown span fields back on the laid-out runs untouched, which
|
|
507
|
+
// is how the element reaches the paint and hit-test passes without a
|
|
508
|
+
// parallel structure to keep in step.
|
|
509
|
+
const run = {
|
|
510
|
+
text,
|
|
511
|
+
family: style.fontFamily,
|
|
512
|
+
size: style.fontSize,
|
|
513
|
+
weight: style.fontWeight,
|
|
514
|
+
style: style.fontStyle === 'normal' ? 'normal' : 'italic',
|
|
515
|
+
color: style.color,
|
|
516
|
+
};
|
|
517
|
+
// An inline background fills the line box rather than hugging the ink:
|
|
518
|
+
// `<span style="background: yellow">` is a highlighter, and two adjacent
|
|
519
|
+
// highlighted spans must not leave a seam between them. That is exactly
|
|
520
|
+
// what richtext's `bgFill: 'line'` was added for.
|
|
521
|
+
if (!isTransparent(style.backgroundColor)) {
|
|
522
|
+
run.bg = inkColor(style.backgroundColor, style.color);
|
|
523
|
+
run.bgFill = 'line';
|
|
524
|
+
}
|
|
525
|
+
if (owner)
|
|
526
|
+
run.element = owner;
|
|
527
|
+
if (style.textDecorationLine === 'underline') {
|
|
528
|
+
run.underline = inkColor(style.textDecorationColor ?? 'currentColor', style.color);
|
|
529
|
+
// CSS's five rule styles and SGR 4's five are the same set under two
|
|
530
|
+
// names; richtext speaks SGR's, so `solid` is `single` and `wavy` is
|
|
531
|
+
// `curly`. The other three are spelled identically.
|
|
532
|
+
run.underlineStyle =
|
|
533
|
+
style.textDecorationStyle === 'wavy'
|
|
534
|
+
? 'curly'
|
|
535
|
+
: style.textDecorationStyle === 'solid'
|
|
536
|
+
? 'single'
|
|
537
|
+
: style.textDecorationStyle;
|
|
538
|
+
}
|
|
539
|
+
else if (style.textDecorationLine === 'line-through') {
|
|
540
|
+
run.strike = inkColor(style.textDecorationColor ?? 'currentColor', style.color);
|
|
541
|
+
}
|
|
542
|
+
return run;
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Maps a code-unit offset in text handed to `TextLayout` back to its offset
|
|
546
|
+
* in the document index. The two differ because a layout covers one segment
|
|
547
|
+
* of the stream while the document index covers all of it.
|
|
548
|
+
*/
|
|
549
|
+
class SpanMap {
|
|
550
|
+
_laid = [];
|
|
551
|
+
_doc = [];
|
|
552
|
+
laidOut = 0;
|
|
553
|
+
add(documentStart, length) {
|
|
554
|
+
this._laid.push(this.laidOut);
|
|
555
|
+
this._doc.push(documentStart);
|
|
556
|
+
this.laidOut += length;
|
|
557
|
+
}
|
|
558
|
+
documentAt(offset) {
|
|
559
|
+
const laid = this._laid;
|
|
560
|
+
if (!laid.length)
|
|
561
|
+
return 0;
|
|
562
|
+
let lo = 0;
|
|
563
|
+
let hi = laid.length - 1;
|
|
564
|
+
while (lo < hi) {
|
|
565
|
+
const mid = (lo + hi + 1) >> 1;
|
|
566
|
+
if (laid[mid] <= offset)
|
|
567
|
+
lo = mid;
|
|
568
|
+
else
|
|
569
|
+
hi = mid - 1;
|
|
570
|
+
}
|
|
571
|
+
return this._doc[lo] + (offset - laid[lo]);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
/** The maximal run of text items from `(index, offset)` to the next atomic. */
|
|
575
|
+
function segmentFrom(items, index, offset) {
|
|
576
|
+
const runs = [];
|
|
577
|
+
const spans = new SpanMap();
|
|
578
|
+
let i = index;
|
|
579
|
+
let skip = offset;
|
|
580
|
+
for (; i < items.length; i += 1) {
|
|
581
|
+
const item = items[i];
|
|
582
|
+
if (item.kind !== 'text')
|
|
583
|
+
break;
|
|
584
|
+
const text = skip > 0 ? item.run.text.slice(skip) : item.run.text;
|
|
585
|
+
if (text) {
|
|
586
|
+
spans.add(item.box.textStart + skip, text.length);
|
|
587
|
+
runs.push(skip > 0 ? { ...item.run, text } : item.run);
|
|
588
|
+
}
|
|
589
|
+
skip = 0;
|
|
590
|
+
}
|
|
591
|
+
return { runs, spans, nextIndex: i };
|
|
592
|
+
}
|
|
593
|
+
/** Move `(index, offset)` forward by `consumed` code units of text. */
|
|
594
|
+
function advance(items, index, offset, consumed) {
|
|
595
|
+
let i = index;
|
|
596
|
+
let skip = offset;
|
|
597
|
+
let left = consumed;
|
|
598
|
+
while (i < items.length) {
|
|
599
|
+
const item = items[i];
|
|
600
|
+
if (item.kind !== 'text')
|
|
601
|
+
break;
|
|
602
|
+
const remaining = item.length - skip;
|
|
603
|
+
if (left < remaining)
|
|
604
|
+
return { index: i, offset: skip + left };
|
|
605
|
+
left -= remaining;
|
|
606
|
+
skip = 0;
|
|
607
|
+
i += 1;
|
|
608
|
+
}
|
|
609
|
+
return { index: i, offset: 0 };
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* One space's advance in a run's style, measured as the difference between
|
|
613
|
+
* `x x` and `xx` — ntk strips a lone trailing space from a line, so it
|
|
614
|
+
* cannot be measured directly. Cached per font manager per style; the
|
|
615
|
+
* measurement itself hits ntk's shaping memo.
|
|
616
|
+
*/
|
|
617
|
+
const SPACE_ADVANCE = new WeakMap();
|
|
618
|
+
function spaceAdvance(fonts, run) {
|
|
619
|
+
let cache = SPACE_ADVANCE.get(fonts);
|
|
620
|
+
if (!cache) {
|
|
621
|
+
cache = new Map();
|
|
622
|
+
SPACE_ADVANCE.set(fonts, cache);
|
|
623
|
+
}
|
|
624
|
+
const key = `${run.family}|${run.size}|${run.weight}|${run.style}`;
|
|
625
|
+
const hit = cache.get(key);
|
|
626
|
+
if (hit !== undefined)
|
|
627
|
+
return hit;
|
|
628
|
+
const style = {
|
|
629
|
+
family: run.family,
|
|
630
|
+
size: run.size,
|
|
631
|
+
weight: run.weight,
|
|
632
|
+
style: run.style,
|
|
633
|
+
};
|
|
634
|
+
const measure = (text) => fonts.layout([{ ...style, text }], style, {}).lines[0]?.width ?? 0;
|
|
635
|
+
const advance = Math.max(0, measure('x x') - measure('xx'));
|
|
636
|
+
if (cache.size > 64)
|
|
637
|
+
cache.clear();
|
|
638
|
+
cache.set(key, advance);
|
|
639
|
+
return advance;
|
|
640
|
+
}
|
|
641
|
+
// --- style questions --------------------------------------------------------
|
|
642
|
+
function wraps(style) {
|
|
643
|
+
return style.whiteSpace !== 'nowrap' && style.whiteSpace !== 'pre';
|
|
644
|
+
}
|
|
645
|
+
function alignFor(style) {
|
|
646
|
+
// ntk has no justification; `start` is closer than a silent left on an RTL
|
|
647
|
+
// paragraph, and closer than a ragged-right lie about what was drawn.
|
|
648
|
+
return style.textAlign === 'justify' ? 'start' : style.textAlign;
|
|
649
|
+
}
|
|
650
|
+
function indentOf(style, width) {
|
|
651
|
+
const indent = style.textIndent;
|
|
652
|
+
if (typeof indent === 'number')
|
|
653
|
+
return indent;
|
|
654
|
+
if (indent === 'auto')
|
|
655
|
+
return 0;
|
|
656
|
+
return Number.isFinite(width) ? (indent.pct / 100) * width : 0;
|
|
657
|
+
}
|
|
658
|
+
/**
|
|
659
|
+
* CSS's `line-height` expressed as ntk's multiplier.
|
|
660
|
+
*
|
|
661
|
+
* ntk multiplies the **font's natural line height** (metrics, line gap
|
|
662
|
+
* included); CSS's number form multiplies the **font size**. Converting here
|
|
663
|
+
* rather than passing the CSS number through is the difference between
|
|
664
|
+
* `line-height: 1.5` meaning 1.5 × 16px and it meaning 1.5 × 19px, which is
|
|
665
|
+
* a visibly looser document than the author asked for.
|
|
666
|
+
*/
|
|
667
|
+
function lineHeightMultiplier(fonts, style) {
|
|
668
|
+
if (style.lineHeight === 'normal')
|
|
669
|
+
return 1;
|
|
670
|
+
const target = style.lineHeightIsLength
|
|
671
|
+
? style.lineHeight
|
|
672
|
+
: style.lineHeight * style.fontSize;
|
|
673
|
+
const natural = naturalLineHeight(fonts, style);
|
|
674
|
+
if (!natural)
|
|
675
|
+
return 1;
|
|
676
|
+
return Math.max(0.1, target / natural);
|
|
677
|
+
}
|
|
678
|
+
function naturalLineHeight(fonts, style) {
|
|
679
|
+
try {
|
|
680
|
+
const font = fonts.match(style.fontFamily, {
|
|
681
|
+
size: style.fontSize,
|
|
682
|
+
weight: style.fontWeight,
|
|
683
|
+
style: style.fontStyle,
|
|
684
|
+
});
|
|
685
|
+
return font.metrics(style.fontSize).lineHeight;
|
|
686
|
+
}
|
|
687
|
+
catch {
|
|
688
|
+
return style.fontSize * 1.2;
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
function bandAt(options, y, height) {
|
|
692
|
+
if (!options.floats)
|
|
693
|
+
return { left: 0, right: options.width };
|
|
694
|
+
const band = options.floats.bandAt(options.startY + y, height);
|
|
695
|
+
return {
|
|
696
|
+
left: Math.max(0, band.left - options.originX),
|
|
697
|
+
right: Math.min(options.width, band.right - options.originX),
|
|
698
|
+
};
|
|
699
|
+
}
|
|
700
|
+
//# sourceMappingURL=inline.js.map
|