@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,148 @@
|
|
|
1
|
+
import { type Readable } from '@vielzeug/ripple';
|
|
2
|
+
export type ValidationTrigger = 'blur' | 'change' | 'input' | 'submit';
|
|
3
|
+
export type ControlValidationMode = ValidationTrigger | undefined;
|
|
4
|
+
/** Options shared by both `createTextField` and `createChoiceField`. */
|
|
5
|
+
export type FieldOptions = {
|
|
6
|
+
disabled?: Readable<boolean | undefined>;
|
|
7
|
+
error?: Readable<string | undefined>;
|
|
8
|
+
/**
|
|
9
|
+
* Returns the underlying form field object used for validation triggering.
|
|
10
|
+
* Called lazily — safe to return `null` before the first render.
|
|
11
|
+
*/
|
|
12
|
+
getFormField?: () => {
|
|
13
|
+
reportValidity(): void;
|
|
14
|
+
} | null;
|
|
15
|
+
/**
|
|
16
|
+
* Override for label visibility that takes precedence over deriving it from
|
|
17
|
+
* the `label` text signal. Pass a computed signal that checks both prop and
|
|
18
|
+
* slot presence to enable slot-first composition.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const hasLabel = computed(() => !!props.label.value || slots.has('label').value);
|
|
23
|
+
* const field = createField({ ...options, hasLabel });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
hasLabel?: Readable<boolean>;
|
|
27
|
+
helper?: Readable<string | undefined>;
|
|
28
|
+
/**
|
|
29
|
+
* When provided, used directly as `fieldId` instead of generating one via
|
|
30
|
+
* `createStableId`. Useful in tests for deterministic ID assertions.
|
|
31
|
+
*/
|
|
32
|
+
id?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Label text signal. When provided, `labelVisible` and `ariaLabelledBy` are
|
|
35
|
+
* computed reactively from this value (see `hasLabel` for the slot-first override).
|
|
36
|
+
*/
|
|
37
|
+
label?: Readable<string | undefined>;
|
|
38
|
+
/**
|
|
39
|
+
* Label placement signal. Defaults to `'inset'`.
|
|
40
|
+
*
|
|
41
|
+
* Not currently consumed by `createField()` itself — visibility is driven
|
|
42
|
+
* solely by `hasLabel`/`label`. Threaded through so component authors can
|
|
43
|
+
* apply placement-specific styling (`label-placement` attribute) without a
|
|
44
|
+
* second prop; if placement-dependent visibility is ever needed, wire it
|
|
45
|
+
* into `labelVisible$` in `createField()` instead of adding a new option.
|
|
46
|
+
*/
|
|
47
|
+
labelPlacement?: Readable<LabelPlacement>;
|
|
48
|
+
prefix?: string;
|
|
49
|
+
validateOn?: Readable<ControlValidationMode>;
|
|
50
|
+
};
|
|
51
|
+
export type ErrorHelperState = {
|
|
52
|
+
errorText: string;
|
|
53
|
+
helperText: string;
|
|
54
|
+
};
|
|
55
|
+
export type ErrorHelperOptions = {
|
|
56
|
+
error?: Readable<string | undefined>;
|
|
57
|
+
helper?: Readable<string | undefined>;
|
|
58
|
+
};
|
|
59
|
+
export declare const createErrorHelperState: (options: ErrorHelperOptions) => Readable<ErrorHelperState>;
|
|
60
|
+
/** Counter state for text fields with `maxLength`. */
|
|
61
|
+
export type CounterState = {
|
|
62
|
+
counterAtLimit: boolean;
|
|
63
|
+
counterNearLimit: boolean;
|
|
64
|
+
counterText: string;
|
|
65
|
+
};
|
|
66
|
+
export type CounterOptions = {
|
|
67
|
+
maxLength?: Readable<number | undefined>;
|
|
68
|
+
value: Readable<string | undefined>;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Creates a reactive counter state signal for text fields with `maxLength`.
|
|
72
|
+
* Only call this when `maxLength` may be set — the state is genuinely opt-in.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```ts
|
|
76
|
+
* const counter = createCounterState({ value: tf.value, maxLength: props.maxlength });
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export declare const createCounterState: (options: CounterOptions) => Readable<CounterState>;
|
|
80
|
+
export type LabelPlacement = 'inset' | 'outside' | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* Common handle returned by `createField` — the base for both `TextFieldHandle`
|
|
83
|
+
* and `ChoiceFieldHandle`.
|
|
84
|
+
*
|
|
85
|
+
* ARIA signals and label state are flat on the handle — no nested `aria` or
|
|
86
|
+
* `label` sub-objects.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```html
|
|
90
|
+
* <label id="${labelId}" ?hidden="${() => !labelVisible.value}">...</label>
|
|
91
|
+
* <input
|
|
92
|
+
* :aria-labelledby="${ariaLabelledBy}"
|
|
93
|
+
* :aria-describedby="${ariaDescribedBy}"
|
|
94
|
+
* :aria-invalid="${ariaInvalid}" />
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
/** Flat ARIA attribute bag ready to spread into a template bind call. */
|
|
98
|
+
export type AriaProps = {
|
|
99
|
+
'aria-describedby': string | null;
|
|
100
|
+
'aria-errormessage': string | null;
|
|
101
|
+
'aria-invalid': 'true' | null;
|
|
102
|
+
'aria-labelledby': string | null;
|
|
103
|
+
};
|
|
104
|
+
export type FieldHandle = {
|
|
105
|
+
/** `aria-describedby` value. Non-null when helper or error text is present. */
|
|
106
|
+
ariaDescribedBy: Readable<string | null>;
|
|
107
|
+
/** `aria-errormessage` value. Non-null when error text is present. */
|
|
108
|
+
ariaErrorMessage: Readable<string | null>;
|
|
109
|
+
/** `aria-invalid` value. `'true'` when error text is present, otherwise `null`. */
|
|
110
|
+
ariaInvalid: Readable<'true' | null>;
|
|
111
|
+
/** `aria-labelledby` value. Non-null when a label is visible. */
|
|
112
|
+
ariaLabelledBy: Readable<string | null>;
|
|
113
|
+
/**
|
|
114
|
+
* Returns a snapshot of the four ARIA attributes as a plain object.
|
|
115
|
+
* Spread into a template bind call to avoid repeating each signal individually.
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```ts
|
|
119
|
+
* bind(inputEl, { attr: field.ariaProps() });
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
ariaProps(): AriaProps;
|
|
123
|
+
/**
|
|
124
|
+
* The stable `id` used for `aria-describedby` on the input. Points at the
|
|
125
|
+
* assistive-text region (covers both helper text and error text per WAI-ARIA).
|
|
126
|
+
*/
|
|
127
|
+
assistiveId: string;
|
|
128
|
+
disabled: Readable<boolean>;
|
|
129
|
+
/** Stable `id` for the inline error message element (`aria-errormessage`). */
|
|
130
|
+
errorId: string;
|
|
131
|
+
/** Reactive error text. Empty string when no error is set. */
|
|
132
|
+
errorText: Readable<string>;
|
|
133
|
+
fieldId: string;
|
|
134
|
+
/** Reactive helper text. Empty string when no helper is set. */
|
|
135
|
+
helperText: Readable<string>;
|
|
136
|
+
/** Stable `id` for the label element. Stamp this on your `<label id="...">`. */
|
|
137
|
+
labelId: string;
|
|
138
|
+
/** Whether the label should be visible. Use to toggle `hidden` on the `<label>`. */
|
|
139
|
+
labelVisible: Readable<boolean>;
|
|
140
|
+
triggerValidation: (on: Extract<ValidationTrigger, 'blur' | 'change'>) => void;
|
|
141
|
+
};
|
|
142
|
+
/**
|
|
143
|
+
* Composes the field triad — IDs, assistive state, and label state — into a
|
|
144
|
+
* single `FieldHandle`. Both `createTextField` and `createChoiceField` build
|
|
145
|
+
* on top of this.
|
|
146
|
+
*/
|
|
147
|
+
export declare const createField: (options: FieldOptions) => FieldHandle;
|
|
148
|
+
//# sourceMappingURL=field-base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-base.d.ts","sourceRoot":"","sources":["../../src/headless/field-base.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI3D,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AACvE,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAIlE,wEAAwE;AACxE,MAAM,MAAM,YAAY,GAAG;IACzB,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;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACtC;;;OAGG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACrC;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC;CAC9C,CAAC;AAIF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACvC,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,SAAS,kBAAkB,KAAG,QAAQ,CAAC,gBAAgB,CAIzF,CAAC;AAIN,sDAAsD;AACtD,MAAM,MAAM,YAAY,GAAG;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,KAAK,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACrC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,cAAc,KAAG,QAAQ,CAAC,YAAY,CAe9E,CAAC;AAIL,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAI7D;;;;;;;;;;;;;;;GAeG;AACH,yEAAyE;AACzE,MAAM,MAAM,SAAS,GAAG;IACtB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,+EAA+E;IAC/E,eAAe,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,sEAAsE;IACtE,gBAAgB,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,mFAAmF;IACnF,WAAW,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrC,iEAAiE;IACjE,cAAc,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC;;;;;;;;OAQG;IACH,SAAS,IAAI,SAAS,CAAC;IACvB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC5B,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7B,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChC,iBAAiB,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,iBAAiB,EAAE,MAAM,GAAG,QAAQ,CAAC,KAAK,IAAI,CAAC;CAChF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,YAAY,KAAG,WAqDnD,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { createStableId as e } from "@vielzeug/ore";
|
|
2
|
+
import { computed as t } from "@vielzeug/ripple";
|
|
3
|
+
//#region src/headless/field-base.ts
|
|
4
|
+
var n = (e) => t(() => ({
|
|
5
|
+
errorText: e.error?.value ?? "",
|
|
6
|
+
helperText: e.helper?.value ?? ""
|
|
7
|
+
})), r = (e) => t(() => {
|
|
8
|
+
let t = e.value?.value ?? "", n = e.maxLength?.value, r = Number(n), i = Number.isFinite(r) && r > 0 ? r : null, a = i !== null, o = a ? `${t.length} / ${i}` : "", s = a ? t.length / i : 0;
|
|
9
|
+
return {
|
|
10
|
+
counterAtLimit: a ? s >= 1 : !1,
|
|
11
|
+
counterNearLimit: a ? s >= .9 && s < 1 : !1,
|
|
12
|
+
counterText: o
|
|
13
|
+
};
|
|
14
|
+
}), i = (r) => {
|
|
15
|
+
let i = t(() => !!r.disabled?.value), a = r.validateOn, o = r.id ?? e(r.prefix ?? "field"), s = e("helper"), c = (e) => {
|
|
16
|
+
a?.value === e && r.getFormField?.()?.reportValidity();
|
|
17
|
+
}, l = e("label"), u = e("error"), d = r.label ?? t(() => void 0), f = r.hasLabel ?? t(() => !!d.value), p = n({
|
|
18
|
+
error: r.error,
|
|
19
|
+
helper: r.helper
|
|
20
|
+
}), m = t(() => p.value.errorText || p.value.helperText ? s : null), h = t(() => p.value.errorText ? u : null), g = t(() => p.value.errorText ? "true" : null), _ = t(() => f.value ? l : null);
|
|
21
|
+
return {
|
|
22
|
+
ariaDescribedBy: m,
|
|
23
|
+
ariaErrorMessage: h,
|
|
24
|
+
ariaInvalid: g,
|
|
25
|
+
ariaLabelledBy: _,
|
|
26
|
+
ariaProps: () => ({
|
|
27
|
+
"aria-describedby": m.value,
|
|
28
|
+
"aria-errormessage": h.value,
|
|
29
|
+
"aria-invalid": g.value,
|
|
30
|
+
"aria-labelledby": _.value
|
|
31
|
+
}),
|
|
32
|
+
assistiveId: s,
|
|
33
|
+
disabled: i,
|
|
34
|
+
errorId: u,
|
|
35
|
+
errorText: t(() => p.value.errorText),
|
|
36
|
+
fieldId: o,
|
|
37
|
+
helperText: t(() => p.value.helperText),
|
|
38
|
+
labelId: l,
|
|
39
|
+
labelVisible: f,
|
|
40
|
+
triggerValidation: c
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
//#endregion
|
|
44
|
+
export { r as createCounterState, n as createErrorHelperState, i as createField };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=field-base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-base.js","names":[],"sources":["../../src/headless/field-base.ts"],"sourcesContent":["import { createStableId } from '@vielzeug/ore';\nimport { computed, type Readable } from '@vielzeug/ripple';\n\n// ── Validation / context types ────────────────────────────────────────────────\n\nexport type ValidationTrigger = 'blur' | 'change' | 'input' | 'submit';\nexport type ControlValidationMode = ValidationTrigger | undefined;\n\n// ── Field options + handle ───────────────────────────────────────────────────\n\n/** Options shared by both `createTextField` and `createChoiceField`. */\nexport type FieldOptions = {\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 /**\n * Override for label visibility that takes precedence over deriving it from\n * the `label` text signal. Pass a computed signal that checks both prop and\n * slot presence to enable slot-first composition.\n *\n * @example\n * ```ts\n * const hasLabel = computed(() => !!props.label.value || slots.has('label').value);\n * const field = createField({ ...options, hasLabel });\n * ```\n */\n hasLabel?: Readable<boolean>;\n helper?: Readable<string | undefined>;\n /**\n * When provided, used directly as `fieldId` instead of generating one via\n * `createStableId`. Useful in tests for deterministic ID assertions.\n */\n id?: string;\n /**\n * Label text signal. When provided, `labelVisible` and `ariaLabelledBy` are\n * computed reactively from this value (see `hasLabel` for the slot-first override).\n */\n label?: Readable<string | undefined>;\n /**\n * Label placement signal. Defaults to `'inset'`.\n *\n * Not currently consumed by `createField()` itself — visibility is driven\n * solely by `hasLabel`/`label`. Threaded through so component authors can\n * apply placement-specific styling (`label-placement` attribute) without a\n * second prop; if placement-dependent visibility is ever needed, wire it\n * into `labelVisible$` in `createField()` instead of adding a new option.\n */\n labelPlacement?: Readable<LabelPlacement>;\n prefix?: string;\n validateOn?: Readable<ControlValidationMode>;\n};\n\n// ── Error/helper assistive state ──────────────────────────────────────────────\n\nexport type ErrorHelperState = {\n errorText: string;\n helperText: string;\n};\n\nexport type ErrorHelperOptions = {\n error?: Readable<string | undefined>;\n helper?: Readable<string | undefined>;\n};\n\nexport const createErrorHelperState = (options: ErrorHelperOptions): Readable<ErrorHelperState> =>\n computed(() => ({\n errorText: options.error?.value ?? '',\n helperText: options.helper?.value ?? '',\n }));\n\n// ── Counter state (opt-in) ─────────────────────────────────────────────────────\n\n/** Counter state for text fields with `maxLength`. */\nexport type CounterState = {\n counterAtLimit: boolean;\n counterNearLimit: boolean;\n counterText: string;\n};\n\nexport type CounterOptions = {\n maxLength?: Readable<number | undefined>;\n value: Readable<string | undefined>;\n};\n\n/**\n * Creates a reactive counter state signal for text fields with `maxLength`.\n * Only call this when `maxLength` may be set — the state is genuinely opt-in.\n *\n * @example\n * ```ts\n * const counter = createCounterState({ value: tf.value, maxLength: props.maxlength });\n * ```\n */\nexport const createCounterState = (options: CounterOptions): Readable<CounterState> =>\n computed<CounterState>(() => {\n const value = options.value?.value ?? '';\n const maxLength = options.maxLength?.value;\n const parsedMaxLength = Number(maxLength);\n const validMaxLength = Number.isFinite(parsedMaxLength) && parsedMaxLength > 0 ? parsedMaxLength : null;\n const hasCounter = validMaxLength !== null;\n const counterText = hasCounter ? `${value.length} / ${validMaxLength}` : '';\n const ratio = hasCounter ? value.length / validMaxLength : 0;\n\n return {\n counterAtLimit: hasCounter ? ratio >= 1 : false,\n counterNearLimit: hasCounter ? ratio >= 0.9 && ratio < 1 : false,\n counterText,\n };\n });\n\n// ── Label placement ───────────────────────────────────────────────────────────\n\nexport type LabelPlacement = 'inset' | 'outside' | undefined;\n\n// ── Field handle ──────────────────────────────────────────────────────────────\n\n/**\n * Common handle returned by `createField` — the base for both `TextFieldHandle`\n * and `ChoiceFieldHandle`.\n *\n * ARIA signals and label state are flat on the handle — no nested `aria` or\n * `label` sub-objects.\n *\n * @example\n * ```html\n * <label id=\"${labelId}\" ?hidden=\"${() => !labelVisible.value}\">...</label>\n * <input\n * :aria-labelledby=\"${ariaLabelledBy}\"\n * :aria-describedby=\"${ariaDescribedBy}\"\n * :aria-invalid=\"${ariaInvalid}\" />\n * ```\n */\n/** Flat ARIA attribute bag ready to spread into a template bind call. */\nexport type AriaProps = {\n 'aria-describedby': string | null;\n 'aria-errormessage': string | null;\n 'aria-invalid': 'true' | null;\n 'aria-labelledby': string | null;\n};\n\nexport type FieldHandle = {\n /** `aria-describedby` value. Non-null when helper or error text is present. */\n ariaDescribedBy: Readable<string | null>;\n /** `aria-errormessage` value. Non-null when error text is present. */\n ariaErrorMessage: Readable<string | null>;\n /** `aria-invalid` value. `'true'` when error text is present, otherwise `null`. */\n ariaInvalid: Readable<'true' | null>;\n /** `aria-labelledby` value. Non-null when a label is visible. */\n ariaLabelledBy: Readable<string | null>;\n /**\n * Returns a snapshot of the four ARIA attributes as a plain object.\n * Spread into a template bind call to avoid repeating each signal individually.\n *\n * @example\n * ```ts\n * bind(inputEl, { attr: field.ariaProps() });\n * ```\n */\n ariaProps(): AriaProps;\n /**\n * The stable `id` used for `aria-describedby` on the input. Points at the\n * assistive-text region (covers both helper text and error text per WAI-ARIA).\n */\n assistiveId: string;\n disabled: Readable<boolean>;\n /** Stable `id` for the inline error message element (`aria-errormessage`). */\n errorId: string;\n /** Reactive error text. Empty string when no error is set. */\n errorText: Readable<string>;\n fieldId: string;\n /** Reactive helper text. Empty string when no helper is set. */\n helperText: Readable<string>;\n /** Stable `id` for the label element. Stamp this on your `<label id=\"...\">`. */\n labelId: string;\n /** Whether the label should be visible. Use to toggle `hidden` on the `<label>`. */\n labelVisible: Readable<boolean>;\n triggerValidation: (on: Extract<ValidationTrigger, 'blur' | 'change'>) => void;\n};\n\n/**\n * Composes the field triad — IDs, assistive state, and label state — into a\n * single `FieldHandle`. Both `createTextField` and `createChoiceField` build\n * on top of this.\n */\nexport const createField = (options: FieldOptions): FieldHandle => {\n // ── Core ──────────────────────────────────────────────────────────────────\n const disabled = computed(() => Boolean(options.disabled?.value));\n const validateOn = options.validateOn;\n const fieldId = options.id ?? createStableId(options.prefix ?? 'field');\n const assistiveId = createStableId('helper');\n\n const triggerValidation = (on: Extract<ValidationTrigger, 'blur' | 'change'>): void => {\n if (validateOn?.value === on) options.getFormField?.()?.reportValidity();\n };\n\n // ── Label + ARIA state ────────────────────────────────────────────────────\n const labelId = createStableId('label');\n const errorId = createStableId('error');\n\n const label$ = options.label ?? computed(() => undefined);\n\n // Slot-first composition: if the caller provides `hasLabel`, use it instead\n // of deriving visibility purely from the label text signal. This allows\n // components with a `<slot name=\"label\">` to stay visible even when the\n // `label` prop is empty but a slotted label element is present.\n const labelVisible$ = options.hasLabel ?? computed(() => Boolean(label$.value));\n\n const resolvedAssistive = createErrorHelperState({ error: options.error, helper: options.helper });\n\n const ariaDescribedBy = computed(() =>\n resolvedAssistive.value.errorText || resolvedAssistive.value.helperText ? assistiveId : null,\n );\n const ariaErrorMessage = computed(() => (resolvedAssistive.value.errorText ? errorId : null));\n const ariaInvalid = computed<'true' | null>(() => (resolvedAssistive.value.errorText ? 'true' : null));\n const ariaLabelledBy = computed(() => (labelVisible$.value ? labelId : null));\n\n return {\n ariaDescribedBy,\n ariaErrorMessage,\n ariaInvalid,\n ariaLabelledBy,\n ariaProps: () => ({\n 'aria-describedby': ariaDescribedBy.value,\n 'aria-errormessage': ariaErrorMessage.value,\n 'aria-invalid': ariaInvalid.value,\n 'aria-labelledby': ariaLabelledBy.value,\n }),\n assistiveId,\n disabled,\n errorId,\n errorText: computed(() => resolvedAssistive.value.errorText),\n fieldId,\n helperText: computed(() => resolvedAssistive.value.helperText),\n labelId,\n labelVisible: labelVisible$,\n triggerValidation,\n };\n};\n"],"mappings":";;;AAoEA,IAAa,KAA0B,MACrC,SAAgB;CACd,WAAW,EAAQ,OAAO,SAAS;CACnC,YAAY,EAAQ,QAAQ,SAAS;AACvC,EAAE,GAyBS,KAAsB,MACjC,QAA6B;CAC3B,IAAM,IAAQ,EAAQ,OAAO,SAAS,IAChC,IAAY,EAAQ,WAAW,OAC/B,IAAkB,OAAO,CAAS,GAClC,IAAiB,OAAO,SAAS,CAAe,KAAK,IAAkB,IAAI,IAAkB,MAC7F,IAAa,MAAmB,MAChC,IAAc,IAAa,GAAG,EAAM,OAAO,KAAK,MAAmB,IACnE,IAAQ,IAAa,EAAM,SAAS,IAAiB;CAE3D,OAAO;EACL,gBAAgB,IAAa,KAAS,IAAI;EAC1C,kBAAkB,IAAa,KAAS,MAAO,IAAQ,IAAI;EAC3D;CACF;AACF,CAAC,GA4EU,KAAe,MAAuC;CAEjE,IAAM,IAAW,QAAe,EAAQ,EAAQ,UAAU,KAAM,GAC1D,IAAa,EAAQ,YACrB,IAAU,EAAQ,MAAM,EAAe,EAAQ,UAAU,OAAO,GAChE,IAAc,EAAe,QAAQ,GAErC,KAAqB,MAA4D;EACrF,AAAI,GAAY,UAAU,KAAI,EAAQ,eAAe,CAAC,EAAE,eAAe;CACzE,GAGM,IAAU,EAAe,OAAO,GAChC,IAAU,EAAe,OAAO,GAEhC,IAAS,EAAQ,SAAS,QAAe,KAAA,CAAS,GAMlD,IAAgB,EAAQ,YAAY,QAAe,EAAQ,EAAO,KAAM,GAExE,IAAoB,EAAuB;EAAE,OAAO,EAAQ;EAAO,QAAQ,EAAQ;CAAO,CAAC,GAE3F,IAAkB,QACtB,EAAkB,MAAM,aAAa,EAAkB,MAAM,aAAa,IAAc,IAC1F,GACM,IAAmB,QAAgB,EAAkB,MAAM,YAAY,IAAU,IAAK,GACtF,IAAc,QAA+B,EAAkB,MAAM,YAAY,SAAS,IAAK,GAC/F,IAAiB,QAAgB,EAAc,QAAQ,IAAU,IAAK;CAE5E,OAAO;EACL;EACA;EACA;EACA;EACA,kBAAkB;GAChB,oBAAoB,EAAgB;GACpC,qBAAqB,EAAiB;GACtC,gBAAgB,EAAY;GAC5B,mBAAmB,EAAe;EACpC;EACA;EACA;EACA;EACA,WAAW,QAAe,EAAkB,MAAM,SAAS;EAC3D;EACA,YAAY,QAAe,EAAkB,MAAM,UAAU;EAC7D;EACA,cAAc;EACd;CACF;AACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=[`a[href]`,`area[href]`,`button:not([disabled])`,`details > summary:not([disabled])`,`iframe`,`input:not([disabled])`,`select:not([disabled])`,`textarea:not([disabled])`,`[contenteditable]:not([contenteditable="false"])`,`[tabindex]:not([tabindex="-1"])`,`[role="button"]:not([disabled]):not([aria-disabled="true"])`,`[role="link"]:not([aria-disabled="true"])`,`[role="menuitem"]:not([aria-disabled="true"])`,`[role="menuitemcheckbox"]:not([aria-disabled="true"])`,`[role="menuitemradio"]:not([aria-disabled="true"])`,`[role="option"]:not([aria-disabled="true"])`,`[role="tab"]:not([aria-disabled="true"])`].join(`,`),t=(t,n={})=>{let r=!1,i=()=>{let n=t();return n?Array.from(n.querySelectorAll(e)).filter(e=>!e.closest(`[aria-hidden="true"]`)&&!e.closest(`[hidden]`)&&!e.closest(`[inert]`)):[]},a=e=>{if(!r||n.enabled?.()===!1||e.key!==`Tab`)return;let t=i();if(t.length===0){e.preventDefault();return}let a=t[0],o=t[t.length-1],s=e.target??document.activeElement;e.shiftKey?(s===a||!t.includes(s))&&(e.preventDefault(),o.focus()):(s===o||!t.includes(s))&&(e.preventDefault(),a.focus())},o=()=>{r||(r=!0,document.addEventListener(`keydown`,a,!0))},s=()=>{r&&(r=!1,document.removeEventListener(`keydown`,a,!0))};return n.signal&&!n.signal.aborted&&n.signal.addEventListener(`abort`,s,{once:!0}),{activate:o,get active(){return r},deactivate:s,dispose:s,[Symbol.dispose]:s}};exports.createFocusTrap=t;
|
|
2
|
+
//# sourceMappingURL=focus-trap.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-trap.cjs","names":[],"sources":["../../src/headless/focus-trap.ts"],"sourcesContent":["// ── Focus Trap ────────────────────────────────────────────────────────────────\n// Implements the WAI-ARIA modal dialog focus-containment pattern.\n//\n// When active, Tab/Shift-Tab wrap within the container's focusable descendants\n// instead of leaving it. The focusable list is re-queried on every Tab keydown\n// so DOM changes (e.g. lazy-rendered content) are always reflected without a\n// MutationObserver.\n//\n// Usage (inside a ore component):\n// ```ts\n// const trap = createFocusTrap(() => dialogEl);\n// onOpen: () => trap.activate(),\n// onClose: () => trap.deactivate(),\n// ```\n\n// ── Constants ─────────────────────────────────────────────────────────────────\n\n/**\n * CSS selector matching all focusable elements, including:\n * - Native HTML interactive elements\n * - Elements with explicit `tabindex` (covers custom elements that correctly manage focus)\n * - Custom elements using ARIA interactive roles that are inherently focusable\n * but may not carry a native `tabindex` attribute\n *\n * Note: `[tabindex]:not([tabindex=\"-1\"])` already covers any element that\n * explicitly opts into the tab order. The ARIA role selectors below additionally\n * capture elements that rely on the implicit focusability of their role\n * without a redundant `tabindex=\"0\"` attribute.\n */\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'area[href]',\n 'button:not([disabled])',\n 'details > summary:not([disabled])',\n 'iframe',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[contenteditable]:not([contenteditable=\"false\"])',\n '[tabindex]:not([tabindex=\"-1\"])',\n // ARIA interactive roles that should participate in focus order.\n // These cover custom components that set role but not explicit tabindex.\n '[role=\"button\"]:not([disabled]):not([aria-disabled=\"true\"])',\n '[role=\"link\"]:not([aria-disabled=\"true\"])',\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"])',\n '[role=\"menuitemcheckbox\"]:not([aria-disabled=\"true\"])',\n '[role=\"menuitemradio\"]:not([aria-disabled=\"true\"])',\n '[role=\"option\"]:not([aria-disabled=\"true\"])',\n '[role=\"tab\"]:not([aria-disabled=\"true\"])',\n // Note: [role=\"gridcell\"] and [role=\"row\"] are intentionally omitted — they\n // participate in focus order only when an explicit tabindex is set, which is\n // already caught by the [tabindex]:not([tabindex=\"-1\"]) selector above.\n].join(',');\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type FocusTrapOptions = {\n /**\n * When provided, the trap only processes events when this returns `true`.\n * Useful to pause trapping while an inner dialog is open.\n */\n enabled?: () => boolean;\n /**\n * Optional `AbortSignal`. When aborted, `deactivate()` is called automatically.\n * Prevents global `keydown` listener leaks if the component is destroyed while\n * the trap is still active.\n */\n signal?: AbortSignal;\n};\n\nexport type FocusTrap = {\n [Symbol.dispose](): void;\n /** Start trapping Tab/Shift-Tab. Safe to call when already active. */\n activate(): void;\n /** Whether the trap is currently active. */\n readonly active: boolean;\n /** Stop trapping. Safe to call when already inactive. */\n deactivate(): void;\n /** Alias for `deactivate()`. Conforms to the monorepo disposal convention. */\n dispose(): void;\n};\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\n/**\n * Creates a WAI-ARIA modal focus trap for a container element.\n *\n * When active, Tab wraps from the last focusable child to the first, and\n * Shift-Tab wraps in reverse. The focusable list is re-queried live on each\n * Tab keydown — no MutationObserver required.\n *\n * The container itself is queried lazily via `getContainer()` so it may be\n * `null` at construction time (the typical case when the container is inside\n * an initially-hidden overlay).\n *\n * @example\n * ```ts\n * const trap = createFocusTrap(() => dialogEl);\n *\n * onOpen: () => trap.activate(),\n * onClose: () => trap.deactivate(),\n * ```\n */\nexport const createFocusTrap = (\n getContainer: () => HTMLElement | ShadowRoot | null,\n options: FocusTrapOptions = {},\n): FocusTrap => {\n let _active = false;\n\n const getFocusable = (): HTMLElement[] => {\n const container = getContainer();\n\n if (!container) return [];\n\n return Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n // Exclude elements hidden from the accessibility tree or removed from tab order.\n // aria-hidden=\"true\" and [hidden] have long been standard; [inert] is the\n // modern successor that browsers honour natively from 2022+.\n (el) => !el.closest('[aria-hidden=\"true\"]') && !el.closest('[hidden]') && !el.closest('[inert]'),\n );\n };\n\n const handleKeydown = (event: KeyboardEvent): void => {\n if (!_active) return;\n\n if (options.enabled?.() === false) return;\n\n if (event.key !== 'Tab') return;\n\n const focusable = getFocusable();\n\n if (focusable.length === 0) {\n // Prevent focus from escaping the empty container.\n event.preventDefault();\n\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n // Prefer event.target over document.activeElement: the capture-phase handler\n // fires before focus has moved in some environments (e.g. jsdom).\n const current = (event.target as HTMLElement) ?? document.activeElement;\n\n if (event.shiftKey) {\n // Shift+Tab from first (or outside) → wrap to last.\n if (current === first || !focusable.includes(current as HTMLElement)) {\n event.preventDefault();\n last.focus();\n }\n } else {\n // Tab from last (or outside) → wrap to first.\n if (current === last || !focusable.includes(current as HTMLElement)) {\n event.preventDefault();\n first.focus();\n }\n }\n };\n\n const activate = (): void => {\n if (_active) return;\n\n _active = true;\n document.addEventListener('keydown', handleKeydown, true);\n };\n\n const deactivate = (): void => {\n if (!_active) return;\n\n _active = false;\n document.removeEventListener('keydown', handleKeydown, true);\n };\n\n if (options.signal && !options.signal.aborted) {\n options.signal.addEventListener('abort', deactivate, { once: true });\n }\n\n return {\n activate,\n get active() {\n return _active;\n },\n deactivate,\n dispose: deactivate,\n [Symbol.dispose]: deactivate,\n };\n};\n"],"mappings":"AA6BA,IAAM,EAAqB,CACzB,UACA,aACA,yBACA,oCACA,SACA,wBACA,yBACA,2BACA,mDACA,kCAGA,8DACA,4CACA,gDACA,wDACA,qDACA,8CACA,0CAIF,CAAC,CAAC,KAAK,GAAG,EAmDG,GACX,EACA,EAA4B,CAAC,IACf,CACd,IAAI,EAAU,GAER,MAAoC,CACxC,IAAM,EAAY,EAAa,EAI/B,OAFK,EAEE,MAAM,KAAK,EAAU,iBAA8B,CAAkB,CAAC,CAAC,CAAC,OAI5E,GAAO,CAAC,EAAG,QAAQ,sBAAsB,GAAK,CAAC,EAAG,QAAQ,UAAU,GAAK,CAAC,EAAG,QAAQ,SAAS,CACjG,EAPuB,CAAC,CAQ1B,EAEM,EAAiB,GAA+B,CAKpD,GAJI,CAAC,GAED,EAAQ,UAAU,IAAM,IAExB,EAAM,MAAQ,MAAO,OAEzB,IAAM,EAAY,EAAa,EAE/B,GAAI,EAAU,SAAW,EAAG,CAE1B,EAAM,eAAe,EAErB,MACF,CAEA,IAAM,EAAQ,EAAU,GAClB,EAAO,EAAU,EAAU,OAAS,GAGpC,EAAW,EAAM,QAA0B,SAAS,cAEtD,EAAM,UAEJ,IAAY,GAAS,CAAC,EAAU,SAAS,CAAsB,KACjE,EAAM,eAAe,EACrB,EAAK,MAAM,IAIT,IAAY,GAAQ,CAAC,EAAU,SAAS,CAAsB,KAChE,EAAM,eAAe,EACrB,EAAM,MAAM,EAGlB,EAEM,MAAuB,CACvB,IAEJ,EAAU,GACV,SAAS,iBAAiB,UAAW,EAAe,EAAI,EAC1D,EAEM,MAAyB,CACxB,IAEL,EAAU,GACV,SAAS,oBAAoB,UAAW,EAAe,EAAI,EAC7D,EAMA,OAJI,EAAQ,QAAU,CAAC,EAAQ,OAAO,SACpC,EAAQ,OAAO,iBAAiB,QAAS,EAAY,CAAE,KAAM,EAAK,CAAC,EAG9D,CACL,WACA,IAAI,QAAS,CACX,OAAO,CACT,EACA,aACA,QAAS,GACR,OAAO,SAAU,CACpB,CACF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export type FocusTrapOptions = {
|
|
2
|
+
/**
|
|
3
|
+
* When provided, the trap only processes events when this returns `true`.
|
|
4
|
+
* Useful to pause trapping while an inner dialog is open.
|
|
5
|
+
*/
|
|
6
|
+
enabled?: () => boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Optional `AbortSignal`. When aborted, `deactivate()` is called automatically.
|
|
9
|
+
* Prevents global `keydown` listener leaks if the component is destroyed while
|
|
10
|
+
* the trap is still active.
|
|
11
|
+
*/
|
|
12
|
+
signal?: AbortSignal;
|
|
13
|
+
};
|
|
14
|
+
export type FocusTrap = {
|
|
15
|
+
[Symbol.dispose](): void;
|
|
16
|
+
/** Start trapping Tab/Shift-Tab. Safe to call when already active. */
|
|
17
|
+
activate(): void;
|
|
18
|
+
/** Whether the trap is currently active. */
|
|
19
|
+
readonly active: boolean;
|
|
20
|
+
/** Stop trapping. Safe to call when already inactive. */
|
|
21
|
+
deactivate(): void;
|
|
22
|
+
/** Alias for `deactivate()`. Conforms to the monorepo disposal convention. */
|
|
23
|
+
dispose(): void;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Creates a WAI-ARIA modal focus trap for a container element.
|
|
27
|
+
*
|
|
28
|
+
* When active, Tab wraps from the last focusable child to the first, and
|
|
29
|
+
* Shift-Tab wraps in reverse. The focusable list is re-queried live on each
|
|
30
|
+
* Tab keydown — no MutationObserver required.
|
|
31
|
+
*
|
|
32
|
+
* The container itself is queried lazily via `getContainer()` so it may be
|
|
33
|
+
* `null` at construction time (the typical case when the container is inside
|
|
34
|
+
* an initially-hidden overlay).
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* const trap = createFocusTrap(() => dialogEl);
|
|
39
|
+
*
|
|
40
|
+
* onOpen: () => trap.activate(),
|
|
41
|
+
* onClose: () => trap.deactivate(),
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare const createFocusTrap: (getContainer: () => HTMLElement | ShadowRoot | null, options?: FocusTrapOptions) => FocusTrap;
|
|
45
|
+
//# sourceMappingURL=focus-trap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-trap.d.ts","sourceRoot":"","sources":["../../src/headless/focus-trap.ts"],"names":[],"mappings":"AAwDA,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC;IACxB;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACzB,sEAAsE;IACtE,QAAQ,IAAI,IAAI,CAAC;IACjB,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,yDAAyD;IACzD,UAAU,IAAI,IAAI,CAAC;IACnB,8EAA8E;IAC9E,OAAO,IAAI,IAAI,CAAC;CACjB,CAAC;AAIF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,eAAe,GAC1B,cAAc,MAAM,WAAW,GAAG,UAAU,GAAG,IAAI,EACnD,UAAS,gBAAqB,KAC7B,SAgFF,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
//#region src/headless/focus-trap.ts
|
|
2
|
+
var e = [
|
|
3
|
+
"a[href]",
|
|
4
|
+
"area[href]",
|
|
5
|
+
"button:not([disabled])",
|
|
6
|
+
"details > summary:not([disabled])",
|
|
7
|
+
"iframe",
|
|
8
|
+
"input:not([disabled])",
|
|
9
|
+
"select:not([disabled])",
|
|
10
|
+
"textarea:not([disabled])",
|
|
11
|
+
"[contenteditable]:not([contenteditable=\"false\"])",
|
|
12
|
+
"[tabindex]:not([tabindex=\"-1\"])",
|
|
13
|
+
"[role=\"button\"]:not([disabled]):not([aria-disabled=\"true\"])",
|
|
14
|
+
"[role=\"link\"]:not([aria-disabled=\"true\"])",
|
|
15
|
+
"[role=\"menuitem\"]:not([aria-disabled=\"true\"])",
|
|
16
|
+
"[role=\"menuitemcheckbox\"]:not([aria-disabled=\"true\"])",
|
|
17
|
+
"[role=\"menuitemradio\"]:not([aria-disabled=\"true\"])",
|
|
18
|
+
"[role=\"option\"]:not([aria-disabled=\"true\"])",
|
|
19
|
+
"[role=\"tab\"]:not([aria-disabled=\"true\"])"
|
|
20
|
+
].join(","), t = (t, n = {}) => {
|
|
21
|
+
let r = !1, i = () => {
|
|
22
|
+
let n = t();
|
|
23
|
+
return n ? Array.from(n.querySelectorAll(e)).filter((e) => !e.closest("[aria-hidden=\"true\"]") && !e.closest("[hidden]") && !e.closest("[inert]")) : [];
|
|
24
|
+
}, a = (e) => {
|
|
25
|
+
if (!r || n.enabled?.() === !1 || e.key !== "Tab") return;
|
|
26
|
+
let t = i();
|
|
27
|
+
if (t.length === 0) {
|
|
28
|
+
e.preventDefault();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
let a = t[0], o = t[t.length - 1], s = e.target ?? document.activeElement;
|
|
32
|
+
e.shiftKey ? (s === a || !t.includes(s)) && (e.preventDefault(), o.focus()) : (s === o || !t.includes(s)) && (e.preventDefault(), a.focus());
|
|
33
|
+
}, o = () => {
|
|
34
|
+
r || (r = !0, document.addEventListener("keydown", a, !0));
|
|
35
|
+
}, s = () => {
|
|
36
|
+
r && (r = !1, document.removeEventListener("keydown", a, !0));
|
|
37
|
+
};
|
|
38
|
+
return n.signal && !n.signal.aborted && n.signal.addEventListener("abort", s, { once: !0 }), {
|
|
39
|
+
activate: o,
|
|
40
|
+
get active() {
|
|
41
|
+
return r;
|
|
42
|
+
},
|
|
43
|
+
deactivate: s,
|
|
44
|
+
dispose: s,
|
|
45
|
+
[Symbol.dispose]: s
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
//#endregion
|
|
49
|
+
export { t as createFocusTrap };
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=focus-trap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-trap.js","names":[],"sources":["../../src/headless/focus-trap.ts"],"sourcesContent":["// ── Focus Trap ────────────────────────────────────────────────────────────────\n// Implements the WAI-ARIA modal dialog focus-containment pattern.\n//\n// When active, Tab/Shift-Tab wrap within the container's focusable descendants\n// instead of leaving it. The focusable list is re-queried on every Tab keydown\n// so DOM changes (e.g. lazy-rendered content) are always reflected without a\n// MutationObserver.\n//\n// Usage (inside a ore component):\n// ```ts\n// const trap = createFocusTrap(() => dialogEl);\n// onOpen: () => trap.activate(),\n// onClose: () => trap.deactivate(),\n// ```\n\n// ── Constants ─────────────────────────────────────────────────────────────────\n\n/**\n * CSS selector matching all focusable elements, including:\n * - Native HTML interactive elements\n * - Elements with explicit `tabindex` (covers custom elements that correctly manage focus)\n * - Custom elements using ARIA interactive roles that are inherently focusable\n * but may not carry a native `tabindex` attribute\n *\n * Note: `[tabindex]:not([tabindex=\"-1\"])` already covers any element that\n * explicitly opts into the tab order. The ARIA role selectors below additionally\n * capture elements that rely on the implicit focusability of their role\n * without a redundant `tabindex=\"0\"` attribute.\n */\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'area[href]',\n 'button:not([disabled])',\n 'details > summary:not([disabled])',\n 'iframe',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[contenteditable]:not([contenteditable=\"false\"])',\n '[tabindex]:not([tabindex=\"-1\"])',\n // ARIA interactive roles that should participate in focus order.\n // These cover custom components that set role but not explicit tabindex.\n '[role=\"button\"]:not([disabled]):not([aria-disabled=\"true\"])',\n '[role=\"link\"]:not([aria-disabled=\"true\"])',\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"])',\n '[role=\"menuitemcheckbox\"]:not([aria-disabled=\"true\"])',\n '[role=\"menuitemradio\"]:not([aria-disabled=\"true\"])',\n '[role=\"option\"]:not([aria-disabled=\"true\"])',\n '[role=\"tab\"]:not([aria-disabled=\"true\"])',\n // Note: [role=\"gridcell\"] and [role=\"row\"] are intentionally omitted — they\n // participate in focus order only when an explicit tabindex is set, which is\n // already caught by the [tabindex]:not([tabindex=\"-1\"]) selector above.\n].join(',');\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type FocusTrapOptions = {\n /**\n * When provided, the trap only processes events when this returns `true`.\n * Useful to pause trapping while an inner dialog is open.\n */\n enabled?: () => boolean;\n /**\n * Optional `AbortSignal`. When aborted, `deactivate()` is called automatically.\n * Prevents global `keydown` listener leaks if the component is destroyed while\n * the trap is still active.\n */\n signal?: AbortSignal;\n};\n\nexport type FocusTrap = {\n [Symbol.dispose](): void;\n /** Start trapping Tab/Shift-Tab. Safe to call when already active. */\n activate(): void;\n /** Whether the trap is currently active. */\n readonly active: boolean;\n /** Stop trapping. Safe to call when already inactive. */\n deactivate(): void;\n /** Alias for `deactivate()`. Conforms to the monorepo disposal convention. */\n dispose(): void;\n};\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\n/**\n * Creates a WAI-ARIA modal focus trap for a container element.\n *\n * When active, Tab wraps from the last focusable child to the first, and\n * Shift-Tab wraps in reverse. The focusable list is re-queried live on each\n * Tab keydown — no MutationObserver required.\n *\n * The container itself is queried lazily via `getContainer()` so it may be\n * `null` at construction time (the typical case when the container is inside\n * an initially-hidden overlay).\n *\n * @example\n * ```ts\n * const trap = createFocusTrap(() => dialogEl);\n *\n * onOpen: () => trap.activate(),\n * onClose: () => trap.deactivate(),\n * ```\n */\nexport const createFocusTrap = (\n getContainer: () => HTMLElement | ShadowRoot | null,\n options: FocusTrapOptions = {},\n): FocusTrap => {\n let _active = false;\n\n const getFocusable = (): HTMLElement[] => {\n const container = getContainer();\n\n if (!container) return [];\n\n return Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n // Exclude elements hidden from the accessibility tree or removed from tab order.\n // aria-hidden=\"true\" and [hidden] have long been standard; [inert] is the\n // modern successor that browsers honour natively from 2022+.\n (el) => !el.closest('[aria-hidden=\"true\"]') && !el.closest('[hidden]') && !el.closest('[inert]'),\n );\n };\n\n const handleKeydown = (event: KeyboardEvent): void => {\n if (!_active) return;\n\n if (options.enabled?.() === false) return;\n\n if (event.key !== 'Tab') return;\n\n const focusable = getFocusable();\n\n if (focusable.length === 0) {\n // Prevent focus from escaping the empty container.\n event.preventDefault();\n\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n // Prefer event.target over document.activeElement: the capture-phase handler\n // fires before focus has moved in some environments (e.g. jsdom).\n const current = (event.target as HTMLElement) ?? document.activeElement;\n\n if (event.shiftKey) {\n // Shift+Tab from first (or outside) → wrap to last.\n if (current === first || !focusable.includes(current as HTMLElement)) {\n event.preventDefault();\n last.focus();\n }\n } else {\n // Tab from last (or outside) → wrap to first.\n if (current === last || !focusable.includes(current as HTMLElement)) {\n event.preventDefault();\n first.focus();\n }\n }\n };\n\n const activate = (): void => {\n if (_active) return;\n\n _active = true;\n document.addEventListener('keydown', handleKeydown, true);\n };\n\n const deactivate = (): void => {\n if (!_active) return;\n\n _active = false;\n document.removeEventListener('keydown', handleKeydown, true);\n };\n\n if (options.signal && !options.signal.aborted) {\n options.signal.addEventListener('abort', deactivate, { once: true });\n }\n\n return {\n activate,\n get active() {\n return _active;\n },\n deactivate,\n dispose: deactivate,\n [Symbol.dispose]: deactivate,\n };\n};\n"],"mappings":";AA6BA,IAAM,IAAqB;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;AAIF,CAAC,CAAC,KAAK,GAAG,GAmDG,KACX,GACA,IAA4B,CAAC,MACf;CACd,IAAI,IAAU,IAER,UAAoC;EACxC,IAAM,IAAY,EAAa;EAI/B,OAFK,IAEE,MAAM,KAAK,EAAU,iBAA8B,CAAkB,CAAC,CAAC,CAAC,QAI5E,MAAO,CAAC,EAAG,QAAQ,wBAAsB,KAAK,CAAC,EAAG,QAAQ,UAAU,KAAK,CAAC,EAAG,QAAQ,SAAS,CACjG,IAPuB,CAAC;CAQ1B,GAEM,KAAiB,MAA+B;EAKpD,IAJI,CAAC,KAED,EAAQ,UAAU,MAAM,MAExB,EAAM,QAAQ,OAAO;EAEzB,IAAM,IAAY,EAAa;EAE/B,IAAI,EAAU,WAAW,GAAG;GAE1B,EAAM,eAAe;GAErB;EACF;EAEA,IAAM,IAAQ,EAAU,IAClB,IAAO,EAAU,EAAU,SAAS,IAGpC,IAAW,EAAM,UAA0B,SAAS;EAE1D,AAAI,EAAM,YAEJ,MAAY,KAAS,CAAC,EAAU,SAAS,CAAsB,OACjE,EAAM,eAAe,GACrB,EAAK,MAAM,MAIT,MAAY,KAAQ,CAAC,EAAU,SAAS,CAAsB,OAChE,EAAM,eAAe,GACrB,EAAM,MAAM;CAGlB,GAEM,UAAuB;EACvB,MAEJ,IAAU,IACV,SAAS,iBAAiB,WAAW,GAAe,EAAI;CAC1D,GAEM,UAAyB;EACxB,MAEL,IAAU,IACV,SAAS,oBAAoB,WAAW,GAAe,EAAI;CAC7D;CAMA,OAJI,EAAQ,UAAU,CAAC,EAAQ,OAAO,WACpC,EAAQ,OAAO,iBAAiB,SAAS,GAAY,EAAE,MAAM,GAAK,CAAC,GAG9D;EACL;EACA,IAAI,SAAS;GACX,OAAO;EACT;EACA;EACA,SAAS;GACR,OAAO,UAAU;CACpB;AACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){let t=null,n=null;return{applyInitialFocus(){n!==null&&(cancelAnimationFrame(n),n=null);let t=e.getInitialFocusSelector();if(t){let r=e.host.shadowRoot??e.host,i=null;try{i=r.querySelector(t)}catch{return}i&&(n=requestAnimationFrame(()=>{n=null,i.focus()}))}},cancelInitialFocus(){n!==null&&(cancelAnimationFrame(n),n=null)},captureReturnFocus(){t=document.activeElement},restoreFocus(){e.getReturnFocus()!==!1&&t&&(t.focus(),t=null)}}}exports.createFocusManager=e;
|
|
2
|
+
//# sourceMappingURL=focus.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus.cjs","names":[],"sources":["../../src/headless/focus.ts"],"sourcesContent":["// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type FocusManagerOptions = {\n /**\n * Returns the CSS selector for the element that should receive focus on open.\n *\n * **Security note:** this value is passed directly to `querySelector`. It must\n * come from trusted developer-controlled configuration, never from raw user input.\n */\n getInitialFocusSelector: () => string | undefined;\n /**\n * Returns whether focus should be restored to the previously focused element\n * on close. `undefined` or `true` means restore; `false` means skip.\n */\n getReturnFocus: () => boolean | undefined;\n /** Host element used for `querySelector` when resolving the initial focus target. */\n host: HTMLElement;\n};\n\nexport type FocusManager = {\n /** Move focus to the element matching `getInitialFocusSelector` (deferred one frame). */\n applyInitialFocus: () => void;\n /** Cancel a pending `applyInitialFocus` rAF, if any. */\n cancelInitialFocus: () => void;\n /** Capture the currently focused element so it can be restored later. */\n captureReturnFocus: () => void;\n /** Restore focus to the element captured by `captureReturnFocus`. */\n restoreFocus: () => void;\n};\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\n/**\n * Encapsulates the three-step focus lifecycle used by dialogs and drawers:\n * 1. Capture the element that triggered the open.\n * 2. Move focus inside the overlay (optionally to a specific element).\n * 3. Restore focus when the overlay closes.\n */\nexport function createFocusManager(options: FocusManagerOptions): FocusManager {\n let returnFocusEl: HTMLElement | null = null;\n let rafHandle: ReturnType<typeof requestAnimationFrame> | null = null;\n\n return {\n applyInitialFocus() {\n if (rafHandle !== null) {\n cancelAnimationFrame(rafHandle);\n rafHandle = null;\n }\n\n const selector = options.getInitialFocusSelector();\n\n if (selector) {\n // Query the shadow root first (all refine components render into Shadow DOM),\n // falling back to the host's light-DOM tree for non-Shadow contexts.\n const root = options.host.shadowRoot ?? options.host;\n\n let target: HTMLElement | null = null;\n\n try {\n target = root.querySelector<HTMLElement>(selector);\n } catch {\n // Malformed selector (SyntaxError) — skip initial focus rather than throw.\n return;\n }\n\n if (target) {\n rafHandle = requestAnimationFrame(() => {\n rafHandle = null;\n target.focus();\n });\n }\n }\n },\n\n cancelInitialFocus() {\n if (rafHandle !== null) {\n cancelAnimationFrame(rafHandle);\n rafHandle = null;\n }\n },\n\n captureReturnFocus() {\n returnFocusEl = document.activeElement as HTMLElement;\n },\n\n restoreFocus() {\n if (options.getReturnFocus() !== false && returnFocusEl) {\n returnFocusEl.focus();\n returnFocusEl = null;\n }\n },\n };\n}\n"],"mappings":"AAsCA,SAAgB,EAAmB,EAA4C,CAC7E,IAAI,EAAoC,KACpC,EAA6D,KAEjE,MAAO,CACL,mBAAoB,CACd,IAAc,OAChB,qBAAqB,CAAS,EAC9B,EAAY,MAGd,IAAM,EAAW,EAAQ,wBAAwB,EAEjD,GAAI,EAAU,CAGZ,IAAM,EAAO,EAAQ,KAAK,YAAc,EAAQ,KAE5C,EAA6B,KAEjC,GAAI,CACF,EAAS,EAAK,cAA2B,CAAQ,CACnD,MAAQ,CAEN,MACF,CAEI,IACF,EAAY,0BAA4B,CACtC,EAAY,KACZ,EAAO,MAAM,CACf,CAAC,EAEL,CACF,EAEA,oBAAqB,CACf,IAAc,OAChB,qBAAqB,CAAS,EAC9B,EAAY,KAEhB,EAEA,oBAAqB,CACnB,EAAgB,SAAS,aAC3B,EAEA,cAAe,CACT,EAAQ,eAAe,IAAM,IAAS,IACxC,EAAc,MAAM,EACpB,EAAgB,KAEpB,CACF,CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type FocusManagerOptions = {
|
|
2
|
+
/**
|
|
3
|
+
* Returns the CSS selector for the element that should receive focus on open.
|
|
4
|
+
*
|
|
5
|
+
* **Security note:** this value is passed directly to `querySelector`. It must
|
|
6
|
+
* come from trusted developer-controlled configuration, never from raw user input.
|
|
7
|
+
*/
|
|
8
|
+
getInitialFocusSelector: () => string | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Returns whether focus should be restored to the previously focused element
|
|
11
|
+
* on close. `undefined` or `true` means restore; `false` means skip.
|
|
12
|
+
*/
|
|
13
|
+
getReturnFocus: () => boolean | undefined;
|
|
14
|
+
/** Host element used for `querySelector` when resolving the initial focus target. */
|
|
15
|
+
host: HTMLElement;
|
|
16
|
+
};
|
|
17
|
+
export type FocusManager = {
|
|
18
|
+
/** Move focus to the element matching `getInitialFocusSelector` (deferred one frame). */
|
|
19
|
+
applyInitialFocus: () => void;
|
|
20
|
+
/** Cancel a pending `applyInitialFocus` rAF, if any. */
|
|
21
|
+
cancelInitialFocus: () => void;
|
|
22
|
+
/** Capture the currently focused element so it can be restored later. */
|
|
23
|
+
captureReturnFocus: () => void;
|
|
24
|
+
/** Restore focus to the element captured by `captureReturnFocus`. */
|
|
25
|
+
restoreFocus: () => void;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Encapsulates the three-step focus lifecycle used by dialogs and drawers:
|
|
29
|
+
* 1. Capture the element that triggered the open.
|
|
30
|
+
* 2. Move focus inside the overlay (optionally to a specific element).
|
|
31
|
+
* 3. Restore focus when the overlay closes.
|
|
32
|
+
*/
|
|
33
|
+
export declare function createFocusManager(options: FocusManagerOptions): FocusManager;
|
|
34
|
+
//# sourceMappingURL=focus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../../src/headless/focus.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG;IAChC;;;;;OAKG;IACH,uBAAuB,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAClD;;;OAGG;IACH,cAAc,EAAE,MAAM,OAAO,GAAG,SAAS,CAAC;IAC1C,qFAAqF;IACrF,IAAI,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,yFAAyF;IACzF,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,wDAAwD;IACxD,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,yEAAyE;IACzE,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,qEAAqE;IACrE,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC;AAIF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAsD7E"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/headless/focus.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
let t = null, n = null;
|
|
4
|
+
return {
|
|
5
|
+
applyInitialFocus() {
|
|
6
|
+
n !== null && (cancelAnimationFrame(n), n = null);
|
|
7
|
+
let t = e.getInitialFocusSelector();
|
|
8
|
+
if (t) {
|
|
9
|
+
let r = e.host.shadowRoot ?? e.host, i = null;
|
|
10
|
+
try {
|
|
11
|
+
i = r.querySelector(t);
|
|
12
|
+
} catch {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
i && (n = requestAnimationFrame(() => {
|
|
16
|
+
n = null, i.focus();
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
cancelInitialFocus() {
|
|
21
|
+
n !== null && (cancelAnimationFrame(n), n = null);
|
|
22
|
+
},
|
|
23
|
+
captureReturnFocus() {
|
|
24
|
+
t = document.activeElement;
|
|
25
|
+
},
|
|
26
|
+
restoreFocus() {
|
|
27
|
+
e.getReturnFocus() !== !1 && t && (t.focus(), t = null);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { e as createFocusManager };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=focus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus.js","names":[],"sources":["../../src/headless/focus.ts"],"sourcesContent":["// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type FocusManagerOptions = {\n /**\n * Returns the CSS selector for the element that should receive focus on open.\n *\n * **Security note:** this value is passed directly to `querySelector`. It must\n * come from trusted developer-controlled configuration, never from raw user input.\n */\n getInitialFocusSelector: () => string | undefined;\n /**\n * Returns whether focus should be restored to the previously focused element\n * on close. `undefined` or `true` means restore; `false` means skip.\n */\n getReturnFocus: () => boolean | undefined;\n /** Host element used for `querySelector` when resolving the initial focus target. */\n host: HTMLElement;\n};\n\nexport type FocusManager = {\n /** Move focus to the element matching `getInitialFocusSelector` (deferred one frame). */\n applyInitialFocus: () => void;\n /** Cancel a pending `applyInitialFocus` rAF, if any. */\n cancelInitialFocus: () => void;\n /** Capture the currently focused element so it can be restored later. */\n captureReturnFocus: () => void;\n /** Restore focus to the element captured by `captureReturnFocus`. */\n restoreFocus: () => void;\n};\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\n/**\n * Encapsulates the three-step focus lifecycle used by dialogs and drawers:\n * 1. Capture the element that triggered the open.\n * 2. Move focus inside the overlay (optionally to a specific element).\n * 3. Restore focus when the overlay closes.\n */\nexport function createFocusManager(options: FocusManagerOptions): FocusManager {\n let returnFocusEl: HTMLElement | null = null;\n let rafHandle: ReturnType<typeof requestAnimationFrame> | null = null;\n\n return {\n applyInitialFocus() {\n if (rafHandle !== null) {\n cancelAnimationFrame(rafHandle);\n rafHandle = null;\n }\n\n const selector = options.getInitialFocusSelector();\n\n if (selector) {\n // Query the shadow root first (all refine components render into Shadow DOM),\n // falling back to the host's light-DOM tree for non-Shadow contexts.\n const root = options.host.shadowRoot ?? options.host;\n\n let target: HTMLElement | null = null;\n\n try {\n target = root.querySelector<HTMLElement>(selector);\n } catch {\n // Malformed selector (SyntaxError) — skip initial focus rather than throw.\n return;\n }\n\n if (target) {\n rafHandle = requestAnimationFrame(() => {\n rafHandle = null;\n target.focus();\n });\n }\n }\n },\n\n cancelInitialFocus() {\n if (rafHandle !== null) {\n cancelAnimationFrame(rafHandle);\n rafHandle = null;\n }\n },\n\n captureReturnFocus() {\n returnFocusEl = document.activeElement as HTMLElement;\n },\n\n restoreFocus() {\n if (options.getReturnFocus() !== false && returnFocusEl) {\n returnFocusEl.focus();\n returnFocusEl = null;\n }\n },\n };\n}\n"],"mappings":";AAsCA,SAAgB,EAAmB,GAA4C;CAC7E,IAAI,IAAoC,MACpC,IAA6D;CAEjE,OAAO;EACL,oBAAoB;GAClB,AAAI,MAAc,SAChB,qBAAqB,CAAS,GAC9B,IAAY;GAGd,IAAM,IAAW,EAAQ,wBAAwB;GAEjD,IAAI,GAAU;IAGZ,IAAM,IAAO,EAAQ,KAAK,cAAc,EAAQ,MAE5C,IAA6B;IAEjC,IAAI;KACF,IAAS,EAAK,cAA2B,CAAQ;IACnD,QAAQ;KAEN;IACF;IAEA,AAAI,MACF,IAAY,4BAA4B;KAEtC,AADA,IAAY,MACZ,EAAO,MAAM;IACf,CAAC;GAEL;EACF;EAEA,qBAAqB;GACnB,AAAI,MAAc,SAChB,qBAAqB,CAAS,GAC9B,IAAY;EAEhB;EAEA,qBAAqB;GACnB,IAAgB,SAAS;EAC3B;EAEA,eAAe;GACb,AAAI,EAAQ,eAAe,MAAM,MAAS,MACxC,EAAc,MAAM,GACpB,IAAgB;EAEpB;CACF;AACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export { lifecycleSignal } from './ore';
|
|
2
|
+
export { createErrorHelperState, type AriaProps, type ControlValidationMode, type CounterOptions, type CounterState, type ErrorHelperOptions, type ErrorHelperState, type FieldHandle, type FieldOptions, type LabelPlacement, type ValidationTrigger, } from './field-base';
|
|
3
|
+
export { createTextField, type TextFieldDetach, type TextFieldHandle, type TextFieldOptions } from './text-field';
|
|
4
|
+
export { createChoiceField, type ChoiceChangeDetail, type ChoiceFieldHandle, type ChoiceFieldOptions, } from './choice-field';
|
|
5
|
+
export { createCheckable, type CheckableChangePayload, type CheckableHandle, type CheckableOptions } from './checkable';
|
|
6
|
+
export { type DialogCloseReason, type DropdownCloseReason, type OverlayCloseDetail, type OverlayControl, type OverlayOpenDetail, type OverlayOpenReason, } from './overlay';
|
|
7
|
+
export { createOptionList, type BaseOptionItem, type OptionListHandle, type OptionListOptions, type PlacementOptions, } from './option-list';
|
|
8
|
+
export { createPaginatedList, type PaginatedListHandle, type PaginatedListOptions } from './paginated-list';
|
|
9
|
+
export { type ListKeyAction, type ListNavigationAction } from './nav';
|
|
10
|
+
export { createSpinnerControl, type SpinnerControl, type SpinnerControlOptions } from './spinner';
|
|
11
|
+
export { createSliderControl, type SliderControl, type SliderControlOptions } from './slider';
|
|
12
|
+
export { createSwipeControl, type SwipeAxis, type SwipeControl, type SwipeControlDetail, type SwipeControlOptions, } from './swipe';
|
|
13
|
+
export { announce, type AnnouncePoliteness, type AnnounceOptions } from './announcer';
|
|
14
|
+
export { createDatePickerControl, formatDisplayDate, parseIso, toIsoString, type DateCell, type DatePickerControl, type DatePickerControlOptions, type DatePickerView, type MonthCell, type YearCell, } from './date-picker';
|
|
15
|
+
export { createDialogFocusControl, type DialogFocusControl, type DialogFocusControlOptions } from './dialog-focus';
|
|
16
|
+
export { getChoiceLabel, getLightChildrenByTag } from './light-dom';
|
|
17
|
+
export { toFiniteNumber, toFiniteNumberOr, toPositiveStep } from './numbers';
|
|
18
|
+
export { createDataGridControl, type DataGridColumn, type DataGridControl, type DataGridControlOptions, type SelectionMode, type SortDirection, type SortState, } from './datagrid';
|
|
19
|
+
export { createDropdownPositioner, type DropdownPositionerOptions, type OverlayPositioner } from './positioner';
|
|
20
|
+
export { createInteraction, dispatchKeyboardAction, type Interaction, type InteractionOptions, type KeyboardDispatchOptions, type PressTrigger, } from './keyboard';
|
|
21
|
+
export { createListControl, type ListControl, type ListNavigationOptions } from './nav';
|
|
22
|
+
export { createOverlayControl, type OverlayControlOptions } from './overlay';
|
|
23
|
+
export { createSelectionControl, type SelectionControl, type SelectionControlOptions } from './selection-control';
|
|
24
|
+
export { createSortControl, type SortControl, type SortControlOptions } from './sort-control';
|
|
25
|
+
export { createTypeahead, type Typeahead, type TypeaheadOptions } from './typeahead';
|
|
26
|
+
export { parseStringTriggers } from './parse';
|
|
27
|
+
export { syncedSignal } from './signals';
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/headless/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAGxC,OAAO,EACL,sBAAsB,EACtB,KAAK,SAAS,EACd,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGlH,OAAO,EACL,iBAAiB,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGxH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAG5G,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAGtE,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAGlG,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAG9F,OAAO,EACL,kBAAkB,EAClB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,QAAQ,EAAE,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAGtF,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,QAAQ,GACd,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,wBAAwB,EAAE,KAAK,kBAAkB,EAAE,KAAK,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAGnH,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG7E,OAAO,EACL,qBAAqB,EACrB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,SAAS,GACf,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,wBAAwB,EAAE,KAAK,yBAAyB,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAChH,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,KAAK,qBAAqB,EAAE,MAAM,OAAO,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAClH,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=(e,t)=>{if(t.disabled?.value)return!1;let n=Object.hasOwn(t.keymap,e.key)?t.keymap[e.key]:void 0;if(!n)return!1;let r=t.preventDefault??`before`;r===`before`&&e.preventDefault();let i=n(e)!==!1;return r===`after`&&i&&e.preventDefault(),i},t=t=>{let n=()=>!!t.disabled?.value,r=t.keys??[`Enter`,` `],i=Object.fromEntries(r.map(e=>[e,e=>t.onPress?.(e,`keyboard`)]));return{handleBlur:e=>{n()||t.onBlur?.(e)},handleClick:e=>n()?!1:(t.onPress?.(e,`pointer`),!0),handleFocus:e=>{n()||t.onFocus?.(e)},handleKeydown:n=>e(n,{disabled:t.disabled,keymap:i})}};exports.createInteraction=t,exports.dispatchKeyboardAction=e;
|
|
2
|
+
//# sourceMappingURL=keyboard.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyboard.cjs","names":[],"sources":["../../src/headless/keyboard.ts"],"sourcesContent":["import type { Readable } from '@vielzeug/ripple';\n\n// ── Keyboard dispatch ─────────────────────────────────────────────────────────\n\nexport type KeyboardDispatchOptions = {\n disabled?: Readable<boolean | undefined>;\n keymap: Record<string, (event: KeyboardEvent) => boolean | void>;\n preventDefault?: 'after' | 'before' | false;\n};\n\nexport const dispatchKeyboardAction = (event: KeyboardEvent, options: KeyboardDispatchOptions): boolean => {\n if (options.disabled?.value) return false;\n\n // `event.key` is attacker-influenceable on a synthetic KeyboardEvent (e.g. `new\n // KeyboardEvent('keydown', { key: '__proto__' })`). Guard with `Object.hasOwn` so a\n // crafted key name can never resolve to an inherited `Object.prototype` member\n // (`__proto__`, `constructor`, `toString`, …) instead of `undefined`.\n const action = Object.hasOwn(options.keymap, event.key) ? options.keymap[event.key] : undefined;\n\n if (!action) return false;\n\n const preventDefaultMode = options.preventDefault ?? 'before';\n\n if (preventDefaultMode === 'before') event.preventDefault();\n\n const handled = action(event) !== false;\n\n if (preventDefaultMode === 'after' && handled) event.preventDefault();\n\n return handled;\n};\n\n// ── Press control / Interaction ───────────────────────────────────────────────\n\nexport type PressTrigger = 'keyboard' | 'pointer';\n\n/**\n * Options for `createInteraction` — a unified press + focus/blur interaction\n * handler for accessible interactive elements.\n */\nexport type InteractionOptions = {\n /** `true` when the element is disabled. All handlers become no-ops. */\n disabled?: Readable<boolean | undefined>;\n /** Keys that trigger a press. Defaults to `['Enter', ' ']`. */\n keys?: string[];\n /** Called when the element loses focus. */\n onBlur?: (event: FocusEvent) => void;\n /** Called when the element receives focus. */\n onFocus?: (event: FocusEvent) => void;\n /** Called when the element is pressed via keyboard or pointer. */\n onPress?: (event: KeyboardEvent | MouseEvent, trigger: PressTrigger) => void;\n};\n\nexport type Interaction = {\n handleBlur: (event: FocusEvent) => void;\n handleClick: (event: MouseEvent) => boolean;\n handleFocus: (event: FocusEvent) => void;\n handleKeydown: (event: KeyboardEvent) => boolean;\n};\n\n/**\n * Creates a set of event handlers for an interactive element that responds to\n * keyboard and pointer presses, and optionally focus/blur events.\n *\n * @example\n * ```ts\n * const interaction = createInteraction({\n * disabled: props.disabled,\n * onPress: (event, trigger) => toggle(event),\n * onFocus: (event) => setFocused(true),\n * onBlur: (event) => setFocused(false),\n * });\n *\n * // In template:\n * // @click=\"${interaction.handleClick}\"\n * // @keydown=\"${interaction.handleKeydown}\"\n * // @focus=\"${interaction.handleFocus}\"\n * // @blur=\"${interaction.handleBlur}\"\n * ```\n */\nexport const createInteraction = (options: InteractionOptions): Interaction => {\n const isDisabled = (): boolean => Boolean(options.disabled?.value);\n const keyboardKeys = options.keys ?? ['Enter', ' '];\n const keymap = Object.fromEntries(\n keyboardKeys.map((key) => [key, (keyboardEvent: KeyboardEvent) => options.onPress?.(keyboardEvent, 'keyboard')]),\n );\n\n return {\n handleBlur: (event: FocusEvent): void => {\n if (!isDisabled()) options.onBlur?.(event);\n },\n handleClick: (event: MouseEvent): boolean => {\n if (isDisabled()) return false;\n\n options.onPress?.(event, 'pointer');\n\n return true;\n },\n handleFocus: (event: FocusEvent): void => {\n if (!isDisabled()) options.onFocus?.(event);\n },\n handleKeydown: (event: KeyboardEvent): boolean =>\n dispatchKeyboardAction(event, { disabled: options.disabled, keymap }),\n };\n};\n"],"mappings":"AAUA,IAAa,GAA0B,EAAsB,IAA8C,CACzG,GAAI,EAAQ,UAAU,MAAO,MAAO,GAMpC,IAAM,EAAS,OAAO,OAAO,EAAQ,OAAQ,EAAM,GAAG,EAAI,EAAQ,OAAO,EAAM,KAAO,IAAA,GAEtF,GAAI,CAAC,EAAQ,MAAO,GAEpB,IAAM,EAAqB,EAAQ,gBAAkB,SAEjD,IAAuB,UAAU,EAAM,eAAe,EAE1D,IAAM,EAAU,EAAO,CAAK,IAAM,GAIlC,OAFI,IAAuB,SAAW,GAAS,EAAM,eAAe,EAE7D,CACT,EAkDa,EAAqB,GAA6C,CAC7E,IAAM,MAA4B,EAAQ,EAAQ,UAAU,MACtD,EAAe,EAAQ,MAAQ,CAAC,QAAS,GAAG,EAC5C,EAAS,OAAO,YACpB,EAAa,IAAK,GAAQ,CAAC,EAAM,GAAiC,EAAQ,UAAU,EAAe,UAAU,CAAC,CAAC,CACjH,EAEA,MAAO,CACL,WAAa,GAA4B,CAClC,EAAW,GAAG,EAAQ,SAAS,CAAK,CAC3C,EACA,YAAc,GACR,EAAW,EAAU,IAEzB,EAAQ,UAAU,EAAO,SAAS,EAE3B,IAET,YAAc,GAA4B,CACnC,EAAW,GAAG,EAAQ,UAAU,CAAK,CAC5C,EACA,cAAgB,GACd,EAAuB,EAAO,CAAE,SAAU,EAAQ,SAAU,QAAO,CAAC,CACxE,CACF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Readable } from '@vielzeug/ripple';
|
|
2
|
+
export type KeyboardDispatchOptions = {
|
|
3
|
+
disabled?: Readable<boolean | undefined>;
|
|
4
|
+
keymap: Record<string, (event: KeyboardEvent) => boolean | void>;
|
|
5
|
+
preventDefault?: 'after' | 'before' | false;
|
|
6
|
+
};
|
|
7
|
+
export declare const dispatchKeyboardAction: (event: KeyboardEvent, options: KeyboardDispatchOptions) => boolean;
|
|
8
|
+
export type PressTrigger = 'keyboard' | 'pointer';
|
|
9
|
+
/**
|
|
10
|
+
* Options for `createInteraction` — a unified press + focus/blur interaction
|
|
11
|
+
* handler for accessible interactive elements.
|
|
12
|
+
*/
|
|
13
|
+
export type InteractionOptions = {
|
|
14
|
+
/** `true` when the element is disabled. All handlers become no-ops. */
|
|
15
|
+
disabled?: Readable<boolean | undefined>;
|
|
16
|
+
/** Keys that trigger a press. Defaults to `['Enter', ' ']`. */
|
|
17
|
+
keys?: string[];
|
|
18
|
+
/** Called when the element loses focus. */
|
|
19
|
+
onBlur?: (event: FocusEvent) => void;
|
|
20
|
+
/** Called when the element receives focus. */
|
|
21
|
+
onFocus?: (event: FocusEvent) => void;
|
|
22
|
+
/** Called when the element is pressed via keyboard or pointer. */
|
|
23
|
+
onPress?: (event: KeyboardEvent | MouseEvent, trigger: PressTrigger) => void;
|
|
24
|
+
};
|
|
25
|
+
export type Interaction = {
|
|
26
|
+
handleBlur: (event: FocusEvent) => void;
|
|
27
|
+
handleClick: (event: MouseEvent) => boolean;
|
|
28
|
+
handleFocus: (event: FocusEvent) => void;
|
|
29
|
+
handleKeydown: (event: KeyboardEvent) => boolean;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Creates a set of event handlers for an interactive element that responds to
|
|
33
|
+
* keyboard and pointer presses, and optionally focus/blur events.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* const interaction = createInteraction({
|
|
38
|
+
* disabled: props.disabled,
|
|
39
|
+
* onPress: (event, trigger) => toggle(event),
|
|
40
|
+
* onFocus: (event) => setFocused(true),
|
|
41
|
+
* onBlur: (event) => setFocused(false),
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* // In template:
|
|
45
|
+
* // @click="${interaction.handleClick}"
|
|
46
|
+
* // @keydown="${interaction.handleKeydown}"
|
|
47
|
+
* // @focus="${interaction.handleFocus}"
|
|
48
|
+
* // @blur="${interaction.handleBlur}"
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare const createInteraction: (options: InteractionOptions) => Interaction;
|
|
52
|
+
//# sourceMappingURL=keyboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/headless/keyboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,GAAG,IAAI,CAAC,CAAC;IACjE,cAAc,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;CAC7C,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,OAAO,aAAa,EAAE,SAAS,uBAAuB,KAAG,OAoB/F,CAAC;AAIF,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IACzC,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACrC,8CAA8C;IAC9C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,kEAAkE;IAClE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,EAAE,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;CAC9E,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,WAAW,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC;IAC5C,WAAW,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;CAClD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,iBAAiB,GAAI,SAAS,kBAAkB,KAAG,WAwB/D,CAAC"}
|