@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,368 @@
|
|
|
1
|
+
// <DatePicker> — a <Calendar> on a <popup>, hung off a field that shows the
|
|
2
|
+
// current date. Ported from react-x11's `src/components/DatePicker.js`.
|
|
3
|
+
import React, { useRef, useState } from 'react';
|
|
4
|
+
import type { ReactElement } from 'react';
|
|
5
|
+
import { createStyles } from 'react-x11/style';
|
|
6
|
+
import type { Style, StyleProperties } from 'react-x11/style';
|
|
7
|
+
import { useAnchor, useAnchorTracking, useTheme } from 'react-x11';
|
|
8
|
+
import type {
|
|
9
|
+
AnchorOptions,
|
|
10
|
+
AnchorRect,
|
|
11
|
+
DrawnNode,
|
|
12
|
+
KeyboardEvent,
|
|
13
|
+
} from 'react-x11';
|
|
14
|
+
import { XK_DOWN, XK_ESCAPE, XK_RETURN, XK_UP } from 'react-x11/keysyms';
|
|
15
|
+
|
|
16
|
+
import { hx } from '../internal/hx.js';
|
|
17
|
+
import { useDismissOnWindowBlur } from '../internal/widget.js';
|
|
18
|
+
import type { WidgetChangeEvent } from '../internal/widget.js';
|
|
19
|
+
import { CALENDAR_HEIGHT, CALENDAR_WIDTH, Calendar } from './Calendar.js';
|
|
20
|
+
import type {
|
|
21
|
+
CalendarHandle,
|
|
22
|
+
CalendarProps,
|
|
23
|
+
DateRange,
|
|
24
|
+
DateRangeInput,
|
|
25
|
+
} from './Calendar.js';
|
|
26
|
+
import { formatDay, formatDayRange, toDay } from './dates.js';
|
|
27
|
+
import type { DayInput } from './dates.js';
|
|
28
|
+
|
|
29
|
+
// A hairline round the sheet, as the menus and `Select` use: this border is
|
|
30
|
+
// where the popup meets the desktop, not a control's outline, so a theme that
|
|
31
|
+
// draws 2px borders on its buttons does not get a 2px frame here.
|
|
32
|
+
const SHEET_BORDER = 1;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* `'@supports transparency'` is a real style block — react-x11 answers it from
|
|
36
|
+
* whether the display gave the window an ARGB visual — but its `Style` type
|
|
37
|
+
* models only the `@width`/`@height` size queries and the `:state` blocks. So
|
|
38
|
+
* the block is spelled out here rather than by augmenting `StyleBlocks`
|
|
39
|
+
* globally: this package should not quietly widen what type-checks in an app
|
|
40
|
+
* that merely installs it.
|
|
41
|
+
*/
|
|
42
|
+
type SupportsStyle = Style & {
|
|
43
|
+
'@supports transparency'?: StyleProperties;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const s = createStyles({
|
|
47
|
+
trigger: {
|
|
48
|
+
flexDirection: 'row',
|
|
49
|
+
alignItems: 'center',
|
|
50
|
+
gap: 8,
|
|
51
|
+
padding: 8,
|
|
52
|
+
paddingLeft: 10,
|
|
53
|
+
paddingRight: 10,
|
|
54
|
+
cursor: 'pointer',
|
|
55
|
+
},
|
|
56
|
+
label: { flexGrow: 1 },
|
|
57
|
+
icon: { width: 14, height: 14, flexShrink: 0 },
|
|
58
|
+
sheet: { flexGrow: 1, flexShrink: 1, borderWidth: SHEET_BORDER },
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
/** A wall calendar, 14×14: the page, its two hangers and the ruled week. */
|
|
62
|
+
function CalendarGlyph({ color }: { color: string }): ReactElement {
|
|
63
|
+
return hx('canvas', {
|
|
64
|
+
style: s.icon,
|
|
65
|
+
onDraw: (ctx, { width, height }) => {
|
|
66
|
+
ctx.strokeStyle = color;
|
|
67
|
+
ctx.lineWidth = 1;
|
|
68
|
+
ctx.strokeRect(0.5, 2.5, width - 1, height - 3);
|
|
69
|
+
ctx.beginPath();
|
|
70
|
+
ctx.moveTo(0.5, 6.5);
|
|
71
|
+
ctx.lineTo(width - 0.5, 6.5);
|
|
72
|
+
ctx.moveTo(4.5, 0.5);
|
|
73
|
+
ctx.lineTo(4.5, 3.5);
|
|
74
|
+
ctx.moveTo(width - 4.5, 0.5);
|
|
75
|
+
ctx.lineTo(width - 4.5, 3.5);
|
|
76
|
+
ctx.stroke();
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** What the trigger says, when the app has not said it itself. */
|
|
82
|
+
function defaultFormat(
|
|
83
|
+
mode: string,
|
|
84
|
+
value: unknown,
|
|
85
|
+
locale: string | undefined,
|
|
86
|
+
): string | null {
|
|
87
|
+
if (mode === 'range') {
|
|
88
|
+
const range = (value ?? {}) as DateRangeInput;
|
|
89
|
+
const start = toDay(range.start);
|
|
90
|
+
const end = toDay(range.end);
|
|
91
|
+
if (!start) return null;
|
|
92
|
+
if (!end) return `${formatDay(start, locale)} → …`;
|
|
93
|
+
return formatDayRange(start, end, locale);
|
|
94
|
+
}
|
|
95
|
+
const day = toDay(value as DayInput);
|
|
96
|
+
return day ? formatDay(day, locale) : null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
type PickerOwnProps = {
|
|
100
|
+
/** What the trigger shows. Defaults to the locale's medium date, and
|
|
101
|
+
* `Intl`'s own range format when there are two of them. */
|
|
102
|
+
format?: (value: unknown) => string | null;
|
|
103
|
+
/** Shown when nothing is picked yet. */
|
|
104
|
+
placeholder?: string;
|
|
105
|
+
disabled?: boolean;
|
|
106
|
+
style?: Style | Style[];
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* `Omit` over a union collapses it into one member, which would cost the
|
|
111
|
+
* picker the thing that makes it pleasant to use: `mode` discriminating
|
|
112
|
+
* single from range, and with it the type of the `onChange` parameter. So the
|
|
113
|
+
* omit is distributed across the union instead, and `<DatePicker mode="range"
|
|
114
|
+
* onChange={(ev) => …}>` still knows `ev.value` is a `DateRange`.
|
|
115
|
+
*/
|
|
116
|
+
type DistributiveOmit<T, K extends PropertyKey> = T extends unknown
|
|
117
|
+
? Omit<T, K>
|
|
118
|
+
: never;
|
|
119
|
+
|
|
120
|
+
export type DatePickerProps = DistributiveOmit<
|
|
121
|
+
CalendarProps,
|
|
122
|
+
'focusable' | 'focusVisible' | 'ref' | 'style'
|
|
123
|
+
> &
|
|
124
|
+
PickerOwnProps;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* <DatePicker value onChange …boxProps> — a `<Calendar>` on a `<popup>`, hung
|
|
128
|
+
* off a field that shows the current date.
|
|
129
|
+
*
|
|
130
|
+
* <DatePicker value={day} onChange={(ev) => setDay(ev.value)} />
|
|
131
|
+
* <DatePicker mode="range" value={span} onChange={…} max="2026-12-31" />
|
|
132
|
+
*
|
|
133
|
+
* Every calendar prop passes straight through — `mode`, `min`/`max`,
|
|
134
|
+
* `isDateBlocked`, `spanBlocked`, `dayContent`, `locale`, `weekStartsOn` — and
|
|
135
|
+
* the value has the same shape here as there: a `'YYYY-MM-DD'` day, or
|
|
136
|
+
* `{ start, end }` in range mode.
|
|
137
|
+
*
|
|
138
|
+
* The calendar opens on the **press**, not the release, for the reason
|
|
139
|
+
* `Select`'s menu does: a control whose whole purpose is to be looked at has
|
|
140
|
+
* nothing to gain from waiting out the length of the click. It closes when the
|
|
141
|
+
* value is complete — the day in single mode, the second end of a range — on
|
|
142
|
+
* Escape, on a second press of the trigger, and when the window loses focus.
|
|
143
|
+
*
|
|
144
|
+
* The popup is override-redirect and never takes focus, so the **trigger keeps
|
|
145
|
+
* the keyboard** and hands the calendar its keys: Down/Up/Enter/Space open it,
|
|
146
|
+
* and once it is open everything the grid understands (arrows, Home/End,
|
|
147
|
+
* PageUp/PageDown, Enter, Space) goes there. Escape and Tab stay here, which
|
|
148
|
+
* is why `handleKey` reports whether it took the key.
|
|
149
|
+
*
|
|
150
|
+
* `format(value)` is the seam for the label: the default is the locale's
|
|
151
|
+
* medium date, and `Intl`'s own range format when there are two of them, which
|
|
152
|
+
* collapses the parts the ends share ("7 – 12 Aug 2026").
|
|
153
|
+
*/
|
|
154
|
+
export function DatePicker(props: DatePickerProps): ReactElement {
|
|
155
|
+
const {
|
|
156
|
+
mode = 'single',
|
|
157
|
+
value,
|
|
158
|
+
defaultValue,
|
|
159
|
+
onChange,
|
|
160
|
+
name,
|
|
161
|
+
month,
|
|
162
|
+
defaultMonth,
|
|
163
|
+
onMonthChange,
|
|
164
|
+
min,
|
|
165
|
+
max,
|
|
166
|
+
isDateBlocked,
|
|
167
|
+
spanBlocked,
|
|
168
|
+
dayContent,
|
|
169
|
+
locale,
|
|
170
|
+
weekStartsOn,
|
|
171
|
+
format,
|
|
172
|
+
placeholder,
|
|
173
|
+
disabled = false,
|
|
174
|
+
style,
|
|
175
|
+
...boxProps
|
|
176
|
+
} = props as DatePickerProps & {
|
|
177
|
+
mode?: string;
|
|
178
|
+
value?: unknown;
|
|
179
|
+
defaultValue?: unknown;
|
|
180
|
+
onChange?: (ev: WidgetChangeEvent<unknown>) => void;
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
const theme = useTheme();
|
|
184
|
+
const [open, setOpen] = useState(false);
|
|
185
|
+
// `AnchorRect` rather than `Rect`: `useAnchorTracking` reports the side the
|
|
186
|
+
// sheet actually landed on (react-x11#280), and its `setRect` is typed to
|
|
187
|
+
// hand that back. Nothing here reads `placement` — the sheet has no arrow
|
|
188
|
+
// to aim — but the state has to be able to hold it.
|
|
189
|
+
const [anchor, setAnchor] = useState<AnchorRect | null>(null);
|
|
190
|
+
const [focused, setFocused] = useState(false);
|
|
191
|
+
const [ownValue, setOwnValue] = useState<unknown>(defaultValue ?? null);
|
|
192
|
+
const triggerRef = useRef<DrawnNode | null>(null);
|
|
193
|
+
const calendarRef = useRef<CalendarHandle | null>(null);
|
|
194
|
+
|
|
195
|
+
const measureAnchor = useAnchor(triggerRef);
|
|
196
|
+
const current = value === undefined ? ownValue : value;
|
|
197
|
+
|
|
198
|
+
const width = CALENDAR_WIDTH + SHEET_BORDER * 2;
|
|
199
|
+
const height = CALENDAR_HEIGHT + SHEET_BORDER * 2;
|
|
200
|
+
const anchorOptions = (): AnchorOptions => ({
|
|
201
|
+
placement: 'bottom',
|
|
202
|
+
width,
|
|
203
|
+
height,
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
const close = (): void => setOpen(false);
|
|
207
|
+
const openCalendar = (): void => {
|
|
208
|
+
const rect = measureAnchor(anchorOptions());
|
|
209
|
+
if (!rect) return;
|
|
210
|
+
setAnchor(rect);
|
|
211
|
+
setOpen(true);
|
|
212
|
+
};
|
|
213
|
+
const toggle = (): void => (open ? close() : openCalendar());
|
|
214
|
+
|
|
215
|
+
// the same two the other popups take: keep the sheet under the trigger while
|
|
216
|
+
// anything moves it, and shut it when the window itself loses focus (the
|
|
217
|
+
// trigger keeps its focus, so its own onBlur never hears about that)
|
|
218
|
+
useAnchorTracking(triggerRef, open, anchorOptions, setAnchor, close);
|
|
219
|
+
useDismissOnWindowBlur(triggerRef, open, close);
|
|
220
|
+
|
|
221
|
+
const handleChange = (ev: WidgetChangeEvent<unknown>): void => {
|
|
222
|
+
if (value === undefined) setOwnValue(ev.value);
|
|
223
|
+
onChange?.(ev);
|
|
224
|
+
// a half-picked range is the one selection that is not finished, and the
|
|
225
|
+
// calendar has to stay up for the other end of it
|
|
226
|
+
if (mode !== 'range' || (ev.value as DateRange | null)?.end) close();
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
const onKeyDown = (ev: KeyboardEvent): void => {
|
|
230
|
+
if (ev.keysym === XK_ESCAPE) {
|
|
231
|
+
if (open) close();
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
if (open && calendarRef.current?.handleKey(ev)) return;
|
|
235
|
+
if (
|
|
236
|
+
ev.keysym === XK_DOWN ||
|
|
237
|
+
ev.keysym === XK_UP ||
|
|
238
|
+
ev.keysym === XK_RETURN ||
|
|
239
|
+
ev.codepoint === 32
|
|
240
|
+
) {
|
|
241
|
+
if (!open) openCalendar();
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
const label = format ? format(current) : defaultFormat(mode, current, locale);
|
|
246
|
+
const empty = label == null || label === '';
|
|
247
|
+
const text = empty
|
|
248
|
+
? (placeholder ?? (mode === 'range' ? 'Pick dates…' : 'Pick a date…'))
|
|
249
|
+
: label;
|
|
250
|
+
|
|
251
|
+
return hx(
|
|
252
|
+
'box',
|
|
253
|
+
{
|
|
254
|
+
theme,
|
|
255
|
+
role: 'combobox',
|
|
256
|
+
'aria-expanded': Boolean(open),
|
|
257
|
+
'aria-haspopup': 'dialog',
|
|
258
|
+
disabled: disabled || undefined,
|
|
259
|
+
ref: triggerRef,
|
|
260
|
+
focusable: !disabled,
|
|
261
|
+
onMouseDown: disabled ? undefined : toggle,
|
|
262
|
+
onFocus: () => setFocused(true),
|
|
263
|
+
onBlur: () => {
|
|
264
|
+
setFocused(false);
|
|
265
|
+
close();
|
|
266
|
+
},
|
|
267
|
+
onKeyDown: disabled ? undefined : onKeyDown,
|
|
268
|
+
...boxProps,
|
|
269
|
+
style: [
|
|
270
|
+
s.trigger,
|
|
271
|
+
{
|
|
272
|
+
cursor: disabled ? 'default' : 'pointer',
|
|
273
|
+
borderWidth: theme.borderWidth,
|
|
274
|
+
borderRadius: theme.radius,
|
|
275
|
+
borderColor: focused || open ? theme.borderFocus : theme.border,
|
|
276
|
+
backgroundColor: disabled ? theme.surfaceHover : theme.background,
|
|
277
|
+
},
|
|
278
|
+
// hover and press say "this opens", so they belong to the trigger
|
|
279
|
+
// while it is shut and are simply not declared once the calendar is
|
|
280
|
+
// down — a state block always outranks the base style, so the only
|
|
281
|
+
// way for the open look to win is for nothing to be competing
|
|
282
|
+
!disabled &&
|
|
283
|
+
!open && {
|
|
284
|
+
':hover': { backgroundColor: theme.surfaceHover },
|
|
285
|
+
':active': { backgroundColor: theme.surfaceActive },
|
|
286
|
+
},
|
|
287
|
+
style,
|
|
288
|
+
],
|
|
289
|
+
},
|
|
290
|
+
hx(
|
|
291
|
+
'text',
|
|
292
|
+
{
|
|
293
|
+
style: [
|
|
294
|
+
s.label,
|
|
295
|
+
{ color: disabled || empty ? theme.textMuted : theme.text },
|
|
296
|
+
],
|
|
297
|
+
},
|
|
298
|
+
text,
|
|
299
|
+
),
|
|
300
|
+
React.createElement(CalendarGlyph, {
|
|
301
|
+
color: disabled ? theme.border : theme.textMuted,
|
|
302
|
+
}),
|
|
303
|
+
open &&
|
|
304
|
+
anchor &&
|
|
305
|
+
hx(
|
|
306
|
+
'popup',
|
|
307
|
+
{
|
|
308
|
+
theme,
|
|
309
|
+
x: anchor.x,
|
|
310
|
+
y: anchor.y,
|
|
311
|
+
width,
|
|
312
|
+
height,
|
|
313
|
+
grab: true,
|
|
314
|
+
onDismiss: close,
|
|
315
|
+
// ARGB where the display has it, so the corners the sheet gives up
|
|
316
|
+
// are the desktop rather than a colour. The window paints nothing
|
|
317
|
+
// itself when it can be seen through — the box below is the whole
|
|
318
|
+
// of the sheet, and a square fill under it would put the corners
|
|
319
|
+
// straight back.
|
|
320
|
+
transparent: true,
|
|
321
|
+
style: {
|
|
322
|
+
backgroundColor: theme.background,
|
|
323
|
+
'@supports transparency': { backgroundColor: 'transparent' },
|
|
324
|
+
} as SupportsStyle,
|
|
325
|
+
},
|
|
326
|
+
hx(
|
|
327
|
+
'box',
|
|
328
|
+
{
|
|
329
|
+
style: [
|
|
330
|
+
s.sheet,
|
|
331
|
+
{
|
|
332
|
+
borderColor: theme.border,
|
|
333
|
+
backgroundColor: theme.background,
|
|
334
|
+
'@supports transparency': { borderRadius: theme.radiusPopup },
|
|
335
|
+
} as SupportsStyle,
|
|
336
|
+
],
|
|
337
|
+
},
|
|
338
|
+
React.createElement(Calendar, {
|
|
339
|
+
ref: calendarRef,
|
|
340
|
+
mode,
|
|
341
|
+
value: current,
|
|
342
|
+
onChange: handleChange,
|
|
343
|
+
name,
|
|
344
|
+
month,
|
|
345
|
+
defaultMonth,
|
|
346
|
+
onMonthChange,
|
|
347
|
+
min,
|
|
348
|
+
max,
|
|
349
|
+
isDateBlocked,
|
|
350
|
+
spanBlocked,
|
|
351
|
+
dayContent,
|
|
352
|
+
locale,
|
|
353
|
+
weekStartsOn,
|
|
354
|
+
// The trigger owns the keyboard: the popup is override-redirect
|
|
355
|
+
// and never takes focus, so a focusable grid inside it would take
|
|
356
|
+
// focus on the press instead — blurring the trigger, whose onBlur
|
|
357
|
+
// closes the sheet, unmounting the day under the pointer before
|
|
358
|
+
// the release could turn into a click.
|
|
359
|
+
focusable: false,
|
|
360
|
+
// …and because it does not hold the focus, it would not draw the
|
|
361
|
+
// day cursor either, leaving the arrow keys moving something
|
|
362
|
+
// invisible.
|
|
363
|
+
focusVisible: true,
|
|
364
|
+
} as CalendarProps),
|
|
365
|
+
),
|
|
366
|
+
),
|
|
367
|
+
);
|
|
368
|
+
}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
// Calendar days, and the arithmetic the date widgets do on them.
|
|
2
|
+
//
|
|
3
|
+
// Vendored from react-x11's `src/components/dates.js` when `<Calendar>` moved
|
|
4
|
+
// out here. It is pure — no renderer, no ntk, no React — which is what made
|
|
5
|
+
// the move cheap, and core is expected to drop its copy. Divergence is fine
|
|
6
|
+
// and expected; this is the owner now.
|
|
7
|
+
//
|
|
8
|
+
// **A day here is a string, `'2026-08-07'`, not a `Date`.** A date picker
|
|
9
|
+
// selects a square on a wall calendar, and that is not an instant: it has no
|
|
10
|
+
// time, no zone, and no duration that survives a DST boundary. A `Date` is an
|
|
11
|
+
// instant, so every comparison the widgets need — is this the selected day, is
|
|
12
|
+
// it inside the range, is it blocked — would be a comparison of two timestamps
|
|
13
|
+
// that are only equal if both were built the same way. `new Date(2026, 7, 7)`
|
|
14
|
+
// and `new Date('2026-08-07')` are eleven hours apart in Sydney and neither is
|
|
15
|
+
// wrong.
|
|
16
|
+
//
|
|
17
|
+
// A string has none of that: `a === b` is "the same day", `a < b` is "earlier"
|
|
18
|
+
// (fixed-width fields, so lexical order *is* chronological order), it is a
|
|
19
|
+
// `Map`/`Set` key without a codec, and it is what a calendar API hands back
|
|
20
|
+
// over the wire in the first place — which is exactly the shape the desktop
|
|
21
|
+
// event overlay in `../desktop-calendar/` produces.
|
|
22
|
+
//
|
|
23
|
+
// `Date` is still accepted everywhere a day is taken: `toDay()` converts one
|
|
24
|
+
// using its **local** calendar day, because that is the day the user was
|
|
25
|
+
// looking at when they built it.
|
|
26
|
+
//
|
|
27
|
+
// The arithmetic runs in UTC (`Date.UTC`, `getUTC*`) so that "add a day" is
|
|
28
|
+
// always 86400 seconds and never 23 or 25 — the local-time trap that puts a
|
|
29
|
+
// month grid an hour out on the last Sunday in October.
|
|
30
|
+
|
|
31
|
+
/** A calendar day, `'YYYY-MM-DD'`. */
|
|
32
|
+
export type CalendarDay = string;
|
|
33
|
+
|
|
34
|
+
/** A calendar month, `'YYYY-MM'`. */
|
|
35
|
+
export type CalendarMonth = string;
|
|
36
|
+
|
|
37
|
+
/** What every day-shaped prop accepts. */
|
|
38
|
+
export type DayInput = CalendarDay | Date | null | undefined;
|
|
39
|
+
|
|
40
|
+
/** The parts of a day, so a caller does not have to parse the string. */
|
|
41
|
+
export interface DayParts {
|
|
42
|
+
year: number;
|
|
43
|
+
/** 1-based, unlike `Date`'s. */
|
|
44
|
+
month: number;
|
|
45
|
+
day: number;
|
|
46
|
+
/** `0`-`6` from Sunday, as `Date#getDay()` counts. */
|
|
47
|
+
weekday: number;
|
|
48
|
+
date: Date;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const DAY_RE = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
52
|
+
const MONTH_RE = /^(\d{4})-(\d{2})$/;
|
|
53
|
+
|
|
54
|
+
function pad(n: number, width: number): string {
|
|
55
|
+
return String(n).padStart(width, '0');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function key(year: number, month: number, day: number): CalendarDay {
|
|
59
|
+
return `${pad(year, 4)}-${pad(month, 2)}-${pad(day, 2)}`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* A day key from a `'YYYY-MM-DD'` string, a `Date`, or `null`/`undefined`
|
|
64
|
+
* (which is "no day", and comes back as `null`).
|
|
65
|
+
*
|
|
66
|
+
* Throws on anything else, and on a string that is not a real date —
|
|
67
|
+
* `'2026-02-30'` is a typo, not a day, and silently sliding it to March 2nd
|
|
68
|
+
* the way `new Date()` does is how a booking ends up a day out. The message
|
|
69
|
+
* names what arrived, because the value in a props object is usually miles
|
|
70
|
+
* from the line that built it.
|
|
71
|
+
*/
|
|
72
|
+
export function toDay(value: DayInput): CalendarDay | null {
|
|
73
|
+
if (value == null) return null;
|
|
74
|
+
if (value instanceof Date) {
|
|
75
|
+
if (Number.isNaN(value.getTime())) {
|
|
76
|
+
throw new TypeError(
|
|
77
|
+
'@react-x11/components: an Invalid Date was passed where a calendar day was expected.',
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
// its *local* calendar day: `new Date(2026, 7, 7)` is local midnight, and
|
|
81
|
+
// the day the developer wrote down is the one they meant
|
|
82
|
+
return key(value.getFullYear(), value.getMonth() + 1, value.getDate());
|
|
83
|
+
}
|
|
84
|
+
if (typeof value === 'string') {
|
|
85
|
+
const m = DAY_RE.exec(value);
|
|
86
|
+
if (!m) {
|
|
87
|
+
throw new TypeError(
|
|
88
|
+
`@react-x11/components: expected a calendar day as 'YYYY-MM-DD' or a Date, got ${JSON.stringify(value)}.`,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
const [, y, mo, d] = m;
|
|
92
|
+
// through a real Date and back: the fields on their own are well-formed
|
|
93
|
+
// for '2026-02-30' too, and only the calendar knows February ends earlier
|
|
94
|
+
const date = new Date(Date.UTC(Number(y), Number(mo) - 1, Number(d)));
|
|
95
|
+
const round = key(
|
|
96
|
+
date.getUTCFullYear(),
|
|
97
|
+
date.getUTCMonth() + 1,
|
|
98
|
+
date.getUTCDate(),
|
|
99
|
+
);
|
|
100
|
+
if (round !== value) {
|
|
101
|
+
throw new TypeError(
|
|
102
|
+
`@react-x11/components: ${JSON.stringify(value)} is not a real calendar date.`,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
return value;
|
|
106
|
+
}
|
|
107
|
+
throw new TypeError(
|
|
108
|
+
`@react-x11/components: expected a calendar day as 'YYYY-MM-DD' or a Date, got ${typeof value}.`,
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** `'YYYY-MM'` from the same set of inputs, for the *visible month* props. */
|
|
113
|
+
export function toMonth(value: DayInput): CalendarMonth | null {
|
|
114
|
+
if (value == null) return null;
|
|
115
|
+
if (typeof value === 'string' && MONTH_RE.test(value)) return value;
|
|
116
|
+
const day = toDay(value);
|
|
117
|
+
return day == null ? null : monthOf(day);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Today, on this machine, in local time — which is the day the user's wall
|
|
121
|
+
* calendar is showing. */
|
|
122
|
+
export function today(): CalendarDay {
|
|
123
|
+
const now = new Date();
|
|
124
|
+
return key(now.getFullYear(), now.getMonth() + 1, now.getDate());
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** The day as a UTC-midnight `Date`, for `Intl` and for arithmetic. */
|
|
128
|
+
export function dayDate(day: CalendarDay): Date {
|
|
129
|
+
const [y, m, d] = day.split('-').map(Number);
|
|
130
|
+
return new Date(Date.UTC(y, m - 1, d));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* `{ year, month, day, weekday, date }` — the parts a caller needs to decide
|
|
135
|
+
* something about a day without parsing the string itself. `weekday` is
|
|
136
|
+
* `0`-`6` from Sunday, as `Date#getDay()` counts, so blocking weekends is
|
|
137
|
+
* `weekday === 0 || weekday === 6`. `month` is 1-based, unlike `Date`'s.
|
|
138
|
+
*/
|
|
139
|
+
export function dayParts(day: CalendarDay): DayParts {
|
|
140
|
+
const date = dayDate(day);
|
|
141
|
+
return {
|
|
142
|
+
year: date.getUTCFullYear(),
|
|
143
|
+
month: date.getUTCMonth() + 1,
|
|
144
|
+
day: date.getUTCDate(),
|
|
145
|
+
weekday: date.getUTCDay(),
|
|
146
|
+
date,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function addDays(day: CalendarDay, n: number): CalendarDay {
|
|
151
|
+
const date = dayDate(day);
|
|
152
|
+
date.setUTCDate(date.getUTCDate() + n);
|
|
153
|
+
return key(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate());
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** `'2026-08'` — the month a day is in. */
|
|
157
|
+
export function monthOf(day: CalendarDay): CalendarMonth {
|
|
158
|
+
return day.slice(0, 7);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** The first day of a `'YYYY-MM'`. */
|
|
162
|
+
export function firstOfMonth(month: CalendarMonth): CalendarDay {
|
|
163
|
+
return `${month}-01`;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* `n` months on from a `'YYYY-MM'`. Months, unlike days, are not all the same
|
|
168
|
+
* length, so this deliberately works on the month key and never on a day: the
|
|
169
|
+
* "same date next month" question (Jan 31 → Feb 31?) has no good answer and
|
|
170
|
+
* nothing here asks it.
|
|
171
|
+
*/
|
|
172
|
+
export function addMonths(month: CalendarMonth, n: number): CalendarMonth {
|
|
173
|
+
const [y, m] = month.split('-').map(Number);
|
|
174
|
+
const total = y * 12 + (m - 1) + n;
|
|
175
|
+
return `${pad(Math.floor(total / 12), 4)}-${pad((total % 12) + 1, 2)}`;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** `day` held inside `[min, max]`; either bound may be null. */
|
|
179
|
+
export function clampDay(
|
|
180
|
+
day: CalendarDay,
|
|
181
|
+
min: CalendarDay | null,
|
|
182
|
+
max: CalendarDay | null,
|
|
183
|
+
): CalendarDay {
|
|
184
|
+
if (min && day < min) return min;
|
|
185
|
+
if (max && day > max) return max;
|
|
186
|
+
return day;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* The grid a month is drawn on: **six weeks of seven days**, always, starting
|
|
191
|
+
* on `weekStartsOn` and running through whatever days of the neighbouring
|
|
192
|
+
* months it takes to fill the corners.
|
|
193
|
+
*
|
|
194
|
+
* Six rows even when five would do (and a 28-day February starting on the
|
|
195
|
+
* first day of the week needs only four) because the alternative is a picker
|
|
196
|
+
* whose popup changes height as you page through it, moving the very buttons
|
|
197
|
+
* the pointer is aiming at.
|
|
198
|
+
*/
|
|
199
|
+
export function monthGrid(
|
|
200
|
+
month: CalendarMonth,
|
|
201
|
+
weekStartsOn = 1,
|
|
202
|
+
): CalendarDay[][] {
|
|
203
|
+
const first = firstOfMonth(month);
|
|
204
|
+
const lead = (dayParts(first).weekday - weekStartsOn + 7) % 7;
|
|
205
|
+
const start = addDays(first, -lead);
|
|
206
|
+
const weeks: CalendarDay[][] = [];
|
|
207
|
+
for (let w = 0; w < 6; w++) {
|
|
208
|
+
const days: CalendarDay[] = [];
|
|
209
|
+
for (let d = 0; d < 7; d++) days.push(addDays(start, w * 7 + d));
|
|
210
|
+
weeks.push(days);
|
|
211
|
+
}
|
|
212
|
+
return weeks;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Intl formatters are expensive to build and every cell in the grid wants the
|
|
216
|
+
// same three, so they are made once per (locale, shape) and kept.
|
|
217
|
+
const formatters = new Map<string, Intl.DateTimeFormat>();
|
|
218
|
+
|
|
219
|
+
function formatter(
|
|
220
|
+
locale: string | undefined,
|
|
221
|
+
options: Intl.DateTimeFormatOptions,
|
|
222
|
+
): Intl.DateTimeFormat {
|
|
223
|
+
const id = `${locale ?? ''}|${JSON.stringify(options)}`;
|
|
224
|
+
let f = formatters.get(id);
|
|
225
|
+
if (!f) {
|
|
226
|
+
// everything here is a UTC-midnight Date, so the formatter has to read it
|
|
227
|
+
// in UTC or a negative offset prints the day before
|
|
228
|
+
f = new Intl.DateTimeFormat(locale, { ...options, timeZone: 'UTC' });
|
|
229
|
+
formatters.set(id, f);
|
|
230
|
+
}
|
|
231
|
+
return f;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Which day the week starts on for a locale: `0` Sunday … `6` Saturday.
|
|
236
|
+
*
|
|
237
|
+
* The runtime knows this — CLDR carries it — but only through
|
|
238
|
+
* `Intl.Locale#getWeekInfo`, which is recent enough that a small-ICU build or
|
|
239
|
+
* an older V8 has neither it nor the `weekInfo` property it was proposed as.
|
|
240
|
+
* So it is feature-detected, and what is left when it is missing is **Monday**:
|
|
241
|
+
* ISO 8601's answer, and the one most of the world uses.
|
|
242
|
+
*/
|
|
243
|
+
export function localeWeekStart(locale?: string): number {
|
|
244
|
+
try {
|
|
245
|
+
const info = new Intl.Locale(locale ?? 'und');
|
|
246
|
+
// `getWeekInfo()` is the standardised spelling; `weekInfo` is what the
|
|
247
|
+
// proposal shipped as and what older V8 still has.
|
|
248
|
+
const withWeek = info as Intl.Locale & {
|
|
249
|
+
getWeekInfo?: () => { firstDay?: number };
|
|
250
|
+
weekInfo?: { firstDay?: number };
|
|
251
|
+
};
|
|
252
|
+
const week = withWeek.getWeekInfo?.() ?? withWeek.weekInfo;
|
|
253
|
+
// CLDR counts 1 Monday … 7 Sunday; JS counts 0 Sunday … 6 Saturday
|
|
254
|
+
if (week?.firstDay) return week.firstDay % 7;
|
|
255
|
+
} catch {
|
|
256
|
+
// an invalid locale tag: the caller's formatters will complain about it
|
|
257
|
+
// more usefully than a week-start fallback could
|
|
258
|
+
}
|
|
259
|
+
return 1;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/** `['Mon', 'Tue', …]` in the locale, rotated to start on `weekStartsOn`. */
|
|
263
|
+
export function weekdayLabels(locale?: string, weekStartsOn = 1): string[] {
|
|
264
|
+
const f = formatter(locale, { weekday: 'short' });
|
|
265
|
+
// 2026-08-02 is a Sunday, so `+ weekday` lands on the day we want a name for
|
|
266
|
+
return Array.from({ length: 7 }, (_, i) =>
|
|
267
|
+
f.format(dayDate(addDays('2026-08-02', (weekStartsOn + i) % 7))),
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/** `'August 2026'` in the locale. */
|
|
272
|
+
export function formatMonth(month: CalendarMonth, locale?: string): string {
|
|
273
|
+
return formatter(locale, { month: 'long', year: 'numeric' }).format(
|
|
274
|
+
dayDate(firstOfMonth(month)),
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/** `'7 Aug 2026'` in the locale — what a picker's trigger shows. */
|
|
279
|
+
export function formatDay(
|
|
280
|
+
day: CalendarDay,
|
|
281
|
+
locale?: string,
|
|
282
|
+
options?: Intl.DateTimeFormatOptions,
|
|
283
|
+
): string {
|
|
284
|
+
return formatter(locale, options ?? { dateStyle: 'medium' }).format(
|
|
285
|
+
dayDate(day),
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* `'7 – 12 Aug 2026'`: the locale's own way of writing a span, which collapses
|
|
291
|
+
* the parts the two ends share. `formatRange` is ES2021 and universal in the
|
|
292
|
+
* Node versions this package supports, but a small-ICU build can still throw,
|
|
293
|
+
* so a plain "a – b" is kept behind it.
|
|
294
|
+
*/
|
|
295
|
+
export function formatDayRange(
|
|
296
|
+
start: CalendarDay,
|
|
297
|
+
end: CalendarDay,
|
|
298
|
+
locale?: string,
|
|
299
|
+
options?: Intl.DateTimeFormatOptions,
|
|
300
|
+
): string {
|
|
301
|
+
const f = formatter(locale, options ?? { dateStyle: 'medium' });
|
|
302
|
+
try {
|
|
303
|
+
return f.formatRange(dayDate(start), dayDate(end));
|
|
304
|
+
} catch {
|
|
305
|
+
return `${f.format(dayDate(start))} – ${f.format(dayDate(end))}`;
|
|
306
|
+
}
|
|
307
|
+
}
|