@react-x11/components 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +979 -21
- package/dist/ansi/cast.d.ts +48 -0
- package/dist/ansi/cast.d.ts.map +1 -0
- package/dist/ansi/cast.js +135 -0
- package/dist/ansi/cast.js.map +1 -0
- package/dist/ansi/index.d.ts +10 -0
- package/dist/ansi/index.d.ts.map +1 -0
- package/dist/ansi/index.js +27 -0
- package/dist/ansi/index.js.map +1 -0
- package/dist/ansi/palette.d.ts +79 -0
- package/dist/ansi/palette.d.ts.map +1 -0
- package/dist/ansi/palette.js +155 -0
- package/dist/ansi/palette.js.map +1 -0
- package/dist/ansi/parse.d.ts +114 -0
- package/dist/ansi/parse.d.ts.map +1 -0
- package/dist/ansi/parse.js +687 -0
- package/dist/ansi/parse.js.map +1 -0
- package/dist/ansi/sgr.d.ts +87 -0
- package/dist/ansi/sgr.d.ts.map +1 -0
- package/dist/ansi/sgr.js +302 -0
- package/dist/ansi/sgr.js.map +1 -0
- package/dist/ansi/utf8.d.ts +15 -0
- package/dist/ansi/utf8.d.ts.map +1 -0
- package/dist/ansi/utf8.js +82 -0
- package/dist/ansi/utf8.js.map +1 -0
- package/dist/calendar/Calendar.d.ts +136 -0
- package/dist/calendar/Calendar.d.ts.map +1 -0
- package/dist/calendar/Calendar.js +460 -0
- package/dist/calendar/Calendar.js.map +1 -0
- package/dist/calendar/DatePicker.d.ts +52 -0
- package/dist/calendar/DatePicker.d.ts.map +1 -0
- package/dist/calendar/DatePicker.js +257 -0
- package/dist/calendar/DatePicker.js.map +1 -0
- package/dist/calendar/dates.d.ts +90 -0
- package/dist/calendar/dates.d.ts.map +1 -0
- package/dist/calendar/dates.js +236 -0
- package/dist/calendar/dates.js.map +1 -0
- package/dist/calendar/index.d.ts +8 -0
- package/dist/calendar/index.d.ts.map +1 -0
- package/dist/calendar/index.js +15 -0
- package/dist/calendar/index.js.map +1 -0
- package/dist/charts/components.d.ts +141 -0
- package/dist/charts/components.d.ts.map +1 -0
- package/dist/charts/components.js +580 -0
- package/dist/charts/components.js.map +1 -0
- package/dist/charts/data.d.ts +198 -0
- package/dist/charts/data.d.ts.map +1 -0
- package/dist/charts/data.js +616 -0
- package/dist/charts/data.js.map +1 -0
- package/dist/charts/hx.d.ts +21 -0
- package/dist/charts/hx.d.ts.map +1 -0
- package/dist/charts/hx.js +15 -0
- package/dist/charts/hx.js.map +1 -0
- package/dist/charts/index.d.ts +27 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +38 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/charts/node.d.ts +96 -0
- package/dist/charts/node.d.ts.map +1 -0
- package/dist/charts/node.js +720 -0
- package/dist/charts/node.js.map +1 -0
- package/dist/charts/render.d.ts +153 -0
- package/dist/charts/render.d.ts.map +1 -0
- package/dist/charts/render.js +762 -0
- package/dist/charts/render.js.map +1 -0
- package/dist/charts/scale.d.ts +42 -0
- package/dist/charts/scale.d.ts.map +1 -0
- package/dist/charts/scale.js +173 -0
- package/dist/charts/scale.js.map +1 -0
- package/dist/charts/spec.d.ts +91 -0
- package/dist/charts/spec.d.ts.map +1 -0
- package/dist/charts/spec.js +33 -0
- package/dist/charts/spec.js.map +1 -0
- package/dist/charts/timers.d.ts +6 -0
- package/dist/charts/timers.d.ts.map +1 -0
- package/dist/charts/timers.js +14 -0
- package/dist/charts/timers.js.map +1 -0
- package/dist/code/hx.d.ts +24 -0
- package/dist/code/hx.d.ts.map +1 -0
- package/dist/code/hx.js +25 -0
- package/dist/code/hx.js.map +1 -0
- package/dist/code/index.d.ts +45 -0
- package/dist/code/index.d.ts.map +1 -0
- package/dist/code/index.js +93 -0
- package/dist/code/index.js.map +1 -0
- package/dist/code-editor/completion.d.ts +26 -0
- package/dist/code-editor/completion.d.ts.map +1 -0
- package/dist/code-editor/completion.js +129 -0
- package/dist/code-editor/completion.js.map +1 -0
- package/dist/code-editor/doc.d.ts +35 -0
- package/dist/code-editor/doc.d.ts.map +1 -0
- package/dist/code-editor/doc.js +162 -0
- package/dist/code-editor/doc.js.map +1 -0
- package/dist/code-editor/hx.d.ts +13 -0
- package/dist/code-editor/hx.d.ts.map +1 -0
- package/dist/code-editor/hx.js +10 -0
- package/dist/code-editor/hx.js.map +1 -0
- package/dist/code-editor/index.d.ts +88 -0
- package/dist/code-editor/index.d.ts.map +1 -0
- package/dist/code-editor/index.js +401 -0
- package/dist/code-editor/index.js.map +1 -0
- package/dist/code-editor/node.d.ts +343 -0
- package/dist/code-editor/node.d.ts.map +1 -0
- package/dist/code-editor/node.js +1521 -0
- package/dist/code-editor/node.js.map +1 -0
- package/dist/code-language/hljs.d.ts +47 -0
- package/dist/code-language/hljs.d.ts.map +1 -0
- package/dist/code-language/hljs.js +211 -0
- package/dist/code-language/hljs.js.map +1 -0
- package/dist/code-language/index.d.ts +22 -0
- package/dist/code-language/index.d.ts.map +1 -0
- package/dist/code-language/index.js +20 -0
- package/dist/code-language/index.js.map +1 -0
- package/dist/code-language/languages/glsl.d.ts +4 -0
- package/dist/code-language/languages/glsl.d.ts.map +1 -0
- package/dist/code-language/languages/glsl.js +99 -0
- package/dist/code-language/languages/glsl.js.map +1 -0
- package/dist/code-language/languages/javascript.d.ts +10 -0
- package/dist/code-language/languages/javascript.d.ts.map +1 -0
- package/dist/code-language/languages/javascript.js +360 -0
- package/dist/code-language/languages/javascript.js.map +1 -0
- package/dist/code-language/languages/json.d.ts +4 -0
- package/dist/code-language/languages/json.d.ts.map +1 -0
- package/dist/code-language/languages/json.js +68 -0
- package/dist/code-language/languages/json.js.map +1 -0
- package/dist/code-language/languages/shell.d.ts +4 -0
- package/dist/code-language/languages/shell.d.ts.map +1 -0
- package/dist/code-language/languages/shell.js +189 -0
- package/dist/code-language/languages/shell.js.map +1 -0
- package/dist/code-language/languages/sql.d.ts +11 -0
- package/dist/code-language/languages/sql.d.ts.map +1 -0
- package/dist/code-language/languages/sql.js +133 -0
- package/dist/code-language/languages/sql.js.map +1 -0
- package/dist/code-language/lezer.d.ts +24 -0
- package/dist/code-language/lezer.d.ts.map +1 -0
- package/dist/code-language/lezer.js +148 -0
- package/dist/code-language/lezer.js.map +1 -0
- package/dist/code-language/registry.d.ts +19 -0
- package/dist/code-language/registry.d.ts.map +1 -0
- package/dist/code-language/registry.js +56 -0
- package/dist/code-language/registry.js.map +1 -0
- package/dist/code-language/runs.d.ts +35 -0
- package/dist/code-language/runs.d.ts.map +1 -0
- package/dist/code-language/runs.js +88 -0
- package/dist/code-language/runs.js.map +1 -0
- package/dist/code-language/stream.d.ts +70 -0
- package/dist/code-language/stream.d.ts.map +1 -0
- package/dist/code-language/stream.js +243 -0
- package/dist/code-language/stream.js.map +1 -0
- package/dist/code-language/textmate.d.ts +27 -0
- package/dist/code-language/textmate.d.ts.map +1 -0
- package/dist/code-language/textmate.js +86 -0
- package/dist/code-language/textmate.js.map +1 -0
- package/dist/code-language/theme.d.ts +26 -0
- package/dist/code-language/theme.d.ts.map +1 -0
- package/dist/code-language/theme.js +108 -0
- package/dist/code-language/theme.js.map +1 -0
- package/dist/code-language/timers.d.ts +7 -0
- package/dist/code-language/timers.d.ts.map +1 -0
- package/dist/code-language/timers.js +22 -0
- package/dist/code-language/timers.js.map +1 -0
- package/dist/code-language/types.d.ts +173 -0
- package/dist/code-language/types.d.ts.map +1 -0
- package/dist/code-language/types.js +41 -0
- package/dist/code-language/types.js.map +1 -0
- package/dist/codeblock/index.d.ts +69 -0
- package/dist/codeblock/index.d.ts.map +1 -0
- package/dist/codeblock/index.js +85 -0
- package/dist/codeblock/index.js.map +1 -0
- package/dist/color-picker/ColorField.d.ts +39 -0
- package/dist/color-picker/ColorField.d.ts.map +1 -0
- package/dist/color-picker/ColorField.js +239 -0
- package/dist/color-picker/ColorField.js.map +1 -0
- package/dist/color-picker/ColorPicker.d.ts +109 -0
- package/dist/color-picker/ColorPicker.d.ts.map +1 -0
- package/dist/color-picker/ColorPicker.js +757 -0
- package/dist/color-picker/ColorPicker.js.map +1 -0
- package/dist/color-picker/color.d.ts +105 -0
- package/dist/color-picker/color.d.ts.map +1 -0
- package/dist/color-picker/color.js +313 -0
- package/dist/color-picker/color.js.map +1 -0
- package/dist/color-picker/index.d.ts +8 -0
- package/dist/color-picker/index.d.ts.map +1 -0
- package/dist/color-picker/index.js +19 -0
- package/dist/color-picker/index.js.map +1 -0
- package/dist/desktop-calendar/eds.d.ts +102 -0
- package/dist/desktop-calendar/eds.d.ts.map +1 -0
- package/dist/desktop-calendar/eds.js +356 -0
- package/dist/desktop-calendar/eds.js.map +1 -0
- package/dist/desktop-calendar/ical.d.ts +63 -0
- package/dist/desktop-calendar/ical.d.ts.map +1 -0
- package/dist/desktop-calendar/ical.js +57 -0
- package/dist/desktop-calendar/ical.js.map +1 -0
- package/dist/desktop-calendar/index.d.ts +72 -0
- package/dist/desktop-calendar/index.d.ts.map +1 -0
- package/dist/desktop-calendar/index.js +213 -0
- package/dist/desktop-calendar/index.js.map +1 -0
- package/dist/embed/client.d.ts +121 -0
- package/dist/embed/client.d.ts.map +1 -0
- package/dist/embed/client.js +203 -0
- package/dist/embed/client.js.map +1 -0
- package/dist/embed/host.d.ts +96 -0
- package/dist/embed/host.d.ts.map +1 -0
- package/dist/embed/host.js +266 -0
- package/dist/embed/host.js.map +1 -0
- package/dist/embed/index.d.ts +5 -0
- package/dist/embed/index.d.ts.map +1 -0
- package/dist/embed/index.js +13 -0
- package/dist/embed/index.js.map +1 -0
- package/dist/embed/timers.d.ts +6 -0
- package/dist/embed/timers.d.ts.map +1 -0
- package/dist/embed/timers.js +16 -0
- package/dist/embed/timers.js.map +1 -0
- package/dist/flow/draw.d.ts +45 -0
- package/dist/flow/draw.d.ts.map +1 -0
- package/dist/flow/draw.js +295 -0
- package/dist/flow/draw.js.map +1 -0
- package/dist/flow/index.d.ts +64 -0
- package/dist/flow/index.d.ts.map +1 -0
- package/dist/flow/index.js +306 -0
- package/dist/flow/index.js.map +1 -0
- package/dist/flow/model.d.ts +158 -0
- package/dist/flow/model.d.ts.map +1 -0
- package/dist/flow/model.js +566 -0
- package/dist/flow/model.js.map +1 -0
- package/dist/flow/node.d.ts +429 -0
- package/dist/flow/node.d.ts.map +1 -0
- package/dist/flow/node.js +3025 -0
- package/dist/flow/node.js.map +1 -0
- package/dist/flow/paths.d.ts +43 -0
- package/dist/flow/paths.d.ts.map +1 -0
- package/dist/flow/paths.js +327 -0
- package/dist/flow/paths.js.map +1 -0
- package/dist/flow/types.d.ts +561 -0
- package/dist/flow/types.d.ts.map +1 -0
- package/dist/flow/types.js +2 -0
- package/dist/flow/types.js.map +1 -0
- package/dist/formula/hx.d.ts +24 -0
- package/dist/formula/hx.d.ts.map +1 -0
- package/dist/formula/hx.js +25 -0
- package/dist/formula/hx.js.map +1 -0
- package/dist/formula/index.d.ts +74 -0
- package/dist/formula/index.d.ts.map +1 -0
- package/dist/formula/index.js +155 -0
- package/dist/formula/index.js.map +1 -0
- package/dist/formula/katex.d.ts +78 -0
- package/dist/formula/katex.d.ts.map +1 -0
- package/dist/formula/katex.js +130 -0
- package/dist/formula/katex.js.map +1 -0
- package/dist/formula/layout.d.ts +103 -0
- package/dist/formula/layout.d.ts.map +1 -0
- package/dist/formula/layout.js +716 -0
- package/dist/formula/layout.js.map +1 -0
- package/dist/formula/node.d.ts +50 -0
- package/dist/formula/node.d.ts.map +1 -0
- package/dist/formula/node.js +351 -0
- package/dist/formula/node.js.map +1 -0
- package/dist/html/controls.d.ts +48 -0
- package/dist/html/controls.d.ts.map +1 -0
- package/dist/html/controls.js +195 -0
- package/dist/html/controls.js.map +1 -0
- package/dist/html/css/cascade.d.ts +51 -0
- package/dist/html/css/cascade.d.ts.map +1 -0
- package/dist/html/css/cascade.js +552 -0
- package/dist/html/css/cascade.js.map +1 -0
- package/dist/html/css/parse.d.ts +74 -0
- package/dist/html/css/parse.d.ts.map +1 -0
- package/dist/html/css/parse.js +464 -0
- package/dist/html/css/parse.js.map +1 -0
- package/dist/html/css/style.d.ts +142 -0
- package/dist/html/css/style.d.ts.map +1 -0
- package/dist/html/css/style.js +1145 -0
- package/dist/html/css/style.js.map +1 -0
- package/dist/html/css/ua.d.ts +5 -0
- package/dist/html/css/ua.d.ts.map +1 -0
- package/dist/html/css/ua.js +171 -0
- package/dist/html/css/ua.js.map +1 -0
- package/dist/html/css/values.d.ts +78 -0
- package/dist/html/css/values.d.ts.map +1 -0
- package/dist/html/css/values.js +330 -0
- package/dist/html/css/values.js.map +1 -0
- package/dist/html/dom.d.ts +112 -0
- package/dist/html/dom.d.ts.map +1 -0
- package/dist/html/dom.js +374 -0
- package/dist/html/dom.js.map +1 -0
- package/dist/html/hx.d.ts +24 -0
- package/dist/html/hx.d.ts.map +1 -0
- package/dist/html/hx.js +29 -0
- package/dist/html/hx.js.map +1 -0
- package/dist/html/index.d.ts +137 -0
- package/dist/html/index.d.ts.map +1 -0
- package/dist/html/index.js +339 -0
- package/dist/html/index.js.map +1 -0
- package/dist/html/layout/block.d.ts +58 -0
- package/dist/html/layout/block.d.ts.map +1 -0
- package/dist/html/layout/block.js +724 -0
- package/dist/html/layout/block.js.map +1 -0
- package/dist/html/layout/boxes.d.ts +261 -0
- package/dist/html/layout/boxes.d.ts.map +1 -0
- package/dist/html/layout/boxes.js +725 -0
- package/dist/html/layout/boxes.js.map +1 -0
- package/dist/html/layout/flex.d.ts +16 -0
- package/dist/html/layout/flex.d.ts.map +1 -0
- package/dist/html/layout/flex.js +242 -0
- package/dist/html/layout/flex.js.map +1 -0
- package/dist/html/layout/floats.d.ts +50 -0
- package/dist/html/layout/floats.d.ts.map +1 -0
- package/dist/html/layout/floats.js +110 -0
- package/dist/html/layout/floats.js.map +1 -0
- package/dist/html/layout/inline.d.ts +44 -0
- package/dist/html/layout/inline.d.ts.map +1 -0
- package/dist/html/layout/inline.js +700 -0
- package/dist/html/layout/inline.js.map +1 -0
- package/dist/html/layout/table.d.ts +5 -0
- package/dist/html/layout/table.d.ts.map +1 -0
- package/dist/html/layout/table.js +340 -0
- package/dist/html/layout/table.js.map +1 -0
- package/dist/html/node.d.ts +149 -0
- package/dist/html/node.d.ts.map +1 -0
- package/dist/html/node.js +861 -0
- package/dist/html/node.js.map +1 -0
- package/dist/html/paint.d.ts +48 -0
- package/dist/html/paint.d.ts.map +1 -0
- package/dist/html/paint.js +495 -0
- package/dist/html/paint.js.map +1 -0
- package/dist/html/resources.d.ts +48 -0
- package/dist/html/resources.d.ts.map +1 -0
- package/dist/html/resources.js +156 -0
- package/dist/html/resources.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/heights.d.ts +81 -0
- package/dist/internal/heights.d.ts.map +1 -0
- package/dist/internal/heights.js +193 -0
- package/dist/internal/heights.js.map +1 -0
- package/dist/internal/hx.d.ts +24 -0
- package/dist/internal/hx.d.ts.map +1 -0
- package/dist/internal/hx.js +27 -0
- package/dist/internal/hx.js.map +1 -0
- package/dist/internal/text.d.ts +6 -0
- package/dist/internal/text.d.ts.map +1 -0
- package/dist/internal/text.js +44 -0
- package/dist/internal/text.js.map +1 -0
- package/dist/internal/timers.d.ts +8 -0
- package/dist/internal/timers.d.ts.map +1 -0
- package/dist/internal/timers.js +22 -0
- package/dist/internal/timers.js.map +1 -0
- package/dist/internal/widget.d.ts +40 -0
- package/dist/internal/widget.d.ts.map +1 -0
- package/dist/internal/widget.js +44 -0
- package/dist/internal/widget.js.map +1 -0
- package/dist/markdown/ast.d.ts +126 -0
- package/dist/markdown/ast.d.ts.map +1 -0
- package/dist/markdown/ast.js +8 -0
- package/dist/markdown/ast.js.map +1 -0
- package/dist/markdown/hx.d.ts +24 -0
- package/dist/markdown/hx.d.ts.map +1 -0
- package/dist/markdown/hx.js +25 -0
- package/dist/markdown/hx.js.map +1 -0
- package/dist/markdown/index.d.ts +90 -0
- package/dist/markdown/index.d.ts.map +1 -0
- package/dist/markdown/index.js +413 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/markdown/parse.d.ts +8 -0
- package/dist/markdown/parse.d.ts.map +1 -0
- package/dist/markdown/parse.js +911 -0
- package/dist/markdown/parse.js.map +1 -0
- package/dist/markdown/spans.d.ts +20 -0
- package/dist/markdown/spans.d.ts.map +1 -0
- package/dist/markdown/spans.js +96 -0
- package/dist/markdown/spans.js.map +1 -0
- package/dist/media-player/backends.d.ts +64 -0
- package/dist/media-player/backends.d.ts.map +1 -0
- package/dist/media-player/backends.js +110 -0
- package/dist/media-player/backends.js.map +1 -0
- package/dist/media-player/control.d.ts +40 -0
- package/dist/media-player/control.d.ts.map +1 -0
- package/dist/media-player/control.js +44 -0
- package/dist/media-player/control.js.map +1 -0
- package/dist/media-player/hx.d.ts +24 -0
- package/dist/media-player/hx.d.ts.map +1 -0
- package/dist/media-player/hx.js +25 -0
- package/dist/media-player/hx.js.map +1 -0
- package/dist/media-player/index.d.ts +107 -0
- package/dist/media-player/index.d.ts.map +1 -0
- package/dist/media-player/index.js +219 -0
- package/dist/media-player/index.js.map +1 -0
- package/dist/media-player/mpv.d.ts +4 -0
- package/dist/media-player/mpv.d.ts.map +1 -0
- package/dist/media-player/mpv.js +120 -0
- package/dist/media-player/mpv.js.map +1 -0
- package/dist/media-player/vlc.d.ts +8 -0
- package/dist/media-player/vlc.d.ts.map +1 -0
- package/dist/media-player/vlc.js +83 -0
- package/dist/media-player/vlc.js.map +1 -0
- package/dist/richtext/index.d.ts +19 -0
- package/dist/richtext/index.d.ts.map +1 -0
- package/dist/richtext/index.js +4 -0
- package/dist/richtext/index.js.map +1 -0
- package/dist/richtext/links.d.ts +12 -0
- package/dist/richtext/links.d.ts.map +1 -0
- package/dist/richtext/links.js +64 -0
- package/dist/richtext/links.js.map +1 -0
- package/dist/richtext/menu.d.ts +11 -0
- package/dist/richtext/menu.d.ts.map +1 -0
- package/dist/richtext/menu.js +43 -0
- package/dist/richtext/menu.js.map +1 -0
- package/dist/richtext/node.d.ts +151 -0
- package/dist/richtext/node.d.ts.map +1 -0
- package/dist/richtext/node.js +255 -0
- package/dist/richtext/node.js.map +1 -0
- package/dist/richtext/runs.d.ts +92 -0
- package/dist/richtext/runs.d.ts.map +1 -0
- package/dist/richtext/runs.js +158 -0
- package/dist/richtext/runs.js.map +1 -0
- package/dist/table/hx.d.ts +24 -0
- package/dist/table/hx.d.ts.map +1 -0
- package/dist/table/hx.js +25 -0
- package/dist/table/hx.js.map +1 -0
- package/dist/table/index.d.ts +169 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/table/index.js +844 -0
- package/dist/table/index.js.map +1 -0
- package/dist/table/rows.d.ts +136 -0
- package/dist/table/rows.d.ts.map +1 -0
- package/dist/table/rows.js +146 -0
- package/dist/table/rows.js.map +1 -0
- package/dist/terminal/backends.d.ts +105 -0
- package/dist/terminal/backends.d.ts.map +1 -0
- package/dist/terminal/backends.js +185 -0
- package/dist/terminal/backends.js.map +1 -0
- package/dist/terminal/hx.d.ts +24 -0
- package/dist/terminal/hx.d.ts.map +1 -0
- package/dist/terminal/hx.js +25 -0
- package/dist/terminal/hx.js.map +1 -0
- package/dist/terminal/index.d.ts +160 -0
- package/dist/terminal/index.d.ts.map +1 -0
- package/dist/terminal/index.js +344 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/terminal/title.d.ts +24 -0
- package/dist/terminal/title.d.ts.map +1 -0
- package/dist/terminal/title.js +129 -0
- package/dist/terminal/title.js.map +1 -0
- package/dist/terminal/vt/colors.d.ts +63 -0
- package/dist/terminal/vt/colors.d.ts.map +1 -0
- package/dist/terminal/vt/colors.js +203 -0
- package/dist/terminal/vt/colors.js.map +1 -0
- package/dist/terminal/vt/diff.d.ts +117 -0
- package/dist/terminal/vt/diff.d.ts.map +1 -0
- package/dist/terminal/vt/diff.js +358 -0
- package/dist/terminal/vt/diff.js.map +1 -0
- package/dist/terminal/vt/fonts.d.ts +92 -0
- package/dist/terminal/vt/fonts.d.ts.map +1 -0
- package/dist/terminal/vt/fonts.js +178 -0
- package/dist/terminal/vt/fonts.js.map +1 -0
- package/dist/terminal/vt/index.d.ts +78 -0
- package/dist/terminal/vt/index.d.ts.map +1 -0
- package/dist/terminal/vt/index.js +312 -0
- package/dist/terminal/vt/index.js.map +1 -0
- package/dist/terminal/vt/keys.d.ts +74 -0
- package/dist/terminal/vt/keys.d.ts.map +1 -0
- package/dist/terminal/vt/keys.js +309 -0
- package/dist/terminal/vt/keys.js.map +1 -0
- package/dist/terminal/vt/mouse.d.ts +44 -0
- package/dist/terminal/vt/mouse.d.ts.map +1 -0
- package/dist/terminal/vt/mouse.js +106 -0
- package/dist/terminal/vt/mouse.js.map +1 -0
- package/dist/terminal/vt/node.d.ts +246 -0
- package/dist/terminal/vt/node.d.ts.map +1 -0
- package/dist/terminal/vt/node.js +1068 -0
- package/dist/terminal/vt/node.js.map +1 -0
- package/dist/terminal/vt/pty.d.ts +81 -0
- package/dist/terminal/vt/pty.d.ts.map +1 -0
- package/dist/terminal/vt/pty.js +201 -0
- package/dist/terminal/vt/pty.js.map +1 -0
- package/dist/terminal/vt/renderer.d.ts +179 -0
- package/dist/terminal/vt/renderer.d.ts.map +1 -0
- package/dist/terminal/vt/renderer.js +357 -0
- package/dist/terminal/vt/renderer.js.map +1 -0
- package/dist/terminal/vt/timers.d.ts +6 -0
- package/dist/terminal/vt/timers.d.ts.map +1 -0
- package/dist/terminal/vt/timers.js +16 -0
- package/dist/terminal/vt/timers.js.map +1 -0
- package/dist/terminal/vt/xterm.d.ts +142 -0
- package/dist/terminal/vt/xterm.d.ts.map +1 -0
- package/dist/terminal/vt/xterm.js +32 -0
- package/dist/terminal/vt/xterm.js.map +1 -0
- package/dist/terminal-output/hx.d.ts +24 -0
- package/dist/terminal-output/hx.d.ts.map +1 -0
- package/dist/terminal-output/hx.js +25 -0
- package/dist/terminal-output/hx.js.map +1 -0
- package/dist/terminal-output/index.d.ts +92 -0
- package/dist/terminal-output/index.d.ts.map +1 -0
- package/dist/terminal-output/index.js +179 -0
- package/dist/terminal-output/index.js.map +1 -0
- package/dist/terminal-output/runs.d.ts +27 -0
- package/dist/terminal-output/runs.d.ts.map +1 -0
- package/dist/terminal-output/runs.js +66 -0
- package/dist/terminal-output/runs.js.map +1 -0
- package/dist/three/canvas.d.ts +46 -0
- package/dist/three/canvas.d.ts.map +1 -0
- package/dist/three/canvas.js +305 -0
- package/dist/three/canvas.js.map +1 -0
- package/dist/three/events.d.ts +64 -0
- package/dist/three/events.d.ts.map +1 -0
- package/dist/three/events.js +146 -0
- package/dist/three/events.js.map +1 -0
- package/dist/three/geometries.d.ts +89 -0
- package/dist/three/geometries.d.ts.map +1 -0
- package/dist/three/geometries.js +345 -0
- package/dist/three/geometries.js.map +1 -0
- package/dist/three/globals.d.ts +7 -0
- package/dist/three/globals.d.ts.map +1 -0
- package/dist/three/globals.js +20 -0
- package/dist/three/globals.js.map +1 -0
- package/dist/three/hx.d.ts +9 -0
- package/dist/three/hx.d.ts.map +1 -0
- package/dist/three/hx.js +10 -0
- package/dist/three/hx.js.map +1 -0
- package/dist/three/index.d.ts +22 -0
- package/dist/three/index.d.ts.map +1 -0
- package/dist/three/index.js +24 -0
- package/dist/three/index.js.map +1 -0
- package/dist/three/jsx-dev-runtime.d.ts +19 -0
- package/dist/three/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/three/jsx-dev-runtime.js +2 -0
- package/dist/three/jsx-dev-runtime.js.map +1 -0
- package/dist/three/jsx-runtime.d.ts +19 -0
- package/dist/three/jsx-runtime.d.ts.map +1 -0
- package/dist/three/jsx-runtime.js +2 -0
- package/dist/three/jsx-runtime.js.map +1 -0
- package/dist/three/jsx.d.ts +198 -0
- package/dist/three/jsx.d.ts.map +1 -0
- package/dist/three/jsx.js +2 -0
- package/dist/three/jsx.js.map +1 -0
- package/dist/three/materials.d.ts +125 -0
- package/dist/three/materials.d.ts.map +1 -0
- package/dist/three/materials.js +229 -0
- package/dist/three/materials.js.map +1 -0
- package/dist/three/math.d.ts +146 -0
- package/dist/three/math.d.ts.map +1 -0
- package/dist/three/math.js +464 -0
- package/dist/three/math.js.map +1 -0
- package/dist/three/objects.d.ts +185 -0
- package/dist/three/objects.d.ts.map +1 -0
- package/dist/three/objects.js +309 -0
- package/dist/three/objects.js.map +1 -0
- package/dist/three/passes.d.ts +54 -0
- package/dist/three/passes.d.ts.map +1 -0
- package/dist/three/passes.js +78 -0
- package/dist/three/passes.js.map +1 -0
- package/dist/three/postprocess.d.ts +85 -0
- package/dist/three/postprocess.d.ts.map +1 -0
- package/dist/three/postprocess.js +503 -0
- package/dist/three/postprocess.js.map +1 -0
- package/dist/three/raycast.d.ts +24 -0
- package/dist/three/raycast.d.ts.map +1 -0
- package/dist/three/raycast.js +138 -0
- package/dist/three/raycast.js.map +1 -0
- package/dist/three/reconciler.d.ts +48 -0
- package/dist/three/reconciler.d.ts.map +1 -0
- package/dist/three/reconciler.js +416 -0
- package/dist/three/reconciler.js.map +1 -0
- package/dist/three/renderer-direct.d.ts +102 -0
- package/dist/three/renderer-direct.d.ts.map +1 -0
- package/dist/three/renderer-direct.js +782 -0
- package/dist/three/renderer-direct.js.map +1 -0
- package/dist/three/renderer-indirect.d.ts +68 -0
- package/dist/three/renderer-indirect.d.ts.map +1 -0
- package/dist/three/renderer-indirect.js +438 -0
- package/dist/three/renderer-indirect.js.map +1 -0
- package/dist/three/store.d.ts +81 -0
- package/dist/three/store.d.ts.map +1 -0
- package/dist/three/store.js +110 -0
- package/dist/three/store.js.map +1 -0
- package/dist/timeline/hx.d.ts +18 -0
- package/dist/timeline/hx.d.ts.map +1 -0
- package/dist/timeline/hx.js +10 -0
- package/dist/timeline/hx.js.map +1 -0
- package/dist/timeline/index.d.ts +152 -0
- package/dist/timeline/index.d.ts.map +1 -0
- package/dist/timeline/index.js +383 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/tray-host/hx.d.ts +24 -0
- package/dist/tray-host/hx.d.ts.map +1 -0
- package/dist/tray-host/hx.js +25 -0
- package/dist/tray-host/hx.js.map +1 -0
- package/dist/tray-host/index.d.ts +110 -0
- package/dist/tray-host/index.d.ts.map +1 -0
- package/dist/tray-host/index.js +191 -0
- package/dist/tray-host/index.js.map +1 -0
- package/dist/tray-host/manager.d.ts +137 -0
- package/dist/tray-host/manager.d.ts.map +1 -0
- package/dist/tray-host/manager.js +462 -0
- package/dist/tray-host/manager.js.map +1 -0
- package/dist/tray-host/notify.d.ts +22 -0
- package/dist/tray-host/notify.d.ts.map +1 -0
- package/dist/tray-host/notify.js +74 -0
- package/dist/tray-host/notify.js.map +1 -0
- package/dist/tray-host/protocol.d.ts +106 -0
- package/dist/tray-host/protocol.d.ts.map +1 -0
- package/dist/tray-host/protocol.js +191 -0
- package/dist/tray-host/protocol.js.map +1 -0
- package/dist/tree/hx.d.ts +24 -0
- package/dist/tree/hx.d.ts.map +1 -0
- package/dist/tree/hx.js +25 -0
- package/dist/tree/hx.js.map +1 -0
- package/dist/tree/index.d.ts +221 -0
- package/dist/tree/index.d.ts.map +1 -0
- package/dist/tree/index.js +716 -0
- package/dist/tree/index.js.map +1 -0
- package/dist/tree/internal.d.ts +18 -0
- package/dist/tree/internal.d.ts.map +1 -0
- package/dist/tree/internal.js +66 -0
- package/dist/tree/internal.js.map +1 -0
- package/dist/tree/rows.d.ts +177 -0
- package/dist/tree/rows.d.ts.map +1 -0
- package/dist/tree/rows.js +179 -0
- package/dist/tree/rows.js.map +1 -0
- package/package.json +166 -12
- package/src/ansi/cast.ts +159 -0
- package/src/ansi/index.ts +53 -0
- package/src/ansi/palette.ts +226 -0
- package/src/ansi/parse.ts +780 -0
- package/src/ansi/sgr.ts +380 -0
- package/src/ansi/utf8.ts +84 -0
- package/src/calendar/Calendar.ts +744 -0
- package/src/calendar/DatePicker.ts +368 -0
- package/src/calendar/dates.ts +307 -0
- package/src/calendar/index.ts +51 -0
- package/src/charts/components.ts +864 -0
- package/src/charts/data.ts +776 -0
- package/src/charts/hx.ts +39 -0
- package/src/charts/index.ts +99 -0
- package/src/charts/node.ts +932 -0
- package/src/charts/render.ts +982 -0
- package/src/charts/scale.ts +214 -0
- package/src/charts/spec.ts +122 -0
- package/src/charts/timers.ts +24 -0
- package/src/code/hx.ts +51 -0
- package/src/code/index.ts +174 -0
- package/src/code-editor/completion.ts +161 -0
- package/src/code-editor/doc.ts +198 -0
- package/src/code-editor/hx.ts +26 -0
- package/src/code-editor/index.ts +615 -0
- package/src/code-editor/node.ts +1926 -0
- package/src/code-language/hljs.ts +302 -0
- package/src/code-language/index.ts +51 -0
- package/src/code-language/languages/glsl.ts +120 -0
- package/src/code-language/languages/javascript.ts +419 -0
- package/src/code-language/languages/json.ts +72 -0
- package/src/code-language/languages/shell.ts +221 -0
- package/src/code-language/languages/sql.ts +165 -0
- package/src/code-language/lezer.ts +190 -0
- package/src/code-language/registry.ts +66 -0
- package/src/code-language/runs.ts +128 -0
- package/src/code-language/stream.ts +306 -0
- package/src/code-language/textmate.ts +134 -0
- package/src/code-language/theme.ts +124 -0
- package/src/code-language/timers.ts +36 -0
- package/src/code-language/types.ts +252 -0
- package/src/codeblock/index.ts +146 -0
- package/src/color-picker/ColorField.ts +333 -0
- package/src/color-picker/ColorPicker.ts +1069 -0
- package/src/color-picker/color.ts +399 -0
- package/src/color-picker/index.ts +50 -0
- package/src/desktop-calendar/eds.ts +484 -0
- package/src/desktop-calendar/ical.ts +119 -0
- package/src/desktop-calendar/index.ts +287 -0
- package/src/embed/client.ts +311 -0
- package/src/embed/host.ts +432 -0
- package/src/embed/index.ts +33 -0
- package/src/embed/timers.ts +32 -0
- package/src/flow/draw.ts +418 -0
- package/src/flow/index.ts +473 -0
- package/src/flow/model.ts +687 -0
- package/src/flow/node.ts +3694 -0
- package/src/flow/paths.ts +403 -0
- package/src/flow/types.ts +634 -0
- package/src/formula/hx.ts +51 -0
- package/src/formula/index.ts +243 -0
- package/src/formula/katex.ts +209 -0
- package/src/formula/layout.ts +876 -0
- package/src/formula/node.ts +467 -0
- package/src/html/controls.ts +244 -0
- package/src/html/css/cascade.ts +606 -0
- package/src/html/css/parse.ts +500 -0
- package/src/html/css/style.ts +1371 -0
- package/src/html/css/ua.ts +174 -0
- package/src/html/css/values.ts +358 -0
- package/src/html/dom.ts +410 -0
- package/src/html/hx.ts +55 -0
- package/src/html/index.ts +545 -0
- package/src/html/layout/block.ts +876 -0
- package/src/html/layout/boxes.ts +981 -0
- package/src/html/layout/flex.ts +297 -0
- package/src/html/layout/floats.ts +125 -0
- package/src/html/layout/inline.ts +870 -0
- package/src/html/layout/table.ts +380 -0
- package/src/html/node.ts +967 -0
- package/src/html/paint.ts +605 -0
- package/src/html/resources.ts +214 -0
- package/src/index.ts +638 -0
- package/src/internal/heights.ts +211 -0
- package/src/internal/hx.ts +53 -0
- package/src/internal/text.ts +44 -0
- package/src/internal/timers.ts +44 -0
- package/src/internal/widget.ts +92 -0
- package/src/markdown/ast.ts +163 -0
- package/src/markdown/hx.ts +51 -0
- package/src/markdown/index.ts +686 -0
- package/src/markdown/parse.ts +1037 -0
- package/src/markdown/spans.ts +143 -0
- package/src/media-player/backends.ts +155 -0
- package/src/media-player/control.ts +70 -0
- package/src/media-player/hx.ts +51 -0
- package/src/media-player/index.ts +378 -0
- package/src/media-player/mpv.ts +146 -0
- package/src/media-player/vlc.ts +97 -0
- package/src/richtext/index.ts +42 -0
- package/src/richtext/links.ts +78 -0
- package/src/richtext/menu.ts +49 -0
- package/src/richtext/node.ts +406 -0
- package/src/richtext/runs.ts +253 -0
- package/src/table/hx.ts +51 -0
- package/src/table/index.ts +1219 -0
- package/src/table/rows.ts +275 -0
- package/src/terminal/backends.ts +242 -0
- package/src/terminal/hx.ts +51 -0
- package/src/terminal/index.ts +574 -0
- package/src/terminal/title.ts +172 -0
- package/src/terminal/vt/colors.ts +247 -0
- package/src/terminal/vt/diff.ts +467 -0
- package/src/terminal/vt/fonts.ts +233 -0
- package/src/terminal/vt/index.ts +443 -0
- package/src/terminal/vt/keys.ts +369 -0
- package/src/terminal/vt/mouse.ts +144 -0
- package/src/terminal/vt/node.ts +1242 -0
- package/src/terminal/vt/pty.ts +334 -0
- package/src/terminal/vt/renderer.ts +555 -0
- package/src/terminal/vt/timers.ts +31 -0
- package/src/terminal/vt/xterm.ts +193 -0
- package/src/terminal-output/hx.ts +51 -0
- package/src/terminal-output/index.ts +340 -0
- package/src/terminal-output/runs.ts +79 -0
- package/src/three/canvas.ts +451 -0
- package/src/three/events.ts +197 -0
- package/src/three/geometries.ts +429 -0
- package/src/three/globals.ts +34 -0
- package/src/three/hx.ts +22 -0
- package/src/three/index.ts +98 -0
- package/src/three/jsx-dev-runtime.ts +27 -0
- package/src/three/jsx-runtime.ts +38 -0
- package/src/three/jsx.ts +275 -0
- package/src/three/materials.ts +270 -0
- package/src/three/math.ts +585 -0
- package/src/three/objects.ts +397 -0
- package/src/three/passes.ts +90 -0
- package/src/three/postprocess.ts +677 -0
- package/src/three/raycast.ts +189 -0
- package/src/three/react-reconciler.d.ts +50 -0
- package/src/three/reconciler.ts +624 -0
- package/src/three/renderer-direct.ts +1055 -0
- package/src/three/renderer-indirect.ts +570 -0
- package/src/three/store.ts +207 -0
- package/src/timeline/hx.ts +31 -0
- package/src/timeline/index.ts +603 -0
- package/src/tray-host/hx.ts +51 -0
- package/src/tray-host/index.ts +331 -0
- package/src/tray-host/manager.ts +639 -0
- package/src/tray-host/notify.ts +102 -0
- package/src/tray-host/protocol.ts +235 -0
- package/src/tree/hx.ts +51 -0
- package/src/tree/index.ts +1087 -0
- package/src/tree/internal.ts +87 -0
- package/src/tree/rows.ts +334 -0
- package/src/index.d.ts +0 -2
- package/src/index.js +0 -9
- package/src/sparkline/index.d.ts +0 -29
- package/src/sparkline/index.js +0 -50
- package/src/sparkline/node.js +0 -72
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
// `<Canvas>` — the react-three-fiber-shaped entry point, standing on core's
|
|
2
|
+
// public `<glarea>` element.
|
|
3
|
+
//
|
|
4
|
+
// The division of labour: `<glarea>` owns everything that is renderer
|
|
5
|
+
// internals — the child X window on a GL visual, the context, the frame
|
|
6
|
+
// clock, the swap — and exposes it as `onCreated`/`onDraw`/`frameLoop`.
|
|
7
|
+
// This component owns everything that is scene: the second reconciler
|
|
8
|
+
// rendering `children` into the object graph, the store `useThree`/`useFrame`
|
|
9
|
+
// read, the backend-appropriate renderer, picking, and post-processing.
|
|
10
|
+
//
|
|
11
|
+
// Which backend draws is not chosen here: ntk's `glPolicy` decided it when
|
|
12
|
+
// the connection was made, and the context that arrives says which one it
|
|
13
|
+
// is. `glPolicy: 'auto'` at createRoot() is what "pick the best available"
|
|
14
|
+
// spells — the same scene JSX renders either way, which is the point of the
|
|
15
|
+
// shared subset.
|
|
16
|
+
import {
|
|
17
|
+
createElement as h,
|
|
18
|
+
useCallback,
|
|
19
|
+
useEffect,
|
|
20
|
+
useLayoutEffect,
|
|
21
|
+
useMemo,
|
|
22
|
+
useRef,
|
|
23
|
+
useState,
|
|
24
|
+
} from 'react';
|
|
25
|
+
import type { ReactNode, Ref } from 'react';
|
|
26
|
+
import { useSupports } from 'react-x11';
|
|
27
|
+
import type { ReactX11Elements } from 'react-x11';
|
|
28
|
+
// Loads the module the JSX augmentation in jsx.ts targets (see flow/index.ts
|
|
29
|
+
// for the same pattern). Type-only, so it is erased.
|
|
30
|
+
import type {} from 'react-x11/jsx-runtime';
|
|
31
|
+
|
|
32
|
+
import type { Color } from './math.js';
|
|
33
|
+
import { hx } from './hx.js';
|
|
34
|
+
import { OrthographicCamera, PerspectiveCamera, Scene } from './objects.js';
|
|
35
|
+
import type { Camera } from './objects.js';
|
|
36
|
+
import type { BufferGeometry } from './geometries.js';
|
|
37
|
+
import { applyProps, createSceneRoot } from './reconciler.js';
|
|
38
|
+
import type { Instance, SceneContainer, SceneRoot } from './reconciler.js';
|
|
39
|
+
import { ThreeContext, computeViewport, createThreeStore } from './store.js';
|
|
40
|
+
import type { RootState, ThreeStore } from './store.js';
|
|
41
|
+
import { IndirectRenderer } from './renderer-indirect.js';
|
|
42
|
+
import { DirectRenderer } from './renderer-direct.js';
|
|
43
|
+
import { PostProcessor } from './postprocess.js';
|
|
44
|
+
import type { EffectComposer } from './passes.js';
|
|
45
|
+
import { ScenePointer, type ThreeEvent } from './events.js';
|
|
46
|
+
import { sceneWantsPointer } from './raycast.js';
|
|
47
|
+
import { now, warn } from './globals.js';
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Failures that mean "one thing in this scene is broken", not "this machine
|
|
51
|
+
* has no 3D". The fallback is for the second: replacing a whole scene with
|
|
52
|
+
* "no 3D here" because a pass shader has a typo would send the reader off
|
|
53
|
+
* to check their drivers.
|
|
54
|
+
*/
|
|
55
|
+
const SCENE_LEVEL = new Set([
|
|
56
|
+
'GL_SHADER_FAILED',
|
|
57
|
+
'GL_CONTEXT_INCOMPLETE',
|
|
58
|
+
'GL_POST_UNAVAILABLE',
|
|
59
|
+
'GL_POST_TARGET_FAILED',
|
|
60
|
+
]);
|
|
61
|
+
|
|
62
|
+
type GlAreaProps = ReactX11Elements['glarea'];
|
|
63
|
+
|
|
64
|
+
/** The glarea node surface this component reaches through its ref. */
|
|
65
|
+
interface SurfaceNode {
|
|
66
|
+
requestFrame?: () => void;
|
|
67
|
+
window?: {
|
|
68
|
+
on(name: string, handler: (event: { x: number; y: number }) => void): void;
|
|
69
|
+
setCursor?(cursor: string | null): void;
|
|
70
|
+
} | null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
interface DrawInfo {
|
|
74
|
+
width: number;
|
|
75
|
+
height: number;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface CanvasProps {
|
|
79
|
+
children?: ReactNode;
|
|
80
|
+
/** Layout, as any drawn element takes it. */
|
|
81
|
+
style?: GlAreaProps['style'];
|
|
82
|
+
/**
|
|
83
|
+
* Partial settings for the default camera, r3f-shaped:
|
|
84
|
+
* `{ position: [3, 3, 6], fov: 50, near, far, zoom, up, target }`.
|
|
85
|
+
* A `<perspectiveCamera makeDefault>` in the scene replaces it wholesale.
|
|
86
|
+
*/
|
|
87
|
+
camera?: Record<string, unknown>;
|
|
88
|
+
/** An orthographic default camera instead of the perspective one. */
|
|
89
|
+
orthographic?: boolean;
|
|
90
|
+
/**
|
|
91
|
+
* `'demand'` (the default): render when something changed — a commit, a
|
|
92
|
+
* resize, an expose, or `invalidate()`. Subscribing to `useFrame` makes
|
|
93
|
+
* the surface animate, so ported r3f components move without asking.
|
|
94
|
+
* `'always'` runs the clock continuously; `'never'` renders only on
|
|
95
|
+
* `invalidate()`. (r3f defaults to `'always'`; a desktop toolkit is the
|
|
96
|
+
* one place that default wastes a battery, so it is opt-in here.)
|
|
97
|
+
*/
|
|
98
|
+
frameloop?: 'always' | 'demand' | 'never';
|
|
99
|
+
/** CSS colour or `[r, g, b, a]` floats (default black). A
|
|
100
|
+
* `<color attach="background" />` in the scene wins over this. */
|
|
101
|
+
clearColor?: GlAreaProps['clearColor'];
|
|
102
|
+
/** Visual spec for the GL window, e.g. `{ DEPTH_SIZE: 24 }`. */
|
|
103
|
+
glx?: GlAreaProps['glx'];
|
|
104
|
+
/** Shown in place of the surface when this connection has no GL at all —
|
|
105
|
+
* an element, or a function of the error (whose `code` says why). */
|
|
106
|
+
fallback?: ReactNode | ((error: Error) => ReactNode);
|
|
107
|
+
/** Runs once the context exists, with the full root state. */
|
|
108
|
+
onCreated?: (state: RootState) => void;
|
|
109
|
+
/** A press that hit no object. */
|
|
110
|
+
onPointerMissed?: (event: ThreeEvent) => void;
|
|
111
|
+
onError?: (error: Error) => void;
|
|
112
|
+
/** Raw GL after the scene draws — the escape hatch `<glarea onDraw>` is.
|
|
113
|
+
* Branch on `gl.backend`: camelCase ES 2 against PascalCase GL 1.x. */
|
|
114
|
+
onDraw?: GlAreaProps['onDraw'];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
interface CanvasKit {
|
|
118
|
+
scene: Scene;
|
|
119
|
+
store: ThreeStore;
|
|
120
|
+
container: SceneContainer;
|
|
121
|
+
pointer: ScenePointer;
|
|
122
|
+
renderer: IndirectRenderer | DirectRenderer | null;
|
|
123
|
+
post: PostProcessor | null;
|
|
124
|
+
gl: unknown;
|
|
125
|
+
disposals: BufferGeometry[];
|
|
126
|
+
root: SceneRoot | null;
|
|
127
|
+
lastFrameAt: number | null;
|
|
128
|
+
firstFrameAt: number | null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const isGeometry = (value: object): value is BufferGeometry =>
|
|
132
|
+
(value as { isBufferGeometry?: boolean }).isBufferGeometry === true;
|
|
133
|
+
|
|
134
|
+
export function Canvas({
|
|
135
|
+
children,
|
|
136
|
+
style,
|
|
137
|
+
camera,
|
|
138
|
+
orthographic = false,
|
|
139
|
+
frameloop = 'demand',
|
|
140
|
+
clearColor,
|
|
141
|
+
glx,
|
|
142
|
+
fallback,
|
|
143
|
+
onCreated,
|
|
144
|
+
onPointerMissed,
|
|
145
|
+
onError,
|
|
146
|
+
onDraw,
|
|
147
|
+
}: CanvasProps) {
|
|
148
|
+
const supportsShaders = useSupports('shaders');
|
|
149
|
+
const [error, setError] = useState<Error | null>(null);
|
|
150
|
+
const areaRef = useRef<unknown>(null);
|
|
151
|
+
|
|
152
|
+
// Everything with the canvas's lifetime, made once. The camera the scene
|
|
153
|
+
// starts with is the default one; `<perspectiveCamera makeDefault>`
|
|
154
|
+
// replaces it through the store.
|
|
155
|
+
const kit = useMemo<CanvasKit>(() => {
|
|
156
|
+
const scene = new Scene();
|
|
157
|
+
const defaultCamera: Camera = orthographic
|
|
158
|
+
? new OrthographicCamera()
|
|
159
|
+
: new PerspectiveCamera();
|
|
160
|
+
const size = { width: 1, height: 1 };
|
|
161
|
+
const store = createThreeStore({
|
|
162
|
+
gl: null,
|
|
163
|
+
backend: null,
|
|
164
|
+
scene,
|
|
165
|
+
camera: defaultCamera,
|
|
166
|
+
size,
|
|
167
|
+
viewport: computeViewport(defaultCamera, size),
|
|
168
|
+
clock: { elapsedTime: 0, delta: 0 },
|
|
169
|
+
supportsShaders,
|
|
170
|
+
frameloop,
|
|
171
|
+
invalidate: () => {
|
|
172
|
+
const node = areaRef.current as SurfaceNode | null;
|
|
173
|
+
node?.requestFrame?.();
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
const state: CanvasKit = {
|
|
177
|
+
scene,
|
|
178
|
+
store,
|
|
179
|
+
container: {
|
|
180
|
+
scene,
|
|
181
|
+
store,
|
|
182
|
+
invalidate: () => store.getState().invalidate(),
|
|
183
|
+
onRemoved: (instance) => {
|
|
184
|
+
state.pointer.forget(instance);
|
|
185
|
+
if (isGeometry(instance)) state.disposals.push(instance);
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
pointer: new ScenePointer({
|
|
189
|
+
scene,
|
|
190
|
+
cameraOf: () => state.renderer?.camera ?? null,
|
|
191
|
+
onPointerMissed: (event) => {
|
|
192
|
+
// read through a ref so the prop can change without remaking the kit
|
|
193
|
+
missedRef.current?.(event);
|
|
194
|
+
},
|
|
195
|
+
}),
|
|
196
|
+
renderer: null,
|
|
197
|
+
post: null,
|
|
198
|
+
gl: null,
|
|
199
|
+
disposals: [],
|
|
200
|
+
root: null,
|
|
201
|
+
lastFrameAt: null,
|
|
202
|
+
firstFrameAt: null,
|
|
203
|
+
};
|
|
204
|
+
// mutations arriving outside React — `ref.current.position.x = 2` in an
|
|
205
|
+
// event handler — redraw a demand-mode surface without an invalidate()
|
|
206
|
+
scene.propagateDirty(() => store.getState().invalidate());
|
|
207
|
+
return state;
|
|
208
|
+
// the kit is per-mount; remaking it on prop changes would drop the scene
|
|
209
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
210
|
+
}, []);
|
|
211
|
+
|
|
212
|
+
const missedRef = useRef(onPointerMissed);
|
|
213
|
+
missedRef.current = onPointerMissed;
|
|
214
|
+
|
|
215
|
+
// r3f's camera prop contract: partial settings applied onto the default
|
|
216
|
+
// camera, diffed so an unchanged inline object costs nothing new.
|
|
217
|
+
const prevCameraProps = useRef<Record<string, unknown>>({});
|
|
218
|
+
useEffect(() => {
|
|
219
|
+
if (!camera) return;
|
|
220
|
+
applyProps(
|
|
221
|
+
kit.store.getState().camera as unknown as Instance,
|
|
222
|
+
prevCameraProps.current,
|
|
223
|
+
camera,
|
|
224
|
+
);
|
|
225
|
+
prevCameraProps.current = camera;
|
|
226
|
+
kit.store.getState().invalidate();
|
|
227
|
+
}, [camera, kit]);
|
|
228
|
+
|
|
229
|
+
useEffect(() => {
|
|
230
|
+
if (kit.store.getState().frameloop !== frameloop) {
|
|
231
|
+
kit.store.setState({ frameloop });
|
|
232
|
+
}
|
|
233
|
+
}, [frameloop, kit]);
|
|
234
|
+
|
|
235
|
+
// Until a context exists the hook is the best prediction there is, and
|
|
236
|
+
// it can settle false→true after the kit captured it (caps resolve on
|
|
237
|
+
// their own clock). Keep the store following the hook so a direct-only
|
|
238
|
+
// element mounting on that flip is judged by the fresh value — declared
|
|
239
|
+
// before the scene-root effects so it lands first. The created context
|
|
240
|
+
// overwrites this with the backend that actually arrived.
|
|
241
|
+
useLayoutEffect(() => {
|
|
242
|
+
const state = kit.store.getState();
|
|
243
|
+
if (!state.backend && state.supportsShaders !== supportsShaders) {
|
|
244
|
+
kit.store.setState({ supportsShaders });
|
|
245
|
+
}
|
|
246
|
+
}, [kit, supportsShaders]);
|
|
247
|
+
|
|
248
|
+
// The scene root: created once, fed the children every render, torn down
|
|
249
|
+
// with the canvas. `useLayoutEffect` so the scene exists before the
|
|
250
|
+
// surface's first frame asks it to draw.
|
|
251
|
+
useLayoutEffect(() => {
|
|
252
|
+
kit.root = createSceneRoot(kit.container);
|
|
253
|
+
return () => {
|
|
254
|
+
kit.root?.unmount();
|
|
255
|
+
kit.root = null;
|
|
256
|
+
if (kit.renderer && kit.gl) {
|
|
257
|
+
kit.renderer.dispose(kit.gl);
|
|
258
|
+
kit.post?.dispose(kit.gl);
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
262
|
+
}, [kit]);
|
|
263
|
+
useLayoutEffect(() => {
|
|
264
|
+
kit.root?.render(h(ThreeContext.Provider, { value: kit.store }, children));
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
// The surface animates while anything subscribes to useFrame — that is
|
|
268
|
+
// what makes a ported r3f component move — or while frameloop asks for it.
|
|
269
|
+
const [animating, setAnimating] = useState(false);
|
|
270
|
+
useEffect(
|
|
271
|
+
() =>
|
|
272
|
+
kit.store.subscribe(() => {
|
|
273
|
+
setAnimating(kit.store.frames.length > 0);
|
|
274
|
+
}),
|
|
275
|
+
[kit],
|
|
276
|
+
);
|
|
277
|
+
|
|
278
|
+
const handleError = useCallback(
|
|
279
|
+
(err: Error & { code?: string }) => {
|
|
280
|
+
// The fallback means "this surface has no GL", so only a failure to
|
|
281
|
+
// get a context switches to it.
|
|
282
|
+
if (!SCENE_LEVEL.has(err?.code ?? '')) setError(err);
|
|
283
|
+
if (onError) return onError(err);
|
|
284
|
+
if (fallback === undefined) {
|
|
285
|
+
warn(`@react-x11/components: <Canvas>: ${err?.message ?? err}`);
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
[onError, fallback],
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
const handleCreated = useCallback(
|
|
292
|
+
(gl: { backend?: string }) => {
|
|
293
|
+
kit.gl = gl;
|
|
294
|
+
const backend = gl?.backend === 'direct' ? 'direct' : 'indirect';
|
|
295
|
+
if (backend === 'direct') {
|
|
296
|
+
const renderer = new DirectRenderer();
|
|
297
|
+
renderer.onError = handleError;
|
|
298
|
+
kit.renderer = renderer;
|
|
299
|
+
} else {
|
|
300
|
+
kit.renderer = new IndirectRenderer();
|
|
301
|
+
}
|
|
302
|
+
// The context in hand outranks any prediction: once a backend has
|
|
303
|
+
// actually arrived, `useThree((s) => s.supportsShaders)` and the
|
|
304
|
+
// direct-only mount guard follow it. (Since react-x11#358 the
|
|
305
|
+
// useSupports('shaders') hook is policy-aware and agrees with this;
|
|
306
|
+
// writing it here keeps the store truthful on any core version.)
|
|
307
|
+
kit.store.setState({
|
|
308
|
+
gl,
|
|
309
|
+
backend,
|
|
310
|
+
supportsShaders: backend === 'direct',
|
|
311
|
+
});
|
|
312
|
+
onCreated?.(kit.store.getState());
|
|
313
|
+
},
|
|
314
|
+
// handleError is stable enough (fallback/onError changes reroute later
|
|
315
|
+
// reports through the current closure on the next created surface)
|
|
316
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
317
|
+
[kit],
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
const onDrawRef = useRef(onDraw);
|
|
321
|
+
onDrawRef.current = onDraw;
|
|
322
|
+
|
|
323
|
+
const handleDraw = useCallback(
|
|
324
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
325
|
+
(gl: any, info: DrawInfo) => {
|
|
326
|
+
const renderer = kit.renderer;
|
|
327
|
+
if (!renderer) return;
|
|
328
|
+
const store = kit.store;
|
|
329
|
+
const state = store.getState();
|
|
330
|
+
|
|
331
|
+
if (
|
|
332
|
+
state.size.width !== info.width ||
|
|
333
|
+
state.size.height !== info.height
|
|
334
|
+
) {
|
|
335
|
+
const size = { width: info.width, height: info.height };
|
|
336
|
+
store.setState({
|
|
337
|
+
size,
|
|
338
|
+
viewport: computeViewport(state.camera, size),
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// geometry that left the tree: its server/GPU resources go with it
|
|
343
|
+
if (kit.disposals.length) {
|
|
344
|
+
for (const geometry of kit.disposals) renderer.forget(gl, geometry);
|
|
345
|
+
kit.disposals.length = 0;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// the frame clock, before anything draws: a callback that mutates the
|
|
349
|
+
// scene is drawing this frame, and one that sets React state lands on
|
|
350
|
+
// the next — both the r3f contract
|
|
351
|
+
const time = now();
|
|
352
|
+
if (kit.firstFrameAt === null) kit.firstFrameAt = time;
|
|
353
|
+
// clamped: a surface that was occluded for a second must not teleport
|
|
354
|
+
// everything that integrates against delta
|
|
355
|
+
const delta = Math.min((time - (kit.lastFrameAt ?? time)) / 1000, 0.1);
|
|
356
|
+
kit.lastFrameAt = time;
|
|
357
|
+
const clock = store.getState().clock;
|
|
358
|
+
clock.elapsedTime = (time - kit.firstFrameAt) / 1000;
|
|
359
|
+
clock.delta = delta;
|
|
360
|
+
store.runFrames(store.getState(), delta);
|
|
361
|
+
|
|
362
|
+
// pointer events are only worth selecting on the X window when
|
|
363
|
+
// something in the scene listens — checked when the tree said it
|
|
364
|
+
// changed, attached the first time it is true
|
|
365
|
+
if (store.eventsDirty) {
|
|
366
|
+
store.eventsDirty = false;
|
|
367
|
+
if (!kit.pointer.attached && sceneWantsPointer(kit.scene.children)) {
|
|
368
|
+
const node = areaRef.current as SurfaceNode | null;
|
|
369
|
+
if (node?.window) kit.pointer.attach(node.window);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const current = store.getState();
|
|
374
|
+
const scene = kit.scene;
|
|
375
|
+
|
|
376
|
+
// `<color attach="background" />` wins over the clearColor prop. The
|
|
377
|
+
// surface already cleared to the prop before this ran, so only an
|
|
378
|
+
// explicit background costs a second clear.
|
|
379
|
+
const background = scene.background;
|
|
380
|
+
const composer =
|
|
381
|
+
renderer.backend === 'direct'
|
|
382
|
+
? (scene.children.find(
|
|
383
|
+
(child) => (child as unknown as EffectComposer).isComposer,
|
|
384
|
+
) as EffectComposer | undefined)
|
|
385
|
+
: undefined;
|
|
386
|
+
|
|
387
|
+
const anyGl = gl as {
|
|
388
|
+
clearColor?: (r: number, g: number, b: number, a: number) => void;
|
|
389
|
+
clear?: (bits: number) => void;
|
|
390
|
+
ClearColor?: (r: number, g: number, b: number, a: number) => void;
|
|
391
|
+
Clear?: (bits: number) => void;
|
|
392
|
+
COLOR_BUFFER_BIT?: number;
|
|
393
|
+
DEPTH_BUFFER_BIT?: number;
|
|
394
|
+
};
|
|
395
|
+
const clearTo = (color: Color | null) => {
|
|
396
|
+
const [r, g, b] = color ? color.toArray() : [0, 0, 0];
|
|
397
|
+
const a = color ? color._alpha : 1;
|
|
398
|
+
if (renderer.backend === 'direct') {
|
|
399
|
+
anyGl.clearColor?.(r, g, b, a);
|
|
400
|
+
anyGl.clear?.(anyGl.COLOR_BUFFER_BIT! | anyGl.DEPTH_BUFFER_BIT!);
|
|
401
|
+
} else {
|
|
402
|
+
anyGl.ClearColor?.(r, g, b, a);
|
|
403
|
+
anyGl.Clear?.(anyGl.COLOR_BUFFER_BIT! | anyGl.DEPTH_BUFFER_BIT!);
|
|
404
|
+
}
|
|
405
|
+
};
|
|
406
|
+
|
|
407
|
+
// An <effectComposer> redirects the frame into a texture, and the
|
|
408
|
+
// redirect has to happen before the clear: the clear colour is the
|
|
409
|
+
// composed image's background, and `onDraw` output is part of what
|
|
410
|
+
// gets composed.
|
|
411
|
+
let composed = false;
|
|
412
|
+
if (composer && renderer.backend === 'direct') {
|
|
413
|
+
kit.post ??= new PostProcessor(renderer as DirectRenderer);
|
|
414
|
+
composed = kit.post.begin(gl, info, composer);
|
|
415
|
+
if (composed) clearTo(background);
|
|
416
|
+
} else if (background) {
|
|
417
|
+
clearTo(background);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
renderer.render(gl, scene, current.camera, info);
|
|
421
|
+
onDrawRef.current?.(gl, info as never);
|
|
422
|
+
if (composed) kit.post!.end(gl, info);
|
|
423
|
+
},
|
|
424
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
425
|
+
[kit],
|
|
426
|
+
);
|
|
427
|
+
|
|
428
|
+
if (error && fallback !== undefined) {
|
|
429
|
+
return hx(
|
|
430
|
+
'box',
|
|
431
|
+
{ style },
|
|
432
|
+
typeof fallback === 'function' ? fallback(error) : fallback,
|
|
433
|
+
);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
const loop =
|
|
437
|
+
frameloop === 'always' || (frameloop === 'demand' && animating)
|
|
438
|
+
? 'always'
|
|
439
|
+
: 'demand';
|
|
440
|
+
|
|
441
|
+
return hx('glarea', {
|
|
442
|
+
ref: areaRef as Ref<never>,
|
|
443
|
+
style,
|
|
444
|
+
clearColor,
|
|
445
|
+
glx,
|
|
446
|
+
frameLoop: loop,
|
|
447
|
+
onCreated: handleCreated as GlAreaProps['onCreated'],
|
|
448
|
+
onDraw: handleDraw as GlAreaProps['onDraw'],
|
|
449
|
+
onError: handleError,
|
|
450
|
+
});
|
|
451
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
// Pointer events for the scene: X mouse events on the `<glarea>`'s child
|
|
2
|
+
// window, raycast against the CPU-side geometry, dispatched to the object
|
|
3
|
+
// they hit and bubbled up its ancestors — a port of react-x11's
|
|
4
|
+
// `src/pointer3d.js` onto the object graph, with the event shaped the way
|
|
5
|
+
// r3f handlers expect (`object`, `point`, `distance`, `stopPropagation`).
|
|
6
|
+
import type { Mesh, Object3D, Scene } from './objects.js';
|
|
7
|
+
import { raycast } from './raycast.js';
|
|
8
|
+
import type { RayHit } from './raycast.js';
|
|
9
|
+
import type { FrameCamera } from './renderer-indirect.js';
|
|
10
|
+
|
|
11
|
+
/** What a pointer handler receives. */
|
|
12
|
+
export interface ThreeEvent {
|
|
13
|
+
type: string;
|
|
14
|
+
/** The object whose handler is running (bubbling walks ancestors). */
|
|
15
|
+
target: Object3D | null;
|
|
16
|
+
/** The mesh the ray hit. */
|
|
17
|
+
object: Mesh | null;
|
|
18
|
+
point: [number, number, number] | null;
|
|
19
|
+
distance: number | null;
|
|
20
|
+
face: number | null;
|
|
21
|
+
uv: [number, number] | null;
|
|
22
|
+
x: number | undefined;
|
|
23
|
+
y: number | undefined;
|
|
24
|
+
nativeEvent: unknown;
|
|
25
|
+
stopPropagation(): void;
|
|
26
|
+
readonly propagationStopped: boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface NativeMouse {
|
|
30
|
+
x: number;
|
|
31
|
+
y: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** The window seam this needs — what an ntk window provides. */
|
|
35
|
+
export interface PointerSource {
|
|
36
|
+
on(name: string, handler: (event: NativeMouse) => void): unknown;
|
|
37
|
+
setCursor?(cursor: string | null): void;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** The dispatch path: the object that was hit, then its ancestors. */
|
|
41
|
+
function bubblePath(node: Object3D, scene: Scene): Object3D[] {
|
|
42
|
+
const path: Object3D[] = [];
|
|
43
|
+
for (
|
|
44
|
+
let n: Object3D | null = node;
|
|
45
|
+
n && (n as unknown) !== (scene as unknown);
|
|
46
|
+
n = n.parent
|
|
47
|
+
) {
|
|
48
|
+
path.push(n);
|
|
49
|
+
}
|
|
50
|
+
return path;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* One canvas's pointer pipeline. The canvas attaches it to the surface's
|
|
55
|
+
* child X window once anything in the scene listens; hover and press state
|
|
56
|
+
* live here so enter/leave pairs and click (down and up on the same object)
|
|
57
|
+
* come out right.
|
|
58
|
+
*/
|
|
59
|
+
export class ScenePointer {
|
|
60
|
+
private scene: Scene;
|
|
61
|
+
private cameraOf: () => FrameCamera | null;
|
|
62
|
+
private onMissed: (event: ThreeEvent) => void;
|
|
63
|
+
private hovered: Object3D | null = null;
|
|
64
|
+
private pressed: Object3D | null = null;
|
|
65
|
+
private _cursor: string | null = null;
|
|
66
|
+
private source: PointerSource | null = null;
|
|
67
|
+
attached = false;
|
|
68
|
+
|
|
69
|
+
constructor(options: {
|
|
70
|
+
scene: Scene;
|
|
71
|
+
cameraOf: () => FrameCamera | null;
|
|
72
|
+
onPointerMissed?: (event: ThreeEvent) => void;
|
|
73
|
+
}) {
|
|
74
|
+
this.scene = options.scene;
|
|
75
|
+
this.cameraOf = options.cameraOf;
|
|
76
|
+
this.onMissed = (event) => options.onPointerMissed?.(event);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
attach(source: PointerSource): void {
|
|
80
|
+
if (this.attached || typeof source.on !== 'function') return;
|
|
81
|
+
this.attached = true;
|
|
82
|
+
this.source = source;
|
|
83
|
+
source.on('mousedown', (ev) => this.onPointer('pointerdown', ev));
|
|
84
|
+
source.on('mouseup', (ev) => this.onPointer('pointerup', ev));
|
|
85
|
+
source.on('mousemove', (ev) => this.onPointer('pointermove', ev));
|
|
86
|
+
source.on('mouseout', () => this.onLeave());
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** The nearest hit under the pointer, or null. */
|
|
90
|
+
private pick(ev: NativeMouse): RayHit | null {
|
|
91
|
+
const camera = this.cameraOf();
|
|
92
|
+
if (!camera) return null;
|
|
93
|
+
const [hit] = raycast(this.scene.children, ev.x, ev.y, camera);
|
|
94
|
+
return hit ?? null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private makeEvent(
|
|
98
|
+
type: string,
|
|
99
|
+
hit: RayHit | null,
|
|
100
|
+
native: NativeMouse | null,
|
|
101
|
+
target: Object3D | null,
|
|
102
|
+
): ThreeEvent {
|
|
103
|
+
let stopped = false;
|
|
104
|
+
return {
|
|
105
|
+
type,
|
|
106
|
+
target,
|
|
107
|
+
object: hit?.object ?? null,
|
|
108
|
+
point: hit?.point ?? null,
|
|
109
|
+
distance: hit?.distance ?? null,
|
|
110
|
+
face: hit?.face ?? null,
|
|
111
|
+
uv: hit?.uv ?? null,
|
|
112
|
+
x: native?.x,
|
|
113
|
+
y: native?.y,
|
|
114
|
+
nativeEvent: native,
|
|
115
|
+
stopPropagation() {
|
|
116
|
+
stopped = true;
|
|
117
|
+
},
|
|
118
|
+
get propagationStopped() {
|
|
119
|
+
return stopped;
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Call `on<Name>` along the bubble path until one stops propagation. */
|
|
125
|
+
private dispatch(
|
|
126
|
+
name: string,
|
|
127
|
+
hit: RayHit | null,
|
|
128
|
+
native: NativeMouse | null,
|
|
129
|
+
node: Object3D | null = hit?.object ?? null,
|
|
130
|
+
): void {
|
|
131
|
+
if (!node) return;
|
|
132
|
+
const prop = `on${name[0].toUpperCase()}${name.slice(1)}`;
|
|
133
|
+
let event: ThreeEvent | null = null;
|
|
134
|
+
for (const target of bubblePath(node, this.scene)) {
|
|
135
|
+
const handler = (target.__handlers as Record<string, unknown> | null)?.[
|
|
136
|
+
prop
|
|
137
|
+
];
|
|
138
|
+
if (typeof handler !== 'function') continue;
|
|
139
|
+
event = event ?? this.makeEvent(name.toLowerCase(), hit, native, target);
|
|
140
|
+
event.target = target;
|
|
141
|
+
(handler as (event: ThreeEvent) => void)(event);
|
|
142
|
+
if (event.propagationStopped) break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
private onPointer(type: string, native: NativeMouse): void {
|
|
147
|
+
const hit = this.pick(native);
|
|
148
|
+
if (type === 'pointermove') {
|
|
149
|
+
this.updateHover(hit, native);
|
|
150
|
+
if (hit) this.dispatch('pointerMove', hit, native);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (type === 'pointerdown') {
|
|
154
|
+
this.pressed = hit?.object ?? null;
|
|
155
|
+
if (hit) this.dispatch('pointerDown', hit, native);
|
|
156
|
+
else this.onMissed(this.makeEvent('pointermissed', null, native, null));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// pointerup: a click is down and up on the same object
|
|
160
|
+
if (hit) this.dispatch('pointerUp', hit, native);
|
|
161
|
+
if (hit && this.pressed === hit.object) {
|
|
162
|
+
this.dispatch('click', hit, native);
|
|
163
|
+
}
|
|
164
|
+
this.pressed = null;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** enter/leave, diffed against the object hovered last time. */
|
|
168
|
+
private updateHover(hit: RayHit | null, native: NativeMouse | null): void {
|
|
169
|
+
const next = hit?.object ?? null;
|
|
170
|
+
if (next === this.hovered) return;
|
|
171
|
+
const previous = this.hovered;
|
|
172
|
+
this.hovered = next;
|
|
173
|
+
if (previous) this.dispatch('pointerOut', null, native, previous);
|
|
174
|
+
if (next) this.dispatch('pointerOver', hit, native);
|
|
175
|
+
this.applyCursor(next);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private applyCursor(node: Object3D | null): void {
|
|
179
|
+
const source = this.source;
|
|
180
|
+
if (typeof source?.setCursor !== 'function') return;
|
|
181
|
+
const cursor = node?.cursor ?? null;
|
|
182
|
+
if (cursor === this._cursor) return;
|
|
183
|
+
this._cursor = cursor;
|
|
184
|
+
source.setCursor(cursor);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
private onLeave(): void {
|
|
188
|
+
if (!this.hovered) return;
|
|
189
|
+
this.updateHover(null, null);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** A node left the tree: drop references to it. */
|
|
193
|
+
forget(node: object): void {
|
|
194
|
+
if (this.hovered === node) this.hovered = null;
|
|
195
|
+
if (this.pressed === node) this.pressed = null;
|
|
196
|
+
}
|
|
197
|
+
}
|