@react-x11/components 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +979 -21
- package/dist/ansi/cast.d.ts +48 -0
- package/dist/ansi/cast.d.ts.map +1 -0
- package/dist/ansi/cast.js +135 -0
- package/dist/ansi/cast.js.map +1 -0
- package/dist/ansi/index.d.ts +10 -0
- package/dist/ansi/index.d.ts.map +1 -0
- package/dist/ansi/index.js +27 -0
- package/dist/ansi/index.js.map +1 -0
- package/dist/ansi/palette.d.ts +79 -0
- package/dist/ansi/palette.d.ts.map +1 -0
- package/dist/ansi/palette.js +155 -0
- package/dist/ansi/palette.js.map +1 -0
- package/dist/ansi/parse.d.ts +114 -0
- package/dist/ansi/parse.d.ts.map +1 -0
- package/dist/ansi/parse.js +687 -0
- package/dist/ansi/parse.js.map +1 -0
- package/dist/ansi/sgr.d.ts +87 -0
- package/dist/ansi/sgr.d.ts.map +1 -0
- package/dist/ansi/sgr.js +302 -0
- package/dist/ansi/sgr.js.map +1 -0
- package/dist/ansi/utf8.d.ts +15 -0
- package/dist/ansi/utf8.d.ts.map +1 -0
- package/dist/ansi/utf8.js +82 -0
- package/dist/ansi/utf8.js.map +1 -0
- package/dist/calendar/Calendar.d.ts +136 -0
- package/dist/calendar/Calendar.d.ts.map +1 -0
- package/dist/calendar/Calendar.js +460 -0
- package/dist/calendar/Calendar.js.map +1 -0
- package/dist/calendar/DatePicker.d.ts +52 -0
- package/dist/calendar/DatePicker.d.ts.map +1 -0
- package/dist/calendar/DatePicker.js +257 -0
- package/dist/calendar/DatePicker.js.map +1 -0
- package/dist/calendar/dates.d.ts +90 -0
- package/dist/calendar/dates.d.ts.map +1 -0
- package/dist/calendar/dates.js +236 -0
- package/dist/calendar/dates.js.map +1 -0
- package/dist/calendar/index.d.ts +8 -0
- package/dist/calendar/index.d.ts.map +1 -0
- package/dist/calendar/index.js +15 -0
- package/dist/calendar/index.js.map +1 -0
- package/dist/charts/components.d.ts +141 -0
- package/dist/charts/components.d.ts.map +1 -0
- package/dist/charts/components.js +580 -0
- package/dist/charts/components.js.map +1 -0
- package/dist/charts/data.d.ts +198 -0
- package/dist/charts/data.d.ts.map +1 -0
- package/dist/charts/data.js +616 -0
- package/dist/charts/data.js.map +1 -0
- package/dist/charts/hx.d.ts +21 -0
- package/dist/charts/hx.d.ts.map +1 -0
- package/dist/charts/hx.js +15 -0
- package/dist/charts/hx.js.map +1 -0
- package/dist/charts/index.d.ts +27 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +38 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/charts/node.d.ts +96 -0
- package/dist/charts/node.d.ts.map +1 -0
- package/dist/charts/node.js +720 -0
- package/dist/charts/node.js.map +1 -0
- package/dist/charts/render.d.ts +153 -0
- package/dist/charts/render.d.ts.map +1 -0
- package/dist/charts/render.js +762 -0
- package/dist/charts/render.js.map +1 -0
- package/dist/charts/scale.d.ts +42 -0
- package/dist/charts/scale.d.ts.map +1 -0
- package/dist/charts/scale.js +173 -0
- package/dist/charts/scale.js.map +1 -0
- package/dist/charts/spec.d.ts +91 -0
- package/dist/charts/spec.d.ts.map +1 -0
- package/dist/charts/spec.js +33 -0
- package/dist/charts/spec.js.map +1 -0
- package/dist/charts/timers.d.ts +6 -0
- package/dist/charts/timers.d.ts.map +1 -0
- package/dist/charts/timers.js +14 -0
- package/dist/charts/timers.js.map +1 -0
- package/dist/code/hx.d.ts +24 -0
- package/dist/code/hx.d.ts.map +1 -0
- package/dist/code/hx.js +25 -0
- package/dist/code/hx.js.map +1 -0
- package/dist/code/index.d.ts +45 -0
- package/dist/code/index.d.ts.map +1 -0
- package/dist/code/index.js +93 -0
- package/dist/code/index.js.map +1 -0
- package/dist/code-editor/completion.d.ts +26 -0
- package/dist/code-editor/completion.d.ts.map +1 -0
- package/dist/code-editor/completion.js +129 -0
- package/dist/code-editor/completion.js.map +1 -0
- package/dist/code-editor/doc.d.ts +35 -0
- package/dist/code-editor/doc.d.ts.map +1 -0
- package/dist/code-editor/doc.js +162 -0
- package/dist/code-editor/doc.js.map +1 -0
- package/dist/code-editor/hx.d.ts +13 -0
- package/dist/code-editor/hx.d.ts.map +1 -0
- package/dist/code-editor/hx.js +10 -0
- package/dist/code-editor/hx.js.map +1 -0
- package/dist/code-editor/index.d.ts +88 -0
- package/dist/code-editor/index.d.ts.map +1 -0
- package/dist/code-editor/index.js +401 -0
- package/dist/code-editor/index.js.map +1 -0
- package/dist/code-editor/node.d.ts +343 -0
- package/dist/code-editor/node.d.ts.map +1 -0
- package/dist/code-editor/node.js +1521 -0
- package/dist/code-editor/node.js.map +1 -0
- package/dist/code-language/hljs.d.ts +47 -0
- package/dist/code-language/hljs.d.ts.map +1 -0
- package/dist/code-language/hljs.js +211 -0
- package/dist/code-language/hljs.js.map +1 -0
- package/dist/code-language/index.d.ts +22 -0
- package/dist/code-language/index.d.ts.map +1 -0
- package/dist/code-language/index.js +20 -0
- package/dist/code-language/index.js.map +1 -0
- package/dist/code-language/languages/glsl.d.ts +4 -0
- package/dist/code-language/languages/glsl.d.ts.map +1 -0
- package/dist/code-language/languages/glsl.js +99 -0
- package/dist/code-language/languages/glsl.js.map +1 -0
- package/dist/code-language/languages/javascript.d.ts +10 -0
- package/dist/code-language/languages/javascript.d.ts.map +1 -0
- package/dist/code-language/languages/javascript.js +360 -0
- package/dist/code-language/languages/javascript.js.map +1 -0
- package/dist/code-language/languages/json.d.ts +4 -0
- package/dist/code-language/languages/json.d.ts.map +1 -0
- package/dist/code-language/languages/json.js +68 -0
- package/dist/code-language/languages/json.js.map +1 -0
- package/dist/code-language/languages/shell.d.ts +4 -0
- package/dist/code-language/languages/shell.d.ts.map +1 -0
- package/dist/code-language/languages/shell.js +189 -0
- package/dist/code-language/languages/shell.js.map +1 -0
- package/dist/code-language/languages/sql.d.ts +11 -0
- package/dist/code-language/languages/sql.d.ts.map +1 -0
- package/dist/code-language/languages/sql.js +133 -0
- package/dist/code-language/languages/sql.js.map +1 -0
- package/dist/code-language/lezer.d.ts +24 -0
- package/dist/code-language/lezer.d.ts.map +1 -0
- package/dist/code-language/lezer.js +148 -0
- package/dist/code-language/lezer.js.map +1 -0
- package/dist/code-language/registry.d.ts +19 -0
- package/dist/code-language/registry.d.ts.map +1 -0
- package/dist/code-language/registry.js +56 -0
- package/dist/code-language/registry.js.map +1 -0
- package/dist/code-language/runs.d.ts +35 -0
- package/dist/code-language/runs.d.ts.map +1 -0
- package/dist/code-language/runs.js +88 -0
- package/dist/code-language/runs.js.map +1 -0
- package/dist/code-language/stream.d.ts +70 -0
- package/dist/code-language/stream.d.ts.map +1 -0
- package/dist/code-language/stream.js +243 -0
- package/dist/code-language/stream.js.map +1 -0
- package/dist/code-language/textmate.d.ts +27 -0
- package/dist/code-language/textmate.d.ts.map +1 -0
- package/dist/code-language/textmate.js +86 -0
- package/dist/code-language/textmate.js.map +1 -0
- package/dist/code-language/theme.d.ts +26 -0
- package/dist/code-language/theme.d.ts.map +1 -0
- package/dist/code-language/theme.js +108 -0
- package/dist/code-language/theme.js.map +1 -0
- package/dist/code-language/timers.d.ts +7 -0
- package/dist/code-language/timers.d.ts.map +1 -0
- package/dist/code-language/timers.js +22 -0
- package/dist/code-language/timers.js.map +1 -0
- package/dist/code-language/types.d.ts +173 -0
- package/dist/code-language/types.d.ts.map +1 -0
- package/dist/code-language/types.js +41 -0
- package/dist/code-language/types.js.map +1 -0
- package/dist/codeblock/index.d.ts +69 -0
- package/dist/codeblock/index.d.ts.map +1 -0
- package/dist/codeblock/index.js +85 -0
- package/dist/codeblock/index.js.map +1 -0
- package/dist/color-picker/ColorField.d.ts +39 -0
- package/dist/color-picker/ColorField.d.ts.map +1 -0
- package/dist/color-picker/ColorField.js +239 -0
- package/dist/color-picker/ColorField.js.map +1 -0
- package/dist/color-picker/ColorPicker.d.ts +109 -0
- package/dist/color-picker/ColorPicker.d.ts.map +1 -0
- package/dist/color-picker/ColorPicker.js +757 -0
- package/dist/color-picker/ColorPicker.js.map +1 -0
- package/dist/color-picker/color.d.ts +105 -0
- package/dist/color-picker/color.d.ts.map +1 -0
- package/dist/color-picker/color.js +313 -0
- package/dist/color-picker/color.js.map +1 -0
- package/dist/color-picker/index.d.ts +8 -0
- package/dist/color-picker/index.d.ts.map +1 -0
- package/dist/color-picker/index.js +19 -0
- package/dist/color-picker/index.js.map +1 -0
- package/dist/desktop-calendar/eds.d.ts +102 -0
- package/dist/desktop-calendar/eds.d.ts.map +1 -0
- package/dist/desktop-calendar/eds.js +356 -0
- package/dist/desktop-calendar/eds.js.map +1 -0
- package/dist/desktop-calendar/ical.d.ts +63 -0
- package/dist/desktop-calendar/ical.d.ts.map +1 -0
- package/dist/desktop-calendar/ical.js +57 -0
- package/dist/desktop-calendar/ical.js.map +1 -0
- package/dist/desktop-calendar/index.d.ts +72 -0
- package/dist/desktop-calendar/index.d.ts.map +1 -0
- package/dist/desktop-calendar/index.js +213 -0
- package/dist/desktop-calendar/index.js.map +1 -0
- package/dist/embed/client.d.ts +121 -0
- package/dist/embed/client.d.ts.map +1 -0
- package/dist/embed/client.js +203 -0
- package/dist/embed/client.js.map +1 -0
- package/dist/embed/host.d.ts +96 -0
- package/dist/embed/host.d.ts.map +1 -0
- package/dist/embed/host.js +266 -0
- package/dist/embed/host.js.map +1 -0
- package/dist/embed/index.d.ts +5 -0
- package/dist/embed/index.d.ts.map +1 -0
- package/dist/embed/index.js +13 -0
- package/dist/embed/index.js.map +1 -0
- package/dist/embed/timers.d.ts +6 -0
- package/dist/embed/timers.d.ts.map +1 -0
- package/dist/embed/timers.js +16 -0
- package/dist/embed/timers.js.map +1 -0
- package/dist/flow/draw.d.ts +45 -0
- package/dist/flow/draw.d.ts.map +1 -0
- package/dist/flow/draw.js +295 -0
- package/dist/flow/draw.js.map +1 -0
- package/dist/flow/index.d.ts +64 -0
- package/dist/flow/index.d.ts.map +1 -0
- package/dist/flow/index.js +306 -0
- package/dist/flow/index.js.map +1 -0
- package/dist/flow/model.d.ts +158 -0
- package/dist/flow/model.d.ts.map +1 -0
- package/dist/flow/model.js +566 -0
- package/dist/flow/model.js.map +1 -0
- package/dist/flow/node.d.ts +429 -0
- package/dist/flow/node.d.ts.map +1 -0
- package/dist/flow/node.js +3025 -0
- package/dist/flow/node.js.map +1 -0
- package/dist/flow/paths.d.ts +43 -0
- package/dist/flow/paths.d.ts.map +1 -0
- package/dist/flow/paths.js +327 -0
- package/dist/flow/paths.js.map +1 -0
- package/dist/flow/types.d.ts +561 -0
- package/dist/flow/types.d.ts.map +1 -0
- package/dist/flow/types.js +2 -0
- package/dist/flow/types.js.map +1 -0
- package/dist/formula/hx.d.ts +24 -0
- package/dist/formula/hx.d.ts.map +1 -0
- package/dist/formula/hx.js +25 -0
- package/dist/formula/hx.js.map +1 -0
- package/dist/formula/index.d.ts +74 -0
- package/dist/formula/index.d.ts.map +1 -0
- package/dist/formula/index.js +155 -0
- package/dist/formula/index.js.map +1 -0
- package/dist/formula/katex.d.ts +78 -0
- package/dist/formula/katex.d.ts.map +1 -0
- package/dist/formula/katex.js +130 -0
- package/dist/formula/katex.js.map +1 -0
- package/dist/formula/layout.d.ts +103 -0
- package/dist/formula/layout.d.ts.map +1 -0
- package/dist/formula/layout.js +716 -0
- package/dist/formula/layout.js.map +1 -0
- package/dist/formula/node.d.ts +50 -0
- package/dist/formula/node.d.ts.map +1 -0
- package/dist/formula/node.js +351 -0
- package/dist/formula/node.js.map +1 -0
- package/dist/html/controls.d.ts +48 -0
- package/dist/html/controls.d.ts.map +1 -0
- package/dist/html/controls.js +195 -0
- package/dist/html/controls.js.map +1 -0
- package/dist/html/css/cascade.d.ts +51 -0
- package/dist/html/css/cascade.d.ts.map +1 -0
- package/dist/html/css/cascade.js +552 -0
- package/dist/html/css/cascade.js.map +1 -0
- package/dist/html/css/parse.d.ts +74 -0
- package/dist/html/css/parse.d.ts.map +1 -0
- package/dist/html/css/parse.js +464 -0
- package/dist/html/css/parse.js.map +1 -0
- package/dist/html/css/style.d.ts +142 -0
- package/dist/html/css/style.d.ts.map +1 -0
- package/dist/html/css/style.js +1145 -0
- package/dist/html/css/style.js.map +1 -0
- package/dist/html/css/ua.d.ts +5 -0
- package/dist/html/css/ua.d.ts.map +1 -0
- package/dist/html/css/ua.js +171 -0
- package/dist/html/css/ua.js.map +1 -0
- package/dist/html/css/values.d.ts +78 -0
- package/dist/html/css/values.d.ts.map +1 -0
- package/dist/html/css/values.js +330 -0
- package/dist/html/css/values.js.map +1 -0
- package/dist/html/dom.d.ts +112 -0
- package/dist/html/dom.d.ts.map +1 -0
- package/dist/html/dom.js +374 -0
- package/dist/html/dom.js.map +1 -0
- package/dist/html/hx.d.ts +24 -0
- package/dist/html/hx.d.ts.map +1 -0
- package/dist/html/hx.js +29 -0
- package/dist/html/hx.js.map +1 -0
- package/dist/html/index.d.ts +137 -0
- package/dist/html/index.d.ts.map +1 -0
- package/dist/html/index.js +339 -0
- package/dist/html/index.js.map +1 -0
- package/dist/html/layout/block.d.ts +58 -0
- package/dist/html/layout/block.d.ts.map +1 -0
- package/dist/html/layout/block.js +724 -0
- package/dist/html/layout/block.js.map +1 -0
- package/dist/html/layout/boxes.d.ts +261 -0
- package/dist/html/layout/boxes.d.ts.map +1 -0
- package/dist/html/layout/boxes.js +725 -0
- package/dist/html/layout/boxes.js.map +1 -0
- package/dist/html/layout/flex.d.ts +16 -0
- package/dist/html/layout/flex.d.ts.map +1 -0
- package/dist/html/layout/flex.js +242 -0
- package/dist/html/layout/flex.js.map +1 -0
- package/dist/html/layout/floats.d.ts +50 -0
- package/dist/html/layout/floats.d.ts.map +1 -0
- package/dist/html/layout/floats.js +110 -0
- package/dist/html/layout/floats.js.map +1 -0
- package/dist/html/layout/inline.d.ts +44 -0
- package/dist/html/layout/inline.d.ts.map +1 -0
- package/dist/html/layout/inline.js +700 -0
- package/dist/html/layout/inline.js.map +1 -0
- package/dist/html/layout/table.d.ts +5 -0
- package/dist/html/layout/table.d.ts.map +1 -0
- package/dist/html/layout/table.js +340 -0
- package/dist/html/layout/table.js.map +1 -0
- package/dist/html/node.d.ts +149 -0
- package/dist/html/node.d.ts.map +1 -0
- package/dist/html/node.js +861 -0
- package/dist/html/node.js.map +1 -0
- package/dist/html/paint.d.ts +48 -0
- package/dist/html/paint.d.ts.map +1 -0
- package/dist/html/paint.js +495 -0
- package/dist/html/paint.js.map +1 -0
- package/dist/html/resources.d.ts +48 -0
- package/dist/html/resources.d.ts.map +1 -0
- package/dist/html/resources.js +156 -0
- package/dist/html/resources.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/heights.d.ts +88 -0
- package/dist/internal/heights.d.ts.map +1 -0
- package/dist/internal/heights.js +203 -0
- package/dist/internal/heights.js.map +1 -0
- package/dist/internal/hx.d.ts +24 -0
- package/dist/internal/hx.d.ts.map +1 -0
- package/dist/internal/hx.js +27 -0
- package/dist/internal/hx.js.map +1 -0
- package/dist/internal/scroll.d.ts +62 -0
- package/dist/internal/scroll.d.ts.map +1 -0
- package/dist/internal/scroll.js +224 -0
- package/dist/internal/scroll.js.map +1 -0
- package/dist/internal/text.d.ts +6 -0
- package/dist/internal/text.d.ts.map +1 -0
- package/dist/internal/text.js +44 -0
- package/dist/internal/text.js.map +1 -0
- package/dist/internal/timers.d.ts +8 -0
- package/dist/internal/timers.d.ts.map +1 -0
- package/dist/internal/timers.js +22 -0
- package/dist/internal/timers.js.map +1 -0
- package/dist/internal/widget.d.ts +40 -0
- package/dist/internal/widget.d.ts.map +1 -0
- package/dist/internal/widget.js +44 -0
- package/dist/internal/widget.js.map +1 -0
- package/dist/markdown/ast.d.ts +126 -0
- package/dist/markdown/ast.d.ts.map +1 -0
- package/dist/markdown/ast.js +8 -0
- package/dist/markdown/ast.js.map +1 -0
- package/dist/markdown/hx.d.ts +24 -0
- package/dist/markdown/hx.d.ts.map +1 -0
- package/dist/markdown/hx.js +25 -0
- package/dist/markdown/hx.js.map +1 -0
- package/dist/markdown/index.d.ts +90 -0
- package/dist/markdown/index.d.ts.map +1 -0
- package/dist/markdown/index.js +413 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/markdown/parse.d.ts +8 -0
- package/dist/markdown/parse.d.ts.map +1 -0
- package/dist/markdown/parse.js +911 -0
- package/dist/markdown/parse.js.map +1 -0
- package/dist/markdown/spans.d.ts +20 -0
- package/dist/markdown/spans.d.ts.map +1 -0
- package/dist/markdown/spans.js +96 -0
- package/dist/markdown/spans.js.map +1 -0
- package/dist/media-player/backends.d.ts +64 -0
- package/dist/media-player/backends.d.ts.map +1 -0
- package/dist/media-player/backends.js +110 -0
- package/dist/media-player/backends.js.map +1 -0
- package/dist/media-player/control.d.ts +40 -0
- package/dist/media-player/control.d.ts.map +1 -0
- package/dist/media-player/control.js +44 -0
- package/dist/media-player/control.js.map +1 -0
- package/dist/media-player/hx.d.ts +24 -0
- package/dist/media-player/hx.d.ts.map +1 -0
- package/dist/media-player/hx.js +25 -0
- package/dist/media-player/hx.js.map +1 -0
- package/dist/media-player/index.d.ts +107 -0
- package/dist/media-player/index.d.ts.map +1 -0
- package/dist/media-player/index.js +219 -0
- package/dist/media-player/index.js.map +1 -0
- package/dist/media-player/mpv.d.ts +4 -0
- package/dist/media-player/mpv.d.ts.map +1 -0
- package/dist/media-player/mpv.js +120 -0
- package/dist/media-player/mpv.js.map +1 -0
- package/dist/media-player/vlc.d.ts +8 -0
- package/dist/media-player/vlc.d.ts.map +1 -0
- package/dist/media-player/vlc.js +83 -0
- package/dist/media-player/vlc.js.map +1 -0
- package/dist/richtext/index.d.ts +19 -0
- package/dist/richtext/index.d.ts.map +1 -0
- package/dist/richtext/index.js +4 -0
- package/dist/richtext/index.js.map +1 -0
- package/dist/richtext/links.d.ts +12 -0
- package/dist/richtext/links.d.ts.map +1 -0
- package/dist/richtext/links.js +64 -0
- package/dist/richtext/links.js.map +1 -0
- package/dist/richtext/menu.d.ts +11 -0
- package/dist/richtext/menu.d.ts.map +1 -0
- package/dist/richtext/menu.js +43 -0
- package/dist/richtext/menu.js.map +1 -0
- package/dist/richtext/node.d.ts +151 -0
- package/dist/richtext/node.d.ts.map +1 -0
- package/dist/richtext/node.js +255 -0
- package/dist/richtext/node.js.map +1 -0
- package/dist/richtext/runs.d.ts +92 -0
- package/dist/richtext/runs.d.ts.map +1 -0
- package/dist/richtext/runs.js +158 -0
- package/dist/richtext/runs.js.map +1 -0
- package/dist/table/hx.d.ts +24 -0
- package/dist/table/hx.d.ts.map +1 -0
- package/dist/table/hx.js +25 -0
- package/dist/table/hx.js.map +1 -0
- package/dist/table/index.d.ts +169 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/table/index.js +890 -0
- package/dist/table/index.js.map +1 -0
- package/dist/table/rows.d.ts +136 -0
- package/dist/table/rows.d.ts.map +1 -0
- package/dist/table/rows.js +146 -0
- package/dist/table/rows.js.map +1 -0
- package/dist/terminal/backends.d.ts +105 -0
- package/dist/terminal/backends.d.ts.map +1 -0
- package/dist/terminal/backends.js +185 -0
- package/dist/terminal/backends.js.map +1 -0
- package/dist/terminal/hx.d.ts +24 -0
- package/dist/terminal/hx.d.ts.map +1 -0
- package/dist/terminal/hx.js +25 -0
- package/dist/terminal/hx.js.map +1 -0
- package/dist/terminal/index.d.ts +160 -0
- package/dist/terminal/index.d.ts.map +1 -0
- package/dist/terminal/index.js +344 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/terminal/title.d.ts +24 -0
- package/dist/terminal/title.d.ts.map +1 -0
- package/dist/terminal/title.js +129 -0
- package/dist/terminal/title.js.map +1 -0
- package/dist/terminal/vt/colors.d.ts +63 -0
- package/dist/terminal/vt/colors.d.ts.map +1 -0
- package/dist/terminal/vt/colors.js +203 -0
- package/dist/terminal/vt/colors.js.map +1 -0
- package/dist/terminal/vt/diff.d.ts +117 -0
- package/dist/terminal/vt/diff.d.ts.map +1 -0
- package/dist/terminal/vt/diff.js +358 -0
- package/dist/terminal/vt/diff.js.map +1 -0
- package/dist/terminal/vt/fonts.d.ts +92 -0
- package/dist/terminal/vt/fonts.d.ts.map +1 -0
- package/dist/terminal/vt/fonts.js +178 -0
- package/dist/terminal/vt/fonts.js.map +1 -0
- package/dist/terminal/vt/index.d.ts +78 -0
- package/dist/terminal/vt/index.d.ts.map +1 -0
- package/dist/terminal/vt/index.js +312 -0
- package/dist/terminal/vt/index.js.map +1 -0
- package/dist/terminal/vt/keys.d.ts +74 -0
- package/dist/terminal/vt/keys.d.ts.map +1 -0
- package/dist/terminal/vt/keys.js +309 -0
- package/dist/terminal/vt/keys.js.map +1 -0
- package/dist/terminal/vt/mouse.d.ts +44 -0
- package/dist/terminal/vt/mouse.d.ts.map +1 -0
- package/dist/terminal/vt/mouse.js +106 -0
- package/dist/terminal/vt/mouse.js.map +1 -0
- package/dist/terminal/vt/node.d.ts +246 -0
- package/dist/terminal/vt/node.d.ts.map +1 -0
- package/dist/terminal/vt/node.js +1068 -0
- package/dist/terminal/vt/node.js.map +1 -0
- package/dist/terminal/vt/pty.d.ts +81 -0
- package/dist/terminal/vt/pty.d.ts.map +1 -0
- package/dist/terminal/vt/pty.js +201 -0
- package/dist/terminal/vt/pty.js.map +1 -0
- package/dist/terminal/vt/renderer.d.ts +179 -0
- package/dist/terminal/vt/renderer.d.ts.map +1 -0
- package/dist/terminal/vt/renderer.js +357 -0
- package/dist/terminal/vt/renderer.js.map +1 -0
- package/dist/terminal/vt/timers.d.ts +6 -0
- package/dist/terminal/vt/timers.d.ts.map +1 -0
- package/dist/terminal/vt/timers.js +16 -0
- package/dist/terminal/vt/timers.js.map +1 -0
- package/dist/terminal/vt/xterm.d.ts +142 -0
- package/dist/terminal/vt/xterm.d.ts.map +1 -0
- package/dist/terminal/vt/xterm.js +32 -0
- package/dist/terminal/vt/xterm.js.map +1 -0
- package/dist/terminal-output/hx.d.ts +24 -0
- package/dist/terminal-output/hx.d.ts.map +1 -0
- package/dist/terminal-output/hx.js +25 -0
- package/dist/terminal-output/hx.js.map +1 -0
- package/dist/terminal-output/index.d.ts +92 -0
- package/dist/terminal-output/index.d.ts.map +1 -0
- package/dist/terminal-output/index.js +179 -0
- package/dist/terminal-output/index.js.map +1 -0
- package/dist/terminal-output/runs.d.ts +27 -0
- package/dist/terminal-output/runs.d.ts.map +1 -0
- package/dist/terminal-output/runs.js +66 -0
- package/dist/terminal-output/runs.js.map +1 -0
- package/dist/three/canvas.d.ts +46 -0
- package/dist/three/canvas.d.ts.map +1 -0
- package/dist/three/canvas.js +305 -0
- package/dist/three/canvas.js.map +1 -0
- package/dist/three/events.d.ts +64 -0
- package/dist/three/events.d.ts.map +1 -0
- package/dist/three/events.js +146 -0
- package/dist/three/events.js.map +1 -0
- package/dist/three/geometries.d.ts +89 -0
- package/dist/three/geometries.d.ts.map +1 -0
- package/dist/three/geometries.js +345 -0
- package/dist/three/geometries.js.map +1 -0
- package/dist/three/globals.d.ts +7 -0
- package/dist/three/globals.d.ts.map +1 -0
- package/dist/three/globals.js +20 -0
- package/dist/three/globals.js.map +1 -0
- package/dist/three/hx.d.ts +9 -0
- package/dist/three/hx.d.ts.map +1 -0
- package/dist/three/hx.js +10 -0
- package/dist/three/hx.js.map +1 -0
- package/dist/three/index.d.ts +22 -0
- package/dist/three/index.d.ts.map +1 -0
- package/dist/three/index.js +24 -0
- package/dist/three/index.js.map +1 -0
- package/dist/three/jsx-dev-runtime.d.ts +19 -0
- package/dist/three/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/three/jsx-dev-runtime.js +2 -0
- package/dist/three/jsx-dev-runtime.js.map +1 -0
- package/dist/three/jsx-runtime.d.ts +19 -0
- package/dist/three/jsx-runtime.d.ts.map +1 -0
- package/dist/three/jsx-runtime.js +2 -0
- package/dist/three/jsx-runtime.js.map +1 -0
- package/dist/three/jsx.d.ts +198 -0
- package/dist/three/jsx.d.ts.map +1 -0
- package/dist/three/jsx.js +2 -0
- package/dist/three/jsx.js.map +1 -0
- package/dist/three/materials.d.ts +125 -0
- package/dist/three/materials.d.ts.map +1 -0
- package/dist/three/materials.js +229 -0
- package/dist/three/materials.js.map +1 -0
- package/dist/three/math.d.ts +146 -0
- package/dist/three/math.d.ts.map +1 -0
- package/dist/three/math.js +464 -0
- package/dist/three/math.js.map +1 -0
- package/dist/three/objects.d.ts +185 -0
- package/dist/three/objects.d.ts.map +1 -0
- package/dist/three/objects.js +309 -0
- package/dist/three/objects.js.map +1 -0
- package/dist/three/passes.d.ts +54 -0
- package/dist/three/passes.d.ts.map +1 -0
- package/dist/three/passes.js +78 -0
- package/dist/three/passes.js.map +1 -0
- package/dist/three/postprocess.d.ts +85 -0
- package/dist/three/postprocess.d.ts.map +1 -0
- package/dist/three/postprocess.js +503 -0
- package/dist/three/postprocess.js.map +1 -0
- package/dist/three/raycast.d.ts +24 -0
- package/dist/three/raycast.d.ts.map +1 -0
- package/dist/three/raycast.js +138 -0
- package/dist/three/raycast.js.map +1 -0
- package/dist/three/reconciler.d.ts +48 -0
- package/dist/three/reconciler.d.ts.map +1 -0
- package/dist/three/reconciler.js +416 -0
- package/dist/three/reconciler.js.map +1 -0
- package/dist/three/renderer-direct.d.ts +102 -0
- package/dist/three/renderer-direct.d.ts.map +1 -0
- package/dist/three/renderer-direct.js +782 -0
- package/dist/three/renderer-direct.js.map +1 -0
- package/dist/three/renderer-indirect.d.ts +68 -0
- package/dist/three/renderer-indirect.d.ts.map +1 -0
- package/dist/three/renderer-indirect.js +438 -0
- package/dist/three/renderer-indirect.js.map +1 -0
- package/dist/three/store.d.ts +81 -0
- package/dist/three/store.d.ts.map +1 -0
- package/dist/three/store.js +110 -0
- package/dist/three/store.js.map +1 -0
- package/dist/timeline/hx.d.ts +18 -0
- package/dist/timeline/hx.d.ts.map +1 -0
- package/dist/timeline/hx.js +10 -0
- package/dist/timeline/hx.js.map +1 -0
- package/dist/timeline/index.d.ts +152 -0
- package/dist/timeline/index.d.ts.map +1 -0
- package/dist/timeline/index.js +383 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/tray-host/hx.d.ts +24 -0
- package/dist/tray-host/hx.d.ts.map +1 -0
- package/dist/tray-host/hx.js +25 -0
- package/dist/tray-host/hx.js.map +1 -0
- package/dist/tray-host/index.d.ts +110 -0
- package/dist/tray-host/index.d.ts.map +1 -0
- package/dist/tray-host/index.js +191 -0
- package/dist/tray-host/index.js.map +1 -0
- package/dist/tray-host/manager.d.ts +137 -0
- package/dist/tray-host/manager.d.ts.map +1 -0
- package/dist/tray-host/manager.js +462 -0
- package/dist/tray-host/manager.js.map +1 -0
- package/dist/tray-host/notify.d.ts +22 -0
- package/dist/tray-host/notify.d.ts.map +1 -0
- package/dist/tray-host/notify.js +74 -0
- package/dist/tray-host/notify.js.map +1 -0
- package/dist/tray-host/protocol.d.ts +106 -0
- package/dist/tray-host/protocol.d.ts.map +1 -0
- package/dist/tray-host/protocol.js +191 -0
- package/dist/tray-host/protocol.js.map +1 -0
- package/dist/tree/hx.d.ts +24 -0
- package/dist/tree/hx.d.ts.map +1 -0
- package/dist/tree/hx.js +25 -0
- package/dist/tree/hx.js.map +1 -0
- package/dist/tree/index.d.ts +221 -0
- package/dist/tree/index.d.ts.map +1 -0
- package/dist/tree/index.js +751 -0
- package/dist/tree/index.js.map +1 -0
- package/dist/tree/internal.d.ts +18 -0
- package/dist/tree/internal.d.ts.map +1 -0
- package/dist/tree/internal.js +66 -0
- package/dist/tree/internal.js.map +1 -0
- package/dist/tree/rows.d.ts +177 -0
- package/dist/tree/rows.d.ts.map +1 -0
- package/dist/tree/rows.js +179 -0
- package/dist/tree/rows.js.map +1 -0
- package/package.json +166 -12
- package/src/ansi/cast.ts +159 -0
- package/src/ansi/index.ts +53 -0
- package/src/ansi/palette.ts +226 -0
- package/src/ansi/parse.ts +780 -0
- package/src/ansi/sgr.ts +380 -0
- package/src/ansi/utf8.ts +84 -0
- package/src/calendar/Calendar.ts +744 -0
- package/src/calendar/DatePicker.ts +368 -0
- package/src/calendar/dates.ts +307 -0
- package/src/calendar/index.ts +51 -0
- package/src/charts/components.ts +864 -0
- package/src/charts/data.ts +776 -0
- package/src/charts/hx.ts +39 -0
- package/src/charts/index.ts +99 -0
- package/src/charts/node.ts +932 -0
- package/src/charts/render.ts +982 -0
- package/src/charts/scale.ts +214 -0
- package/src/charts/spec.ts +122 -0
- package/src/charts/timers.ts +24 -0
- package/src/code/hx.ts +51 -0
- package/src/code/index.ts +174 -0
- package/src/code-editor/completion.ts +161 -0
- package/src/code-editor/doc.ts +198 -0
- package/src/code-editor/hx.ts +26 -0
- package/src/code-editor/index.ts +615 -0
- package/src/code-editor/node.ts +1926 -0
- package/src/code-language/hljs.ts +302 -0
- package/src/code-language/index.ts +51 -0
- package/src/code-language/languages/glsl.ts +120 -0
- package/src/code-language/languages/javascript.ts +419 -0
- package/src/code-language/languages/json.ts +72 -0
- package/src/code-language/languages/shell.ts +221 -0
- package/src/code-language/languages/sql.ts +165 -0
- package/src/code-language/lezer.ts +190 -0
- package/src/code-language/registry.ts +66 -0
- package/src/code-language/runs.ts +128 -0
- package/src/code-language/stream.ts +306 -0
- package/src/code-language/textmate.ts +134 -0
- package/src/code-language/theme.ts +124 -0
- package/src/code-language/timers.ts +36 -0
- package/src/code-language/types.ts +252 -0
- package/src/codeblock/index.ts +146 -0
- package/src/color-picker/ColorField.ts +333 -0
- package/src/color-picker/ColorPicker.ts +1069 -0
- package/src/color-picker/color.ts +399 -0
- package/src/color-picker/index.ts +50 -0
- package/src/desktop-calendar/eds.ts +484 -0
- package/src/desktop-calendar/ical.ts +119 -0
- package/src/desktop-calendar/index.ts +287 -0
- package/src/embed/client.ts +311 -0
- package/src/embed/host.ts +432 -0
- package/src/embed/index.ts +33 -0
- package/src/embed/timers.ts +32 -0
- package/src/flow/draw.ts +418 -0
- package/src/flow/index.ts +473 -0
- package/src/flow/model.ts +687 -0
- package/src/flow/node.ts +3694 -0
- package/src/flow/paths.ts +403 -0
- package/src/flow/types.ts +634 -0
- package/src/formula/hx.ts +51 -0
- package/src/formula/index.ts +243 -0
- package/src/formula/katex.ts +209 -0
- package/src/formula/layout.ts +876 -0
- package/src/formula/node.ts +467 -0
- package/src/html/controls.ts +244 -0
- package/src/html/css/cascade.ts +606 -0
- package/src/html/css/parse.ts +500 -0
- package/src/html/css/style.ts +1371 -0
- package/src/html/css/ua.ts +174 -0
- package/src/html/css/values.ts +358 -0
- package/src/html/dom.ts +410 -0
- package/src/html/hx.ts +55 -0
- package/src/html/index.ts +545 -0
- package/src/html/layout/block.ts +876 -0
- package/src/html/layout/boxes.ts +981 -0
- package/src/html/layout/flex.ts +297 -0
- package/src/html/layout/floats.ts +125 -0
- package/src/html/layout/inline.ts +870 -0
- package/src/html/layout/table.ts +380 -0
- package/src/html/node.ts +967 -0
- package/src/html/paint.ts +605 -0
- package/src/html/resources.ts +214 -0
- package/src/index.ts +638 -0
- package/src/internal/heights.ts +222 -0
- package/src/internal/hx.ts +53 -0
- package/src/internal/scroll.ts +288 -0
- package/src/internal/text.ts +44 -0
- package/src/internal/timers.ts +44 -0
- package/src/internal/widget.ts +92 -0
- package/src/markdown/ast.ts +163 -0
- package/src/markdown/hx.ts +51 -0
- package/src/markdown/index.ts +686 -0
- package/src/markdown/parse.ts +1037 -0
- package/src/markdown/spans.ts +143 -0
- package/src/media-player/backends.ts +155 -0
- package/src/media-player/control.ts +70 -0
- package/src/media-player/hx.ts +51 -0
- package/src/media-player/index.ts +378 -0
- package/src/media-player/mpv.ts +146 -0
- package/src/media-player/vlc.ts +97 -0
- package/src/richtext/index.ts +42 -0
- package/src/richtext/links.ts +78 -0
- package/src/richtext/menu.ts +49 -0
- package/src/richtext/node.ts +406 -0
- package/src/richtext/runs.ts +253 -0
- package/src/table/hx.ts +51 -0
- package/src/table/index.ts +1270 -0
- package/src/table/rows.ts +275 -0
- package/src/terminal/backends.ts +242 -0
- package/src/terminal/hx.ts +51 -0
- package/src/terminal/index.ts +574 -0
- package/src/terminal/title.ts +172 -0
- package/src/terminal/vt/colors.ts +247 -0
- package/src/terminal/vt/diff.ts +467 -0
- package/src/terminal/vt/fonts.ts +233 -0
- package/src/terminal/vt/index.ts +443 -0
- package/src/terminal/vt/keys.ts +369 -0
- package/src/terminal/vt/mouse.ts +144 -0
- package/src/terminal/vt/node.ts +1242 -0
- package/src/terminal/vt/pty.ts +334 -0
- package/src/terminal/vt/renderer.ts +555 -0
- package/src/terminal/vt/timers.ts +31 -0
- package/src/terminal/vt/xterm.ts +193 -0
- package/src/terminal-output/hx.ts +51 -0
- package/src/terminal-output/index.ts +340 -0
- package/src/terminal-output/runs.ts +79 -0
- package/src/three/canvas.ts +451 -0
- package/src/three/events.ts +197 -0
- package/src/three/geometries.ts +429 -0
- package/src/three/globals.ts +34 -0
- package/src/three/hx.ts +22 -0
- package/src/three/index.ts +98 -0
- package/src/three/jsx-dev-runtime.ts +27 -0
- package/src/three/jsx-runtime.ts +38 -0
- package/src/three/jsx.ts +275 -0
- package/src/three/materials.ts +270 -0
- package/src/three/math.ts +585 -0
- package/src/three/objects.ts +397 -0
- package/src/three/passes.ts +90 -0
- package/src/three/postprocess.ts +677 -0
- package/src/three/raycast.ts +189 -0
- package/src/three/react-reconciler.d.ts +50 -0
- package/src/three/reconciler.ts +624 -0
- package/src/three/renderer-direct.ts +1055 -0
- package/src/three/renderer-indirect.ts +570 -0
- package/src/three/store.ts +207 -0
- package/src/timeline/hx.ts +31 -0
- package/src/timeline/index.ts +603 -0
- package/src/tray-host/hx.ts +51 -0
- package/src/tray-host/index.ts +331 -0
- package/src/tray-host/manager.ts +639 -0
- package/src/tray-host/notify.ts +102 -0
- package/src/tray-host/protocol.ts +235 -0
- package/src/tree/hx.ts +51 -0
- package/src/tree/index.ts +1127 -0
- package/src/tree/internal.ts +87 -0
- package/src/tree/rows.ts +334 -0
- package/src/index.d.ts +0 -2
- package/src/index.js +0 -9
- package/src/sparkline/index.d.ts +0 -29
- package/src/sparkline/index.js +0 -50
- package/src/sparkline/node.js +0 -72
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode, Ref } from 'react';
|
|
2
|
+
import type { Style } from 'react-x11/style';
|
|
3
|
+
import type { EmbedStatus, ExitInfo, ProcessHost } from '../embed/index.js';
|
|
4
|
+
import type { MediaBackendName } from './backends.js';
|
|
5
|
+
export { MEDIA_BACKENDS, mediaBackendsFor, mpv, vlc } from './backends.js';
|
|
6
|
+
export type { MediaBackend, MediaBackendName, MediaLaunch, } from './backends.js';
|
|
7
|
+
export type { PlayerControl, PlayerEvents } from './control.js';
|
|
8
|
+
/** Where playback is. */
|
|
9
|
+
export interface MediaProgress {
|
|
10
|
+
/** Seconds from the start. */
|
|
11
|
+
position: number;
|
|
12
|
+
/** Seconds, or 0 before the player knows. */
|
|
13
|
+
duration: number;
|
|
14
|
+
}
|
|
15
|
+
/** What a `ref` on `<MediaPlayer>` gets. */
|
|
16
|
+
export interface MediaPlayerHandle {
|
|
17
|
+
play(): void;
|
|
18
|
+
pause(): void;
|
|
19
|
+
/** Absolute position, in seconds. */
|
|
20
|
+
seek(seconds: number): void;
|
|
21
|
+
/** 0–1. */
|
|
22
|
+
setVolume(volume: number): void;
|
|
23
|
+
/** Stop playback without stopping the player: the window stays, idle. */
|
|
24
|
+
stop(): void;
|
|
25
|
+
/** Stop the player process and start a new one. */
|
|
26
|
+
restart(): void;
|
|
27
|
+
signal(signal?: string): boolean;
|
|
28
|
+
readonly pid: number | null;
|
|
29
|
+
readonly windowId: number | null;
|
|
30
|
+
readonly backend: string | null;
|
|
31
|
+
readonly status: EmbedStatus;
|
|
32
|
+
/** False under VLC — see `./vlc.ts`. `onProgress` never fires then. */
|
|
33
|
+
readonly reportsProgress: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface MediaPlayerProps {
|
|
36
|
+
/**
|
|
37
|
+
* A path or a URL. **Changing it does not restart the player** — the new
|
|
38
|
+
* source is loaded into the running one, so the window never blinks.
|
|
39
|
+
*/
|
|
40
|
+
src?: string;
|
|
41
|
+
/** Which player. Default `'auto'`: mpv if it is installed, else VLC. */
|
|
42
|
+
backend?: MediaBackendName;
|
|
43
|
+
/** Start playing. Default true. */
|
|
44
|
+
autoPlay?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Pause state, if you want to drive it. Leave it out and the player is
|
|
47
|
+
* uncontrolled — `autoPlay` decides how it starts and the handle's
|
|
48
|
+
* `play()`/`pause()` move it from there.
|
|
49
|
+
*/
|
|
50
|
+
paused?: boolean;
|
|
51
|
+
/** 0–1. Default: the player's own. */
|
|
52
|
+
volume?: number;
|
|
53
|
+
muted?: boolean;
|
|
54
|
+
/** `'16:9'`, `'4:3'`. The player letterboxes inside the element's rect. */
|
|
55
|
+
aspectRatio?: string;
|
|
56
|
+
loop?: boolean;
|
|
57
|
+
/** The player's own on-screen controls. Off by default: they are drawn by
|
|
58
|
+
* the player and will not match the app's theme. */
|
|
59
|
+
osd?: boolean;
|
|
60
|
+
/** Appended to the player's command line verbatim. */
|
|
61
|
+
extraArgs?: readonly string[];
|
|
62
|
+
/** Position and duration, as the player reports them. mpv only. */
|
|
63
|
+
onProgress?: (progress: MediaProgress) => void;
|
|
64
|
+
/** The file reached its end. Not fired for `stop()` or a new `src`. */
|
|
65
|
+
onEnded?: (info: {
|
|
66
|
+
node: unknown;
|
|
67
|
+
}) => void;
|
|
68
|
+
onPlayingChange?: (playing: boolean) => void;
|
|
69
|
+
/** The player process ended. */
|
|
70
|
+
onExit?: (info: ExitInfo) => void;
|
|
71
|
+
/** Spawn failures, control-channel failures, and the
|
|
72
|
+
* `BackendUnavailableError` for a machine with neither player installed. */
|
|
73
|
+
onError?: (err: Error) => void;
|
|
74
|
+
/** Rendered instead of the surface when no backend is installed. */
|
|
75
|
+
fallback?: ReactNode;
|
|
76
|
+
/** False holds off spawning entirely. */
|
|
77
|
+
enabled?: boolean;
|
|
78
|
+
/** Sent on unmount and restart. Default `SIGTERM`. */
|
|
79
|
+
stopSignal?: string;
|
|
80
|
+
/** Where the process runs. Defaults to this machine, through node. */
|
|
81
|
+
processes?: ProcessHost;
|
|
82
|
+
/** A video surface is not a control; default false, unlike `<Terminal>`. */
|
|
83
|
+
focusable?: boolean;
|
|
84
|
+
style?: Style | Style[];
|
|
85
|
+
ref?: Ref<MediaPlayerHandle>;
|
|
86
|
+
'data-testname'?: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* A video surface.
|
|
90
|
+
*
|
|
91
|
+
* ```jsx
|
|
92
|
+
* <MediaPlayer
|
|
93
|
+
* src={file}
|
|
94
|
+
* aspectRatio="16:9"
|
|
95
|
+
* volume={0.8}
|
|
96
|
+
* style={{ flexGrow: 1 }}
|
|
97
|
+
* onProgress={({ position, duration }) => setScrub(position / duration)}
|
|
98
|
+
* onEnded={next}
|
|
99
|
+
* fallback={<text>Install mpv to play video.</text>}
|
|
100
|
+
* />
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* The player's window stacks above everything drawn in this one, so nothing 2D
|
|
104
|
+
* can overlap it — see "Controls" at the top of this file.
|
|
105
|
+
*/
|
|
106
|
+
export declare function MediaPlayer(props: MediaPlayerProps): ReactElement;
|
|
107
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/media-player/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,219 @@
|
|
|
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, { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
|
28
|
+
import { useTheme } from 'react-x11';
|
|
29
|
+
import { BackendUnavailableError, resolveBackend, useEmbeddedClient, } from '../embed/index.js';
|
|
30
|
+
import { mediaBackendsFor } from './backends.js';
|
|
31
|
+
import { hx } from './hx.js';
|
|
32
|
+
export { MEDIA_BACKENDS, mediaBackendsFor, mpv, vlc } from './backends.js';
|
|
33
|
+
const h = React.createElement;
|
|
34
|
+
/**
|
|
35
|
+
* A video surface.
|
|
36
|
+
*
|
|
37
|
+
* ```jsx
|
|
38
|
+
* <MediaPlayer
|
|
39
|
+
* src={file}
|
|
40
|
+
* aspectRatio="16:9"
|
|
41
|
+
* volume={0.8}
|
|
42
|
+
* style={{ flexGrow: 1 }}
|
|
43
|
+
* onProgress={({ position, duration }) => setScrub(position / duration)}
|
|
44
|
+
* onEnded={next}
|
|
45
|
+
* fallback={<text>Install mpv to play video.</text>}
|
|
46
|
+
* />
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* The player's window stacks above everything drawn in this one, so nothing 2D
|
|
50
|
+
* can overlap it — see "Controls" at the top of this file.
|
|
51
|
+
*/
|
|
52
|
+
export function MediaPlayer(props) {
|
|
53
|
+
const { backend = 'auto', enabled = true, focusable, processes, stopSignal, } = props;
|
|
54
|
+
const theme = useTheme();
|
|
55
|
+
const control = useRef(null);
|
|
56
|
+
// Bumped when a control channel opens or closes. The prop-syncing effects
|
|
57
|
+
// below depend on it, which is what makes "apply `volume` once there is
|
|
58
|
+
// something to apply it to" a dependency rather than a retry.
|
|
59
|
+
const [channel, setChannel] = useState(0);
|
|
60
|
+
// What the player was launched with, so a `src` that has not changed is not
|
|
61
|
+
// loaded a second time over the top of itself.
|
|
62
|
+
const loaded = useRef(undefined);
|
|
63
|
+
// Read through a ref so that the plan's identity — which is the restart
|
|
64
|
+
// signal — depends only on the launch key below.
|
|
65
|
+
const latest = useRef(props);
|
|
66
|
+
latest.current = props;
|
|
67
|
+
// Only the props that cannot be changed in a running player. `src`,
|
|
68
|
+
// `volume`, `muted` and `paused` are all live commands, so they are
|
|
69
|
+
// deliberately absent: including them would respawn the process for a
|
|
70
|
+
// volume slider.
|
|
71
|
+
const key = useMemo(() => JSON.stringify([
|
|
72
|
+
backend,
|
|
73
|
+
props.aspectRatio ?? null,
|
|
74
|
+
props.loop ?? false,
|
|
75
|
+
props.osd ?? false,
|
|
76
|
+
props.extraArgs ?? null,
|
|
77
|
+
]), [backend, props.aspectRatio, props.loop, props.osd, props.extraArgs]);
|
|
78
|
+
const plan = useMemo(() => async ({ windowId, host }) => {
|
|
79
|
+
const candidates = mediaBackendsFor(backend);
|
|
80
|
+
if (candidates.length === 0) {
|
|
81
|
+
throw new BackendUnavailableError('media player', [backend]);
|
|
82
|
+
}
|
|
83
|
+
const chosen = await resolveBackend(host, 'media player', candidates);
|
|
84
|
+
const scratch = await host.socketPath(`react-x11-${chosen.backend.name}`);
|
|
85
|
+
const current = latest.current;
|
|
86
|
+
const launch = {
|
|
87
|
+
windowId,
|
|
88
|
+
controlPath: scratch.path,
|
|
89
|
+
src: current.src,
|
|
90
|
+
autoPlay: current.autoPlay ?? true,
|
|
91
|
+
volume: current.volume,
|
|
92
|
+
muted: current.muted,
|
|
93
|
+
aspectRatio: current.aspectRatio,
|
|
94
|
+
loop: current.loop,
|
|
95
|
+
osd: current.osd,
|
|
96
|
+
extraArgs: current.extraArgs,
|
|
97
|
+
};
|
|
98
|
+
return {
|
|
99
|
+
command: chosen.path,
|
|
100
|
+
args: chosen.backend.args(launch),
|
|
101
|
+
backend: chosen.backend.name,
|
|
102
|
+
async attach() {
|
|
103
|
+
const events = {
|
|
104
|
+
onProgress: (progress) => latest.current.onProgress?.(progress),
|
|
105
|
+
onPlayingChange: (playing) => latest.current.onPlayingChange?.(playing),
|
|
106
|
+
onEnded: () => latest.current.onEnded?.({ node: null }),
|
|
107
|
+
onError: (err) => latest.current.onError?.(err),
|
|
108
|
+
};
|
|
109
|
+
const opened = await chosen.backend.connect(host, scratch.path, events, launch);
|
|
110
|
+
control.current = opened;
|
|
111
|
+
loaded.current = launch.src;
|
|
112
|
+
setChannel((n) => n + 1);
|
|
113
|
+
return () => {
|
|
114
|
+
control.current = null;
|
|
115
|
+
loaded.current = undefined;
|
|
116
|
+
opened.dispose();
|
|
117
|
+
setChannel((n) => n + 1);
|
|
118
|
+
};
|
|
119
|
+
},
|
|
120
|
+
dispose: () => scratch.dispose(),
|
|
121
|
+
};
|
|
122
|
+
}, [backend, key]);
|
|
123
|
+
const client = useEmbeddedClient({
|
|
124
|
+
plan,
|
|
125
|
+
host: processes,
|
|
126
|
+
enabled,
|
|
127
|
+
stopSignal,
|
|
128
|
+
onExit: props.onExit,
|
|
129
|
+
onError: props.onError,
|
|
130
|
+
});
|
|
131
|
+
// --- props the control channel applies to a running player ---------------
|
|
132
|
+
const { src, volume, muted, paused } = props;
|
|
133
|
+
useEffect(() => {
|
|
134
|
+
if (!control.current || src === undefined)
|
|
135
|
+
return;
|
|
136
|
+
if (src === loaded.current)
|
|
137
|
+
return;
|
|
138
|
+
loaded.current = src;
|
|
139
|
+
control.current.load(src);
|
|
140
|
+
}, [src, channel]);
|
|
141
|
+
useEffect(() => {
|
|
142
|
+
if (!control.current || volume === undefined)
|
|
143
|
+
return;
|
|
144
|
+
control.current.setVolume(volume);
|
|
145
|
+
}, [volume, channel]);
|
|
146
|
+
useEffect(() => {
|
|
147
|
+
if (!control.current || muted === undefined)
|
|
148
|
+
return;
|
|
149
|
+
control.current.setMuted(muted);
|
|
150
|
+
}, [muted, channel]);
|
|
151
|
+
useEffect(() => {
|
|
152
|
+
if (!control.current || paused === undefined)
|
|
153
|
+
return;
|
|
154
|
+
control.current.setPaused(paused);
|
|
155
|
+
}, [paused, channel]);
|
|
156
|
+
// --- the handle ---------------------------------------------------------
|
|
157
|
+
const reportsProgress = useMemo(() => {
|
|
158
|
+
const [chosen] = mediaBackendsFor(backend).filter((b) => b.name === client.backend);
|
|
159
|
+
return chosen?.reportsProgress ?? false;
|
|
160
|
+
}, [backend, client.backend]);
|
|
161
|
+
const noop = useCallback(() => { }, []);
|
|
162
|
+
React.useImperativeHandle(props.ref, () => ({
|
|
163
|
+
play: () => control.current?.setPaused(false) ?? noop(),
|
|
164
|
+
pause: () => control.current?.setPaused(true) ?? noop(),
|
|
165
|
+
seek: (seconds) => control.current?.seek(seconds) ?? noop(),
|
|
166
|
+
setVolume: (value) => control.current?.setVolume(value) ?? noop(),
|
|
167
|
+
stop: () => control.current?.stop() ?? noop(),
|
|
168
|
+
restart: client.restart,
|
|
169
|
+
signal: client.signal,
|
|
170
|
+
get pid() {
|
|
171
|
+
return client.pid;
|
|
172
|
+
},
|
|
173
|
+
get windowId() {
|
|
174
|
+
return client.windowId;
|
|
175
|
+
},
|
|
176
|
+
get backend() {
|
|
177
|
+
return client.backend;
|
|
178
|
+
},
|
|
179
|
+
get status() {
|
|
180
|
+
return client.status;
|
|
181
|
+
},
|
|
182
|
+
get reportsProgress() {
|
|
183
|
+
return reportsProgress;
|
|
184
|
+
},
|
|
185
|
+
}), [client, noop, reportsProgress]);
|
|
186
|
+
// Black rather than the theme background: this is a video surface, and what
|
|
187
|
+
// shows around a letterboxed frame should be what a player would put there.
|
|
188
|
+
const style = {
|
|
189
|
+
flexGrow: 1,
|
|
190
|
+
backgroundColor: String(theme.videoBackground ?? '#000000'),
|
|
191
|
+
};
|
|
192
|
+
const styles = [style];
|
|
193
|
+
if (props.style) {
|
|
194
|
+
for (const extra of Array.isArray(props.style)
|
|
195
|
+
? props.style
|
|
196
|
+
: [props.style]) {
|
|
197
|
+
styles.push(extra);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (client.status === 'unavailable' && props.fallback !== undefined) {
|
|
201
|
+
return h(React.Fragment, null, props.fallback);
|
|
202
|
+
}
|
|
203
|
+
const foreign = {
|
|
204
|
+
onReady: client.handleReady,
|
|
205
|
+
// A video surface is not something to tab to, and an embedded player that
|
|
206
|
+
// took the focus would swallow the app's own keys while the pointer is
|
|
207
|
+
// over it.
|
|
208
|
+
focusable: focusable ?? false,
|
|
209
|
+
'aria-label': 'Media player',
|
|
210
|
+
style: styles,
|
|
211
|
+
};
|
|
212
|
+
// See the same note in `../terminal/index.ts`: `data-testname` is a runtime
|
|
213
|
+
// convention react-x11's element declarations do not carry.
|
|
214
|
+
return hx('foreign', {
|
|
215
|
+
...foreign,
|
|
216
|
+
'data-testname': props['data-testname'],
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/media-player/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ProcessHost } from '../embed/index.js';
|
|
2
|
+
import type { PlayerControl, PlayerEvents } from './control.js';
|
|
3
|
+
export declare function connectMpv(host: ProcessHost, socketPath: string, events: PlayerEvents): Promise<PlayerControl>;
|
|
4
|
+
//# sourceMappingURL=mpv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mpv.d.ts","sourceRoot":"","sources":["../../src/media-player/mpv.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAuBhE,wBAAsB,UAAU,CAC9B,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,aAAa,CAAC,CAoGxB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
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 { lineReader, unitRange } from './control.js';
|
|
18
|
+
/** Observation ids. mpv echoes them back on every property-change, and they
|
|
19
|
+
* are ours to choose. */
|
|
20
|
+
const OBSERVE = {
|
|
21
|
+
position: 1,
|
|
22
|
+
duration: 2,
|
|
23
|
+
pause: 3,
|
|
24
|
+
};
|
|
25
|
+
/** mpv's volume is a percentage and goes above 100 (`--volume-max`); the prop
|
|
26
|
+
* is 0–1, so this is the whole of the conversion. */
|
|
27
|
+
const VOLUME_SCALE = 100;
|
|
28
|
+
export async function connectMpv(host, socketPath, events) {
|
|
29
|
+
const socket = await connectWhenReady(host, socketPath);
|
|
30
|
+
let position = 0;
|
|
31
|
+
let duration = 0;
|
|
32
|
+
let disposed = false;
|
|
33
|
+
const send = (command) => {
|
|
34
|
+
if (disposed)
|
|
35
|
+
return;
|
|
36
|
+
socket.write(`${JSON.stringify({ command })}\n`);
|
|
37
|
+
};
|
|
38
|
+
const observe = (id, property) => {
|
|
39
|
+
send(['observe_property', id, property]);
|
|
40
|
+
};
|
|
41
|
+
socket.onData(lineReader((line) => {
|
|
42
|
+
let message;
|
|
43
|
+
try {
|
|
44
|
+
message = JSON.parse(line);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// mpv only ever writes JSON here; a line that is not is a version
|
|
48
|
+
// saying something we do not understand, and dropping it is right.
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (message.event === 'property-change') {
|
|
52
|
+
if (message.id === OBSERVE.position &&
|
|
53
|
+
typeof message.data === 'number') {
|
|
54
|
+
position = message.data;
|
|
55
|
+
events.onProgress?.({ position, duration });
|
|
56
|
+
}
|
|
57
|
+
else if (message.id === OBSERVE.duration &&
|
|
58
|
+
typeof message.data === 'number') {
|
|
59
|
+
duration = message.data;
|
|
60
|
+
events.onProgress?.({ position, duration });
|
|
61
|
+
}
|
|
62
|
+
else if (message.id === OBSERVE.pause) {
|
|
63
|
+
events.onPlayingChange?.(message.data !== true);
|
|
64
|
+
}
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// `end-file` fires for every way a file stops, including the ones a
|
|
68
|
+
// caller must not hear as "the video finished": `stop` is our own
|
|
69
|
+
// `stop()`, and `redirect` is a playlist indirection mid-load.
|
|
70
|
+
if (message.event === 'end-file') {
|
|
71
|
+
if (message.reason === 'eof')
|
|
72
|
+
events.onEnded?.();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (message.event === 'start-file') {
|
|
76
|
+
position = 0;
|
|
77
|
+
duration = 0;
|
|
78
|
+
}
|
|
79
|
+
}));
|
|
80
|
+
socket.onClose(() => {
|
|
81
|
+
if (disposed)
|
|
82
|
+
return;
|
|
83
|
+
disposed = true;
|
|
84
|
+
// Not an error: mpv closing its socket is mpv exiting, which the process
|
|
85
|
+
// watch in `useEmbeddedClient` reports with an exit code.
|
|
86
|
+
});
|
|
87
|
+
observe(OBSERVE.position, 'time-pos');
|
|
88
|
+
observe(OBSERVE.duration, 'duration');
|
|
89
|
+
observe(OBSERVE.pause, 'pause');
|
|
90
|
+
return {
|
|
91
|
+
reportsProgress: true,
|
|
92
|
+
load(src) {
|
|
93
|
+
// `replace` rather than `append`: the prop names what is playing, so
|
|
94
|
+
// setting it twice must not build a playlist.
|
|
95
|
+
send(['loadfile', src, 'replace']);
|
|
96
|
+
},
|
|
97
|
+
setPaused(paused) {
|
|
98
|
+
send(['set_property', 'pause', paused]);
|
|
99
|
+
},
|
|
100
|
+
seek(seconds) {
|
|
101
|
+
if (!Number.isFinite(seconds))
|
|
102
|
+
return;
|
|
103
|
+
send(['seek', Math.max(0, seconds), 'absolute']);
|
|
104
|
+
},
|
|
105
|
+
setVolume(volume) {
|
|
106
|
+
send(['set_property', 'volume', unitRange(volume) * VOLUME_SCALE]);
|
|
107
|
+
},
|
|
108
|
+
setMuted(muted) {
|
|
109
|
+
send(['set_property', 'mute', muted]);
|
|
110
|
+
},
|
|
111
|
+
stop() {
|
|
112
|
+
send(['stop']);
|
|
113
|
+
},
|
|
114
|
+
dispose() {
|
|
115
|
+
disposed = true;
|
|
116
|
+
socket.close();
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=mpv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mpv.js","sourceRoot":"","sources":["../../src/media-player/mpv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ProcessHost } from '../embed/index.js';
|
|
2
|
+
import type { PlayerControl, PlayerEvents } from './control.js';
|
|
3
|
+
export interface VlcConnectOptions {
|
|
4
|
+
/** What the player was started doing, so the toggle stays in step. */
|
|
5
|
+
paused: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function connectVlc(host: ProcessHost, socketPath: string, events: PlayerEvents, options: VlcConnectOptions): Promise<PlayerControl>;
|
|
8
|
+
//# sourceMappingURL=vlc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vlc.d.ts","sourceRoot":"","sources":["../../src/media-player/vlc.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAKhE,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,aAAa,CAAC,CAyDxB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
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 { unitRange } from './control.js';
|
|
24
|
+
/** VLC's rc `volume` takes 0–256 for 0–100%. */
|
|
25
|
+
const VOLUME_SCALE = 256;
|
|
26
|
+
export async function connectVlc(host, socketPath, events, options) {
|
|
27
|
+
const socket = await connectWhenReady(host, socketPath);
|
|
28
|
+
let paused = options.paused;
|
|
29
|
+
let volume = 1;
|
|
30
|
+
let disposed = false;
|
|
31
|
+
const send = (line) => {
|
|
32
|
+
if (disposed)
|
|
33
|
+
return;
|
|
34
|
+
socket.write(`${line}\n`);
|
|
35
|
+
};
|
|
36
|
+
// Read and discard. The stream has to be consumed — an unread socket
|
|
37
|
+
// eventually stops the writer — and nothing in it is parsed, for the reason
|
|
38
|
+
// in the file comment.
|
|
39
|
+
socket.onData(() => { });
|
|
40
|
+
socket.onClose(() => {
|
|
41
|
+
disposed = true;
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
reportsProgress: false,
|
|
45
|
+
load(src) {
|
|
46
|
+
send(`add ${src}`);
|
|
47
|
+
paused = false;
|
|
48
|
+
events.onPlayingChange?.(true);
|
|
49
|
+
},
|
|
50
|
+
setPaused(next) {
|
|
51
|
+
if (next === paused)
|
|
52
|
+
return;
|
|
53
|
+
// `pause` toggles; `play` is unambiguous, so resuming uses it and only
|
|
54
|
+
// pausing needs the toggle.
|
|
55
|
+
send(next ? 'pause' : 'play');
|
|
56
|
+
paused = next;
|
|
57
|
+
events.onPlayingChange?.(!next);
|
|
58
|
+
},
|
|
59
|
+
seek(seconds) {
|
|
60
|
+
if (!Number.isFinite(seconds))
|
|
61
|
+
return;
|
|
62
|
+
send(`seek ${Math.max(0, Math.round(seconds))}`);
|
|
63
|
+
},
|
|
64
|
+
setVolume(next) {
|
|
65
|
+
volume = unitRange(next);
|
|
66
|
+
send(`volume ${Math.round(volume * VOLUME_SCALE)}`);
|
|
67
|
+
},
|
|
68
|
+
setMuted(muted) {
|
|
69
|
+
// rc has no mute: 0 and back is what the command set can express.
|
|
70
|
+
send(`volume ${muted ? 0 : Math.round(volume * VOLUME_SCALE)}`);
|
|
71
|
+
},
|
|
72
|
+
stop() {
|
|
73
|
+
send('stop');
|
|
74
|
+
paused = true;
|
|
75
|
+
events.onPlayingChange?.(false);
|
|
76
|
+
},
|
|
77
|
+
dispose() {
|
|
78
|
+
disposed = true;
|
|
79
|
+
socket.close();
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=vlc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vlc.js","sourceRoot":"","sources":["../../src/media-player/vlc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Ref } from 'react';
|
|
2
|
+
import type { RichTextProps } from './node.js';
|
|
3
|
+
export { ELEMENT as RICHTEXT_ELEMENT, registerRichText, RichTextNode, } from './node.js';
|
|
4
|
+
export type { NtkApp, RichTextProps, TextLayoutLike, TextRun } from './node.js';
|
|
5
|
+
export { useSelectionMenu } from './menu.js';
|
|
6
|
+
export type { SelectionMenuHandlers } from './menu.js';
|
|
7
|
+
export { useLinkClicks } from './links.js';
|
|
8
|
+
export type { LinkHandlers } from './links.js';
|
|
9
|
+
declare module 'react-x11/jsx-runtime' {
|
|
10
|
+
namespace JSX {
|
|
11
|
+
interface IntrinsicElements {
|
|
12
|
+
richtext: RichTextProps & {
|
|
13
|
+
key?: string | number;
|
|
14
|
+
ref?: Ref<unknown>;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/richtext/index.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAM/C,OAAO,EACL,OAAO,IAAI,gBAAgB,EAC3B,gBAAgB,EAChB,YAAY,GACb,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,QAAQ,uBAAuB,CAAC;IACrC,UAAU,GAAG,CAAC;QACZ,UAAU,iBAAiB;YACzB,QAAQ,EAAE,aAAa,GAAG;gBAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;gBAAC,GAAG,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;aAAE,CAAC;SACzE;KACF;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/richtext/index.ts"],"names":[],"mappings":"AAwBA,OAAO,EACL,OAAO,IAAI,gBAAgB,EAC3B,gBAAgB,EAChB,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DrawnNode, MouseEvent as X11MouseEvent } from 'react-x11';
|
|
2
|
+
export interface LinkHandlers {
|
|
3
|
+
onMouseDown: (ev: X11MouseEvent<DrawnNode>) => void;
|
|
4
|
+
onMouseUp: (ev: X11MouseEvent<DrawnNode>) => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Mouse handlers for a document root that follows links. Returns handlers
|
|
8
|
+
* that do nothing when `onLink` is absent — the component never navigates by
|
|
9
|
+
* itself, and a document with no handler simply has inert link text.
|
|
10
|
+
*/
|
|
11
|
+
export declare function useLinkClicks(onLink?: (href: string, ev: X11MouseEvent<DrawnNode>) => void): LinkHandlers;
|
|
12
|
+
//# sourceMappingURL=links.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/richtext/links.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,IAAI,aAAa,EAAE,MAAM,WAAW,CAAC;AAWxE,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,CAAC,EAAE,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;IACpD,SAAS,EAAE,CAAC,EAAE,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;CACnD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,IAAI,GAC5D,YAAY,CA6Bd"}
|