@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,687 @@
|
|
|
1
|
+
// The graph model, as pure functions over the arrays the app owns.
|
|
2
|
+
//
|
|
3
|
+
// Nothing here touches a node, a context or the DOM-shaped world: it is the
|
|
4
|
+
// half of `<Flow>` that can be reasoned about — and tested — without an X
|
|
5
|
+
// server, which is most of the interesting arithmetic. `./node.ts` is the
|
|
6
|
+
// only caller that has state.
|
|
7
|
+
import * as ntk from 'react-x11/ntk';
|
|
8
|
+
import { tint } from 'react-x11/style';
|
|
9
|
+
|
|
10
|
+
import type {
|
|
11
|
+
BackgroundOptions,
|
|
12
|
+
Connection,
|
|
13
|
+
EdgeChange,
|
|
14
|
+
EdgeMarker,
|
|
15
|
+
FitViewOptions,
|
|
16
|
+
FlowEdge,
|
|
17
|
+
FlowNode,
|
|
18
|
+
FlowNodeData,
|
|
19
|
+
FlowNodeType,
|
|
20
|
+
FlowPalette,
|
|
21
|
+
FlowRect,
|
|
22
|
+
HandleAnchor,
|
|
23
|
+
HandlePosition,
|
|
24
|
+
HandleSpec,
|
|
25
|
+
MarkerType,
|
|
26
|
+
NodeChange,
|
|
27
|
+
TextOptions,
|
|
28
|
+
Viewport,
|
|
29
|
+
XYPosition,
|
|
30
|
+
} from './types.js';
|
|
31
|
+
|
|
32
|
+
// The built-in card's geometry. A node with no size is measured against
|
|
33
|
+
// these, and a node type that draws its own body still gets them unless it
|
|
34
|
+
// says otherwise — so a graph of mixed types lines up.
|
|
35
|
+
export const NODE_PAD_X = 14;
|
|
36
|
+
export const NODE_PAD_Y = 11;
|
|
37
|
+
export const NODE_LABEL_SIZE = 13;
|
|
38
|
+
export const NODE_DESC_SIZE = 11;
|
|
39
|
+
export const NODE_MIN_WIDTH = 110;
|
|
40
|
+
export const NODE_MAX_WIDTH = 260;
|
|
41
|
+
export const NODE_MIN_HEIGHT = 40;
|
|
42
|
+
/** Handle radius in graph units. */
|
|
43
|
+
export const HANDLE_RADIUS = 4.5;
|
|
44
|
+
/** Resize grip half-width, and how far outside one a press still grabs it. */
|
|
45
|
+
export const RESIZE_GRIP = 3.5;
|
|
46
|
+
export const RESIZE_SLOP = 4;
|
|
47
|
+
/** Floors for a resize, when the node names none. Small enough to be a
|
|
48
|
+
* badge, big enough that a node cannot be dragged out of existence. */
|
|
49
|
+
export const MIN_NODE_WIDTH = 48;
|
|
50
|
+
export const MIN_NODE_HEIGHT = 32;
|
|
51
|
+
/** The strip a `render` node keeps for its title and for dragging. */
|
|
52
|
+
export const NODE_HEADER = 26;
|
|
53
|
+
/** How far a `render` node's body is inset from its own border, so the
|
|
54
|
+
* resize grips and the border stay the pane's to hit. */
|
|
55
|
+
export const NODE_BODY_INSET = 5;
|
|
56
|
+
/** Below this the mounted body is not worth showing: it is laid out at its
|
|
57
|
+
* natural size, so a small box would show a corner of a form. */
|
|
58
|
+
export const RENDER_ZOOM = 0.6;
|
|
59
|
+
/** How far outside a handle a press still counts as grabbing it. */
|
|
60
|
+
export const HANDLE_SLOP = 5;
|
|
61
|
+
/** How far from an edge a press still counts as hitting it. */
|
|
62
|
+
export const EDGE_SLOP = 6;
|
|
63
|
+
/** How far a step/smoothstep edge leaves a node before it turns. */
|
|
64
|
+
export const EDGE_STEP_OFFSET = 18;
|
|
65
|
+
export const DEFAULT_MARKER_SIZE = 11;
|
|
66
|
+
|
|
67
|
+
export const DEFAULT_MIN_ZOOM = 0.2;
|
|
68
|
+
export const DEFAULT_MAX_ZOOM = 2.5;
|
|
69
|
+
export const ZOOM_STEP = 1.2;
|
|
70
|
+
|
|
71
|
+
// --- changes ---------------------------------------------------------------
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Fold position/select/remove/add/replace changes into a node array — the
|
|
75
|
+
* reducer half of the controlled contract, and the body of `useNodesState`.
|
|
76
|
+
*
|
|
77
|
+
* Returns the array it was given when nothing applied, so a `useMemo` or a
|
|
78
|
+
* `React.memo` above it is not defeated by an edit that changed nothing.
|
|
79
|
+
*/
|
|
80
|
+
export function applyNodeChanges<Data = FlowNodeData>(
|
|
81
|
+
changes: readonly NodeChange<Data>[],
|
|
82
|
+
nodes: readonly FlowNode<Data>[],
|
|
83
|
+
): FlowNode<Data>[] {
|
|
84
|
+
if (changes.length === 0) return nodes as FlowNode<Data>[];
|
|
85
|
+
const removed = new Set<string>();
|
|
86
|
+
const byId = new Map<string, FlowNode<Data>>();
|
|
87
|
+
for (const node of nodes) byId.set(node.id, node);
|
|
88
|
+
const added: { item: FlowNode<Data>; index?: number }[] = [];
|
|
89
|
+
let touched = false;
|
|
90
|
+
|
|
91
|
+
for (const change of changes) {
|
|
92
|
+
if (change.type === 'add') {
|
|
93
|
+
added.push({ item: change.item, index: change.index });
|
|
94
|
+
touched = true;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (change.type === 'remove') {
|
|
98
|
+
if (byId.has(change.id)) {
|
|
99
|
+
removed.add(change.id);
|
|
100
|
+
touched = true;
|
|
101
|
+
}
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const current = byId.get(change.id);
|
|
105
|
+
if (!current) continue;
|
|
106
|
+
if (change.type === 'replace') {
|
|
107
|
+
byId.set(change.id, change.item);
|
|
108
|
+
touched = true;
|
|
109
|
+
} else if (change.type === 'select') {
|
|
110
|
+
if ((current.selected ?? false) === change.selected) continue;
|
|
111
|
+
byId.set(change.id, { ...current, selected: change.selected });
|
|
112
|
+
touched = true;
|
|
113
|
+
} else if (change.type === 'dimensions') {
|
|
114
|
+
const { width, height } = change.dimensions;
|
|
115
|
+
if (current.width === width && current.height === height) continue;
|
|
116
|
+
byId.set(change.id, { ...current, width, height });
|
|
117
|
+
touched = true;
|
|
118
|
+
} else if (change.position) {
|
|
119
|
+
const { x, y } = change.position;
|
|
120
|
+
if (current.position.x === x && current.position.y === y) continue;
|
|
121
|
+
byId.set(change.id, { ...current, position: { x, y } });
|
|
122
|
+
touched = true;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (!touched) return nodes as FlowNode<Data>[];
|
|
126
|
+
|
|
127
|
+
const next: FlowNode<Data>[] = [];
|
|
128
|
+
for (const node of nodes) {
|
|
129
|
+
if (removed.has(node.id)) continue;
|
|
130
|
+
next.push(byId.get(node.id) ?? node);
|
|
131
|
+
}
|
|
132
|
+
for (const { item, index } of added) {
|
|
133
|
+
if (index === undefined || index >= next.length) next.push(item);
|
|
134
|
+
else next.splice(Math.max(0, index), 0, item);
|
|
135
|
+
}
|
|
136
|
+
return next;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** {@link applyNodeChanges} for edges. Removing a node does *not* remove its
|
|
140
|
+
* edges — that is the app's call, and `removeConnectedEdges` is the helper. */
|
|
141
|
+
export function applyEdgeChanges<Data = unknown>(
|
|
142
|
+
changes: readonly EdgeChange<Data>[],
|
|
143
|
+
edges: readonly FlowEdge<Data>[],
|
|
144
|
+
): FlowEdge<Data>[] {
|
|
145
|
+
if (changes.length === 0) return edges as FlowEdge<Data>[];
|
|
146
|
+
const removed = new Set<string>();
|
|
147
|
+
const byId = new Map<string, FlowEdge<Data>>();
|
|
148
|
+
for (const edge of edges) byId.set(edge.id, edge);
|
|
149
|
+
const added: { item: FlowEdge<Data>; index?: number }[] = [];
|
|
150
|
+
let touched = false;
|
|
151
|
+
|
|
152
|
+
for (const change of changes) {
|
|
153
|
+
if (change.type === 'add') {
|
|
154
|
+
added.push({ item: change.item, index: change.index });
|
|
155
|
+
touched = true;
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if (change.type === 'remove') {
|
|
159
|
+
if (byId.has(change.id)) {
|
|
160
|
+
removed.add(change.id);
|
|
161
|
+
touched = true;
|
|
162
|
+
}
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
const current = byId.get(change.id);
|
|
166
|
+
if (!current) continue;
|
|
167
|
+
if (change.type === 'replace') {
|
|
168
|
+
byId.set(change.id, change.item);
|
|
169
|
+
touched = true;
|
|
170
|
+
} else if ((current.selected ?? false) !== change.selected) {
|
|
171
|
+
byId.set(change.id, { ...current, selected: change.selected });
|
|
172
|
+
touched = true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (!touched) return edges as FlowEdge<Data>[];
|
|
176
|
+
|
|
177
|
+
const next: FlowEdge<Data>[] = [];
|
|
178
|
+
for (const edge of edges) {
|
|
179
|
+
if (removed.has(edge.id)) continue;
|
|
180
|
+
next.push(byId.get(edge.id) ?? edge);
|
|
181
|
+
}
|
|
182
|
+
for (const { item, index } of added) {
|
|
183
|
+
if (index === undefined || index >= next.length) next.push(item);
|
|
184
|
+
else next.splice(Math.max(0, index), 0, item);
|
|
185
|
+
}
|
|
186
|
+
return next;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** The id `addEdge` gives a connection it turned into an edge. Derived from
|
|
190
|
+
* the endpoints so that connecting the same two handles twice is idempotent
|
|
191
|
+
* rather than a duplicate nobody can tell apart. */
|
|
192
|
+
export function connectionId(connection: Connection): string {
|
|
193
|
+
const from = `${connection.source}${connection.sourceHandle ? `:${connection.sourceHandle}` : ''}`;
|
|
194
|
+
const to = `${connection.target}${connection.targetHandle ? `:${connection.targetHandle}` : ''}`;
|
|
195
|
+
return `edge__${from}->${to}`;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Add the edge a connection describes, unless it is already there. Takes an
|
|
200
|
+
* edge as well as a `Connection`, so `addEdge({ ...connection, animated:
|
|
201
|
+
* true }, edges)` reads the way it does in react-flow.
|
|
202
|
+
*/
|
|
203
|
+
export function addEdge<Data = unknown>(
|
|
204
|
+
connection: Connection | (Partial<FlowEdge<Data>> & Connection),
|
|
205
|
+
edges: readonly FlowEdge<Data>[],
|
|
206
|
+
): FlowEdge<Data>[] {
|
|
207
|
+
const { source, target } = connection;
|
|
208
|
+
if (!source || !target) return edges as FlowEdge<Data>[];
|
|
209
|
+
const sourceHandle = connection.sourceHandle ?? null;
|
|
210
|
+
const targetHandle = connection.targetHandle ?? null;
|
|
211
|
+
const exists = edges.some(
|
|
212
|
+
(e) =>
|
|
213
|
+
e.source === source &&
|
|
214
|
+
e.target === target &&
|
|
215
|
+
(e.sourceHandle ?? null) === sourceHandle &&
|
|
216
|
+
(e.targetHandle ?? null) === targetHandle,
|
|
217
|
+
);
|
|
218
|
+
if (exists) return edges as FlowEdge<Data>[];
|
|
219
|
+
const extras = connection as Partial<FlowEdge<Data>>;
|
|
220
|
+
const edge = {
|
|
221
|
+
...extras,
|
|
222
|
+
id:
|
|
223
|
+
extras.id ?? connectionId({ source, target, sourceHandle, targetHandle }),
|
|
224
|
+
source,
|
|
225
|
+
target,
|
|
226
|
+
sourceHandle,
|
|
227
|
+
targetHandle,
|
|
228
|
+
} as FlowEdge<Data>;
|
|
229
|
+
return [...edges, edge];
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** Every edge with an end on one of these nodes — what a delete usually
|
|
233
|
+
* wants to take with it. */
|
|
234
|
+
export function connectedEdges<Data = unknown>(
|
|
235
|
+
ids: readonly string[],
|
|
236
|
+
edges: readonly FlowEdge<Data>[],
|
|
237
|
+
): FlowEdge<Data>[] {
|
|
238
|
+
const set = new Set(ids);
|
|
239
|
+
return edges.filter((e) => set.has(e.source) || set.has(e.target));
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// --- geometry --------------------------------------------------------------
|
|
243
|
+
|
|
244
|
+
export function snapTo(value: number, grid: number): number {
|
|
245
|
+
return grid > 0 ? Math.round(value / grid) * grid : value;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/** Which way an edge leaves a side. */
|
|
249
|
+
export function handleDirection(position: HandlePosition): XYPosition {
|
|
250
|
+
switch (position) {
|
|
251
|
+
case 'top':
|
|
252
|
+
return { x: 0, y: -1 };
|
|
253
|
+
case 'bottom':
|
|
254
|
+
return { x: 0, y: 1 };
|
|
255
|
+
case 'left':
|
|
256
|
+
return { x: -1, y: 0 };
|
|
257
|
+
default:
|
|
258
|
+
return { x: 1, y: 0 };
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/** The handles a node carries: its own, else its type's, else the pair every
|
|
263
|
+
* node has — a target in and a source out. */
|
|
264
|
+
export function resolveHandles<Data>(
|
|
265
|
+
node: FlowNode<Data>,
|
|
266
|
+
type: FlowNodeType<Data> | undefined,
|
|
267
|
+
): readonly HandleSpec[] {
|
|
268
|
+
if (node.handles) return node.handles;
|
|
269
|
+
const fromType =
|
|
270
|
+
typeof type?.handles === 'function' ? type.handles(node) : type?.handles;
|
|
271
|
+
if (fromType) return fromType;
|
|
272
|
+
return [
|
|
273
|
+
{ type: 'target', position: node.targetPosition ?? 'top' },
|
|
274
|
+
{ type: 'source', position: node.sourcePosition ?? 'bottom' },
|
|
275
|
+
];
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/** Place a handle on a node's box. Graph space, and the centre of the dot. */
|
|
279
|
+
export function handleAnchor(
|
|
280
|
+
nodeId: string,
|
|
281
|
+
rect: FlowRect,
|
|
282
|
+
spec: HandleSpec,
|
|
283
|
+
): HandleAnchor {
|
|
284
|
+
const t = spec.offset ?? 0.5;
|
|
285
|
+
switch (spec.position) {
|
|
286
|
+
case 'top':
|
|
287
|
+
return { ...spec, nodeId, x: rect.x + rect.width * t, y: rect.y };
|
|
288
|
+
case 'bottom':
|
|
289
|
+
return {
|
|
290
|
+
...spec,
|
|
291
|
+
nodeId,
|
|
292
|
+
x: rect.x + rect.width * t,
|
|
293
|
+
y: rect.y + rect.height,
|
|
294
|
+
};
|
|
295
|
+
case 'left':
|
|
296
|
+
return { ...spec, nodeId, x: rect.x, y: rect.y + rect.height * t };
|
|
297
|
+
default:
|
|
298
|
+
return {
|
|
299
|
+
...spec,
|
|
300
|
+
nodeId,
|
|
301
|
+
x: rect.x + rect.width,
|
|
302
|
+
y: rect.y + rect.height * t,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* How big a node is when it does not say. The label decides the width, one
|
|
309
|
+
* or two lines decide the height, and both are clamped — an unbounded label
|
|
310
|
+
* would otherwise turn one long string into a node wider than the pane.
|
|
311
|
+
*/
|
|
312
|
+
export function measureNode<Data>(
|
|
313
|
+
node: FlowNode<Data>,
|
|
314
|
+
type: FlowNodeType<Data> | undefined,
|
|
315
|
+
measure: (text: string, options?: TextOptions) => number,
|
|
316
|
+
): { width: number; height: number } {
|
|
317
|
+
if (node.width != null && node.height != null) {
|
|
318
|
+
return { width: node.width, height: node.height };
|
|
319
|
+
}
|
|
320
|
+
let width: number;
|
|
321
|
+
let height: number;
|
|
322
|
+
const size =
|
|
323
|
+
typeof type?.size === 'function' ? type.size(node, measure) : type?.size;
|
|
324
|
+
if (size) {
|
|
325
|
+
width = size.width;
|
|
326
|
+
height = size.height;
|
|
327
|
+
} else {
|
|
328
|
+
const data = node.data as FlowNodeData | undefined;
|
|
329
|
+
const label = data?.label ?? node.id;
|
|
330
|
+
const description = data?.description;
|
|
331
|
+
const labelW = measure(label, { size: NODE_LABEL_SIZE, weight: 'bold' });
|
|
332
|
+
const descW = description
|
|
333
|
+
? measure(description, { size: NODE_DESC_SIZE })
|
|
334
|
+
: 0;
|
|
335
|
+
width = Math.max(
|
|
336
|
+
NODE_MIN_WIDTH,
|
|
337
|
+
Math.min(
|
|
338
|
+
NODE_MAX_WIDTH,
|
|
339
|
+
Math.ceil(Math.max(labelW, descW)) + NODE_PAD_X * 2,
|
|
340
|
+
),
|
|
341
|
+
);
|
|
342
|
+
height = Math.max(
|
|
343
|
+
NODE_MIN_HEIGHT,
|
|
344
|
+
NODE_PAD_Y * 2 +
|
|
345
|
+
Math.round(NODE_LABEL_SIZE * 1.3) +
|
|
346
|
+
(description ? Math.round(NODE_DESC_SIZE * 1.5) : 0),
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
return { width: node.width ?? width, height: node.height ?? height };
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/** The box around a set of rects, or null when there are none. */
|
|
353
|
+
export function boundsOf(rects: readonly FlowRect[]): FlowRect | null {
|
|
354
|
+
if (rects.length === 0) return null;
|
|
355
|
+
let minX = Infinity;
|
|
356
|
+
let minY = Infinity;
|
|
357
|
+
let maxX = -Infinity;
|
|
358
|
+
let maxY = -Infinity;
|
|
359
|
+
for (const r of rects) {
|
|
360
|
+
if (r.x < minX) minX = r.x;
|
|
361
|
+
if (r.y < minY) minY = r.y;
|
|
362
|
+
if (r.x + r.width > maxX) maxX = r.x + r.width;
|
|
363
|
+
if (r.y + r.height > maxY) maxY = r.y + r.height;
|
|
364
|
+
}
|
|
365
|
+
return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/** The box around two boxes. */
|
|
369
|
+
export function unionRects(a: FlowRect, b: FlowRect): FlowRect {
|
|
370
|
+
const x = Math.min(a.x, b.x);
|
|
371
|
+
const y = Math.min(a.y, b.y);
|
|
372
|
+
return {
|
|
373
|
+
x,
|
|
374
|
+
y,
|
|
375
|
+
width: Math.max(a.x + a.width, b.x + b.width) - x,
|
|
376
|
+
height: Math.max(a.y + a.height, b.y + b.height) - y,
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/** A box grown by `m` on every side; negative shrinks. */
|
|
381
|
+
export function inflateRect(r: FlowRect, m: number): FlowRect {
|
|
382
|
+
return {
|
|
383
|
+
x: r.x - m,
|
|
384
|
+
y: r.y - m,
|
|
385
|
+
width: r.width + m * 2,
|
|
386
|
+
height: r.height + m * 2,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/** The overlap of two boxes, or null when they have none. */
|
|
391
|
+
export function intersectRects(a: FlowRect, b: FlowRect): FlowRect | null {
|
|
392
|
+
const x = Math.max(a.x, b.x);
|
|
393
|
+
const y = Math.max(a.y, b.y);
|
|
394
|
+
const right = Math.min(a.x + a.width, b.x + b.width);
|
|
395
|
+
const bottom = Math.min(a.y + a.height, b.y + b.height);
|
|
396
|
+
if (right <= x || bottom <= y) return null;
|
|
397
|
+
return { x, y, width: right - x, height: bottom - y };
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
export function rectsOverlap(a: FlowRect, b: FlowRect): boolean {
|
|
401
|
+
return (
|
|
402
|
+
a.x < b.x + b.width &&
|
|
403
|
+
a.x + a.width > b.x &&
|
|
404
|
+
a.y < b.y + b.height &&
|
|
405
|
+
a.y + a.height > b.y
|
|
406
|
+
);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
export function rectContains(r: FlowRect, p: XYPosition): boolean {
|
|
410
|
+
return (
|
|
411
|
+
p.x >= r.x && p.x <= r.x + r.width && p.y >= r.y && p.y <= r.y + r.height
|
|
412
|
+
);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
export function clamp(value: number, lo: number, hi: number): number {
|
|
416
|
+
return value < lo ? lo : value > hi ? hi : value;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* The viewport that frames `bounds` inside a pane of `size`. Zoom first —
|
|
421
|
+
* the smaller of the two axis ratios, so nothing is cut — then translate so
|
|
422
|
+
* the scaled bounds land centred.
|
|
423
|
+
*/
|
|
424
|
+
export function fitViewport(
|
|
425
|
+
bounds: FlowRect,
|
|
426
|
+
size: { width: number; height: number },
|
|
427
|
+
options: FitViewOptions = {},
|
|
428
|
+
limits: { minZoom: number; maxZoom: number },
|
|
429
|
+
): Viewport {
|
|
430
|
+
const padding = options.padding ?? 0.1;
|
|
431
|
+
const minZoom = options.minZoom ?? limits.minZoom;
|
|
432
|
+
const maxZoom = options.maxZoom ?? limits.maxZoom;
|
|
433
|
+
const usableW = Math.max(1, size.width * (1 - padding * 2));
|
|
434
|
+
const usableH = Math.max(1, size.height * (1 - padding * 2));
|
|
435
|
+
const zoom = clamp(
|
|
436
|
+
Math.min(
|
|
437
|
+
usableW / Math.max(1, bounds.width),
|
|
438
|
+
usableH / Math.max(1, bounds.height),
|
|
439
|
+
),
|
|
440
|
+
minZoom,
|
|
441
|
+
maxZoom,
|
|
442
|
+
);
|
|
443
|
+
return {
|
|
444
|
+
zoom,
|
|
445
|
+
x: size.width / 2 - (bounds.x + bounds.width / 2) * zoom,
|
|
446
|
+
y: size.height / 2 - (bounds.y + bounds.height / 2) * zoom,
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/** The eight grips on a node's border, as unit directions. */
|
|
451
|
+
export const RESIZE_DIRECTIONS: readonly XYPosition[] = [
|
|
452
|
+
{ x: -1, y: -1 },
|
|
453
|
+
{ x: 0, y: -1 },
|
|
454
|
+
{ x: 1, y: -1 },
|
|
455
|
+
{ x: 1, y: 0 },
|
|
456
|
+
{ x: 1, y: 1 },
|
|
457
|
+
{ x: 0, y: 1 },
|
|
458
|
+
{ x: -1, y: 1 },
|
|
459
|
+
{ x: -1, y: 0 },
|
|
460
|
+
];
|
|
461
|
+
|
|
462
|
+
/** Where a grip sits on a box. */
|
|
463
|
+
export function gripPoint(rect: FlowRect, dir: XYPosition): XYPosition {
|
|
464
|
+
return {
|
|
465
|
+
x: rect.x + (rect.width * (dir.x + 1)) / 2,
|
|
466
|
+
y: rect.y + (rect.height * (dir.y + 1)) / 2,
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Drag one grip and get the box it makes. The edges the grip does not own
|
|
472
|
+
* stay exactly where they were — which is what makes a resize from the
|
|
473
|
+
* top-left move the node's origin and one from the bottom-right not.
|
|
474
|
+
*
|
|
475
|
+
* Clamped to the minimum by moving the dragged edge back, never by moving
|
|
476
|
+
* the opposite one: a node held at its floor must not creep across the
|
|
477
|
+
* canvas while the pointer keeps going.
|
|
478
|
+
*/
|
|
479
|
+
export function resizeRect(
|
|
480
|
+
origin: FlowRect,
|
|
481
|
+
dir: XYPosition,
|
|
482
|
+
dx: number,
|
|
483
|
+
dy: number,
|
|
484
|
+
limits: { minWidth: number; minHeight: number },
|
|
485
|
+
snap?: (value: number, axis: 0 | 1) => number,
|
|
486
|
+
): FlowRect {
|
|
487
|
+
let { x, y, width, height } = origin;
|
|
488
|
+
if (dir.x < 0) {
|
|
489
|
+
const right = origin.x + origin.width;
|
|
490
|
+
x = snap ? snap(origin.x + dx, 0) : origin.x + dx;
|
|
491
|
+
x = Math.min(x, right - limits.minWidth);
|
|
492
|
+
width = right - x;
|
|
493
|
+
} else if (dir.x > 0) {
|
|
494
|
+
const edge = snap
|
|
495
|
+
? snap(origin.x + origin.width + dx, 0)
|
|
496
|
+
: origin.x + origin.width + dx;
|
|
497
|
+
width = Math.max(limits.minWidth, edge - origin.x);
|
|
498
|
+
}
|
|
499
|
+
if (dir.y < 0) {
|
|
500
|
+
const bottom = origin.y + origin.height;
|
|
501
|
+
y = snap ? snap(origin.y + dy, 1) : origin.y + dy;
|
|
502
|
+
y = Math.min(y, bottom - limits.minHeight);
|
|
503
|
+
height = bottom - y;
|
|
504
|
+
} else if (dir.y > 0) {
|
|
505
|
+
const edge = snap
|
|
506
|
+
? snap(origin.y + origin.height + dy, 1)
|
|
507
|
+
: origin.y + origin.height + dy;
|
|
508
|
+
height = Math.max(limits.minHeight, edge - origin.y);
|
|
509
|
+
}
|
|
510
|
+
return { x, y, width, height };
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// --- connections -----------------------------------------------------------
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* Can these two handles be joined? A source only meets a target in
|
|
517
|
+
* `'strict'` mode; `'loose'` asks only that the two ends are different
|
|
518
|
+
* nodes, for graphs whose handles are not typed.
|
|
519
|
+
*/
|
|
520
|
+
export function canConnect(
|
|
521
|
+
from: { nodeId: string; type: 'source' | 'target' },
|
|
522
|
+
to: { nodeId: string; type: 'source' | 'target' },
|
|
523
|
+
mode: 'strict' | 'loose',
|
|
524
|
+
): boolean {
|
|
525
|
+
if (from.nodeId === to.nodeId) return false;
|
|
526
|
+
if (mode === 'loose') return true;
|
|
527
|
+
return from.type !== to.type;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
/** Orient a finished gesture into a `Connection`: whichever end is the
|
|
531
|
+
* source becomes `source`, whichever way round the user dragged. */
|
|
532
|
+
export function orientConnection(
|
|
533
|
+
from: { nodeId: string; handleId: string | null; type: 'source' | 'target' },
|
|
534
|
+
to: { nodeId: string; handleId: string | null; type: 'source' | 'target' },
|
|
535
|
+
): Connection {
|
|
536
|
+
const forward = from.type !== 'target';
|
|
537
|
+
const s = forward ? from : to;
|
|
538
|
+
const t = forward ? to : from;
|
|
539
|
+
return {
|
|
540
|
+
source: s.nodeId,
|
|
541
|
+
sourceHandle: s.handleId,
|
|
542
|
+
target: t.nodeId,
|
|
543
|
+
targetHandle: t.handleId,
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
// --- colours ---------------------------------------------------------------
|
|
548
|
+
|
|
549
|
+
/**
|
|
550
|
+
* `[r, g, b, a]`, 0-1, unassociated. ntk's parser is reached through
|
|
551
|
+
* react-x11's re-export rather than a second `ntk` dependency, and read off
|
|
552
|
+
* the namespace rather than declared through `declare module` — an
|
|
553
|
+
* augmentation would be emitted into this package's own `.d.ts` and then
|
|
554
|
+
* seen twice by a program holding both `src/` and `dist/`. `src/calendar/`
|
|
555
|
+
* has the same three paragraphs for the same reason.
|
|
556
|
+
*
|
|
557
|
+
* Only `lightness` needs it now: the `tint` that used to sit beside it is
|
|
558
|
+
* `react-x11/style`'s, and every surface here imports it from there.
|
|
559
|
+
*/
|
|
560
|
+
type StraightColor = [number, number, number, number];
|
|
561
|
+
|
|
562
|
+
const cssColorStraight = (
|
|
563
|
+
ntk as unknown as {
|
|
564
|
+
cssColorStraight?: (color: string) => StraightColor | null;
|
|
565
|
+
}
|
|
566
|
+
).cssColorStraight;
|
|
567
|
+
|
|
568
|
+
/** Perceived lightness, 0-1, or null for a colour that would not parse. Only
|
|
569
|
+
* used to pick between two hard-coded fallbacks, never to compute one. */
|
|
570
|
+
export function lightness(color: string | undefined): number | null {
|
|
571
|
+
if (!color) return null;
|
|
572
|
+
const c = cssColorStraight?.(color);
|
|
573
|
+
if (!c) return null;
|
|
574
|
+
return 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2];
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
const LIGHT_PALETTE: FlowPalette = {
|
|
578
|
+
background: '#f4f5f7',
|
|
579
|
+
grid: '#d3d7de',
|
|
580
|
+
text: '#1c2024',
|
|
581
|
+
dim: '#697280',
|
|
582
|
+
nodeBackground: '#ffffff',
|
|
583
|
+
nodeBorder: '#c6cad2',
|
|
584
|
+
accent: '#2f6feb',
|
|
585
|
+
edge: '#8b93a1',
|
|
586
|
+
edgeSelected: '#2f6feb',
|
|
587
|
+
handle: '#8b93a1',
|
|
588
|
+
surface: '#ffffff',
|
|
589
|
+
surfaceBorder: '#c6cad2',
|
|
590
|
+
selection: 'rgba(47, 111, 235, 0.14)',
|
|
591
|
+
};
|
|
592
|
+
|
|
593
|
+
const DARK_PALETTE: FlowPalette = {
|
|
594
|
+
background: '#1a1c20',
|
|
595
|
+
grid: '#2e3238',
|
|
596
|
+
text: '#e6e8ec',
|
|
597
|
+
dim: '#9aa1ad',
|
|
598
|
+
nodeBackground: '#23262c',
|
|
599
|
+
nodeBorder: '#3a3f47',
|
|
600
|
+
accent: '#5b8cff',
|
|
601
|
+
edge: '#6d7482',
|
|
602
|
+
edgeSelected: '#5b8cff',
|
|
603
|
+
handle: '#8891a0',
|
|
604
|
+
surface: '#23262c',
|
|
605
|
+
surfaceBorder: '#3a3f47',
|
|
606
|
+
selection: 'rgba(91, 140, 255, 0.18)',
|
|
607
|
+
};
|
|
608
|
+
|
|
609
|
+
function themeString(
|
|
610
|
+
theme: Record<string, unknown> | null,
|
|
611
|
+
token: string,
|
|
612
|
+
): string | undefined {
|
|
613
|
+
const v = theme?.[token];
|
|
614
|
+
return typeof v === 'string' ? v : undefined;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
/**
|
|
618
|
+
* The pane's colours: the desktop palette where it has an opinion, a
|
|
619
|
+
* hard-coded scheme where it does not, and the app's `palette` prop over
|
|
620
|
+
* both.
|
|
621
|
+
*
|
|
622
|
+
* Every token is taken by its own name. A node is `surface` and the pane is
|
|
623
|
+
* `background` — "the ground" and "what is raised off it", which is exactly
|
|
624
|
+
* the distinction core's palette draws, and the reason a card on a dark
|
|
625
|
+
* desktop is a card you can see.
|
|
626
|
+
*/
|
|
627
|
+
export function resolvePalette(
|
|
628
|
+
theme: Record<string, unknown> | null,
|
|
629
|
+
overrides?: Partial<FlowPalette>,
|
|
630
|
+
): FlowPalette {
|
|
631
|
+
const base =
|
|
632
|
+
(lightness(themeString(theme, 'background')) ?? 1) < 0.5
|
|
633
|
+
? DARK_PALETTE
|
|
634
|
+
: LIGHT_PALETTE;
|
|
635
|
+
const accent = themeString(theme, 'accent') ?? base.accent;
|
|
636
|
+
// `textMuted`, not `dim`: core renamed it (react-x11#290) and a stale read
|
|
637
|
+
// here would not fail — it would fall through to the hard-coded scheme and
|
|
638
|
+
// quietly stop following the desktop.
|
|
639
|
+
const muted = themeString(theme, 'textMuted');
|
|
640
|
+
const surface = themeString(theme, 'surface');
|
|
641
|
+
const border = themeString(theme, 'border');
|
|
642
|
+
const palette: FlowPalette = {
|
|
643
|
+
background: themeString(theme, 'background') ?? base.background,
|
|
644
|
+
grid: border ?? base.grid,
|
|
645
|
+
text: themeString(theme, 'text') ?? base.text,
|
|
646
|
+
dim: muted ?? base.dim,
|
|
647
|
+
nodeBackground: surface ?? base.nodeBackground,
|
|
648
|
+
nodeBorder: border ?? base.nodeBorder,
|
|
649
|
+
accent,
|
|
650
|
+
edge: muted ?? base.edge,
|
|
651
|
+
edgeSelected: accent,
|
|
652
|
+
handle: muted ?? base.handle,
|
|
653
|
+
surface: surface ?? base.surface,
|
|
654
|
+
surfaceBorder: border ?? base.surfaceBorder,
|
|
655
|
+
selection: tint(accent, 0.16),
|
|
656
|
+
};
|
|
657
|
+
return overrides ? { ...palette, ...overrides } : palette;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
// --- prop normalisation ----------------------------------------------------
|
|
661
|
+
|
|
662
|
+
export function normalizeBackground(
|
|
663
|
+
value: BackgroundOptions | string | boolean | undefined,
|
|
664
|
+
): Required<Omit<BackgroundOptions, 'color'>> & { color?: string } {
|
|
665
|
+
const opts: BackgroundOptions =
|
|
666
|
+
typeof value === 'string'
|
|
667
|
+
? { variant: value as BackgroundOptions['variant'] }
|
|
668
|
+
: value === false
|
|
669
|
+
? { variant: 'none' }
|
|
670
|
+
: typeof value === 'object' && value !== null
|
|
671
|
+
? value
|
|
672
|
+
: {};
|
|
673
|
+
return {
|
|
674
|
+
variant: opts.variant ?? 'dots',
|
|
675
|
+
gap: opts.gap ?? 20,
|
|
676
|
+
size: opts.size ?? 1,
|
|
677
|
+
color: opts.color,
|
|
678
|
+
};
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
export function normalizeMarker(
|
|
682
|
+
marker: MarkerType | EdgeMarker | null | undefined,
|
|
683
|
+
): EdgeMarker | null {
|
|
684
|
+
if (marker == null) return null;
|
|
685
|
+
if (typeof marker === 'string') return { type: marker };
|
|
686
|
+
return marker;
|
|
687
|
+
}
|