@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,378 @@
|
|
|
1
|
+
// <MediaPlayer> — mpv or VLC, drawing into an element.
|
|
2
|
+
//
|
|
3
|
+
// The second XEmbed wrapper, and mechanically the same component as
|
|
4
|
+
// `../terminal/`: a `<foreign>` with no `windowId` adopts whatever is put
|
|
5
|
+
// inside it, the id `onReady` hands over is passed to the player as
|
|
6
|
+
// `--wid=…`, and `../embed/` owns everything about starting, watching and
|
|
7
|
+
// handing back the process.
|
|
8
|
+
//
|
|
9
|
+
// What makes it more than a surface is the control channel. mpv's JSON IPC
|
|
10
|
+
// socket turns `volume`, `paused` and `seek()` into real commands and pushes
|
|
11
|
+
// position back as it changes, so `src` can be swapped inside a running
|
|
12
|
+
// player rather than by respawning one. `./backends.ts` is where that and
|
|
13
|
+
// VLC's much narrower rc interface are reconciled.
|
|
14
|
+
//
|
|
15
|
+
// Registers no element: `<foreign>` is a built-in. Nothing here happens at
|
|
16
|
+
// import time.
|
|
17
|
+
//
|
|
18
|
+
// ### Controls
|
|
19
|
+
//
|
|
20
|
+
// There are none drawn, on purpose. The player's window stacks above
|
|
21
|
+
// everything drawn in ours — the same rule `<glarea>` has — so a transport bar
|
|
22
|
+
// laid over the video cannot be a sibling `<box>`; it has to be a `<popup>`,
|
|
23
|
+
// which is a placement and dismissal problem an app is better placed to solve
|
|
24
|
+
// than a component is. What this exposes instead is the whole of the state a
|
|
25
|
+
// transport bar needs (`onProgress`, `onPlayingChange`, the handle) plus
|
|
26
|
+
// `osd` for the player's own overlay when a quick one will do.
|
|
27
|
+
import React, {
|
|
28
|
+
useCallback,
|
|
29
|
+
useEffect,
|
|
30
|
+
useMemo,
|
|
31
|
+
useRef,
|
|
32
|
+
useState,
|
|
33
|
+
} from 'react';
|
|
34
|
+
import type { ReactElement, ReactNode, Ref } from 'react';
|
|
35
|
+
import { useTheme } from 'react-x11';
|
|
36
|
+
import type { ForeignProps } from 'react-x11';
|
|
37
|
+
import type { Style } from 'react-x11/style';
|
|
38
|
+
|
|
39
|
+
import {
|
|
40
|
+
BackendUnavailableError,
|
|
41
|
+
resolveBackend,
|
|
42
|
+
useEmbeddedClient,
|
|
43
|
+
} from '../embed/index.js';
|
|
44
|
+
import type {
|
|
45
|
+
EmbedStatus,
|
|
46
|
+
ExitInfo,
|
|
47
|
+
LaunchPlan,
|
|
48
|
+
PlanContext,
|
|
49
|
+
ProcessHost,
|
|
50
|
+
} from '../embed/index.js';
|
|
51
|
+
import { mediaBackendsFor } from './backends.js';
|
|
52
|
+
import type { MediaBackendName, MediaLaunch } from './backends.js';
|
|
53
|
+
import type { PlayerControl } from './control.js';
|
|
54
|
+
import { hx } from './hx.js';
|
|
55
|
+
|
|
56
|
+
export { MEDIA_BACKENDS, mediaBackendsFor, mpv, vlc } from './backends.js';
|
|
57
|
+
export type {
|
|
58
|
+
MediaBackend,
|
|
59
|
+
MediaBackendName,
|
|
60
|
+
MediaLaunch,
|
|
61
|
+
} from './backends.js';
|
|
62
|
+
export type { PlayerControl, PlayerEvents } from './control.js';
|
|
63
|
+
|
|
64
|
+
const h = React.createElement;
|
|
65
|
+
|
|
66
|
+
/** `<foreign>`'s props as `hx` takes them. */
|
|
67
|
+
type ForeignElementProps = Omit<ForeignProps, 'theme'>;
|
|
68
|
+
|
|
69
|
+
/** Where playback is. */
|
|
70
|
+
export interface MediaProgress {
|
|
71
|
+
/** Seconds from the start. */
|
|
72
|
+
position: number;
|
|
73
|
+
/** Seconds, or 0 before the player knows. */
|
|
74
|
+
duration: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** What a `ref` on `<MediaPlayer>` gets. */
|
|
78
|
+
export interface MediaPlayerHandle {
|
|
79
|
+
play(): void;
|
|
80
|
+
pause(): void;
|
|
81
|
+
/** Absolute position, in seconds. */
|
|
82
|
+
seek(seconds: number): void;
|
|
83
|
+
/** 0–1. */
|
|
84
|
+
setVolume(volume: number): void;
|
|
85
|
+
/** Stop playback without stopping the player: the window stays, idle. */
|
|
86
|
+
stop(): void;
|
|
87
|
+
/** Stop the player process and start a new one. */
|
|
88
|
+
restart(): void;
|
|
89
|
+
signal(signal?: string): boolean;
|
|
90
|
+
readonly pid: number | null;
|
|
91
|
+
readonly windowId: number | null;
|
|
92
|
+
readonly backend: string | null;
|
|
93
|
+
readonly status: EmbedStatus;
|
|
94
|
+
/** False under VLC — see `./vlc.ts`. `onProgress` never fires then. */
|
|
95
|
+
readonly reportsProgress: boolean;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface MediaPlayerProps {
|
|
99
|
+
/**
|
|
100
|
+
* A path or a URL. **Changing it does not restart the player** — the new
|
|
101
|
+
* source is loaded into the running one, so the window never blinks.
|
|
102
|
+
*/
|
|
103
|
+
src?: string;
|
|
104
|
+
/** Which player. Default `'auto'`: mpv if it is installed, else VLC. */
|
|
105
|
+
backend?: MediaBackendName;
|
|
106
|
+
/** Start playing. Default true. */
|
|
107
|
+
autoPlay?: boolean;
|
|
108
|
+
/**
|
|
109
|
+
* Pause state, if you want to drive it. Leave it out and the player is
|
|
110
|
+
* uncontrolled — `autoPlay` decides how it starts and the handle's
|
|
111
|
+
* `play()`/`pause()` move it from there.
|
|
112
|
+
*/
|
|
113
|
+
paused?: boolean;
|
|
114
|
+
/** 0–1. Default: the player's own. */
|
|
115
|
+
volume?: number;
|
|
116
|
+
muted?: boolean;
|
|
117
|
+
/** `'16:9'`, `'4:3'`. The player letterboxes inside the element's rect. */
|
|
118
|
+
aspectRatio?: string;
|
|
119
|
+
loop?: boolean;
|
|
120
|
+
/** The player's own on-screen controls. Off by default: they are drawn by
|
|
121
|
+
* the player and will not match the app's theme. */
|
|
122
|
+
osd?: boolean;
|
|
123
|
+
/** Appended to the player's command line verbatim. */
|
|
124
|
+
extraArgs?: readonly string[];
|
|
125
|
+
/** Position and duration, as the player reports them. mpv only. */
|
|
126
|
+
onProgress?: (progress: MediaProgress) => void;
|
|
127
|
+
/** The file reached its end. Not fired for `stop()` or a new `src`. */
|
|
128
|
+
onEnded?: (info: { node: unknown }) => void;
|
|
129
|
+
onPlayingChange?: (playing: boolean) => void;
|
|
130
|
+
/** The player process ended. */
|
|
131
|
+
onExit?: (info: ExitInfo) => void;
|
|
132
|
+
/** Spawn failures, control-channel failures, and the
|
|
133
|
+
* `BackendUnavailableError` for a machine with neither player installed. */
|
|
134
|
+
onError?: (err: Error) => void;
|
|
135
|
+
/** Rendered instead of the surface when no backend is installed. */
|
|
136
|
+
fallback?: ReactNode;
|
|
137
|
+
/** False holds off spawning entirely. */
|
|
138
|
+
enabled?: boolean;
|
|
139
|
+
/** Sent on unmount and restart. Default `SIGTERM`. */
|
|
140
|
+
stopSignal?: string;
|
|
141
|
+
/** Where the process runs. Defaults to this machine, through node. */
|
|
142
|
+
processes?: ProcessHost;
|
|
143
|
+
/** A video surface is not a control; default false, unlike `<Terminal>`. */
|
|
144
|
+
focusable?: boolean;
|
|
145
|
+
style?: Style | Style[];
|
|
146
|
+
ref?: Ref<MediaPlayerHandle>;
|
|
147
|
+
'data-testname'?: string;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* A video surface.
|
|
152
|
+
*
|
|
153
|
+
* ```jsx
|
|
154
|
+
* <MediaPlayer
|
|
155
|
+
* src={file}
|
|
156
|
+
* aspectRatio="16:9"
|
|
157
|
+
* volume={0.8}
|
|
158
|
+
* style={{ flexGrow: 1 }}
|
|
159
|
+
* onProgress={({ position, duration }) => setScrub(position / duration)}
|
|
160
|
+
* onEnded={next}
|
|
161
|
+
* fallback={<text>Install mpv to play video.</text>}
|
|
162
|
+
* />
|
|
163
|
+
* ```
|
|
164
|
+
*
|
|
165
|
+
* The player's window stacks above everything drawn in this one, so nothing 2D
|
|
166
|
+
* can overlap it — see "Controls" at the top of this file.
|
|
167
|
+
*/
|
|
168
|
+
export function MediaPlayer(props: MediaPlayerProps): ReactElement {
|
|
169
|
+
const {
|
|
170
|
+
backend = 'auto',
|
|
171
|
+
enabled = true,
|
|
172
|
+
focusable,
|
|
173
|
+
processes,
|
|
174
|
+
stopSignal,
|
|
175
|
+
} = props;
|
|
176
|
+
const theme = useTheme() as unknown as Record<string, unknown>;
|
|
177
|
+
|
|
178
|
+
const control = useRef<PlayerControl | null>(null);
|
|
179
|
+
// Bumped when a control channel opens or closes. The prop-syncing effects
|
|
180
|
+
// below depend on it, which is what makes "apply `volume` once there is
|
|
181
|
+
// something to apply it to" a dependency rather than a retry.
|
|
182
|
+
const [channel, setChannel] = useState(0);
|
|
183
|
+
// What the player was launched with, so a `src` that has not changed is not
|
|
184
|
+
// loaded a second time over the top of itself.
|
|
185
|
+
const loaded = useRef<string | undefined>(undefined);
|
|
186
|
+
|
|
187
|
+
// Read through a ref so that the plan's identity — which is the restart
|
|
188
|
+
// signal — depends only on the launch key below.
|
|
189
|
+
const latest = useRef(props);
|
|
190
|
+
latest.current = props;
|
|
191
|
+
|
|
192
|
+
// Only the props that cannot be changed in a running player. `src`,
|
|
193
|
+
// `volume`, `muted` and `paused` are all live commands, so they are
|
|
194
|
+
// deliberately absent: including them would respawn the process for a
|
|
195
|
+
// volume slider.
|
|
196
|
+
const key = useMemo(
|
|
197
|
+
() =>
|
|
198
|
+
JSON.stringify([
|
|
199
|
+
backend,
|
|
200
|
+
props.aspectRatio ?? null,
|
|
201
|
+
props.loop ?? false,
|
|
202
|
+
props.osd ?? false,
|
|
203
|
+
props.extraArgs ?? null,
|
|
204
|
+
]),
|
|
205
|
+
[backend, props.aspectRatio, props.loop, props.osd, props.extraArgs],
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
const plan = useMemo(
|
|
209
|
+
() =>
|
|
210
|
+
async ({ windowId, host }: PlanContext): Promise<LaunchPlan> => {
|
|
211
|
+
const candidates = mediaBackendsFor(backend);
|
|
212
|
+
if (candidates.length === 0) {
|
|
213
|
+
throw new BackendUnavailableError('media player', [backend]);
|
|
214
|
+
}
|
|
215
|
+
const chosen = await resolveBackend(host, 'media player', candidates);
|
|
216
|
+
const scratch = await host.socketPath(
|
|
217
|
+
`react-x11-${chosen.backend.name}`,
|
|
218
|
+
);
|
|
219
|
+
const current = latest.current;
|
|
220
|
+
const launch: MediaLaunch = {
|
|
221
|
+
windowId,
|
|
222
|
+
controlPath: scratch.path,
|
|
223
|
+
src: current.src,
|
|
224
|
+
autoPlay: current.autoPlay ?? true,
|
|
225
|
+
volume: current.volume,
|
|
226
|
+
muted: current.muted,
|
|
227
|
+
aspectRatio: current.aspectRatio,
|
|
228
|
+
loop: current.loop,
|
|
229
|
+
osd: current.osd,
|
|
230
|
+
extraArgs: current.extraArgs,
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
return {
|
|
234
|
+
command: chosen.path,
|
|
235
|
+
args: chosen.backend.args(launch),
|
|
236
|
+
backend: chosen.backend.name,
|
|
237
|
+
async attach() {
|
|
238
|
+
const events = {
|
|
239
|
+
onProgress: (progress: MediaProgress) =>
|
|
240
|
+
latest.current.onProgress?.(progress),
|
|
241
|
+
onPlayingChange: (playing: boolean) =>
|
|
242
|
+
latest.current.onPlayingChange?.(playing),
|
|
243
|
+
onEnded: () => latest.current.onEnded?.({ node: null }),
|
|
244
|
+
onError: (err: Error) => latest.current.onError?.(err),
|
|
245
|
+
};
|
|
246
|
+
const opened = await chosen.backend.connect(
|
|
247
|
+
host,
|
|
248
|
+
scratch.path,
|
|
249
|
+
events,
|
|
250
|
+
launch,
|
|
251
|
+
);
|
|
252
|
+
control.current = opened;
|
|
253
|
+
loaded.current = launch.src;
|
|
254
|
+
setChannel((n) => n + 1);
|
|
255
|
+
return () => {
|
|
256
|
+
control.current = null;
|
|
257
|
+
loaded.current = undefined;
|
|
258
|
+
opened.dispose();
|
|
259
|
+
setChannel((n) => n + 1);
|
|
260
|
+
};
|
|
261
|
+
},
|
|
262
|
+
dispose: () => scratch.dispose(),
|
|
263
|
+
};
|
|
264
|
+
},
|
|
265
|
+
[backend, key],
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
const client = useEmbeddedClient({
|
|
269
|
+
plan,
|
|
270
|
+
host: processes,
|
|
271
|
+
enabled,
|
|
272
|
+
stopSignal,
|
|
273
|
+
onExit: props.onExit,
|
|
274
|
+
onError: props.onError,
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
// --- props the control channel applies to a running player ---------------
|
|
278
|
+
|
|
279
|
+
const { src, volume, muted, paused } = props;
|
|
280
|
+
|
|
281
|
+
useEffect(() => {
|
|
282
|
+
if (!control.current || src === undefined) return;
|
|
283
|
+
if (src === loaded.current) return;
|
|
284
|
+
loaded.current = src;
|
|
285
|
+
control.current.load(src);
|
|
286
|
+
}, [src, channel]);
|
|
287
|
+
|
|
288
|
+
useEffect(() => {
|
|
289
|
+
if (!control.current || volume === undefined) return;
|
|
290
|
+
control.current.setVolume(volume);
|
|
291
|
+
}, [volume, channel]);
|
|
292
|
+
|
|
293
|
+
useEffect(() => {
|
|
294
|
+
if (!control.current || muted === undefined) return;
|
|
295
|
+
control.current.setMuted(muted);
|
|
296
|
+
}, [muted, channel]);
|
|
297
|
+
|
|
298
|
+
useEffect(() => {
|
|
299
|
+
if (!control.current || paused === undefined) return;
|
|
300
|
+
control.current.setPaused(paused);
|
|
301
|
+
}, [paused, channel]);
|
|
302
|
+
|
|
303
|
+
// --- the handle ---------------------------------------------------------
|
|
304
|
+
|
|
305
|
+
const reportsProgress = useMemo(() => {
|
|
306
|
+
const [chosen] = mediaBackendsFor(backend).filter(
|
|
307
|
+
(b) => b.name === client.backend,
|
|
308
|
+
);
|
|
309
|
+
return chosen?.reportsProgress ?? false;
|
|
310
|
+
}, [backend, client.backend]);
|
|
311
|
+
|
|
312
|
+
const noop = useCallback(() => {}, []);
|
|
313
|
+
|
|
314
|
+
React.useImperativeHandle(
|
|
315
|
+
props.ref,
|
|
316
|
+
() => ({
|
|
317
|
+
play: () => control.current?.setPaused(false) ?? noop(),
|
|
318
|
+
pause: () => control.current?.setPaused(true) ?? noop(),
|
|
319
|
+
seek: (seconds: number) => control.current?.seek(seconds) ?? noop(),
|
|
320
|
+
setVolume: (value: number) => control.current?.setVolume(value) ?? noop(),
|
|
321
|
+
stop: () => control.current?.stop() ?? noop(),
|
|
322
|
+
restart: client.restart,
|
|
323
|
+
signal: client.signal,
|
|
324
|
+
get pid() {
|
|
325
|
+
return client.pid;
|
|
326
|
+
},
|
|
327
|
+
get windowId() {
|
|
328
|
+
return client.windowId;
|
|
329
|
+
},
|
|
330
|
+
get backend() {
|
|
331
|
+
return client.backend;
|
|
332
|
+
},
|
|
333
|
+
get status() {
|
|
334
|
+
return client.status;
|
|
335
|
+
},
|
|
336
|
+
get reportsProgress() {
|
|
337
|
+
return reportsProgress;
|
|
338
|
+
},
|
|
339
|
+
}),
|
|
340
|
+
[client, noop, reportsProgress],
|
|
341
|
+
);
|
|
342
|
+
|
|
343
|
+
// Black rather than the theme background: this is a video surface, and what
|
|
344
|
+
// shows around a letterboxed frame should be what a player would put there.
|
|
345
|
+
const style: Style = {
|
|
346
|
+
flexGrow: 1,
|
|
347
|
+
backgroundColor: String(theme.videoBackground ?? '#000000'),
|
|
348
|
+
};
|
|
349
|
+
const styles: Style[] = [style];
|
|
350
|
+
if (props.style) {
|
|
351
|
+
for (const extra of Array.isArray(props.style)
|
|
352
|
+
? props.style
|
|
353
|
+
: [props.style]) {
|
|
354
|
+
styles.push(extra);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
if (client.status === 'unavailable' && props.fallback !== undefined) {
|
|
359
|
+
return h(React.Fragment, null, props.fallback);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
const foreign: ForeignElementProps = {
|
|
363
|
+
onReady: client.handleReady,
|
|
364
|
+
// A video surface is not something to tab to, and an embedded player that
|
|
365
|
+
// took the focus would swallow the app's own keys while the pointer is
|
|
366
|
+
// over it.
|
|
367
|
+
focusable: focusable ?? false,
|
|
368
|
+
'aria-label': 'Media player',
|
|
369
|
+
style: styles,
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
// See the same note in `../terminal/index.ts`: `data-testname` is a runtime
|
|
373
|
+
// convention react-x11's element declarations do not carry.
|
|
374
|
+
return hx('foreign', {
|
|
375
|
+
...foreign,
|
|
376
|
+
'data-testname': props['data-testname'],
|
|
377
|
+
} as ForeignElementProps);
|
|
378
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// mpv's JSON IPC, which is what makes `<MediaPlayer>`'s props real control
|
|
2
|
+
// rather than decoration.
|
|
3
|
+
//
|
|
4
|
+
// `--input-ipc-server=PATH` gives a unix socket that speaks newline-delimited
|
|
5
|
+
// JSON in both directions: `{"command":[…]}` out, `{"event":…}` and
|
|
6
|
+
// `{"request_id":…}` back. Two things it buys that a command line cannot:
|
|
7
|
+
//
|
|
8
|
+
// - **`observe_property`.** Position, duration, pause state and volume are
|
|
9
|
+
// pushed as they change, so `onProgress` is an event rather than a poll.
|
|
10
|
+
// - **`loadfile … replace`.** A new `src` swaps the file inside the running
|
|
11
|
+
// player, so the embedded window never blinks and the process never has to
|
|
12
|
+
// be respawned.
|
|
13
|
+
//
|
|
14
|
+
// The socket is created by mpv some milliseconds *after* it starts, which is
|
|
15
|
+
// what `connectWhenReady` in `../embed/host.ts` is for.
|
|
16
|
+
import { connectWhenReady } from '../embed/index.js';
|
|
17
|
+
import type { IpcSocket, ProcessHost } from '../embed/index.js';
|
|
18
|
+
import { lineReader, unitRange } from './control.js';
|
|
19
|
+
import type { PlayerControl, PlayerEvents } from './control.js';
|
|
20
|
+
|
|
21
|
+
/** Observation ids. mpv echoes them back on every property-change, and they
|
|
22
|
+
* are ours to choose. */
|
|
23
|
+
const OBSERVE = {
|
|
24
|
+
position: 1,
|
|
25
|
+
duration: 2,
|
|
26
|
+
pause: 3,
|
|
27
|
+
} as const;
|
|
28
|
+
|
|
29
|
+
/** mpv's volume is a percentage and goes above 100 (`--volume-max`); the prop
|
|
30
|
+
* is 0–1, so this is the whole of the conversion. */
|
|
31
|
+
const VOLUME_SCALE = 100;
|
|
32
|
+
|
|
33
|
+
interface MpvMessage {
|
|
34
|
+
event?: string;
|
|
35
|
+
id?: number;
|
|
36
|
+
name?: string;
|
|
37
|
+
data?: unknown;
|
|
38
|
+
reason?: string;
|
|
39
|
+
error?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export async function connectMpv(
|
|
43
|
+
host: ProcessHost,
|
|
44
|
+
socketPath: string,
|
|
45
|
+
events: PlayerEvents,
|
|
46
|
+
): Promise<PlayerControl> {
|
|
47
|
+
const socket: IpcSocket = await connectWhenReady(host, socketPath);
|
|
48
|
+
|
|
49
|
+
let position = 0;
|
|
50
|
+
let duration = 0;
|
|
51
|
+
let disposed = false;
|
|
52
|
+
|
|
53
|
+
const send = (command: readonly unknown[]): void => {
|
|
54
|
+
if (disposed) return;
|
|
55
|
+
socket.write(`${JSON.stringify({ command })}\n`);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const observe = (id: number, property: string): void => {
|
|
59
|
+
send(['observe_property', id, property]);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
socket.onData(
|
|
63
|
+
lineReader((line) => {
|
|
64
|
+
let message: MpvMessage;
|
|
65
|
+
try {
|
|
66
|
+
message = JSON.parse(line) as MpvMessage;
|
|
67
|
+
} catch {
|
|
68
|
+
// mpv only ever writes JSON here; a line that is not is a version
|
|
69
|
+
// saying something we do not understand, and dropping it is right.
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (message.event === 'property-change') {
|
|
74
|
+
if (
|
|
75
|
+
message.id === OBSERVE.position &&
|
|
76
|
+
typeof message.data === 'number'
|
|
77
|
+
) {
|
|
78
|
+
position = message.data;
|
|
79
|
+
events.onProgress?.({ position, duration });
|
|
80
|
+
} else if (
|
|
81
|
+
message.id === OBSERVE.duration &&
|
|
82
|
+
typeof message.data === 'number'
|
|
83
|
+
) {
|
|
84
|
+
duration = message.data;
|
|
85
|
+
events.onProgress?.({ position, duration });
|
|
86
|
+
} else if (message.id === OBSERVE.pause) {
|
|
87
|
+
events.onPlayingChange?.(message.data !== true);
|
|
88
|
+
}
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// `end-file` fires for every way a file stops, including the ones a
|
|
93
|
+
// caller must not hear as "the video finished": `stop` is our own
|
|
94
|
+
// `stop()`, and `redirect` is a playlist indirection mid-load.
|
|
95
|
+
if (message.event === 'end-file') {
|
|
96
|
+
if (message.reason === 'eof') events.onEnded?.();
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (message.event === 'start-file') {
|
|
101
|
+
position = 0;
|
|
102
|
+
duration = 0;
|
|
103
|
+
}
|
|
104
|
+
}),
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
socket.onClose(() => {
|
|
108
|
+
if (disposed) return;
|
|
109
|
+
disposed = true;
|
|
110
|
+
// Not an error: mpv closing its socket is mpv exiting, which the process
|
|
111
|
+
// watch in `useEmbeddedClient` reports with an exit code.
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
observe(OBSERVE.position, 'time-pos');
|
|
115
|
+
observe(OBSERVE.duration, 'duration');
|
|
116
|
+
observe(OBSERVE.pause, 'pause');
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
reportsProgress: true,
|
|
120
|
+
load(src) {
|
|
121
|
+
// `replace` rather than `append`: the prop names what is playing, so
|
|
122
|
+
// setting it twice must not build a playlist.
|
|
123
|
+
send(['loadfile', src, 'replace']);
|
|
124
|
+
},
|
|
125
|
+
setPaused(paused) {
|
|
126
|
+
send(['set_property', 'pause', paused]);
|
|
127
|
+
},
|
|
128
|
+
seek(seconds) {
|
|
129
|
+
if (!Number.isFinite(seconds)) return;
|
|
130
|
+
send(['seek', Math.max(0, seconds), 'absolute']);
|
|
131
|
+
},
|
|
132
|
+
setVolume(volume) {
|
|
133
|
+
send(['set_property', 'volume', unitRange(volume) * VOLUME_SCALE]);
|
|
134
|
+
},
|
|
135
|
+
setMuted(muted) {
|
|
136
|
+
send(['set_property', 'mute', muted]);
|
|
137
|
+
},
|
|
138
|
+
stop() {
|
|
139
|
+
send(['stop']);
|
|
140
|
+
},
|
|
141
|
+
dispose() {
|
|
142
|
+
disposed = true;
|
|
143
|
+
socket.close();
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// VLC's rc interface, used write-only — and the asymmetry is the point.
|
|
2
|
+
//
|
|
3
|
+
// `--extraintf rc --rc-unix=PATH` gives a unix socket that accepts the same
|
|
4
|
+
// console commands VLC's `rc` module has always accepted: `play`, `pause`,
|
|
5
|
+
// `stop`, `seek N`, `volume N`, `add URI`. That is enough for every control
|
|
6
|
+
// `<MediaPlayer>` exposes.
|
|
7
|
+
//
|
|
8
|
+
// What it is *not* enough for is `onProgress`. The replies to `get_time` and
|
|
9
|
+
// `get_length` are bare numbers with a `>` prompt around them, in a stream
|
|
10
|
+
// that also carries unsolicited status blocks and localised text — there is no
|
|
11
|
+
// request id, so a reply cannot be matched to the question that asked for it
|
|
12
|
+
// except by counting, and a dropped or extra line desynchronises the count
|
|
13
|
+
// permanently. Rather than ship a parser that is wrong in a way nobody
|
|
14
|
+
// notices until a progress bar lies, this backend declares
|
|
15
|
+
// `reportsProgress: false` and the component reports position only under mpv.
|
|
16
|
+
//
|
|
17
|
+
// The other consequence of not reading: `pause` in the rc protocol *toggles*.
|
|
18
|
+
// So the intended state is tracked here, seeded from `autoPlay`, and
|
|
19
|
+
// `setPaused` sends a toggle only when the two disagree. That is exact as long
|
|
20
|
+
// as nobody else is driving the same player, which is the case for a player
|
|
21
|
+
// this component spawned.
|
|
22
|
+
import { connectWhenReady } from '../embed/index.js';
|
|
23
|
+
import type { IpcSocket, ProcessHost } from '../embed/index.js';
|
|
24
|
+
import { unitRange } from './control.js';
|
|
25
|
+
import type { PlayerControl, PlayerEvents } from './control.js';
|
|
26
|
+
|
|
27
|
+
/** VLC's rc `volume` takes 0–256 for 0–100%. */
|
|
28
|
+
const VOLUME_SCALE = 256;
|
|
29
|
+
|
|
30
|
+
export interface VlcConnectOptions {
|
|
31
|
+
/** What the player was started doing, so the toggle stays in step. */
|
|
32
|
+
paused: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export async function connectVlc(
|
|
36
|
+
host: ProcessHost,
|
|
37
|
+
socketPath: string,
|
|
38
|
+
events: PlayerEvents,
|
|
39
|
+
options: VlcConnectOptions,
|
|
40
|
+
): Promise<PlayerControl> {
|
|
41
|
+
const socket: IpcSocket = await connectWhenReady(host, socketPath);
|
|
42
|
+
|
|
43
|
+
let paused = options.paused;
|
|
44
|
+
let volume = 1;
|
|
45
|
+
let disposed = false;
|
|
46
|
+
|
|
47
|
+
const send = (line: string): void => {
|
|
48
|
+
if (disposed) return;
|
|
49
|
+
socket.write(`${line}\n`);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// Read and discard. The stream has to be consumed — an unread socket
|
|
53
|
+
// eventually stops the writer — and nothing in it is parsed, for the reason
|
|
54
|
+
// in the file comment.
|
|
55
|
+
socket.onData(() => {});
|
|
56
|
+
socket.onClose(() => {
|
|
57
|
+
disposed = true;
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
reportsProgress: false,
|
|
62
|
+
load(src) {
|
|
63
|
+
send(`add ${src}`);
|
|
64
|
+
paused = false;
|
|
65
|
+
events.onPlayingChange?.(true);
|
|
66
|
+
},
|
|
67
|
+
setPaused(next) {
|
|
68
|
+
if (next === paused) return;
|
|
69
|
+
// `pause` toggles; `play` is unambiguous, so resuming uses it and only
|
|
70
|
+
// pausing needs the toggle.
|
|
71
|
+
send(next ? 'pause' : 'play');
|
|
72
|
+
paused = next;
|
|
73
|
+
events.onPlayingChange?.(!next);
|
|
74
|
+
},
|
|
75
|
+
seek(seconds) {
|
|
76
|
+
if (!Number.isFinite(seconds)) return;
|
|
77
|
+
send(`seek ${Math.max(0, Math.round(seconds))}`);
|
|
78
|
+
},
|
|
79
|
+
setVolume(next) {
|
|
80
|
+
volume = unitRange(next);
|
|
81
|
+
send(`volume ${Math.round(volume * VOLUME_SCALE)}`);
|
|
82
|
+
},
|
|
83
|
+
setMuted(muted) {
|
|
84
|
+
// rc has no mute: 0 and back is what the command set can express.
|
|
85
|
+
send(`volume ${muted ? 0 : Math.round(volume * VOLUME_SCALE)}`);
|
|
86
|
+
},
|
|
87
|
+
stop() {
|
|
88
|
+
send('stop');
|
|
89
|
+
paused = true;
|
|
90
|
+
events.onPlayingChange?.(false);
|
|
91
|
+
},
|
|
92
|
+
dispose() {
|
|
93
|
+
disposed = true;
|
|
94
|
+
socket.close();
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Styled text that a document can select across, as a shared module: the
|
|
2
|
+
// `<richtext>` element (wrapped runs, per-run decoration, and the four text
|
|
3
|
+
// accessors core's selection asks for), plus the right-click menu a
|
|
4
|
+
// read-only surface offers. `<Markdown>` and `<Code>` are compositions over
|
|
5
|
+
// this; an app can build its own surface from the same parts.
|
|
6
|
+
//
|
|
7
|
+
// The selection itself is core's since react-x11#291 — a `selectable` prop
|
|
8
|
+
// on the root box, and the anchor/focus, granularity, PRIMARY, Ctrl+A/Ctrl+C
|
|
9
|
+
// and the one-visible-selection rule that come with it. This module used to
|
|
10
|
+
// carry all of that (a `TextSelection` controller and a `useSelectionGestures`
|
|
11
|
+
// hook); both are gone, and so are the `order`/`registry`/`joiner` props the
|
|
12
|
+
// element took to feed them — a copy's separators now come from the layout.
|
|
13
|
+
//
|
|
14
|
+
// Importing this barrel registers nothing. A component that renders
|
|
15
|
+
// `<richtext>` calls `registerRichText()` at its own module scope — see
|
|
16
|
+
// the note in node.ts.
|
|
17
|
+
import type { Ref } from 'react';
|
|
18
|
+
|
|
19
|
+
import type { RichTextProps } from './node.js';
|
|
20
|
+
|
|
21
|
+
// The augmentation needs its target module resolved (same note as
|
|
22
|
+
// `code-editor/index.ts`): nothing in `src/` writes JSX.
|
|
23
|
+
import type {} from 'react-x11/jsx-runtime';
|
|
24
|
+
|
|
25
|
+
export {
|
|
26
|
+
ELEMENT as RICHTEXT_ELEMENT,
|
|
27
|
+
registerRichText,
|
|
28
|
+
RichTextNode,
|
|
29
|
+
} from './node.js';
|
|
30
|
+
export type { NtkApp, RichTextProps, TextLayoutLike, TextRun } from './node.js';
|
|
31
|
+
export { useSelectionMenu } from './menu.js';
|
|
32
|
+
export type { SelectionMenuHandlers } from './menu.js';
|
|
33
|
+
export { useLinkClicks } from './links.js';
|
|
34
|
+
export type { LinkHandlers } from './links.js';
|
|
35
|
+
|
|
36
|
+
declare module 'react-x11/jsx-runtime' {
|
|
37
|
+
namespace JSX {
|
|
38
|
+
interface IntrinsicElements {
|
|
39
|
+
richtext: RichTextProps & { key?: string | number; ref?: Ref<unknown> };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|