@vielzeug/refine 1.1.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 +89 -0
- package/dist/_dev.cjs +2 -0
- package/dist/_dev.cjs.map +1 -0
- package/dist/_dev.d.ts +2 -0
- package/dist/_dev.d.ts.map +1 -0
- package/dist/_dev.js +9 -0
- package/dist/_dev.js.map +1 -0
- package/dist/_virtual/_rolldown/runtime.cjs +1 -0
- package/dist/accordion-item.cjs +26 -0
- package/dist/accordion-item.cjs.map +1 -0
- package/dist/accordion-item.js +124 -0
- package/dist/accordion-item.js.map +1 -0
- package/dist/accordion.cjs +2 -0
- package/dist/accordion.cjs.map +1 -0
- package/dist/accordion.js +47 -0
- package/dist/accordion.js.map +1 -0
- package/dist/alert.cjs +36 -0
- package/dist/alert.cjs.map +1 -0
- package/dist/alert.js +93 -0
- package/dist/alert.js.map +1 -0
- package/dist/async.cjs +55 -0
- package/dist/async.cjs.map +1 -0
- package/dist/async.js +99 -0
- package/dist/async.js.map +1 -0
- package/dist/avatar.cjs +18 -0
- package/dist/avatar.cjs.map +1 -0
- package/dist/avatar.js +108 -0
- package/dist/avatar.js.map +1 -0
- package/dist/badge.cjs +7 -0
- package/dist/badge.cjs.map +1 -0
- package/dist/badge.js +65 -0
- package/dist/badge.js.map +1 -0
- package/dist/box.cjs +2 -0
- package/dist/box.cjs.map +1 -0
- package/dist/box.js +31 -0
- package/dist/box.js.map +1 -0
- package/dist/breadcrumb.cjs +21 -0
- package/dist/breadcrumb.cjs.map +1 -0
- package/dist/breadcrumb.js +57 -0
- package/dist/breadcrumb.js.map +1 -0
- package/dist/button-group.cjs +6 -0
- package/dist/button-group.cjs.map +1 -0
- package/dist/button-group.js +33 -0
- package/dist/button-group.js.map +1 -0
- package/dist/button.cjs +18 -0
- package/dist/button.cjs.map +1 -0
- package/dist/button.js +124 -0
- package/dist/button.js.map +1 -0
- package/dist/calendar.cjs +126 -0
- package/dist/calendar.cjs.map +1 -0
- package/dist/calendar.js +300 -0
- package/dist/calendar.js.map +1 -0
- package/dist/card.cjs +23 -0
- package/dist/card.cjs.map +1 -0
- package/dist/card.js +87 -0
- package/dist/card.js.map +1 -0
- package/dist/carousel.cjs +61 -0
- package/dist/carousel.cjs.map +1 -0
- package/dist/carousel.js +280 -0
- package/dist/carousel.js.map +1 -0
- package/dist/checkbox-group.cjs +18 -0
- package/dist/checkbox-group.cjs.map +1 -0
- package/dist/checkbox-group.js +118 -0
- package/dist/checkbox-group.js.map +1 -0
- package/dist/checkbox.cjs +11 -0
- package/dist/checkbox.cjs.map +1 -0
- package/dist/checkbox.js +88 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chip.cjs +42 -0
- package/dist/chip.cjs.map +1 -0
- package/dist/chip.js +133 -0
- package/dist/chip.js.map +1 -0
- package/dist/code-window.cjs +19 -0
- package/dist/code-window.cjs.map +1 -0
- package/dist/code-window.js +41 -0
- package/dist/code-window.js.map +1 -0
- package/dist/combobox.cjs +103 -0
- package/dist/combobox.cjs.map +1 -0
- package/dist/combobox.js +444 -0
- package/dist/combobox.js.map +1 -0
- package/dist/content/avatar/avatar-group.css?inline.cjs +2 -0
- package/dist/content/avatar/avatar-group.css?inline.cjs.map +1 -0
- package/dist/content/avatar/avatar-group.css?inline.js +6 -0
- package/dist/content/avatar/avatar-group.css?inline.js.map +1 -0
- package/dist/content/avatar/avatar.css?inline.cjs +2 -0
- package/dist/content/avatar/avatar.css?inline.cjs.map +1 -0
- package/dist/content/avatar/avatar.css?inline.js +6 -0
- package/dist/content/avatar/avatar.css?inline.js.map +1 -0
- package/dist/content/avatar/avatar.d.ts +88 -0
- package/dist/content/avatar/avatar.d.ts.map +1 -0
- package/dist/content/breadcrumb/breadcrumb-item.css?inline.cjs +2 -0
- package/dist/content/breadcrumb/breadcrumb-item.css?inline.cjs.map +1 -0
- package/dist/content/breadcrumb/breadcrumb-item.css?inline.js +6 -0
- package/dist/content/breadcrumb/breadcrumb-item.css?inline.js.map +1 -0
- package/dist/content/breadcrumb/breadcrumb.css?inline.cjs +2 -0
- package/dist/content/breadcrumb/breadcrumb.css?inline.cjs.map +1 -0
- package/dist/content/breadcrumb/breadcrumb.css?inline.js +6 -0
- package/dist/content/breadcrumb/breadcrumb.css?inline.js.map +1 -0
- package/dist/content/breadcrumb/breadcrumb.d.ts +57 -0
- package/dist/content/breadcrumb/breadcrumb.d.ts.map +1 -0
- package/dist/content/card/card.css?inline.cjs +2 -0
- package/dist/content/card/card.css?inline.cjs.map +1 -0
- package/dist/content/card/card.css?inline.js +6 -0
- package/dist/content/card/card.css?inline.js.map +1 -0
- package/dist/content/card/card.d.ts +74 -0
- package/dist/content/card/card.d.ts.map +1 -0
- package/dist/content/carousel/carousel-slide.cjs +2 -0
- package/dist/content/carousel/carousel-slide.cjs.map +1 -0
- package/dist/content/carousel/carousel-slide.css?inline.cjs +2 -0
- package/dist/content/carousel/carousel-slide.css?inline.cjs.map +1 -0
- package/dist/content/carousel/carousel-slide.css?inline.js +6 -0
- package/dist/content/carousel/carousel-slide.css?inline.js.map +1 -0
- package/dist/content/carousel/carousel-slide.d.ts +2 -0
- package/dist/content/carousel/carousel-slide.d.ts.map +1 -0
- package/dist/content/carousel/carousel-slide.js +18 -0
- package/dist/content/carousel/carousel-slide.js.map +1 -0
- package/dist/content/carousel/carousel.css?inline.cjs +2 -0
- package/dist/content/carousel/carousel.css?inline.cjs.map +1 -0
- package/dist/content/carousel/carousel.css?inline.js +6 -0
- package/dist/content/carousel/carousel.css?inline.js.map +1 -0
- package/dist/content/carousel/carousel.d.ts +110 -0
- package/dist/content/carousel/carousel.d.ts.map +1 -0
- package/dist/content/carousel/index.d.ts +3 -0
- package/dist/content/carousel/index.d.ts.map +1 -0
- package/dist/content/code-window/code-window.css?inline.cjs +2 -0
- package/dist/content/code-window/code-window.css?inline.cjs.map +1 -0
- package/dist/content/code-window/code-window.css?inline.js +6 -0
- package/dist/content/code-window/code-window.css?inline.js.map +1 -0
- package/dist/content/code-window/code-window.d.ts +61 -0
- package/dist/content/code-window/code-window.d.ts.map +1 -0
- package/dist/content/copy-command/copy-command.css?inline.cjs +2 -0
- package/dist/content/copy-command/copy-command.css?inline.cjs.map +1 -0
- package/dist/content/copy-command/copy-command.css?inline.js +6 -0
- package/dist/content/copy-command/copy-command.css?inline.js.map +1 -0
- package/dist/content/copy-command/copy-command.d.ts +66 -0
- package/dist/content/copy-command/copy-command.d.ts.map +1 -0
- package/dist/content/icon/icon.css?inline.cjs +2 -0
- package/dist/content/icon/icon.css?inline.cjs.map +1 -0
- package/dist/content/icon/icon.css?inline.js +6 -0
- package/dist/content/icon/icon.css?inline.js.map +1 -0
- package/dist/content/icon/icon.d.ts +45 -0
- package/dist/content/icon/icon.d.ts.map +1 -0
- package/dist/content/index.d.ts +23 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/pagination/pagination.css?inline.cjs +2 -0
- package/dist/content/pagination/pagination.css?inline.cjs.map +1 -0
- package/dist/content/pagination/pagination.css?inline.js +6 -0
- package/dist/content/pagination/pagination.css?inline.js.map +1 -0
- package/dist/content/pagination/pagination.d.ts +61 -0
- package/dist/content/pagination/pagination.d.ts.map +1 -0
- package/dist/content/separator/separator.css?inline.cjs +2 -0
- package/dist/content/separator/separator.css?inline.cjs.map +1 -0
- package/dist/content/separator/separator.css?inline.js +6 -0
- package/dist/content/separator/separator.css?inline.js.map +1 -0
- package/dist/content/separator/separator.d.ts +38 -0
- package/dist/content/separator/separator.d.ts.map +1 -0
- package/dist/content/table/table.css?inline.cjs +2 -0
- package/dist/content/table/table.css?inline.cjs.map +1 -0
- package/dist/content/table/table.css?inline.js +6 -0
- package/dist/content/table/table.css?inline.js.map +1 -0
- package/dist/content/table/table.d.ts +76 -0
- package/dist/content/table/table.d.ts.map +1 -0
- package/dist/content/text/text.css?inline.cjs +2 -0
- package/dist/content/text/text.css?inline.cjs.map +1 -0
- package/dist/content/text/text.css?inline.js +6 -0
- package/dist/content/text/text.css?inline.js.map +1 -0
- package/dist/content/text/text.d.ts +55 -0
- package/dist/content/text/text.d.ts.map +1 -0
- package/dist/copy-command.cjs +17 -0
- package/dist/copy-command.cjs.map +1 -0
- package/dist/copy-command.js +55 -0
- package/dist/copy-command.js.map +1 -0
- package/dist/custom-elements.json +12641 -0
- package/dist/datagrid.cjs +435 -0
- package/dist/datagrid.cjs.map +1 -0
- package/dist/datagrid.js +764 -0
- package/dist/datagrid.js.map +1 -0
- package/dist/date-picker.cjs +133 -0
- package/dist/date-picker.cjs.map +1 -0
- package/dist/date-picker.js +315 -0
- package/dist/date-picker.js.map +1 -0
- package/dist/dialog.cjs +28 -0
- package/dist/dialog.cjs.map +1 -0
- package/dist/dialog.js +88 -0
- package/dist/dialog.js.map +1 -0
- package/dist/disclosure/accordion/accordion.css?inline.cjs +2 -0
- package/dist/disclosure/accordion/accordion.css?inline.cjs.map +1 -0
- package/dist/disclosure/accordion/accordion.css?inline.js +6 -0
- package/dist/disclosure/accordion/accordion.css?inline.js.map +1 -0
- package/dist/disclosure/accordion/accordion.d.ts +62 -0
- package/dist/disclosure/accordion/accordion.d.ts.map +1 -0
- package/dist/disclosure/accordion-item/accordion-item.css?inline.cjs +2 -0
- package/dist/disclosure/accordion-item/accordion-item.css?inline.cjs.map +1 -0
- package/dist/disclosure/accordion-item/accordion-item.css?inline.js +6 -0
- package/dist/disclosure/accordion-item/accordion-item.css?inline.js.map +1 -0
- package/dist/disclosure/accordion-item/accordion-item.d.ts +70 -0
- package/dist/disclosure/accordion-item/accordion-item.d.ts.map +1 -0
- package/dist/disclosure/index.d.ts +11 -0
- package/dist/disclosure/index.d.ts.map +1 -0
- package/dist/disclosure/tab-item/tab-item.css?inline.cjs +2 -0
- package/dist/disclosure/tab-item/tab-item.css?inline.cjs.map +1 -0
- package/dist/disclosure/tab-item/tab-item.css?inline.js +6 -0
- package/dist/disclosure/tab-item/tab-item.css?inline.js.map +1 -0
- package/dist/disclosure/tab-item/tab-item.d.ts +49 -0
- package/dist/disclosure/tab-item/tab-item.d.ts.map +1 -0
- package/dist/disclosure/tab-panel/tab-panel.css?inline.cjs +2 -0
- package/dist/disclosure/tab-panel/tab-panel.css?inline.cjs.map +1 -0
- package/dist/disclosure/tab-panel/tab-panel.css?inline.js +6 -0
- package/dist/disclosure/tab-panel/tab-panel.css?inline.js.map +1 -0
- package/dist/disclosure/tab-panel/tab-panel.d.ts +33 -0
- package/dist/disclosure/tab-panel/tab-panel.d.ts.map +1 -0
- package/dist/disclosure/tabs/tabs.css?inline.cjs +2 -0
- package/dist/disclosure/tabs/tabs.css?inline.cjs.map +1 -0
- package/dist/disclosure/tabs/tabs.css?inline.js +6 -0
- package/dist/disclosure/tabs/tabs.css?inline.js.map +1 -0
- package/dist/disclosure/tabs/tabs.d.ts +75 -0
- package/dist/disclosure/tabs/tabs.d.ts.map +1 -0
- package/dist/drawer.cjs +32 -0
- package/dist/drawer.cjs.map +1 -0
- package/dist/drawer.js +199 -0
- package/dist/drawer.js.map +1 -0
- package/dist/errors.cjs +2 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.ts +9 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -0
- package/dist/feedback/alert/alert.css?inline.cjs +2 -0
- package/dist/feedback/alert/alert.css?inline.cjs.map +1 -0
- package/dist/feedback/alert/alert.css?inline.js +6 -0
- package/dist/feedback/alert/alert.css?inline.js.map +1 -0
- package/dist/feedback/alert/alert.d.ts +74 -0
- package/dist/feedback/alert/alert.d.ts.map +1 -0
- package/dist/feedback/async/async.css?inline.cjs +2 -0
- package/dist/feedback/async/async.css?inline.cjs.map +1 -0
- package/dist/feedback/async/async.css?inline.js +6 -0
- package/dist/feedback/async/async.css?inline.js.map +1 -0
- package/dist/feedback/async/async.d.ts +54 -0
- package/dist/feedback/async/async.d.ts.map +1 -0
- package/dist/feedback/badge/badge.css?inline.cjs +2 -0
- package/dist/feedback/badge/badge.css?inline.cjs.map +1 -0
- package/dist/feedback/badge/badge.css?inline.js +6 -0
- package/dist/feedback/badge/badge.css?inline.js.map +1 -0
- package/dist/feedback/badge/badge.d.ts +69 -0
- package/dist/feedback/badge/badge.d.ts.map +1 -0
- package/dist/feedback/chip/chip.css?inline.cjs +2 -0
- package/dist/feedback/chip/chip.css?inline.cjs.map +1 -0
- package/dist/feedback/chip/chip.css?inline.js +6 -0
- package/dist/feedback/chip/chip.css?inline.js.map +1 -0
- package/dist/feedback/chip/chip.d.ts +136 -0
- package/dist/feedback/chip/chip.d.ts.map +1 -0
- package/dist/feedback/index.d.ts +17 -0
- package/dist/feedback/index.d.ts.map +1 -0
- package/dist/feedback/password-strength/password-strength.css?inline.cjs +2 -0
- package/dist/feedback/password-strength/password-strength.css?inline.cjs.map +1 -0
- package/dist/feedback/password-strength/password-strength.css?inline.js +6 -0
- package/dist/feedback/password-strength/password-strength.css?inline.js.map +1 -0
- package/dist/feedback/password-strength/password-strength.d.ts +66 -0
- package/dist/feedback/password-strength/password-strength.d.ts.map +1 -0
- package/dist/feedback/progress/progress.css?inline.cjs +2 -0
- package/dist/feedback/progress/progress.css?inline.cjs.map +1 -0
- package/dist/feedback/progress/progress.css?inline.js +6 -0
- package/dist/feedback/progress/progress.css?inline.js.map +1 -0
- package/dist/feedback/progress/progress.d.ts +68 -0
- package/dist/feedback/progress/progress.d.ts.map +1 -0
- package/dist/feedback/skeleton/skeleton.css?inline.cjs +2 -0
- package/dist/feedback/skeleton/skeleton.css?inline.cjs.map +1 -0
- package/dist/feedback/skeleton/skeleton.css?inline.js +6 -0
- package/dist/feedback/skeleton/skeleton.css?inline.js.map +1 -0
- package/dist/feedback/skeleton/skeleton.d.ts +63 -0
- package/dist/feedback/skeleton/skeleton.d.ts.map +1 -0
- package/dist/feedback/toast/index.d.ts +2 -0
- package/dist/feedback/toast/index.d.ts.map +1 -0
- package/dist/feedback/toast/toast.css?inline.cjs +2 -0
- package/dist/feedback/toast/toast.css?inline.cjs.map +1 -0
- package/dist/feedback/toast/toast.css?inline.js +6 -0
- package/dist/feedback/toast/toast.css?inline.js.map +1 -0
- package/dist/feedback/toast/toast.d.ts +127 -0
- package/dist/feedback/toast/toast.d.ts.map +1 -0
- package/dist/file-input.cjs +70 -0
- package/dist/file-input.cjs.map +1 -0
- package/dist/file-input.js +209 -0
- package/dist/file-input.js.map +1 -0
- package/dist/form.cjs +11 -0
- package/dist/form.cjs.map +1 -0
- package/dist/form.js +56 -0
- package/dist/form.js.map +1 -0
- package/dist/grid-item.cjs +2 -0
- package/dist/grid-item.cjs.map +1 -0
- package/dist/grid-item.js +35 -0
- package/dist/grid-item.js.map +1 -0
- package/dist/grid.cjs +2 -0
- package/dist/grid.cjs.map +1 -0
- package/dist/grid.js +90 -0
- package/dist/grid.js.map +1 -0
- package/dist/headless/_internal.d.ts +17 -0
- package/dist/headless/_internal.d.ts.map +1 -0
- package/dist/headless/announcer.cjs +2 -0
- package/dist/headless/announcer.cjs.map +1 -0
- package/dist/headless/announcer.d.ts +25 -0
- package/dist/headless/announcer.d.ts.map +1 -0
- package/dist/headless/announcer.js +24 -0
- package/dist/headless/announcer.js.map +1 -0
- package/dist/headless/checkable.cjs +2 -0
- package/dist/headless/checkable.cjs.map +1 -0
- package/dist/headless/checkable.d.ts +42 -0
- package/dist/headless/checkable.d.ts.map +1 -0
- package/dist/headless/checkable.js +36 -0
- package/dist/headless/checkable.js.map +1 -0
- package/dist/headless/choice-field.cjs +2 -0
- package/dist/headless/choice-field.cjs.map +1 -0
- package/dist/headless/choice-field.d.ts +36 -0
- package/dist/headless/choice-field.d.ts.map +1 -0
- package/dist/headless/choice-field.js +42 -0
- package/dist/headless/choice-field.js.map +1 -0
- package/dist/headless/datagrid.cjs +2 -0
- package/dist/headless/datagrid.cjs.map +1 -0
- package/dist/headless/datagrid.d.ts +158 -0
- package/dist/headless/datagrid.d.ts.map +1 -0
- package/dist/headless/datagrid.js +55 -0
- package/dist/headless/datagrid.js.map +1 -0
- package/dist/headless/date-picker.cjs +2 -0
- package/dist/headless/date-picker.cjs.map +1 -0
- package/dist/headless/date-picker.d.ts +114 -0
- package/dist/headless/date-picker.d.ts.map +1 -0
- package/dist/headless/date-picker.js +184 -0
- package/dist/headless/date-picker.js.map +1 -0
- package/dist/headless/dialog-focus.cjs +2 -0
- package/dist/headless/dialog-focus.cjs.map +1 -0
- package/dist/headless/dialog-focus.d.ts +40 -0
- package/dist/headless/dialog-focus.d.ts.map +1 -0
- package/dist/headless/dialog-focus.js +22 -0
- package/dist/headless/dialog-focus.js.map +1 -0
- package/dist/headless/direction.cjs +2 -0
- package/dist/headless/direction.cjs.map +1 -0
- package/dist/headless/direction.d.ts +11 -0
- package/dist/headless/direction.d.ts.map +1 -0
- package/dist/headless/direction.js +14 -0
- package/dist/headless/direction.js.map +1 -0
- package/dist/headless/field-base.cjs +2 -0
- package/dist/headless/field-base.cjs.map +1 -0
- package/dist/headless/field-base.d.ts +148 -0
- package/dist/headless/field-base.d.ts.map +1 -0
- package/dist/headless/field-base.js +46 -0
- package/dist/headless/field-base.js.map +1 -0
- package/dist/headless/focus-trap.cjs +2 -0
- package/dist/headless/focus-trap.cjs.map +1 -0
- package/dist/headless/focus-trap.d.ts +45 -0
- package/dist/headless/focus-trap.d.ts.map +1 -0
- package/dist/headless/focus-trap.js +51 -0
- package/dist/headless/focus-trap.js.map +1 -0
- package/dist/headless/focus.cjs +2 -0
- package/dist/headless/focus.cjs.map +1 -0
- package/dist/headless/focus.d.ts +34 -0
- package/dist/headless/focus.d.ts.map +1 -0
- package/dist/headless/focus.js +34 -0
- package/dist/headless/focus.js.map +1 -0
- package/dist/headless/index.d.ts +28 -0
- package/dist/headless/index.d.ts.map +1 -0
- package/dist/headless/keyboard.cjs +2 -0
- package/dist/headless/keyboard.cjs.map +1 -0
- package/dist/headless/keyboard.d.ts +52 -0
- package/dist/headless/keyboard.d.ts.map +1 -0
- package/dist/headless/keyboard.js +29 -0
- package/dist/headless/keyboard.js.map +1 -0
- package/dist/headless/light-dom.cjs +2 -0
- package/dist/headless/light-dom.cjs.map +1 -0
- package/dist/headless/light-dom.d.ts +12 -0
- package/dist/headless/light-dom.d.ts.map +1 -0
- package/dist/headless/light-dom.js +6 -0
- package/dist/headless/light-dom.js.map +1 -0
- package/dist/headless/nav.cjs +2 -0
- package/dist/headless/nav.cjs.map +1 -0
- package/dist/headless/nav.d.ts +66 -0
- package/dist/headless/nav.d.ts.map +1 -0
- package/dist/headless/nav.js +115 -0
- package/dist/headless/nav.js.map +1 -0
- package/dist/headless/numbers.cjs +2 -0
- package/dist/headless/numbers.cjs.map +1 -0
- package/dist/headless/numbers.d.ts +14 -0
- package/dist/headless/numbers.d.ts.map +1 -0
- package/dist/headless/numbers.js +9 -0
- package/dist/headless/numbers.js.map +1 -0
- package/dist/headless/option-list.cjs +2 -0
- package/dist/headless/option-list.cjs.map +1 -0
- package/dist/headless/option-list.d.ts +107 -0
- package/dist/headless/option-list.d.ts.map +1 -0
- package/dist/headless/option-list.js +66 -0
- package/dist/headless/option-list.js.map +1 -0
- package/dist/headless/ore.cjs +2 -0
- package/dist/headless/ore.cjs.map +1 -0
- package/dist/headless/ore.d.ts +20 -0
- package/dist/headless/ore.d.ts.map +1 -0
- package/dist/headless/ore.js +9 -0
- package/dist/headless/ore.js.map +1 -0
- package/dist/headless/overlay.cjs +2 -0
- package/dist/headless/overlay.cjs.map +1 -0
- package/dist/headless/overlay.d.ts +62 -0
- package/dist/headless/overlay.d.ts.map +1 -0
- package/dist/headless/overlay.js +29 -0
- package/dist/headless/overlay.js.map +1 -0
- package/dist/headless/paginated-list.cjs +2 -0
- package/dist/headless/paginated-list.cjs.map +1 -0
- package/dist/headless/paginated-list.d.ts +42 -0
- package/dist/headless/paginated-list.d.ts.map +1 -0
- package/dist/headless/paginated-list.js +34 -0
- package/dist/headless/paginated-list.js.map +1 -0
- package/dist/headless/parse.cjs +2 -0
- package/dist/headless/parse.cjs.map +1 -0
- package/dist/headless/parse.d.ts +15 -0
- package/dist/headless/parse.d.ts.map +1 -0
- package/dist/headless/parse.js +9 -0
- package/dist/headless/parse.js.map +1 -0
- package/dist/headless/positioner.cjs +2 -0
- package/dist/headless/positioner.cjs.map +1 -0
- package/dist/headless/positioner.d.ts +40 -0
- package/dist/headless/positioner.d.ts.map +1 -0
- package/dist/headless/positioner.js +38 -0
- package/dist/headless/positioner.js.map +1 -0
- package/dist/headless/selection-control.cjs +2 -0
- package/dist/headless/selection-control.cjs.map +1 -0
- package/dist/headless/selection-control.d.ts +30 -0
- package/dist/headless/selection-control.d.ts.map +1 -0
- package/dist/headless/selection-control.js +44 -0
- package/dist/headless/selection-control.js.map +1 -0
- package/dist/headless/signals.cjs +2 -0
- package/dist/headless/signals.cjs.map +1 -0
- package/dist/headless/signals.d.ts +20 -0
- package/dist/headless/signals.d.ts.map +1 -0
- package/dist/headless/signals.js +12 -0
- package/dist/headless/signals.js.map +1 -0
- package/dist/headless/slider.cjs +2 -0
- package/dist/headless/slider.cjs.map +1 -0
- package/dist/headless/slider.d.ts +28 -0
- package/dist/headless/slider.d.ts.map +1 -0
- package/dist/headless/slider.js +40 -0
- package/dist/headless/slider.js.map +1 -0
- package/dist/headless/sort-control.cjs +2 -0
- package/dist/headless/sort-control.cjs.map +1 -0
- package/dist/headless/sort-control.d.ts +22 -0
- package/dist/headless/sort-control.d.ts.map +1 -0
- package/dist/headless/sort-control.js +36 -0
- package/dist/headless/sort-control.js.map +1 -0
- package/dist/headless/spinner.cjs +2 -0
- package/dist/headless/spinner.cjs.map +1 -0
- package/dist/headless/spinner.d.ts +19 -0
- package/dist/headless/spinner.d.ts.map +1 -0
- package/dist/headless/spinner.js +52 -0
- package/dist/headless/spinner.js.map +1 -0
- package/dist/headless/swipe.cjs +2 -0
- package/dist/headless/swipe.cjs.map +1 -0
- package/dist/headless/swipe.d.ts +38 -0
- package/dist/headless/swipe.d.ts.map +1 -0
- package/dist/headless/swipe.js +58 -0
- package/dist/headless/swipe.js.map +1 -0
- package/dist/headless/text-field.cjs +2 -0
- package/dist/headless/text-field.cjs.map +1 -0
- package/dist/headless/text-field.d.ts +45 -0
- package/dist/headless/text-field.d.ts.map +1 -0
- package/dist/headless/text-field.js +41 -0
- package/dist/headless/text-field.js.map +1 -0
- package/dist/headless/typeahead.cjs +2 -0
- package/dist/headless/typeahead.cjs.map +1 -0
- package/dist/headless/typeahead.d.ts +53 -0
- package/dist/headless/typeahead.d.ts.map +1 -0
- package/dist/headless/typeahead.js +23 -0
- package/dist/headless/typeahead.js.map +1 -0
- package/dist/headless.cjs +1 -0
- package/dist/headless.js +26 -0
- package/dist/icon.cjs +2 -0
- package/dist/icon.cjs.map +1 -0
- package/dist/icon.js +87 -0
- package/dist/icon.js.map +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/input.cjs +67 -0
- package/dist/input.cjs.map +1 -0
- package/dist/input.js +184 -0
- package/dist/input.js.map +1 -0
- package/dist/inputs/button/button.css?inline.cjs +2 -0
- package/dist/inputs/button/button.css?inline.cjs.map +1 -0
- package/dist/inputs/button/button.css?inline.js +6 -0
- package/dist/inputs/button/button.css?inline.js.map +1 -0
- package/dist/inputs/button/button.d.ts +85 -0
- package/dist/inputs/button/button.d.ts.map +1 -0
- package/dist/inputs/button-group/button-group.css?inline.cjs +2 -0
- package/dist/inputs/button-group/button-group.css?inline.cjs.map +1 -0
- package/dist/inputs/button-group/button-group.css?inline.js +6 -0
- package/dist/inputs/button-group/button-group.css?inline.js.map +1 -0
- package/dist/inputs/button-group/button-group.d.ts +64 -0
- package/dist/inputs/button-group/button-group.d.ts.map +1 -0
- package/dist/inputs/calendar/calendar.css?inline.cjs +2 -0
- package/dist/inputs/calendar/calendar.css?inline.cjs.map +1 -0
- package/dist/inputs/calendar/calendar.css?inline.js +6 -0
- package/dist/inputs/calendar/calendar.css?inline.js.map +1 -0
- package/dist/inputs/calendar/calendar.d.ts +134 -0
- package/dist/inputs/calendar/calendar.d.ts.map +1 -0
- package/dist/inputs/checkbox/checkbox.css?inline.cjs +2 -0
- package/dist/inputs/checkbox/checkbox.css?inline.cjs.map +1 -0
- package/dist/inputs/checkbox/checkbox.css?inline.js +6 -0
- package/dist/inputs/checkbox/checkbox.css?inline.js.map +1 -0
- package/dist/inputs/checkbox/checkbox.d.ts +60 -0
- package/dist/inputs/checkbox/checkbox.d.ts.map +1 -0
- package/dist/inputs/checkbox-group/checkbox-group.css?inline.cjs +2 -0
- package/dist/inputs/checkbox-group/checkbox-group.css?inline.cjs.map +1 -0
- package/dist/inputs/checkbox-group/checkbox-group.css?inline.js +6 -0
- package/dist/inputs/checkbox-group/checkbox-group.css?inline.js.map +1 -0
- package/dist/inputs/checkbox-group/checkbox-group.d.ts +75 -0
- package/dist/inputs/checkbox-group/checkbox-group.d.ts.map +1 -0
- package/dist/inputs/combobox/combobox-options.cjs +2 -0
- package/dist/inputs/combobox/combobox-options.cjs.map +1 -0
- package/dist/inputs/combobox/combobox-options.d.ts +6 -0
- package/dist/inputs/combobox/combobox-options.d.ts.map +1 -0
- package/dist/inputs/combobox/combobox-options.js +26 -0
- package/dist/inputs/combobox/combobox-options.js.map +1 -0
- package/dist/inputs/combobox/combobox.css?inline.cjs +2 -0
- package/dist/inputs/combobox/combobox.css?inline.cjs.map +1 -0
- package/dist/inputs/combobox/combobox.css?inline.js +6 -0
- package/dist/inputs/combobox/combobox.css?inline.js.map +1 -0
- package/dist/inputs/combobox/combobox.d.ts +45 -0
- package/dist/inputs/combobox/combobox.d.ts.map +1 -0
- package/dist/inputs/combobox/combobox.types.d.ts +45 -0
- package/dist/inputs/combobox/combobox.types.d.ts.map +1 -0
- package/dist/inputs/datagrid/datagrid-column.cjs +2 -0
- package/dist/inputs/datagrid/datagrid-column.cjs.map +1 -0
- package/dist/inputs/datagrid/datagrid-column.d.ts +7 -0
- package/dist/inputs/datagrid/datagrid-column.d.ts.map +1 -0
- package/dist/inputs/datagrid/datagrid-column.js +31 -0
- package/dist/inputs/datagrid/datagrid-column.js.map +1 -0
- package/dist/inputs/datagrid/datagrid-controls.cjs +2 -0
- package/dist/inputs/datagrid/datagrid-controls.cjs.map +1 -0
- package/dist/inputs/datagrid/datagrid-controls.d.ts +98 -0
- package/dist/inputs/datagrid/datagrid-controls.d.ts.map +1 -0
- package/dist/inputs/datagrid/datagrid-controls.js +147 -0
- package/dist/inputs/datagrid/datagrid-controls.js.map +1 -0
- package/dist/inputs/datagrid/datagrid-nav.cjs +2 -0
- package/dist/inputs/datagrid/datagrid-nav.cjs.map +1 -0
- package/dist/inputs/datagrid/datagrid-nav.d.ts +33 -0
- package/dist/inputs/datagrid/datagrid-nav.d.ts.map +1 -0
- package/dist/inputs/datagrid/datagrid-nav.js +51 -0
- package/dist/inputs/datagrid/datagrid-nav.js.map +1 -0
- package/dist/inputs/datagrid/datagrid.css?inline.cjs +2 -0
- package/dist/inputs/datagrid/datagrid.css?inline.cjs.map +1 -0
- package/dist/inputs/datagrid/datagrid.css?inline.js +6 -0
- package/dist/inputs/datagrid/datagrid.css?inline.js.map +1 -0
- package/dist/inputs/datagrid/datagrid.d.ts +302 -0
- package/dist/inputs/datagrid/datagrid.d.ts.map +1 -0
- package/dist/inputs/date-picker/date-picker.css?inline.cjs +2 -0
- package/dist/inputs/date-picker/date-picker.css?inline.cjs.map +1 -0
- package/dist/inputs/date-picker/date-picker.css?inline.js +6 -0
- package/dist/inputs/date-picker/date-picker.css?inline.js.map +1 -0
- package/dist/inputs/date-picker/date-picker.d.ts +112 -0
- package/dist/inputs/date-picker/date-picker.d.ts.map +1 -0
- package/dist/inputs/file-input/file-input.css?inline.cjs +2 -0
- package/dist/inputs/file-input/file-input.css?inline.cjs.map +1 -0
- package/dist/inputs/file-input/file-input.css?inline.js +6 -0
- package/dist/inputs/file-input/file-input.css?inline.js.map +1 -0
- package/dist/inputs/file-input/file-input.d.ts +90 -0
- package/dist/inputs/file-input/file-input.d.ts.map +1 -0
- package/dist/inputs/form/form.css?inline.cjs +2 -0
- package/dist/inputs/form/form.css?inline.cjs.map +1 -0
- package/dist/inputs/form/form.css?inline.js +6 -0
- package/dist/inputs/form/form.css?inline.js.map +1 -0
- package/dist/inputs/form/form.d.ts +59 -0
- package/dist/inputs/form/form.d.ts.map +1 -0
- package/dist/inputs/index.d.ts +47 -0
- package/dist/inputs/index.d.ts.map +1 -0
- package/dist/inputs/input/input.css?inline.cjs +2 -0
- package/dist/inputs/input/input.css?inline.cjs.map +1 -0
- package/dist/inputs/input/input.css?inline.js +6 -0
- package/dist/inputs/input/input.css?inline.js.map +1 -0
- package/dist/inputs/input/input.d.ts +96 -0
- package/dist/inputs/input/input.d.ts.map +1 -0
- package/dist/inputs/number-input/number-input.css?inline.cjs +2 -0
- package/dist/inputs/number-input/number-input.css?inline.cjs.map +1 -0
- package/dist/inputs/number-input/number-input.css?inline.js +6 -0
- package/dist/inputs/number-input/number-input.css?inline.js.map +1 -0
- package/dist/inputs/number-input/number-input.d.ts +102 -0
- package/dist/inputs/number-input/number-input.d.ts.map +1 -0
- package/dist/inputs/otp-input/otp-input.css?inline.cjs +2 -0
- package/dist/inputs/otp-input/otp-input.css?inline.cjs.map +1 -0
- package/dist/inputs/otp-input/otp-input.css?inline.js +6 -0
- package/dist/inputs/otp-input/otp-input.css?inline.js.map +1 -0
- package/dist/inputs/otp-input/otp-input.d.ts +82 -0
- package/dist/inputs/otp-input/otp-input.d.ts.map +1 -0
- package/dist/inputs/radio/radio.css?inline.cjs +2 -0
- package/dist/inputs/radio/radio.css?inline.cjs.map +1 -0
- package/dist/inputs/radio/radio.css?inline.js +6 -0
- package/dist/inputs/radio/radio.css?inline.js.map +1 -0
- package/dist/inputs/radio/radio.d.ts +56 -0
- package/dist/inputs/radio/radio.d.ts.map +1 -0
- package/dist/inputs/radio-group/radio-group.css?inline.cjs +2 -0
- package/dist/inputs/radio-group/radio-group.css?inline.cjs.map +1 -0
- package/dist/inputs/radio-group/radio-group.css?inline.js +6 -0
- package/dist/inputs/radio-group/radio-group.css?inline.js.map +1 -0
- package/dist/inputs/radio-group/radio-group.d.ts +74 -0
- package/dist/inputs/radio-group/radio-group.d.ts.map +1 -0
- package/dist/inputs/rating/rating.css?inline.cjs +2 -0
- package/dist/inputs/rating/rating.css?inline.cjs.map +1 -0
- package/dist/inputs/rating/rating.css?inline.js +6 -0
- package/dist/inputs/rating/rating.css?inline.js.map +1 -0
- package/dist/inputs/rating/rating.d.ts +68 -0
- package/dist/inputs/rating/rating.d.ts.map +1 -0
- package/dist/inputs/select/select.css?inline.cjs +2 -0
- package/dist/inputs/select/select.css?inline.cjs.map +1 -0
- package/dist/inputs/select/select.css?inline.js +6 -0
- package/dist/inputs/select/select.css?inline.js.map +1 -0
- package/dist/inputs/select/select.d.ts +89 -0
- package/dist/inputs/select/select.d.ts.map +1 -0
- package/dist/inputs/shared/field-binding.cjs +2 -0
- package/dist/inputs/shared/field-binding.cjs.map +1 -0
- package/dist/inputs/shared/field-binding.d.ts +31 -0
- package/dist/inputs/shared/field-binding.d.ts.map +1 -0
- package/dist/inputs/shared/field-binding.js +31 -0
- package/dist/inputs/shared/field-binding.js.map +1 -0
- package/dist/inputs/shared/form-context.cjs +2 -0
- package/dist/inputs/shared/form-context.cjs.map +1 -0
- package/dist/inputs/shared/form-context.d.ts +49 -0
- package/dist/inputs/shared/form-context.d.ts.map +1 -0
- package/dist/inputs/shared/form-context.js +15 -0
- package/dist/inputs/shared/form-context.js.map +1 -0
- package/dist/inputs/shared/index.d.ts +5 -0
- package/dist/inputs/shared/index.d.ts.map +1 -0
- package/dist/inputs/shared/templates.cjs +11 -0
- package/dist/inputs/shared/templates.cjs.map +1 -0
- package/dist/inputs/shared/templates.d.ts +13 -0
- package/dist/inputs/shared/templates.d.ts.map +1 -0
- package/dist/inputs/shared/templates.js +18 -0
- package/dist/inputs/shared/templates.js.map +1 -0
- package/dist/inputs/shared/use-form-action.cjs +2 -0
- package/dist/inputs/shared/use-form-action.cjs.map +1 -0
- package/dist/inputs/shared/use-form-action.d.ts +17 -0
- package/dist/inputs/shared/use-form-action.d.ts.map +1 -0
- package/dist/inputs/shared/use-form-action.js +19 -0
- package/dist/inputs/shared/use-form-action.js.map +1 -0
- package/dist/inputs/slider/slider.css?inline.cjs +2 -0
- package/dist/inputs/slider/slider.css?inline.cjs.map +1 -0
- package/dist/inputs/slider/slider.css?inline.js +6 -0
- package/dist/inputs/slider/slider.css?inline.js.map +1 -0
- package/dist/inputs/slider/slider.d.ts +95 -0
- package/dist/inputs/slider/slider.d.ts.map +1 -0
- package/dist/inputs/switch/switch.css?inline.cjs +2 -0
- package/dist/inputs/switch/switch.css?inline.cjs.map +1 -0
- package/dist/inputs/switch/switch.css?inline.js +6 -0
- package/dist/inputs/switch/switch.css?inline.js.map +1 -0
- package/dist/inputs/switch/switch.d.ts +56 -0
- package/dist/inputs/switch/switch.d.ts.map +1 -0
- package/dist/inputs/textarea/textarea.css?inline.cjs +2 -0
- package/dist/inputs/textarea/textarea.css?inline.cjs.map +1 -0
- package/dist/inputs/textarea/textarea.css?inline.js +6 -0
- package/dist/inputs/textarea/textarea.css?inline.js.map +1 -0
- package/dist/inputs/textarea/textarea.d.ts +91 -0
- package/dist/inputs/textarea/textarea.d.ts.map +1 -0
- package/dist/inputs/time-picker/time-picker.css?inline.cjs +2 -0
- package/dist/inputs/time-picker/time-picker.css?inline.cjs.map +1 -0
- package/dist/inputs/time-picker/time-picker.css?inline.js +6 -0
- package/dist/inputs/time-picker/time-picker.css?inline.js.map +1 -0
- package/dist/inputs/time-picker/time-picker.d.ts +103 -0
- package/dist/inputs/time-picker/time-picker.d.ts.map +1 -0
- package/dist/layout/box/box.css?inline.cjs +2 -0
- package/dist/layout/box/box.css?inline.cjs.map +1 -0
- package/dist/layout/box/box.css?inline.js +6 -0
- package/dist/layout/box/box.css?inline.js.map +1 -0
- package/dist/layout/box/box.d.ts +52 -0
- package/dist/layout/box/box.d.ts.map +1 -0
- package/dist/layout/grid/grid.css?inline.cjs +2 -0
- package/dist/layout/grid/grid.css?inline.cjs.map +1 -0
- package/dist/layout/grid/grid.css?inline.js +6 -0
- package/dist/layout/grid/grid.css?inline.js.map +1 -0
- package/dist/layout/grid/grid.d.ts +105 -0
- package/dist/layout/grid/grid.d.ts.map +1 -0
- package/dist/layout/grid-item/grid-item.css?inline.cjs +2 -0
- package/dist/layout/grid-item/grid-item.css?inline.cjs.map +1 -0
- package/dist/layout/grid-item/grid-item.css?inline.js +6 -0
- package/dist/layout/grid-item/grid-item.css?inline.js.map +1 -0
- package/dist/layout/grid-item/grid-item.d.ts +54 -0
- package/dist/layout/grid-item/grid-item.d.ts.map +1 -0
- package/dist/layout/index.d.ts +11 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/navbar/navbar.css?inline.cjs +2 -0
- package/dist/layout/navbar/navbar.css?inline.cjs.map +1 -0
- package/dist/layout/navbar/navbar.css?inline.js +6 -0
- package/dist/layout/navbar/navbar.css?inline.js.map +1 -0
- package/dist/layout/navbar/navbar.d.ts +153 -0
- package/dist/layout/navbar/navbar.d.ts.map +1 -0
- package/dist/layout/sidebar/sidebar-group.css?inline.cjs +2 -0
- package/dist/layout/sidebar/sidebar-group.css?inline.cjs.map +1 -0
- package/dist/layout/sidebar/sidebar-group.css?inline.js +6 -0
- package/dist/layout/sidebar/sidebar-group.css?inline.js.map +1 -0
- package/dist/layout/sidebar/sidebar-item.css?inline.cjs +2 -0
- package/dist/layout/sidebar/sidebar-item.css?inline.cjs.map +1 -0
- package/dist/layout/sidebar/sidebar-item.css?inline.js +6 -0
- package/dist/layout/sidebar/sidebar-item.css?inline.js.map +1 -0
- package/dist/layout/sidebar/sidebar.css?inline.cjs +2 -0
- package/dist/layout/sidebar/sidebar.css?inline.cjs.map +1 -0
- package/dist/layout/sidebar/sidebar.css?inline.js +6 -0
- package/dist/layout/sidebar/sidebar.css?inline.js.map +1 -0
- package/dist/layout/sidebar/sidebar.d.ts +226 -0
- package/dist/layout/sidebar/sidebar.d.ts.map +1 -0
- package/dist/menu.cjs +30 -0
- package/dist/menu.cjs.map +1 -0
- package/dist/menu.js +197 -0
- package/dist/menu.js.map +1 -0
- package/dist/navbar.cjs +68 -0
- package/dist/navbar.cjs.map +1 -0
- package/dist/navbar.js +283 -0
- package/dist/navbar.js.map +1 -0
- package/dist/number-input.cjs +40 -0
- package/dist/number-input.cjs.map +1 -0
- package/dist/number-input.js +141 -0
- package/dist/number-input.js.map +1 -0
- package/dist/ore/dist/_dev.cjs +2 -0
- package/dist/ore/dist/_dev.cjs.map +1 -0
- package/dist/ore/dist/_dev.js +12 -0
- package/dist/ore/dist/_dev.js.map +1 -0
- package/dist/ore/dist/aria.cjs +2 -0
- package/dist/ore/dist/aria.cjs.map +1 -0
- package/dist/ore/dist/aria.js +37 -0
- package/dist/ore/dist/aria.js.map +1 -0
- package/dist/ore/dist/base-element.cjs +2 -0
- package/dist/ore/dist/base-element.cjs.map +1 -0
- package/dist/ore/dist/base-element.js +146 -0
- package/dist/ore/dist/base-element.js.map +1 -0
- package/dist/ore/dist/context-bag.cjs +2 -0
- package/dist/ore/dist/context-bag.cjs.map +1 -0
- package/dist/ore/dist/context-bag.js +28 -0
- package/dist/ore/dist/context-bag.js.map +1 -0
- package/dist/ore/dist/context.cjs +2 -0
- package/dist/ore/dist/context.cjs.map +1 -0
- package/dist/ore/dist/context.js +38 -0
- package/dist/ore/dist/context.js.map +1 -0
- package/dist/ore/dist/define.cjs +2 -0
- package/dist/ore/dist/define.cjs.map +1 -0
- package/dist/ore/dist/define.js +27 -0
- package/dist/ore/dist/define.js.map +1 -0
- package/dist/ore/dist/directives/classMap.cjs +1 -0
- package/dist/ore/dist/directives/classMap.js +1 -0
- package/dist/ore/dist/directives/each.cjs +1 -0
- package/dist/ore/dist/directives/each.js +5 -0
- package/dist/ore/dist/directives/live.cjs +2 -0
- package/dist/ore/dist/directives/live.cjs.map +1 -0
- package/dist/ore/dist/directives/live.js +6 -0
- package/dist/ore/dist/directives/live.js.map +1 -0
- package/dist/ore/dist/directives/model.cjs +1 -0
- package/dist/ore/dist/directives/model.js +3 -0
- package/dist/ore/dist/directives/raw.cjs +2 -0
- package/dist/ore/dist/directives/raw.cjs.map +1 -0
- package/dist/ore/dist/directives/raw.js +35 -0
- package/dist/ore/dist/directives/raw.js.map +1 -0
- package/dist/ore/dist/directives/styleMap.cjs +2 -0
- package/dist/ore/dist/directives/styleMap.cjs.map +1 -0
- package/dist/ore/dist/directives/styleMap.js +20 -0
- package/dist/ore/dist/directives/styleMap.js.map +1 -0
- package/dist/ore/dist/directives/when.cjs +2 -0
- package/dist/ore/dist/directives/when.cjs.map +1 -0
- package/dist/ore/dist/directives/when.js +33 -0
- package/dist/ore/dist/directives/when.js.map +1 -0
- package/dist/ore/dist/directives.cjs +1 -0
- package/dist/ore/dist/directives.js +8 -0
- package/dist/ore/dist/errors.cjs +3 -0
- package/dist/ore/dist/errors.cjs.map +1 -0
- package/dist/ore/dist/errors.js +41 -0
- package/dist/ore/dist/errors.js.map +1 -0
- package/dist/ore/dist/host-bind.cjs +2 -0
- package/dist/ore/dist/host-bind.cjs.map +1 -0
- package/dist/ore/dist/host-bind.js +60 -0
- package/dist/ore/dist/host-bind.js.map +1 -0
- package/dist/ore/dist/observers/intersection-observe.cjs +2 -0
- package/dist/ore/dist/observers/intersection-observe.cjs.map +1 -0
- package/dist/ore/dist/observers/intersection-observe.js +12 -0
- package/dist/ore/dist/observers/intersection-observe.js.map +1 -0
- package/dist/ore/dist/observers/media-observe.cjs +1 -0
- package/dist/ore/dist/observers/media-observe.js +1 -0
- package/dist/ore/dist/observers/mutation-observe.cjs +1 -0
- package/dist/ore/dist/observers/mutation-observe.js +1 -0
- package/dist/ore/dist/observers/resize-observe.cjs +2 -0
- package/dist/ore/dist/observers/resize-observe.cjs.map +1 -0
- package/dist/ore/dist/observers/resize-observe.js +20 -0
- package/dist/ore/dist/observers/resize-observe.js.map +1 -0
- package/dist/ore/dist/observers.cjs +1 -0
- package/dist/ore/dist/observers.js +5 -0
- package/dist/ore/dist/props.cjs +2 -0
- package/dist/ore/dist/props.cjs.map +1 -0
- package/dist/ore/dist/props.js +54 -0
- package/dist/ore/dist/props.js.map +1 -0
- package/dist/ore/dist/runtime.cjs +2 -0
- package/dist/ore/dist/runtime.cjs.map +1 -0
- package/dist/ore/dist/runtime.js +33 -0
- package/dist/ore/dist/runtime.js.map +1 -0
- package/dist/ore/dist/slots.cjs +2 -0
- package/dist/ore/dist/slots.cjs.map +1 -0
- package/dist/ore/dist/slots.js +61 -0
- package/dist/ore/dist/slots.js.map +1 -0
- package/dist/ore/dist/testing/flush.cjs +2 -0
- package/dist/ore/dist/testing/flush.cjs.map +1 -0
- package/dist/ore/dist/testing/flush.js +11 -0
- package/dist/ore/dist/testing/flush.js.map +1 -0
- package/dist/ore/dist/testing/mount.cjs +2 -0
- package/dist/ore/dist/testing/mount.cjs.map +1 -0
- package/dist/ore/dist/testing/mount.js +94 -0
- package/dist/ore/dist/testing/mount.js.map +1 -0
- package/dist/ore/dist/testing/query.cjs +2 -0
- package/dist/ore/dist/testing/query.cjs.map +1 -0
- package/dist/ore/dist/testing/query.js +12 -0
- package/dist/ore/dist/testing/query.js.map +1 -0
- package/dist/ore/dist/testing/render-hook.cjs +1 -0
- package/dist/ore/dist/testing/render-hook.js +4 -0
- package/dist/ore/dist/testing/testing.cjs +1 -0
- package/dist/ore/dist/testing/testing.js +4 -0
- package/dist/ore/dist/testing/wait.cjs +1 -0
- package/dist/ore/dist/testing/wait.js +1 -0
- package/dist/ore/dist/testing.cjs +1 -0
- package/dist/ore/dist/testing.js +6 -0
- package/dist/ore/dist/types/bindings.cjs +2 -0
- package/dist/ore/dist/types/bindings.cjs.map +1 -0
- package/dist/ore/dist/types/bindings.js +15 -0
- package/dist/ore/dist/types/bindings.js.map +1 -0
- package/dist/ore/dist/types.cjs +2 -0
- package/dist/ore/dist/types.cjs.map +1 -0
- package/dist/ore/dist/types.js +15 -0
- package/dist/ore/dist/types.js.map +1 -0
- package/dist/ore/dist/utils/aria.cjs +2 -0
- package/dist/ore/dist/utils/aria.cjs.map +1 -0
- package/dist/ore/dist/utils/aria.js +6 -0
- package/dist/ore/dist/utils/aria.js.map +1 -0
- package/dist/ore/dist/utils/css.cjs +2 -0
- package/dist/ore/dist/utils/css.cjs.map +1 -0
- package/dist/ore/dist/utils/css.js +18 -0
- package/dist/ore/dist/utils/css.js.map +1 -0
- package/dist/ore/dist/utils/dom.cjs +2 -0
- package/dist/ore/dist/utils/dom.cjs.map +1 -0
- package/dist/ore/dist/utils/dom.js +47 -0
- package/dist/ore/dist/utils/dom.js.map +1 -0
- package/dist/ore/dist/utils/emit.cjs +2 -0
- package/dist/ore/dist/utils/emit.cjs.map +1 -0
- package/dist/ore/dist/utils/emit.js +16 -0
- package/dist/ore/dist/utils/emit.js.map +1 -0
- package/dist/ore/dist/utils/id.cjs +2 -0
- package/dist/ore/dist/utils/id.cjs.map +1 -0
- package/dist/ore/dist/utils/id.js +4 -0
- package/dist/ore/dist/utils/id.js.map +1 -0
- package/dist/otp-input.cjs +21 -0
- package/dist/otp-input.cjs.map +1 -0
- package/dist/otp-input.js +145 -0
- package/dist/otp-input.js.map +1 -0
- package/dist/overlay/dialog/dialog.css?inline.cjs +2 -0
- package/dist/overlay/dialog/dialog.css?inline.cjs.map +1 -0
- package/dist/overlay/dialog/dialog.css?inline.js +6 -0
- package/dist/overlay/dialog/dialog.css?inline.js.map +1 -0
- package/dist/overlay/dialog/dialog.d.ts +108 -0
- package/dist/overlay/dialog/dialog.d.ts.map +1 -0
- package/dist/overlay/drawer/drawer.css?inline.cjs +2 -0
- package/dist/overlay/drawer/drawer.css?inline.cjs.map +1 -0
- package/dist/overlay/drawer/drawer.css?inline.js +6 -0
- package/dist/overlay/drawer/drawer.css?inline.js.map +1 -0
- package/dist/overlay/drawer/drawer.d.ts +111 -0
- package/dist/overlay/drawer/drawer.d.ts.map +1 -0
- package/dist/overlay/index.d.ts +11 -0
- package/dist/overlay/index.d.ts.map +1 -0
- package/dist/overlay/menu/menu-item.css?inline.cjs +2 -0
- package/dist/overlay/menu/menu-item.css?inline.cjs.map +1 -0
- package/dist/overlay/menu/menu-item.css?inline.js +6 -0
- package/dist/overlay/menu/menu-item.css?inline.js.map +1 -0
- package/dist/overlay/menu/menu-separator.css?inline.cjs +2 -0
- package/dist/overlay/menu/menu-separator.css?inline.cjs.map +1 -0
- package/dist/overlay/menu/menu-separator.css?inline.js +6 -0
- package/dist/overlay/menu/menu-separator.css?inline.js.map +1 -0
- package/dist/overlay/menu/menu.css?inline.cjs +2 -0
- package/dist/overlay/menu/menu.css?inline.cjs.map +1 -0
- package/dist/overlay/menu/menu.css?inline.js +6 -0
- package/dist/overlay/menu/menu.css?inline.js.map +1 -0
- package/dist/overlay/menu/menu.d.ts +110 -0
- package/dist/overlay/menu/menu.d.ts.map +1 -0
- package/dist/overlay/popover/popover.css?inline.cjs +2 -0
- package/dist/overlay/popover/popover.css?inline.cjs.map +1 -0
- package/dist/overlay/popover/popover.css?inline.js +6 -0
- package/dist/overlay/popover/popover.css?inline.js.map +1 -0
- package/dist/overlay/popover/popover.d.ts +56 -0
- package/dist/overlay/popover/popover.d.ts.map +1 -0
- package/dist/overlay/shared/await-exit.cjs +2 -0
- package/dist/overlay/shared/await-exit.cjs.map +1 -0
- package/dist/overlay/shared/await-exit.d.ts +14 -0
- package/dist/overlay/shared/await-exit.d.ts.map +1 -0
- package/dist/overlay/shared/await-exit.js +18 -0
- package/dist/overlay/shared/await-exit.js.map +1 -0
- package/dist/overlay/shared/background-lock.cjs +2 -0
- package/dist/overlay/shared/background-lock.cjs.map +1 -0
- package/dist/overlay/shared/background-lock.d.ts +22 -0
- package/dist/overlay/shared/background-lock.d.ts.map +1 -0
- package/dist/overlay/shared/background-lock.js +25 -0
- package/dist/overlay/shared/background-lock.js.map +1 -0
- package/dist/overlay/shared/use-dialog.cjs +2 -0
- package/dist/overlay/shared/use-dialog.cjs.map +1 -0
- package/dist/overlay/shared/use-dialog.d.ts +76 -0
- package/dist/overlay/shared/use-dialog.d.ts.map +1 -0
- package/dist/overlay/shared/use-dialog.js +92 -0
- package/dist/overlay/shared/use-dialog.js.map +1 -0
- package/dist/overlay/shared/use-floating-trigger.cjs +2 -0
- package/dist/overlay/shared/use-floating-trigger.cjs.map +1 -0
- package/dist/overlay/shared/use-floating-trigger.d.ts +67 -0
- package/dist/overlay/shared/use-floating-trigger.d.ts.map +1 -0
- package/dist/overlay/shared/use-floating-trigger.js +128 -0
- package/dist/overlay/shared/use-floating-trigger.js.map +1 -0
- package/dist/overlay/tooltip/tooltip.css?inline.cjs +2 -0
- package/dist/overlay/tooltip/tooltip.css?inline.cjs.map +1 -0
- package/dist/overlay/tooltip/tooltip.css?inline.js +6 -0
- package/dist/overlay/tooltip/tooltip.css?inline.js.map +1 -0
- package/dist/overlay/tooltip/tooltip.d.ts +72 -0
- package/dist/overlay/tooltip/tooltip.d.ts.map +1 -0
- package/dist/pagination.cjs +63 -0
- package/dist/pagination.cjs.map +1 -0
- package/dist/pagination.js +113 -0
- package/dist/pagination.js.map +1 -0
- package/dist/password-strength.cjs +19 -0
- package/dist/password-strength.cjs.map +1 -0
- package/dist/password-strength.js +69 -0
- package/dist/password-strength.js.map +1 -0
- package/dist/popover.cjs +16 -0
- package/dist/popover.cjs.map +1 -0
- package/dist/popover.js +81 -0
- package/dist/popover.js.map +1 -0
- package/dist/progress.cjs +46 -0
- package/dist/progress.cjs.map +1 -0
- package/dist/progress.js +96 -0
- package/dist/progress.js.map +1 -0
- package/dist/radio-group.cjs +25 -0
- package/dist/radio-group.cjs.map +1 -0
- package/dist/radio-group.js +145 -0
- package/dist/radio-group.js.map +1 -0
- package/dist/radio.cjs +10 -0
- package/dist/radio.cjs.map +1 -0
- package/dist/radio.js +146 -0
- package/dist/radio.js.map +1 -0
- package/dist/rating.cjs +28 -0
- package/dist/rating.cjs.map +1 -0
- package/dist/rating.js +123 -0
- package/dist/rating.js.map +1 -0
- package/dist/refine.cjs +2705 -0
- package/dist/refine.cjs.map +1 -0
- package/dist/refine.iife.js +2705 -0
- package/dist/refine.iife.js.map +1 -0
- package/dist/refine.js +2705 -0
- package/dist/refine.js.map +1 -0
- package/dist/select.cjs +79 -0
- package/dist/select.cjs.map +1 -0
- package/dist/select.js +289 -0
- package/dist/select.js.map +1 -0
- package/dist/separator.cjs +27 -0
- package/dist/separator.cjs.map +1 -0
- package/dist/separator.js +47 -0
- package/dist/separator.js.map +1 -0
- package/dist/shared/index.d.ts +14 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/prop-bundles.cjs +2 -0
- package/dist/shared/prop-bundles.cjs.map +1 -0
- package/dist/shared/prop-bundles.d.ts +45 -0
- package/dist/shared/prop-bundles.d.ts.map +1 -0
- package/dist/shared/prop-bundles.js +13 -0
- package/dist/shared/prop-bundles.js.map +1 -0
- package/dist/shared/size-presets.cjs +2 -0
- package/dist/shared/size-presets.cjs.map +1 -0
- package/dist/shared/size-presets.d.ts +101 -0
- package/dist/shared/size-presets.d.ts.map +1 -0
- package/dist/shared/size-presets.js +96 -0
- package/dist/shared/size-presets.js.map +1 -0
- package/dist/shared/types.d.ts +76 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/sidebar.cjs +123 -0
- package/dist/sidebar.cjs.map +1 -0
- package/dist/sidebar.js +344 -0
- package/dist/sidebar.js.map +1 -0
- package/dist/skeleton.cjs +10 -0
- package/dist/skeleton.cjs.map +1 -0
- package/dist/skeleton.js +59 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/slider.cjs +27 -0
- package/dist/slider.cjs.map +1 -0
- package/dist/slider.js +219 -0
- package/dist/slider.js.map +1 -0
- package/dist/styles/animation.css +94 -0
- package/dist/styles/index.cjs +2 -0
- package/dist/styles/index.cjs.map +1 -0
- package/dist/styles/index.d.ts +41 -0
- package/dist/styles/index.d.ts.map +1 -0
- package/dist/styles/index.js +24 -0
- package/dist/styles/index.js.map +1 -0
- package/dist/styles/layer.css +19 -0
- package/dist/styles/mixins/accessibility.css.cjs +51 -0
- package/dist/styles/mixins/accessibility.css.cjs.map +1 -0
- package/dist/styles/mixins/accessibility.css.d.ts +80 -0
- package/dist/styles/mixins/accessibility.css.d.ts.map +1 -0
- package/dist/styles/mixins/accessibility.css.js +56 -0
- package/dist/styles/mixins/accessibility.css.js.map +1 -0
- package/dist/styles/mixins/animation.css.cjs +133 -0
- package/dist/styles/mixins/animation.css.cjs.map +1 -0
- package/dist/styles/mixins/animation.css.d.ts +43 -0
- package/dist/styles/mixins/animation.css.d.ts.map +1 -0
- package/dist/styles/mixins/animation.css.js +166 -0
- package/dist/styles/mixins/animation.css.js.map +1 -0
- package/dist/styles/mixins/shape.css.cjs +66 -0
- package/dist/styles/mixins/shape.css.cjs.map +1 -0
- package/dist/styles/mixins/shape.css.d.ts +96 -0
- package/dist/styles/mixins/shape.css.d.ts.map +1 -0
- package/dist/styles/mixins/shape.css.js +98 -0
- package/dist/styles/mixins/shape.css.js.map +1 -0
- package/dist/styles/mixins/states.css.cjs +37 -0
- package/dist/styles/mixins/states.css.cjs.map +1 -0
- package/dist/styles/mixins/states.css.d.ts +27 -0
- package/dist/styles/mixins/states.css.d.ts.map +1 -0
- package/dist/styles/mixins/states.css.js +44 -0
- package/dist/styles/mixins/states.css.js.map +1 -0
- package/dist/styles/mixins/table-base.css.cjs +94 -0
- package/dist/styles/mixins/table-base.css.cjs.map +1 -0
- package/dist/styles/mixins/table-base.css.d.ts +24 -0
- package/dist/styles/mixins/table-base.css.d.ts.map +1 -0
- package/dist/styles/mixins/table-base.css.js +99 -0
- package/dist/styles/mixins/table-base.css.js.map +1 -0
- package/dist/styles/mixins/theme.css.cjs +80 -0
- package/dist/styles/mixins/theme.css.cjs.map +1 -0
- package/dist/styles/mixins/theme.css.d.ts +77 -0
- package/dist/styles/mixins/theme.css.d.ts.map +1 -0
- package/dist/styles/mixins/theme.css.js +98 -0
- package/dist/styles/mixins/theme.css.js.map +1 -0
- package/dist/styles/mixins/variants.css.cjs +55 -0
- package/dist/styles/mixins/variants.css.cjs.map +1 -0
- package/dist/styles/mixins/variants.css.d.ts +22 -0
- package/dist/styles/mixins/variants.css.d.ts.map +1 -0
- package/dist/styles/mixins/variants.css.js +60 -0
- package/dist/styles/mixins/variants.css.js.map +1 -0
- package/dist/styles/preflight.css +239 -0
- package/dist/styles/styles.css +5 -0
- package/dist/styles/theme.css +553 -0
- package/dist/switch.cjs +10 -0
- package/dist/switch.cjs.map +1 -0
- package/dist/switch.js +79 -0
- package/dist/switch.js.map +1 -0
- package/dist/tab-item.cjs +17 -0
- package/dist/tab-item.cjs.map +1 -0
- package/dist/tab-item.js +62 -0
- package/dist/tab-item.js.map +1 -0
- package/dist/tab-panel.cjs +14 -0
- package/dist/tab-panel.cjs.map +1 -0
- package/dist/tab-panel.js +61 -0
- package/dist/tab-panel.js.map +1 -0
- package/dist/table.cjs +2 -0
- package/dist/table.cjs.map +1 -0
- package/dist/table.js +101 -0
- package/dist/table.js.map +1 -0
- package/dist/tabs.cjs +17 -0
- package/dist/tabs.cjs.map +1 -0
- package/dist/tabs.js +126 -0
- package/dist/tabs.js.map +1 -0
- package/dist/testing/index.d.ts +233 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing.cjs +2 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.js +44 -0
- package/dist/testing.js.map +1 -0
- package/dist/text.cjs +2 -0
- package/dist/text.cjs.map +1 -0
- package/dist/text.js +34 -0
- package/dist/text.js.map +1 -0
- package/dist/textarea.cjs +33 -0
- package/dist/textarea.cjs.map +1 -0
- package/dist/textarea.js +137 -0
- package/dist/textarea.js.map +1 -0
- package/dist/time-picker.cjs +98 -0
- package/dist/time-picker.cjs.map +1 -0
- package/dist/time-picker.js +261 -0
- package/dist/time-picker.js.map +1 -0
- package/dist/toast.cjs +69 -0
- package/dist/toast.cjs.map +1 -0
- package/dist/toast.js +316 -0
- package/dist/toast.js.map +1 -0
- package/dist/tooltip.cjs +15 -0
- package/dist/tooltip.cjs.map +1 -0
- package/dist/tooltip.js +121 -0
- package/dist/tooltip.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/utils/css.cjs +2 -0
- package/dist/utils/css.cjs.map +1 -0
- package/dist/utils/css.d.ts +10 -0
- package/dist/utils/css.d.ts.map +1 -0
- package/dist/utils/css.js +10 -0
- package/dist/utils/css.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/link.cjs +2 -0
- package/dist/utils/link.cjs.map +1 -0
- package/dist/utils/link.d.ts +44 -0
- package/dist/utils/link.d.ts.map +1 -0
- package/dist/utils/link.js +19 -0
- package/dist/utils/link.js.map +1 -0
- package/package.json +464 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"announcer.cjs","names":[],"sources":["../../src/headless/announcer.ts"],"sourcesContent":["// ── Live-Region Announcer ─────────────────────────────────────────────────────\n// Programmatic announcements to screen readers without requiring a visible\n// DOM element. Used for status messages, selection feedback, and count updates\n// that live in components where the visible element is hidden or absent.\n//\n// Two visually-hidden live regions are lazily created in `<body>` — one polite,\n// one assertive. The clear-then-set pattern forces AT to re-read even identical\n// consecutive messages.\n//\n// Usage:\n// ```ts\n// import { announce } from './announcer';\n// announce(`${selectedCount} items selected`);\n// announce('Error: field is required', { politeness: 'assertive' });\n// ```\n\nimport { SR_ONLY_INLINE_STYLE } from '../styles';\n\n// ── Visually-hidden style ─────────────────────────────────────────────────────\n// Shared with the CSS-side `.sr-only` mixin — see `src/styles/mixins/accessibility.css.ts`.\n\n// ── Per-document live regions (WeakMap for automatic GC + test isolation) ────\n\ntype DocumentRegions = { assertive?: HTMLElement; polite?: HTMLElement };\n\nconst _regions = new WeakMap<Document, DocumentRegions>();\nconst _timers = new WeakMap<HTMLElement, ReturnType<typeof setTimeout>>();\n\n/** Creates and mounts a visually-hidden live region with the given politeness. */\nconst createRegion = (politeness: 'assertive' | 'polite', doc: Document): HTMLElement => {\n const el = doc.createElement('div');\n\n el.setAttribute('aria-live', politeness);\n el.setAttribute('aria-atomic', 'true');\n el.setAttribute('data-block-announcer', politeness);\n el.style.cssText = SR_ONLY_INLINE_STYLE;\n\n doc.body.appendChild(el);\n\n return el;\n};\n\n/**\n * Returns the live region for the requested politeness in the given document,\n * creating it on first access. Returns `null` outside a browser context.\n */\nconst getRegion = (politeness: 'assertive' | 'polite', doc: Document): HTMLElement | null => {\n let regions = _regions.get(doc);\n\n // Re-create if this specific region was removed from the DOM (e.g. by test teardown).\n if (regions?.[politeness] && !doc.body.contains(regions[politeness])) {\n regions[politeness] = undefined;\n }\n\n if (!regions?.[politeness]) {\n if (!regions) {\n regions = {};\n _regions.set(doc, regions);\n }\n\n regions[politeness] = createRegion(politeness, doc);\n }\n\n return regions[politeness] ?? null;\n};\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport type AnnouncePoliteness = 'assertive' | 'polite';\n\nexport type AnnounceOptions = {\n /**\n * `'polite'` — queues the announcement; does not interrupt ongoing speech.\n * `'assertive'` — interrupts immediately. Use sparingly; reserve for errors.\n *\n * Default: `'polite'`.\n */\n politeness?: AnnouncePoliteness;\n};\n\n/**\n * Announces a message to screen readers via a singleton visually-hidden\n * live region. Safe to call outside a component lifecycle (no cleanup needed).\n *\n * The clear-then-set pattern (50 ms delay) forces AT to re-read even when the\n * message text hasn't changed.\n *\n * @example\n * ```ts\n * announce('3 results found');\n * announce('Session expired', { politeness: 'assertive' });\n * ```\n */\nexport const announce = (message: string, options: AnnounceOptions = {}): void => {\n if (typeof document === 'undefined') return;\n\n const politeness = options.politeness ?? 'polite';\n const region = getRegion(politeness, document);\n\n if (!region) return;\n\n // Clear immediately so AT registers a content change, then set after a short\n // delay. The 50 ms window is the established minimum for most AT/browser combos.\n region.textContent = '';\n\n // Use a per-element timer so concurrent polite + assertive announcements don't\n // clobber each other's pending writes.\n const existing = _timers.get(region);\n\n if (existing !== undefined) clearTimeout(existing);\n\n const timer = setTimeout(() => {\n region.textContent = message;\n _timers.delete(region);\n }, 50);\n\n _timers.set(region, timer);\n};\n"],"mappings":"0DAyBA,IAAM,EAAW,IAAI,QACf,EAAU,IAAI,QAGd,GAAgB,EAAoC,IAA+B,CACvF,IAAM,EAAK,EAAI,cAAc,KAAK,EASlC,OAPA,EAAG,aAAa,YAAa,CAAU,EACvC,EAAG,aAAa,cAAe,MAAM,EACrC,EAAG,aAAa,uBAAwB,CAAU,EAClD,EAAG,MAAM,QAAU,EAAA,qBAEnB,EAAI,KAAK,YAAY,CAAE,EAEhB,CACT,EAMM,GAAa,EAAoC,IAAsC,CAC3F,IAAI,EAAU,EAAS,IAAI,CAAG,EAgB9B,OAbI,IAAU,IAAe,CAAC,EAAI,KAAK,SAAS,EAAQ,EAAW,IACjE,EAAQ,GAAc,IAAA,IAGnB,IAAU,KACR,IACH,EAAU,CAAC,EACX,EAAS,IAAI,EAAK,CAAO,GAG3B,EAAQ,GAAc,EAAa,EAAY,CAAG,GAG7C,EAAQ,IAAe,IAChC,EA6Ba,GAAY,EAAiB,EAA2B,CAAC,IAAY,CAChF,GAAI,OAAO,SAAa,IAAa,OAGrC,IAAM,EAAS,EADI,EAAQ,YAAc,SACJ,QAAQ,EAE7C,GAAI,CAAC,EAAQ,OAIb,EAAO,YAAc,GAIrB,IAAM,EAAW,EAAQ,IAAI,CAAM,EAE/B,IAAa,IAAA,IAAW,aAAa,CAAQ,EAEjD,IAAM,EAAQ,eAAiB,CAC7B,EAAO,YAAc,EACrB,EAAQ,OAAO,CAAM,CACvB,EAAG,EAAE,EAEL,EAAQ,IAAI,EAAQ,CAAK,CAC3B"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type AnnouncePoliteness = 'assertive' | 'polite';
|
|
2
|
+
export type AnnounceOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* `'polite'` — queues the announcement; does not interrupt ongoing speech.
|
|
5
|
+
* `'assertive'` — interrupts immediately. Use sparingly; reserve for errors.
|
|
6
|
+
*
|
|
7
|
+
* Default: `'polite'`.
|
|
8
|
+
*/
|
|
9
|
+
politeness?: AnnouncePoliteness;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Announces a message to screen readers via a singleton visually-hidden
|
|
13
|
+
* live region. Safe to call outside a component lifecycle (no cleanup needed).
|
|
14
|
+
*
|
|
15
|
+
* The clear-then-set pattern (50 ms delay) forces AT to re-read even when the
|
|
16
|
+
* message text hasn't changed.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* announce('3 results found');
|
|
21
|
+
* announce('Session expired', { politeness: 'assertive' });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare const announce: (message: string, options?: AnnounceOptions) => void;
|
|
25
|
+
//# sourceMappingURL=announcer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"announcer.d.ts","sourceRoot":"","sources":["../../src/headless/announcer.ts"],"names":[],"mappings":"AAoEA,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,QAAQ,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,QAAQ,GAAI,SAAS,MAAM,EAAE,UAAS,eAAoB,KAAG,IAwBzE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { SR_ONLY_INLINE_STYLE as e } from "../styles/mixins/accessibility.css.js";
|
|
2
|
+
//#region src/headless/announcer.ts
|
|
3
|
+
var t = /* @__PURE__ */ new WeakMap(), n = /* @__PURE__ */ new WeakMap(), r = (t, n) => {
|
|
4
|
+
let r = n.createElement("div");
|
|
5
|
+
return r.setAttribute("aria-live", t), r.setAttribute("aria-atomic", "true"), r.setAttribute("data-block-announcer", t), r.style.cssText = e, n.body.appendChild(r), r;
|
|
6
|
+
}, i = (e, n) => {
|
|
7
|
+
let i = t.get(n);
|
|
8
|
+
return i?.[e] && !n.body.contains(i[e]) && (i[e] = void 0), i?.[e] || (i || (i = {}, t.set(n, i)), i[e] = r(e, n)), i[e] ?? null;
|
|
9
|
+
}, a = (e, t = {}) => {
|
|
10
|
+
if (typeof document > "u") return;
|
|
11
|
+
let r = i(t.politeness ?? "polite", document);
|
|
12
|
+
if (!r) return;
|
|
13
|
+
r.textContent = "";
|
|
14
|
+
let a = n.get(r);
|
|
15
|
+
a !== void 0 && clearTimeout(a);
|
|
16
|
+
let o = setTimeout(() => {
|
|
17
|
+
r.textContent = e, n.delete(r);
|
|
18
|
+
}, 50);
|
|
19
|
+
n.set(r, o);
|
|
20
|
+
};
|
|
21
|
+
//#endregion
|
|
22
|
+
export { a as announce };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=announcer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"announcer.js","names":[],"sources":["../../src/headless/announcer.ts"],"sourcesContent":["// ── Live-Region Announcer ─────────────────────────────────────────────────────\n// Programmatic announcements to screen readers without requiring a visible\n// DOM element. Used for status messages, selection feedback, and count updates\n// that live in components where the visible element is hidden or absent.\n//\n// Two visually-hidden live regions are lazily created in `<body>` — one polite,\n// one assertive. The clear-then-set pattern forces AT to re-read even identical\n// consecutive messages.\n//\n// Usage:\n// ```ts\n// import { announce } from './announcer';\n// announce(`${selectedCount} items selected`);\n// announce('Error: field is required', { politeness: 'assertive' });\n// ```\n\nimport { SR_ONLY_INLINE_STYLE } from '../styles';\n\n// ── Visually-hidden style ─────────────────────────────────────────────────────\n// Shared with the CSS-side `.sr-only` mixin — see `src/styles/mixins/accessibility.css.ts`.\n\n// ── Per-document live regions (WeakMap for automatic GC + test isolation) ────\n\ntype DocumentRegions = { assertive?: HTMLElement; polite?: HTMLElement };\n\nconst _regions = new WeakMap<Document, DocumentRegions>();\nconst _timers = new WeakMap<HTMLElement, ReturnType<typeof setTimeout>>();\n\n/** Creates and mounts a visually-hidden live region with the given politeness. */\nconst createRegion = (politeness: 'assertive' | 'polite', doc: Document): HTMLElement => {\n const el = doc.createElement('div');\n\n el.setAttribute('aria-live', politeness);\n el.setAttribute('aria-atomic', 'true');\n el.setAttribute('data-block-announcer', politeness);\n el.style.cssText = SR_ONLY_INLINE_STYLE;\n\n doc.body.appendChild(el);\n\n return el;\n};\n\n/**\n * Returns the live region for the requested politeness in the given document,\n * creating it on first access. Returns `null` outside a browser context.\n */\nconst getRegion = (politeness: 'assertive' | 'polite', doc: Document): HTMLElement | null => {\n let regions = _regions.get(doc);\n\n // Re-create if this specific region was removed from the DOM (e.g. by test teardown).\n if (regions?.[politeness] && !doc.body.contains(regions[politeness])) {\n regions[politeness] = undefined;\n }\n\n if (!regions?.[politeness]) {\n if (!regions) {\n regions = {};\n _regions.set(doc, regions);\n }\n\n regions[politeness] = createRegion(politeness, doc);\n }\n\n return regions[politeness] ?? null;\n};\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport type AnnouncePoliteness = 'assertive' | 'polite';\n\nexport type AnnounceOptions = {\n /**\n * `'polite'` — queues the announcement; does not interrupt ongoing speech.\n * `'assertive'` — interrupts immediately. Use sparingly; reserve for errors.\n *\n * Default: `'polite'`.\n */\n politeness?: AnnouncePoliteness;\n};\n\n/**\n * Announces a message to screen readers via a singleton visually-hidden\n * live region. Safe to call outside a component lifecycle (no cleanup needed).\n *\n * The clear-then-set pattern (50 ms delay) forces AT to re-read even when the\n * message text hasn't changed.\n *\n * @example\n * ```ts\n * announce('3 results found');\n * announce('Session expired', { politeness: 'assertive' });\n * ```\n */\nexport const announce = (message: string, options: AnnounceOptions = {}): void => {\n if (typeof document === 'undefined') return;\n\n const politeness = options.politeness ?? 'polite';\n const region = getRegion(politeness, document);\n\n if (!region) return;\n\n // Clear immediately so AT registers a content change, then set after a short\n // delay. The 50 ms window is the established minimum for most AT/browser combos.\n region.textContent = '';\n\n // Use a per-element timer so concurrent polite + assertive announcements don't\n // clobber each other's pending writes.\n const existing = _timers.get(region);\n\n if (existing !== undefined) clearTimeout(existing);\n\n const timer = setTimeout(() => {\n region.textContent = message;\n _timers.delete(region);\n }, 50);\n\n _timers.set(region, timer);\n};\n"],"mappings":";;AAyBA,IAAM,oBAAW,IAAI,QAAmC,GAClD,oBAAU,IAAI,QAAoD,GAGlE,KAAgB,GAAoC,MAA+B;CACvF,IAAM,IAAK,EAAI,cAAc,KAAK;CASlC,OAPA,EAAG,aAAa,aAAa,CAAU,GACvC,EAAG,aAAa,eAAe,MAAM,GACrC,EAAG,aAAa,wBAAwB,CAAU,GAClD,EAAG,MAAM,UAAU,GAEnB,EAAI,KAAK,YAAY,CAAE,GAEhB;AACT,GAMM,KAAa,GAAoC,MAAsC;CAC3F,IAAI,IAAU,EAAS,IAAI,CAAG;CAgB9B,OAbI,IAAU,MAAe,CAAC,EAAI,KAAK,SAAS,EAAQ,EAAW,MACjE,EAAQ,KAAc,KAAA,IAGnB,IAAU,OACR,MACH,IAAU,CAAC,GACX,EAAS,IAAI,GAAK,CAAO,IAG3B,EAAQ,KAAc,EAAa,GAAY,CAAG,IAG7C,EAAQ,MAAe;AAChC,GA6Ba,KAAY,GAAiB,IAA2B,CAAC,MAAY;CAChF,IAAI,OAAO,WAAa,KAAa;CAGrC,IAAM,IAAS,EADI,EAAQ,cAAc,UACJ,QAAQ;CAE7C,IAAI,CAAC,GAAQ;CAIb,EAAO,cAAc;CAIrB,IAAM,IAAW,EAAQ,IAAI,CAAM;CAEnC,AAAI,MAAa,KAAA,KAAW,aAAa,CAAQ;CAEjD,IAAM,IAAQ,iBAAiB;EAE7B,AADA,EAAO,cAAc,GACrB,EAAQ,OAAO,CAAM;CACvB,GAAG,EAAE;CAEL,EAAQ,IAAI,GAAQ,CAAK;AAC3B"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./field-base.cjs"),t=require("./signals.cjs"),n=require("./keyboard.cjs");let r=require("@vielzeug/ripple");var i=i=>{let a=t.syncedSignal(i.checked,i.signal,Boolean),o=i.indeterminate?t.syncedSignal(i.indeterminate,i.signal,Boolean):(0,r.signal)(!1),s=(0,r.computed)(()=>o.value?null:a.value?i.value.value??``:null),c=e.createField(i),l=e=>({checked:a.value,originalEvent:e,value:i.value.value??``}),u=e=>{if(!c.disabled.value){if(i.group){o.value=!1,i.group.toggle(i.value.value??``,e),i.onToggle?.(l(e));return}i.clearIndeterminateFirst&&o.value||(a.value=!a.value),o.value=!1,i.onToggle?.(l(e))}},d=n.createInteraction({disabled:c.disabled,onPress:e=>u(e)});return{...c,checkableFormValue:s,checked:a,handleClick:d.handleClick,handleKeydown:d.handleKeydown,indeterminate:o,toggle:u}};exports.createCheckable=i;
|
|
2
|
+
//# sourceMappingURL=checkable.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkable.cjs","names":[],"sources":["../../src/headless/checkable.ts"],"sourcesContent":["import { computed, type Readable, type Signal, signal } from '@vielzeug/ripple';\n\nimport { createField, type ControlValidationMode, type FieldHandle } from './field-base';\nimport { createInteraction } from './keyboard';\nimport { syncedSignal } from './signals';\n\n// ── Checkable control ─────────────────────────────────────────────────────────\n\nexport type CheckableChangePayload = {\n checked: boolean;\n originalEvent?: Event;\n value: string;\n};\n\nexport type CheckableOptions = {\n checked: Readable<boolean | undefined>;\n clearIndeterminateFirst?: boolean;\n disabled?: Readable<boolean | undefined>;\n error?: Readable<string | undefined>;\n /**\n * Returns the underlying form field object used for validation triggering.\n * Called lazily — safe to return `null` before the first render.\n */\n getFormField?: () => { reportValidity(): void } | null;\n group?: { toggle: (value: string, originalEvent?: Event) => void };\n helper?: Readable<string | undefined>;\n indeterminate?: Readable<boolean | undefined>;\n onToggle?: (payload: CheckableChangePayload) => void;\n prefix?: string;\n /** `AbortSignal` from the component lifecycle. All reactive subscriptions are torn down on abort. */\n signal: AbortSignal;\n validateOn?: Readable<ControlValidationMode>;\n value: Readable<string | undefined>;\n};\n\nexport type CheckableHandle = FieldHandle & {\n /** The form submission value: null when unchecked/indeterminate, the value string when checked. */\n checkableFormValue: Readable<string | null>;\n checked: Signal<boolean>;\n handleClick: (event: MouseEvent) => boolean;\n handleKeydown: (event: KeyboardEvent) => boolean;\n indeterminate: Signal<boolean>;\n toggle: (event: Event) => void;\n};\n\nexport const createCheckable = (options: CheckableOptions): CheckableHandle => {\n const checked = syncedSignal(options.checked, options.signal, Boolean);\n const indeterminate = options.indeterminate\n ? syncedSignal(options.indeterminate, options.signal, Boolean)\n : signal(false);\n\n const checkableFormValue = computed<string | null>(() =>\n indeterminate.value ? null : checked.value ? (options.value.value ?? '') : null,\n );\n\n const field = createField(options);\n\n const createPayload = (event: Event): CheckableChangePayload => ({\n checked: checked.value,\n originalEvent: event,\n value: options.value.value ?? '',\n });\n\n const toggle = (event: Event): void => {\n if (field.disabled.value) return;\n\n if (options.group) {\n indeterminate.value = false;\n options.group.toggle(options.value.value ?? '', event);\n options.onToggle?.(createPayload(event));\n\n return;\n }\n\n if (options.clearIndeterminateFirst && indeterminate.value) {\n indeterminate.value = false;\n } else {\n checked.value = !checked.value;\n indeterminate.value = false;\n }\n\n options.onToggle?.(createPayload(event));\n };\n\n const interaction = createInteraction({\n disabled: field.disabled,\n onPress: (event) => toggle(event),\n });\n\n return {\n ...field,\n checkableFormValue,\n checked,\n handleClick: interaction.handleClick,\n handleKeydown: interaction.handleKeydown,\n indeterminate,\n toggle,\n };\n};\n"],"mappings":"6HA6CA,IAAa,EAAmB,GAA+C,CAC7E,IAAM,EAAU,EAAA,aAAa,EAAQ,QAAS,EAAQ,OAAQ,OAAO,EAC/D,EAAgB,EAAQ,cAC1B,EAAA,aAAa,EAAQ,cAAe,EAAQ,OAAQ,OAAO,GAAA,EAAA,EAAA,OAAA,CACpD,EAAK,EAEV,GAAA,EAAA,EAAA,SAAA,KACJ,EAAc,MAAQ,KAAO,EAAQ,MAAS,EAAQ,MAAM,OAAS,GAAM,IAC7E,EAEM,EAAQ,EAAA,YAAY,CAAO,EAE3B,EAAiB,IAA0C,CAC/D,QAAS,EAAQ,MACjB,cAAe,EACf,MAAO,EAAQ,MAAM,OAAS,EAChC,GAEM,EAAU,GAAuB,CACjC,MAAM,SAAS,MAEnB,IAAI,EAAQ,MAAO,CACjB,EAAc,MAAQ,GACtB,EAAQ,MAAM,OAAO,EAAQ,MAAM,OAAS,GAAI,CAAK,EACrD,EAAQ,WAAW,EAAc,CAAK,CAAC,EAEvC,MACF,CAEI,EAAQ,yBAA2B,EAAc,QAGnD,EAAQ,MAAQ,CAAC,EAAQ,OAFzB,EAAc,MAAQ,GAMxB,EAAQ,WAAW,EAAc,CAAK,CAAC,CATvC,CAUF,EAEM,EAAc,EAAA,kBAAkB,CACpC,SAAU,EAAM,SAChB,QAAU,GAAU,EAAO,CAAK,CAClC,CAAC,EAED,MAAO,CACL,GAAG,EACH,qBACA,UACA,YAAa,EAAY,YACzB,cAAe,EAAY,cAC3B,gBACA,QACF,CACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type Readable, type Signal } from '@vielzeug/ripple';
|
|
2
|
+
import { type ControlValidationMode, type FieldHandle } from './field-base';
|
|
3
|
+
export type CheckableChangePayload = {
|
|
4
|
+
checked: boolean;
|
|
5
|
+
originalEvent?: Event;
|
|
6
|
+
value: string;
|
|
7
|
+
};
|
|
8
|
+
export type CheckableOptions = {
|
|
9
|
+
checked: Readable<boolean | undefined>;
|
|
10
|
+
clearIndeterminateFirst?: boolean;
|
|
11
|
+
disabled?: Readable<boolean | undefined>;
|
|
12
|
+
error?: Readable<string | undefined>;
|
|
13
|
+
/**
|
|
14
|
+
* Returns the underlying form field object used for validation triggering.
|
|
15
|
+
* Called lazily — safe to return `null` before the first render.
|
|
16
|
+
*/
|
|
17
|
+
getFormField?: () => {
|
|
18
|
+
reportValidity(): void;
|
|
19
|
+
} | null;
|
|
20
|
+
group?: {
|
|
21
|
+
toggle: (value: string, originalEvent?: Event) => void;
|
|
22
|
+
};
|
|
23
|
+
helper?: Readable<string | undefined>;
|
|
24
|
+
indeterminate?: Readable<boolean | undefined>;
|
|
25
|
+
onToggle?: (payload: CheckableChangePayload) => void;
|
|
26
|
+
prefix?: string;
|
|
27
|
+
/** `AbortSignal` from the component lifecycle. All reactive subscriptions are torn down on abort. */
|
|
28
|
+
signal: AbortSignal;
|
|
29
|
+
validateOn?: Readable<ControlValidationMode>;
|
|
30
|
+
value: Readable<string | undefined>;
|
|
31
|
+
};
|
|
32
|
+
export type CheckableHandle = FieldHandle & {
|
|
33
|
+
/** The form submission value: null when unchecked/indeterminate, the value string when checked. */
|
|
34
|
+
checkableFormValue: Readable<string | null>;
|
|
35
|
+
checked: Signal<boolean>;
|
|
36
|
+
handleClick: (event: MouseEvent) => boolean;
|
|
37
|
+
handleKeydown: (event: KeyboardEvent) => boolean;
|
|
38
|
+
indeterminate: Signal<boolean>;
|
|
39
|
+
toggle: (event: Event) => void;
|
|
40
|
+
};
|
|
41
|
+
export declare const createCheckable: (options: CheckableOptions) => CheckableHandle;
|
|
42
|
+
//# sourceMappingURL=checkable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkable.d.ts","sourceRoot":"","sources":["../../src/headless/checkable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAU,MAAM,kBAAkB,CAAC;AAEhF,OAAO,EAAe,KAAK,qBAAqB,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAMzF,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IACvC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACrC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM;QAAE,cAAc,IAAI,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IACvD,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;KAAE,CAAC;IACnE,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACtC,aAAa,CAAC,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qGAAqG;IACrG,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IAC7C,KAAK,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG;IAC1C,mGAAmG;IACnG,kBAAkB,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,WAAW,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC;IAC5C,aAAa,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;IACjD,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,SAAS,gBAAgB,KAAG,eAqD3D,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { createField as e } from "./field-base.js";
|
|
2
|
+
import { syncedSignal as t } from "./signals.js";
|
|
3
|
+
import { createInteraction as n } from "./keyboard.js";
|
|
4
|
+
import { computed as r, signal as i } from "@vielzeug/ripple";
|
|
5
|
+
//#region src/headless/checkable.ts
|
|
6
|
+
var a = (a) => {
|
|
7
|
+
let o = t(a.checked, a.signal, Boolean), s = a.indeterminate ? t(a.indeterminate, a.signal, Boolean) : i(!1), c = r(() => s.value ? null : o.value ? a.value.value ?? "" : null), l = e(a), u = (e) => ({
|
|
8
|
+
checked: o.value,
|
|
9
|
+
originalEvent: e,
|
|
10
|
+
value: a.value.value ?? ""
|
|
11
|
+
}), d = (e) => {
|
|
12
|
+
if (!l.disabled.value) {
|
|
13
|
+
if (a.group) {
|
|
14
|
+
s.value = !1, a.group.toggle(a.value.value ?? "", e), a.onToggle?.(u(e));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
a.clearIndeterminateFirst && s.value || (o.value = !o.value), s.value = !1, a.onToggle?.(u(e));
|
|
18
|
+
}
|
|
19
|
+
}, f = n({
|
|
20
|
+
disabled: l.disabled,
|
|
21
|
+
onPress: (e) => d(e)
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
...l,
|
|
25
|
+
checkableFormValue: c,
|
|
26
|
+
checked: o,
|
|
27
|
+
handleClick: f.handleClick,
|
|
28
|
+
handleKeydown: f.handleKeydown,
|
|
29
|
+
indeterminate: s,
|
|
30
|
+
toggle: d
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
//#endregion
|
|
34
|
+
export { a as createCheckable };
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=checkable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkable.js","names":[],"sources":["../../src/headless/checkable.ts"],"sourcesContent":["import { computed, type Readable, type Signal, signal } from '@vielzeug/ripple';\n\nimport { createField, type ControlValidationMode, type FieldHandle } from './field-base';\nimport { createInteraction } from './keyboard';\nimport { syncedSignal } from './signals';\n\n// ── Checkable control ─────────────────────────────────────────────────────────\n\nexport type CheckableChangePayload = {\n checked: boolean;\n originalEvent?: Event;\n value: string;\n};\n\nexport type CheckableOptions = {\n checked: Readable<boolean | undefined>;\n clearIndeterminateFirst?: boolean;\n disabled?: Readable<boolean | undefined>;\n error?: Readable<string | undefined>;\n /**\n * Returns the underlying form field object used for validation triggering.\n * Called lazily — safe to return `null` before the first render.\n */\n getFormField?: () => { reportValidity(): void } | null;\n group?: { toggle: (value: string, originalEvent?: Event) => void };\n helper?: Readable<string | undefined>;\n indeterminate?: Readable<boolean | undefined>;\n onToggle?: (payload: CheckableChangePayload) => void;\n prefix?: string;\n /** `AbortSignal` from the component lifecycle. All reactive subscriptions are torn down on abort. */\n signal: AbortSignal;\n validateOn?: Readable<ControlValidationMode>;\n value: Readable<string | undefined>;\n};\n\nexport type CheckableHandle = FieldHandle & {\n /** The form submission value: null when unchecked/indeterminate, the value string when checked. */\n checkableFormValue: Readable<string | null>;\n checked: Signal<boolean>;\n handleClick: (event: MouseEvent) => boolean;\n handleKeydown: (event: KeyboardEvent) => boolean;\n indeterminate: Signal<boolean>;\n toggle: (event: Event) => void;\n};\n\nexport const createCheckable = (options: CheckableOptions): CheckableHandle => {\n const checked = syncedSignal(options.checked, options.signal, Boolean);\n const indeterminate = options.indeterminate\n ? syncedSignal(options.indeterminate, options.signal, Boolean)\n : signal(false);\n\n const checkableFormValue = computed<string | null>(() =>\n indeterminate.value ? null : checked.value ? (options.value.value ?? '') : null,\n );\n\n const field = createField(options);\n\n const createPayload = (event: Event): CheckableChangePayload => ({\n checked: checked.value,\n originalEvent: event,\n value: options.value.value ?? '',\n });\n\n const toggle = (event: Event): void => {\n if (field.disabled.value) return;\n\n if (options.group) {\n indeterminate.value = false;\n options.group.toggle(options.value.value ?? '', event);\n options.onToggle?.(createPayload(event));\n\n return;\n }\n\n if (options.clearIndeterminateFirst && indeterminate.value) {\n indeterminate.value = false;\n } else {\n checked.value = !checked.value;\n indeterminate.value = false;\n }\n\n options.onToggle?.(createPayload(event));\n };\n\n const interaction = createInteraction({\n disabled: field.disabled,\n onPress: (event) => toggle(event),\n });\n\n return {\n ...field,\n checkableFormValue,\n checked,\n handleClick: interaction.handleClick,\n handleKeydown: interaction.handleKeydown,\n indeterminate,\n toggle,\n };\n};\n"],"mappings":";;;;;AA6CA,IAAa,KAAmB,MAA+C;CAC7E,IAAM,IAAU,EAAa,EAAQ,SAAS,EAAQ,QAAQ,OAAO,GAC/D,IAAgB,EAAQ,gBAC1B,EAAa,EAAQ,eAAe,EAAQ,QAAQ,OAAO,IAC3D,EAAO,EAAK,GAEV,IAAqB,QACzB,EAAc,QAAQ,OAAO,EAAQ,QAAS,EAAQ,MAAM,SAAS,KAAM,IAC7E,GAEM,IAAQ,EAAY,CAAO,GAE3B,KAAiB,OAA0C;EAC/D,SAAS,EAAQ;EACjB,eAAe;EACf,OAAO,EAAQ,MAAM,SAAS;CAChC,IAEM,KAAU,MAAuB;EACjC,OAAM,SAAS,OAEnB;OAAI,EAAQ,OAAO;IAGjB,AAFA,EAAc,QAAQ,IACtB,EAAQ,MAAM,OAAO,EAAQ,MAAM,SAAS,IAAI,CAAK,GACrD,EAAQ,WAAW,EAAc,CAAK,CAAC;IAEvC;GACF;GASA,AAPI,EAAQ,2BAA2B,EAAc,UAGnD,EAAQ,QAAQ,CAAC,EAAQ,QAFzB,EAAc,QAAQ,IAMxB,EAAQ,WAAW,EAAc,CAAK,CAAC;EATvC;CAUF,GAEM,IAAc,EAAkB;EACpC,UAAU,EAAM;EAChB,UAAU,MAAU,EAAO,CAAK;CAClC,CAAC;CAED,OAAO;EACL,GAAG;EACH;EACA;EACA,aAAa,EAAY;EACzB,eAAe,EAAY;EAC3B;EACA;CACF;AACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./field-base.cjs");let t=require("@vielzeug/ripple");var n=e=>e?Array.isArray(e)?e.filter(Boolean):e.split(`,`).map(e=>e.trim()).filter(Boolean):[],r=r=>{let i=(0,t.signal)([]),a=(0,t.computed)(()=>!!r.multiple?.value),o=(0,t.computed)(()=>a.value?i.value.join(`,`):i.value[0]??``),s=e=>{let t=a.value?e:e.slice(0,1);return[...new Set(t.filter(Boolean))]},c=e=>{i.value=s(e)},l=()=>c([]),u=e=>{i.value=i.value.filter(t=>t!==e)},d=e=>{if(a.value){i.value.includes(e)||c([...i.value,e]);return}c([e])},f=e=>{a.value&&i.value.includes(e)?u(e):d(e)},p=e=>{c(n(e))},m=e.createField(r),h=(0,t.watch)(r.value,p,{immediate:!0});if(r.signal.addEventListener(`abort`,()=>h.dispose(),{once:!0}),r.multiple){let e=(0,t.watch)(r.multiple,()=>p(r.value.value));r.signal.addEventListener(`abort`,()=>e.dispose(),{once:!0})}return{...m,clear:l,formValue:o,removeValue:u,selectedValue:(0,t.computed)(()=>i.value[0]),selectedValues:i,selectValue:d,setValues:c,toggleValue:f}};exports.createChoiceField=r;
|
|
2
|
+
//# sourceMappingURL=choice-field.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"choice-field.cjs","names":[],"sources":["../../src/headless/choice-field.ts"],"sourcesContent":["import { computed, type Readable, signal, watch } from '@vielzeug/ripple';\n\nimport { createField, type FieldHandle, type FieldOptions } from './field-base';\n\n// ── Choice change event payload ──────────────────────────────────────────────────────────────\n\nexport type ChoiceChangeDetail = {\n labels: string[];\n originalEvent?: Event;\n values: string[];\n};\n\n// ── Choice field ──────────────────────────────────────────────────────────────────────\n\nexport type ChoiceFieldOptions = FieldOptions & {\n multiple?: Readable<boolean | undefined>;\n /** `AbortSignal` from the component lifecycle. All internal subscriptions are disposed on abort. */\n signal: AbortSignal;\n /**\n * Current selection value(s). Accepts a comma-separated string\n * (legacy/single-select form serialisation) or a `string[]` array.\n * The field normalises both formats internally via `parseChoiceValues`.\n */\n value: Readable<string | string[] | undefined>;\n};\n\nexport type ChoiceFieldHandle = FieldHandle & {\n clear: () => void;\n formValue: Readable<string>;\n removeValue: (value: string) => void;\n selectedValue: Readable<string | undefined>;\n selectedValues: Readable<string[]>;\n selectValue: (value: string) => void;\n setValues: (values: string[]) => void;\n /**\n * Toggles `value` in the selection.\n * - **Multiple mode**: adds if absent, removes if present.\n * - **Single mode**: always selects `value` (acts like `selectValue` — cannot\n * deselect; use `clear()` to reset a single-select field).\n */\n toggleValue: (value: string) => void;\n};\n\nconst parseChoiceValues = (raw: string | string[] | undefined): string[] => {\n if (!raw) return [];\n\n if (Array.isArray(raw)) return raw.filter(Boolean);\n\n return raw\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n};\n\nexport const createChoiceField = (options: ChoiceFieldOptions): ChoiceFieldHandle => {\n const selectedValues = signal<string[]>([]);\n const isMultiple = computed(() => Boolean(options.multiple?.value));\n const formValue = computed(() =>\n isMultiple.value ? selectedValues.value.join(',') : (selectedValues.value[0] ?? ''),\n );\n\n const normalizeValues = (values: string[]): string[] => {\n const normalized = isMultiple.value ? values : values.slice(0, 1);\n\n return [...new Set(normalized.filter(Boolean))];\n };\n\n const setValues = (values: string[]): void => {\n selectedValues.value = normalizeValues(values);\n };\n const clear = (): void => setValues([]);\n const removeValue = (value: string): void => {\n selectedValues.value = selectedValues.value.filter((v) => v !== value);\n };\n\n const selectValue = (value: string): void => {\n if (isMultiple.value) {\n if (!selectedValues.value.includes(value)) setValues([...selectedValues.value, value]);\n\n return;\n }\n\n setValues([value]);\n };\n\n const toggleValue = (value: string): void => {\n if (isMultiple.value) {\n if (selectedValues.value.includes(value)) removeValue(value);\n else selectValue(value);\n } else {\n selectValue(value);\n }\n };\n\n const syncFromProp = (nextValue: string | string[] | undefined): void => {\n setValues(parseChoiceValues(nextValue));\n };\n\n const field = createField(options);\n\n const valueSub = watch(options.value, syncFromProp, { immediate: true });\n\n options.signal.addEventListener('abort', () => valueSub.dispose(), { once: true });\n\n if (options.multiple) {\n const multipleSub = watch(options.multiple, () => syncFromProp(options.value.value));\n\n options.signal.addEventListener('abort', () => multipleSub.dispose(), { once: true });\n }\n\n return {\n ...field,\n clear,\n formValue,\n removeValue,\n selectedValue: computed(() => selectedValues.value[0]),\n selectedValues,\n selectValue,\n setValues,\n toggleValue,\n };\n};\n"],"mappings":"sEA2CA,IAAM,EAAqB,GACpB,EAED,MAAM,QAAQ,CAAG,EAAU,EAAI,OAAO,OAAO,EAE1C,EACJ,MAAM,GAAG,CAAC,CACV,IAAK,GAAU,EAAM,KAAK,CAAC,CAAC,CAC5B,OAAO,OAAO,EAPA,CAAC,EAUP,EAAqB,GAAmD,CACnF,IAAM,GAAA,EAAA,EAAA,OAAA,CAAkC,CAAC,CAAC,EACpC,GAAA,EAAA,EAAA,SAAA,KAA4B,EAAQ,EAAQ,UAAU,KAAM,EAC5D,GAAA,EAAA,EAAA,SAAA,KACJ,EAAW,MAAQ,EAAe,MAAM,KAAK,GAAG,EAAK,EAAe,MAAM,IAAM,EAClF,EAEM,EAAmB,GAA+B,CACtD,IAAM,EAAa,EAAW,MAAQ,EAAS,EAAO,MAAM,EAAG,CAAC,EAEhE,MAAO,CAAC,GAAG,IAAI,IAAI,EAAW,OAAO,OAAO,CAAC,CAAC,CAChD,EAEM,EAAa,GAA2B,CAC5C,EAAe,MAAQ,EAAgB,CAAM,CAC/C,EACM,MAAoB,EAAU,CAAC,CAAC,EAChC,EAAe,GAAwB,CAC3C,EAAe,MAAQ,EAAe,MAAM,OAAQ,GAAM,IAAM,CAAK,CACvE,EAEM,EAAe,GAAwB,CAC3C,GAAI,EAAW,MAAO,CACf,EAAe,MAAM,SAAS,CAAK,GAAG,EAAU,CAAC,GAAG,EAAe,MAAO,CAAK,CAAC,EAErF,MACF,CAEA,EAAU,CAAC,CAAK,CAAC,CACnB,EAEM,EAAe,GAAwB,CACvC,EAAW,OACT,EAAe,MAAM,SAAS,CAAK,EAAG,EAAY,CAAK,EACtD,EAAY,CAAK,CAI1B,EAEM,EAAgB,GAAmD,CACvE,EAAU,EAAkB,CAAS,CAAC,CACxC,EAEM,EAAQ,EAAA,YAAY,CAAO,EAE3B,GAAA,EAAA,EAAA,MAAA,CAAiB,EAAQ,MAAO,EAAc,CAAE,UAAW,EAAK,CAAC,EAIvE,GAFA,EAAQ,OAAO,iBAAiB,YAAe,EAAS,QAAQ,EAAG,CAAE,KAAM,EAAK,CAAC,EAE7E,EAAQ,SAAU,CACpB,IAAM,GAAA,EAAA,EAAA,MAAA,CAAoB,EAAQ,aAAgB,EAAa,EAAQ,MAAM,KAAK,CAAC,EAEnF,EAAQ,OAAO,iBAAiB,YAAe,EAAY,QAAQ,EAAG,CAAE,KAAM,EAAK,CAAC,CACtF,CAEA,MAAO,CACL,GAAG,EACH,QACA,YACA,cACA,eAAA,EAAA,EAAA,SAAA,KAA8B,EAAe,MAAM,EAAE,EACrD,iBACA,cACA,YACA,aACF,CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Readable } from '@vielzeug/ripple';
|
|
2
|
+
import { type FieldHandle, type FieldOptions } from './field-base';
|
|
3
|
+
export type ChoiceChangeDetail = {
|
|
4
|
+
labels: string[];
|
|
5
|
+
originalEvent?: Event;
|
|
6
|
+
values: string[];
|
|
7
|
+
};
|
|
8
|
+
export type ChoiceFieldOptions = FieldOptions & {
|
|
9
|
+
multiple?: Readable<boolean | undefined>;
|
|
10
|
+
/** `AbortSignal` from the component lifecycle. All internal subscriptions are disposed on abort. */
|
|
11
|
+
signal: AbortSignal;
|
|
12
|
+
/**
|
|
13
|
+
* Current selection value(s). Accepts a comma-separated string
|
|
14
|
+
* (legacy/single-select form serialisation) or a `string[]` array.
|
|
15
|
+
* The field normalises both formats internally via `parseChoiceValues`.
|
|
16
|
+
*/
|
|
17
|
+
value: Readable<string | string[] | undefined>;
|
|
18
|
+
};
|
|
19
|
+
export type ChoiceFieldHandle = FieldHandle & {
|
|
20
|
+
clear: () => void;
|
|
21
|
+
formValue: Readable<string>;
|
|
22
|
+
removeValue: (value: string) => void;
|
|
23
|
+
selectedValue: Readable<string | undefined>;
|
|
24
|
+
selectedValues: Readable<string[]>;
|
|
25
|
+
selectValue: (value: string) => void;
|
|
26
|
+
setValues: (values: string[]) => void;
|
|
27
|
+
/**
|
|
28
|
+
* Toggles `value` in the selection.
|
|
29
|
+
* - **Multiple mode**: adds if absent, removes if present.
|
|
30
|
+
* - **Single mode**: always selects `value` (acts like `selectValue` — cannot
|
|
31
|
+
* deselect; use `clear()` to reset a single-select field).
|
|
32
|
+
*/
|
|
33
|
+
toggleValue: (value: string) => void;
|
|
34
|
+
};
|
|
35
|
+
export declare const createChoiceField: (options: ChoiceFieldOptions) => ChoiceFieldHandle;
|
|
36
|
+
//# sourceMappingURL=choice-field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"choice-field.d.ts","sourceRoot":"","sources":["../../src/headless/choice-field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,QAAQ,EAAiB,MAAM,kBAAkB,CAAC;AAE1E,OAAO,EAAe,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAIhF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAIF,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG;IAC9C,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IACzC,oGAAoG;IACpG,MAAM,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,KAAK,EAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG;IAC5C,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC5C,cAAc,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACtC;;;;;OAKG;IACH,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,CAAC;AAaF,eAAO,MAAM,iBAAiB,GAAI,SAAS,kBAAkB,KAAG,iBAmE/D,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createField as e } from "./field-base.js";
|
|
2
|
+
import { computed as t, signal as n, watch as r } from "@vielzeug/ripple";
|
|
3
|
+
//#region src/headless/choice-field.ts
|
|
4
|
+
var i = (e) => e ? Array.isArray(e) ? e.filter(Boolean) : e.split(",").map((e) => e.trim()).filter(Boolean) : [], a = (a) => {
|
|
5
|
+
let o = n([]), s = t(() => !!a.multiple?.value), c = t(() => s.value ? o.value.join(",") : o.value[0] ?? ""), l = (e) => {
|
|
6
|
+
let t = s.value ? e : e.slice(0, 1);
|
|
7
|
+
return [...new Set(t.filter(Boolean))];
|
|
8
|
+
}, u = (e) => {
|
|
9
|
+
o.value = l(e);
|
|
10
|
+
}, d = () => u([]), f = (e) => {
|
|
11
|
+
o.value = o.value.filter((t) => t !== e);
|
|
12
|
+
}, p = (e) => {
|
|
13
|
+
if (s.value) {
|
|
14
|
+
o.value.includes(e) || u([...o.value, e]);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
u([e]);
|
|
18
|
+
}, m = (e) => {
|
|
19
|
+
s.value && o.value.includes(e) ? f(e) : p(e);
|
|
20
|
+
}, h = (e) => {
|
|
21
|
+
u(i(e));
|
|
22
|
+
}, g = e(a), _ = r(a.value, h, { immediate: !0 });
|
|
23
|
+
if (a.signal.addEventListener("abort", () => _.dispose(), { once: !0 }), a.multiple) {
|
|
24
|
+
let e = r(a.multiple, () => h(a.value.value));
|
|
25
|
+
a.signal.addEventListener("abort", () => e.dispose(), { once: !0 });
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
...g,
|
|
29
|
+
clear: d,
|
|
30
|
+
formValue: c,
|
|
31
|
+
removeValue: f,
|
|
32
|
+
selectedValue: t(() => o.value[0]),
|
|
33
|
+
selectedValues: o,
|
|
34
|
+
selectValue: p,
|
|
35
|
+
setValues: u,
|
|
36
|
+
toggleValue: m
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
//#endregion
|
|
40
|
+
export { a as createChoiceField };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=choice-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"choice-field.js","names":[],"sources":["../../src/headless/choice-field.ts"],"sourcesContent":["import { computed, type Readable, signal, watch } from '@vielzeug/ripple';\n\nimport { createField, type FieldHandle, type FieldOptions } from './field-base';\n\n// ── Choice change event payload ──────────────────────────────────────────────────────────────\n\nexport type ChoiceChangeDetail = {\n labels: string[];\n originalEvent?: Event;\n values: string[];\n};\n\n// ── Choice field ──────────────────────────────────────────────────────────────────────\n\nexport type ChoiceFieldOptions = FieldOptions & {\n multiple?: Readable<boolean | undefined>;\n /** `AbortSignal` from the component lifecycle. All internal subscriptions are disposed on abort. */\n signal: AbortSignal;\n /**\n * Current selection value(s). Accepts a comma-separated string\n * (legacy/single-select form serialisation) or a `string[]` array.\n * The field normalises both formats internally via `parseChoiceValues`.\n */\n value: Readable<string | string[] | undefined>;\n};\n\nexport type ChoiceFieldHandle = FieldHandle & {\n clear: () => void;\n formValue: Readable<string>;\n removeValue: (value: string) => void;\n selectedValue: Readable<string | undefined>;\n selectedValues: Readable<string[]>;\n selectValue: (value: string) => void;\n setValues: (values: string[]) => void;\n /**\n * Toggles `value` in the selection.\n * - **Multiple mode**: adds if absent, removes if present.\n * - **Single mode**: always selects `value` (acts like `selectValue` — cannot\n * deselect; use `clear()` to reset a single-select field).\n */\n toggleValue: (value: string) => void;\n};\n\nconst parseChoiceValues = (raw: string | string[] | undefined): string[] => {\n if (!raw) return [];\n\n if (Array.isArray(raw)) return raw.filter(Boolean);\n\n return raw\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n};\n\nexport const createChoiceField = (options: ChoiceFieldOptions): ChoiceFieldHandle => {\n const selectedValues = signal<string[]>([]);\n const isMultiple = computed(() => Boolean(options.multiple?.value));\n const formValue = computed(() =>\n isMultiple.value ? selectedValues.value.join(',') : (selectedValues.value[0] ?? ''),\n );\n\n const normalizeValues = (values: string[]): string[] => {\n const normalized = isMultiple.value ? values : values.slice(0, 1);\n\n return [...new Set(normalized.filter(Boolean))];\n };\n\n const setValues = (values: string[]): void => {\n selectedValues.value = normalizeValues(values);\n };\n const clear = (): void => setValues([]);\n const removeValue = (value: string): void => {\n selectedValues.value = selectedValues.value.filter((v) => v !== value);\n };\n\n const selectValue = (value: string): void => {\n if (isMultiple.value) {\n if (!selectedValues.value.includes(value)) setValues([...selectedValues.value, value]);\n\n return;\n }\n\n setValues([value]);\n };\n\n const toggleValue = (value: string): void => {\n if (isMultiple.value) {\n if (selectedValues.value.includes(value)) removeValue(value);\n else selectValue(value);\n } else {\n selectValue(value);\n }\n };\n\n const syncFromProp = (nextValue: string | string[] | undefined): void => {\n setValues(parseChoiceValues(nextValue));\n };\n\n const field = createField(options);\n\n const valueSub = watch(options.value, syncFromProp, { immediate: true });\n\n options.signal.addEventListener('abort', () => valueSub.dispose(), { once: true });\n\n if (options.multiple) {\n const multipleSub = watch(options.multiple, () => syncFromProp(options.value.value));\n\n options.signal.addEventListener('abort', () => multipleSub.dispose(), { once: true });\n }\n\n return {\n ...field,\n clear,\n formValue,\n removeValue,\n selectedValue: computed(() => selectedValues.value[0]),\n selectedValues,\n selectValue,\n setValues,\n toggleValue,\n };\n};\n"],"mappings":";;;AA2CA,IAAM,KAAqB,MACpB,IAED,MAAM,QAAQ,CAAG,IAAU,EAAI,OAAO,OAAO,IAE1C,EACJ,MAAM,GAAG,CAAC,CACV,KAAK,MAAU,EAAM,KAAK,CAAC,CAAC,CAC5B,OAAO,OAAO,IAPA,CAAC,GAUP,KAAqB,MAAmD;CACnF,IAAM,IAAiB,EAAiB,CAAC,CAAC,GACpC,IAAa,QAAe,EAAQ,EAAQ,UAAU,KAAM,GAC5D,IAAY,QAChB,EAAW,QAAQ,EAAe,MAAM,KAAK,GAAG,IAAK,EAAe,MAAM,MAAM,EAClF,GAEM,KAAmB,MAA+B;EACtD,IAAM,IAAa,EAAW,QAAQ,IAAS,EAAO,MAAM,GAAG,CAAC;EAEhE,OAAO,CAAC,GAAG,IAAI,IAAI,EAAW,OAAO,OAAO,CAAC,CAAC;CAChD,GAEM,KAAa,MAA2B;EAC5C,EAAe,QAAQ,EAAgB,CAAM;CAC/C,GACM,UAAoB,EAAU,CAAC,CAAC,GAChC,KAAe,MAAwB;EAC3C,EAAe,QAAQ,EAAe,MAAM,QAAQ,MAAM,MAAM,CAAK;CACvE,GAEM,KAAe,MAAwB;EAC3C,IAAI,EAAW,OAAO;GACpB,AAAK,EAAe,MAAM,SAAS,CAAK,KAAG,EAAU,CAAC,GAAG,EAAe,OAAO,CAAK,CAAC;GAErF;EACF;EAEA,EAAU,CAAC,CAAK,CAAC;CACnB,GAEM,KAAe,MAAwB;EAC3C,AAAI,EAAW,SACT,EAAe,MAAM,SAAS,CAAK,IAAG,EAAY,CAAK,IACtD,EAAY,CAAK;CAI1B,GAEM,KAAgB,MAAmD;EACvE,EAAU,EAAkB,CAAS,CAAC;CACxC,GAEM,IAAQ,EAAY,CAAO,GAE3B,IAAW,EAAM,EAAQ,OAAO,GAAc,EAAE,WAAW,GAAK,CAAC;CAIvE,IAFA,EAAQ,OAAO,iBAAiB,eAAe,EAAS,QAAQ,GAAG,EAAE,MAAM,GAAK,CAAC,GAE7E,EAAQ,UAAU;EACpB,IAAM,IAAc,EAAM,EAAQ,gBAAgB,EAAa,EAAQ,MAAM,KAAK,CAAC;EAEnF,EAAQ,OAAO,iBAAiB,eAAe,EAAY,QAAQ,GAAG,EAAE,MAAM,GAAK,CAAC;CACtF;CAEA,OAAO;EACL,GAAG;EACH;EACA;EACA;EACA,eAAe,QAAe,EAAe,MAAM,EAAE;EACrD;EACA;EACA;EACA;CACF;AACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./paginated-list.cjs"),t=require("./selection-control.cjs"),n=require("./sort-control.cjs");let r=require("@vielzeug/ripple");var i=i=>{let a=n.createSortControl({columns:i.columns,items:i.items,onSortChange:i.onSortChange}),o=e.createPaginatedList({getItems:()=>a.sortedItems.value,pageSize:(0,r.computed)(()=>{let e=i.pageSize();return e<=0?2**53-1:e})}),s=(0,r.computed)(()=>a.sortedItems.value.length),c=(0,r.computed)(()=>i.pageSize()<=0?a.sortedItems.value:o.pageItems.value),l=e=>{a.sortBy(e),o.reset()},u=(e,t)=>{a.sortTo(e,t),o.reset()},d=t.createSelectionControl({getRowKey:i.getRowKey,onSelectionChange:i.onSelectionChange,pageItems:()=>o.pageItems.value,selectionMode:i.selectionMode}),f=(0,r.computed)(()=>i.items.value.filter(e=>d.selectedKeys.value.has(i.getRowKey(e))));return{clearSelection:d.clearSelection,currentPageItems:c,goToPage:e=>{Number.isFinite(e)&&o.goTo(Math.max(0,e))},hasNextPage:o.hasNext,hasPrevPage:o.hasPrev,isAllSelected:d.isAllSelected,isSelected:d.isSelected,nextPage:o.next,pageCount:o.pageCount,pageIndex:o.pageIndex,prevPage:o.prev,selectAll:d.selectAll,selectedKeys:d.selectedKeys,selectedRows:f,setSelection:d.setSelection,sortBy:l,sortState:a.sortState,sortTo:u,toggleRow:d.toggleRow,totalItems:s}};exports.createDataGridControl=i;
|
|
2
|
+
//# sourceMappingURL=datagrid.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datagrid.cjs","names":[],"sources":["../../src/headless/datagrid.ts"],"sourcesContent":["import { computed, type Readable } from '@vielzeug/ripple';\n\nimport { createPaginatedList } from './paginated-list';\nimport { createSelectionControl } from './selection-control';\nimport { createSortControl } from './sort-control';\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\n/** Sort direction for a column. */\nexport type SortDirection = 'asc' | 'desc' | 'none';\n\n/** Per-column sort state. */\nexport type SortState = {\n /** Current sort direction. */\n direction: SortDirection;\n /** The column key being sorted. Empty string when unsorted. */\n key: string;\n};\n\n/** Column definition for the datagrid. */\nexport type DataGridColumn<T = Record<string, unknown>> = {\n /** Text alignment for the column: `'left'` | `'center'` | `'right'`. Defaults to `'left'`. */\n align?: 'left' | 'center' | 'right';\n /**\n * Custom cell renderer. Receives the row item and returns a string.\n * Use for formatted values (e.g. dates, currency, booleans).\n */\n cell?: (item: T) => string;\n /** Accessible label for the column header. Defaults to `label`. */\n headerLabel?: string;\n /** Column key — must match a property of the row object. */\n key: string;\n /** Display label for the column header. */\n label: string;\n /**\n * Renders the expanded detail panel for a row. When provided on any column,\n * `<ore-datagrid expandable>` shows a toggle button in each row.\n * Receives the full row item and returns an HTML string.\n *\n * @security The returned string is inserted via ore's `raw()` directive — it participates\n * in any sanitizer registered with `setRawSanitizer()`, but if none is registered it is\n * inserted as-is. If any part of the returned markup is derived from untrusted data\n * (row/user content), sanitize it yourself before returning (e.g. with DOMPurify).\n *\n * @example\n * ```js\n * import DOMPurify from 'dompurify';\n *\n * grid.columns = [{\n * key: 'name', label: 'Name',\n * renderExpanded: (row) => DOMPurify.sanitize(`<div class=\"detail\"><b>${row.name}</b>: ${row.bio}</div>`),\n * }];\n * ```\n */\n renderExpanded?: (item: T) => string;\n /** Whether the column can be resized via a drag handle. Defaults to `false`. */\n resizable?: boolean;\n /** Whether the column is sortable. Defaults to `false`. */\n sortable?: boolean;\n /**\n * Custom sort key extractor for client-side sorting.\n * Return a `number` or `string` for comparison.\n * When omitted, the column's `key` property is used as a plain property lookup.\n *\n * @example\n * ```ts\n * { key: 'createdAt', label: 'Date', sortValue: (row) => new Date(row.createdAt).getTime() }\n * ```\n */\n sortValue?: (item: T) => number | string;\n /** Column width (any valid CSS width value, e.g. `'12rem'`). */\n width?: string;\n};\n\n/** Row selection mode. */\nexport type SelectionMode = 'multi' | 'none' | 'single';\n\nexport type DataGridControlOptions<T = Record<string, unknown>> = {\n /** Returns the current column definitions reactively. */\n columns: () => DataGridColumn<T>[];\n /** Returns a unique string key for each row item. */\n getRowKey: (item: T) => string;\n /**\n * Reactive signal of the current row items.\n *\n * For server-side sorting, pass a signal whose value is the pre-sorted result\n * from your server. For client-side sorting, pass a plain signal wrapping your\n * full dataset — the control will sort it automatically via `sortBy()`.\n */\n items: Readable<T[]>;\n /** Called when selection changes. Receives the full set of selected keys. */\n onSelectionChange?: (keys: Set<string>) => void;\n /** Called when sort state changes. */\n onSortChange?: (sort: SortState) => void;\n /** Returns the current page size reactively. Use `0` to disable pagination. */\n pageSize: () => number;\n /** Returns the current selection mode reactively. */\n selectionMode: () => SelectionMode;\n /** `AbortSignal` from the component lifecycle. */\n signal: AbortSignal;\n};\n\nexport type DataGridControl<T = Record<string, unknown>> = {\n /** Deselect all rows. */\n clearSelection(): void;\n /** Current page items (sorted + paginated). Reactive signal. */\n readonly currentPageItems: Readable<T[]>;\n /** Go to an absolute page index. The index is clamped to the valid page range `[0, pageCount - 1]`. */\n goToPage(index: number): void;\n /** Whether there is a next page. Reactive signal. */\n readonly hasNextPage: Readable<boolean>;\n /** Whether there is a previous page. Reactive signal. */\n readonly hasPrevPage: Readable<boolean>;\n /** Whether all current-page rows are selected. */\n isAllSelected(): boolean;\n /** Whether a given row key is selected. */\n isSelected(key: string): boolean;\n /** Navigate to the next page. */\n nextPage(): void;\n /** Total page count. Reactive signal. */\n readonly pageCount: Readable<number>;\n /** Current 0-based page index. Reactive signal. */\n readonly pageIndex: Readable<number>;\n /** Navigate to the previous page. */\n prevPage(): void;\n /** Select all rows on the current page. */\n selectAll(): void;\n /** Current selected row keys. Reactive signal. Returns a snapshot copy — mutating the returned set has no effect on reactive state; use `toggleRow`, `selectAll`, `setSelection`, or `clearSelection` to update selection. */\n readonly selectedKeys: Readable<ReadonlySet<string>>;\n /** All rows whose keys are in `selectedKeys`. Reactive signal. */\n readonly selectedRows: Readable<T[]>;\n /** Set the selection to an explicit set of keys. */\n setSelection(keys: Set<string>): void;\n /** Sort by the given column key — cycles asc → desc → none. */\n sortBy(key: string): void;\n /** Current sort state. Reactive signal. */\n readonly sortState: Readable<SortState>;\n /** Set sort to an explicit key and direction. Passing `'none'` clears the sort. */\n sortTo(key: string, direction: SortDirection): void;\n /** Toggle selection for a single row. */\n toggleRow(key: string): void;\n /** Total item count across all pages. Reactive signal. */\n readonly totalItems: Readable<number>;\n};\n\n// ── Implementation ─────────────────────────────────────────────────────────────\n\n/**\n * Headless datagrid control — sorting, pagination, and row selection.\n *\n * Composed from three focused primitives:\n * - `createSortControl` — client-side sorting with a cycle (asc → desc → none)\n * - `createPaginatedList` — reactive pagination over the sorted items\n * - `createSelectionControl` — single/multi/none row selection\n *\n * All mutable state is exposed as reactive `Reactive` values so\n * consumers can bind directly in templates without manual invalidation.\n *\n * @example\n * ```ts\n * const rows = signal(myItems);\n * const ctrl = createDataGridControl({\n * columns: () => myColumns,\n * items: rows,\n * getRowKey: (item) => item.id,\n * selectionMode: () => 'multi',\n * pageSize: () => 20,\n * signal: lifecycleSignal(onCleanup),\n * });\n * ```\n */\nexport const createDataGridControl = <T = Record<string, unknown>>(\n options: DataGridControlOptions<T>,\n): DataGridControl<T> => {\n // ── Sort ──────────────────────────────────────────────────────────────────\n const sort = createSortControl<T>({\n columns: options.columns,\n items: options.items,\n onSortChange: options.onSortChange,\n });\n\n // ── Pagination ────────────────────────────────────────────────────────────\n // pageSize 0 means \"disabled\" — pass Number.MAX_SAFE_INTEGER so all items fit on one page.\n const _pageSize = computed(() => {\n const ps = options.pageSize();\n\n return ps <= 0 ? Number.MAX_SAFE_INTEGER : ps;\n });\n\n const pagination = createPaginatedList({\n getItems: () => sort.sortedItems.value,\n pageSize: _pageSize,\n });\n\n const totalItems = computed(() => sort.sortedItems.value.length);\n\n // When pageSize is 0 (disabled), bypass pagination and show all items.\n const currentPageItems = computed<T[]>(() =>\n options.pageSize() <= 0 ? sort.sortedItems.value : pagination.pageItems.value,\n );\n\n // Reset to page 0 whenever sort changes.\n const _sortByAndReset = (key: string): void => {\n sort.sortBy(key);\n pagination.reset();\n };\n\n const _sortToAndReset = (key: string, direction: SortDirection): void => {\n sort.sortTo(key, direction);\n pagination.reset();\n };\n\n // ── Selection ─────────────────────────────────────────────────────────────\n const selection = createSelectionControl<T>({\n getRowKey: options.getRowKey,\n onSelectionChange: options.onSelectionChange,\n pageItems: () => pagination.pageItems.value,\n selectionMode: options.selectionMode,\n });\n\n const selectedRows = computed<T[]>(() =>\n options.items.value.filter((item) => selection.selectedKeys.value.has(options.getRowKey(item))),\n );\n\n return {\n clearSelection: selection.clearSelection,\n currentPageItems,\n goToPage: (index: number) => {\n if (!Number.isFinite(index)) return;\n\n pagination.goTo(Math.max(0, index));\n },\n hasNextPage: pagination.hasNext,\n hasPrevPage: pagination.hasPrev,\n isAllSelected: selection.isAllSelected,\n isSelected: selection.isSelected,\n nextPage: pagination.next,\n pageCount: pagination.pageCount,\n pageIndex: pagination.pageIndex,\n prevPage: pagination.prev,\n selectAll: selection.selectAll,\n selectedKeys: selection.selectedKeys,\n selectedRows,\n setSelection: selection.setSelection,\n sortBy: _sortByAndReset,\n sortState: sort.sortState,\n sortTo: _sortToAndReset,\n toggleRow: selection.toggleRow,\n totalItems,\n };\n};\n"],"mappings":"+IA2KA,IAAa,EACX,GACuB,CAEvB,IAAM,EAAO,EAAA,kBAAqB,CAChC,QAAS,EAAQ,QACjB,MAAO,EAAQ,MACf,aAAc,EAAQ,YACxB,CAAC,EAUK,EAAa,EAAA,oBAAoB,CACrC,aAAgB,EAAK,YAAY,MACjC,UAAA,EAAA,EAAA,SAAA,KAR+B,CAC/B,IAAM,EAAK,EAAQ,SAAS,EAE5B,OAAO,GAAM,UAA8B,CAC7C,CAIY,CACZ,CAAC,EAEK,GAAA,EAAA,EAAA,SAAA,KAA4B,EAAK,YAAY,MAAM,MAAM,EAGzD,GAAA,EAAA,EAAA,SAAA,KACJ,EAAQ,SAAS,GAAK,EAAI,EAAK,YAAY,MAAQ,EAAW,UAAU,KAC1E,EAGM,EAAmB,GAAsB,CAC7C,EAAK,OAAO,CAAG,EACf,EAAW,MAAM,CACnB,EAEM,GAAmB,EAAa,IAAmC,CACvE,EAAK,OAAO,EAAK,CAAS,EAC1B,EAAW,MAAM,CACnB,EAGM,EAAY,EAAA,uBAA0B,CAC1C,UAAW,EAAQ,UACnB,kBAAmB,EAAQ,kBAC3B,cAAiB,EAAW,UAAU,MACtC,cAAe,EAAQ,aACzB,CAAC,EAEK,GAAA,EAAA,EAAA,SAAA,KACJ,EAAQ,MAAM,MAAM,OAAQ,GAAS,EAAU,aAAa,MAAM,IAAI,EAAQ,UAAU,CAAI,CAAC,CAAC,CAChG,EAEA,MAAO,CACL,eAAgB,EAAU,eAC1B,mBACA,SAAW,GAAkB,CACtB,OAAO,SAAS,CAAK,GAE1B,EAAW,KAAK,KAAK,IAAI,EAAG,CAAK,CAAC,CACpC,EACA,YAAa,EAAW,QACxB,YAAa,EAAW,QACxB,cAAe,EAAU,cACzB,WAAY,EAAU,WACtB,SAAU,EAAW,KACrB,UAAW,EAAW,UACtB,UAAW,EAAW,UACtB,SAAU,EAAW,KACrB,UAAW,EAAU,UACrB,aAAc,EAAU,aACxB,eACA,aAAc,EAAU,aACxB,OAAQ,EACR,UAAW,EAAK,UAChB,OAAQ,EACR,UAAW,EAAU,UACrB,YACF,CACF"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { type Readable } from '@vielzeug/ripple';
|
|
2
|
+
/** Sort direction for a column. */
|
|
3
|
+
export type SortDirection = 'asc' | 'desc' | 'none';
|
|
4
|
+
/** Per-column sort state. */
|
|
5
|
+
export type SortState = {
|
|
6
|
+
/** Current sort direction. */
|
|
7
|
+
direction: SortDirection;
|
|
8
|
+
/** The column key being sorted. Empty string when unsorted. */
|
|
9
|
+
key: string;
|
|
10
|
+
};
|
|
11
|
+
/** Column definition for the datagrid. */
|
|
12
|
+
export type DataGridColumn<T = Record<string, unknown>> = {
|
|
13
|
+
/** Text alignment for the column: `'left'` | `'center'` | `'right'`. Defaults to `'left'`. */
|
|
14
|
+
align?: 'left' | 'center' | 'right';
|
|
15
|
+
/**
|
|
16
|
+
* Custom cell renderer. Receives the row item and returns a string.
|
|
17
|
+
* Use for formatted values (e.g. dates, currency, booleans).
|
|
18
|
+
*/
|
|
19
|
+
cell?: (item: T) => string;
|
|
20
|
+
/** Accessible label for the column header. Defaults to `label`. */
|
|
21
|
+
headerLabel?: string;
|
|
22
|
+
/** Column key — must match a property of the row object. */
|
|
23
|
+
key: string;
|
|
24
|
+
/** Display label for the column header. */
|
|
25
|
+
label: string;
|
|
26
|
+
/**
|
|
27
|
+
* Renders the expanded detail panel for a row. When provided on any column,
|
|
28
|
+
* `<ore-datagrid expandable>` shows a toggle button in each row.
|
|
29
|
+
* Receives the full row item and returns an HTML string.
|
|
30
|
+
*
|
|
31
|
+
* @security The returned string is inserted via ore's `raw()` directive — it participates
|
|
32
|
+
* in any sanitizer registered with `setRawSanitizer()`, but if none is registered it is
|
|
33
|
+
* inserted as-is. If any part of the returned markup is derived from untrusted data
|
|
34
|
+
* (row/user content), sanitize it yourself before returning (e.g. with DOMPurify).
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```js
|
|
38
|
+
* import DOMPurify from 'dompurify';
|
|
39
|
+
*
|
|
40
|
+
* grid.columns = [{
|
|
41
|
+
* key: 'name', label: 'Name',
|
|
42
|
+
* renderExpanded: (row) => DOMPurify.sanitize(`<div class="detail"><b>${row.name}</b>: ${row.bio}</div>`),
|
|
43
|
+
* }];
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
renderExpanded?: (item: T) => string;
|
|
47
|
+
/** Whether the column can be resized via a drag handle. Defaults to `false`. */
|
|
48
|
+
resizable?: boolean;
|
|
49
|
+
/** Whether the column is sortable. Defaults to `false`. */
|
|
50
|
+
sortable?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Custom sort key extractor for client-side sorting.
|
|
53
|
+
* Return a `number` or `string` for comparison.
|
|
54
|
+
* When omitted, the column's `key` property is used as a plain property lookup.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* { key: 'createdAt', label: 'Date', sortValue: (row) => new Date(row.createdAt).getTime() }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
sortValue?: (item: T) => number | string;
|
|
62
|
+
/** Column width (any valid CSS width value, e.g. `'12rem'`). */
|
|
63
|
+
width?: string;
|
|
64
|
+
};
|
|
65
|
+
/** Row selection mode. */
|
|
66
|
+
export type SelectionMode = 'multi' | 'none' | 'single';
|
|
67
|
+
export type DataGridControlOptions<T = Record<string, unknown>> = {
|
|
68
|
+
/** Returns the current column definitions reactively. */
|
|
69
|
+
columns: () => DataGridColumn<T>[];
|
|
70
|
+
/** Returns a unique string key for each row item. */
|
|
71
|
+
getRowKey: (item: T) => string;
|
|
72
|
+
/**
|
|
73
|
+
* Reactive signal of the current row items.
|
|
74
|
+
*
|
|
75
|
+
* For server-side sorting, pass a signal whose value is the pre-sorted result
|
|
76
|
+
* from your server. For client-side sorting, pass a plain signal wrapping your
|
|
77
|
+
* full dataset — the control will sort it automatically via `sortBy()`.
|
|
78
|
+
*/
|
|
79
|
+
items: Readable<T[]>;
|
|
80
|
+
/** Called when selection changes. Receives the full set of selected keys. */
|
|
81
|
+
onSelectionChange?: (keys: Set<string>) => void;
|
|
82
|
+
/** Called when sort state changes. */
|
|
83
|
+
onSortChange?: (sort: SortState) => void;
|
|
84
|
+
/** Returns the current page size reactively. Use `0` to disable pagination. */
|
|
85
|
+
pageSize: () => number;
|
|
86
|
+
/** Returns the current selection mode reactively. */
|
|
87
|
+
selectionMode: () => SelectionMode;
|
|
88
|
+
/** `AbortSignal` from the component lifecycle. */
|
|
89
|
+
signal: AbortSignal;
|
|
90
|
+
};
|
|
91
|
+
export type DataGridControl<T = Record<string, unknown>> = {
|
|
92
|
+
/** Deselect all rows. */
|
|
93
|
+
clearSelection(): void;
|
|
94
|
+
/** Current page items (sorted + paginated). Reactive signal. */
|
|
95
|
+
readonly currentPageItems: Readable<T[]>;
|
|
96
|
+
/** Go to an absolute page index. The index is clamped to the valid page range `[0, pageCount - 1]`. */
|
|
97
|
+
goToPage(index: number): void;
|
|
98
|
+
/** Whether there is a next page. Reactive signal. */
|
|
99
|
+
readonly hasNextPage: Readable<boolean>;
|
|
100
|
+
/** Whether there is a previous page. Reactive signal. */
|
|
101
|
+
readonly hasPrevPage: Readable<boolean>;
|
|
102
|
+
/** Whether all current-page rows are selected. */
|
|
103
|
+
isAllSelected(): boolean;
|
|
104
|
+
/** Whether a given row key is selected. */
|
|
105
|
+
isSelected(key: string): boolean;
|
|
106
|
+
/** Navigate to the next page. */
|
|
107
|
+
nextPage(): void;
|
|
108
|
+
/** Total page count. Reactive signal. */
|
|
109
|
+
readonly pageCount: Readable<number>;
|
|
110
|
+
/** Current 0-based page index. Reactive signal. */
|
|
111
|
+
readonly pageIndex: Readable<number>;
|
|
112
|
+
/** Navigate to the previous page. */
|
|
113
|
+
prevPage(): void;
|
|
114
|
+
/** Select all rows on the current page. */
|
|
115
|
+
selectAll(): void;
|
|
116
|
+
/** Current selected row keys. Reactive signal. Returns a snapshot copy — mutating the returned set has no effect on reactive state; use `toggleRow`, `selectAll`, `setSelection`, or `clearSelection` to update selection. */
|
|
117
|
+
readonly selectedKeys: Readable<ReadonlySet<string>>;
|
|
118
|
+
/** All rows whose keys are in `selectedKeys`. Reactive signal. */
|
|
119
|
+
readonly selectedRows: Readable<T[]>;
|
|
120
|
+
/** Set the selection to an explicit set of keys. */
|
|
121
|
+
setSelection(keys: Set<string>): void;
|
|
122
|
+
/** Sort by the given column key — cycles asc → desc → none. */
|
|
123
|
+
sortBy(key: string): void;
|
|
124
|
+
/** Current sort state. Reactive signal. */
|
|
125
|
+
readonly sortState: Readable<SortState>;
|
|
126
|
+
/** Set sort to an explicit key and direction. Passing `'none'` clears the sort. */
|
|
127
|
+
sortTo(key: string, direction: SortDirection): void;
|
|
128
|
+
/** Toggle selection for a single row. */
|
|
129
|
+
toggleRow(key: string): void;
|
|
130
|
+
/** Total item count across all pages. Reactive signal. */
|
|
131
|
+
readonly totalItems: Readable<number>;
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* Headless datagrid control — sorting, pagination, and row selection.
|
|
135
|
+
*
|
|
136
|
+
* Composed from three focused primitives:
|
|
137
|
+
* - `createSortControl` — client-side sorting with a cycle (asc → desc → none)
|
|
138
|
+
* - `createPaginatedList` — reactive pagination over the sorted items
|
|
139
|
+
* - `createSelectionControl` — single/multi/none row selection
|
|
140
|
+
*
|
|
141
|
+
* All mutable state is exposed as reactive `Reactive` values so
|
|
142
|
+
* consumers can bind directly in templates without manual invalidation.
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* ```ts
|
|
146
|
+
* const rows = signal(myItems);
|
|
147
|
+
* const ctrl = createDataGridControl({
|
|
148
|
+
* columns: () => myColumns,
|
|
149
|
+
* items: rows,
|
|
150
|
+
* getRowKey: (item) => item.id,
|
|
151
|
+
* selectionMode: () => 'multi',
|
|
152
|
+
* pageSize: () => 20,
|
|
153
|
+
* signal: lifecycleSignal(onCleanup),
|
|
154
|
+
* });
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
export declare const createDataGridControl: <T = Record<string, unknown>>(options: DataGridControlOptions<T>) => DataGridControl<T>;
|
|
158
|
+
//# sourceMappingURL=datagrid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datagrid.d.ts","sourceRoot":"","sources":["../../src/headless/datagrid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAQ3D,mCAAmC;AACnC,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpD,6BAA6B;AAC7B,MAAM,MAAM,SAAS,GAAG;IACtB,8BAA8B;IAC9B,SAAS,EAAE,aAAa,CAAC;IACzB,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,0CAA0C;AAC1C,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IACxD,8FAA8F;IAC9F,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC;;;OAGG;IACH,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAC3B,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;;;;;;;;;;;OAmBG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IACrC,gFAAgF;IAChF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,CAAC;IACzC,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,0BAA0B;AAC1B,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAExD,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IAChE,yDAAyD;IACzD,OAAO,EAAE,MAAM,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IACnC,qDAAqD;IACrD,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAC/B;;;;;;OAMG;IACH,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IACrB,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAChD,sCAAsC;IACtC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,qDAAqD;IACrD,aAAa,EAAE,MAAM,aAAa,CAAC;IACnC,kDAAkD;IAClD,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IACzD,yBAAyB;IACzB,cAAc,IAAI,IAAI,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IACzC,uGAAuG;IACvG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxC,yDAAyD;IACzD,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxC,kDAAkD;IAClD,aAAa,IAAI,OAAO,CAAC;IACzB,2CAA2C;IAC3C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,iCAAiC;IACjC,QAAQ,IAAI,IAAI,CAAC;IACjB,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrC,mDAAmD;IACnD,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrC,qCAAqC;IACrC,QAAQ,IAAI,IAAI,CAAC;IACjB,2CAA2C;IAC3C,SAAS,IAAI,IAAI,CAAC;IAClB,8NAA8N;IAC9N,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,kEAAkE;IAClE,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IACrC,oDAAoD;IACpD,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACtC,+DAA+D;IAC/D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IACxC,mFAAmF;IACnF,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IACpD,yCAAyC;IACzC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACvC,CAAC;AAIF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,qBAAqB,GAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,SAAS,sBAAsB,CAAC,CAAC,CAAC,KACjC,eAAe,CAAC,CAAC,CA6EnB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { createPaginatedList as e } from "./paginated-list.js";
|
|
2
|
+
import { createSelectionControl as t } from "./selection-control.js";
|
|
3
|
+
import { createSortControl as n } from "./sort-control.js";
|
|
4
|
+
import { computed as r } from "@vielzeug/ripple";
|
|
5
|
+
//#region src/headless/datagrid.ts
|
|
6
|
+
var i = (i) => {
|
|
7
|
+
let a = n({
|
|
8
|
+
columns: i.columns,
|
|
9
|
+
items: i.items,
|
|
10
|
+
onSortChange: i.onSortChange
|
|
11
|
+
}), o = e({
|
|
12
|
+
getItems: () => a.sortedItems.value,
|
|
13
|
+
pageSize: r(() => {
|
|
14
|
+
let e = i.pageSize();
|
|
15
|
+
return e <= 0 ? 2 ** 53 - 1 : e;
|
|
16
|
+
})
|
|
17
|
+
}), s = r(() => a.sortedItems.value.length), c = r(() => i.pageSize() <= 0 ? a.sortedItems.value : o.pageItems.value), l = (e) => {
|
|
18
|
+
a.sortBy(e), o.reset();
|
|
19
|
+
}, u = (e, t) => {
|
|
20
|
+
a.sortTo(e, t), o.reset();
|
|
21
|
+
}, d = t({
|
|
22
|
+
getRowKey: i.getRowKey,
|
|
23
|
+
onSelectionChange: i.onSelectionChange,
|
|
24
|
+
pageItems: () => o.pageItems.value,
|
|
25
|
+
selectionMode: i.selectionMode
|
|
26
|
+
}), f = r(() => i.items.value.filter((e) => d.selectedKeys.value.has(i.getRowKey(e))));
|
|
27
|
+
return {
|
|
28
|
+
clearSelection: d.clearSelection,
|
|
29
|
+
currentPageItems: c,
|
|
30
|
+
goToPage: (e) => {
|
|
31
|
+
Number.isFinite(e) && o.goTo(Math.max(0, e));
|
|
32
|
+
},
|
|
33
|
+
hasNextPage: o.hasNext,
|
|
34
|
+
hasPrevPage: o.hasPrev,
|
|
35
|
+
isAllSelected: d.isAllSelected,
|
|
36
|
+
isSelected: d.isSelected,
|
|
37
|
+
nextPage: o.next,
|
|
38
|
+
pageCount: o.pageCount,
|
|
39
|
+
pageIndex: o.pageIndex,
|
|
40
|
+
prevPage: o.prev,
|
|
41
|
+
selectAll: d.selectAll,
|
|
42
|
+
selectedKeys: d.selectedKeys,
|
|
43
|
+
selectedRows: f,
|
|
44
|
+
setSelection: d.setSelection,
|
|
45
|
+
sortBy: l,
|
|
46
|
+
sortState: a.sortState,
|
|
47
|
+
sortTo: u,
|
|
48
|
+
toggleRow: d.toggleRow,
|
|
49
|
+
totalItems: s
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
//#endregion
|
|
53
|
+
export { i as createDataGridControl };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=datagrid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datagrid.js","names":[],"sources":["../../src/headless/datagrid.ts"],"sourcesContent":["import { computed, type Readable } from '@vielzeug/ripple';\n\nimport { createPaginatedList } from './paginated-list';\nimport { createSelectionControl } from './selection-control';\nimport { createSortControl } from './sort-control';\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\n/** Sort direction for a column. */\nexport type SortDirection = 'asc' | 'desc' | 'none';\n\n/** Per-column sort state. */\nexport type SortState = {\n /** Current sort direction. */\n direction: SortDirection;\n /** The column key being sorted. Empty string when unsorted. */\n key: string;\n};\n\n/** Column definition for the datagrid. */\nexport type DataGridColumn<T = Record<string, unknown>> = {\n /** Text alignment for the column: `'left'` | `'center'` | `'right'`. Defaults to `'left'`. */\n align?: 'left' | 'center' | 'right';\n /**\n * Custom cell renderer. Receives the row item and returns a string.\n * Use for formatted values (e.g. dates, currency, booleans).\n */\n cell?: (item: T) => string;\n /** Accessible label for the column header. Defaults to `label`. */\n headerLabel?: string;\n /** Column key — must match a property of the row object. */\n key: string;\n /** Display label for the column header. */\n label: string;\n /**\n * Renders the expanded detail panel for a row. When provided on any column,\n * `<ore-datagrid expandable>` shows a toggle button in each row.\n * Receives the full row item and returns an HTML string.\n *\n * @security The returned string is inserted via ore's `raw()` directive — it participates\n * in any sanitizer registered with `setRawSanitizer()`, but if none is registered it is\n * inserted as-is. If any part of the returned markup is derived from untrusted data\n * (row/user content), sanitize it yourself before returning (e.g. with DOMPurify).\n *\n * @example\n * ```js\n * import DOMPurify from 'dompurify';\n *\n * grid.columns = [{\n * key: 'name', label: 'Name',\n * renderExpanded: (row) => DOMPurify.sanitize(`<div class=\"detail\"><b>${row.name}</b>: ${row.bio}</div>`),\n * }];\n * ```\n */\n renderExpanded?: (item: T) => string;\n /** Whether the column can be resized via a drag handle. Defaults to `false`. */\n resizable?: boolean;\n /** Whether the column is sortable. Defaults to `false`. */\n sortable?: boolean;\n /**\n * Custom sort key extractor for client-side sorting.\n * Return a `number` or `string` for comparison.\n * When omitted, the column's `key` property is used as a plain property lookup.\n *\n * @example\n * ```ts\n * { key: 'createdAt', label: 'Date', sortValue: (row) => new Date(row.createdAt).getTime() }\n * ```\n */\n sortValue?: (item: T) => number | string;\n /** Column width (any valid CSS width value, e.g. `'12rem'`). */\n width?: string;\n};\n\n/** Row selection mode. */\nexport type SelectionMode = 'multi' | 'none' | 'single';\n\nexport type DataGridControlOptions<T = Record<string, unknown>> = {\n /** Returns the current column definitions reactively. */\n columns: () => DataGridColumn<T>[];\n /** Returns a unique string key for each row item. */\n getRowKey: (item: T) => string;\n /**\n * Reactive signal of the current row items.\n *\n * For server-side sorting, pass a signal whose value is the pre-sorted result\n * from your server. For client-side sorting, pass a plain signal wrapping your\n * full dataset — the control will sort it automatically via `sortBy()`.\n */\n items: Readable<T[]>;\n /** Called when selection changes. Receives the full set of selected keys. */\n onSelectionChange?: (keys: Set<string>) => void;\n /** Called when sort state changes. */\n onSortChange?: (sort: SortState) => void;\n /** Returns the current page size reactively. Use `0` to disable pagination. */\n pageSize: () => number;\n /** Returns the current selection mode reactively. */\n selectionMode: () => SelectionMode;\n /** `AbortSignal` from the component lifecycle. */\n signal: AbortSignal;\n};\n\nexport type DataGridControl<T = Record<string, unknown>> = {\n /** Deselect all rows. */\n clearSelection(): void;\n /** Current page items (sorted + paginated). Reactive signal. */\n readonly currentPageItems: Readable<T[]>;\n /** Go to an absolute page index. The index is clamped to the valid page range `[0, pageCount - 1]`. */\n goToPage(index: number): void;\n /** Whether there is a next page. Reactive signal. */\n readonly hasNextPage: Readable<boolean>;\n /** Whether there is a previous page. Reactive signal. */\n readonly hasPrevPage: Readable<boolean>;\n /** Whether all current-page rows are selected. */\n isAllSelected(): boolean;\n /** Whether a given row key is selected. */\n isSelected(key: string): boolean;\n /** Navigate to the next page. */\n nextPage(): void;\n /** Total page count. Reactive signal. */\n readonly pageCount: Readable<number>;\n /** Current 0-based page index. Reactive signal. */\n readonly pageIndex: Readable<number>;\n /** Navigate to the previous page. */\n prevPage(): void;\n /** Select all rows on the current page. */\n selectAll(): void;\n /** Current selected row keys. Reactive signal. Returns a snapshot copy — mutating the returned set has no effect on reactive state; use `toggleRow`, `selectAll`, `setSelection`, or `clearSelection` to update selection. */\n readonly selectedKeys: Readable<ReadonlySet<string>>;\n /** All rows whose keys are in `selectedKeys`. Reactive signal. */\n readonly selectedRows: Readable<T[]>;\n /** Set the selection to an explicit set of keys. */\n setSelection(keys: Set<string>): void;\n /** Sort by the given column key — cycles asc → desc → none. */\n sortBy(key: string): void;\n /** Current sort state. Reactive signal. */\n readonly sortState: Readable<SortState>;\n /** Set sort to an explicit key and direction. Passing `'none'` clears the sort. */\n sortTo(key: string, direction: SortDirection): void;\n /** Toggle selection for a single row. */\n toggleRow(key: string): void;\n /** Total item count across all pages. Reactive signal. */\n readonly totalItems: Readable<number>;\n};\n\n// ── Implementation ─────────────────────────────────────────────────────────────\n\n/**\n * Headless datagrid control — sorting, pagination, and row selection.\n *\n * Composed from three focused primitives:\n * - `createSortControl` — client-side sorting with a cycle (asc → desc → none)\n * - `createPaginatedList` — reactive pagination over the sorted items\n * - `createSelectionControl` — single/multi/none row selection\n *\n * All mutable state is exposed as reactive `Reactive` values so\n * consumers can bind directly in templates without manual invalidation.\n *\n * @example\n * ```ts\n * const rows = signal(myItems);\n * const ctrl = createDataGridControl({\n * columns: () => myColumns,\n * items: rows,\n * getRowKey: (item) => item.id,\n * selectionMode: () => 'multi',\n * pageSize: () => 20,\n * signal: lifecycleSignal(onCleanup),\n * });\n * ```\n */\nexport const createDataGridControl = <T = Record<string, unknown>>(\n options: DataGridControlOptions<T>,\n): DataGridControl<T> => {\n // ── Sort ──────────────────────────────────────────────────────────────────\n const sort = createSortControl<T>({\n columns: options.columns,\n items: options.items,\n onSortChange: options.onSortChange,\n });\n\n // ── Pagination ────────────────────────────────────────────────────────────\n // pageSize 0 means \"disabled\" — pass Number.MAX_SAFE_INTEGER so all items fit on one page.\n const _pageSize = computed(() => {\n const ps = options.pageSize();\n\n return ps <= 0 ? Number.MAX_SAFE_INTEGER : ps;\n });\n\n const pagination = createPaginatedList({\n getItems: () => sort.sortedItems.value,\n pageSize: _pageSize,\n });\n\n const totalItems = computed(() => sort.sortedItems.value.length);\n\n // When pageSize is 0 (disabled), bypass pagination and show all items.\n const currentPageItems = computed<T[]>(() =>\n options.pageSize() <= 0 ? sort.sortedItems.value : pagination.pageItems.value,\n );\n\n // Reset to page 0 whenever sort changes.\n const _sortByAndReset = (key: string): void => {\n sort.sortBy(key);\n pagination.reset();\n };\n\n const _sortToAndReset = (key: string, direction: SortDirection): void => {\n sort.sortTo(key, direction);\n pagination.reset();\n };\n\n // ── Selection ─────────────────────────────────────────────────────────────\n const selection = createSelectionControl<T>({\n getRowKey: options.getRowKey,\n onSelectionChange: options.onSelectionChange,\n pageItems: () => pagination.pageItems.value,\n selectionMode: options.selectionMode,\n });\n\n const selectedRows = computed<T[]>(() =>\n options.items.value.filter((item) => selection.selectedKeys.value.has(options.getRowKey(item))),\n );\n\n return {\n clearSelection: selection.clearSelection,\n currentPageItems,\n goToPage: (index: number) => {\n if (!Number.isFinite(index)) return;\n\n pagination.goTo(Math.max(0, index));\n },\n hasNextPage: pagination.hasNext,\n hasPrevPage: pagination.hasPrev,\n isAllSelected: selection.isAllSelected,\n isSelected: selection.isSelected,\n nextPage: pagination.next,\n pageCount: pagination.pageCount,\n pageIndex: pagination.pageIndex,\n prevPage: pagination.prev,\n selectAll: selection.selectAll,\n selectedKeys: selection.selectedKeys,\n selectedRows,\n setSelection: selection.setSelection,\n sortBy: _sortByAndReset,\n sortState: sort.sortState,\n sortTo: _sortToAndReset,\n toggleRow: selection.toggleRow,\n totalItems,\n };\n};\n"],"mappings":";;;;;AA2KA,IAAa,KACX,MACuB;CAEvB,IAAM,IAAO,EAAqB;EAChC,SAAS,EAAQ;EACjB,OAAO,EAAQ;EACf,cAAc,EAAQ;CACxB,CAAC,GAUK,IAAa,EAAoB;EACrC,gBAAgB,EAAK,YAAY;EACjC,UARgB,QAAe;GAC/B,IAAM,IAAK,EAAQ,SAAS;GAE5B,OAAO,KAAM,kBAA8B;EAC7C,CAIY;CACZ,CAAC,GAEK,IAAa,QAAe,EAAK,YAAY,MAAM,MAAM,GAGzD,IAAmB,QACvB,EAAQ,SAAS,KAAK,IAAI,EAAK,YAAY,QAAQ,EAAW,UAAU,KAC1E,GAGM,KAAmB,MAAsB;EAE7C,AADA,EAAK,OAAO,CAAG,GACf,EAAW,MAAM;CACnB,GAEM,KAAmB,GAAa,MAAmC;EAEvE,AADA,EAAK,OAAO,GAAK,CAAS,GAC1B,EAAW,MAAM;CACnB,GAGM,IAAY,EAA0B;EAC1C,WAAW,EAAQ;EACnB,mBAAmB,EAAQ;EAC3B,iBAAiB,EAAW,UAAU;EACtC,eAAe,EAAQ;CACzB,CAAC,GAEK,IAAe,QACnB,EAAQ,MAAM,MAAM,QAAQ,MAAS,EAAU,aAAa,MAAM,IAAI,EAAQ,UAAU,CAAI,CAAC,CAAC,CAChG;CAEA,OAAO;EACL,gBAAgB,EAAU;EAC1B;EACA,WAAW,MAAkB;GACtB,OAAO,SAAS,CAAK,KAE1B,EAAW,KAAK,KAAK,IAAI,GAAG,CAAK,CAAC;EACpC;EACA,aAAa,EAAW;EACxB,aAAa,EAAW;EACxB,eAAe,EAAU;EACzB,YAAY,EAAU;EACtB,UAAU,EAAW;EACrB,WAAW,EAAW;EACtB,WAAW,EAAW;EACtB,UAAU,EAAW;EACrB,WAAW,EAAU;EACrB,cAAc,EAAU;EACxB;EACA,cAAc,EAAU;EACxB,QAAQ;EACR,WAAW,EAAK;EAChB,QAAQ;EACR,WAAW,EAAU;EACrB;CACF;AACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
let e=require("@vielzeug/tempo");function t(t){if(!t)return null;try{return(0,e.parsePlainDate)(t)}catch{return null}}function n(e){return e?e.toString():null}function r(t,n){return(0,e.format)(t,{intl:{day:`numeric`,month:`short`,year:`numeric`},locale:n,tz:`UTC`})}function i(){return e.Temporal.Now.plainDateISO()}function a(e){return e%7}function o(t){let n=t.value??null,r=`day`,o=n??i(),s=o.year,c=o.month;function l(){return t.locale??(typeof navigator<`u`?navigator.language:`en`)}function u(){return t.weekendDays??[]}function d(n){return!!(t.min&&e.Temporal.PlainDate.compare(n,t.min)<0||t.max&&e.Temporal.PlainDate.compare(n,t.max)>0)}function f(e){return!!(d(e)||u().includes(a(e.dayOfWeek)))}function p(){let t=i(),r=e.Temporal.PlainDate.from({day:1,month:c,year:s}),o=a(r.dayOfWeek),l=[];for(let i=o-1;i>=0;i--){let a=r.subtract({days:i+1});l.push({day:a.day,isDisabled:f(a),iso:a.toString(),isOutsideMonth:!0,isSelected:n!==null&&e.Temporal.PlainDate.compare(a,n)===0,isToday:e.Temporal.PlainDate.compare(a,t)===0,plain:a})}let u=r.daysInMonth;for(let r=1;r<=u;r++){let i=e.Temporal.PlainDate.from({day:r,month:c,year:s});l.push({day:r,isDisabled:f(i),iso:i.toString(),isOutsideMonth:!1,isSelected:n!==null&&e.Temporal.PlainDate.compare(i,n)===0,isToday:e.Temporal.PlainDate.compare(i,t)===0,plain:i})}let d=(7-l.length%7)%7,p=r.add({months:1});for(let r=0;r<d;r++){let i=p.add({days:r});l.push({day:i.day,isDisabled:f(i),iso:i.toString(),isOutsideMonth:!0,isSelected:n!==null&&e.Temporal.PlainDate.compare(i,n)===0,isToday:e.Temporal.PlainDate.compare(i,t)===0,plain:i})}return l}function m(){let r=[],i=l();for(let a=1;a<=12;a++){let o=e.Temporal.PlainDate.from({day:1,month:a,year:s}),c=o.with({day:o.daysInMonth}),l=(t.min!==null&&t.min!==void 0?e.Temporal.PlainDate.compare(c,t.min)<0:!1)||(t.max!==null&&t.max!==void 0?e.Temporal.PlainDate.compare(o,t.max)>0:!1);r.push({isDisabled:l,isSelected:n!==null&&n.year===s&&n.month===a,label:(0,e.format)(o,{intl:{month:`long`},locale:i,tz:`UTC`}),month:a,shortLabel:(0,e.format)(o,{intl:{month:`short`},locale:i,tz:`UTC`})})}return r}function h(){let r=Math.floor(s/10)*10,i=[];for(let a=r;a<r+12;a++){let r=e.Temporal.PlainDate.from({day:1,month:1,year:a}),o=e.Temporal.PlainDate.from({day:31,month:12,year:a}),s=(t.min!==null&&t.min!==void 0?e.Temporal.PlainDate.compare(o,t.min)<0:!1)||(t.max!==null&&t.max!==void 0?e.Temporal.PlainDate.compare(r,t.max)>0:!1);i.push({isDisabled:s,isSelected:n!==null&&n.year===a,year:a})}return i}function g(){let t=(0,e.parsePlainDate)(`2024-01-07`),n=l();return Array.from({length:7},(r,i)=>(0,e.format)(t.add({days:i}),{intl:{weekday:`short`},locale:n,tz:`UTC`}))}return{dayCells:p,displayMonth:()=>c,displayYear:()=>s,goTo(e,t){Number.isFinite(e)&&(s=e,c=Math.max(1,Math.min(12,t)))},monthCells:m,nextMonth(){c===12?(c=1,s++):c++},nextYear(){s++},prevMonth(){c===1?(c=12,s--):c--},prevYear(){s--},select(e){e!==null&&f(e)||(n=e,n&&(s=n.year,c=n.month),t.onChange(n))},selected:()=>n,setView(e){r=e},view:()=>r,weekdayLabels:g,yearCells:h}}exports.createDatePickerControl=o,exports.formatDisplayDate=r,exports.parseIso=t,exports.toIsoString=n;
|
|
2
|
+
//# sourceMappingURL=date-picker.cjs.map
|