@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,716 @@
|
|
|
1
|
+
// <Tree> — a disclosure tree: file browsers, outline panes, property
|
|
2
|
+
// inspectors, anything with a twisty.
|
|
3
|
+
//
|
|
4
|
+
// This is a **successor to react-x11's own `<Tree>`, not a wrapper around
|
|
5
|
+
// it**. Core's is being retired, so nothing here imports it and the two share
|
|
6
|
+
// no code. What is kept is the behaviour a user has already learnt — the
|
|
7
|
+
// keyboard map, type-ahead, the twisty being its own hit target — because
|
|
8
|
+
// that is the part it would be rude to change.
|
|
9
|
+
//
|
|
10
|
+
// Three things it has that core's does not, and they are the reason it lives
|
|
11
|
+
// out here rather than in core:
|
|
12
|
+
//
|
|
13
|
+
// 1. **It reads the app's own data.** `getId` / `getChildren` / `isBranch`
|
|
14
|
+
// and friends mean a filesystem listing, an AST or a normalized store is
|
|
15
|
+
// rendered where it lies, instead of being copied into a shape this
|
|
16
|
+
// component preferred. The defaults describe `{ id, label, children }`,
|
|
17
|
+
// so a tree that has that shape configures nothing.
|
|
18
|
+
// 2. **It virtualizes.** Past a couple of hundred visible rows it builds
|
|
19
|
+
// only the slice on screen, the way `Table` does, and the rest of the
|
|
20
|
+
// list is two spacer boxes so the scrollbar still measures the whole
|
|
21
|
+
// tree. That is what "very large number of elements" costs: nothing.
|
|
22
|
+
// 3. **Every visible part is a seam.** The twisty, the branch edge down the
|
|
23
|
+
// indent, the label, the row's contents and — in `layout="nested"` — the
|
|
24
|
+
// subtree container are each a render prop with a style override beside
|
|
25
|
+
// it. The default look is deliberately plain: a chevron, no branch lines,
|
|
26
|
+
// just indentation.
|
|
27
|
+
//
|
|
28
|
+
// Nothing here registers a host element. A tree is `<box>`, `<text>` and
|
|
29
|
+
// core's chevron, so there is no `registerElement` call, no JSX augmentation
|
|
30
|
+
// and no side effect at import time at all.
|
|
31
|
+
import React, { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState, } from 'react';
|
|
32
|
+
import { createStyles } from 'react-x11/style';
|
|
33
|
+
import { Icon, useDirection, useTheme } from 'react-x11';
|
|
34
|
+
import { XK_DOWN, XK_END, XK_HOME, XK_LEFT, XK_PAGE_DOWN, XK_PAGE_UP, XK_RETURN, XK_RIGHT, XK_UP, } from 'react-x11/keysyms';
|
|
35
|
+
import { hx } from './hx.js';
|
|
36
|
+
// Shared with <Table> — internal, deliberately not a shared *module*; the
|
|
37
|
+
// header of src/internal/heights.ts says why.
|
|
38
|
+
import { RowHeights } from '../internal/heights.js';
|
|
39
|
+
import { afterLayout, cancelAfterLayout } from '../internal/timers.js';
|
|
40
|
+
import { typeAheadChar, useTypeAhead } from './internal.js';
|
|
41
|
+
import { branchEdges, findItem, groupRows, isGroup, resolveAccessors, visibleRows, } from './rows.js';
|
|
42
|
+
export { branchEdges, findItem, resolveAccessors, visibleRows, } from './rows.js';
|
|
43
|
+
/** One level of indent. */
|
|
44
|
+
const INDENT = 14;
|
|
45
|
+
/** The twisty's hit box — what a file browser lets you click to peek into a
|
|
46
|
+
* folder without selecting it. It stays this wide whatever the glyph does. */
|
|
47
|
+
const TWISTY = 12;
|
|
48
|
+
/** The chevron inside it. A chevron's long axis is its box and its short one
|
|
49
|
+
* is half of that, so `size` for one reads as its width. */
|
|
50
|
+
const TWISTY_GLYPH = 10;
|
|
51
|
+
const ROW_HEIGHT = 22;
|
|
52
|
+
/** Rows kept either side of the viewport, so a fast scroll does not show a
|
|
53
|
+
* gap before the next frame catches up. */
|
|
54
|
+
const OVERSCAN = 6;
|
|
55
|
+
/**
|
|
56
|
+
* What to build before the viewport has been measured. `onViewport` cannot
|
|
57
|
+
* arrive until layout has run, which is a frame after the first commit, so
|
|
58
|
+
* there is always one render that has to guess — and guessing "all of them"
|
|
59
|
+
* puts a hundred thousand rows in the tree for a frame.
|
|
60
|
+
*/
|
|
61
|
+
const ASSUMED_ROWS = 40;
|
|
62
|
+
/**
|
|
63
|
+
* Where `virtual="auto"` starts virtualizing.
|
|
64
|
+
*
|
|
65
|
+
* Well above any viewport, so a tree that is merely long is still built whole
|
|
66
|
+
* and keeps the two things virtualization costs: a row may be any height, and
|
|
67
|
+
* every row is in the accessibility tree. Well below the point where building
|
|
68
|
+
* every row is felt.
|
|
69
|
+
*/
|
|
70
|
+
const VIRTUAL_THRESHOLD = 200;
|
|
71
|
+
const s = createStyles({
|
|
72
|
+
root: { flexGrow: 1, minHeight: 0, overflow: 'scroll' },
|
|
73
|
+
row: {
|
|
74
|
+
flexShrink: 0,
|
|
75
|
+
flexDirection: 'row',
|
|
76
|
+
alignItems: 'center',
|
|
77
|
+
gap: 4,
|
|
78
|
+
paddingEnd: 8,
|
|
79
|
+
paddingTop: 3,
|
|
80
|
+
paddingBottom: 3,
|
|
81
|
+
cursor: 'pointer',
|
|
82
|
+
transition: { backgroundColor: 80 },
|
|
83
|
+
},
|
|
84
|
+
twisty: {
|
|
85
|
+
width: TWISTY,
|
|
86
|
+
height: TWISTY,
|
|
87
|
+
flexShrink: 0,
|
|
88
|
+
alignItems: 'center',
|
|
89
|
+
justifyContent: 'center',
|
|
90
|
+
},
|
|
91
|
+
guide: { flexShrink: 0, alignSelf: 'stretch' },
|
|
92
|
+
/**
|
|
93
|
+
* The label **wraps**, and the row grows to hold it.
|
|
94
|
+
*
|
|
95
|
+
* This is the whole point of rows being measured rather than fixed: a name
|
|
96
|
+
* too long for the pane becomes two lines of a taller row, not two lines
|
|
97
|
+
* drawn over the row below. An app that wants the one-line, clipped look a
|
|
98
|
+
* file browser has says so — `styles={{ label: { textWrap: 'nowrap' } }}` —
|
|
99
|
+
* and gets it for the whole tree.
|
|
100
|
+
*
|
|
101
|
+
* `textBoxTrim` makes the box the letters rather than the font's ascent and
|
|
102
|
+
* descent, so a label centres on what can be seen. That is what core's
|
|
103
|
+
* `labelContent` gives every label in the widget set.
|
|
104
|
+
*/
|
|
105
|
+
label: {
|
|
106
|
+
flexShrink: 1,
|
|
107
|
+
minWidth: 0,
|
|
108
|
+
textBoxTrim: 'cap-alphabetic',
|
|
109
|
+
},
|
|
110
|
+
subtree: { flexShrink: 0 },
|
|
111
|
+
spacer: { flexShrink: 0 },
|
|
112
|
+
});
|
|
113
|
+
/** A string or a number becomes a `<text>`; anything else is already a
|
|
114
|
+
* node. */
|
|
115
|
+
function labelNode(label, style) {
|
|
116
|
+
return typeof label === 'string' || typeof label === 'number'
|
|
117
|
+
? hx('text', { key: 'label', style }, String(label))
|
|
118
|
+
: label;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* `<Tree items />` — a disclosure tree.
|
|
122
|
+
*
|
|
123
|
+
* <Tree items={[{ id: 'src', label: 'src', children: [...] }]} />
|
|
124
|
+
*
|
|
125
|
+
* An item with a `children` array is a branch, **even when the array is
|
|
126
|
+
* empty** — that is how a directory shows a twisty before anything has read
|
|
127
|
+
* it. A branch whose children are not loaded at all says `branch: true`, and
|
|
128
|
+
* fills them in from `onExpandedChange`.
|
|
129
|
+
*
|
|
130
|
+
* Expansion and selection are each controlled (`expanded` + `onExpandedChange`,
|
|
131
|
+
* `selected` + `onSelect`) or uncontrolled (`defaultExpanded`,
|
|
132
|
+
* `defaultSelected`).
|
|
133
|
+
*
|
|
134
|
+
* The tree is a single tab stop. Up/Down walk the visible rows, Right expands
|
|
135
|
+
* a branch and then steps into it, Left collapses and then steps out to the
|
|
136
|
+
* parent, PageUp/PageDown move by a viewport, Home/End jump to the ends,
|
|
137
|
+
* Enter and Space activate, and typing letters jumps to a matching row — the
|
|
138
|
+
* same type-ahead core's `Select` and menus use.
|
|
139
|
+
*
|
|
140
|
+
* **The focus is on the tree, not on the row.** Core's tree focused each row
|
|
141
|
+
* node; a virtualized row is unmounted the moment it scrolls out of view and
|
|
142
|
+
* the focus would go with it, so the container is the focusable thing and the
|
|
143
|
+
* selection is the cursor. That is `Table`'s model, and the honest caveat is
|
|
144
|
+
* the one `Table` carries: while virtualizing, only the rendered rows are in
|
|
145
|
+
* the accessibility tree — the same rows a sighted user can see.
|
|
146
|
+
*
|
|
147
|
+
* **Selection is one row.** Multiple selection is not a prop because there is
|
|
148
|
+
* no version of it everybody agrees on (does Shift extend from the anchor or
|
|
149
|
+
* from the cursor? does Ctrl+click on a branch take its children?), and every
|
|
150
|
+
* such policy is expressible on top of what is here: hold the set yourself,
|
|
151
|
+
* pass `selected` for the cursor, and paint the rest from `styles.row`.
|
|
152
|
+
*/
|
|
153
|
+
export function Tree({ items = [], expanded, defaultExpanded, onExpandedChange, selected, defaultSelected, onSelect, onActivate, indent = INDENT, rowHeight = ROW_HEIGHT, estimatedRowHeight, virtual = 'auto', overscan = OVERSCAN, layout = 'flat', renderToggle, renderGuide, renderLabel, renderContent, renderSubtree, styles, style, ref,
|
|
154
|
+
// the accessors, pulled out so the rest can be spread onto the box
|
|
155
|
+
getId, getLabel, getText, getChildren, isBranch, isDisabled,
|
|
156
|
+
// ours to chain rather than to hand over: virtualization is measured
|
|
157
|
+
// through both of these
|
|
158
|
+
onScroll, onViewport, ...boxProps }) {
|
|
159
|
+
const theme = useTheme();
|
|
160
|
+
const rtl = useDirection() === 'rtl';
|
|
161
|
+
const [ownExpanded, setOwnExpanded] = useState(() => new Set(defaultExpanded));
|
|
162
|
+
const [ownSelected, setOwnSelected] = useState(defaultSelected ?? null);
|
|
163
|
+
const [view, setView] = useState({ top: 0, height: 0 });
|
|
164
|
+
// Bumped by a measurement pass that found a row taller or shorter than the
|
|
165
|
+
// index believed. It is the only reason the component re-renders for a
|
|
166
|
+
// measurement, and a pass that finds nothing new does not bump it, which is
|
|
167
|
+
// what makes measure → render → measure converge instead of spinning.
|
|
168
|
+
const [, setMeasured] = useState(0);
|
|
169
|
+
const typeAhead = useTypeAhead();
|
|
170
|
+
const scroller = useRef(null);
|
|
171
|
+
/** The rows on screen, by id — with the index each was drawn at, so a
|
|
172
|
+
* measurement pass does not have to search the row list for it. */
|
|
173
|
+
const rowNodes = useRef(new Map());
|
|
174
|
+
const estimate = estimatedRowHeight ?? rowHeight;
|
|
175
|
+
// `useState` for its lazy initializer rather than `useRef`: one index per
|
|
176
|
+
// mounted tree, built once. Nothing ever calls the setter — what it holds
|
|
177
|
+
// is mutable and its changes are announced through `setMeasured`.
|
|
178
|
+
const [heights] = useState(() => new RowHeights(estimate));
|
|
179
|
+
const accessors = useMemo(() => resolveAccessors({
|
|
180
|
+
getId,
|
|
181
|
+
getLabel,
|
|
182
|
+
getText,
|
|
183
|
+
getChildren,
|
|
184
|
+
isBranch,
|
|
185
|
+
isDisabled,
|
|
186
|
+
}), [getId, getLabel, getText, getChildren, isBranch, isDisabled]);
|
|
187
|
+
const openSet = useMemo(() => (expanded ? new Set(expanded) : ownExpanded), [expanded, ownExpanded]);
|
|
188
|
+
const current = selected === undefined ? ownSelected : selected;
|
|
189
|
+
const rows = useMemo(() => visibleRows(items, openSet, accessors), [items, openSet, accessors]);
|
|
190
|
+
// Held-down or fast keys arrive in a burst, and every handler in that burst
|
|
191
|
+
// sees the render it started from — so what is open and what is selected
|
|
192
|
+
// are mirrored here and updated the moment they change, or three Downs in a
|
|
193
|
+
// row all step off the same starting point.
|
|
194
|
+
const openRef = useRef(openSet);
|
|
195
|
+
openRef.current = openSet;
|
|
196
|
+
const currentRef = useRef(current);
|
|
197
|
+
currentRef.current = current;
|
|
198
|
+
const rowsRef = useRef(rows);
|
|
199
|
+
rowsRef.current = rows;
|
|
200
|
+
const itemsRef = useRef(items);
|
|
201
|
+
itemsRef.current = items;
|
|
202
|
+
const viewRef = useRef(view);
|
|
203
|
+
viewRef.current = view;
|
|
204
|
+
const virtualizing = layout === 'flat' &&
|
|
205
|
+
(virtual === true ||
|
|
206
|
+
(virtual === 'auto' && rows.length > VIRTUAL_THRESHOLD));
|
|
207
|
+
// The index is re-pointed at the rows about to be drawn before anything
|
|
208
|
+
// asks it where they are. `rows` is memoized, so this is an identity check
|
|
209
|
+
// on every render that did not change the tree.
|
|
210
|
+
const index = heights;
|
|
211
|
+
index.sync(rows, estimate);
|
|
212
|
+
// The slice worth building: what is on screen, plus a little either side.
|
|
213
|
+
// Which rows those are is a question for the height index now — with rows
|
|
214
|
+
// of different heights there is no division that answers it.
|
|
215
|
+
const first = virtualizing
|
|
216
|
+
? Math.max(0, index.indexAt(view.top) - overscan)
|
|
217
|
+
: 0;
|
|
218
|
+
let last = rows.length;
|
|
219
|
+
if (virtualizing) {
|
|
220
|
+
if (view.height > 0) {
|
|
221
|
+
last = Math.min(rows.length, index.indexAt(view.top + view.height) + 1 + overscan);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
// Before the first layout there is no viewport to measure against, and
|
|
225
|
+
// guessing "all of them" would put a hundred thousand rows in the tree
|
|
226
|
+
// for a frame.
|
|
227
|
+
last = Math.min(rows.length, first + ASSUMED_ROWS);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/** Where the slice starts, and how much of the list is below it — the two
|
|
231
|
+
* spacers that keep the scrollbar measuring the whole tree. */
|
|
232
|
+
const above = virtualizing ? index.offsetAt(first) : 0;
|
|
233
|
+
const below = virtualizing ? index.total() - index.offsetAt(last) : 0;
|
|
234
|
+
const setExpandedSet = useCallback((next, change) => {
|
|
235
|
+
openRef.current = next;
|
|
236
|
+
if (expanded === undefined)
|
|
237
|
+
setOwnExpanded(next);
|
|
238
|
+
onExpandedChange?.([...next], change);
|
|
239
|
+
}, [expanded, onExpandedChange]);
|
|
240
|
+
const toggleId = useCallback((id, item, open) => {
|
|
241
|
+
const next = new Set(openRef.current);
|
|
242
|
+
const shouldOpen = open ?? !next.has(id);
|
|
243
|
+
if (shouldOpen)
|
|
244
|
+
next.add(id);
|
|
245
|
+
else
|
|
246
|
+
next.delete(id);
|
|
247
|
+
setExpandedSet(next, { id, item, open: shouldOpen });
|
|
248
|
+
}, [setExpandedSet]);
|
|
249
|
+
/**
|
|
250
|
+
* Put a row in view.
|
|
251
|
+
*
|
|
252
|
+
* A mounted row can say where it is, and `scrollIntoView` then works
|
|
253
|
+
* whatever height it turned out to be — which is what a tree that is *not*
|
|
254
|
+
* virtualizing wants, since nothing has measured its rows. A row that is not
|
|
255
|
+
* mounted has no geometry to ask about, and while virtualizing that is the
|
|
256
|
+
* normal case, so the height index answers instead: where the row starts,
|
|
257
|
+
* and how tall it is or is estimated to be.
|
|
258
|
+
*/
|
|
259
|
+
const reveal = useCallback((at) => {
|
|
260
|
+
const box = scroller.current;
|
|
261
|
+
const row = rowsRef.current[at];
|
|
262
|
+
if (!box || !row)
|
|
263
|
+
return;
|
|
264
|
+
const drawn = rowNodes.current.get(row.id);
|
|
265
|
+
if (drawn) {
|
|
266
|
+
box.scrollIntoView(drawn.node);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const top = heights.offsetAt(at);
|
|
270
|
+
const rowH = heights.heightAt(at);
|
|
271
|
+
const height = viewRef.current.height;
|
|
272
|
+
if (top < box.scrollY)
|
|
273
|
+
box.scrollTo({ y: top });
|
|
274
|
+
else if (height > 0 && top + rowH > box.scrollY + height) {
|
|
275
|
+
box.scrollTo({ y: top + rowH - height });
|
|
276
|
+
}
|
|
277
|
+
}, []);
|
|
278
|
+
/**
|
|
279
|
+
* Read back what the rows on screen actually laid out at.
|
|
280
|
+
*
|
|
281
|
+
* The one thing that makes rows of different heights work, and the reason
|
|
282
|
+
* it is not simply "read the height in an effect": **layout runs after
|
|
283
|
+
* React's effects, on the frame flush**, so a `useEffect` sees the
|
|
284
|
+
* *previous* pass's geometry — zero, on the render that created the row.
|
|
285
|
+
* This runs a tick later, when `abs` is current.
|
|
286
|
+
*
|
|
287
|
+
* Idempotent by construction. A row whose measurement has not changed
|
|
288
|
+
* reports no change, so the second pass over the same rows costs a map walk
|
|
289
|
+
* and re-renders nothing, and measure → render → measure terminates.
|
|
290
|
+
*/
|
|
291
|
+
const measureRows = useCallback(() => {
|
|
292
|
+
if (!virtualizing)
|
|
293
|
+
return;
|
|
294
|
+
const box = scroller.current;
|
|
295
|
+
const rows = rowsRef.current;
|
|
296
|
+
const idx = heights;
|
|
297
|
+
// Rows above the top of the viewport are the ones that move the content
|
|
298
|
+
// under it, so their total change is what has to come back out of the
|
|
299
|
+
// scroll offset — otherwise measuring a row you have already scrolled
|
|
300
|
+
// past yanks the list under the pointer.
|
|
301
|
+
const anchor = box ? idx.indexAt(box.scrollY) : 0;
|
|
302
|
+
let shift = 0;
|
|
303
|
+
let changed = false;
|
|
304
|
+
for (const [id, { node, at }] of rowNodes.current) {
|
|
305
|
+
if (rows[at]?.id !== id)
|
|
306
|
+
continue; // drawn against a list that has moved
|
|
307
|
+
const height = node.abs.height;
|
|
308
|
+
const was = idx.heightAt(at);
|
|
309
|
+
if (!idx.measure(id, at, height))
|
|
310
|
+
continue;
|
|
311
|
+
changed = true;
|
|
312
|
+
if (at < anchor)
|
|
313
|
+
shift += height - was;
|
|
314
|
+
}
|
|
315
|
+
if (!changed)
|
|
316
|
+
return;
|
|
317
|
+
if (shift !== 0 && box) {
|
|
318
|
+
box.scrollTo({ y: Math.max(0, box.scrollY + shift) });
|
|
319
|
+
}
|
|
320
|
+
setMeasured((n) => n + 1);
|
|
321
|
+
}, [virtualizing]);
|
|
322
|
+
useEffect(() => {
|
|
323
|
+
if (!virtualizing)
|
|
324
|
+
return undefined;
|
|
325
|
+
const id = afterLayout(measureRows);
|
|
326
|
+
return () => cancelAfterLayout(id);
|
|
327
|
+
});
|
|
328
|
+
const goTo = useCallback((row) => {
|
|
329
|
+
if (!row)
|
|
330
|
+
return;
|
|
331
|
+
currentRef.current = row.id;
|
|
332
|
+
if (selected === undefined)
|
|
333
|
+
setOwnSelected(row.id);
|
|
334
|
+
onSelect?.(row.id, row.item);
|
|
335
|
+
reveal(row.index);
|
|
336
|
+
}, [selected, onSelect, reveal]);
|
|
337
|
+
const activate = useCallback((row) => {
|
|
338
|
+
if (row.branch)
|
|
339
|
+
toggleId(row.id, row.item);
|
|
340
|
+
onActivate?.(row.id, row.item);
|
|
341
|
+
}, [toggleId, onActivate]);
|
|
342
|
+
/** Returns whether the key was the tree's, so a control that forwards its
|
|
343
|
+
* keys here keeps the ones it did not use. */
|
|
344
|
+
const handleKey = useCallback((ev) => {
|
|
345
|
+
const rows = rowsRef.current;
|
|
346
|
+
if (!rows.length)
|
|
347
|
+
return false;
|
|
348
|
+
const index = rows.findIndex((r) => r.id === currentRef.current);
|
|
349
|
+
const row = rows[index];
|
|
350
|
+
const step = (delta) => {
|
|
351
|
+
for (let i = index + delta; i >= 0 && i < rows.length; i += delta) {
|
|
352
|
+
if (!rows[i].disabled)
|
|
353
|
+
return rows[i];
|
|
354
|
+
}
|
|
355
|
+
return null;
|
|
356
|
+
};
|
|
357
|
+
/** The nearest enabled row at or before `to`, walking `dir` if the
|
|
358
|
+
* landing row is disabled — what a page jump needs. */
|
|
359
|
+
const nearest = (to, dir) => {
|
|
360
|
+
const at = Math.max(0, Math.min(rows.length - 1, to));
|
|
361
|
+
for (let i = at; i >= 0 && i < rows.length; i += dir) {
|
|
362
|
+
if (!rows[i].disabled)
|
|
363
|
+
return rows[i];
|
|
364
|
+
}
|
|
365
|
+
return null;
|
|
366
|
+
};
|
|
367
|
+
// Deeper is the direction the indent grows in, which is the direction
|
|
368
|
+
// the text runs — so it is Left that opens a branch in a mirrored tree,
|
|
369
|
+
// and the two arrows swap wholesale rather than the tree growing a
|
|
370
|
+
// second set of cases.
|
|
371
|
+
const deeper = rtl ? XK_LEFT : XK_RIGHT;
|
|
372
|
+
const shallower = rtl ? XK_RIGHT : XK_LEFT;
|
|
373
|
+
/**
|
|
374
|
+
* How far a page key moves, in rows.
|
|
375
|
+
*
|
|
376
|
+
* A viewport's worth, which with rows of different heights is not a
|
|
377
|
+
* division: it is "where does the row `index` sits at end up if I add a
|
|
378
|
+
* viewport to its offset". One row of overlap is kept, the way every
|
|
379
|
+
* document viewer does, so a page down leaves a line of context.
|
|
380
|
+
*/
|
|
381
|
+
const pageFrom = (from, dir) => {
|
|
382
|
+
const idx = heights;
|
|
383
|
+
const viewport = viewRef.current.height;
|
|
384
|
+
if (viewport <= 0)
|
|
385
|
+
return from + dir;
|
|
386
|
+
const at = Math.max(0, Math.min(rows.length - 1, from));
|
|
387
|
+
const target = idx.offsetAt(at) + dir * Math.max(1, viewport - rowHeight);
|
|
388
|
+
const landed = idx.indexAt(Math.max(0, target));
|
|
389
|
+
// never stand still: a row taller than the viewport would otherwise
|
|
390
|
+
// make Page Down a no-op
|
|
391
|
+
return landed === at ? at + dir : landed;
|
|
392
|
+
};
|
|
393
|
+
switch (ev.keysym) {
|
|
394
|
+
case XK_UP:
|
|
395
|
+
goTo(step(-1));
|
|
396
|
+
return true;
|
|
397
|
+
case XK_DOWN:
|
|
398
|
+
goTo(step(1));
|
|
399
|
+
return true;
|
|
400
|
+
case XK_PAGE_UP:
|
|
401
|
+
goTo(nearest(index < 0 ? 0 : pageFrom(index, -1), 1));
|
|
402
|
+
return true;
|
|
403
|
+
case XK_PAGE_DOWN:
|
|
404
|
+
goTo(nearest(index < 0 ? pageFrom(0, 1) : pageFrom(index, 1), -1));
|
|
405
|
+
return true;
|
|
406
|
+
case deeper:
|
|
407
|
+
// open it, then walk into it — one key does both, in order
|
|
408
|
+
if (row?.branch && !row.open)
|
|
409
|
+
toggleId(row.id, row.item, true);
|
|
410
|
+
else if (row?.branch)
|
|
411
|
+
goTo(step(1));
|
|
412
|
+
return true;
|
|
413
|
+
case shallower:
|
|
414
|
+
if (row?.branch && row.open)
|
|
415
|
+
toggleId(row.id, row.item, false);
|
|
416
|
+
else if (row?.parent)
|
|
417
|
+
goTo(row.parent);
|
|
418
|
+
return true;
|
|
419
|
+
case XK_HOME:
|
|
420
|
+
goTo(rows.find((r) => !r.disabled));
|
|
421
|
+
return true;
|
|
422
|
+
case XK_END:
|
|
423
|
+
goTo([...rows].reverse().find((r) => !r.disabled));
|
|
424
|
+
return true;
|
|
425
|
+
case XK_RETURN:
|
|
426
|
+
if (row)
|
|
427
|
+
activate(row);
|
|
428
|
+
return true;
|
|
429
|
+
default:
|
|
430
|
+
break;
|
|
431
|
+
}
|
|
432
|
+
if (ev.codepoint === 32) {
|
|
433
|
+
if (row)
|
|
434
|
+
activate(row);
|
|
435
|
+
return true;
|
|
436
|
+
}
|
|
437
|
+
const char = typeAheadChar(ev);
|
|
438
|
+
if (!char)
|
|
439
|
+
return false;
|
|
440
|
+
const found = typeAhead(char, rows, index < 0 ? null : index, (r) => accessors.getText(r.item), (r) => !r.disabled);
|
|
441
|
+
if (found >= 0)
|
|
442
|
+
goTo(rows[found]);
|
|
443
|
+
return found >= 0;
|
|
444
|
+
}, [rtl, rowHeight, goTo, toggleId, activate, typeAhead, accessors]);
|
|
445
|
+
useImperativeHandle(ref, () => ({
|
|
446
|
+
focus: () => {
|
|
447
|
+
scroller.current?.focus();
|
|
448
|
+
},
|
|
449
|
+
select: (id) => {
|
|
450
|
+
const row = rowsRef.current.find((r) => r.id === id);
|
|
451
|
+
if (row)
|
|
452
|
+
goTo(row);
|
|
453
|
+
else if (id === null) {
|
|
454
|
+
currentRef.current = null;
|
|
455
|
+
if (selected === undefined)
|
|
456
|
+
setOwnSelected(null);
|
|
457
|
+
}
|
|
458
|
+
},
|
|
459
|
+
setExpanded: (id, open) => {
|
|
460
|
+
// An id nobody can see is still legitimately expandable — a lazy load
|
|
461
|
+
// finishing under a branch the user collapsed again, say — so the
|
|
462
|
+
// whole tree is searched rather than the rows on screen.
|
|
463
|
+
//
|
|
464
|
+
// An id that is in neither is a no-op, and that is the point: the
|
|
465
|
+
// change this reports carries the item, `TreeExpandChange<T>.item` is
|
|
466
|
+
// `T`, and an id nothing answers to has no item to put there. Doing
|
|
467
|
+
// nothing beats reporting an expansion of `undefined`.
|
|
468
|
+
const item = rowsRef.current.find((r) => r.id === id)?.item ??
|
|
469
|
+
findItem(itemsRef.current, id, accessors);
|
|
470
|
+
if (item === undefined)
|
|
471
|
+
return false;
|
|
472
|
+
toggleId(id, item, open);
|
|
473
|
+
return true;
|
|
474
|
+
},
|
|
475
|
+
scrollToItem: (id) => {
|
|
476
|
+
const row = rowsRef.current.find((r) => r.id === id);
|
|
477
|
+
if (!row)
|
|
478
|
+
return false;
|
|
479
|
+
reveal(row.index);
|
|
480
|
+
return true;
|
|
481
|
+
},
|
|
482
|
+
handleKey,
|
|
483
|
+
rows: () => rowsRef.current,
|
|
484
|
+
}), [goTo, toggleId, reveal, handleKey, selected, accessors]);
|
|
485
|
+
// --- rendering -----------------------------------------------------------
|
|
486
|
+
const rowStyleProp = styles?.row;
|
|
487
|
+
const guideStyleProp = styles?.guide;
|
|
488
|
+
const renderOneRow = (row) => {
|
|
489
|
+
const isSelected = row.id === current;
|
|
490
|
+
const color = row.disabled
|
|
491
|
+
? theme.textMuted
|
|
492
|
+
: isSelected
|
|
493
|
+
? theme.hoverText
|
|
494
|
+
: theme.text;
|
|
495
|
+
const state = {
|
|
496
|
+
...row,
|
|
497
|
+
selected: isSelected,
|
|
498
|
+
color,
|
|
499
|
+
toggle: (open) => toggleId(row.id, row.item, open),
|
|
500
|
+
select: () => goTo(row),
|
|
501
|
+
};
|
|
502
|
+
const content = [];
|
|
503
|
+
// The indent. With no guide seam it is one padding value rather than
|
|
504
|
+
// `depth` empty boxes — a tree ten deep would otherwise build ten nodes
|
|
505
|
+
// per row to draw nothing.
|
|
506
|
+
if (renderGuide && row.depth > 0) {
|
|
507
|
+
const edges = branchEdges(row);
|
|
508
|
+
for (let level = 0; level < row.depth; level++) {
|
|
509
|
+
const guide = {
|
|
510
|
+
row: state,
|
|
511
|
+
level,
|
|
512
|
+
continues: edges[level],
|
|
513
|
+
own: level === row.depth - 1,
|
|
514
|
+
width: indent,
|
|
515
|
+
height: rowHeight,
|
|
516
|
+
};
|
|
517
|
+
content.push(hx('box', {
|
|
518
|
+
key: `guide${level}`,
|
|
519
|
+
style: [
|
|
520
|
+
s.guide,
|
|
521
|
+
{ width: indent },
|
|
522
|
+
typeof guideStyleProp === 'function'
|
|
523
|
+
? guideStyleProp(guide)
|
|
524
|
+
: guideStyleProp,
|
|
525
|
+
],
|
|
526
|
+
}, renderGuide(guide)));
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
const toggleState = { ...state, size: TWISTY_GLYPH };
|
|
530
|
+
content.push(hx('box', {
|
|
531
|
+
key: 'toggle',
|
|
532
|
+
style: [s.twisty, styles?.toggle],
|
|
533
|
+
// The twisty is its own hit target: clicking it opens the branch
|
|
534
|
+
// without moving the selection, the way a file browser lets you
|
|
535
|
+
// peek inside a folder you have not chosen.
|
|
536
|
+
onClick: row.branch
|
|
537
|
+
? (ev) => {
|
|
538
|
+
ev.stopPropagation();
|
|
539
|
+
toggleId(row.id, row.item);
|
|
540
|
+
}
|
|
541
|
+
: undefined,
|
|
542
|
+
}, renderToggle
|
|
543
|
+
? renderToggle(toggleState)
|
|
544
|
+
: row.branch
|
|
545
|
+
? React.createElement(Icon, {
|
|
546
|
+
name: row.open
|
|
547
|
+
? 'chevronDown'
|
|
548
|
+
: rtl
|
|
549
|
+
? 'chevronLeft'
|
|
550
|
+
: 'chevronRight',
|
|
551
|
+
size: TWISTY_GLYPH,
|
|
552
|
+
// dimmer than the label on a resting row, and the row's own
|
|
553
|
+
// ink once it is selected
|
|
554
|
+
style: isSelected ? undefined : { color: theme.textMuted },
|
|
555
|
+
})
|
|
556
|
+
: null));
|
|
557
|
+
content.push(renderLabel
|
|
558
|
+
? // Keyed here rather than by the app, for the reason `renderSubtree`
|
|
559
|
+
// is: the label sits in an array beside the guides and the twisty,
|
|
560
|
+
// and "add a key to the box you return" is not something a render
|
|
561
|
+
// prop should have to know.
|
|
562
|
+
React.createElement(React.Fragment, { key: 'label' }, renderLabel(state))
|
|
563
|
+
: labelNode(accessors.getLabel(row.item), [s.label, styles?.label]));
|
|
564
|
+
return hx('box', {
|
|
565
|
+
key: String(row.id),
|
|
566
|
+
role: 'treeitem',
|
|
567
|
+
'aria-level': row.depth + 1,
|
|
568
|
+
'aria-selected': isSelected,
|
|
569
|
+
'aria-expanded': row.branch ? row.open : undefined,
|
|
570
|
+
'aria-posinset': row.posInSet,
|
|
571
|
+
'aria-setsize': row.setSize,
|
|
572
|
+
// `disabled` rather than `aria-disabled`: on a react-x11 node it is
|
|
573
|
+
// the real thing — it clears the AT-SPI ENABLED/SENSITIVE states and
|
|
574
|
+
// selects the `:disabled` style block — and there is no aria spelling
|
|
575
|
+
// of it to write instead.
|
|
576
|
+
disabled: row.disabled || undefined,
|
|
577
|
+
// The index the row was drawn at travels with the node, so measuring
|
|
578
|
+
// does not have to search a hundred thousand rows for where it is.
|
|
579
|
+
// It can go stale — the rows may move before the tick that measures —
|
|
580
|
+
// and both this and the height index check it rather than trust it.
|
|
581
|
+
ref: (node) => {
|
|
582
|
+
if (node)
|
|
583
|
+
rowNodes.current.set(row.id, { node, at: row.index });
|
|
584
|
+
else
|
|
585
|
+
rowNodes.current.delete(row.id);
|
|
586
|
+
},
|
|
587
|
+
onClick: (ev) => {
|
|
588
|
+
if (row.disabled)
|
|
589
|
+
return;
|
|
590
|
+
goTo(row);
|
|
591
|
+
// Select on the first click, open on the second — the gesture every
|
|
592
|
+
// file list has. `detail` is the click count the renderer already
|
|
593
|
+
// counts for text selection.
|
|
594
|
+
if (ev.detail === 2)
|
|
595
|
+
activate(row);
|
|
596
|
+
},
|
|
597
|
+
style: [
|
|
598
|
+
s.row,
|
|
599
|
+
// A floor, not a height. The row grows to whatever its content
|
|
600
|
+
// needs — a wrapped label, two lines, a thumbnail — and the height
|
|
601
|
+
// index reads back what it actually became.
|
|
602
|
+
{ minHeight: rowHeight },
|
|
603
|
+
// The indent is what says "inside", so it is measured from the edge
|
|
604
|
+
// the row's label begins at.
|
|
605
|
+
{ paddingStart: renderGuide ? 4 : 4 + row.depth * indent },
|
|
606
|
+
{
|
|
607
|
+
backgroundColor: isSelected ? theme.hoverBackground : 'transparent',
|
|
608
|
+
// The row's ink, said once: `color` inherits, so the label takes
|
|
609
|
+
// it without being handed it.
|
|
610
|
+
color,
|
|
611
|
+
},
|
|
612
|
+
!row.disabled && {
|
|
613
|
+
':hover': {
|
|
614
|
+
backgroundColor: isSelected
|
|
615
|
+
? theme.hoverBackground
|
|
616
|
+
: theme.surfaceHover,
|
|
617
|
+
},
|
|
618
|
+
// The selection only moves on the release, and `:active` marks
|
|
619
|
+
// the whole press chain, so a press on the label or the twisty
|
|
620
|
+
// still darkens the row it is in.
|
|
621
|
+
':active': {
|
|
622
|
+
backgroundColor: isSelected
|
|
623
|
+
? theme.accentActive
|
|
624
|
+
: theme.surfaceActive,
|
|
625
|
+
},
|
|
626
|
+
},
|
|
627
|
+
typeof rowStyleProp === 'function'
|
|
628
|
+
? rowStyleProp(state)
|
|
629
|
+
: rowStyleProp,
|
|
630
|
+
],
|
|
631
|
+
}, renderContent ? renderContent(state, content) : content);
|
|
632
|
+
};
|
|
633
|
+
/** `layout="nested"`: the same rows, wrapped group by group. */
|
|
634
|
+
const renderGroup = (group, key) => {
|
|
635
|
+
const children = group.rows.map((node, i) => isGroup(node) ? renderGroup(node, `${key}.${i}`) : renderOneRow(node));
|
|
636
|
+
if (!group.parent)
|
|
637
|
+
return children;
|
|
638
|
+
const state = {
|
|
639
|
+
parent: group.parent,
|
|
640
|
+
depth: group.parent.depth + 1,
|
|
641
|
+
};
|
|
642
|
+
// The key is this component's either way, and a fragment is how a seam
|
|
643
|
+
// gets one without being told to write it. A `renderSubtree` that had to
|
|
644
|
+
// remember a key would get it wrong the obvious way — keying on the
|
|
645
|
+
// parent id, which is already the key of the parent *row* beside it.
|
|
646
|
+
if (renderSubtree) {
|
|
647
|
+
return React.createElement(React.Fragment, { key: `subtree:${group.parent.id}` }, renderSubtree(state, children));
|
|
648
|
+
}
|
|
649
|
+
return hx('box', {
|
|
650
|
+
key: `subtree:${group.parent.id}`,
|
|
651
|
+
role: 'group',
|
|
652
|
+
style: [s.subtree, styles?.subtree],
|
|
653
|
+
}, children);
|
|
654
|
+
};
|
|
655
|
+
const body = [];
|
|
656
|
+
if (layout === 'nested') {
|
|
657
|
+
body.push(renderGroup(groupRows(rows), 'root'));
|
|
658
|
+
}
|
|
659
|
+
else {
|
|
660
|
+
if (virtualizing && first > 0) {
|
|
661
|
+
body.push(hx('box', {
|
|
662
|
+
key: 'spacer:before',
|
|
663
|
+
style: [s.spacer, { height: above }],
|
|
664
|
+
}));
|
|
665
|
+
}
|
|
666
|
+
for (let i = first; i < last; i++)
|
|
667
|
+
body.push(renderOneRow(rows[i]));
|
|
668
|
+
if (virtualizing && last < rows.length) {
|
|
669
|
+
body.push(hx('box', {
|
|
670
|
+
key: 'spacer:after',
|
|
671
|
+
style: [s.spacer, { height: below }],
|
|
672
|
+
}));
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
return hx('box', {
|
|
676
|
+
theme,
|
|
677
|
+
role: 'tree',
|
|
678
|
+
// The tree takes the focus, not the row — see the doc comment.
|
|
679
|
+
focusable: true,
|
|
680
|
+
...boxProps,
|
|
681
|
+
ref: scroller,
|
|
682
|
+
style: [s.root, style],
|
|
683
|
+
/**
|
|
684
|
+
* `preventDefault` is the load-bearing half.
|
|
685
|
+
*
|
|
686
|
+
* The tree's root is a scroll container **and** the focused node, and a
|
|
687
|
+
* focused scroller has default key actions of its own: Down and Up
|
|
688
|
+
* scroll by a wheel notch, the Page keys by a viewport, Home and End to
|
|
689
|
+
* the ends, Space by a page. Without this, every arrow did both — moved
|
|
690
|
+
* the selection *and* scrolled the list under it — which reads as the
|
|
691
|
+
* tree scrolling whenever you use the keyboard rather than only when
|
|
692
|
+
* the selection would otherwise leave the viewport.
|
|
693
|
+
*
|
|
694
|
+
* `handleKey` reports whether the tree took the key, so a key it did
|
|
695
|
+
* not take (a letter that matched nothing) still gets the default.
|
|
696
|
+
*/
|
|
697
|
+
onKeyDown: (ev) => {
|
|
698
|
+
if (handleKey(ev))
|
|
699
|
+
ev.preventDefault();
|
|
700
|
+
},
|
|
701
|
+
// Layout, not scrolling, is what first tells a list how much of it is
|
|
702
|
+
// worth building — and it is also where a page key gets its distance,
|
|
703
|
+
// so this is measured whether or not the tree virtualizes.
|
|
704
|
+
onViewport: (ev) => {
|
|
705
|
+
setView((prev) => prev.height === ev.height ? prev : { ...prev, height: ev.height });
|
|
706
|
+
onViewport?.(ev);
|
|
707
|
+
},
|
|
708
|
+
onScroll: (ev) => {
|
|
709
|
+
if (virtualizing) {
|
|
710
|
+
setView((prev) => prev.top === ev.scrollY ? prev : { ...prev, top: ev.scrollY });
|
|
711
|
+
}
|
|
712
|
+
onScroll?.(ev);
|
|
713
|
+
},
|
|
714
|
+
}, body);
|
|
715
|
+
}
|
|
716
|
+
//# sourceMappingURL=index.js.map
|