@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,876 @@
|
|
|
1
|
+
// KaTeX's virtual DOM, laid out in pixels.
|
|
2
|
+
//
|
|
3
|
+
// A browser renders KaTeX's tree with a small, deliberate subset of CSS:
|
|
4
|
+
// inline flow with em margins, the vlist's absolutely-positioned rows,
|
|
5
|
+
// border-bottom rules, font classes, `text-align` on fraction and limit
|
|
6
|
+
// stacks, and overflow-hidden svg surds. This module is that subset,
|
|
7
|
+
// written against pixel coordinates instead of a style engine. It is pure —
|
|
8
|
+
// no ntk, no react — which is what lets a test assert a superscript sits
|
|
9
|
+
// above the baseline without a display.
|
|
10
|
+
//
|
|
11
|
+
// Two sources of truth meet here, and the split matters:
|
|
12
|
+
//
|
|
13
|
+
// - **Vertical geometry is KaTeX's.** Every node in the tree carries
|
|
14
|
+
// `height`/`depth` in em (descendant size changes already multiplied in),
|
|
15
|
+
// and a vlist row's `top` plus its pstrut's height place a row's baseline
|
|
16
|
+
// exactly as `buildCommon.makeVList` computed it: baseline offset =
|
|
17
|
+
// `top + pstrut` em below the stack's own baseline.
|
|
18
|
+
// - **Horizontal geometry is the shaper's** — widths come from measuring
|
|
19
|
+
// the actual face ntk will draw, so ink and hit-testing cannot drift from
|
|
20
|
+
// what is on screen. KaTeX's own metric width rides along as the
|
|
21
|
+
// fallback (`SymbolNode.width`), which is honest because it describes
|
|
22
|
+
// the same font files; it is what the mock backend lays out with.
|
|
23
|
+
//
|
|
24
|
+
// Reading order: glyphs are emitted in tree order, except that a vlist's
|
|
25
|
+
// rows are emitted top row first — the DOM stacks them bottom-up, and a
|
|
26
|
+
// selection that reads "numerator, then denominator" (or "superscript,
|
|
27
|
+
// then subscript") is the one a reader expects to copy.
|
|
28
|
+
|
|
29
|
+
import type { KatexNode } from './katex.js';
|
|
30
|
+
|
|
31
|
+
// --- public shapes ----------------------------------------------------------
|
|
32
|
+
|
|
33
|
+
/** Measures one run of text in a face, in px. `null` means "no fonts here"
|
|
34
|
+
* (the mock backend) — the caller falls back to KaTeX's own metrics. */
|
|
35
|
+
export interface FormulaShaper {
|
|
36
|
+
width(
|
|
37
|
+
text: string,
|
|
38
|
+
family: string,
|
|
39
|
+
weight: number,
|
|
40
|
+
style: 'normal' | 'italic',
|
|
41
|
+
size: number,
|
|
42
|
+
): number | null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** One positioned run of ink. Coordinates are px from the layout's
|
|
46
|
+
* top-left; `baseline` is where the glyph sits, `top`/`bottom` bound the
|
|
47
|
+
* band a selection lights. */
|
|
48
|
+
export interface FormulaGlyph {
|
|
49
|
+
text: string;
|
|
50
|
+
x: number;
|
|
51
|
+
width: number;
|
|
52
|
+
baseline: number;
|
|
53
|
+
top: number;
|
|
54
|
+
bottom: number;
|
|
55
|
+
size: number;
|
|
56
|
+
family: string;
|
|
57
|
+
weight: number;
|
|
58
|
+
style: 'normal' | 'italic';
|
|
59
|
+
color: string;
|
|
60
|
+
/** Code-point offset of this glyph's text in `FormulaLayout.text`. */
|
|
61
|
+
index: number;
|
|
62
|
+
/** Code points in `text`. */
|
|
63
|
+
length: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** A filled rectangle — fraction bars, `\rule`, overlines. */
|
|
67
|
+
export interface FormulaRule {
|
|
68
|
+
x: number;
|
|
69
|
+
y: number;
|
|
70
|
+
width: number;
|
|
71
|
+
height: number;
|
|
72
|
+
color: string;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
type PathSeg =
|
|
76
|
+
| { c: 'M' | 'L'; x: number; y: number }
|
|
77
|
+
| {
|
|
78
|
+
c: 'C';
|
|
79
|
+
x1: number;
|
|
80
|
+
y1: number;
|
|
81
|
+
x2: number;
|
|
82
|
+
y2: number;
|
|
83
|
+
x: number;
|
|
84
|
+
y: number;
|
|
85
|
+
}
|
|
86
|
+
| { c: 'Q'; x1: number; y1: number; x: number; y: number }
|
|
87
|
+
| { c: 'Z' };
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* An svg drawing (surds, stretchy accents), still in its viewBox units.
|
|
91
|
+
* The painter derives the transform: `'slice'` scales uniformly by height
|
|
92
|
+
* and clips horizontally at `width` (KaTeX's 400em-wide surd tails);
|
|
93
|
+
* `'none'` stretches each axis independently; `'fit'` scales uniformly.
|
|
94
|
+
*/
|
|
95
|
+
export interface FormulaPath {
|
|
96
|
+
segs: PathSeg[];
|
|
97
|
+
x: number;
|
|
98
|
+
y: number;
|
|
99
|
+
width: number;
|
|
100
|
+
height: number;
|
|
101
|
+
viewWidth: number;
|
|
102
|
+
viewHeight: number;
|
|
103
|
+
mode: 'slice' | 'none' | 'fit';
|
|
104
|
+
color: string;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export interface FormulaLayout {
|
|
108
|
+
width: number;
|
|
109
|
+
/** Above / below the baseline of the outermost line, px. */
|
|
110
|
+
ascent: number;
|
|
111
|
+
descent: number;
|
|
112
|
+
baseline: number;
|
|
113
|
+
glyphs: FormulaGlyph[];
|
|
114
|
+
rules: FormulaRule[];
|
|
115
|
+
paths: FormulaPath[];
|
|
116
|
+
/** The glyphs' text in reading order — what a selection copies. */
|
|
117
|
+
text: string;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export interface FormulaLayoutOptions {
|
|
121
|
+
/** Pixels per em at the formula's base size. */
|
|
122
|
+
em: number;
|
|
123
|
+
color: string;
|
|
124
|
+
shaper: FormulaShaper | null;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// --- tables -----------------------------------------------------------------
|
|
128
|
+
|
|
129
|
+
/** `Options.js`'s sizeMultipliers: `reset-sizeN sizeM` scales by M/N. */
|
|
130
|
+
const SIZE_MULT = [
|
|
131
|
+
0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.44, 1.728, 2.074, 2.488,
|
|
132
|
+
];
|
|
133
|
+
|
|
134
|
+
interface FontBits {
|
|
135
|
+
family?: string;
|
|
136
|
+
weight?: number;
|
|
137
|
+
style?: 'normal' | 'italic';
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** katex.css's font rules, class by class. */
|
|
141
|
+
const FONT_CLASSES: Record<string, FontBits> = {
|
|
142
|
+
mathnormal: { family: 'KaTeX_Math', style: 'italic' },
|
|
143
|
+
mathdefault: { family: 'KaTeX_Math', style: 'italic' },
|
|
144
|
+
mathit: { family: 'KaTeX_Main', style: 'italic' },
|
|
145
|
+
mathrm: { style: 'normal' },
|
|
146
|
+
mathbf: { family: 'KaTeX_Main', weight: 700 },
|
|
147
|
+
boldsymbol: { family: 'KaTeX_Math', weight: 700, style: 'italic' },
|
|
148
|
+
amsrm: { family: 'KaTeX_AMS' },
|
|
149
|
+
mathbb: { family: 'KaTeX_AMS' },
|
|
150
|
+
textbb: { family: 'KaTeX_AMS' },
|
|
151
|
+
mathcal: { family: 'KaTeX_Caligraphic' },
|
|
152
|
+
mathfrak: { family: 'KaTeX_Fraktur' },
|
|
153
|
+
textfrak: { family: 'KaTeX_Fraktur' },
|
|
154
|
+
mathboldfrak: { family: 'KaTeX_Fraktur', weight: 700 },
|
|
155
|
+
textboldfrak: { family: 'KaTeX_Fraktur', weight: 700 },
|
|
156
|
+
mathtt: { family: 'KaTeX_Typewriter' },
|
|
157
|
+
mathscr: { family: 'KaTeX_Script' },
|
|
158
|
+
textscr: { family: 'KaTeX_Script' },
|
|
159
|
+
mathsf: { family: 'KaTeX_SansSerif' },
|
|
160
|
+
textsf: { family: 'KaTeX_SansSerif' },
|
|
161
|
+
mathboldsf: { family: 'KaTeX_SansSerif', weight: 700 },
|
|
162
|
+
textboldsf: { family: 'KaTeX_SansSerif', weight: 700 },
|
|
163
|
+
mathsfit: { family: 'KaTeX_SansSerif', style: 'italic' },
|
|
164
|
+
mathitsf: { family: 'KaTeX_SansSerif', style: 'italic' },
|
|
165
|
+
textitsf: { family: 'KaTeX_SansSerif', style: 'italic' },
|
|
166
|
+
mainrm: { family: 'KaTeX_Main', style: 'normal' },
|
|
167
|
+
textrm: { family: 'KaTeX_Main' },
|
|
168
|
+
texttt: { family: 'KaTeX_Typewriter' },
|
|
169
|
+
textbf: { weight: 700 },
|
|
170
|
+
textit: { style: 'italic' },
|
|
171
|
+
textup: { style: 'normal' },
|
|
172
|
+
textmd: { weight: 400 },
|
|
173
|
+
'delim-size1': { family: 'KaTeX_Size1' },
|
|
174
|
+
'delim-size4': { family: 'KaTeX_Size4' },
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
/** Rules drawn as a border-bottom the width of their container. */
|
|
178
|
+
const LINE_CLASSES = new Set([
|
|
179
|
+
'frac-line',
|
|
180
|
+
'overline-line',
|
|
181
|
+
'underline-line',
|
|
182
|
+
'hline',
|
|
183
|
+
'hdashline',
|
|
184
|
+
]);
|
|
185
|
+
|
|
186
|
+
// --- small helpers ----------------------------------------------------------
|
|
187
|
+
|
|
188
|
+
function classesOf(node: KatexNode): string[] {
|
|
189
|
+
return Array.isArray(node.classes) ? node.classes : [];
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function has(classes: string[], name: string): boolean {
|
|
193
|
+
return classes.includes(name);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function em(value: string | undefined): number {
|
|
197
|
+
if (!value) return 0;
|
|
198
|
+
const n = parseFloat(value);
|
|
199
|
+
return Number.isFinite(n) ? n : 0;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function countCodePoints(text: string): number {
|
|
203
|
+
let n = 0;
|
|
204
|
+
for (const _ of text) n += 1;
|
|
205
|
+
return n;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/** The walking state: current scale, ink color, inherited face, and the
|
|
209
|
+
* `text-align` a vlist row would inherit. */
|
|
210
|
+
interface Ctx {
|
|
211
|
+
base: number; // px per em at scale 1
|
|
212
|
+
scale: number;
|
|
213
|
+
color: string;
|
|
214
|
+
font: Required<FontBits>;
|
|
215
|
+
align: 'left' | 'center' | 'right';
|
|
216
|
+
shaper: FormulaShaper | null;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function pxEm(ctx: Ctx): number {
|
|
220
|
+
return ctx.base * ctx.scale;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/** Only a `reset-sizeN sizeM` *pair* rescales — `delimsizing size1`'s
|
|
224
|
+
* lone `size1` is a font pick, and falls through to factor 1 here. */
|
|
225
|
+
function sizingFactor(classes: string[]): number {
|
|
226
|
+
let from = 0;
|
|
227
|
+
let to = 0;
|
|
228
|
+
for (const c of classes) {
|
|
229
|
+
let m = /^reset-size(\d+)$/.exec(c);
|
|
230
|
+
if (m) from = Number(m[1]);
|
|
231
|
+
m = /^size(\d+)$/.exec(c);
|
|
232
|
+
if (m) to = Number(m[1]);
|
|
233
|
+
}
|
|
234
|
+
if (!from || !to || !SIZE_MULT[from - 1] || !SIZE_MULT[to - 1]) return 1;
|
|
235
|
+
return SIZE_MULT[to - 1] / SIZE_MULT[from - 1];
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function deriveCtx(ctx: Ctx, node: KatexNode): Ctx {
|
|
239
|
+
const classes = classesOf(node);
|
|
240
|
+
let next = ctx;
|
|
241
|
+
const factor = sizingFactor(classes);
|
|
242
|
+
const color = node.style?.color;
|
|
243
|
+
const font = fontFrom(classes, ctx.font);
|
|
244
|
+
const align = alignFrom(classes, ctx.align);
|
|
245
|
+
if (factor !== 1 || color || font !== ctx.font || align !== ctx.align) {
|
|
246
|
+
next = {
|
|
247
|
+
...ctx,
|
|
248
|
+
scale: ctx.scale * factor,
|
|
249
|
+
color: color ?? ctx.color,
|
|
250
|
+
font,
|
|
251
|
+
align,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
return next;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
function fontFrom(
|
|
258
|
+
classes: string[],
|
|
259
|
+
inherited: Required<FontBits>,
|
|
260
|
+
): Required<FontBits> {
|
|
261
|
+
let out: Required<FontBits> | null = null;
|
|
262
|
+
const apply = (bits: FontBits): void => {
|
|
263
|
+
out = { ...(out ?? inherited), ...bits };
|
|
264
|
+
};
|
|
265
|
+
for (const c of classes) {
|
|
266
|
+
const bits = FONT_CLASSES[c];
|
|
267
|
+
if (bits) apply(bits);
|
|
268
|
+
}
|
|
269
|
+
// `.delimsizing.size1` — the size class doubles as a font pick here
|
|
270
|
+
if (has(classes, 'delimsizing')) {
|
|
271
|
+
for (let i = 1; i <= 4; i += 1) {
|
|
272
|
+
if (has(classes, `size${i}`)) apply({ family: `KaTeX_Size${i}` });
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (has(classes, 'op-symbol')) {
|
|
276
|
+
if (has(classes, 'small-op')) apply({ family: 'KaTeX_Size1' });
|
|
277
|
+
if (has(classes, 'large-op')) apply({ family: 'KaTeX_Size2' });
|
|
278
|
+
}
|
|
279
|
+
return out ?? inherited;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function alignFrom(classes: string[], inherited: Ctx['align']): Ctx['align'] {
|
|
283
|
+
if (has(classes, 'mfrac') || has(classes, 'op-limits')) return 'center';
|
|
284
|
+
if (has(classes, 'katex-accent') || has(classes, 'accent')) return 'center';
|
|
285
|
+
if (has(classes, 'col-align-c')) return 'center';
|
|
286
|
+
if (has(classes, 'col-align-r')) return 'right';
|
|
287
|
+
if (has(classes, 'col-align-l') || has(classes, 'msupsub')) return 'left';
|
|
288
|
+
if (has(classes, 'svg-align')) return 'left';
|
|
289
|
+
return inherited;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// --- boxes ------------------------------------------------------------------
|
|
293
|
+
|
|
294
|
+
/** Everything a subtree laid out to, in its own coordinates: x from the
|
|
295
|
+
* box's left edge, y relative to the box's baseline (down positive). */
|
|
296
|
+
interface LBox {
|
|
297
|
+
width: number;
|
|
298
|
+
/** The advance the parent flow moves by — a symbol's italic correction
|
|
299
|
+
* makes it wider than the ink. Defaults to `width`. */
|
|
300
|
+
advance?: number;
|
|
301
|
+
height: number;
|
|
302
|
+
depth: number;
|
|
303
|
+
glyphs: FormulaGlyph[];
|
|
304
|
+
rules: (FormulaRule & { stretch?: boolean })[];
|
|
305
|
+
paths: (FormulaPath & { stretch?: boolean })[];
|
|
306
|
+
/** True for boxes whose width is the container's (frac lines, surds). */
|
|
307
|
+
stretch?: boolean;
|
|
308
|
+
/** A `\\` — the flow breaks the line after it. */
|
|
309
|
+
newline?: boolean;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
function emptyBox(): LBox {
|
|
313
|
+
return { width: 0, height: 0, depth: 0, glyphs: [], rules: [], paths: [] };
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/** Append `child`'s items into `into`, translated. Emission order is
|
|
317
|
+
* reading order, so callers control it. */
|
|
318
|
+
function mergeBox(into: LBox, child: LBox, dx: number, dy: number): void {
|
|
319
|
+
for (const g of child.glyphs) {
|
|
320
|
+
into.glyphs.push({
|
|
321
|
+
...g,
|
|
322
|
+
x: g.x + dx,
|
|
323
|
+
baseline: g.baseline + dy,
|
|
324
|
+
top: g.top + dy,
|
|
325
|
+
bottom: g.bottom + dy,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
for (const r of child.rules) {
|
|
329
|
+
into.rules.push({ ...r, x: r.x + dx, y: r.y + dy });
|
|
330
|
+
}
|
|
331
|
+
for (const p of child.paths) {
|
|
332
|
+
into.paths.push({ ...p, x: p.x + dx, y: p.y + dy });
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/** Give a stretchable box its container's width. */
|
|
337
|
+
function stretchBox(box: LBox, width: number): void {
|
|
338
|
+
box.width = width;
|
|
339
|
+
for (const r of box.rules) {
|
|
340
|
+
if (r.stretch) r.width = Math.max(0, width - r.x);
|
|
341
|
+
}
|
|
342
|
+
for (const p of box.paths) {
|
|
343
|
+
if (p.stretch) p.width = Math.max(p.width, width - p.x);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// --- node dispatch ----------------------------------------------------------
|
|
348
|
+
|
|
349
|
+
function layoutNode(node: KatexNode, ctx: Ctx): LBox {
|
|
350
|
+
if (typeof node.text === 'string') return symbolBox(node, ctx);
|
|
351
|
+
const classes = classesOf(node);
|
|
352
|
+
if (has(classes, 'katex-mathml')) return emptyBox();
|
|
353
|
+
if (has(classes, 'pstrut')) return emptyBox();
|
|
354
|
+
if (has(classes, 'strut') || has(classes, 'katex-strut')) {
|
|
355
|
+
return strutBox(node, ctx);
|
|
356
|
+
}
|
|
357
|
+
for (const c of classes) {
|
|
358
|
+
if (LINE_CLASSES.has(c)) return lineBox(node, ctx);
|
|
359
|
+
}
|
|
360
|
+
if (has(classes, 'rule') || has(classes, 'katex-rule')) {
|
|
361
|
+
return ruleBox(node, ctx);
|
|
362
|
+
}
|
|
363
|
+
if (has(classes, 'vlist-t')) return vlistBox(node, ctx);
|
|
364
|
+
if (node.children?.some((c) => c.attributes?.viewBox)) {
|
|
365
|
+
return svgBox(node, ctx);
|
|
366
|
+
}
|
|
367
|
+
if (has(classes, 'newline')) {
|
|
368
|
+
const box = emptyBox();
|
|
369
|
+
box.newline = true;
|
|
370
|
+
return box;
|
|
371
|
+
}
|
|
372
|
+
const lap = has(classes, 'llap')
|
|
373
|
+
? 'llap'
|
|
374
|
+
: has(classes, 'rlap')
|
|
375
|
+
? 'rlap'
|
|
376
|
+
: has(classes, 'clap')
|
|
377
|
+
? 'clap'
|
|
378
|
+
: null;
|
|
379
|
+
const box = flowBox(node, ctx);
|
|
380
|
+
if (lap) {
|
|
381
|
+
// `width: 0; position: relative` — the ink hangs out of the flow
|
|
382
|
+
const w = box.width;
|
|
383
|
+
const shift = lap === 'llap' ? -w : lap === 'clap' ? -w / 2 : 0;
|
|
384
|
+
const out = emptyBox();
|
|
385
|
+
out.height = box.height;
|
|
386
|
+
out.depth = box.depth;
|
|
387
|
+
mergeBox(out, box, shift, 0);
|
|
388
|
+
return out;
|
|
389
|
+
}
|
|
390
|
+
return box;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
function symbolBox(node: KatexNode, ctx: Ctx): LBox {
|
|
394
|
+
const text = node.text ?? '';
|
|
395
|
+
const box = emptyBox();
|
|
396
|
+
// KaTeX's Safari shim: a zero-width joiner in every vlist-s cell
|
|
397
|
+
if (text === '' || text === '') return box;
|
|
398
|
+
const my = deriveCtx(ctx, node);
|
|
399
|
+
const size = pxEm(my);
|
|
400
|
+
const measured = my.shaper?.width(
|
|
401
|
+
text,
|
|
402
|
+
my.font.family,
|
|
403
|
+
my.font.weight,
|
|
404
|
+
my.font.style,
|
|
405
|
+
size,
|
|
406
|
+
);
|
|
407
|
+
const width = measured ?? (node.width ?? 0.55 * countCodePoints(text)) * size;
|
|
408
|
+
const height = (node.height ?? 0) * size;
|
|
409
|
+
const depth = (node.depth ?? 0) * size;
|
|
410
|
+
box.width = width;
|
|
411
|
+
box.advance = width + (node.italic ?? 0) * size;
|
|
412
|
+
box.height = height;
|
|
413
|
+
box.depth = depth;
|
|
414
|
+
box.glyphs.push({
|
|
415
|
+
text,
|
|
416
|
+
x: 0,
|
|
417
|
+
width,
|
|
418
|
+
baseline: 0,
|
|
419
|
+
// The selection band: at least a text line's worth, so a lone minus
|
|
420
|
+
// sign does not light up as a two-pixel sliver.
|
|
421
|
+
top: -Math.max(height, 0.75 * size),
|
|
422
|
+
bottom: Math.max(depth, 0.22 * size),
|
|
423
|
+
size,
|
|
424
|
+
family: my.font.family,
|
|
425
|
+
weight: my.font.weight,
|
|
426
|
+
style: my.font.style,
|
|
427
|
+
color: my.color,
|
|
428
|
+
index: 0,
|
|
429
|
+
length: countCodePoints(text),
|
|
430
|
+
});
|
|
431
|
+
return box;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/** `strut` spans claim line height without ink: `height` stands above the
|
|
435
|
+
* baseline plus `vertical-align` (negative = below). */
|
|
436
|
+
function strutBox(node: KatexNode, ctx: Ctx): LBox {
|
|
437
|
+
const size = pxEm(ctx);
|
|
438
|
+
const h = em(node.style?.height) * size;
|
|
439
|
+
const va = em(node.style?.verticalAlign) * size;
|
|
440
|
+
const box = emptyBox();
|
|
441
|
+
box.height = Math.max(0, h + va);
|
|
442
|
+
box.depth = Math.max(0, -va);
|
|
443
|
+
return box;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/** A border-bottom rule (`frac-line` and friends): an empty inline-block's
|
|
447
|
+
* baseline is its bottom edge, so the border fills `[-thickness, 0]`. */
|
|
448
|
+
function lineBox(node: KatexNode, ctx: Ctx): LBox {
|
|
449
|
+
const my = deriveCtx(ctx, node);
|
|
450
|
+
const size = pxEm(my);
|
|
451
|
+
const thickness = Math.max(
|
|
452
|
+
1,
|
|
453
|
+
(em(node.style?.borderBottomWidth) || node.height || 0.04) * size,
|
|
454
|
+
);
|
|
455
|
+
const box = emptyBox();
|
|
456
|
+
box.height = thickness;
|
|
457
|
+
box.stretch = true;
|
|
458
|
+
box.rules.push({
|
|
459
|
+
x: 0,
|
|
460
|
+
y: -thickness,
|
|
461
|
+
width: 0,
|
|
462
|
+
height: thickness,
|
|
463
|
+
color: my.color,
|
|
464
|
+
stretch: true,
|
|
465
|
+
});
|
|
466
|
+
return box;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/** `\rule[shift]{w}{h}` — a filled box lifted by `vertical-align`. */
|
|
470
|
+
function ruleBox(node: KatexNode, ctx: Ctx): LBox {
|
|
471
|
+
const my = deriveCtx(ctx, node);
|
|
472
|
+
const size = pxEm(my);
|
|
473
|
+
const w = em(node.style?.width) * size;
|
|
474
|
+
const h = em(node.style?.height) * size;
|
|
475
|
+
const shift = em(node.style?.verticalAlign) * size;
|
|
476
|
+
const box = emptyBox();
|
|
477
|
+
box.width = w;
|
|
478
|
+
box.height = Math.max(0, h + shift);
|
|
479
|
+
box.depth = Math.max(0, -shift);
|
|
480
|
+
box.rules.push({
|
|
481
|
+
x: 0,
|
|
482
|
+
y: -(h + shift),
|
|
483
|
+
width: w,
|
|
484
|
+
height: h,
|
|
485
|
+
color: my.color,
|
|
486
|
+
});
|
|
487
|
+
return box;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/**
|
|
491
|
+
* A vlist: rows stacked at exact baselines. `makeVList` writes each row's
|
|
492
|
+
* wrapper with `top: -pstrut - pos - depth`, so reading it back,
|
|
493
|
+
* `top + pstrut` is the row's baseline below the stack's. Rows come
|
|
494
|
+
* bottom-up in the DOM and are emitted top-down here (reading order).
|
|
495
|
+
*/
|
|
496
|
+
function vlistBox(node: KatexNode, ctx: Ctx): LBox {
|
|
497
|
+
const size = pxEm(ctx);
|
|
498
|
+
const rows: {
|
|
499
|
+
box: LBox;
|
|
500
|
+
dy: number;
|
|
501
|
+
ml: number;
|
|
502
|
+
mr: number;
|
|
503
|
+
align: Ctx['align'];
|
|
504
|
+
minWidth: number;
|
|
505
|
+
}[] = [];
|
|
506
|
+
const firstColumn = node.children?.[0]; // vlist-r
|
|
507
|
+
const list = firstColumn?.children?.find((c) => has(classesOf(c), 'vlist'));
|
|
508
|
+
for (const wrap of list?.children ?? []) {
|
|
509
|
+
const wclasses = classesOf(wrap);
|
|
510
|
+
if (has(wclasses, 'vlist-s')) continue;
|
|
511
|
+
const pstrut = wrap.children?.find((c) => has(classesOf(c), 'pstrut'));
|
|
512
|
+
const dy = (em(wrap.style?.top) + em(pstrut?.style?.height)) * size;
|
|
513
|
+
const wctx = deriveCtx(ctx, wrap);
|
|
514
|
+
const content: KatexNode = {
|
|
515
|
+
classes: [],
|
|
516
|
+
children: wrap.children?.filter((c) => !has(classesOf(c), 'pstrut')),
|
|
517
|
+
style: { paddingLeft: wrap.style?.paddingLeft },
|
|
518
|
+
};
|
|
519
|
+
const box = flowBox(content, wctx);
|
|
520
|
+
rows.push({
|
|
521
|
+
box,
|
|
522
|
+
dy,
|
|
523
|
+
ml: em(wrap.style?.marginLeft) * size,
|
|
524
|
+
mr: em(wrap.style?.marginRight) * size,
|
|
525
|
+
align: alignFrom(wclasses, wctx.align),
|
|
526
|
+
minWidth: em(wrap.style?.minWidth) * size,
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
let width = 0;
|
|
531
|
+
for (const row of rows) {
|
|
532
|
+
const natural = row.box.stretch
|
|
533
|
+
? Math.max(row.box.width, row.minWidth)
|
|
534
|
+
: row.ml + row.box.width + row.mr;
|
|
535
|
+
width = Math.max(width, natural);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
const out = emptyBox();
|
|
539
|
+
out.width = width;
|
|
540
|
+
out.height = (node.height ?? 0) * size;
|
|
541
|
+
out.depth = (node.depth ?? 0) * size;
|
|
542
|
+
// Emission order is reading order, and the DOM's row order is not it:
|
|
543
|
+
// `makeVList` stacks bottom-up for fractions and scripts but takes
|
|
544
|
+
// `individualShift` rows (arrays, aligned environments) top-down. The
|
|
545
|
+
// computed baseline is the one ordering that is right in every case —
|
|
546
|
+
// topmost row first. The sort is stable, so equal baselines keep DOM
|
|
547
|
+
// order.
|
|
548
|
+
const ordered = rows
|
|
549
|
+
.map((row, i) => ({ row, i }))
|
|
550
|
+
.sort((a, b) => a.row.dy - b.row.dy || a.i - b.i)
|
|
551
|
+
.map((e) => e.row);
|
|
552
|
+
for (const row of ordered) {
|
|
553
|
+
if (row.box.stretch) stretchBox(row.box, width - row.ml - row.mr);
|
|
554
|
+
const room = width - row.ml - row.mr - row.box.width;
|
|
555
|
+
const dx =
|
|
556
|
+
row.ml +
|
|
557
|
+
(row.align === 'center' ? room / 2 : row.align === 'right' ? room : 0);
|
|
558
|
+
mergeBox(out, row.box, dx, row.dy);
|
|
559
|
+
}
|
|
560
|
+
return out;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/** A span whose children include `<svg>` — surds and stretchy accents.
|
|
564
|
+
* The span's baseline is its bottom edge; the drawing may poke above the
|
|
565
|
+
* claimed height (a surd does, by design). */
|
|
566
|
+
function svgBox(node: KatexNode, ctx: Ctx): LBox {
|
|
567
|
+
const my = deriveCtx(ctx, node);
|
|
568
|
+
const size = pxEm(my);
|
|
569
|
+
const classes = classesOf(node);
|
|
570
|
+
const styleH = em(node.style?.height) * size;
|
|
571
|
+
const minW = em(node.style?.minWidth) * size;
|
|
572
|
+
const box = emptyBox();
|
|
573
|
+
box.width = minW;
|
|
574
|
+
box.height = (node.height ?? em(node.style?.height)) * size;
|
|
575
|
+
box.depth = (node.depth ?? 0) * size;
|
|
576
|
+
box.stretch = has(classes, 'hide-tail') || has(classes, 'katex-stretchy');
|
|
577
|
+
for (const svg of node.children ?? []) {
|
|
578
|
+
const viewBox = svg.attributes?.viewBox;
|
|
579
|
+
if (!viewBox) continue;
|
|
580
|
+
const parts = viewBox.split(/[\s,]+/).map(Number);
|
|
581
|
+
const viewWidth = parts[2] || 1;
|
|
582
|
+
const viewHeight = parts[3] || 1;
|
|
583
|
+
const aspect = svg.attributes?.preserveAspectRatio ?? '';
|
|
584
|
+
const mode: FormulaPath['mode'] = aspect.includes('slice')
|
|
585
|
+
? 'slice'
|
|
586
|
+
: aspect === 'none'
|
|
587
|
+
? 'none'
|
|
588
|
+
: 'fit';
|
|
589
|
+
const height = em(svg.attributes?.height) * size || styleH;
|
|
590
|
+
for (const child of svg.children ?? []) {
|
|
591
|
+
const d = pathDataOf(child);
|
|
592
|
+
if (!d) continue;
|
|
593
|
+
box.paths.push({
|
|
594
|
+
segs: parsePathData(d),
|
|
595
|
+
x: 0,
|
|
596
|
+
y: -(styleH || height),
|
|
597
|
+
width: minW,
|
|
598
|
+
height,
|
|
599
|
+
viewWidth,
|
|
600
|
+
viewHeight,
|
|
601
|
+
mode,
|
|
602
|
+
color: my.color,
|
|
603
|
+
stretch: box.stretch,
|
|
604
|
+
});
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
return box;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
function pathDataOf(node: KatexNode): string | null {
|
|
611
|
+
if (typeof node.pathName !== 'string') return null;
|
|
612
|
+
if (node.alternate) return node.alternate;
|
|
613
|
+
// The static path table is not exported, but every node serializes
|
|
614
|
+
// itself without a DOM.
|
|
615
|
+
const markup = node.toMarkup?.() ?? '';
|
|
616
|
+
const m = /\sd=['"]([^'"]+)['"]/.exec(markup);
|
|
617
|
+
return m ? m[1] : null;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
/**
|
|
621
|
+
* Inline flow: children left to right on a shared baseline, margins in
|
|
622
|
+
* their own em, `\\` starting a new line below. The height and depth are
|
|
623
|
+
* whatever the children (struts included) claim.
|
|
624
|
+
*/
|
|
625
|
+
function flowBox(node: KatexNode, ctx: Ctx): LBox {
|
|
626
|
+
const my = deriveCtx(ctx, node);
|
|
627
|
+
const size = pxEm(my);
|
|
628
|
+
|
|
629
|
+
// segment at newlines; almost every flow is a single segment
|
|
630
|
+
const segments: KatexNode[][] = [[]];
|
|
631
|
+
for (const child of node.children ?? []) {
|
|
632
|
+
if (has(classesOf(child), 'newline')) segments.push([]);
|
|
633
|
+
else segments[segments.length - 1].push(child);
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
const lines: LBox[] = segments.map((children) => {
|
|
637
|
+
const line = emptyBox();
|
|
638
|
+
let x = em(node.style?.paddingLeft) * size;
|
|
639
|
+
for (const child of children) {
|
|
640
|
+
const cctx = deriveCtx(my, child);
|
|
641
|
+
const csize = pxEm(cctx);
|
|
642
|
+
const cbox = layoutNode(child, cctx);
|
|
643
|
+
x += em(child.style?.marginLeft) * csize;
|
|
644
|
+
mergeBox(line, cbox, x, 0);
|
|
645
|
+
x += (cbox.advance ?? cbox.width) + em(child.style?.marginRight) * csize;
|
|
646
|
+
line.height = Math.max(line.height, cbox.height);
|
|
647
|
+
line.depth = Math.max(line.depth, cbox.depth);
|
|
648
|
+
if (cbox.stretch && children.length === 1) line.stretch = true;
|
|
649
|
+
}
|
|
650
|
+
line.width = Math.max(x, 0);
|
|
651
|
+
return line;
|
|
652
|
+
});
|
|
653
|
+
|
|
654
|
+
if (lines.length === 1) {
|
|
655
|
+
const line = lines[0];
|
|
656
|
+
if (node.style?.width) line.width = em(node.style.width) * size;
|
|
657
|
+
return line;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
// stacked lines: first line's baseline is the box's
|
|
661
|
+
const out = emptyBox();
|
|
662
|
+
let baseline = 0;
|
|
663
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
664
|
+
const line = lines[i];
|
|
665
|
+
if (i > 0) baseline += lines[i - 1].depth + line.height + 0.2 * size;
|
|
666
|
+
mergeBox(out, line, 0, baseline);
|
|
667
|
+
out.width = Math.max(out.width, line.width);
|
|
668
|
+
}
|
|
669
|
+
out.height = lines[0].height;
|
|
670
|
+
out.depth = baseline + lines[lines.length - 1].depth;
|
|
671
|
+
return out;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
// --- svg path data ----------------------------------------------------------
|
|
675
|
+
|
|
676
|
+
const PATH_TOKEN = /([MmLlHhVvCcSsQqTtAaZz])|(-?\d*\.?\d+(?:e[+-]?\d+)?)/g;
|
|
677
|
+
|
|
678
|
+
/**
|
|
679
|
+
* The subset of SVG path syntax KaTeX's geometry uses. Arcs never occur;
|
|
680
|
+
* if one ever does, it degrades to a line to its endpoint rather than
|
|
681
|
+
* throwing mid-paint.
|
|
682
|
+
*/
|
|
683
|
+
export function parsePathData(d: string): PathSeg[] {
|
|
684
|
+
const segs: PathSeg[] = [];
|
|
685
|
+
const tokens: (string | number)[] = [];
|
|
686
|
+
let m: RegExpExecArray | null;
|
|
687
|
+
while ((m = PATH_TOKEN.exec(d))) {
|
|
688
|
+
tokens.push(m[1] ?? Number(m[2]));
|
|
689
|
+
}
|
|
690
|
+
let i = 0;
|
|
691
|
+
let cmd = '';
|
|
692
|
+
let cx = 0;
|
|
693
|
+
let cy = 0;
|
|
694
|
+
let sx = 0;
|
|
695
|
+
let sy = 0;
|
|
696
|
+
let lastCtrlX = 0;
|
|
697
|
+
let lastCtrlY = 0;
|
|
698
|
+
let lastCmd = '';
|
|
699
|
+
const num = (): number => {
|
|
700
|
+
const t = tokens[i];
|
|
701
|
+
i += 1;
|
|
702
|
+
return typeof t === 'number' ? t : 0;
|
|
703
|
+
};
|
|
704
|
+
while (i < tokens.length) {
|
|
705
|
+
const t = tokens[i];
|
|
706
|
+
if (typeof t === 'string') {
|
|
707
|
+
cmd = t;
|
|
708
|
+
i += 1;
|
|
709
|
+
} else if (cmd === 'M') {
|
|
710
|
+
cmd = 'L'; // extra coordinate pairs after a moveto are linetos
|
|
711
|
+
} else if (cmd === 'm') {
|
|
712
|
+
cmd = 'l';
|
|
713
|
+
}
|
|
714
|
+
const rel = cmd === cmd.toLowerCase();
|
|
715
|
+
const upper = cmd.toUpperCase();
|
|
716
|
+
switch (upper) {
|
|
717
|
+
case 'M': {
|
|
718
|
+
const x = num() + (rel ? cx : 0);
|
|
719
|
+
const y = num() + (rel ? cy : 0);
|
|
720
|
+
cx = x;
|
|
721
|
+
cy = y;
|
|
722
|
+
sx = x;
|
|
723
|
+
sy = y;
|
|
724
|
+
segs.push({ c: 'M', x, y });
|
|
725
|
+
break;
|
|
726
|
+
}
|
|
727
|
+
case 'L': {
|
|
728
|
+
const x = num() + (rel ? cx : 0);
|
|
729
|
+
const y = num() + (rel ? cy : 0);
|
|
730
|
+
cx = x;
|
|
731
|
+
cy = y;
|
|
732
|
+
segs.push({ c: 'L', x, y });
|
|
733
|
+
break;
|
|
734
|
+
}
|
|
735
|
+
case 'H': {
|
|
736
|
+
const x = num() + (rel ? cx : 0);
|
|
737
|
+
cx = x;
|
|
738
|
+
segs.push({ c: 'L', x, y: cy });
|
|
739
|
+
break;
|
|
740
|
+
}
|
|
741
|
+
case 'V': {
|
|
742
|
+
const y = num() + (rel ? cy : 0);
|
|
743
|
+
cy = y;
|
|
744
|
+
segs.push({ c: 'L', x: cx, y });
|
|
745
|
+
break;
|
|
746
|
+
}
|
|
747
|
+
case 'C': {
|
|
748
|
+
const x1 = num() + (rel ? cx : 0);
|
|
749
|
+
const y1 = num() + (rel ? cy : 0);
|
|
750
|
+
const x2 = num() + (rel ? cx : 0);
|
|
751
|
+
const y2 = num() + (rel ? cy : 0);
|
|
752
|
+
const x = num() + (rel ? cx : 0);
|
|
753
|
+
const y = num() + (rel ? cy : 0);
|
|
754
|
+
segs.push({ c: 'C', x1, y1, x2, y2, x, y });
|
|
755
|
+
lastCtrlX = x2;
|
|
756
|
+
lastCtrlY = y2;
|
|
757
|
+
cx = x;
|
|
758
|
+
cy = y;
|
|
759
|
+
break;
|
|
760
|
+
}
|
|
761
|
+
case 'S': {
|
|
762
|
+
const reflects = lastCmd === 'C' || lastCmd === 'S';
|
|
763
|
+
const x1 = reflects ? 2 * cx - lastCtrlX : cx;
|
|
764
|
+
const y1 = reflects ? 2 * cy - lastCtrlY : cy;
|
|
765
|
+
const x2 = num() + (rel ? cx : 0);
|
|
766
|
+
const y2 = num() + (rel ? cy : 0);
|
|
767
|
+
const x = num() + (rel ? cx : 0);
|
|
768
|
+
const y = num() + (rel ? cy : 0);
|
|
769
|
+
segs.push({ c: 'C', x1, y1, x2, y2, x, y });
|
|
770
|
+
lastCtrlX = x2;
|
|
771
|
+
lastCtrlY = y2;
|
|
772
|
+
cx = x;
|
|
773
|
+
cy = y;
|
|
774
|
+
break;
|
|
775
|
+
}
|
|
776
|
+
case 'Q': {
|
|
777
|
+
const x1 = num() + (rel ? cx : 0);
|
|
778
|
+
const y1 = num() + (rel ? cy : 0);
|
|
779
|
+
const x = num() + (rel ? cx : 0);
|
|
780
|
+
const y = num() + (rel ? cy : 0);
|
|
781
|
+
segs.push({ c: 'Q', x1, y1, x, y });
|
|
782
|
+
lastCtrlX = x1;
|
|
783
|
+
lastCtrlY = y1;
|
|
784
|
+
cx = x;
|
|
785
|
+
cy = y;
|
|
786
|
+
break;
|
|
787
|
+
}
|
|
788
|
+
case 'T': {
|
|
789
|
+
const reflects = lastCmd === 'Q' || lastCmd === 'T';
|
|
790
|
+
const x1 = reflects ? 2 * cx - lastCtrlX : cx;
|
|
791
|
+
const y1 = reflects ? 2 * cy - lastCtrlY : cy;
|
|
792
|
+
const x = num() + (rel ? cx : 0);
|
|
793
|
+
const y = num() + (rel ? cy : 0);
|
|
794
|
+
segs.push({ c: 'Q', x1, y1, x, y });
|
|
795
|
+
lastCtrlX = x1;
|
|
796
|
+
lastCtrlY = y1;
|
|
797
|
+
cx = x;
|
|
798
|
+
cy = y;
|
|
799
|
+
break;
|
|
800
|
+
}
|
|
801
|
+
case 'A': {
|
|
802
|
+
num(); // rx
|
|
803
|
+
num(); // ry
|
|
804
|
+
num(); // rotation
|
|
805
|
+
num(); // large-arc
|
|
806
|
+
num(); // sweep
|
|
807
|
+
const x = num() + (rel ? cx : 0);
|
|
808
|
+
const y = num() + (rel ? cy : 0);
|
|
809
|
+
segs.push({ c: 'L', x, y });
|
|
810
|
+
cx = x;
|
|
811
|
+
cy = y;
|
|
812
|
+
break;
|
|
813
|
+
}
|
|
814
|
+
case 'Z': {
|
|
815
|
+
segs.push({ c: 'Z' });
|
|
816
|
+
cx = sx;
|
|
817
|
+
cy = sy;
|
|
818
|
+
break;
|
|
819
|
+
}
|
|
820
|
+
default:
|
|
821
|
+
i += 1; // unknown — skip the token and move on
|
|
822
|
+
}
|
|
823
|
+
lastCmd = upper;
|
|
824
|
+
}
|
|
825
|
+
return segs;
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
// --- entry ------------------------------------------------------------------
|
|
829
|
+
|
|
830
|
+
/**
|
|
831
|
+
* Lay a KaTeX dom tree out. `root` is what `__renderToDomTree` returned —
|
|
832
|
+
* the `.katex` span, or the `.katex-display` wrapper around it.
|
|
833
|
+
*/
|
|
834
|
+
export function layoutFormula(
|
|
835
|
+
root: KatexNode,
|
|
836
|
+
options: FormulaLayoutOptions,
|
|
837
|
+
): FormulaLayout {
|
|
838
|
+
const ctx: Ctx = {
|
|
839
|
+
base: options.em,
|
|
840
|
+
scale: 1,
|
|
841
|
+
color: options.color,
|
|
842
|
+
font: { family: 'KaTeX_Main', weight: 400, style: 'normal' },
|
|
843
|
+
align: 'left',
|
|
844
|
+
shaper: options.shaper,
|
|
845
|
+
};
|
|
846
|
+
const box = layoutNode(root, ctx);
|
|
847
|
+
|
|
848
|
+
// shift to a top-left origin
|
|
849
|
+
const ascent = Math.ceil(box.height);
|
|
850
|
+
const glyphs: FormulaGlyph[] = [];
|
|
851
|
+
let text = '';
|
|
852
|
+
let index = 0;
|
|
853
|
+
for (const g of box.glyphs) {
|
|
854
|
+
const length = g.length;
|
|
855
|
+
glyphs.push({
|
|
856
|
+
...g,
|
|
857
|
+
baseline: g.baseline + ascent,
|
|
858
|
+
top: g.top + ascent,
|
|
859
|
+
bottom: g.bottom + ascent,
|
|
860
|
+
index,
|
|
861
|
+
length,
|
|
862
|
+
});
|
|
863
|
+
text += g.text;
|
|
864
|
+
index += length;
|
|
865
|
+
}
|
|
866
|
+
return {
|
|
867
|
+
width: Math.ceil(box.width),
|
|
868
|
+
ascent,
|
|
869
|
+
descent: Math.ceil(box.depth),
|
|
870
|
+
baseline: ascent,
|
|
871
|
+
glyphs,
|
|
872
|
+
rules: box.rules.map((r) => ({ ...r, y: r.y + ascent })),
|
|
873
|
+
paths: box.paths.map((p) => ({ ...p, y: p.y + ascent })),
|
|
874
|
+
text,
|
|
875
|
+
};
|
|
876
|
+
}
|