@vielzeug/buildit 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +124 -0
- package/dist/accordion-item.cjs +32 -0
- package/dist/accordion-item.cjs.map +1 -0
- package/dist/accordion-item.js +72 -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 +37 -0
- package/dist/accordion.js.map +1 -0
- package/dist/alert.cjs +31 -0
- package/dist/alert.cjs.map +1 -0
- package/dist/alert.js +85 -0
- package/dist/alert.js.map +1 -0
- package/dist/avatar.cjs +37 -0
- package/dist/avatar.cjs.map +1 -0
- package/dist/avatar.js +123 -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 +60 -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 +22 -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 +58 -0
- package/dist/breadcrumb.js.map +1 -0
- package/dist/buildit.cjs +1892 -0
- package/dist/buildit.cjs.map +1 -0
- package/dist/buildit.js +1892 -0
- package/dist/buildit.js.map +1 -0
- package/dist/button-group.cjs +6 -0
- package/dist/button-group.cjs.map +1 -0
- package/dist/button-group.js +31 -0
- package/dist/button-group.js.map +1 -0
- package/dist/button.cjs +30 -0
- package/dist/button.cjs.map +1 -0
- package/dist/button.js +115 -0
- package/dist/button.js.map +1 -0
- package/dist/card.cjs +23 -0
- package/dist/card.cjs.map +1 -0
- package/dist/card.js +99 -0
- package/dist/card.js.map +1 -0
- package/dist/checkbox-group.cjs +20 -0
- package/dist/checkbox-group.cjs.map +1 -0
- package/dist/checkbox-group.js +88 -0
- package/dist/checkbox-group.js.map +1 -0
- package/dist/checkbox.cjs +37 -0
- package/dist/checkbox.cjs.map +1 -0
- package/dist/checkbox.js +115 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chip.cjs +56 -0
- package/dist/chip.cjs.map +1 -0
- package/dist/chip.js +140 -0
- package/dist/chip.js.map +1 -0
- package/dist/combobox.cjs +93 -0
- package/dist/combobox.cjs.map +1 -0
- package/dist/combobox.js +401 -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 +78 -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 +36 -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 +66 -0
- package/dist/content/card/card.d.ts.map +1 -0
- package/dist/content/index.cjs +1 -0
- package/dist/content/index.d.ts +15 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +7 -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 +56 -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 +35 -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 +69 -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/craftit/dist/core/internal.cjs +2 -0
- package/dist/craftit/dist/core/internal.cjs.map +1 -0
- package/dist/craftit/dist/core/internal.js +25 -0
- package/dist/craftit/dist/core/internal.js.map +1 -0
- package/dist/craftit/dist/core/runtime-bindings.cjs +2 -0
- package/dist/craftit/dist/core/runtime-bindings.cjs.map +1 -0
- package/dist/craftit/dist/core/runtime-bindings.js +38 -0
- package/dist/craftit/dist/core/runtime-bindings.js.map +1 -0
- package/dist/craftit/dist/core/runtime-lifecycle.cjs +2 -0
- package/dist/craftit/dist/core/runtime-lifecycle.cjs.map +1 -0
- package/dist/craftit/dist/core/runtime-lifecycle.js +68 -0
- package/dist/craftit/dist/core/runtime-lifecycle.js.map +1 -0
- package/dist/craftit/dist/core/runtime.cjs +1 -0
- package/dist/craftit/dist/core/runtime.js +2 -0
- package/dist/craftit/dist/core/utilities.cjs +2 -0
- package/dist/craftit/dist/core/utilities.cjs.map +1 -0
- package/dist/craftit/dist/core/utilities.js +12 -0
- package/dist/craftit/dist/core/utilities.js.map +1 -0
- package/dist/craftit/dist/directives/attr.cjs +2 -0
- package/dist/craftit/dist/directives/attr.cjs.map +1 -0
- package/dist/craftit/dist/directives/attr.js +13 -0
- package/dist/craftit/dist/directives/attr.js.map +1 -0
- package/dist/craftit/dist/directives/bind.cjs +1 -0
- package/dist/craftit/dist/directives/bind.js +3 -0
- package/dist/craftit/dist/directives/choose.cjs +1 -0
- package/dist/craftit/dist/directives/choose.js +1 -0
- package/dist/craftit/dist/directives/classes.cjs +2 -0
- package/dist/craftit/dist/directives/classes.cjs.map +1 -0
- package/dist/craftit/dist/directives/classes.js +12 -0
- package/dist/craftit/dist/directives/classes.js.map +1 -0
- package/dist/craftit/dist/directives/each.cjs +2 -0
- package/dist/craftit/dist/directives/each.cjs.map +1 -0
- package/dist/craftit/dist/directives/each.js +96 -0
- package/dist/craftit/dist/directives/each.js.map +1 -0
- package/dist/craftit/dist/directives/index.cjs +1 -0
- package/dist/craftit/dist/directives/index.js +12 -0
- package/dist/craftit/dist/directives/match.cjs +1 -0
- package/dist/craftit/dist/directives/match.js +1 -0
- package/dist/craftit/dist/directives/memo.cjs +1 -0
- package/dist/craftit/dist/directives/memo.js +1 -0
- package/dist/craftit/dist/directives/raw.cjs +1 -0
- package/dist/craftit/dist/directives/raw.js +2 -0
- package/dist/craftit/dist/directives/spread.cjs +2 -0
- package/dist/craftit/dist/directives/spread.cjs.map +1 -0
- package/dist/craftit/dist/directives/spread.js +30 -0
- package/dist/craftit/dist/directives/spread.js.map +1 -0
- package/dist/craftit/dist/directives/style.cjs +1 -0
- package/dist/craftit/dist/directives/style.js +1 -0
- package/dist/craftit/dist/directives/until.cjs +1 -0
- package/dist/craftit/dist/directives/until.js +1 -0
- package/dist/craftit/dist/directives/when.cjs +2 -0
- package/dist/craftit/dist/directives/when.cjs.map +1 -0
- package/dist/craftit/dist/directives/when.js +14 -0
- package/dist/craftit/dist/directives/when.js.map +1 -0
- package/dist/craftit/dist/labs/a11y.cjs +2 -0
- package/dist/craftit/dist/labs/a11y.cjs.map +1 -0
- package/dist/craftit/dist/labs/a11y.js +38 -0
- package/dist/craftit/dist/labs/a11y.js.map +1 -0
- package/dist/craftit/dist/labs/list.cjs +2 -0
- package/dist/craftit/dist/labs/list.cjs.map +1 -0
- package/dist/craftit/dist/labs/list.js +87 -0
- package/dist/craftit/dist/labs/list.js.map +1 -0
- package/dist/craftit/dist/labs/observers.cjs +2 -0
- package/dist/craftit/dist/labs/observers.cjs.map +1 -0
- package/dist/craftit/dist/labs/observers.js +28 -0
- package/dist/craftit/dist/labs/observers.js.map +1 -0
- package/dist/craftit/dist/labs/overlay.cjs +2 -0
- package/dist/craftit/dist/labs/overlay.cjs.map +1 -0
- package/dist/craftit/dist/labs/overlay.js +49 -0
- package/dist/craftit/dist/labs/overlay.js.map +1 -0
- package/dist/craftit/dist/labs/selectable.cjs +2 -0
- package/dist/craftit/dist/labs/selectable.cjs.map +1 -0
- package/dist/craftit/dist/labs/selectable.js +29 -0
- package/dist/craftit/dist/labs/selectable.js.map +1 -0
- package/dist/craftit/dist/labs/selection.cjs +2 -0
- package/dist/craftit/dist/labs/selection.cjs.map +1 -0
- package/dist/craftit/dist/labs/selection.js +42 -0
- package/dist/craftit/dist/labs/selection.js.map +1 -0
- package/dist/craftit/dist/labs.cjs +1 -0
- package/dist/craftit/dist/labs.js +6 -0
- package/dist/custom-elements.json +2321 -0
- package/dist/dialog.cjs +33 -0
- package/dist/dialog.cjs.map +1 -0
- package/dist/dialog.js +94 -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 +47 -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 +62 -0
- package/dist/disclosure/accordion-item/accordion-item.d.ts.map +1 -0
- package/dist/disclosure/index.cjs +1 -0
- package/dist/disclosure/index.d.ts +11 -0
- package/dist/disclosure/index.d.ts.map +1 -0
- package/dist/disclosure/index.js +5 -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 +39 -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 +30 -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 +64 -0
- package/dist/disclosure/tabs/tabs.d.ts.map +1 -0
- package/dist/drawer.cjs +31 -0
- package/dist/drawer.cjs.map +1 -0
- package/dist/drawer.js +98 -0
- package/dist/drawer.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 +63 -0
- package/dist/feedback/alert/alert.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 +67 -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 +124 -0
- package/dist/feedback/chip/chip.d.ts.map +1 -0
- package/dist/feedback/index.cjs +1 -0
- package/dist/feedback/index.d.ts +13 -0
- package/dist/feedback/index.d.ts.map +1 -0
- package/dist/feedback/index.js +6 -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 +64 -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 +61 -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 +95 -0
- package/dist/feedback/toast/toast.d.ts.map +1 -0
- package/dist/file-input.cjs +66 -0
- package/dist/file-input.cjs.map +1 -0
- package/dist/file-input.js +210 -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 +49 -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 +28 -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/icons.cjs +176 -0
- package/dist/icons.cjs.map +1 -0
- package/dist/icons.d.ts +15 -0
- package/dist/icons.d.ts.map +1 -0
- package/dist/icons.js +181 -0
- package/dist/icons.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 +53 -0
- package/dist/input.cjs +48 -0
- package/dist/input.cjs.map +1 -0
- package/dist/input.js +182 -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 +73 -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 +52 -0
- package/dist/inputs/button-group/button-group.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 +43 -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 +56 -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 +7 -0
- package/dist/inputs/combobox/combobox-options.d.ts.map +1 -0
- package/dist/inputs/combobox/combobox-options.js +36 -0
- package/dist/inputs/combobox/combobox-options.js.map +1 -0
- package/dist/inputs/combobox/combobox-virtualizer.cjs +2 -0
- package/dist/inputs/combobox/combobox-virtualizer.cjs.map +1 -0
- package/dist/inputs/combobox/combobox-virtualizer.d.ts +20 -0
- package/dist/inputs/combobox/combobox-virtualizer.d.ts.map +1 -0
- package/dist/inputs/combobox/combobox-virtualizer.js +71 -0
- package/dist/inputs/combobox/combobox-virtualizer.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 +28 -0
- package/dist/inputs/combobox/combobox.d.ts.map +1 -0
- package/dist/inputs/combobox/combobox.types.d.ts +36 -0
- package/dist/inputs/combobox/combobox.types.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 +94 -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 +61 -0
- package/dist/inputs/form/form.d.ts.map +1 -0
- package/dist/inputs/index.cjs +1 -0
- package/dist/inputs/index.d.ts +38 -0
- package/dist/inputs/index.d.ts.map +1 -0
- package/dist/inputs/index.js +18 -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 +82 -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 +76 -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 +71 -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 +41 -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 +61 -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 +48 -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 +79 -0
- package/dist/inputs/select/select.d.ts.map +1 -0
- package/dist/inputs/shared/base-props.d.ts +39 -0
- package/dist/inputs/shared/base-props.d.ts.map +1 -0
- package/dist/inputs/shared/composables/index.cjs +1 -0
- package/dist/inputs/shared/composables/index.d.ts +3 -0
- package/dist/inputs/shared/composables/index.d.ts.map +1 -0
- package/dist/inputs/shared/composables/index.js +2 -0
- package/dist/inputs/shared/composables/use-text-field.cjs +2 -0
- package/dist/inputs/shared/composables/use-text-field.cjs.map +1 -0
- package/dist/inputs/shared/composables/use-text-field.d.ts +33 -0
- package/dist/inputs/shared/composables/use-text-field.d.ts.map +1 -0
- package/dist/inputs/shared/composables/use-text-field.js +41 -0
- package/dist/inputs/shared/composables/use-text-field.js.map +1 -0
- package/dist/inputs/shared/composables/use-toggle-field.cjs +2 -0
- package/dist/inputs/shared/composables/use-toggle-field.cjs.map +1 -0
- package/dist/inputs/shared/composables/use-toggle-field.d.ts +18 -0
- package/dist/inputs/shared/composables/use-toggle-field.d.ts.map +1 -0
- package/dist/inputs/shared/composables/use-toggle-field.js +26 -0
- package/dist/inputs/shared/composables/use-toggle-field.js.map +1 -0
- package/dist/inputs/shared/design-presets.cjs +2 -0
- package/dist/inputs/shared/design-presets.cjs.map +1 -0
- package/dist/inputs/shared/design-presets.d.ts +97 -0
- package/dist/inputs/shared/design-presets.d.ts.map +1 -0
- package/dist/inputs/shared/design-presets.js +92 -0
- package/dist/inputs/shared/design-presets.js.map +1 -0
- package/dist/inputs/shared/dom-sync/dropdown.cjs +2 -0
- package/dist/inputs/shared/dom-sync/dropdown.cjs.map +1 -0
- package/dist/inputs/shared/dom-sync/dropdown.d.ts +7 -0
- package/dist/inputs/shared/dom-sync/dropdown.d.ts.map +1 -0
- package/dist/inputs/shared/dom-sync/dropdown.js +30 -0
- package/dist/inputs/shared/dom-sync/dropdown.js.map +1 -0
- package/dist/inputs/shared/dom-sync/field-sync.cjs +2 -0
- package/dist/inputs/shared/dom-sync/field-sync.cjs.map +1 -0
- package/dist/inputs/shared/dom-sync/field-sync.d.ts +36 -0
- package/dist/inputs/shared/dom-sync/field-sync.d.ts.map +1 -0
- package/dist/inputs/shared/dom-sync/field-sync.js +37 -0
- package/dist/inputs/shared/dom-sync/field-sync.js.map +1 -0
- package/dist/inputs/shared/dom-sync/form-context.cjs +2 -0
- package/dist/inputs/shared/dom-sync/form-context.cjs.map +1 -0
- package/dist/inputs/shared/dom-sync/form-context.d.ts +18 -0
- package/dist/inputs/shared/dom-sync/form-context.d.ts.map +1 -0
- package/dist/inputs/shared/dom-sync/form-context.js +20 -0
- package/dist/inputs/shared/dom-sync/form-context.js.map +1 -0
- package/dist/inputs/shared/dom-sync/index.cjs +1 -0
- package/dist/inputs/shared/dom-sync/index.d.ts +5 -0
- package/dist/inputs/shared/dom-sync/index.d.ts.map +1 -0
- package/dist/inputs/shared/dom-sync/index.js +4 -0
- package/dist/inputs/shared/dom-sync/label-sync.cjs +2 -0
- package/dist/inputs/shared/dom-sync/label-sync.cjs.map +1 -0
- package/dist/inputs/shared/dom-sync/label-sync.d.ts +16 -0
- package/dist/inputs/shared/dom-sync/label-sync.d.ts.map +1 -0
- package/dist/inputs/shared/dom-sync/label-sync.js +12 -0
- package/dist/inputs/shared/dom-sync/label-sync.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 +19 -0
- package/dist/inputs/shared/form-context.d.ts.map +1 -0
- package/dist/inputs/shared/form-context.js +7 -0
- package/dist/inputs/shared/form-context.js.map +1 -0
- package/dist/inputs/shared/utils/assistive-text.cjs +2 -0
- package/dist/inputs/shared/utils/assistive-text.cjs.map +1 -0
- package/dist/inputs/shared/utils/assistive-text.d.ts +24 -0
- package/dist/inputs/shared/utils/assistive-text.d.ts.map +1 -0
- package/dist/inputs/shared/utils/assistive-text.js +37 -0
- package/dist/inputs/shared/utils/assistive-text.js.map +1 -0
- package/dist/inputs/shared/utils/choice-change.cjs +2 -0
- package/dist/inputs/shared/utils/choice-change.cjs.map +1 -0
- package/dist/inputs/shared/utils/choice-change.d.ts +8 -0
- package/dist/inputs/shared/utils/choice-change.d.ts.map +1 -0
- package/dist/inputs/shared/utils/choice-change.js +13 -0
- package/dist/inputs/shared/utils/choice-change.js.map +1 -0
- package/dist/inputs/shared/utils/controlled-csv.cjs +2 -0
- package/dist/inputs/shared/utils/controlled-csv.cjs.map +1 -0
- package/dist/inputs/shared/utils/controlled-csv.d.ts +8 -0
- package/dist/inputs/shared/utils/controlled-csv.d.ts.map +1 -0
- package/dist/inputs/shared/utils/controlled-csv.js +15 -0
- package/dist/inputs/shared/utils/controlled-csv.js.map +1 -0
- package/dist/inputs/shared/utils/field-values.cjs +2 -0
- package/dist/inputs/shared/utils/field-values.cjs.map +1 -0
- package/dist/inputs/shared/utils/field-values.d.ts +5 -0
- package/dist/inputs/shared/utils/field-values.d.ts.map +1 -0
- package/dist/inputs/shared/utils/field-values.js +13 -0
- package/dist/inputs/shared/utils/field-values.js.map +1 -0
- package/dist/inputs/shared/utils/index.d.ts +5 -0
- package/dist/inputs/shared/utils/index.d.ts.map +1 -0
- package/dist/inputs/shared/validation/index.cjs +2 -0
- package/dist/inputs/shared/validation/index.cjs.map +1 -0
- package/dist/inputs/shared/validation/index.d.ts +14 -0
- package/dist/inputs/shared/validation/index.d.ts.map +1 -0
- package/dist/inputs/shared/validation/index.js +13 -0
- package/dist/inputs/shared/validation/index.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 +82 -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 +40 -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 +57 -0
- package/dist/inputs/textarea/textarea.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 +47 -0
- package/dist/layout/grid-item/grid-item.d.ts.map +1 -0
- package/dist/layout/index.cjs +1 -0
- package/dist/layout/index.d.ts +9 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +4 -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 +190 -0
- package/dist/layout/sidebar/sidebar.d.ts.map +1 -0
- package/dist/menu.cjs +133 -0
- package/dist/menu.cjs.map +1 -0
- package/dist/menu.js +296 -0
- package/dist/menu.js.map +1 -0
- package/dist/number-input.cjs +55 -0
- package/dist/number-input.cjs.map +1 -0
- package/dist/number-input.js +158 -0
- package/dist/number-input.js.map +1 -0
- package/dist/otp-input.cjs +22 -0
- package/dist/otp-input.cjs.map +1 -0
- package/dist/otp-input.js +120 -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 +98 -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 +98 -0
- package/dist/overlay/drawer/drawer.d.ts.map +1 -0
- package/dist/overlay/index.cjs +1 -0
- package/dist/overlay/index.d.ts +11 -0
- package/dist/overlay/index.d.ts.map +1 -0
- package/dist/overlay/index.js +5 -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 +45 -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/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 +55 -0
- package/dist/overlay/tooltip/tooltip.d.ts.map +1 -0
- package/dist/pagination.cjs +102 -0
- package/dist/pagination.cjs.map +1 -0
- package/dist/pagination.js +168 -0
- package/dist/pagination.js.map +1 -0
- package/dist/popover.cjs +16 -0
- package/dist/popover.cjs.map +1 -0
- package/dist/popover.js +110 -0
- package/dist/popover.js.map +1 -0
- package/dist/progress.cjs +51 -0
- package/dist/progress.cjs.map +1 -0
- package/dist/progress.js +90 -0
- package/dist/progress.js.map +1 -0
- package/dist/radio-group.cjs +20 -0
- package/dist/radio-group.cjs.map +1 -0
- package/dist/radio-group.js +104 -0
- package/dist/radio-group.js.map +1 -0
- package/dist/radio.cjs +16 -0
- package/dist/radio.cjs.map +1 -0
- package/dist/radio.js +135 -0
- package/dist/radio.js.map +1 -0
- package/dist/rating.cjs +37 -0
- package/dist/rating.cjs.map +1 -0
- package/dist/rating.js +123 -0
- package/dist/rating.js.map +1 -0
- package/dist/select.cjs +77 -0
- package/dist/select.cjs.map +1 -0
- package/dist/select.js +317 -0
- package/dist/select.js.map +1 -0
- package/dist/separator.cjs +26 -0
- package/dist/separator.cjs.map +1 -0
- package/dist/separator.js +46 -0
- package/dist/separator.js.map +1 -0
- package/dist/sidebar.cjs +69 -0
- package/dist/sidebar.cjs.map +1 -0
- package/dist/sidebar.js +202 -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 +56 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/slider.cjs +24 -0
- package/dist/slider.cjs.map +1 -0
- package/dist/slider.js +209 -0
- package/dist/slider.js.map +1 -0
- package/dist/stateit/dist/computed.cjs +2 -0
- package/dist/stateit/dist/computed.cjs.map +1 -0
- package/dist/stateit/dist/computed.js +65 -0
- package/dist/stateit/dist/computed.js.map +1 -0
- package/dist/stateit/dist/effect.cjs +2 -0
- package/dist/stateit/dist/effect.cjs.map +1 -0
- package/dist/stateit/dist/effect.js +53 -0
- package/dist/stateit/dist/effect.js.map +1 -0
- package/dist/stateit/dist/index.cjs +1 -0
- package/dist/stateit/dist/index.js +5 -0
- package/dist/stateit/dist/runtime.cjs +2 -0
- package/dist/stateit/dist/runtime.cjs.map +1 -0
- package/dist/stateit/dist/runtime.js +43 -0
- package/dist/stateit/dist/runtime.js.map +1 -0
- package/dist/stateit/dist/signal.cjs +2 -0
- package/dist/stateit/dist/signal.cjs.map +1 -0
- package/dist/stateit/dist/signal.js +27 -0
- package/dist/stateit/dist/signal.js.map +1 -0
- package/dist/stateit/dist/store.cjs +2 -0
- package/dist/stateit/dist/store.cjs.map +1 -0
- package/dist/stateit/dist/store.js +17 -0
- package/dist/stateit/dist/store.js.map +1 -0
- package/dist/stateit/dist/types.cjs +2 -0
- package/dist/stateit/dist/types.cjs.map +1 -0
- package/dist/stateit/dist/types.js +6 -0
- package/dist/stateit/dist/types.js.map +1 -0
- package/dist/styles/animation.css +87 -0
- package/dist/styles/index.cjs +2 -0
- package/dist/styles/index.cjs.map +1 -0
- package/dist/styles/index.d.ts +48 -0
- package/dist/styles/index.d.ts.map +1 -0
- package/dist/styles/index.js +26 -0
- package/dist/styles/index.js.map +1 -0
- package/dist/styles/layer.css +18 -0
- package/dist/styles/mixins/accessibility.css.cjs +15 -0
- package/dist/styles/mixins/accessibility.css.cjs.map +1 -0
- package/dist/styles/mixins/accessibility.css.d.ts +46 -0
- package/dist/styles/mixins/accessibility.css.d.ts.map +1 -0
- package/dist/styles/mixins/accessibility.css.js +20 -0
- package/dist/styles/mixins/accessibility.css.js.map +1 -0
- package/dist/styles/mixins/animation.css.cjs +71 -0
- package/dist/styles/mixins/animation.css.cjs.map +1 -0
- package/dist/styles/mixins/animation.css.d.ts +22 -0
- package/dist/styles/mixins/animation.css.d.ts.map +1 -0
- package/dist/styles/mixins/animation.css.js +90 -0
- package/dist/styles/mixins/animation.css.js.map +1 -0
- package/dist/styles/mixins/shape.css.cjs +72 -0
- package/dist/styles/mixins/shape.css.cjs.map +1 -0
- package/dist/styles/mixins/shape.css.d.ts +97 -0
- package/dist/styles/mixins/shape.css.d.ts.map +1 -0
- package/dist/styles/mixins/shape.css.js +104 -0
- package/dist/styles/mixins/shape.css.js.map +1 -0
- package/dist/styles/mixins/states.css.cjs +18 -0
- package/dist/styles/mixins/states.css.cjs.map +1 -0
- package/dist/styles/mixins/states.css.d.ts +61 -0
- package/dist/styles/mixins/states.css.d.ts.map +1 -0
- package/dist/styles/mixins/states.css.js +26 -0
- package/dist/styles/mixins/states.css.js.map +1 -0
- package/dist/styles/mixins/theme.css.cjs +146 -0
- package/dist/styles/mixins/theme.css.cjs.map +1 -0
- package/dist/styles/mixins/theme.css.d.ts +93 -0
- package/dist/styles/mixins/theme.css.d.ts.map +1 -0
- package/dist/styles/mixins/theme.css.js +151 -0
- package/dist/styles/mixins/theme.css.js.map +1 -0
- package/dist/styles/mixins/variants.css.cjs +84 -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 +89 -0
- package/dist/styles/mixins/variants.css.js.map +1 -0
- package/dist/styles/preflight.css +237 -0
- package/dist/styles/styles.css +5 -0
- package/dist/styles/theme.css +457 -0
- package/dist/switch.cjs +16 -0
- package/dist/switch.cjs.map +1 -0
- package/dist/switch.js +82 -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 +57 -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 +51 -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 +98 -0
- package/dist/tabs.js.map +1 -0
- package/dist/text.cjs +2 -0
- package/dist/text.cjs.map +1 -0
- package/dist/text.js +30 -0
- package/dist/text.js.map +1 -0
- package/dist/textarea.cjs +16 -0
- package/dist/textarea.cjs.map +1 -0
- package/dist/textarea.js +122 -0
- package/dist/textarea.js.map +1 -0
- package/dist/toast.cjs +63 -0
- package/dist/toast.cjs.map +1 -0
- package/dist/toast.js +221 -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 +111 -0
- package/dist/tooltip.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/shared.d.ts +120 -0
- package/dist/types/shared.d.ts.map +1 -0
- package/dist/utils/animation.cjs +2 -0
- package/dist/utils/animation.cjs.map +1 -0
- package/dist/utils/animation.d.ts +2 -0
- package/dist/utils/animation.d.ts.map +1 -0
- package/dist/utils/animation.js +29 -0
- package/dist/utils/animation.js.map +1 -0
- package/dist/utils/background-lock.cjs +2 -0
- package/dist/utils/background-lock.cjs.map +1 -0
- package/dist/utils/background-lock.d.ts +20 -0
- package/dist/utils/background-lock.d.ts.map +1 -0
- package/dist/utils/background-lock.js +21 -0
- package/dist/utils/background-lock.js.map +1 -0
- package/dist/utils/index.cjs +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/use-overlay.cjs +2 -0
- package/dist/utils/use-overlay.cjs.map +1 -0
- package/dist/utils/use-overlay.d.ts +26 -0
- package/dist/utils/use-overlay.d.ts.map +1 -0
- package/dist/utils/use-overlay.js +34 -0
- package/dist/utils/use-overlay.js.map +1 -0
- package/dist/virtualit/dist/dom/dom.cjs +2 -0
- package/dist/virtualit/dist/dom/dom.cjs.map +1 -0
- package/dist/virtualit/dist/dom/dom.js +47 -0
- package/dist/virtualit/dist/dom/dom.js.map +1 -0
- package/dist/virtualit/dist/dom.cjs +1 -0
- package/dist/virtualit/dist/dom.js +2 -0
- package/dist/virtualit/dist/virtualit.cjs +2 -0
- package/dist/virtualit/dist/virtualit.cjs.map +1 -0
- package/dist/virtualit/dist/virtualit.js +129 -0
- package/dist/virtualit/dist/virtualit.js.map +1 -0
- package/package.json +282 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radio.cjs","names":[],"sources":["../src/inputs/radio/radio.ts"],"sourcesContent":["import { computed, defineComponent, defineField, html, inject, signal, watch } from '@vielzeug/craftit';\nimport { useA11yControl, createCheckableControl } from '@vielzeug/craftit/labs';\n\nimport type { CheckableProps, DisablableProps, SizableProps, ThemableProps } from '../../types';\n\nimport { coarsePointerMixin, formControlMixins, sizeVariantMixin } from '../../styles';\nimport { RADIO_GROUP_CTX } from '../radio-group/radio-group';\nimport { CONTROL_SIZE_PRESET } from '../shared/design-presets';\nimport { mountFormContextSync } from '../shared/dom-sync';\nimport { FORM_CTX } from '../shared/form-context';\nimport componentStyles from './radio.css?inline';\n\n/** Radio component properties */\n\nexport type BitRadioEvents = {\n change: { checked: boolean; fieldValue: string; originalEvent?: Event; value: boolean };\n};\n\nexport type BitRadioProps = CheckableProps &\n ThemableProps &\n SizableProps &\n DisablableProps & {\n /** Error message (marks field as invalid) */\n error?: string;\n /** Helper text displayed below the radio */\n helper?: string;\n };\n\n/**\n * A customizable radio button component for mutually exclusive selections.\n *\n * @element bit-radio\n *\n * @attr {boolean} checked - Checked state\n * @attr {boolean} disabled - Disable radio interaction\n * @attr {string} value - Field value (required for radio groups)\n * @attr {string} name - Form field name (required for radio groups)\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - Radio size: 'sm' | 'md' | 'lg'\n * @attr {string} error - Error message (marks field as invalid)\n * @attr {string} helper - Helper text displayed below the radio\n *\n * @fires change - Emitted when radio is selected. detail: { value: boolean, checked: boolean, fieldValue: string, originalEvent?: Event }\n *\n * @slot - Radio button label text\n *\n * @part radio - The radio wrapper element\n * @part circle - The visual radio circle\n * @part label - The label element\n * @part helper-text - The helper/error text element\n */\nexport const RADIO_TAG = defineComponent<BitRadioProps, BitRadioEvents>({\n formAssociated: true,\n props: {\n checked: { default: false },\n color: { default: undefined },\n disabled: { default: false },\n error: { default: '' },\n helper: { default: '' },\n name: { default: '' },\n size: { default: undefined },\n value: { default: '' },\n },\n setup({ emit, host, props, reflect }) {\n const groupCtx = inject(RADIO_GROUP_CTX, undefined);\n const formCtx = inject(FORM_CTX, undefined);\n\n const effectiveName = computed(() => groupCtx?.name.value || props.name.value || '');\n const effectiveSize = computed(() => groupCtx?.size.value ?? props.size.value);\n const effectiveColor = computed(() => groupCtx?.color.value ?? props.color.value);\n const effectiveDisabled = computed(() => Boolean(groupCtx?.disabled.value || props.disabled.value));\n\n mountFormContextSync(host, formCtx, props);\n\n // Local signal — source of truth for checked state.\n // Driven by group context when inside a radio-group, otherwise by the checked prop.\n const checkedSignal = signal(Boolean(props.checked.value));\n\n if (groupCtx) {\n watch(\n computed(() => groupCtx.value.value === props.value.value),\n (isChecked) => {\n checkedSignal.value = isChecked;\n },\n { immediate: true },\n );\n } else {\n watch(\n props.checked,\n (v) => {\n checkedSignal.value = Boolean(v);\n },\n { immediate: true },\n );\n }\n\n const control = createCheckableControl({\n checked: checkedSignal,\n disabled: props.disabled,\n onToggle: (e) => {\n emit('change', {\n checked: control.checked.value,\n fieldValue: props.value.value ?? '',\n originalEvent: e,\n value: control.checked.value,\n });\n },\n value: props.value,\n });\n\n defineField(\n {\n disabled: effectiveDisabled,\n toFormValue: (v: string | null) => v,\n value: computed(() => (checkedSignal.value ? (props.value.value ?? '') : null)),\n },\n {\n onReset: () => {\n checkedSignal.value = Boolean(props.checked.value);\n },\n },\n );\n\n const getRadioGroup = (): HTMLElement[] => {\n const radioName = effectiveName.value;\n\n if (!radioName) return [];\n\n return Array.from(document.querySelectorAll<HTMLElement>(`bit-radio[name=\"${radioName}\"]`)).filter(\n (r) => !r.hasAttribute('disabled'),\n );\n };\n\n const a11y = useA11yControl(host, {\n checked: () => (control.checked.value ? 'true' : 'false'),\n helperText: () => props.error.value || props.helper.value,\n helperTone: () => (props.error.value ? 'error' : 'default'),\n invalid: () => !!props.error.value,\n role: 'radio',\n });\n\n reflect({\n checked: () => control.checked.value,\n classMap: () => ({\n 'is-checked': control.checked.value,\n 'is-disabled': effectiveDisabled.value,\n }),\n color: () => effectiveColor.value,\n disabled: () => (effectiveDisabled.value ? true : undefined),\n name: () => effectiveName.value || undefined,\n onClick: (e: Event) => {\n if (effectiveDisabled.value) return;\n\n if (groupCtx) {\n groupCtx.select(props.value.value ?? '', e);\n } else {\n // For non-grouped radios, require a name attribute\n // (radios should be part of a group, either via radio-group or via name)\n if (!effectiveName.value) return;\n\n // Only toggle if not already checked\n // (radio buttons can only be checked, never unchecked by clicking)\n if (!control.checked.value) {\n // Uncheck all other radios with the same name\n const radioName = props.name.value;\n const allRadios = document.querySelectorAll<HTMLElement>(`bit-radio[name=\"${radioName}\"]`);\n\n allRadios.forEach((radio) => {\n if (radio !== host) {\n radio.removeAttribute('checked');\n }\n });\n\n control.toggle(e);\n }\n }\n },\n onKeydown: (e: Event) => {\n const ke = e as KeyboardEvent;\n const radios = getRadioGroup();\n\n if (radios.length === 0) return;\n\n const currentIndex = radios.indexOf(host);\n\n if (currentIndex === -1) return;\n\n if (ke.key === ' ' || ke.key === 'Enter') {\n ke.preventDefault();\n\n if (!control.checked.value) {\n if (groupCtx) {\n groupCtx.select(props.value.value ?? '', ke);\n } else {\n control.toggle(ke);\n }\n }\n } else if (ke.key === 'ArrowDown' || ke.key === 'ArrowRight') {\n ke.preventDefault();\n\n const nextIndex = (currentIndex + 1) % radios.length;\n const nextRadio = radios[nextIndex];\n\n nextRadio.focus();\n\n if (groupCtx) {\n groupCtx.select(nextRadio.getAttribute('value') ?? '');\n } else {\n // For non-grouped radios, trigger the select on the focused radio\n nextRadio.click();\n }\n } else if (ke.key === 'ArrowUp' || ke.key === 'ArrowLeft') {\n ke.preventDefault();\n\n const prevIndex = currentIndex === 0 ? radios.length - 1 : currentIndex - 1;\n const prevRadio = radios[prevIndex];\n\n prevRadio.focus();\n\n if (groupCtx) {\n groupCtx.select(prevRadio.getAttribute('value') ?? '');\n } else {\n // For non-grouped radios, trigger the select on the focused radio\n prevRadio.click();\n }\n }\n },\n size: () => effectiveSize.value,\n tabindex: () => {\n if (effectiveDisabled.value) return undefined;\n\n return control.checked.value ? 0 : -1;\n },\n });\n\n return html`\n <div class=\"radio-wrapper\" part=\"radio\">\n <div class=\"circle\" part=\"circle\">\n <div class=\"dot\" part=\"dot\"></div>\n </div>\n </div>\n <span class=\"label\" part=\"label\" data-a11y-label id=\"${a11y.labelId}\"><slot></slot></span>\n <div\n class=\"helper-text\"\n part=\"helper-text\"\n data-a11y-helper\n id=\"${a11y.helperId}\"\n aria-live=\"polite\"\n hidden></div>\n `;\n },\n styles: [...formControlMixins, coarsePointerMixin, sizeVariantMixin(CONTROL_SIZE_PRESET), componentStyles],\n tag: 'bit-radio',\n});\n"],"mappings":"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"}
|
package/dist/radio.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { coarsePointerMixin as e } from "./styles/mixins/accessibility.css.js";
|
|
2
|
+
import { sizeVariantMixin as t } from "./styles/mixins/shape.css.js";
|
|
3
|
+
import { formControlMixins as n } from "./styles/index.js";
|
|
4
|
+
import { r } from "./craftit/dist/labs/a11y.js";
|
|
5
|
+
import { t as i } from "./craftit/dist/labs/selectable.js";
|
|
6
|
+
import "./craftit/dist/labs.js";
|
|
7
|
+
import { FORM_CTX as a } from "./inputs/shared/form-context.js";
|
|
8
|
+
import { mountFormContextSync as o } from "./inputs/shared/dom-sync/form-context.js";
|
|
9
|
+
import "./inputs/shared/dom-sync/index.js";
|
|
10
|
+
import { CONTROL_SIZE_PRESET as s } from "./inputs/shared/design-presets.js";
|
|
11
|
+
import { RADIO_GROUP_CTX as c } from "./radio-group.js";
|
|
12
|
+
import l from "./inputs/radio/radio.css?inline.js";
|
|
13
|
+
import { computed as u, defineComponent as d, defineField as f, html as p, inject as m, signal as h, watch as g } from "@vielzeug/craftit";
|
|
14
|
+
//#region src/inputs/radio/radio.ts
|
|
15
|
+
var _ = d({
|
|
16
|
+
formAssociated: !0,
|
|
17
|
+
props: {
|
|
18
|
+
checked: { default: !1 },
|
|
19
|
+
color: { default: void 0 },
|
|
20
|
+
disabled: { default: !1 },
|
|
21
|
+
error: { default: "" },
|
|
22
|
+
helper: { default: "" },
|
|
23
|
+
name: { default: "" },
|
|
24
|
+
size: { default: void 0 },
|
|
25
|
+
value: { default: "" }
|
|
26
|
+
},
|
|
27
|
+
setup({ emit: e, host: t, props: n, reflect: s }) {
|
|
28
|
+
let l = m(c, void 0), d = m(a, void 0), _ = u(() => l?.name.value || n.name.value || ""), v = u(() => l?.size.value ?? n.size.value), y = u(() => l?.color.value ?? n.color.value), b = u(() => !!(l?.disabled.value || n.disabled.value));
|
|
29
|
+
o(t, d, n);
|
|
30
|
+
let x = h(!!n.checked.value);
|
|
31
|
+
l ? g(u(() => l.value.value === n.value.value), (e) => {
|
|
32
|
+
x.value = e;
|
|
33
|
+
}, { immediate: !0 }) : g(n.checked, (e) => {
|
|
34
|
+
x.value = !!e;
|
|
35
|
+
}, { immediate: !0 });
|
|
36
|
+
let S = i({
|
|
37
|
+
checked: x,
|
|
38
|
+
disabled: n.disabled,
|
|
39
|
+
onToggle: (t) => {
|
|
40
|
+
e("change", {
|
|
41
|
+
checked: S.checked.value,
|
|
42
|
+
fieldValue: n.value.value ?? "",
|
|
43
|
+
originalEvent: t,
|
|
44
|
+
value: S.checked.value
|
|
45
|
+
});
|
|
46
|
+
},
|
|
47
|
+
value: n.value
|
|
48
|
+
});
|
|
49
|
+
f({
|
|
50
|
+
disabled: b,
|
|
51
|
+
toFormValue: (e) => e,
|
|
52
|
+
value: u(() => x.value ? n.value.value ?? "" : null)
|
|
53
|
+
}, { onReset: () => {
|
|
54
|
+
x.value = !!n.checked.value;
|
|
55
|
+
} });
|
|
56
|
+
let C = () => {
|
|
57
|
+
let e = _.value;
|
|
58
|
+
return e ? Array.from(document.querySelectorAll(`bit-radio[name="${e}"]`)).filter((e) => !e.hasAttribute("disabled")) : [];
|
|
59
|
+
}, w = r(t, {
|
|
60
|
+
checked: () => S.checked.value ? "true" : "false",
|
|
61
|
+
helperText: () => n.error.value || n.helper.value,
|
|
62
|
+
helperTone: () => n.error.value ? "error" : "default",
|
|
63
|
+
invalid: () => !!n.error.value,
|
|
64
|
+
role: "radio"
|
|
65
|
+
});
|
|
66
|
+
return s({
|
|
67
|
+
checked: () => S.checked.value,
|
|
68
|
+
classMap: () => ({
|
|
69
|
+
"is-checked": S.checked.value,
|
|
70
|
+
"is-disabled": b.value
|
|
71
|
+
}),
|
|
72
|
+
color: () => y.value,
|
|
73
|
+
disabled: () => b.value ? !0 : void 0,
|
|
74
|
+
name: () => _.value || void 0,
|
|
75
|
+
onClick: (e) => {
|
|
76
|
+
if (!b.value) if (l) l.select(n.value.value ?? "", e);
|
|
77
|
+
else {
|
|
78
|
+
if (!_.value) return;
|
|
79
|
+
if (!S.checked.value) {
|
|
80
|
+
let r = n.name.value;
|
|
81
|
+
document.querySelectorAll(`bit-radio[name="${r}"]`).forEach((e) => {
|
|
82
|
+
e !== t && e.removeAttribute("checked");
|
|
83
|
+
}), S.toggle(e);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
onKeydown: (e) => {
|
|
88
|
+
let r = e, i = C();
|
|
89
|
+
if (i.length === 0) return;
|
|
90
|
+
let a = i.indexOf(t);
|
|
91
|
+
if (a !== -1) {
|
|
92
|
+
if (r.key === " " || r.key === "Enter") r.preventDefault(), S.checked.value || (l ? l.select(n.value.value ?? "", r) : S.toggle(r));
|
|
93
|
+
else if (r.key === "ArrowDown" || r.key === "ArrowRight") {
|
|
94
|
+
r.preventDefault();
|
|
95
|
+
let e = i[(a + 1) % i.length];
|
|
96
|
+
e.focus(), l ? l.select(e.getAttribute("value") ?? "") : e.click();
|
|
97
|
+
} else if (r.key === "ArrowUp" || r.key === "ArrowLeft") {
|
|
98
|
+
r.preventDefault();
|
|
99
|
+
let e = i[a === 0 ? i.length - 1 : a - 1];
|
|
100
|
+
e.focus(), l ? l.select(e.getAttribute("value") ?? "") : e.click();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
size: () => v.value,
|
|
105
|
+
tabindex: () => {
|
|
106
|
+
if (!b.value) return S.checked.value ? 0 : -1;
|
|
107
|
+
}
|
|
108
|
+
}), p`
|
|
109
|
+
<div class="radio-wrapper" part="radio">
|
|
110
|
+
<div class="circle" part="circle">
|
|
111
|
+
<div class="dot" part="dot"></div>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
<span class="label" part="label" data-a11y-label id="${w.labelId}"><slot></slot></span>
|
|
115
|
+
<div
|
|
116
|
+
class="helper-text"
|
|
117
|
+
part="helper-text"
|
|
118
|
+
data-a11y-helper
|
|
119
|
+
id="${w.helperId}"
|
|
120
|
+
aria-live="polite"
|
|
121
|
+
hidden></div>
|
|
122
|
+
`;
|
|
123
|
+
},
|
|
124
|
+
styles: [
|
|
125
|
+
...n,
|
|
126
|
+
e,
|
|
127
|
+
t(s),
|
|
128
|
+
l
|
|
129
|
+
],
|
|
130
|
+
tag: "bit-radio"
|
|
131
|
+
});
|
|
132
|
+
//#endregion
|
|
133
|
+
export { _ as RADIO_TAG };
|
|
134
|
+
|
|
135
|
+
//# sourceMappingURL=radio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radio.js","names":[],"sources":["../src/inputs/radio/radio.ts"],"sourcesContent":["import { computed, defineComponent, defineField, html, inject, signal, watch } from '@vielzeug/craftit';\nimport { useA11yControl, createCheckableControl } from '@vielzeug/craftit/labs';\n\nimport type { CheckableProps, DisablableProps, SizableProps, ThemableProps } from '../../types';\n\nimport { coarsePointerMixin, formControlMixins, sizeVariantMixin } from '../../styles';\nimport { RADIO_GROUP_CTX } from '../radio-group/radio-group';\nimport { CONTROL_SIZE_PRESET } from '../shared/design-presets';\nimport { mountFormContextSync } from '../shared/dom-sync';\nimport { FORM_CTX } from '../shared/form-context';\nimport componentStyles from './radio.css?inline';\n\n/** Radio component properties */\n\nexport type BitRadioEvents = {\n change: { checked: boolean; fieldValue: string; originalEvent?: Event; value: boolean };\n};\n\nexport type BitRadioProps = CheckableProps &\n ThemableProps &\n SizableProps &\n DisablableProps & {\n /** Error message (marks field as invalid) */\n error?: string;\n /** Helper text displayed below the radio */\n helper?: string;\n };\n\n/**\n * A customizable radio button component for mutually exclusive selections.\n *\n * @element bit-radio\n *\n * @attr {boolean} checked - Checked state\n * @attr {boolean} disabled - Disable radio interaction\n * @attr {string} value - Field value (required for radio groups)\n * @attr {string} name - Form field name (required for radio groups)\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - Radio size: 'sm' | 'md' | 'lg'\n * @attr {string} error - Error message (marks field as invalid)\n * @attr {string} helper - Helper text displayed below the radio\n *\n * @fires change - Emitted when radio is selected. detail: { value: boolean, checked: boolean, fieldValue: string, originalEvent?: Event }\n *\n * @slot - Radio button label text\n *\n * @part radio - The radio wrapper element\n * @part circle - The visual radio circle\n * @part label - The label element\n * @part helper-text - The helper/error text element\n */\nexport const RADIO_TAG = defineComponent<BitRadioProps, BitRadioEvents>({\n formAssociated: true,\n props: {\n checked: { default: false },\n color: { default: undefined },\n disabled: { default: false },\n error: { default: '' },\n helper: { default: '' },\n name: { default: '' },\n size: { default: undefined },\n value: { default: '' },\n },\n setup({ emit, host, props, reflect }) {\n const groupCtx = inject(RADIO_GROUP_CTX, undefined);\n const formCtx = inject(FORM_CTX, undefined);\n\n const effectiveName = computed(() => groupCtx?.name.value || props.name.value || '');\n const effectiveSize = computed(() => groupCtx?.size.value ?? props.size.value);\n const effectiveColor = computed(() => groupCtx?.color.value ?? props.color.value);\n const effectiveDisabled = computed(() => Boolean(groupCtx?.disabled.value || props.disabled.value));\n\n mountFormContextSync(host, formCtx, props);\n\n // Local signal — source of truth for checked state.\n // Driven by group context when inside a radio-group, otherwise by the checked prop.\n const checkedSignal = signal(Boolean(props.checked.value));\n\n if (groupCtx) {\n watch(\n computed(() => groupCtx.value.value === props.value.value),\n (isChecked) => {\n checkedSignal.value = isChecked;\n },\n { immediate: true },\n );\n } else {\n watch(\n props.checked,\n (v) => {\n checkedSignal.value = Boolean(v);\n },\n { immediate: true },\n );\n }\n\n const control = createCheckableControl({\n checked: checkedSignal,\n disabled: props.disabled,\n onToggle: (e) => {\n emit('change', {\n checked: control.checked.value,\n fieldValue: props.value.value ?? '',\n originalEvent: e,\n value: control.checked.value,\n });\n },\n value: props.value,\n });\n\n defineField(\n {\n disabled: effectiveDisabled,\n toFormValue: (v: string | null) => v,\n value: computed(() => (checkedSignal.value ? (props.value.value ?? '') : null)),\n },\n {\n onReset: () => {\n checkedSignal.value = Boolean(props.checked.value);\n },\n },\n );\n\n const getRadioGroup = (): HTMLElement[] => {\n const radioName = effectiveName.value;\n\n if (!radioName) return [];\n\n return Array.from(document.querySelectorAll<HTMLElement>(`bit-radio[name=\"${radioName}\"]`)).filter(\n (r) => !r.hasAttribute('disabled'),\n );\n };\n\n const a11y = useA11yControl(host, {\n checked: () => (control.checked.value ? 'true' : 'false'),\n helperText: () => props.error.value || props.helper.value,\n helperTone: () => (props.error.value ? 'error' : 'default'),\n invalid: () => !!props.error.value,\n role: 'radio',\n });\n\n reflect({\n checked: () => control.checked.value,\n classMap: () => ({\n 'is-checked': control.checked.value,\n 'is-disabled': effectiveDisabled.value,\n }),\n color: () => effectiveColor.value,\n disabled: () => (effectiveDisabled.value ? true : undefined),\n name: () => effectiveName.value || undefined,\n onClick: (e: Event) => {\n if (effectiveDisabled.value) return;\n\n if (groupCtx) {\n groupCtx.select(props.value.value ?? '', e);\n } else {\n // For non-grouped radios, require a name attribute\n // (radios should be part of a group, either via radio-group or via name)\n if (!effectiveName.value) return;\n\n // Only toggle if not already checked\n // (radio buttons can only be checked, never unchecked by clicking)\n if (!control.checked.value) {\n // Uncheck all other radios with the same name\n const radioName = props.name.value;\n const allRadios = document.querySelectorAll<HTMLElement>(`bit-radio[name=\"${radioName}\"]`);\n\n allRadios.forEach((radio) => {\n if (radio !== host) {\n radio.removeAttribute('checked');\n }\n });\n\n control.toggle(e);\n }\n }\n },\n onKeydown: (e: Event) => {\n const ke = e as KeyboardEvent;\n const radios = getRadioGroup();\n\n if (radios.length === 0) return;\n\n const currentIndex = radios.indexOf(host);\n\n if (currentIndex === -1) return;\n\n if (ke.key === ' ' || ke.key === 'Enter') {\n ke.preventDefault();\n\n if (!control.checked.value) {\n if (groupCtx) {\n groupCtx.select(props.value.value ?? '', ke);\n } else {\n control.toggle(ke);\n }\n }\n } else if (ke.key === 'ArrowDown' || ke.key === 'ArrowRight') {\n ke.preventDefault();\n\n const nextIndex = (currentIndex + 1) % radios.length;\n const nextRadio = radios[nextIndex];\n\n nextRadio.focus();\n\n if (groupCtx) {\n groupCtx.select(nextRadio.getAttribute('value') ?? '');\n } else {\n // For non-grouped radios, trigger the select on the focused radio\n nextRadio.click();\n }\n } else if (ke.key === 'ArrowUp' || ke.key === 'ArrowLeft') {\n ke.preventDefault();\n\n const prevIndex = currentIndex === 0 ? radios.length - 1 : currentIndex - 1;\n const prevRadio = radios[prevIndex];\n\n prevRadio.focus();\n\n if (groupCtx) {\n groupCtx.select(prevRadio.getAttribute('value') ?? '');\n } else {\n // For non-grouped radios, trigger the select on the focused radio\n prevRadio.click();\n }\n }\n },\n size: () => effectiveSize.value,\n tabindex: () => {\n if (effectiveDisabled.value) return undefined;\n\n return control.checked.value ? 0 : -1;\n },\n });\n\n return html`\n <div class=\"radio-wrapper\" part=\"radio\">\n <div class=\"circle\" part=\"circle\">\n <div class=\"dot\" part=\"dot\"></div>\n </div>\n </div>\n <span class=\"label\" part=\"label\" data-a11y-label id=\"${a11y.labelId}\"><slot></slot></span>\n <div\n class=\"helper-text\"\n part=\"helper-text\"\n data-a11y-helper\n id=\"${a11y.helperId}\"\n aria-live=\"polite\"\n hidden></div>\n `;\n },\n styles: [...formControlMixins, coarsePointerMixin, sizeVariantMixin(CONTROL_SIZE_PRESET), componentStyles],\n tag: 'bit-radio',\n});\n"],"mappings":"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"}
|
package/dist/rating.cjs
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./styles/mixins/accessibility.css.cjs`),t=require(`./styles/mixins/shape.css.cjs`),n=require(`./styles/mixins/theme.css.cjs`);require(`./styles/index.cjs`);const r=require(`./inputs/shared/form-context.cjs`),i=require(`./inputs/shared/dom-sync/form-context.cjs`);require(`./inputs/shared/dom-sync/index.cjs`);const a=require(`./inputs/shared/validation/index.cjs`),o=require(`./inputs/rating/rating.css?inline.cjs`);let s=require(`@vielzeug/craftit`);var c=`M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z`,l=(0,s.defineComponent)({formAssociated:!0,props:{color:(0,s.typed)(void 0),disabled:(0,s.typed)(!1),label:(0,s.typed)(`Rating`),max:(0,s.typed)(5),name:(0,s.typed)(void 0),readonly:(0,s.typed)(!1),size:(0,s.typed)(void 0),value:(0,s.typed)(0)},setup({emit:e,host:t,props:n}){let o=(0,s.inject)(r.FORM_CTX,void 0);i.mountFormContextSync(t,o,n);let l=(0,s.computed)(()=>{let e=Math.max(1,Number(n.max.value)||5),t=Number(n.value.value);return Math.min(e,Math.max(0,Number.isFinite(t)?t:0))}),{triggerValidation:u}=a.createFieldValidation(o,(0,s.defineField)({disabled:(0,s.computed)(()=>!!n.disabled.value),value:(0,s.computed)(()=>String(l.value||0))},{onReset:()=>{t.removeAttribute(`value`)}})),d=(0,s.signal)(null),f=(0,s.computed)(()=>d.value??l.value);function p(e){let n=t.shadowRoot?.querySelector(`.sparkle-layer`),r=t.shadowRoot?.querySelector(`[data-star="${e}"]`);if(!n||!r)return;let i=r.offsetLeft+r.offsetWidth/2,a=r.offsetTop+r.offsetHeight/2;for(let e=0;e<10;e++){let t=document.createElement(`span`),r=360/10*e+(Math.random()*30-15),o=18+Math.random()*20,s=3+Math.random()*4,c=380+Math.random()*220;t.className=`sparkle`,t.style.cssText=[`left:${i}px`,`top:${a}px`,`--_angle:${r}deg`,`--_dist:${o}px`,`width:${s}px`,`height:${s}px`,`--_dur:${c}ms`,`animation-delay:${Math.random()*60}ms`].join(`;`),n.appendChild(t),t.addEventListener(`animationend`,()=>t.remove(),{once:!0})}}function m(t,r){if(n.readonly.value||n.disabled.value)return;let i=Math.max(1,Number(n.max.value)||5),a=Math.min(i,Math.max(0,t));a!==l.value&&(n.value.value=a,e(`change`,{originalEvent:r,value:a}),u(`change`),p(a))}function h(e,r){let i=Number(n.max.value)||5;e.key===`ArrowRight`||e.key===`ArrowUp`?(e.preventDefault(),m(Math.min(i,r+1),e),(t.shadowRoot?.querySelector(`[data-star="${Math.min(i,r+1)}"]`))?.focus()):(e.key===`ArrowLeft`||e.key===`ArrowDown`)&&(e.preventDefault(),m(Math.max(1,r-1),e),(t.shadowRoot?.querySelector(`[data-star="${Math.max(1,r-1)}"]`))?.focus())}let g=(0,s.computed)(()=>{let e=Number(n.max.value)||5;return Array.from({length:e},(e,t)=>t+1)});return s.html`
|
|
2
|
+
<div
|
|
3
|
+
class="stars"
|
|
4
|
+
part="stars"
|
|
5
|
+
role="radiogroup"
|
|
6
|
+
:aria-label="${()=>n.label.value}"
|
|
7
|
+
:aria-required="${()=>null}">
|
|
8
|
+
${()=>g.value.map(e=>s.html`<button
|
|
9
|
+
class="star-btn"
|
|
10
|
+
part="star"
|
|
11
|
+
type="button"
|
|
12
|
+
role="radio"
|
|
13
|
+
:aria-label="${()=>`${e} ${e===1?`star`:`stars`}`}"
|
|
14
|
+
:aria-checked="${()=>String(e===l.value)}"
|
|
15
|
+
:data-star="${e}"
|
|
16
|
+
?data-filled="${()=>e<=f.value}"
|
|
17
|
+
:disabled="${()=>n.disabled.value||n.readonly.value||null}"
|
|
18
|
+
@click="${t=>m(e,t)}"
|
|
19
|
+
@pointerenter="${()=>{!n.readonly.value&&!n.disabled.value&&(d.value=e)}}"
|
|
20
|
+
@pointerleave="${()=>{d.value=null}}"
|
|
21
|
+
@keydown="${t=>h(t,e)}">
|
|
22
|
+
<svg
|
|
23
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
24
|
+
viewBox="0 0 24 24"
|
|
25
|
+
aria-hidden="true"
|
|
26
|
+
fill="${()=>e<=f.value?`currentColor`:`none`}"
|
|
27
|
+
stroke="currentColor"
|
|
28
|
+
stroke-width="${()=>e<=f.value?0:1.5}"
|
|
29
|
+
stroke-linecap="round"
|
|
30
|
+
stroke-linejoin="round">
|
|
31
|
+
<path d="${c}" />
|
|
32
|
+
</svg>
|
|
33
|
+
</button>`)}
|
|
34
|
+
<div class="sparkle-layer"></div>
|
|
35
|
+
</div>
|
|
36
|
+
`},styles:[n.colorThemeMixin,t.sizeVariantMixin({}),e.coarsePointerMixin,e.reducedMotionMixin,o.default],tag:`bit-rating`});exports.RATING_TAG=l;
|
|
37
|
+
//# sourceMappingURL=rating.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rating.cjs","names":[],"sources":["../src/inputs/rating/rating.ts"],"sourcesContent":["import { computed, defineComponent, typed, defineField, html, inject, signal } from '@vielzeug/craftit';\n\nimport type { DisablableProps, SizableProps, ThemableProps } from '../../types';\n\nimport { coarsePointerMixin, colorThemeMixin, reducedMotionMixin, sizeVariantMixin } from '../../styles';\nimport { mountFormContextSync } from '../shared/dom-sync';\nimport { FORM_CTX } from '../shared/form-context';\nimport { createFieldValidation } from '../shared/validation';\nimport styles from './rating.css?inline';\n\nconst FULL_STAR_PATH = 'M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z';\n\nexport type BitRatingEvents = {\n change: { originalEvent?: Event; value: number };\n};\n\n/** Rating props */\nexport type BitRatingProps = ThemableProps &\n SizableProps &\n DisablableProps & {\n /** Accessible group label */\n label?: string;\n /** Maximum rating (number of stars) */\n max?: number;\n /** Form field name */\n name?: string;\n /** Make rating read-only */\n readonly?: boolean;\n /** Current rating value */\n value?: number;\n };\n\n/**\n * A star rating input.\n *\n * @element bit-rating\n *\n * @attr {number} value - Current rating value (default: 0)\n * @attr {number} max - Maximum number of stars (default: 5)\n * @attr {boolean} readonly - Read-only display mode\n * @attr {boolean} disabled - Disabled state\n * @attr {string} label - aria-label for the group (default: 'Rating')\n * @attr {string} color - Theme color for filled stars\n * @attr {string} size - 'sm' | 'md' | 'lg'\n * @attr {string} name - Form field name\n *\n * @fires change - Emitted when value changes. detail: { value: number, originalEvent?: Event }\n *\n * @cssprop --rating-star-size - Star diameter\n * @cssprop --rating-color-empty - Empty star color\n * @cssprop --rating-color-filled - Filled star color\n * @cssprop --rating-gap - Gap between stars\n *\n * @example\n * ```html\n * <bit-rating value=\"3\" max=\"5\" color=\"warning\"></bit-rating>\n * ```\n */\nexport const RATING_TAG = defineComponent<BitRatingProps, BitRatingEvents>({\n formAssociated: true,\n props: {\n color: typed<BitRatingProps['color']>(undefined),\n disabled: typed<boolean>(false),\n label: typed<string>('Rating'),\n max: typed<number>(5),\n name: typed<string | undefined>(undefined),\n readonly: typed<boolean>(false),\n size: typed<BitRatingProps['size']>(undefined),\n value: typed<number>(0),\n },\n setup({ emit, host, props }) {\n const formCtx = inject(FORM_CTX, undefined);\n\n mountFormContextSync(host, formCtx, props);\n\n const normalizedValue = computed(() => {\n const max = Math.max(1, Number(props.max.value) || 5);\n const raw = Number(props.value.value);\n const safe = Number.isFinite(raw) ? raw : 0;\n\n return Math.min(max, Math.max(0, safe));\n });\n\n const fd = defineField(\n {\n disabled: computed(() => Boolean(props.disabled.value)),\n value: computed(() => String(normalizedValue.value || 0)),\n },\n {\n onReset: () => {\n host.removeAttribute('value');\n },\n },\n );\n\n const { triggerValidation } = createFieldValidation(formCtx, fd);\n\n const hovered = signal<number | null>(null);\n const displayValue = computed(() => hovered.value ?? normalizedValue.value);\n\n function spawnSparkles(star: number) {\n const layer = host.shadowRoot?.querySelector<HTMLElement>('.sparkle-layer');\n const btn = host.shadowRoot?.querySelector<HTMLElement>(`[data-star=\"${star}\"]`);\n\n if (!layer || !btn) return;\n\n const cx = btn.offsetLeft + btn.offsetWidth / 2;\n const cy = btn.offsetTop + btn.offsetHeight / 2;\n const count = 10;\n\n for (let i = 0; i < count; i++) {\n const p = document.createElement('span');\n const angle = (360 / count) * i + (Math.random() * 30 - 15);\n const dist = 18 + Math.random() * 20;\n const size = 3 + Math.random() * 4;\n const dur = 380 + Math.random() * 220;\n\n p.className = 'sparkle';\n p.style.cssText = [\n `left:${cx}px`,\n `top:${cy}px`,\n `--_angle:${angle}deg`,\n `--_dist:${dist}px`,\n `width:${size}px`,\n `height:${size}px`,\n `--_dur:${dur}ms`,\n `animation-delay:${Math.random() * 60}ms`,\n ].join(';');\n layer.appendChild(p);\n p.addEventListener('animationend', () => p.remove(), { once: true });\n }\n }\n function select(star: number, originalEvent?: Event) {\n if (props.readonly.value || props.disabled.value) return;\n\n const max = Math.max(1, Number(props.max.value) || 5);\n const nextValue = Math.min(max, Math.max(0, star));\n\n if (nextValue === normalizedValue.value) return;\n\n // Write through the reactive prop signal; craftit handles host reflection.\n props.value.value = nextValue;\n emit('change', { originalEvent, value: nextValue });\n triggerValidation('change');\n spawnSparkles(nextValue);\n }\n function handleKeydown(e: KeyboardEvent, star: number) {\n const max = Number(props.max.value) || 5;\n\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault();\n select(Math.min(max, star + 1), e);\n\n const nextBtn = host.shadowRoot?.querySelector<HTMLButtonElement>(`[data-star=\"${Math.min(max, star + 1)}\"]`);\n\n nextBtn?.focus();\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault();\n select(Math.max(1, star - 1), e);\n\n const prevBtn = host.shadowRoot?.querySelector<HTMLButtonElement>(`[data-star=\"${Math.max(1, star - 1)}\"]`);\n\n prevBtn?.focus();\n }\n }\n\n const stars = computed(() => {\n const max = Number(props.max.value) || 5;\n\n return Array.from({ length: max }, (_, i) => i + 1);\n });\n\n return html`\n <div\n class=\"stars\"\n part=\"stars\"\n role=\"radiogroup\"\n :aria-label=\"${() => props.label.value}\"\n :aria-required=\"${() => null}\">\n ${() =>\n stars.value.map(\n (star) =>\n html`<button\n class=\"star-btn\"\n part=\"star\"\n type=\"button\"\n role=\"radio\"\n :aria-label=\"${() => `${star} ${star === 1 ? 'star' : 'stars'}`}\"\n :aria-checked=\"${() => String(star === normalizedValue.value)}\"\n :data-star=\"${star}\"\n ?data-filled=\"${() => star <= displayValue.value}\"\n :disabled=\"${() => props.disabled.value || props.readonly.value || null}\"\n @click=\"${(e: Event) => select(star, e)}\"\n @pointerenter=\"${() => {\n if (!props.readonly.value && !props.disabled.value) hovered.value = star;\n }}\"\n @pointerleave=\"${() => {\n hovered.value = null;\n }}\"\n @keydown=\"${(e: KeyboardEvent) => handleKeydown(e, star)}\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n fill=\"${() => (star <= displayValue.value ? 'currentColor' : 'none')}\"\n stroke=\"currentColor\"\n stroke-width=\"${() => (star <= displayValue.value ? 0 : 1.5)}\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\">\n <path d=\"${FULL_STAR_PATH}\" />\n </svg>\n </button>`,\n )}\n <div class=\"sparkle-layer\"></div>\n </div>\n `;\n },\n styles: [colorThemeMixin, sizeVariantMixin({}), coarsePointerMixin, reducedMotionMixin, styles],\n tag: 'bit-rating',\n});\n"],"mappings":"uhBAUA,IAAM,EAAiB,+FAgDV,GAAA,EAAA,EAAA,iBAA8D,CACzE,eAAgB,GAChB,MAAO,CACL,OAAA,EAAA,EAAA,OAAsC,IAAA,GAAU,CAChD,UAAA,EAAA,EAAA,OAAyB,GAAM,CAC/B,OAAA,EAAA,EAAA,OAAqB,SAAS,CAC9B,KAAA,EAAA,EAAA,OAAmB,EAAE,CACrB,MAAA,EAAA,EAAA,OAAgC,IAAA,GAAU,CAC1C,UAAA,EAAA,EAAA,OAAyB,GAAM,CAC/B,MAAA,EAAA,EAAA,OAAoC,IAAA,GAAU,CAC9C,OAAA,EAAA,EAAA,OAAqB,EAAE,CACxB,CACD,MAAM,CAAE,OAAM,OAAM,SAAS,CAC3B,IAAM,GAAA,EAAA,EAAA,QAAiB,EAAA,SAAU,IAAA,GAAU,CAE3C,EAAA,qBAAqB,EAAM,EAAS,EAAM,CAE1C,IAAM,GAAA,EAAA,EAAA,cAAiC,CACrC,IAAM,EAAM,KAAK,IAAI,EAAG,OAAO,EAAM,IAAI,MAAM,EAAI,EAAE,CAC/C,EAAM,OAAO,EAAM,MAAM,MAAM,CAGrC,OAAO,KAAK,IAAI,EAAK,KAAK,IAAI,EAFjB,OAAO,SAAS,EAAI,CAAG,EAAM,EAEJ,CAAC,EACvC,CAcI,CAAE,qBAAsB,EAAA,sBAAsB,GAAA,EAAA,EAAA,aAXlD,CACE,UAAA,EAAA,EAAA,cAAyB,EAAQ,EAAM,SAAS,MAAO,CACvD,OAAA,EAAA,EAAA,cAAsB,OAAO,EAAgB,OAAS,EAAE,CAAC,CAC1D,CACD,CACE,YAAe,CACb,EAAK,gBAAgB,QAAQ,EAEhC,CACF,CAE+D,CAE1D,GAAA,EAAA,EAAA,QAAgC,KAAK,CACrC,GAAA,EAAA,EAAA,cAA8B,EAAQ,OAAS,EAAgB,MAAM,CAE3E,SAAS,EAAc,EAAc,CACnC,IAAM,EAAQ,EAAK,YAAY,cAA2B,iBAAiB,CACrE,EAAM,EAAK,YAAY,cAA2B,eAAe,EAAK,IAAI,CAEhF,GAAI,CAAC,GAAS,CAAC,EAAK,OAEpB,IAAM,EAAK,EAAI,WAAa,EAAI,YAAc,EACxC,EAAK,EAAI,UAAY,EAAI,aAAe,EAG9C,IAAK,IAAI,EAAI,EAAG,EAAI,GAAO,IAAK,CAC9B,IAAM,EAAI,SAAS,cAAc,OAAO,CAClC,EAAS,IAAM,GAAS,GAAK,KAAK,QAAQ,CAAG,GAAK,IAClD,EAAO,GAAK,KAAK,QAAQ,CAAG,GAC5B,EAAO,EAAI,KAAK,QAAQ,CAAG,EAC3B,EAAM,IAAM,KAAK,QAAQ,CAAG,IAElC,EAAE,UAAY,UACd,EAAE,MAAM,QAAU,CAChB,QAAQ,EAAG,IACX,OAAO,EAAG,IACV,YAAY,EAAM,KAClB,WAAW,EAAK,IAChB,SAAS,EAAK,IACd,UAAU,EAAK,IACf,UAAU,EAAI,IACd,mBAAmB,KAAK,QAAQ,CAAG,GAAG,IACvC,CAAC,KAAK,IAAI,CACX,EAAM,YAAY,EAAE,CACpB,EAAE,iBAAiB,mBAAsB,EAAE,QAAQ,CAAE,CAAE,KAAM,GAAM,CAAC,EAGxE,SAAS,EAAO,EAAc,EAAuB,CACnD,GAAI,EAAM,SAAS,OAAS,EAAM,SAAS,MAAO,OAElD,IAAM,EAAM,KAAK,IAAI,EAAG,OAAO,EAAM,IAAI,MAAM,EAAI,EAAE,CAC/C,EAAY,KAAK,IAAI,EAAK,KAAK,IAAI,EAAG,EAAK,CAAC,CAE9C,IAAc,EAAgB,QAGlC,EAAM,MAAM,MAAQ,EACpB,EAAK,SAAU,CAAE,gBAAe,MAAO,EAAW,CAAC,CACnD,EAAkB,SAAS,CAC3B,EAAc,EAAU,EAE1B,SAAS,EAAc,EAAkB,EAAc,CACrD,IAAM,EAAM,OAAO,EAAM,IAAI,MAAM,EAAI,EAEnC,EAAE,MAAQ,cAAgB,EAAE,MAAQ,WACtC,EAAE,gBAAgB,CAClB,EAAO,KAAK,IAAI,EAAK,EAAO,EAAE,CAAE,EAAE,EAElB,EAAK,YAAY,cAAiC,eAAe,KAAK,IAAI,EAAK,EAAO,EAAE,CAAC,IAAI,GAEpG,OAAO,GACP,EAAE,MAAQ,aAAe,EAAE,MAAQ,eAC5C,EAAE,gBAAgB,CAClB,EAAO,KAAK,IAAI,EAAG,EAAO,EAAE,CAAE,EAAE,EAEhB,EAAK,YAAY,cAAiC,eAAe,KAAK,IAAI,EAAG,EAAO,EAAE,CAAC,IAAI,GAElG,OAAO,EAIpB,IAAM,GAAA,EAAA,EAAA,cAAuB,CAC3B,IAAM,EAAM,OAAO,EAAM,IAAI,MAAM,EAAI,EAEvC,OAAO,MAAM,KAAK,CAAE,OAAQ,EAAK,EAAG,EAAG,IAAM,EAAI,EAAE,EACnD,CAEF,MAAO,GAAA,IAAI;;;;;2BAKc,EAAM,MAAM,MAAM;8BACf,KAAK;cAE3B,EAAM,MAAM,IACT,GACC,EAAA,IAAI;;;;;mCAKmB,GAAG,EAAK,GAAG,IAAS,EAAI,OAAS,UAAU;qCACzC,OAAO,IAAS,EAAgB,MAAM,CAAC;8BAChD,EAAK;oCACG,GAAQ,EAAa,MAAM;iCAC9B,EAAM,SAAS,OAAS,EAAM,SAAS,OAAS,KAAK;0BAC7D,GAAa,EAAO,EAAM,EAAE,CAAC;qCACjB,CACjB,CAAC,EAAM,SAAS,OAAS,CAAC,EAAM,SAAS,QAAO,EAAQ,MAAQ,IACpE;qCACqB,CACrB,EAAQ,MAAQ,MAChB;4BACW,GAAqB,EAAc,EAAG,EAAK,CAAC;;;;;8BAKxC,GAAQ,EAAa,MAAQ,eAAiB,OAAQ;;sCAE9C,GAAQ,EAAa,MAAQ,EAAI,IAAK;;;6BAGlD,EAAe;;yBAGjC,CAAC;;;OAKV,OAAQ,CAAC,EAAA,gBAAiB,EAAA,iBAAiB,EAAE,CAAC,CAAE,EAAA,mBAAoB,EAAA,mBAAoB,EAAA,QAAO,CAC/F,IAAK,aACN,CAAC"}
|
package/dist/rating.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { coarsePointerMixin as e, reducedMotionMixin as t } from "./styles/mixins/accessibility.css.js";
|
|
2
|
+
import { sizeVariantMixin as n } from "./styles/mixins/shape.css.js";
|
|
3
|
+
import { colorThemeMixin as r } from "./styles/mixins/theme.css.js";
|
|
4
|
+
import "./styles/index.js";
|
|
5
|
+
import { FORM_CTX as i } from "./inputs/shared/form-context.js";
|
|
6
|
+
import { mountFormContextSync as a } from "./inputs/shared/dom-sync/form-context.js";
|
|
7
|
+
import "./inputs/shared/dom-sync/index.js";
|
|
8
|
+
import { createFieldValidation as o } from "./inputs/shared/validation/index.js";
|
|
9
|
+
import s from "./inputs/rating/rating.css?inline.js";
|
|
10
|
+
import { computed as c, defineComponent as l, defineField as u, html as d, inject as f, signal as p, typed as m } from "@vielzeug/craftit";
|
|
11
|
+
//#region src/inputs/rating/rating.ts
|
|
12
|
+
var h = "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z", g = l({
|
|
13
|
+
formAssociated: !0,
|
|
14
|
+
props: {
|
|
15
|
+
color: m(void 0),
|
|
16
|
+
disabled: m(!1),
|
|
17
|
+
label: m("Rating"),
|
|
18
|
+
max: m(5),
|
|
19
|
+
name: m(void 0),
|
|
20
|
+
readonly: m(!1),
|
|
21
|
+
size: m(void 0),
|
|
22
|
+
value: m(0)
|
|
23
|
+
},
|
|
24
|
+
setup({ emit: e, host: t, props: n }) {
|
|
25
|
+
let r = f(i, void 0);
|
|
26
|
+
a(t, r, n);
|
|
27
|
+
let s = c(() => {
|
|
28
|
+
let e = Math.max(1, Number(n.max.value) || 5), t = Number(n.value.value);
|
|
29
|
+
return Math.min(e, Math.max(0, Number.isFinite(t) ? t : 0));
|
|
30
|
+
}), { triggerValidation: l } = o(r, u({
|
|
31
|
+
disabled: c(() => !!n.disabled.value),
|
|
32
|
+
value: c(() => String(s.value || 0))
|
|
33
|
+
}, { onReset: () => {
|
|
34
|
+
t.removeAttribute("value");
|
|
35
|
+
} })), m = p(null), g = c(() => m.value ?? s.value);
|
|
36
|
+
function _(e) {
|
|
37
|
+
let n = t.shadowRoot?.querySelector(".sparkle-layer"), r = t.shadowRoot?.querySelector(`[data-star="${e}"]`);
|
|
38
|
+
if (!n || !r) return;
|
|
39
|
+
let i = r.offsetLeft + r.offsetWidth / 2, a = r.offsetTop + r.offsetHeight / 2;
|
|
40
|
+
for (let e = 0; e < 10; e++) {
|
|
41
|
+
let t = document.createElement("span"), r = 360 / 10 * e + (Math.random() * 30 - 15), o = 18 + Math.random() * 20, s = 3 + Math.random() * 4, c = 380 + Math.random() * 220;
|
|
42
|
+
t.className = "sparkle", t.style.cssText = [
|
|
43
|
+
`left:${i}px`,
|
|
44
|
+
`top:${a}px`,
|
|
45
|
+
`--_angle:${r}deg`,
|
|
46
|
+
`--_dist:${o}px`,
|
|
47
|
+
`width:${s}px`,
|
|
48
|
+
`height:${s}px`,
|
|
49
|
+
`--_dur:${c}ms`,
|
|
50
|
+
`animation-delay:${Math.random() * 60}ms`
|
|
51
|
+
].join(";"), n.appendChild(t), t.addEventListener("animationend", () => t.remove(), { once: !0 });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function v(t, r) {
|
|
55
|
+
if (n.readonly.value || n.disabled.value) return;
|
|
56
|
+
let i = Math.max(1, Number(n.max.value) || 5), a = Math.min(i, Math.max(0, t));
|
|
57
|
+
a !== s.value && (n.value.value = a, e("change", {
|
|
58
|
+
originalEvent: r,
|
|
59
|
+
value: a
|
|
60
|
+
}), l("change"), _(a));
|
|
61
|
+
}
|
|
62
|
+
function y(e, r) {
|
|
63
|
+
let i = Number(n.max.value) || 5;
|
|
64
|
+
e.key === "ArrowRight" || e.key === "ArrowUp" ? (e.preventDefault(), v(Math.min(i, r + 1), e), (t.shadowRoot?.querySelector(`[data-star="${Math.min(i, r + 1)}"]`))?.focus()) : (e.key === "ArrowLeft" || e.key === "ArrowDown") && (e.preventDefault(), v(Math.max(1, r - 1), e), (t.shadowRoot?.querySelector(`[data-star="${Math.max(1, r - 1)}"]`))?.focus());
|
|
65
|
+
}
|
|
66
|
+
let b = c(() => {
|
|
67
|
+
let e = Number(n.max.value) || 5;
|
|
68
|
+
return Array.from({ length: e }, (e, t) => t + 1);
|
|
69
|
+
});
|
|
70
|
+
return d`
|
|
71
|
+
<div
|
|
72
|
+
class="stars"
|
|
73
|
+
part="stars"
|
|
74
|
+
role="radiogroup"
|
|
75
|
+
:aria-label="${() => n.label.value}"
|
|
76
|
+
:aria-required="${() => null}">
|
|
77
|
+
${() => b.value.map((e) => d`<button
|
|
78
|
+
class="star-btn"
|
|
79
|
+
part="star"
|
|
80
|
+
type="button"
|
|
81
|
+
role="radio"
|
|
82
|
+
:aria-label="${() => `${e} ${e === 1 ? "star" : "stars"}`}"
|
|
83
|
+
:aria-checked="${() => String(e === s.value)}"
|
|
84
|
+
:data-star="${e}"
|
|
85
|
+
?data-filled="${() => e <= g.value}"
|
|
86
|
+
:disabled="${() => n.disabled.value || n.readonly.value || null}"
|
|
87
|
+
@click="${(t) => v(e, t)}"
|
|
88
|
+
@pointerenter="${() => {
|
|
89
|
+
!n.readonly.value && !n.disabled.value && (m.value = e);
|
|
90
|
+
}}"
|
|
91
|
+
@pointerleave="${() => {
|
|
92
|
+
m.value = null;
|
|
93
|
+
}}"
|
|
94
|
+
@keydown="${(t) => y(t, e)}">
|
|
95
|
+
<svg
|
|
96
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
97
|
+
viewBox="0 0 24 24"
|
|
98
|
+
aria-hidden="true"
|
|
99
|
+
fill="${() => e <= g.value ? "currentColor" : "none"}"
|
|
100
|
+
stroke="currentColor"
|
|
101
|
+
stroke-width="${() => e <= g.value ? 0 : 1.5}"
|
|
102
|
+
stroke-linecap="round"
|
|
103
|
+
stroke-linejoin="round">
|
|
104
|
+
<path d="${h}" />
|
|
105
|
+
</svg>
|
|
106
|
+
</button>`)}
|
|
107
|
+
<div class="sparkle-layer"></div>
|
|
108
|
+
</div>
|
|
109
|
+
`;
|
|
110
|
+
},
|
|
111
|
+
styles: [
|
|
112
|
+
r,
|
|
113
|
+
n({}),
|
|
114
|
+
e,
|
|
115
|
+
t,
|
|
116
|
+
s
|
|
117
|
+
],
|
|
118
|
+
tag: "bit-rating"
|
|
119
|
+
});
|
|
120
|
+
//#endregion
|
|
121
|
+
export { g as RATING_TAG };
|
|
122
|
+
|
|
123
|
+
//# sourceMappingURL=rating.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rating.js","names":[],"sources":["../src/inputs/rating/rating.ts"],"sourcesContent":["import { computed, defineComponent, typed, defineField, html, inject, signal } from '@vielzeug/craftit';\n\nimport type { DisablableProps, SizableProps, ThemableProps } from '../../types';\n\nimport { coarsePointerMixin, colorThemeMixin, reducedMotionMixin, sizeVariantMixin } from '../../styles';\nimport { mountFormContextSync } from '../shared/dom-sync';\nimport { FORM_CTX } from '../shared/form-context';\nimport { createFieldValidation } from '../shared/validation';\nimport styles from './rating.css?inline';\n\nconst FULL_STAR_PATH = 'M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z';\n\nexport type BitRatingEvents = {\n change: { originalEvent?: Event; value: number };\n};\n\n/** Rating props */\nexport type BitRatingProps = ThemableProps &\n SizableProps &\n DisablableProps & {\n /** Accessible group label */\n label?: string;\n /** Maximum rating (number of stars) */\n max?: number;\n /** Form field name */\n name?: string;\n /** Make rating read-only */\n readonly?: boolean;\n /** Current rating value */\n value?: number;\n };\n\n/**\n * A star rating input.\n *\n * @element bit-rating\n *\n * @attr {number} value - Current rating value (default: 0)\n * @attr {number} max - Maximum number of stars (default: 5)\n * @attr {boolean} readonly - Read-only display mode\n * @attr {boolean} disabled - Disabled state\n * @attr {string} label - aria-label for the group (default: 'Rating')\n * @attr {string} color - Theme color for filled stars\n * @attr {string} size - 'sm' | 'md' | 'lg'\n * @attr {string} name - Form field name\n *\n * @fires change - Emitted when value changes. detail: { value: number, originalEvent?: Event }\n *\n * @cssprop --rating-star-size - Star diameter\n * @cssprop --rating-color-empty - Empty star color\n * @cssprop --rating-color-filled - Filled star color\n * @cssprop --rating-gap - Gap between stars\n *\n * @example\n * ```html\n * <bit-rating value=\"3\" max=\"5\" color=\"warning\"></bit-rating>\n * ```\n */\nexport const RATING_TAG = defineComponent<BitRatingProps, BitRatingEvents>({\n formAssociated: true,\n props: {\n color: typed<BitRatingProps['color']>(undefined),\n disabled: typed<boolean>(false),\n label: typed<string>('Rating'),\n max: typed<number>(5),\n name: typed<string | undefined>(undefined),\n readonly: typed<boolean>(false),\n size: typed<BitRatingProps['size']>(undefined),\n value: typed<number>(0),\n },\n setup({ emit, host, props }) {\n const formCtx = inject(FORM_CTX, undefined);\n\n mountFormContextSync(host, formCtx, props);\n\n const normalizedValue = computed(() => {\n const max = Math.max(1, Number(props.max.value) || 5);\n const raw = Number(props.value.value);\n const safe = Number.isFinite(raw) ? raw : 0;\n\n return Math.min(max, Math.max(0, safe));\n });\n\n const fd = defineField(\n {\n disabled: computed(() => Boolean(props.disabled.value)),\n value: computed(() => String(normalizedValue.value || 0)),\n },\n {\n onReset: () => {\n host.removeAttribute('value');\n },\n },\n );\n\n const { triggerValidation } = createFieldValidation(formCtx, fd);\n\n const hovered = signal<number | null>(null);\n const displayValue = computed(() => hovered.value ?? normalizedValue.value);\n\n function spawnSparkles(star: number) {\n const layer = host.shadowRoot?.querySelector<HTMLElement>('.sparkle-layer');\n const btn = host.shadowRoot?.querySelector<HTMLElement>(`[data-star=\"${star}\"]`);\n\n if (!layer || !btn) return;\n\n const cx = btn.offsetLeft + btn.offsetWidth / 2;\n const cy = btn.offsetTop + btn.offsetHeight / 2;\n const count = 10;\n\n for (let i = 0; i < count; i++) {\n const p = document.createElement('span');\n const angle = (360 / count) * i + (Math.random() * 30 - 15);\n const dist = 18 + Math.random() * 20;\n const size = 3 + Math.random() * 4;\n const dur = 380 + Math.random() * 220;\n\n p.className = 'sparkle';\n p.style.cssText = [\n `left:${cx}px`,\n `top:${cy}px`,\n `--_angle:${angle}deg`,\n `--_dist:${dist}px`,\n `width:${size}px`,\n `height:${size}px`,\n `--_dur:${dur}ms`,\n `animation-delay:${Math.random() * 60}ms`,\n ].join(';');\n layer.appendChild(p);\n p.addEventListener('animationend', () => p.remove(), { once: true });\n }\n }\n function select(star: number, originalEvent?: Event) {\n if (props.readonly.value || props.disabled.value) return;\n\n const max = Math.max(1, Number(props.max.value) || 5);\n const nextValue = Math.min(max, Math.max(0, star));\n\n if (nextValue === normalizedValue.value) return;\n\n // Write through the reactive prop signal; craftit handles host reflection.\n props.value.value = nextValue;\n emit('change', { originalEvent, value: nextValue });\n triggerValidation('change');\n spawnSparkles(nextValue);\n }\n function handleKeydown(e: KeyboardEvent, star: number) {\n const max = Number(props.max.value) || 5;\n\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault();\n select(Math.min(max, star + 1), e);\n\n const nextBtn = host.shadowRoot?.querySelector<HTMLButtonElement>(`[data-star=\"${Math.min(max, star + 1)}\"]`);\n\n nextBtn?.focus();\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault();\n select(Math.max(1, star - 1), e);\n\n const prevBtn = host.shadowRoot?.querySelector<HTMLButtonElement>(`[data-star=\"${Math.max(1, star - 1)}\"]`);\n\n prevBtn?.focus();\n }\n }\n\n const stars = computed(() => {\n const max = Number(props.max.value) || 5;\n\n return Array.from({ length: max }, (_, i) => i + 1);\n });\n\n return html`\n <div\n class=\"stars\"\n part=\"stars\"\n role=\"radiogroup\"\n :aria-label=\"${() => props.label.value}\"\n :aria-required=\"${() => null}\">\n ${() =>\n stars.value.map(\n (star) =>\n html`<button\n class=\"star-btn\"\n part=\"star\"\n type=\"button\"\n role=\"radio\"\n :aria-label=\"${() => `${star} ${star === 1 ? 'star' : 'stars'}`}\"\n :aria-checked=\"${() => String(star === normalizedValue.value)}\"\n :data-star=\"${star}\"\n ?data-filled=\"${() => star <= displayValue.value}\"\n :disabled=\"${() => props.disabled.value || props.readonly.value || null}\"\n @click=\"${(e: Event) => select(star, e)}\"\n @pointerenter=\"${() => {\n if (!props.readonly.value && !props.disabled.value) hovered.value = star;\n }}\"\n @pointerleave=\"${() => {\n hovered.value = null;\n }}\"\n @keydown=\"${(e: KeyboardEvent) => handleKeydown(e, star)}\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n fill=\"${() => (star <= displayValue.value ? 'currentColor' : 'none')}\"\n stroke=\"currentColor\"\n stroke-width=\"${() => (star <= displayValue.value ? 0 : 1.5)}\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\">\n <path d=\"${FULL_STAR_PATH}\" />\n </svg>\n </button>`,\n )}\n <div class=\"sparkle-layer\"></div>\n </div>\n `;\n },\n styles: [colorThemeMixin, sizeVariantMixin({}), coarsePointerMixin, reducedMotionMixin, styles],\n tag: 'bit-rating',\n});\n"],"mappings":"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"}
|
package/dist/select.cjs
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./styles/mixins/shape.css.cjs`),t=require(`./styles/mixins/states.css.cjs`),n=require(`./styles/mixins/theme.css.cjs`),r=require(`./styles/index.cjs`),i=require(`./icons.cjs`);require(`./chip.cjs`);const a=require(`./craftit/dist/labs/list.cjs`),o=require(`./craftit/dist/labs/overlay.cjs`);require(`./craftit/dist/labs.cjs`);const s=require(`./inputs/shared/dom-sync/dropdown.cjs`),c=require(`./inputs/shared/utils/assistive-text.cjs`),l=require(`./inputs/shared/utils/choice-change.cjs`),u=require(`./inputs/shared/utils/controlled-csv.cjs`),d=require(`./inputs/shared/form-context.cjs`),f=require(`./inputs/shared/dom-sync/label-sync.cjs`);require(`./inputs/shared/dom-sync/index.cjs`);const p=require(`./inputs/shared/validation/index.cjs`),m=require(`./inputs/shared/design-presets.cjs`),h=require(`./inputs/select/select.css?inline.cjs`);let g=require(`@vielzeug/craftit`);var _=(0,g.defineComponent)({formAssociated:!0,props:{color:{default:void 0},disabled:{default:!1},error:{default:``,omit:!0},fullwidth:{default:!1},helper:{default:``},label:{default:``},"label-placement":{default:`inset`},loading:{default:!1},multiple:{default:!1},name:{default:``},options:(0,g.typed)(void 0,{reflect:!1}),placeholder:{default:``},required:{default:!1},rounded:{default:void 0},size:{default:void 0},value:{default:``},variant:{default:void 0}},setup({emit:e,host:t,props:n}){let r=(0,g.signal)([]),m=(0,g.signal)([]),h=(0,g.signal)(!1),_=(0,g.signal)(-1),v=(0,g.computed)(()=>!!n.loading.value),y=(0,g.computed)(()=>{let e=n.options.value;return e===void 0?m.value:e}),b=(0,g.inject)(d.FORM_CTX,void 0),x=(0,g.computed)(()=>r.value.join(`,`)),{triggerValidation:S}=p.createFieldValidation(b,(0,g.defineField)({disabled:(0,g.computed)(()=>!!n.disabled.value||!!b?.disabled.value),value:x},{onReset:()=>{r.value=[]}}));(0,g.watch)(h,e=>{t.toggleAttribute(`open`,(e=>!!e)(e))},{immediate:!0}),(0,g.watch)(n.error,e=>{t.toggleAttribute(`has-error`,(e=>!!e)(e))},{immediate:!0});let{fieldId:C,labelId:w}=(0,g.createFormIds)(`select`,n.name.value),T=`listbox-${C}`,E=null,D=null,O=(0,g.ref)(),k=(0,g.ref)();function A(){let e=t.shadowRoot?.querySelector(`slot`);if(!e)return;let n=e.assignedElements({flatten:!0}),r=[];for(let e of n)if(e.tagName===`OPTION`){let t=e;r.push({disabled:t.disabled,label:t.text||t.value,value:t.value})}else if(e.tagName===`OPTGROUP`){let t=e,n=t.label;for(let e of Array.from(t.querySelectorAll(`option`))){let t=e;r.push({disabled:t.disabled,group:n,label:t.text||t.value,value:t.value})}}m.value=r}(0,g.effect)(()=>{r.value=u.computeControlledCsvState(n.value.value).values});let j=(0,g.computed)(()=>{if(r.value.length===0)return``;if(n.multiple.value&&r.value.length>1)return`${r.value.length} selected`;let e=r.value[0];return y.value.find(t=>t.value===e)?.label??e}),M=(0,g.computed)(()=>n.multiple.value?r.value.map(e=>({label:y.value.find(t=>t.value===e)?.label??e,value:e})):[]),N=(0,g.computed)(()=>c.resolveMergedAssistiveText(n.error.value,n.helper.value)),P=(0,g.computed)(()=>n.multiple.value&&r.value.length>0),F=(0,g.computed)(()=>j.value||n.placeholder.value||``),I=(0,g.computed)(()=>!!n.label.value);function L(e){let t=[],n=new Map;for(let t of e){let e=t.group;n.has(e)||n.set(e,[]),n.get(e).push(t)}let r=0;for(let[e,i]of n){e!==void 0&&t.push({label:e,type:`group`});for(let e of i)t.push({idx:r++,opt:e,type:`option`})}return t}let R=(0,g.computed)(()=>L(y.value));function z(e){return y.value.find(t=>t.value===e)?.label??e}function B(t){let n=r.value;e(`change`,l.createChoiceChangeDetail(n,n.map(e=>z(e)),t))}function V(e){e.stopPropagation();let t=e.detail?.value;t!==void 0&&(r.value=r.value.filter(e=>e!==t),B(e),S(`change`))}let H=s.createDropdownPositioner(()=>E,()=>D),U=a.e({getIndex:()=>_.value,getItems:()=>y.value,isItemDisabled:e=>e.disabled,setIndex:e=>{_.value=e,J()}}),W=o.t({getBoundaryElement:()=>t,getPanelElement:()=>D,getTriggerElement:()=>E,isDisabled:()=>!!n.disabled.value,isOpen:()=>h.value,positioner:{floating:()=>D,reference:()=>E,update:()=>H.updatePosition()},setOpen:e=>{h.value=e,e||U.reset()}});function G(){W.open(),requestAnimationFrame(()=>{let e=r.value.length>0?y.value.findIndex(e=>e.value===r.value[0]):0;U.set(e>=0?e:0)})}function K(e=`programmatic`){W.close({reason:e}),S(`blur`)}function q(e,t){e.disabled||(n.multiple.value?r.value=r.value.includes(e.value)?r.value.filter(t=>t!==e.value):[...r.value,e.value]:(r.value=[e.value],K()),B(t),S(`change`))}function J(){let e=_.value;if(e>=0){(D?.querySelector(`#${C}-opt-${e}`))?.scrollIntoView({block:`nearest`});return}D&&D.querySelector(`[data-focused]`)?.scrollIntoView({block:`nearest`})}function Y(e){if(n.disabled.value)return;let t=y.value;switch(e.key){case` `:case`Enter`:if(e.preventDefault(),h.value){let n=_.value;n>=0&&n<t.length&&q(t[n],e)}else G();break;case`ArrowDown`:e.preventDefault(),h.value?U.next():G();break;case`ArrowUp`:e.preventDefault(),h.value?U.prev():G();break;case`End`:h.value&&(e.preventDefault(),U.last());break;case`Escape`:e.preventDefault(),K(`escape`);break;case`Home`:h.value&&(e.preventDefault(),U.first());break;case`Tab`:K();break}}return(0,g.onMount)(()=>{(0,g.onSlotChange)(`default`,A),A(),f.mountLabelSyncStandalone(k,O,n),E&&(0,g.aria)(E,{activedescendant:()=>_.value>=0?`${C}-opt-${_.value}`:null,disabled:()=>n.disabled.value,expanded:()=>h.value?`true`:`false`,invalid:()=>!!n.error.value,labelledby:()=>I.value?w:null});let e=W.bindOutsideClick(document);return()=>{H.destroy(),e()}}),g.html`<slot style="display:none"></slot>
|
|
2
|
+
<div class="select-wrapper">
|
|
3
|
+
<label class="label-outside" id="${w}" ref=${O} hidden></label>
|
|
4
|
+
<div
|
|
5
|
+
class="field"
|
|
6
|
+
ref=${e=>{E=e}}
|
|
7
|
+
role="combobox"
|
|
8
|
+
tabindex=${()=>n.disabled.value?`-1`:`0`}
|
|
9
|
+
aria-controls="${T}"
|
|
10
|
+
aria-expanded="false"
|
|
11
|
+
aria-labelledby="${w}"
|
|
12
|
+
@click=${e=>{e.stopPropagation(),h.value?K():G()}}
|
|
13
|
+
@keydown=${Y}>
|
|
14
|
+
<label class="label-inset" id="${w}" ref=${k} hidden></label>
|
|
15
|
+
<div class="trigger-row">
|
|
16
|
+
<div class="chips-row" ?hidden=${()=>!P.value}>
|
|
17
|
+
${()=>M.value.map(e=>g.html`
|
|
18
|
+
<bit-chip
|
|
19
|
+
value=${e.value}
|
|
20
|
+
aria-label=${e.label}
|
|
21
|
+
mode="removable"
|
|
22
|
+
variant="flat"
|
|
23
|
+
size="sm"
|
|
24
|
+
color=${()=>n.color.value}
|
|
25
|
+
@remove=${V}>
|
|
26
|
+
${e.label}
|
|
27
|
+
</bit-chip>
|
|
28
|
+
`)}
|
|
29
|
+
</div>
|
|
30
|
+
<span
|
|
31
|
+
class="trigger-value ${()=>j.value?``:`trigger-placeholder`}"
|
|
32
|
+
?hidden=${()=>P.value}
|
|
33
|
+
>${()=>F.value}</span
|
|
34
|
+
>
|
|
35
|
+
</div>
|
|
36
|
+
<span class="trigger-icon" aria-hidden="true">
|
|
37
|
+
${i.chevronDownIcon}
|
|
38
|
+
<span class="loader" aria-label="Loading"></span>
|
|
39
|
+
</span>
|
|
40
|
+
</div>
|
|
41
|
+
<div
|
|
42
|
+
class="helper-text"
|
|
43
|
+
aria-live="polite"
|
|
44
|
+
?hidden=${()=>N.value.hidden}
|
|
45
|
+
style=${()=>N.value.isError?`color: var(--color-error);`:``}>
|
|
46
|
+
${()=>N.value.text}
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
<div
|
|
50
|
+
class="dropdown"
|
|
51
|
+
?data-open=${()=>h.value}
|
|
52
|
+
role="listbox"
|
|
53
|
+
id="${T}"
|
|
54
|
+
aria-label="Options"
|
|
55
|
+
ref=${e=>{D=e}}>
|
|
56
|
+
<div class="dropdown-loading" ?hidden=${()=>!v.value}>Loading…</div>
|
|
57
|
+
<div class="dropdown-empty" ?hidden=${()=>v.value||y.value.length>0}>No options</div>
|
|
58
|
+
<div class="options-list" ?hidden=${()=>v.value||y.value.length===0}>
|
|
59
|
+
${()=>R.value.map(e=>e.type===`group`?g.html`<div class="optgroup-label" role="presentation">${e.label}</div>`:g.html`<div
|
|
60
|
+
class="option"
|
|
61
|
+
role="option"
|
|
62
|
+
id=${`${C}-opt-${e.idx}`}
|
|
63
|
+
data-option-index=${()=>String(e.idx)}
|
|
64
|
+
data-option-value=${e.opt.value}
|
|
65
|
+
aria-selected=${()=>String(r.value.includes(e.opt.value))}
|
|
66
|
+
aria-disabled=${()=>String(e.opt.disabled)}
|
|
67
|
+
?data-focused=${()=>_.value===e.idx}
|
|
68
|
+
?data-selected=${()=>r.value.includes(e.opt.value)}
|
|
69
|
+
?data-disabled=${()=>e.opt.disabled}
|
|
70
|
+
@click=${t=>{t.stopPropagation(),q(e.opt,t)}}
|
|
71
|
+
@pointerenter=${()=>{_.value=e.idx}}>
|
|
72
|
+
<span>${e.opt.label}</span>
|
|
73
|
+
<span class="option-check" aria-hidden="true">${i.checkIcon}</span>
|
|
74
|
+
</div>`)}
|
|
75
|
+
</div>
|
|
76
|
+
</div>`},shadow:{delegatesFocus:!0},styles:[e.sizeVariantMixin(m.FIELD_SIZE_PRESET),...r.formFieldMixins,t.disabledLoadingMixin(),n.forcedColorsFocusMixin(`.field`),h.default],tag:`bit-select`});exports.SELECT_TAG=_;
|
|
77
|
+
//# sourceMappingURL=select.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.cjs","names":[],"sources":["../src/inputs/select/select.ts"],"sourcesContent":["import {\n aria,\n computed,\n createFormIds,\n defineComponent,\n defineField,\n effect,\n html,\n inject,\n onMount,\n onSlotChange,\n ref,\n signal,\n typed,\n watch,\n} from '@vielzeug/craftit';\nimport { createListNavigation, createOverlayControl } from '@vielzeug/craftit/labs';\n\nimport type { VisualVariant } from '../../types';\n\nimport '../../feedback/chip/chip';\nimport type { SelectableFieldProps } from '../shared/base-props';\n\nimport { checkIcon, chevronDownIcon } from '../../icons';\nimport { disabledLoadingMixin, forcedColorsFocusMixin, formFieldMixins, sizeVariantMixin } from '../../styles';\nimport { FIELD_SIZE_PRESET } from '../shared/design-presets';\nimport { createDropdownPositioner, mountLabelSyncStandalone } from '../shared/dom-sync';\nimport { FORM_CTX } from '../shared/form-context';\nimport {\n type ChoiceChangeDetail,\n computeControlledCsvState,\n createChoiceChangeDetail,\n resolveMergedAssistiveText,\n} from '../shared/utils';\nimport { createFieldValidation } from '../shared/validation';\nimport componentStyles from './select.css?inline';\n\n// ============================================\n// Types\n// ============================================\n\ntype OptionItem = {\n disabled: boolean;\n group?: string;\n label: string;\n value: string;\n};\n\ntype FlatRow =\n | {\n idx: number;\n opt: OptionItem;\n type: 'option';\n }\n | {\n label: string;\n type: 'group';\n };\n\n// ============================================\n// Styles\n// ============================================\n\n// ============================================\n// Component Props\n// ============================================\n\n/** Select component properties */\n\nexport type BitSelectEvents = {\n change: ChoiceChangeDetail;\n};\n\nexport type BitSelectProps = SelectableFieldProps<Exclude<VisualVariant, 'glass' | 'text' | 'frost'>> & {\n /** Show loading state in dropdown */\n loading?: boolean;\n /** Allow selecting multiple options */\n multiple?: boolean;\n /** JS options array (alternative to slotted <option> elements) */\n options?: OptionItem[];\n /** Mark the field as required */\n required?: boolean;\n};\n\n/**\n * A fully custom form-associated select dropdown with keyboard navigation and ARIA support.\n * Reads `<option>` and `<optgroup>` children from the default slot.\n *\n * @element bit-select\n *\n * @attr {string} label - Label text\n * @attr {string} label-placement - 'inset' | 'outside'\n * @attr {string} value - Current selected value(s) (comma-separated for multiple)\n * @attr {string} placeholder - Placeholder when no option selected\n * @attr {string} name - Form field name\n * @attr {boolean} multiple - Enable multi-select\n * @attr {boolean} disabled - Disable the select\n * @attr {boolean} required - Required field\n * @attr {string} helper - Helper text below the select\n * @attr {string} error - Error message\n * @attr {string} color - Theme color\n * @attr {string} variant - Visual variant\n * @attr {string} size - Component size\n * @attr {string} rounded - Border radius\n * @attr {boolean} fullwidth - Expand to full width\n *\n * @fires change - Fired when selection changes. detail: { value: string, values: string[], labels: string[], originalEvent?: Event }\n *\n * @slot - `<option>` and `<optgroup>` elements\n *\n * @cssprop --select-bg - Background\n * @cssprop --select-border-color - Border color\n * @cssprop --select-radius - Border radius\n * @cssprop --select-padding - Padding\n * @cssprop --select-font-size - Font size\n * @cssprop --select-placeholder-color - Placeholder text color\n *\n * @example\n * ```html\n * <bit-select label=\"Role\" value=\"admin\">\n * <option value=\"admin\">Administrator</option>\n * <option value=\"editor\">Editor</option>\n * <option value=\"viewer\">Viewer</option>\n * </bit-select>\n *\n * <bit-select label=\"Tags\" multiple color=\"primary\">\n * <optgroup label=\"Frontend\">\n * <option value=\"react\">React</option>\n * <option value=\"vue\">Vue</option>\n * </optgroup>\n * <optgroup label=\"Backend\">\n * <option value=\"node\">Node.js</option>\n * </optgroup>\n * </bit-select>\n * ```\n */\nexport const SELECT_TAG = defineComponent<BitSelectProps, BitSelectEvents>({\n formAssociated: true,\n props: {\n color: { default: undefined },\n disabled: { default: false },\n error: { default: '', omit: true },\n fullwidth: { default: false },\n helper: { default: '' },\n label: { default: '' },\n 'label-placement': { default: 'inset' },\n loading: { default: false },\n multiple: { default: false },\n name: { default: '' },\n options: typed<OptionItem[] | undefined>(undefined, { reflect: false }),\n placeholder: { default: '' },\n required: { default: false },\n rounded: { default: undefined },\n size: { default: undefined },\n value: { default: '' },\n variant: { default: undefined },\n },\n setup({ emit, host, props }) {\n // ============================================\n // State\n // ============================================\n const selectedValues = signal<string[]>([]);\n const slottedOptions = signal<OptionItem[]>([]);\n const isOpen = signal(false);\n const focusedIndex = signal(-1);\n const isLoading = computed(() => Boolean(props.loading.value));\n // Merged options: explicit prop value overrides slotted options.\n const options = computed(() => {\n const propOptions = props.options.value;\n\n return propOptions !== undefined ? propOptions : slottedOptions.value;\n });\n const formCtx = inject(FORM_CTX, undefined);\n // Form-associated value (comma-separated for multiple)\n const formValue = computed(() => selectedValues.value.join(','));\n const fd = defineField(\n { disabled: computed(() => Boolean(props.disabled.value) || Boolean(formCtx?.disabled.value)), value: formValue },\n {\n onReset: () => {\n selectedValues.value = [];\n },\n },\n );\n\n const { triggerValidation } = createFieldValidation(formCtx, fd);\n\n // Sync host attributes from component state for CSS hooks.\n watch(\n isOpen,\n (value) => {\n host.toggleAttribute('open', ((value) => Boolean(value))(value));\n },\n { immediate: true },\n );\n watch(\n props.error,\n (value) => {\n host.toggleAttribute('has-error', ((value) => Boolean(value))(value));\n },\n { immediate: true },\n );\n\n // Accessibility IDs\n const { fieldId: selectId, labelId } = createFormIds('select', props.name.value);\n const listboxId = `listbox-${selectId}`;\n // DOM refs\n let triggerEl: HTMLElement | null = null;\n let dropdownEl: HTMLElement | null = null;\n // Refs for dynamic content\n const labelOutsideRef = ref<HTMLSpanElement>();\n const labelInsetRef = ref<HTMLSpanElement>();\n\n // ============================================\n // Option reading from slot\n // ============================================\n function readOptions() {\n const slot = host.shadowRoot?.querySelector<HTMLSlotElement>('slot');\n\n if (!slot) return;\n\n const assigned = slot.assignedElements({ flatten: true });\n const items: OptionItem[] = [];\n\n for (const el of assigned) {\n if (el.tagName === 'OPTION') {\n const opt = el as HTMLOptionElement;\n\n items.push({ disabled: opt.disabled, label: opt.text || opt.value, value: opt.value });\n } else if (el.tagName === 'OPTGROUP') {\n const group = el as HTMLOptGroupElement;\n const groupLabel = group.label;\n\n for (const child of Array.from(group.querySelectorAll('option'))) {\n const opt = child as HTMLOptionElement;\n\n items.push({ disabled: opt.disabled, group: groupLabel, label: opt.text || opt.value, value: opt.value });\n }\n }\n }\n slottedOptions.value = items;\n }\n // Initialize selectedValues from prop\n effect(() => {\n selectedValues.value = computeControlledCsvState(props.value.value).values;\n });\n\n // ============================================\n // Display value\n // ============================================\n const displayLabel = computed(() => {\n if (selectedValues.value.length === 0) return '';\n\n if (props.multiple.value && selectedValues.value.length > 1) {\n return `${selectedValues.value.length} selected`;\n }\n\n const first = selectedValues.value[0];\n\n return options.value.find((o) => o.value === first)?.label ?? first;\n });\n const selectedChipItems = computed(() => {\n if (!props.multiple.value) return [];\n\n return selectedValues.value.map((value) => ({\n label: options.value.find((o) => o.value === value)?.label ?? value,\n value,\n }));\n });\n const assistiveText = computed(() => resolveMergedAssistiveText(props.error.value, props.helper.value));\n const showChips = computed(() => props.multiple.value && selectedValues.value.length > 0);\n const triggerText = computed(() => displayLabel.value || props.placeholder.value || '');\n const hasLabel = computed(() => !!props.label.value);\n\n function buildFlatList(opts: OptionItem[]): FlatRow[] {\n const flat: FlatRow[] = [];\n const groups = new Map<string | undefined, OptionItem[]>();\n\n for (const opt of opts) {\n const key = opt.group;\n\n if (!groups.has(key)) groups.set(key, []);\n\n groups.get(key)!.push(opt);\n }\n\n let globalIdx = 0;\n\n for (const [groupLabel, groupOpts] of groups) {\n if (groupLabel !== undefined) flat.push({ label: groupLabel, type: 'group' });\n\n for (const opt of groupOpts) flat.push({ idx: globalIdx++, opt, type: 'option' });\n }\n\n return flat;\n }\n\n const flatRows = computed(() => buildFlatList(options.value));\n\n function getLabelForValue(value: string): string {\n return options.value.find((option) => option.value === value)?.label ?? value;\n }\n\n function emitChange(originalEvent?: Event): void {\n const values = selectedValues.value;\n const labels = values.map((value) => getLabelForValue(value));\n\n emit('change', createChoiceChangeDetail(values, labels, originalEvent));\n }\n\n function removeChip(event: Event): void {\n event.stopPropagation();\n\n const value = (event as CustomEvent<{ value?: string }>).detail?.value;\n\n if (value === undefined) return;\n\n selectedValues.value = selectedValues.value.filter((v) => v !== value);\n emitChange(event);\n triggerValidation('change');\n }\n\n // ============================================\n // Dropdown positioning (shared positioner)\n // ============================================\n const positioner = createDropdownPositioner(\n () => triggerEl,\n () => dropdownEl,\n );\n\n const listNavigation = createListNavigation<OptionItem>({\n getIndex: () => focusedIndex.value,\n getItems: () => options.value,\n isItemDisabled: (option) => option.disabled,\n setIndex: (index) => {\n focusedIndex.value = index;\n scrollFocusedIntoView();\n },\n });\n\n const overlay = createOverlayControl({\n getBoundaryElement: () => host,\n getPanelElement: () => dropdownEl,\n getTriggerElement: () => triggerEl,\n isDisabled: () => Boolean(props.disabled.value),\n isOpen: () => isOpen.value,\n positioner: {\n floating: () => dropdownEl,\n reference: () => triggerEl,\n update: () => positioner.updatePosition(),\n },\n setOpen: (next) => {\n isOpen.value = next;\n\n if (!next) listNavigation.reset();\n },\n });\n\n // ============================================\n // Open / Close\n // ============================================\n function open() {\n overlay.open();\n\n requestAnimationFrame(() => {\n const selectedIndex =\n selectedValues.value.length > 0\n ? options.value.findIndex((option) => option.value === selectedValues.value[0])\n : 0;\n\n listNavigation.set(selectedIndex >= 0 ? selectedIndex : 0);\n });\n }\n\n function close(reason: 'escape' | 'programmatic' = 'programmatic') {\n overlay.close({ reason });\n triggerValidation('blur');\n }\n // ============================================\n // Selection\n // ============================================\n function selectOption(opt: OptionItem, e?: Event) {\n if (opt.disabled) return;\n\n if (props.multiple.value) {\n selectedValues.value = selectedValues.value.includes(opt.value)\n ? selectedValues.value.filter((entry) => entry !== opt.value)\n : [...selectedValues.value, opt.value];\n } else {\n selectedValues.value = [opt.value];\n close();\n }\n\n emitChange(e);\n triggerValidation('change');\n }\n // ============================================\n // Keyboard navigation\n // ============================================\n function scrollFocusedIntoView() {\n const idx = focusedIndex.value;\n\n if (idx >= 0) {\n const focusedOptionEl = dropdownEl?.querySelector<HTMLElement>(`#${selectId}-opt-${idx}`);\n\n focusedOptionEl?.scrollIntoView({ block: 'nearest' });\n\n return;\n }\n\n if (!dropdownEl) return;\n\n const focusedEl = dropdownEl.querySelector<HTMLElement>('[data-focused]');\n\n focusedEl?.scrollIntoView({ block: 'nearest' });\n }\n function handleTriggerKeydown(e: KeyboardEvent) {\n if (props.disabled.value) return;\n\n const opts = options.value;\n\n switch (e.key) {\n case ' ':\n case 'Enter':\n e.preventDefault();\n\n if (isOpen.value) {\n const idx = focusedIndex.value;\n\n if (idx >= 0 && idx < opts.length) selectOption(opts[idx], e);\n } else {\n open();\n }\n\n break;\n case 'ArrowDown':\n e.preventDefault();\n\n if (!isOpen.value) {\n open();\n } else {\n listNavigation.next();\n }\n\n break;\n case 'ArrowUp':\n e.preventDefault();\n\n if (!isOpen.value) {\n open();\n } else {\n listNavigation.prev();\n }\n\n break;\n case 'End':\n if (isOpen.value) {\n e.preventDefault();\n listNavigation.last();\n }\n\n break;\n case 'Escape':\n e.preventDefault();\n close('escape');\n break;\n case 'Home':\n if (isOpen.value) {\n e.preventDefault();\n listNavigation.first();\n }\n\n break;\n case 'Tab':\n close();\n break;\n }\n }\n onMount(() => {\n onSlotChange('default', readOptions);\n // Ensure initial light-DOM <option>/<optgroup> content is available immediately.\n readOptions();\n mountLabelSyncStandalone(labelInsetRef, labelOutsideRef, props);\n\n if (triggerEl) {\n aria(triggerEl, {\n activedescendant: () => (focusedIndex.value >= 0 ? `${selectId}-opt-${focusedIndex.value}` : null),\n disabled: () => props.disabled.value,\n expanded: () => (isOpen.value ? 'true' : 'false'),\n invalid: () => !!props.error.value,\n labelledby: () => (hasLabel.value ? labelId : null),\n });\n }\n\n const removeOutsideClick = overlay.bindOutsideClick(document);\n\n return () => {\n positioner.destroy();\n removeOutsideClick();\n };\n });\n\n return html`<slot style=\"display:none\"></slot>\n <div class=\"select-wrapper\">\n <label class=\"label-outside\" id=\"${labelId}\" ref=${labelOutsideRef} hidden></label>\n <div\n class=\"field\"\n ref=${(el: HTMLElement) => {\n triggerEl = el;\n }}\n role=\"combobox\"\n tabindex=${() => (props.disabled.value ? '-1' : '0')}\n aria-controls=\"${listboxId}\"\n aria-expanded=\"false\"\n aria-labelledby=\"${labelId}\"\n @click=${(e: MouseEvent) => {\n e.stopPropagation();\n\n if (isOpen.value) close();\n else open();\n }}\n @keydown=${handleTriggerKeydown}>\n <label class=\"label-inset\" id=\"${labelId}\" ref=${labelInsetRef} hidden></label>\n <div class=\"trigger-row\">\n <div class=\"chips-row\" ?hidden=${() => !showChips.value}>\n ${() =>\n selectedChipItems.value.map(\n (item) => html`\n <bit-chip\n value=${item.value}\n aria-label=${item.label}\n mode=\"removable\"\n variant=\"flat\"\n size=\"sm\"\n color=${() => props.color.value}\n @remove=${removeChip}>\n ${item.label}\n </bit-chip>\n `,\n )}\n </div>\n <span\n class=\"trigger-value ${() => (displayLabel.value ? '' : 'trigger-placeholder')}\"\n ?hidden=${() => showChips.value}\n >${() => triggerText.value}</span\n >\n </div>\n <span class=\"trigger-icon\" aria-hidden=\"true\">\n ${chevronDownIcon}\n <span class=\"loader\" aria-label=\"Loading\"></span>\n </span>\n </div>\n <div\n class=\"helper-text\"\n aria-live=\"polite\"\n ?hidden=${() => assistiveText.value.hidden}\n style=${() => (assistiveText.value.isError ? 'color: var(--color-error);' : '')}>\n ${() => assistiveText.value.text}\n </div>\n </div>\n <div\n class=\"dropdown\"\n ?data-open=${() => isOpen.value}\n role=\"listbox\"\n id=\"${listboxId}\"\n aria-label=\"Options\"\n ref=${(el: HTMLElement) => {\n dropdownEl = el;\n }}>\n <div class=\"dropdown-loading\" ?hidden=${() => !isLoading.value}>Loading…</div>\n <div class=\"dropdown-empty\" ?hidden=${() => isLoading.value || options.value.length > 0}>No options</div>\n <div class=\"options-list\" ?hidden=${() => isLoading.value || options.value.length === 0}>\n ${() =>\n flatRows.value.map((row) =>\n row.type === 'group'\n ? html`<div class=\"optgroup-label\" role=\"presentation\">${row.label}</div>`\n : html`<div\n class=\"option\"\n role=\"option\"\n id=${`${selectId}-opt-${row.idx}`}\n data-option-index=${() => String(row.idx)}\n data-option-value=${row.opt.value}\n aria-selected=${() => String(selectedValues.value.includes(row.opt.value))}\n aria-disabled=${() => String(row.opt.disabled)}\n ?data-focused=${() => focusedIndex.value === row.idx}\n ?data-selected=${() => selectedValues.value.includes(row.opt.value)}\n ?data-disabled=${() => row.opt.disabled}\n @click=${(e: MouseEvent) => {\n e.stopPropagation();\n selectOption(row.opt, e);\n }}\n @pointerenter=${() => {\n focusedIndex.value = row.idx;\n }}>\n <span>${row.opt.label}</span>\n <span class=\"option-check\" aria-hidden=\"true\">${checkIcon}</span>\n </div>`,\n )}\n </div>\n </div>`;\n },\n shadow: { delegatesFocus: true },\n styles: [\n sizeVariantMixin(FIELD_SIZE_PRESET),\n ...formFieldMixins,\n disabledLoadingMixin(),\n forcedColorsFocusMixin('.field'),\n componentStyles,\n ],\n tag: 'bit-select',\n});\n"],"mappings":"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"}
|