@react-x11/components 0.1.0 → 0.2.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 +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 +81 -0
- package/dist/internal/heights.d.ts.map +1 -0
- package/dist/internal/heights.js +193 -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/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 +844 -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 +716 -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 +211 -0
- package/src/internal/hx.ts +53 -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 +1219 -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 +1087 -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,605 @@
|
|
|
1
|
+
// Painting a laid-out document.
|
|
2
|
+
//
|
|
3
|
+
// Two things make this fast enough to be the answer to "what happens on an
|
|
4
|
+
// expose", which is one of the two numbers this component is built around:
|
|
5
|
+
//
|
|
6
|
+
// - **Every box carries the bounds of everything it draws**, computed once
|
|
7
|
+
// after layout. A repaint intersects that against `paintDamage()` and
|
|
8
|
+
// skips whole subtrees, so an expose of a 40-pixel strip in a document
|
|
9
|
+
// ten thousand pixels tall touches the handful of boxes that overlap it.
|
|
10
|
+
// Ink bounds rather than the border box, because `overflow: visible` means
|
|
11
|
+
// a child may draw outside its parent and a box-rect test would cull
|
|
12
|
+
// something still on screen.
|
|
13
|
+
// - **A paragraph is one glyph batch.** ntk's `TextLayout.draw` emits every
|
|
14
|
+
// line it holds in a single composite, so paint draws each *layout* once
|
|
15
|
+
// rather than each line — which is why `LineText` records where the
|
|
16
|
+
// layout's origin goes rather than where its line does.
|
|
17
|
+
//
|
|
18
|
+
// The decorations under and over the glyphs are `src/richtext/runs.ts`'s,
|
|
19
|
+
// unchanged: the runs handed to ntk were richtext's `TextRun`s, so what comes
|
|
20
|
+
// back on the laid-out lines is exactly what that module already knows how to
|
|
21
|
+
// draw.
|
|
22
|
+
import {
|
|
23
|
+
canFill,
|
|
24
|
+
lineBands,
|
|
25
|
+
paintRunBackgrounds,
|
|
26
|
+
paintRunRules,
|
|
27
|
+
} from '../richtext/runs.js';
|
|
28
|
+
import type { FillContext } from '../richtext/runs.js';
|
|
29
|
+
import { inkColor, isTransparent } from './css/values.js';
|
|
30
|
+
import type { ComputedStyle } from './css/style.js';
|
|
31
|
+
import { Box } from './layout/boxes.js';
|
|
32
|
+
import type { BoxTree, LineBox } from './layout/boxes.js';
|
|
33
|
+
import { layoutOffsets } from './layout/inline.js';
|
|
34
|
+
|
|
35
|
+
export interface Rect {
|
|
36
|
+
x: number;
|
|
37
|
+
y: number;
|
|
38
|
+
width: number;
|
|
39
|
+
height: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** The context slice painting uses beyond `FillContext`. Everything optional
|
|
43
|
+
* is missing on the mock backend, where paint is a structural no-op. */
|
|
44
|
+
export interface PaintContext extends FillContext {
|
|
45
|
+
beginPath?(): void;
|
|
46
|
+
rect?(x: number, y: number, w: number, h: number): void;
|
|
47
|
+
roundRect?(x: number, y: number, w: number, h: number, radii: number[]): void;
|
|
48
|
+
fill?(): void;
|
|
49
|
+
clip?(): void;
|
|
50
|
+
drawImage?(image: unknown, ...args: number[]): void;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface PaintOptions {
|
|
54
|
+
/** Where the document's origin sits in the window. Scrolling is this. */
|
|
55
|
+
originX: number;
|
|
56
|
+
originY: number;
|
|
57
|
+
/** The rectangle being repainted, in window coordinates, or null for all. */
|
|
58
|
+
damage: Rect | null;
|
|
59
|
+
/** The document range the selection covers, in code units, or null. */
|
|
60
|
+
selection: { start: number; end: number } | null;
|
|
61
|
+
selectionColor: string | null;
|
|
62
|
+
/** A decoded image for an element, when the host has one. */
|
|
63
|
+
imageFor(box: Box): unknown | null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* The bounds of everything a box and its descendants draw, in document
|
|
68
|
+
* coordinates. Computed once per layout; the paint pass reads it.
|
|
69
|
+
*/
|
|
70
|
+
export function computePaintBounds(box: Box): Rect {
|
|
71
|
+
let x1 = box.x;
|
|
72
|
+
let y1 = box.y;
|
|
73
|
+
let x2 = box.x + box.width;
|
|
74
|
+
let y2 = box.y + box.height;
|
|
75
|
+
if (box.lines) {
|
|
76
|
+
for (const line of box.lines) {
|
|
77
|
+
x1 = Math.min(x1, line.x);
|
|
78
|
+
y1 = Math.min(y1, line.y);
|
|
79
|
+
x2 = Math.max(x2, line.x + line.width);
|
|
80
|
+
y2 = Math.max(y2, line.y + line.height);
|
|
81
|
+
for (const placed of line.atomics) {
|
|
82
|
+
const bounds = computePaintBounds(placed.box);
|
|
83
|
+
x1 = Math.min(x1, bounds.x);
|
|
84
|
+
y1 = Math.min(y1, bounds.y);
|
|
85
|
+
x2 = Math.max(x2, bounds.x + bounds.width);
|
|
86
|
+
y2 = Math.max(y2, bounds.y + bounds.height);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (box.markerLayout) {
|
|
91
|
+
// The marker hangs in the padding to the left of the content, so it is
|
|
92
|
+
// outside the border box and has to widen the ink bounds or a repaint
|
|
93
|
+
// clipped to a narrow strip drops it.
|
|
94
|
+
x1 = Math.min(x1, box.markerX);
|
|
95
|
+
y1 = Math.min(y1, box.markerY);
|
|
96
|
+
x2 = Math.max(x2, box.markerX + box.markerLayout.width);
|
|
97
|
+
y2 = Math.max(y2, box.markerY + box.markerLayout.height);
|
|
98
|
+
}
|
|
99
|
+
for (const child of box.children) {
|
|
100
|
+
if (child.kind === 'text' || child.kind === 'break') continue;
|
|
101
|
+
const bounds = computePaintBounds(child);
|
|
102
|
+
x1 = Math.min(x1, bounds.x);
|
|
103
|
+
y1 = Math.min(y1, bounds.y);
|
|
104
|
+
x2 = Math.max(x2, bounds.x + bounds.width);
|
|
105
|
+
y2 = Math.max(y2, bounds.y + bounds.height);
|
|
106
|
+
}
|
|
107
|
+
box.boundsX = x1;
|
|
108
|
+
box.boundsY = y1;
|
|
109
|
+
box.boundsWidth = x2 - x1;
|
|
110
|
+
box.boundsHeight = y2 - y1;
|
|
111
|
+
|
|
112
|
+
if (box.lines) {
|
|
113
|
+
let tallest = 0;
|
|
114
|
+
for (const line of box.lines) tallest = Math.max(tallest, line.height);
|
|
115
|
+
box.maxLineHeight = tallest;
|
|
116
|
+
}
|
|
117
|
+
buildChildIndexes(box);
|
|
118
|
+
|
|
119
|
+
return { x: x1, y: y1, width: box.boundsWidth, height: box.boundsHeight };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Children lists past this size get the sorted viewport index; below it a
|
|
123
|
+
* linear scan is cheaper than keeping one. */
|
|
124
|
+
const PAINT_INDEX_MIN = 64;
|
|
125
|
+
|
|
126
|
+
function buildChildIndexes(box: Box): void {
|
|
127
|
+
box.paintIndex = null;
|
|
128
|
+
box.positionedPaint = null;
|
|
129
|
+
let positioned: Box[] | null = null;
|
|
130
|
+
let paintable = 0;
|
|
131
|
+
for (const child of box.children) {
|
|
132
|
+
if (child.kind === 'text' || child.kind === 'break') continue;
|
|
133
|
+
if (child.outOfFlow) (positioned ??= []).push(child);
|
|
134
|
+
else paintable += 1;
|
|
135
|
+
}
|
|
136
|
+
if (positioned) {
|
|
137
|
+
// Pre-sorted once per layout instead of filtered and sorted per paint.
|
|
138
|
+
positioned.sort(byZIndex);
|
|
139
|
+
box.positionedPaint = positioned;
|
|
140
|
+
}
|
|
141
|
+
if (paintable < PAINT_INDEX_MIN) return;
|
|
142
|
+
const boxes: Box[] = [];
|
|
143
|
+
for (const child of box.children) {
|
|
144
|
+
if (child.kind === 'text' || child.kind === 'break' || child.outOfFlow)
|
|
145
|
+
continue;
|
|
146
|
+
boxes.push(child);
|
|
147
|
+
}
|
|
148
|
+
const order = boxes.map((_, i) => i);
|
|
149
|
+
order.sort((a, b) => boxes[a].boundsY - boxes[b].boundsY);
|
|
150
|
+
const sorted = order.map((i) => boxes[i]);
|
|
151
|
+
const prefixBottom: number[] = new Array<number>(sorted.length);
|
|
152
|
+
let running = -Infinity;
|
|
153
|
+
for (let i = 0; i < sorted.length; i += 1) {
|
|
154
|
+
running = Math.max(running, sorted[i].boundsY + sorted[i].boundsHeight);
|
|
155
|
+
prefixBottom[i] = running;
|
|
156
|
+
}
|
|
157
|
+
box.paintIndex = { boxes: sorted, order, prefixBottom };
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* The children whose ink can touch `[top, bottom)`, in document order.
|
|
162
|
+
* The prefix maximum of bottoms is monotone, so the first candidate is a
|
|
163
|
+
* binary search; the scan stops at the first sorted top past the bottom.
|
|
164
|
+
*/
|
|
165
|
+
export function queryChildIndex(
|
|
166
|
+
index: NonNullable<Box['paintIndex']>,
|
|
167
|
+
top: number,
|
|
168
|
+
bottom: number,
|
|
169
|
+
): Box[] {
|
|
170
|
+
const { boxes, order, prefixBottom } = index;
|
|
171
|
+
let lo = 0;
|
|
172
|
+
let hi = boxes.length;
|
|
173
|
+
while (lo < hi) {
|
|
174
|
+
const mid = (lo + hi) >> 1;
|
|
175
|
+
if (prefixBottom[mid] > top) hi = mid;
|
|
176
|
+
else lo = mid + 1;
|
|
177
|
+
}
|
|
178
|
+
const hits: { at: number; box: Box }[] = [];
|
|
179
|
+
for (let i = lo; i < boxes.length; i += 1) {
|
|
180
|
+
const child = boxes[i];
|
|
181
|
+
if (child.boundsY >= bottom) break;
|
|
182
|
+
if (child.boundsY + child.boundsHeight > top)
|
|
183
|
+
hits.push({ at: order[i], box: child });
|
|
184
|
+
}
|
|
185
|
+
// Paint order is document order; the handful of visible children sort in
|
|
186
|
+
// no time, where sorting the whole list per paint was the point of not
|
|
187
|
+
// filtering per paint.
|
|
188
|
+
hits.sort((a, b) => a.at - b.at);
|
|
189
|
+
return hits.map((h) => h.box);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** Paint a laid-out document. */
|
|
193
|
+
export function paintDocument(
|
|
194
|
+
ctx: PaintContext,
|
|
195
|
+
tree: BoxTree,
|
|
196
|
+
options: PaintOptions,
|
|
197
|
+
): void {
|
|
198
|
+
if (!canFill(ctx)) return;
|
|
199
|
+
ctx.save();
|
|
200
|
+
paintBox(ctx, tree.root, options);
|
|
201
|
+
ctx.restore();
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function paintBox(ctx: PaintContext, box: Box, options: PaintOptions): void {
|
|
205
|
+
if (!intersects(box, options)) return;
|
|
206
|
+
const style = box.style;
|
|
207
|
+
const visible = style.visibility === 'visible';
|
|
208
|
+
|
|
209
|
+
if (visible) {
|
|
210
|
+
paintBackground(ctx, box, options);
|
|
211
|
+
paintBorders(ctx, box, options);
|
|
212
|
+
if (box.markerText) paintMarker(ctx, box, options);
|
|
213
|
+
if (box.replaced === 'image') paintImage(ctx, box, options);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// In-flow and floated descendants first, then the inline content, then the
|
|
217
|
+
// positioned ones — a flattening of CSS's painting order that is right for
|
|
218
|
+
// everything short of a document that puts a negative z-index under its own
|
|
219
|
+
// parent's background.
|
|
220
|
+
const damage = options.damage;
|
|
221
|
+
if (box.paintIndex && damage) {
|
|
222
|
+
for (const child of queryChildIndex(
|
|
223
|
+
box.paintIndex,
|
|
224
|
+
damage.y - options.originY,
|
|
225
|
+
damage.y + damage.height - options.originY,
|
|
226
|
+
)) {
|
|
227
|
+
paintBox(ctx, child, options);
|
|
228
|
+
}
|
|
229
|
+
} else {
|
|
230
|
+
for (const child of box.children) {
|
|
231
|
+
if (child.kind === 'text' || child.kind === 'break') continue;
|
|
232
|
+
if (child.outOfFlow) continue;
|
|
233
|
+
paintBox(ctx, child, options);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if (box.lines && visible) paintLines(ctx, box, options);
|
|
238
|
+
|
|
239
|
+
if (box.positionedPaint) {
|
|
240
|
+
for (const child of box.positionedPaint) paintBox(ctx, child, options);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function byZIndex(a: Box, b: Box): number {
|
|
245
|
+
const az = a.style.zIndex === 'auto' ? 0 : a.style.zIndex;
|
|
246
|
+
const bz = b.style.zIndex === 'auto' ? 0 : b.style.zIndex;
|
|
247
|
+
return az - bz;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/** Whether anything this box or its descendants draw is in the damage. */
|
|
251
|
+
function intersects(box: Box, options: PaintOptions): boolean {
|
|
252
|
+
const damage = options.damage;
|
|
253
|
+
if (!damage) return true;
|
|
254
|
+
const x = box.boundsX + options.originX;
|
|
255
|
+
const y = box.boundsY + options.originY;
|
|
256
|
+
return (
|
|
257
|
+
x < damage.x + damage.width &&
|
|
258
|
+
x + box.boundsWidth > damage.x &&
|
|
259
|
+
y < damage.y + damage.height &&
|
|
260
|
+
y + box.boundsHeight > damage.y
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* A fill rectangle clamped to the neighbourhood of the damage.
|
|
266
|
+
*
|
|
267
|
+
* Load-bearing, not an optimization: the X protocol carries a fill's
|
|
268
|
+
* position as Int16 and its size as Uint16, so the background of a box
|
|
269
|
+
* hundreds of thousands of pixels tall *thrown at the server whole* dies in
|
|
270
|
+
* the request encoder — the pixels beyond the viewport were never going to
|
|
271
|
+
* exist, but the numbers still had to fit. The margin keeps rounded corners
|
|
272
|
+
* and antialiasing outside the damage honest; with no damage at all the
|
|
273
|
+
* Int16 envelope itself is the clamp.
|
|
274
|
+
*/
|
|
275
|
+
const CLAMP_PAD = 64;
|
|
276
|
+
|
|
277
|
+
function clampRect(
|
|
278
|
+
options: PaintOptions,
|
|
279
|
+
x: number,
|
|
280
|
+
y: number,
|
|
281
|
+
w: number,
|
|
282
|
+
h: number,
|
|
283
|
+
): { x: number; y: number; w: number; h: number } | null {
|
|
284
|
+
const damage = options.damage;
|
|
285
|
+
const left = damage ? damage.x - CLAMP_PAD : -COORD_LIMIT;
|
|
286
|
+
const top = damage ? damage.y - CLAMP_PAD : -COORD_LIMIT;
|
|
287
|
+
const right = damage ? damage.x + damage.width + CLAMP_PAD : COORD_LIMIT;
|
|
288
|
+
const bottom = damage ? damage.y + damage.height + CLAMP_PAD : COORD_LIMIT;
|
|
289
|
+
const x1 = Math.max(x, left);
|
|
290
|
+
const y1 = Math.max(y, top);
|
|
291
|
+
const x2 = Math.min(x + w, right);
|
|
292
|
+
const y2 = Math.min(y + h, bottom);
|
|
293
|
+
if (x2 <= x1 || y2 <= y1) return null;
|
|
294
|
+
return { x: x1, y: y1, w: x2 - x1, h: y2 - y1 };
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function paintBackground(
|
|
298
|
+
ctx: PaintContext,
|
|
299
|
+
box: Box,
|
|
300
|
+
options: PaintOptions,
|
|
301
|
+
): void {
|
|
302
|
+
const color = box.style.backgroundColor;
|
|
303
|
+
if (isTransparent(color)) return;
|
|
304
|
+
const rect = clampRect(
|
|
305
|
+
options,
|
|
306
|
+
Math.round(box.x + options.originX),
|
|
307
|
+
Math.round(box.y + options.originY),
|
|
308
|
+
Math.ceil(box.width),
|
|
309
|
+
Math.ceil(box.height),
|
|
310
|
+
);
|
|
311
|
+
if (!rect) return;
|
|
312
|
+
ctx.fillStyle = inkColor(color as string, box.style.color);
|
|
313
|
+
const radii = box.style.borderRadius;
|
|
314
|
+
if (radii.some((r) => r > 0) && ctx.roundRect && ctx.fill && ctx.beginPath) {
|
|
315
|
+
// The clamp can only have cut edges further than CLAMP_PAD outside the
|
|
316
|
+
// damage, and a sane radius is smaller than that — so a corner that
|
|
317
|
+
// survives the cut is whole, and a cut edge is offscreen.
|
|
318
|
+
ctx.beginPath();
|
|
319
|
+
ctx.roundRect(rect.x, rect.y, rect.w, rect.h, radii.slice());
|
|
320
|
+
ctx.fill();
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
ctx.fillRect(rect.x, rect.y, rect.w, rect.h);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Borders, as four rectangles.
|
|
328
|
+
*
|
|
329
|
+
* Not as a stroked path, for the reason richtext gives about its underlines:
|
|
330
|
+
* the mock backend has no path API, and a 1px border on a pixel grid is a
|
|
331
|
+
* rectangle rather than something an antialiased stroke improves. Corners are
|
|
332
|
+
* mitred by drawing the top and bottom full-width and the sides between them,
|
|
333
|
+
* which is right whenever the two sides share a colour and close enough when
|
|
334
|
+
* they do not.
|
|
335
|
+
*/
|
|
336
|
+
function paintBorders(
|
|
337
|
+
ctx: PaintContext,
|
|
338
|
+
box: Box,
|
|
339
|
+
options: PaintOptions,
|
|
340
|
+
): void {
|
|
341
|
+
const s = box.style;
|
|
342
|
+
const x = Math.round(box.x + options.originX);
|
|
343
|
+
const y = Math.round(box.y + options.originY);
|
|
344
|
+
const w = Math.ceil(box.width);
|
|
345
|
+
const h = Math.ceil(box.height);
|
|
346
|
+
if (w <= 0 || h <= 0) return;
|
|
347
|
+
|
|
348
|
+
const edge = (
|
|
349
|
+
ex: number,
|
|
350
|
+
ey: number,
|
|
351
|
+
ew: number,
|
|
352
|
+
eh: number,
|
|
353
|
+
style: ComputedStyle['borderTopStyle'],
|
|
354
|
+
color: string,
|
|
355
|
+
horizontal: boolean,
|
|
356
|
+
): void => {
|
|
357
|
+
const rect = clampRect(options, ex, ey, ew, eh);
|
|
358
|
+
if (!rect) return;
|
|
359
|
+
ctx.fillStyle = inkColor(color, s.color);
|
|
360
|
+
// The un-clamped start is the dash phase's origin, so the pattern does
|
|
361
|
+
// not crawl as the viewport moves along a long edge.
|
|
362
|
+
fillEdge(ctx, rect, horizontal ? ex : ey, style, horizontal);
|
|
363
|
+
};
|
|
364
|
+
if (box.borderTop > 0 && !isTransparent(s.borderTopColor)) {
|
|
365
|
+
edge(x, y, w, box.borderTop, s.borderTopStyle, s.borderTopColor, true);
|
|
366
|
+
}
|
|
367
|
+
if (box.borderBottom > 0 && !isTransparent(s.borderBottomColor)) {
|
|
368
|
+
edge(
|
|
369
|
+
x,
|
|
370
|
+
y + h - box.borderBottom,
|
|
371
|
+
w,
|
|
372
|
+
box.borderBottom,
|
|
373
|
+
s.borderBottomStyle,
|
|
374
|
+
s.borderBottomColor,
|
|
375
|
+
true,
|
|
376
|
+
);
|
|
377
|
+
}
|
|
378
|
+
if (box.borderLeft > 0 && !isTransparent(s.borderLeftColor)) {
|
|
379
|
+
edge(
|
|
380
|
+
x,
|
|
381
|
+
y + box.borderTop,
|
|
382
|
+
box.borderLeft,
|
|
383
|
+
h - box.borderTop - box.borderBottom,
|
|
384
|
+
s.borderLeftStyle,
|
|
385
|
+
s.borderLeftColor,
|
|
386
|
+
false,
|
|
387
|
+
);
|
|
388
|
+
}
|
|
389
|
+
if (box.borderRight > 0 && !isTransparent(s.borderRightColor)) {
|
|
390
|
+
edge(
|
|
391
|
+
x + w - box.borderRight,
|
|
392
|
+
y + box.borderTop,
|
|
393
|
+
box.borderRight,
|
|
394
|
+
h - box.borderTop - box.borderBottom,
|
|
395
|
+
s.borderRightStyle,
|
|
396
|
+
s.borderRightColor,
|
|
397
|
+
false,
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
function fillEdge(
|
|
403
|
+
ctx: PaintContext,
|
|
404
|
+
rect: { x: number; y: number; w: number; h: number },
|
|
405
|
+
phaseOrigin: number,
|
|
406
|
+
style: ComputedStyle['borderTopStyle'],
|
|
407
|
+
horizontal: boolean,
|
|
408
|
+
): void {
|
|
409
|
+
const { x, y, w, h } = rect;
|
|
410
|
+
const length = horizontal ? w : h;
|
|
411
|
+
const thickness = horizontal ? h : w;
|
|
412
|
+
if (length <= 0 || thickness <= 0) return;
|
|
413
|
+
if (style === 'dashed' || style === 'dotted') {
|
|
414
|
+
const period = style === 'dotted' ? thickness * 2 : thickness * 3;
|
|
415
|
+
const on = style === 'dotted' ? thickness : thickness * 2;
|
|
416
|
+
const from = horizontal ? x : y;
|
|
417
|
+
// Start on the pattern boundary at or before the clamped start, so the
|
|
418
|
+
// dash the viewport cuts into is the same dash it always was.
|
|
419
|
+
let i = Math.floor((from - phaseOrigin) / period) * period + phaseOrigin;
|
|
420
|
+
for (; i < from + length; i += period) {
|
|
421
|
+
const start = Math.max(i, from);
|
|
422
|
+
const run = Math.min(i + on, from + length) - start;
|
|
423
|
+
if (run <= 0) continue;
|
|
424
|
+
if (horizontal) ctx.fillRect(start, y, run, thickness);
|
|
425
|
+
else ctx.fillRect(x, start, thickness, run);
|
|
426
|
+
}
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
if (style === 'double' && thickness >= 3) {
|
|
430
|
+
const band = Math.max(1, Math.floor(thickness / 3));
|
|
431
|
+
if (horizontal) {
|
|
432
|
+
ctx.fillRect(x, y, length, band);
|
|
433
|
+
ctx.fillRect(x, y + thickness - band, length, band);
|
|
434
|
+
} else {
|
|
435
|
+
ctx.fillRect(x, y, band, length);
|
|
436
|
+
ctx.fillRect(x + thickness - band, y, band, length);
|
|
437
|
+
}
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
ctx.fillRect(x, y, w, h);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/** A list item's bullet or number, in the margin. */
|
|
444
|
+
function paintMarker(ctx: PaintContext, box: Box, options: PaintOptions): void {
|
|
445
|
+
const marker = box.markerLayout;
|
|
446
|
+
if (!marker) return;
|
|
447
|
+
const x = box.markerX + options.originX;
|
|
448
|
+
const y = box.markerY + options.originY;
|
|
449
|
+
marker.draw(ctx, x, y);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
function paintImage(ctx: PaintContext, box: Box, options: PaintOptions): void {
|
|
453
|
+
const image = options.imageFor(box);
|
|
454
|
+
const x = Math.round(box.contentX + options.originX);
|
|
455
|
+
const y = Math.round(box.contentY + options.originY);
|
|
456
|
+
const w = Math.ceil(box.contentWidth);
|
|
457
|
+
const h = Math.ceil(box.contentHeight);
|
|
458
|
+
if (w <= 0 || h <= 0) return;
|
|
459
|
+
if (image && ctx.drawImage) {
|
|
460
|
+
ctx.drawImage(image, x, y, w, h);
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
// No image yet, or no image at all: a faint frame where it will be, so a
|
|
464
|
+
// document with blocked resources still reads as a document with pictures
|
|
465
|
+
// in it rather than as one with holes.
|
|
466
|
+
if (!box.style.backgroundColor) {
|
|
467
|
+
ctx.fillStyle = box.style.color;
|
|
468
|
+
const t = 1;
|
|
469
|
+
ctx.fillRect(x, y, w, t);
|
|
470
|
+
ctx.fillRect(x, y + h - t, w, t);
|
|
471
|
+
ctx.fillRect(x, y, t, h);
|
|
472
|
+
ctx.fillRect(x + w - t, y, t, h);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* The X protocol carries glyph positions as Int16, so anything drawn past
|
|
478
|
+
* ±32767 window coordinates does not clip — it throws in the encoder. The
|
|
479
|
+
* caller bounds a full repaint to the window (see `HtmlViewNode.paint`),
|
|
480
|
+
* which keeps every *culled* coordinate in range; this margin is how far a
|
|
481
|
+
* drawn layout's own lines may run past the damage before the batch itself
|
|
482
|
+
* would overflow.
|
|
483
|
+
*/
|
|
484
|
+
const COORD_LIMIT = 30000;
|
|
485
|
+
|
|
486
|
+
function paintLines(ctx: PaintContext, box: Box, options: PaintOptions): void {
|
|
487
|
+
const lines = box.lines;
|
|
488
|
+
if (!lines) return;
|
|
489
|
+
const dx = options.originX;
|
|
490
|
+
const dy = options.originY;
|
|
491
|
+
const damage = options.damage;
|
|
492
|
+
|
|
493
|
+
// Three passes over the visible lines, not one: ntk draws a whole layout
|
|
494
|
+
// in one glyph batch, so a multi-line paragraph's ink all lands on the
|
|
495
|
+
// first line that references it — and anything painted "under the ink" on
|
|
496
|
+
// a later line would land *over* it. Everything under the glyphs is
|
|
497
|
+
// painted for every line first, then the ink once per layout, then the
|
|
498
|
+
// rules over it.
|
|
499
|
+
const visible: LineBox[] = [];
|
|
500
|
+
if (damage) {
|
|
501
|
+
// Lines are built top to bottom, so `y` is monotone; a line's *bottom*
|
|
502
|
+
// is not (heights vary), which is what the tallest-line slack is for.
|
|
503
|
+
// Start at the first line that could reach the damage, stop at the
|
|
504
|
+
// first one past it: the cost is the visible lines, not the box's.
|
|
505
|
+
const top = damage.y - dy;
|
|
506
|
+
const bottom = top + damage.height;
|
|
507
|
+
let lo = 0;
|
|
508
|
+
let hi = lines.length;
|
|
509
|
+
const slack = top - box.maxLineHeight;
|
|
510
|
+
while (lo < hi) {
|
|
511
|
+
const mid = (lo + hi) >> 1;
|
|
512
|
+
if (lines[mid].y > slack) hi = mid;
|
|
513
|
+
else lo = mid + 1;
|
|
514
|
+
}
|
|
515
|
+
for (let i = lo; i < lines.length; i += 1) {
|
|
516
|
+
const line = lines[i];
|
|
517
|
+
if (line.y >= bottom) break;
|
|
518
|
+
if (line.y + line.height > top) visible.push(line);
|
|
519
|
+
}
|
|
520
|
+
} else {
|
|
521
|
+
visible.push(...lines);
|
|
522
|
+
}
|
|
523
|
+
if (!visible.length) return;
|
|
524
|
+
|
|
525
|
+
for (const line of visible) {
|
|
526
|
+
for (const text of line.texts) {
|
|
527
|
+
const natural = text.layout.lines[text.layoutLine];
|
|
528
|
+
if (natural)
|
|
529
|
+
paintRunBackgrounds(ctx, natural, text.drawX + dx, text.drawY + dy);
|
|
530
|
+
}
|
|
531
|
+
paintSelection(ctx, line, options);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// One `draw` per layout: a paragraph is a single glyph composite, and
|
|
535
|
+
// drawing it once per line would be one X request per line for the same
|
|
536
|
+
// batch.
|
|
537
|
+
const drawn = new Set<unknown>();
|
|
538
|
+
for (const line of visible) {
|
|
539
|
+
for (const text of line.texts) {
|
|
540
|
+
if (drawn.has(text.layout)) continue;
|
|
541
|
+
drawn.add(text.layout);
|
|
542
|
+
const top = text.drawY + dy;
|
|
543
|
+
if (top < -COORD_LIMIT || top + text.layout.height > COORD_LIMIT) {
|
|
544
|
+
// A single layout so tall its own lines overflow the Int16 envelope
|
|
545
|
+
// — a one-paragraph document tens of thousands of pixels high. The
|
|
546
|
+
// element scrolling itself (phase 2, see the PRD) is the real
|
|
547
|
+
// answer; until then the overflowing batch is skipped rather than
|
|
548
|
+
// thrown from the protocol encoder.
|
|
549
|
+
continue;
|
|
550
|
+
}
|
|
551
|
+
text.layout.draw(ctx, text.drawX + dx, top);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
for (const line of visible) {
|
|
556
|
+
for (const text of line.texts) {
|
|
557
|
+
const natural = text.layout.lines[text.layoutLine];
|
|
558
|
+
if (natural)
|
|
559
|
+
paintRunRules(ctx, natural, text.drawX + dx, text.drawY + dy);
|
|
560
|
+
}
|
|
561
|
+
for (const placed of line.atomics) paintBox(ctx, placed.box, options);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
/**
|
|
566
|
+
* The band the document selection covers on one line.
|
|
567
|
+
*
|
|
568
|
+
* Translucent under the glyphs rather than inverted over them, so the ink
|
|
569
|
+
* keeps its contrast on either palette — the same call `<textarea>` and
|
|
570
|
+
* `<richtext>` both make.
|
|
571
|
+
*/
|
|
572
|
+
function paintSelection(
|
|
573
|
+
ctx: PaintContext,
|
|
574
|
+
line: LineBox,
|
|
575
|
+
options: PaintOptions,
|
|
576
|
+
): void {
|
|
577
|
+
const range = options.selection;
|
|
578
|
+
if (!range || range.end <= range.start || !options.selectionColor) return;
|
|
579
|
+
if (line.textEnd <= range.start || line.textStart >= range.end) return;
|
|
580
|
+
ctx.fillStyle = options.selectionColor;
|
|
581
|
+
for (const text of line.texts) {
|
|
582
|
+
const natural = text.layout.lines[text.layoutLine];
|
|
583
|
+
if (!natural) continue;
|
|
584
|
+
const from = Math.max(range.start, text.textStart);
|
|
585
|
+
const to = Math.min(range.end, text.textEnd);
|
|
586
|
+
if (to <= from) continue;
|
|
587
|
+
const offsets = layoutOffsets(text.layout);
|
|
588
|
+
const layoutFrom = text.layoutStart + (from - text.textStart);
|
|
589
|
+
const layoutTo = text.layoutStart + (to - text.textStart);
|
|
590
|
+
for (const band of lineBands(
|
|
591
|
+
text.layout,
|
|
592
|
+
natural,
|
|
593
|
+
offsets,
|
|
594
|
+
layoutFrom,
|
|
595
|
+
layoutTo,
|
|
596
|
+
)) {
|
|
597
|
+
ctx.fillRect(
|
|
598
|
+
Math.round(band.x + text.drawX + options.originX),
|
|
599
|
+
Math.round(line.y + options.originY),
|
|
600
|
+
Math.ceil(band.width),
|
|
601
|
+
Math.ceil(line.height),
|
|
602
|
+
);
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
}
|