@vielzeug/refine 2.1.0 → 2.1.3
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/dist/accordion-item.cjs +1 -1
- package/dist/accordion-item.cjs.map +1 -1
- package/dist/accordion-item.js +1 -1
- package/dist/accordion-item.js.map +1 -1
- package/dist/accordion.cjs +1 -1
- package/dist/accordion.cjs.map +1 -1
- package/dist/accordion.js +1 -1
- package/dist/accordion.js.map +1 -1
- package/dist/alert.cjs.map +1 -1
- package/dist/alert.js.map +1 -1
- package/dist/async.cjs.map +1 -1
- package/dist/async.js.map +1 -1
- package/dist/avatar-group.cjs.map +1 -1
- package/dist/avatar-group.js.map +1 -1
- package/dist/avatar.cjs +6 -6
- package/dist/avatar.cjs.map +1 -1
- package/dist/avatar.js +1 -2
- package/dist/avatar.js.map +1 -1
- package/dist/badge.cjs.map +1 -1
- package/dist/badge.js.map +1 -1
- package/dist/box.cjs.map +1 -1
- package/dist/box.js.map +1 -1
- package/dist/breadcrumb.cjs +3 -3
- package/dist/breadcrumb.cjs.map +1 -1
- package/dist/breadcrumb.js +4 -4
- package/dist/breadcrumb.js.map +1 -1
- package/dist/button-group.cjs +1 -1
- package/dist/button-group.cjs.map +1 -1
- package/dist/button-group.js +0 -1
- package/dist/button-group.js.map +1 -1
- package/dist/button.cjs.map +1 -1
- package/dist/button.js.map +1 -1
- package/dist/calendar.cjs.map +1 -1
- package/dist/calendar.js.map +1 -1
- package/dist/card.cjs +7 -7
- package/dist/card.cjs.map +1 -1
- package/dist/card.js +27 -27
- package/dist/card.js.map +1 -1
- package/dist/carousel.cjs +20 -20
- package/dist/carousel.cjs.map +1 -1
- package/dist/carousel.js +7 -8
- package/dist/carousel.js.map +1 -1
- package/dist/chat-message.cjs +10 -10
- package/dist/chat-message.cjs.map +1 -1
- package/dist/chat-message.js +1 -2
- package/dist/chat-message.js.map +1 -1
- package/dist/checkbox-group.cjs +7 -7
- package/dist/checkbox-group.cjs.map +1 -1
- package/dist/checkbox-group.js +26 -26
- package/dist/checkbox-group.js.map +1 -1
- package/dist/checkbox.cjs +2 -2
- package/dist/checkbox.cjs.map +1 -1
- package/dist/checkbox.js +33 -33
- package/dist/checkbox.js.map +1 -1
- package/dist/chip.cjs +16 -16
- package/dist/chip.cjs.map +1 -1
- package/dist/chip.js +1 -2
- package/dist/chip.js.map +1 -1
- package/dist/combobox.cjs +28 -28
- package/dist/combobox.cjs.map +1 -1
- package/dist/combobox.js +211 -211
- package/dist/combobox.js.map +1 -1
- package/dist/command-palette.cjs +21 -21
- package/dist/command-palette.cjs.map +1 -1
- package/dist/command-palette.js +27 -28
- package/dist/command-palette.js.map +1 -1
- package/dist/content/avatar/avatar.css.cjs +1 -1
- package/dist/content/avatar/avatar.css.js +1 -1
- package/dist/content/avatar/avatar.d.ts.map +1 -1
- package/dist/content/breadcrumb/breadcrumb.d.ts.map +1 -1
- package/dist/content/card/card.css.cjs +1 -1
- package/dist/content/card/card.css.cjs.map +1 -1
- package/dist/content/card/card.css.js +1 -1
- package/dist/content/card/card.css.js.map +1 -1
- package/dist/content/card/card.d.ts.map +1 -1
- package/dist/content/carousel/carousel-slide.cjs.map +1 -1
- package/dist/content/carousel/carousel-slide.js.map +1 -1
- package/dist/content/carousel/carousel.css.cjs +1 -1
- package/dist/content/carousel/carousel.css.cjs.map +1 -1
- package/dist/content/carousel/carousel.css.js +1 -1
- package/dist/content/carousel/carousel.css.js.map +1 -1
- package/dist/content/carousel/carousel.d.ts.map +1 -1
- package/dist/content/carousel/index.d.ts +1 -1
- package/dist/content/carousel/index.d.ts.map +1 -1
- package/dist/content/chat-message/chat-message.css.cjs +1 -1
- package/dist/content/chat-message/chat-message.css.js +1 -1
- package/dist/content/chat-message/chat-message.d.ts.map +1 -1
- package/dist/content/code-window/code-window.css.cjs +1 -1
- package/dist/content/code-window/code-window.css.js +1 -1
- package/dist/content/copy-command/copy-command.css.cjs +1 -1
- package/dist/content/copy-command/copy-command.css.js +1 -1
- package/dist/content/copy-command/copy-command.d.ts.map +1 -1
- package/dist/content/index.d.ts +22 -22
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/list/_list-item-reveal.cjs.map +1 -1
- package/dist/content/list/_list-item-reveal.d.ts +1 -1
- package/dist/content/list/_list-item-reveal.d.ts.map +1 -1
- package/dist/content/list/_list-item-reveal.js.map +1 -1
- package/dist/content/list/list-item.css.cjs +1 -1
- package/dist/content/list/list-item.css.cjs.map +1 -1
- package/dist/content/list/list-item.css.js +1 -1
- package/dist/content/list/list-item.css.js.map +1 -1
- package/dist/content/list/list.d.ts.map +1 -1
- package/dist/content/marquee/marquee.css.cjs +1 -1
- package/dist/content/marquee/marquee.css.js +1 -1
- package/dist/content/pagination/pagination.css.cjs +1 -1
- package/dist/content/pagination/pagination.css.js +1 -1
- package/dist/content/pagination/pagination.d.ts.map +1 -1
- package/dist/content/separator/separator.css.cjs +1 -1
- package/dist/content/separator/separator.css.js +1 -1
- package/dist/content/separator/separator.d.ts.map +1 -1
- package/dist/content/stepper/step.css.cjs.map +1 -1
- package/dist/content/stepper/step.css.js.map +1 -1
- package/dist/content/stepper/stepper.d.ts.map +1 -1
- package/dist/content/table/table.css.cjs +1 -1
- package/dist/content/table/table.css.js +1 -1
- package/dist/content/text/text.css.cjs +1 -1
- package/dist/content/text/text.css.js +1 -1
- package/dist/copy-command.cjs.map +1 -1
- package/dist/copy-command.js.map +1 -1
- package/dist/core/checkable.cjs +1 -1
- package/dist/core/checkable.cjs.map +1 -1
- package/dist/core/checkable.d.ts.map +1 -1
- package/dist/core/checkable.js +4 -4
- package/dist/core/checkable.js.map +1 -1
- package/dist/core/choice-field.cjs +1 -1
- package/dist/core/choice-field.cjs.map +1 -1
- package/dist/core/choice-field.d.ts.map +1 -1
- package/dist/core/choice-field.js +1 -2
- package/dist/core/choice-field.js.map +1 -1
- package/dist/core/date-picker.cjs +1 -1
- package/dist/core/date-picker.cjs.map +1 -1
- package/dist/core/date-picker.d.ts.map +1 -1
- package/dist/core/date-picker.js +3 -3
- package/dist/core/date-picker.js.map +1 -1
- package/dist/core/index.d.ts +17 -17
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/option-list.cjs +1 -1
- package/dist/core/option-list.cjs.map +1 -1
- package/dist/core/option-list.d.ts.map +1 -1
- package/dist/core/option-list.js +4 -4
- package/dist/core/option-list.js.map +1 -1
- package/dist/core/ref-callback.cjs +1 -1
- package/dist/core/ref-callback.cjs.map +1 -1
- package/dist/core/ref-callback.d.ts.map +1 -1
- package/dist/core/ref-callback.js +1 -1
- package/dist/core/ref-callback.js.map +1 -1
- package/dist/core/signals.cjs +1 -1
- package/dist/core/signals.cjs.map +1 -1
- package/dist/core/signals.d.ts.map +1 -1
- package/dist/core/signals.js +1 -2
- package/dist/core/signals.js.map +1 -1
- package/dist/core/slider.cjs.map +1 -1
- package/dist/core/slider.d.ts.map +1 -1
- package/dist/core/slider.js.map +1 -1
- package/dist/core/spinner.cjs.map +1 -1
- package/dist/core/spinner.d.ts.map +1 -1
- package/dist/core/spinner.js.map +1 -1
- package/dist/core/text-field.cjs +1 -1
- package/dist/core/text-field.cjs.map +1 -1
- package/dist/core/text-field.js +1 -1
- package/dist/core/text-field.js.map +1 -1
- package/dist/custom-elements.json +4253 -4253
- package/dist/datagrid.cjs +114 -114
- package/dist/datagrid.cjs.map +1 -1
- package/dist/datagrid.js +42 -43
- package/dist/datagrid.js.map +1 -1
- package/dist/date-picker.cjs.map +1 -1
- package/dist/date-picker.js.map +1 -1
- package/dist/dialog.cjs.map +1 -1
- package/dist/dialog.js.map +1 -1
- package/dist/disclosure/accordion/accordion.d.ts.map +1 -1
- package/dist/disclosure/accordion-item/accordion-item.css.cjs +1 -1
- package/dist/disclosure/accordion-item/accordion-item.css.cjs.map +1 -1
- package/dist/disclosure/accordion-item/accordion-item.css.js +1 -1
- package/dist/disclosure/accordion-item/accordion-item.css.js.map +1 -1
- package/dist/disclosure/index.d.ts +6 -6
- package/dist/disclosure/index.d.ts.map +1 -1
- package/dist/disclosure/tab-item/tab-item.css.cjs.map +1 -1
- package/dist/disclosure/tab-item/tab-item.css.js.map +1 -1
- package/dist/disclosure/tab-item/tab-item.d.ts.map +1 -1
- package/dist/disclosure/tabs/tabs.css.cjs +1 -1
- package/dist/disclosure/tabs/tabs.css.cjs.map +1 -1
- package/dist/disclosure/tabs/tabs.css.js +1 -1
- package/dist/disclosure/tabs/tabs.css.js.map +1 -1
- package/dist/disclosure/tabs/tabs.d.ts.map +1 -1
- package/dist/drawer.cjs +5 -5
- package/dist/drawer.cjs.map +1 -1
- package/dist/drawer.js +26 -26
- package/dist/drawer.js.map +1 -1
- package/dist/feedback/alert/alert.css.cjs +1 -1
- package/dist/feedback/alert/alert.css.js +1 -1
- package/dist/feedback/async/async.d.ts +1 -1
- package/dist/feedback/async/async.d.ts.map +1 -1
- package/dist/feedback/badge/badge.css.cjs +1 -1
- package/dist/feedback/badge/badge.css.js +1 -1
- package/dist/feedback/badge/badge.d.ts.map +1 -1
- package/dist/feedback/chip/chip.css.cjs.map +1 -1
- package/dist/feedback/chip/chip.css.js.map +1 -1
- package/dist/feedback/chip/chip.d.ts.map +1 -1
- package/dist/feedback/index.d.ts +12 -12
- package/dist/feedback/index.d.ts.map +1 -1
- package/dist/feedback/progress/progress.d.ts.map +1 -1
- package/dist/feedback/skeleton/skeleton.d.ts.map +1 -1
- package/dist/feedback/toast/index.d.ts +1 -1
- package/dist/feedback/toast/index.d.ts.map +1 -1
- package/dist/feedback/toast/toast.css.cjs +1 -1
- package/dist/feedback/toast/toast.css.cjs.map +1 -1
- package/dist/feedback/toast/toast.css.js +1 -1
- package/dist/feedback/toast/toast.css.js.map +1 -1
- package/dist/feedback/toast/toast.d.ts +1 -1
- package/dist/feedback/toast/toast.d.ts.map +1 -1
- package/dist/feedback/typing-indicator/typing-indicator.d.ts.map +1 -1
- package/dist/file-input.cjs +67 -67
- package/dist/file-input.cjs.map +1 -1
- package/dist/file-input.js +129 -130
- package/dist/file-input.js.map +1 -1
- package/dist/grid.cjs.map +1 -1
- package/dist/grid.js.map +1 -1
- package/dist/icon.cjs.map +1 -1
- package/dist/icon.js.map +1 -1
- package/dist/input.cjs +21 -21
- package/dist/input.cjs.map +1 -1
- package/dist/input.js +58 -58
- package/dist/input.js.map +1 -1
- package/dist/inputs/button/button.css.cjs +1 -1
- package/dist/inputs/button/button.css.js +1 -1
- package/dist/inputs/button/button.d.ts.map +1 -1
- package/dist/inputs/button-group/button-group.css.cjs.map +1 -1
- package/dist/inputs/button-group/button-group.css.js.map +1 -1
- package/dist/inputs/button-group/button-group.d.ts +1 -1
- package/dist/inputs/button-group/button-group.d.ts.map +1 -1
- package/dist/inputs/calendar/calendar.css.cjs +1 -1
- package/dist/inputs/calendar/calendar.css.cjs.map +1 -1
- package/dist/inputs/calendar/calendar.css.js +1 -1
- package/dist/inputs/calendar/calendar.css.js.map +1 -1
- package/dist/inputs/calendar/calendar.d.ts.map +1 -1
- package/dist/inputs/checkbox/checkbox.css.cjs +1 -1
- package/dist/inputs/checkbox/checkbox.css.js +1 -1
- package/dist/inputs/checkbox/checkbox.d.ts.map +1 -1
- package/dist/inputs/checkbox-group/checkbox-group.d.ts +1 -1
- package/dist/inputs/checkbox-group/checkbox-group.d.ts.map +1 -1
- package/dist/inputs/combobox/combobox.css.cjs +1 -1
- package/dist/inputs/combobox/combobox.css.js +1 -1
- package/dist/inputs/combobox/combobox.d.ts.map +1 -1
- package/dist/inputs/datagrid/datagrid-column.cjs.map +1 -1
- package/dist/inputs/datagrid/datagrid-column.d.ts.map +1 -1
- package/dist/inputs/datagrid/datagrid-column.js.map +1 -1
- package/dist/inputs/datagrid/datagrid-model.cjs +1 -1
- package/dist/inputs/datagrid/datagrid-model.cjs.map +1 -1
- package/dist/inputs/datagrid/datagrid-model.d.ts.map +1 -1
- package/dist/inputs/datagrid/datagrid-model.js +1 -2
- package/dist/inputs/datagrid/datagrid-model.js.map +1 -1
- package/dist/inputs/datagrid/datagrid.css.cjs +1 -1
- package/dist/inputs/datagrid/datagrid.css.cjs.map +1 -1
- package/dist/inputs/datagrid/datagrid.css.js +1 -1
- package/dist/inputs/datagrid/datagrid.css.js.map +1 -1
- package/dist/inputs/datagrid/datagrid.d.ts +1 -1
- package/dist/inputs/datagrid/datagrid.d.ts.map +1 -1
- package/dist/inputs/date-picker/date-picker.css.cjs +1 -1
- package/dist/inputs/date-picker/date-picker.css.cjs.map +1 -1
- package/dist/inputs/date-picker/date-picker.css.js +1 -1
- package/dist/inputs/date-picker/date-picker.css.js.map +1 -1
- package/dist/inputs/date-picker/date-picker.d.ts.map +1 -1
- package/dist/inputs/file-input/file-input-upload.cjs +1 -1
- package/dist/inputs/file-input/file-input-upload.cjs.map +1 -1
- package/dist/inputs/file-input/file-input-upload.d.ts.map +1 -1
- package/dist/inputs/file-input/file-input-upload.js +2 -3
- package/dist/inputs/file-input/file-input-upload.js.map +1 -1
- package/dist/inputs/file-input/file-input.css.cjs +1 -1
- package/dist/inputs/file-input/file-input.css.js +1 -1
- package/dist/inputs/file-input/file-input.d.ts.map +1 -1
- package/dist/inputs/index.d.ts +28 -28
- package/dist/inputs/index.d.ts.map +1 -1
- package/dist/inputs/input/input.css.cjs +1 -1
- package/dist/inputs/input/input.css.js +1 -1
- package/dist/inputs/input/input.d.ts.map +1 -1
- package/dist/inputs/message-composer/message-composer.css.cjs +1 -1
- package/dist/inputs/message-composer/message-composer.css.js +1 -1
- package/dist/inputs/message-composer/message-composer.d.ts +1 -1
- package/dist/inputs/message-composer/message-composer.d.ts.map +1 -1
- package/dist/inputs/number-input/number-input.d.ts.map +1 -1
- package/dist/inputs/otp-input/otp-input.d.ts.map +1 -1
- package/dist/inputs/radio/radio.css.cjs +1 -1
- package/dist/inputs/radio/radio.css.js +1 -1
- package/dist/inputs/radio/radio.d.ts.map +1 -1
- package/dist/inputs/radio-group/radio-group.d.ts +2 -2
- package/dist/inputs/radio-group/radio-group.d.ts.map +1 -1
- package/dist/inputs/rating/rating.d.ts.map +1 -1
- package/dist/inputs/select/select.css.cjs +1 -1
- package/dist/inputs/select/select.css.js +1 -1
- package/dist/inputs/select/select.d.ts.map +1 -1
- package/dist/inputs/shared/field-binding.cjs.map +1 -1
- package/dist/inputs/shared/field-binding.d.ts.map +1 -1
- package/dist/inputs/shared/field-binding.js.map +1 -1
- package/dist/inputs/shared/templates.cjs.map +1 -1
- package/dist/inputs/shared/templates.d.ts.map +1 -1
- package/dist/inputs/shared/templates.js.map +1 -1
- package/dist/inputs/slider/slider.d.ts.map +1 -1
- package/dist/inputs/switch/switch.css.cjs +1 -1
- package/dist/inputs/switch/switch.css.js +1 -1
- package/dist/inputs/switch/switch.d.ts.map +1 -1
- package/dist/inputs/textarea/textarea.css.cjs +1 -1
- package/dist/inputs/textarea/textarea.css.js +1 -1
- package/dist/inputs/textarea/textarea.d.ts.map +1 -1
- package/dist/inputs/time-picker/time-picker.css.cjs +1 -1
- package/dist/inputs/time-picker/time-picker.css.cjs.map +1 -1
- package/dist/inputs/time-picker/time-picker.css.js +1 -1
- package/dist/inputs/time-picker/time-picker.css.js.map +1 -1
- package/dist/inputs/time-picker/time-picker.d.ts.map +1 -1
- package/dist/layout/box/box.d.ts.map +1 -1
- package/dist/layout/grid/grid.d.ts.map +1 -1
- package/dist/layout/index.d.ts +6 -6
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/navbar/navbar.css.cjs +1 -1
- package/dist/layout/navbar/navbar.css.js +1 -1
- package/dist/layout/navbar/navbar.d.ts.map +1 -1
- package/dist/layout/sidebar/sidebar-group.css.cjs +1 -1
- package/dist/layout/sidebar/sidebar-group.css.cjs.map +1 -1
- package/dist/layout/sidebar/sidebar-group.css.js +1 -1
- package/dist/layout/sidebar/sidebar-group.css.js.map +1 -1
- package/dist/layout/sidebar/sidebar.css.cjs +1 -1
- package/dist/layout/sidebar/sidebar.css.cjs.map +1 -1
- package/dist/layout/sidebar/sidebar.css.js +1 -1
- package/dist/layout/sidebar/sidebar.css.js.map +1 -1
- package/dist/layout/sidebar/sidebar.d.ts.map +1 -1
- package/dist/list-item.cjs.map +1 -1
- package/dist/list-item.js.map +1 -1
- package/dist/list.cjs +2 -2
- package/dist/list.cjs.map +1 -1
- package/dist/list.js +15 -16
- package/dist/list.js.map +1 -1
- package/dist/marquee.cjs +1 -1
- package/dist/marquee.cjs.map +1 -1
- package/dist/marquee.js +1 -1
- package/dist/marquee.js.map +1 -1
- package/dist/menu.cjs +5 -5
- package/dist/menu.cjs.map +1 -1
- package/dist/menu.js +38 -39
- package/dist/menu.js.map +1 -1
- package/dist/message-composer.cjs +16 -16
- package/dist/message-composer.cjs.map +1 -1
- package/dist/message-composer.js +61 -61
- package/dist/message-composer.js.map +1 -1
- package/dist/navbar.cjs +9 -9
- package/dist/navbar.cjs.map +1 -1
- package/dist/navbar.js +1 -2
- package/dist/navbar.js.map +1 -1
- package/dist/navigation-menu.cjs +5 -5
- package/dist/navigation-menu.cjs.map +1 -1
- package/dist/navigation-menu.js +33 -34
- package/dist/navigation-menu.js.map +1 -1
- package/dist/number-input.cjs +24 -24
- package/dist/number-input.cjs.map +1 -1
- package/dist/number-input.js +41 -42
- package/dist/number-input.js.map +1 -1
- package/dist/otp-input.cjs +13 -13
- package/dist/otp-input.cjs.map +1 -1
- package/dist/otp-input.js +32 -33
- package/dist/otp-input.js.map +1 -1
- package/dist/overlay/command-palette/command-palette-items.cjs.map +1 -1
- package/dist/overlay/command-palette/command-palette-items.d.ts.map +1 -1
- package/dist/overlay/command-palette/command-palette-items.js.map +1 -1
- package/dist/overlay/command-palette/command-palette.css.cjs +1 -1
- package/dist/overlay/command-palette/command-palette.css.cjs.map +1 -1
- package/dist/overlay/command-palette/command-palette.css.js +1 -1
- package/dist/overlay/command-palette/command-palette.css.js.map +1 -1
- package/dist/overlay/command-palette/command-palette.d.ts.map +1 -1
- package/dist/overlay/dialog/dialog.css.cjs +1 -1
- package/dist/overlay/dialog/dialog.css.js +1 -1
- package/dist/overlay/dialog/dialog.d.ts.map +1 -1
- package/dist/overlay/drawer/drawer.css.cjs +1 -1
- package/dist/overlay/drawer/drawer.css.js +1 -1
- package/dist/overlay/drawer/drawer.d.ts +2 -2
- package/dist/overlay/drawer/drawer.d.ts.map +1 -1
- package/dist/overlay/index.d.ts +6 -6
- package/dist/overlay/index.d.ts.map +1 -1
- package/dist/overlay/menu/menu.css.cjs +1 -1
- package/dist/overlay/menu/menu.css.js +1 -1
- package/dist/overlay/menu/menu.d.ts +2 -2
- package/dist/overlay/menu/menu.d.ts.map +1 -1
- package/dist/overlay/navigation-menu/navigation-menu.d.ts.map +1 -1
- package/dist/overlay/popover/popover.d.ts +1 -1
- package/dist/overlay/popover/popover.d.ts.map +1 -1
- package/dist/overlay/shared/use-dialog.cjs +1 -1
- package/dist/overlay/shared/use-dialog.cjs.map +1 -1
- package/dist/overlay/shared/use-dialog.d.ts.map +1 -1
- package/dist/overlay/shared/use-dialog.js +4 -5
- package/dist/overlay/shared/use-dialog.js.map +1 -1
- package/dist/overlay/shared/use-floating-trigger.cjs +1 -1
- package/dist/overlay/shared/use-floating-trigger.cjs.map +1 -1
- package/dist/overlay/shared/use-floating-trigger.d.ts.map +1 -1
- package/dist/overlay/shared/use-floating-trigger.js +1 -2
- package/dist/overlay/shared/use-floating-trigger.js.map +1 -1
- package/dist/overlay/tooltip/tooltip.d.ts +1 -1
- package/dist/overlay/tooltip/tooltip.d.ts.map +1 -1
- package/dist/pagination.cjs.map +1 -1
- package/dist/pagination.js.map +1 -1
- package/dist/popover.cjs +1 -1
- package/dist/popover.cjs.map +1 -1
- package/dist/popover.js +0 -1
- package/dist/popover.js.map +1 -1
- package/dist/progress.cjs.map +1 -1
- package/dist/progress.js.map +1 -1
- package/dist/radio-group.cjs +5 -5
- package/dist/radio-group.cjs.map +1 -1
- package/dist/radio-group.js +26 -27
- package/dist/radio-group.js.map +1 -1
- package/dist/radio.cjs +2 -2
- package/dist/radio.cjs.map +1 -1
- package/dist/radio.js +41 -41
- package/dist/radio.js.map +1 -1
- package/dist/rating.cjs +4 -4
- package/dist/rating.cjs.map +1 -1
- package/dist/rating.js +36 -36
- package/dist/rating.js.map +1 -1
- package/dist/refine.cjs +686 -686
- package/dist/refine.cjs.map +1 -1
- package/dist/refine.iife.js +686 -686
- package/dist/refine.iife.js.map +1 -1
- package/dist/refine.js +737 -737
- package/dist/refine.js.map +1 -1
- package/dist/select.cjs +42 -42
- package/dist/select.cjs.map +1 -1
- package/dist/select.js +146 -147
- package/dist/select.js.map +1 -1
- package/dist/separator.cjs.map +1 -1
- package/dist/separator.js.map +1 -1
- package/dist/sidebar.cjs +17 -17
- package/dist/sidebar.cjs.map +1 -1
- package/dist/sidebar.js +7 -8
- package/dist/sidebar.js.map +1 -1
- package/dist/skeleton.cjs +3 -3
- package/dist/skeleton.cjs.map +1 -1
- package/dist/skeleton.js +1 -2
- package/dist/skeleton.js.map +1 -1
- package/dist/slider.cjs +12 -12
- package/dist/slider.cjs.map +1 -1
- package/dist/slider.js +54 -55
- package/dist/slider.js.map +1 -1
- package/dist/step.cjs.map +1 -1
- package/dist/step.js.map +1 -1
- package/dist/stepper.cjs +2 -2
- package/dist/stepper.cjs.map +1 -1
- package/dist/stepper.js +8 -7
- package/dist/stepper.js.map +1 -1
- package/dist/styles/index.d.ts +2 -2
- package/dist/styles/index.d.ts.map +1 -1
- package/dist/styles/preflight.css +1 -1
- package/dist/styles/theme.css +15 -30
- package/dist/switch.cjs +3 -3
- package/dist/switch.cjs.map +1 -1
- package/dist/switch.js +28 -28
- package/dist/switch.js.map +1 -1
- package/dist/tab-item.cjs +2 -2
- package/dist/tab-item.cjs.map +1 -1
- package/dist/tab-item.js +21 -21
- package/dist/tab-item.js.map +1 -1
- package/dist/tab-panel.cjs +2 -2
- package/dist/tab-panel.cjs.map +1 -1
- package/dist/tab-panel.js +9 -9
- package/dist/tab-panel.js.map +1 -1
- package/dist/table.cjs +1 -1
- package/dist/table.cjs.map +1 -1
- package/dist/table.js +1 -1
- package/dist/table.js.map +1 -1
- package/dist/tabs.cjs +6 -6
- package/dist/tabs.cjs.map +1 -1
- package/dist/tabs.js +14 -15
- package/dist/tabs.js.map +1 -1
- package/dist/textarea.cjs +11 -11
- package/dist/textarea.cjs.map +1 -1
- package/dist/textarea.js +59 -59
- package/dist/textarea.js.map +1 -1
- package/dist/time-picker.cjs.map +1 -1
- package/dist/time-picker.js.map +1 -1
- package/dist/toast.cjs +16 -16
- package/dist/toast.cjs.map +1 -1
- package/dist/toast.js +20 -21
- package/dist/toast.js.map +1 -1
- package/dist/tooltip.cjs.map +1 -1
- package/dist/tooltip.js.map +1 -1
- package/dist/typing-indicator.cjs +1 -1
- package/dist/typing-indicator.cjs.map +1 -1
- package/dist/typing-indicator.js +1 -1
- package/dist/typing-indicator.js.map +1 -1
- package/package.json +96 -97
package/dist/slider.js
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import { reducedMotionMixin as e } from "./styles/mixins/accessibility.css.js";
|
|
2
|
+
import { sizeVariantMixin as t } from "./styles/mixins/shape.css.js";
|
|
3
|
+
import { disabledStateMixin as n } from "./styles/mixins/states.css.js";
|
|
4
|
+
import { colorThemeMixin as r } from "./styles/mixins/theme.css.js";
|
|
5
|
+
import { createErrorHelperState as i } from "./core/field-base.js";
|
|
6
|
+
import { createSliderControl as a } from "./core/slider.js";
|
|
7
7
|
import { disablableBundle as o, sizableBundle as s, themableBundle as c } from "./shared/prop-bundles.js";
|
|
8
8
|
import { SLIDER_SIZE_PRESET as l } from "./shared/size-presets.js";
|
|
9
9
|
import { renderHelperRegion as u } from "./inputs/shared/templates.js";
|
|
10
10
|
import { defineFieldValue as d, dispatchNativeFieldEvent as f, setFieldValue as p } from "./inputs/shared/native-field-event.js";
|
|
11
11
|
import m from "./inputs/slider/slider.css.js";
|
|
12
12
|
import { bind as h, createStableId as g, define as _, getHost as v, html as y, onCleanup as b, onEvent as x, onMounted as S, prop as C, ref as w, useField as T, useSlots as E } from "@vielzeug/ore";
|
|
13
|
-
import { computed as D, signal as O } from "@vielzeug/ripple";
|
|
14
|
-
import { watch as k } from "@vielzeug/ripple/watch";
|
|
13
|
+
import { computed as D, signal as O, watch as k } from "@vielzeug/ripple";
|
|
15
14
|
//#region src/inputs/slider/slider.ts
|
|
16
15
|
var A = (e, t) => (n) => {
|
|
17
16
|
e() && t(n);
|
|
@@ -37,24 +36,24 @@ _(j, {
|
|
|
37
36
|
value: C.number(0),
|
|
38
37
|
"value-text": C.string()
|
|
39
38
|
},
|
|
40
|
-
setup(
|
|
41
|
-
let
|
|
42
|
-
max:
|
|
43
|
-
min:
|
|
44
|
-
step:
|
|
45
|
-
}), s = O(!1), c = D(() => !!
|
|
46
|
-
error:
|
|
47
|
-
helper:
|
|
39
|
+
setup(e) {
|
|
40
|
+
let t = v(), n = E(), r = e.range.value, o = a({
|
|
41
|
+
max: e.max,
|
|
42
|
+
min: e.min,
|
|
43
|
+
step: e.step
|
|
44
|
+
}), s = O(!1), c = D(() => !!e.disabled.value), l = O(void 0), m = g("helper"), _ = i({
|
|
45
|
+
error: e.error,
|
|
46
|
+
helper: e.helper
|
|
48
47
|
}), C = D(() => _.value.errorText), j = D(() => _.value.helperText), M = D(() => C.value || j.value ? m : null);
|
|
49
48
|
h({ attr: {
|
|
50
49
|
"data-dragging": () => s.value ? !0 : void 0,
|
|
51
|
-
size:
|
|
50
|
+
size: e.size
|
|
52
51
|
} });
|
|
53
52
|
let N = O("0");
|
|
54
|
-
|
|
53
|
+
r || (T({
|
|
55
54
|
disabled: c,
|
|
56
55
|
value: N
|
|
57
|
-
}), k(
|
|
56
|
+
}), k(e.value, (e) => {
|
|
58
57
|
N.value = String(e);
|
|
59
58
|
}, { immediate: !0 }), h({ attr: {
|
|
60
59
|
ariaDescribedby: () => M.value ?? null,
|
|
@@ -63,60 +62,60 @@ _(j, {
|
|
|
63
62
|
ariaValuemax: () => o.max(),
|
|
64
63
|
ariaValuemin: () => o.min(),
|
|
65
64
|
ariaValuenow: () => Number(N.value || 0),
|
|
66
|
-
ariaValuetext: () =>
|
|
65
|
+
ariaValuetext: () => e["value-text"].value ?? null,
|
|
67
66
|
role: () => "slider",
|
|
68
67
|
tabindex: () => c.value ? null : "0"
|
|
69
68
|
} }));
|
|
70
69
|
let P = O(0), F = O(100);
|
|
71
|
-
d(
|
|
72
|
-
if (
|
|
70
|
+
d(t, () => r ? `${P.value},${F.value}` : N.value, (e) => {
|
|
71
|
+
if (r) {
|
|
73
72
|
let [t, n] = e.split(",").map(Number);
|
|
74
73
|
Number.isFinite(t) && (P.value = o.snap(t)), Number.isFinite(n) && (F.value = o.snap(n));
|
|
75
74
|
return;
|
|
76
75
|
}
|
|
77
76
|
let t = Number(e);
|
|
78
77
|
Number.isFinite(t) && (N.value = String(o.snap(t)));
|
|
79
|
-
}),
|
|
78
|
+
}), r && (T({
|
|
80
79
|
disabled: c,
|
|
81
|
-
toFormValue: ({ from:
|
|
82
|
-
let r =
|
|
80
|
+
toFormValue: ({ from: t, to: n }) => {
|
|
81
|
+
let r = e.name.value;
|
|
83
82
|
if (!r) return null;
|
|
84
83
|
let i = new FormData();
|
|
85
|
-
return i.append(`${r}[from]`, String(
|
|
84
|
+
return i.append(`${r}[from]`, String(t)), i.append(`${r}[to]`, String(n)), i;
|
|
86
85
|
},
|
|
87
86
|
value: D(() => ({
|
|
88
87
|
from: P.value,
|
|
89
88
|
to: F.value
|
|
90
89
|
}))
|
|
91
|
-
}), k(
|
|
90
|
+
}), k(e.from, (e) => {
|
|
92
91
|
P.value = o.snap(Number(e));
|
|
93
|
-
}, { immediate: !0 }), k(
|
|
92
|
+
}, { immediate: !0 }), k(e.to, (e) => {
|
|
94
93
|
F.value = o.snap(Number(e));
|
|
95
94
|
}, { immediate: !0 }));
|
|
96
95
|
let I = w(), L = w(), R = w(), z = w(), B = w(), V = g("slider-start"), H = g("slider-end"), U = (e) => {
|
|
97
|
-
let
|
|
98
|
-
|
|
96
|
+
let n = o.toPercent(e);
|
|
97
|
+
t.style.setProperty("--_thumb-pos", `${n}%`), t.style.setProperty("--_fill-start", "0%"), t.style.setProperty("--_fill-width", `${n}%`);
|
|
99
98
|
}, W = () => {
|
|
100
|
-
let e = o.toPercent(P.value),
|
|
101
|
-
|
|
99
|
+
let e = o.toPercent(P.value), n = o.toPercent(F.value);
|
|
100
|
+
t.style.setProperty("--_thumb-start", `${e}%`), t.style.setProperty("--_thumb-end", `${n}%`), t.style.setProperty("--_fill-start", `${e}%`), t.style.setProperty("--_fill-width", `${n - e}%`);
|
|
102
101
|
}, G = () => {
|
|
103
|
-
let e =
|
|
104
|
-
p(
|
|
105
|
-
}, K = (
|
|
102
|
+
let e = r ? `${P.value},${F.value}` : N.value;
|
|
103
|
+
p(t, e), f(t, "input"), f(t, "change");
|
|
104
|
+
}, K = (t, n) => {
|
|
106
105
|
W();
|
|
107
106
|
let r = (e) => {
|
|
108
|
-
let
|
|
109
|
-
return o.fromClientX(e,
|
|
107
|
+
let t = n.getBoundingClientRect();
|
|
108
|
+
return o.fromClientX(e, t);
|
|
110
109
|
}, i = null, a = (e) => {
|
|
111
110
|
i === "start" ? P.value = Math.min(o.snap(e), F.value) : i === "end" && (F.value = Math.max(o.snap(e), P.value)), P.value = o.clamp(P.value), F.value = o.clamp(F.value), W(), G();
|
|
112
111
|
};
|
|
113
|
-
x(
|
|
112
|
+
x(t, "pointerdown", A(() => !c.value, (e) => {
|
|
114
113
|
e.preventDefault();
|
|
115
114
|
let t = r(e.clientX);
|
|
116
115
|
i = Math.abs(t - P.value) <= Math.abs(t - F.value) ? "start" : "end", e.target.setPointerCapture(e.pointerId), a(t);
|
|
117
|
-
})), x(
|
|
116
|
+
})), x(t, "pointermove", A(() => !!i, (e) => {
|
|
118
117
|
e.preventDefault(), s.value ||= !0, a(r(e.clientX));
|
|
119
|
-
})), x(
|
|
118
|
+
})), x(t, "pointerup", A(() => !!i, (e) => {
|
|
120
119
|
e.preventDefault(), i = null, s.value = !1, e.target.releasePointerCapture(e.pointerId);
|
|
121
120
|
}));
|
|
122
121
|
let l = (e, t) => (n) => {
|
|
@@ -131,7 +130,7 @@ _(j, {
|
|
|
131
130
|
valuemax: () => F.value,
|
|
132
131
|
valuemin: () => o.min(),
|
|
133
132
|
valuenow: () => P.value,
|
|
134
|
-
valuetext: () =>
|
|
133
|
+
valuetext: () => e["from-value-text"].value ?? null
|
|
135
134
|
} }, { target: u }))), d && (x(d, "keydown", l(() => F.value, (e) => {
|
|
136
135
|
F.value = Math.max(e, P.value);
|
|
137
136
|
})), b(h({ aria: {
|
|
@@ -139,22 +138,22 @@ _(j, {
|
|
|
139
138
|
valuemax: () => o.max(),
|
|
140
139
|
valuemin: () => P.value,
|
|
141
140
|
valuenow: () => F.value,
|
|
142
|
-
valuetext: () =>
|
|
141
|
+
valuetext: () => e["to-value-text"].value ?? null
|
|
143
142
|
} }, { target: d })));
|
|
144
|
-
}, q = (e,
|
|
143
|
+
}, q = (e, n) => {
|
|
145
144
|
U(Number(N.value));
|
|
146
|
-
let
|
|
145
|
+
let r = (e) => {
|
|
147
146
|
if (c.value) return;
|
|
148
|
-
let
|
|
147
|
+
let t = n.getBoundingClientRect(), r = o.fromClientX(e, t);
|
|
149
148
|
Number(N.value) !== r && (N.value = r.toString(), U(r), G());
|
|
150
149
|
}, i = !1;
|
|
151
150
|
x(e, "pointerdown", A(() => !c.value, (e) => {
|
|
152
|
-
e.preventDefault(), i = !0,
|
|
151
|
+
e.preventDefault(), i = !0, r(e.clientX), e.target.setPointerCapture(e.pointerId);
|
|
153
152
|
})), x(e, "pointermove", A(() => i, (e) => {
|
|
154
|
-
e.preventDefault(), s.value ||= !0,
|
|
153
|
+
e.preventDefault(), s.value ||= !0, r(e.clientX);
|
|
155
154
|
})), x(e, "pointerup", A(() => i, (e) => {
|
|
156
155
|
e.preventDefault(), i = !1, s.value = !1, e.target.releasePointerCapture(e.pointerId);
|
|
157
|
-
})), x(
|
|
156
|
+
})), x(t, "keydown", A(() => !c.value, (e) => {
|
|
158
157
|
let t = Number(N.value || 0), n = o.nextFromKey(e.key, t);
|
|
159
158
|
if (n === null) return;
|
|
160
159
|
e.preventDefault();
|
|
@@ -165,11 +164,11 @@ _(j, {
|
|
|
165
164
|
return S(() => {
|
|
166
165
|
let e = I.value, t = R.value;
|
|
167
166
|
if (!(!e || !t)) {
|
|
168
|
-
if (
|
|
167
|
+
if (n.has().value && L.value) {
|
|
169
168
|
let e = g("slider-label");
|
|
170
|
-
L.value.id = e,
|
|
169
|
+
L.value.id = e, r || (l.value = e);
|
|
171
170
|
}
|
|
172
|
-
|
|
171
|
+
r ? K(e, t) : q(e, t);
|
|
173
172
|
}
|
|
174
173
|
}), y`
|
|
175
174
|
<div class="slider-container" part="slider" ref=${I}>
|
|
@@ -199,11 +198,11 @@ _(j, {
|
|
|
199
198
|
`;
|
|
200
199
|
},
|
|
201
200
|
styles: [
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
201
|
+
n,
|
|
202
|
+
r,
|
|
203
|
+
t(l),
|
|
205
204
|
m,
|
|
206
|
-
|
|
205
|
+
e
|
|
207
206
|
]
|
|
208
207
|
});
|
|
209
208
|
//#endregion
|
package/dist/slider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider.js","names":[],"sources":["../src/inputs/slider/slider.ts"],"sourcesContent":["import {\n createStableId,\n define,\n html,\n prop,\n ref,\n bind,\n getHost,\n onCleanup,\n onEvent,\n onMounted,\n useSlots,\n} from '@vielzeug/ore';\nimport { useField } from '@vielzeug/ore';\nimport { computed, signal } from '@vielzeug/ripple';\nimport { watch } from '@vielzeug/ripple/watch';\n\nimport type { ComponentSize, ThemeColor } from '../../types';\n\nimport { createErrorHelperState, createSliderControl } from '../../core';\nimport { disablableBundle, sizableBundle, SLIDER_SIZE_PRESET, themableBundle } from '../../shared';\nimport { colorThemeMixin, disabledStateMixin, reducedMotionMixin, sizeVariantMixin } from '../../styles';\nimport { defineFieldValue, dispatchNativeFieldEvent, setFieldValue } from '../shared/native-field-event';\nimport { renderHelperRegion } from '../shared/templates';\nimport componentStyles from './slider.css?inline';\n\nconst guard =\n <E extends Event = Event>(condition: () => unknown, handler: (e: E) => void): ((e: E) => void) =>\n (e) => {\n if (condition()) handler(e);\n };\n\n/** Slider component properties */\n\nexport type OreSliderEvents = {\n change: Event;\n input: Event;\n};\n\nexport type OreSliderProps = {\n /** Theme color */\n color?: ThemeColor;\n /** Disable interaction */\n disabled?: boolean;\n /** Error message — marks the field as invalid (fallback when the `error` slot is empty) */\n error?: string;\n /** Range mode: lower bound */\n from?: number | string;\n /** Range mode a11y label for the start thumb (e.g. \"$20\") */\n 'from-value-text'?: string;\n /** Stretch to full width of container */\n fullwidth?: boolean;\n /** Helper text displayed below the slider (fallback when the `helper` slot is empty) */\n helper?: string;\n /** Maximum value */\n max?: number | string;\n /** Minimum value */\n min?: number | string;\n /** Single-value mode: form field name */\n name?: string;\n /** Activate two-thumb range selection */\n range?: boolean;\n /** Component size */\n size?: ComponentSize;\n /** Step increment */\n step?: number | string;\n /** Range mode: upper bound */\n to?: number | string;\n /** Range mode a11y label for the end thumb (e.g. \"$80\") */\n 'to-value-text'?: string;\n /** Single-value mode: current value */\n value?: number | string;\n /** Single-value mode a11y label override (e.g. \"75%\"). Overrides raw aria-valuenow. */\n 'value-text'?: string;\n};\n\n/**\n * A slider for selecting a single numeric value or a numeric range.\n *\n * Add the boolean `range` attribute to activate two-thumb range mode.\n *\n * @element ore-slider\n *\n * @attr {number} min - Minimum value (default: 0)\n * @attr {number} max - Maximum value (default: 100)\n * @attr {number} step - Step increment (default: 1)\n * @attr {number} value - Current value (single mode)\n * @attr {number} from - Lower bound (range mode)\n * @attr {number} to - Upper bound (range mode)\n * @attr {boolean} range - Activate range mode\n * @attr {boolean} disabled - Disable interaction\n * @attr {string} name - Form field name (single mode)\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - 'sm' | 'md' | 'lg'\n * @attr {string} helper - Helper text below the slider\n * @attr {string} error - Error message below the slider\n * @attr {boolean} fullwidth - Stretch to full width of container\n *\n * @fires input - Emitted when the slider value changes.\n * @fires change - Emitted when the slider value changes.\n *\n * @slot - Slider label text\n *\n * @part slider - Slider container\n * @part track - Track element\n * @part fill - Fill element\n * @part thumb - Single-value thumb\n * @part thumb-start - Range start thumb\n * @part thumb-end - Range end thumb\n * @part label - Label element\n * @part helper-text - The helper/error text element\n *\n * @cssprop --slider-height - Track height\n * @cssprop --slider-size - Thumb dimensions\n * @cssprop --slider-track-bg - Track background color\n * @cssprop --slider-fill - Active fill color\n * @cssprop --slider-thumb-bg - Thumb background color\n *\n * @example\n * ```html\n * <ore-slider value=\"50\" name=\"volume\">Volume</ore-slider>\n * <ore-slider range from=\"20\" to=\"80\" color=\"primary\">Price range</ore-slider>\n * ```\n */\nexport const SLIDER_TAG = 'ore-slider' as const;\ndefine<OreSliderProps>(SLIDER_TAG, {\n formAssociated: true,\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...disablableBundle,\n error: prop.string(),\n from: prop.number(0),\n 'from-value-text': prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n max: prop.number(100),\n min: prop.number(0),\n name: prop.string(),\n range: prop.bool(false),\n step: prop.number(1),\n to: prop.number(100),\n 'to-value-text': prop.string(),\n value: prop.number(0),\n 'value-text': prop.string(),\n },\n setup(props) {\n const el = getHost();\n const slots = useSlots();\n\n // Treat `range` as static — determined at first render\n const isRange = props.range.value;\n // ── Shared helpers ────────────────────────────────────────────\n const sliderControl = createSliderControl({\n max: props.max,\n min: props.min,\n step: props.step,\n });\n // ── Single-value state ────────────────────────────────────────\n const isDragging = signal(false);\n const isDisabled = computed(() => Boolean(props.disabled.value));\n const labelledById = signal<string | undefined>(undefined);\n const assistiveId = createStableId('helper');\n const assistive = createErrorHelperState({ error: props.error, helper: props.helper });\n const errorText = computed(() => assistive.value.errorText);\n const helperText = computed(() => assistive.value.helperText);\n const ariaDescribedBy = computed(() => (errorText.value || helperText.value ? assistiveId : null));\n\n bind({\n attr: {\n 'data-dragging': () => (isDragging.value ? true : undefined),\n size: props.size,\n },\n });\n\n const valueSignal = signal('0');\n\n if (!isRange) {\n useField({ disabled: isDisabled, value: valueSignal });\n watch(\n props.value,\n (v) => {\n valueSignal.value = String(v);\n },\n { immediate: true },\n );\n bind({\n attr: {\n ariaDescribedby: () => ariaDescribedBy.value ?? null,\n ariaDisabled: () => (isDisabled.value ? 'true' : null),\n ariaLabelledby: () => labelledById.value ?? null,\n ariaValuemax: () => sliderControl.max(),\n ariaValuemin: () => sliderControl.min(),\n ariaValuenow: () => Number(valueSignal.value || 0),\n ariaValuetext: () => props['value-text'].value ?? null,\n role: () => 'slider',\n tabindex: () => (isDisabled.value ? null : '0'),\n },\n });\n }\n\n // ── Range state ───────────────────────────────────────────────\n const startVal = signal(0);\n const endVal = signal(100);\n\n defineFieldValue(\n el,\n () => (isRange ? `${startVal.value},${endVal.value}` : valueSignal.value),\n (value) => {\n if (isRange) {\n const [from, to] = value.split(',').map(Number);\n\n if (Number.isFinite(from)) startVal.value = sliderControl.snap(from);\n\n if (Number.isFinite(to)) endVal.value = sliderControl.snap(to);\n\n return;\n }\n\n const next = Number(value);\n\n if (Number.isFinite(next)) valueSignal.value = String(sliderControl.snap(next));\n },\n );\n\n if (isRange) {\n useField<{\n from: number;\n to: number;\n }>({\n disabled: isDisabled,\n toFormValue: ({ from, to }) => {\n const name = props.name.value;\n\n if (!name) return null;\n\n const fd = new FormData();\n\n fd.append(`${name}[from]`, String(from));\n fd.append(`${name}[to]`, String(to));\n\n return fd;\n },\n value: computed(() => ({ from: startVal.value, to: endVal.value })),\n });\n watch(\n props.from,\n (v) => {\n startVal.value = sliderControl.snap(Number(v));\n },\n { immediate: true },\n );\n watch(\n props.to,\n (v) => {\n endVal.value = sliderControl.snap(Number(v));\n },\n { immediate: true },\n );\n }\n\n // ── Refs ──────────────────────────────────────────────────────\n const containerRef = ref<HTMLDivElement>();\n const labelRef = ref<HTMLSpanElement>();\n const trackRef = ref<HTMLDivElement>();\n const thumbStartRef = ref<HTMLDivElement>();\n const thumbEndRef = ref<HTMLDivElement>();\n const startId = createStableId('slider-start');\n const endId = createStableId('slider-end');\n // ── CSS update helpers ────────────────────────────────────────\n const updateSingleCSS = (value: number) => {\n const pct = sliderControl.toPercent(value);\n\n el.style.setProperty('--_thumb-pos', `${pct}%`);\n el.style.setProperty('--_fill-start', '0%');\n el.style.setProperty('--_fill-width', `${pct}%`);\n };\n const updateRangeCSS = () => {\n const s = sliderControl.toPercent(startVal.value);\n const e = sliderControl.toPercent(endVal.value);\n\n el.style.setProperty('--_thumb-start', `${s}%`);\n el.style.setProperty('--_thumb-end', `${e}%`);\n el.style.setProperty('--_fill-start', `${s}%`);\n el.style.setProperty('--_fill-width', `${e - s}%`);\n };\n const emitValueChange = () => {\n const value = isRange ? `${startVal.value},${endVal.value}` : valueSignal.value;\n\n setFieldValue(el, value);\n dispatchNativeFieldEvent(el, 'input');\n dispatchNativeFieldEvent(el, 'change');\n };\n\n // ── Range mode setup ──────────────────────────────────────────\n const setupRangeMode = (container: HTMLDivElement, track: HTMLDivElement) => {\n updateRangeCSS();\n\n const clientToValue = (clientX: number) => {\n const rect = track.getBoundingClientRect();\n\n return sliderControl.fromClientX(clientX, rect);\n };\n let dragging: 'start' | 'end' | null = null;\n const applyDrag = (val: number) => {\n if (dragging === 'start') startVal.value = Math.min(sliderControl.snap(val), endVal.value);\n else if (dragging === 'end') endVal.value = Math.max(sliderControl.snap(val), startVal.value);\n\n startVal.value = sliderControl.clamp(startVal.value);\n endVal.value = sliderControl.clamp(endVal.value);\n updateRangeCSS();\n emitValueChange();\n };\n\n onEvent(\n container,\n 'pointerdown',\n guard(\n () => !isDisabled.value,\n (e: PointerEvent) => {\n e.preventDefault();\n\n const val = clientToValue(e.clientX);\n\n dragging = Math.abs(val - startVal.value) <= Math.abs(val - endVal.value) ? 'start' : 'end';\n (e.target as Element).setPointerCapture(e.pointerId);\n applyDrag(val);\n },\n ),\n );\n onEvent(\n container,\n 'pointermove',\n guard(\n () => !!dragging,\n (e: PointerEvent) => {\n e.preventDefault();\n\n if (!isDragging.value) isDragging.value = true;\n\n applyDrag(clientToValue(e.clientX));\n },\n ),\n );\n onEvent(\n container,\n 'pointerup',\n guard(\n () => !!dragging,\n (e: PointerEvent) => {\n e.preventDefault();\n dragging = null;\n isDragging.value = false;\n (e.target as Element).releasePointerCapture(e.pointerId);\n },\n ),\n );\n\n const makeThumbKeydown = (getVal: () => number, setVal: (v: number) => void) => (e: KeyboardEvent) => {\n if (isDisabled.value) return;\n\n const next = sliderControl.nextFromKey(e.key, getVal());\n\n if (next === null) return;\n\n e.preventDefault();\n setVal(sliderControl.snap(next));\n updateRangeCSS();\n emitValueChange();\n };\n const thumbStartEl = thumbStartRef.value;\n const thumbEndEl = thumbEndRef.value;\n\n if (thumbStartEl) {\n onEvent(\n thumbStartEl,\n 'keydown',\n makeThumbKeydown(\n () => startVal.value,\n (v) => {\n startVal.value = Math.min(v, endVal.value);\n },\n ),\n );\n onCleanup(\n bind(\n {\n aria: {\n label: 'Range start',\n valuemax: () => endVal.value,\n valuemin: () => sliderControl.min(),\n valuenow: () => startVal.value,\n valuetext: () => props['from-value-text'].value ?? null,\n },\n },\n { target: thumbStartEl },\n ),\n );\n }\n\n if (thumbEndEl) {\n onEvent(\n thumbEndEl,\n 'keydown',\n makeThumbKeydown(\n () => endVal.value,\n (v) => {\n endVal.value = Math.max(v, startVal.value);\n },\n ),\n );\n onCleanup(\n bind(\n {\n aria: {\n label: 'Range end',\n valuemax: () => sliderControl.max(),\n valuemin: () => startVal.value,\n valuenow: () => endVal.value,\n valuetext: () => props['to-value-text'].value ?? null,\n },\n },\n { target: thumbEndEl },\n ),\n );\n }\n };\n // ── Single-value mode setup ───────────────────────────────────\n const setupSingleMode = (container: HTMLDivElement, track: HTMLDivElement) => {\n updateSingleCSS(Number(valueSignal.value));\n\n const updateValue = (clientX: number) => {\n if (isDisabled.value) return;\n\n const rect = track.getBoundingClientRect();\n const newValue = sliderControl.fromClientX(clientX, rect);\n\n if (Number(valueSignal.value) !== newValue) {\n valueSignal.value = newValue.toString();\n updateSingleCSS(newValue);\n emitValueChange();\n }\n };\n let isPointerDragging = false;\n\n onEvent(\n container,\n 'pointerdown',\n guard(\n () => !isDisabled.value,\n (e: PointerEvent) => {\n e.preventDefault();\n isPointerDragging = true;\n updateValue(e.clientX);\n (e.target as Element).setPointerCapture(e.pointerId);\n },\n ),\n );\n onEvent(\n container,\n 'pointermove',\n guard(\n () => isPointerDragging,\n (e: PointerEvent) => {\n e.preventDefault();\n\n if (!isDragging.value) isDragging.value = true;\n\n updateValue(e.clientX);\n },\n ),\n );\n onEvent(\n container,\n 'pointerup',\n guard(\n () => isPointerDragging,\n (e: PointerEvent) => {\n e.preventDefault();\n isPointerDragging = false;\n isDragging.value = false;\n (e.target as Element).releasePointerCapture(e.pointerId);\n },\n ),\n );\n onEvent(\n el,\n 'keydown',\n guard(\n () => !isDisabled.value,\n (e: KeyboardEvent) => {\n const val = Number(valueSignal.value || 0);\n const next = sliderControl.nextFromKey(e.key, val);\n\n if (next === null) return;\n\n e.preventDefault();\n\n const newValue = sliderControl.clamp(next);\n\n if (newValue !== val) {\n valueSignal.value = newValue.toString();\n updateSingleCSS(newValue);\n emitValueChange();\n }\n },\n ),\n );\n };\n\n onMounted(() => {\n const container = containerRef.value;\n const track = trackRef.value;\n\n if (!container || !track) return;\n\n if (slots.has().value && labelRef.value) {\n const labelId = createStableId('slider-label');\n\n labelRef.value.id = labelId;\n\n if (!isRange) labelledById.value = labelId;\n }\n\n if (isRange) setupRangeMode(container, track);\n else setupSingleMode(container, track);\n });\n\n return html`\n <div class=\"slider-container\" part=\"slider\" ref=${containerRef}>\n <div class=\"slider-track\" part=\"track\" ref=${trackRef}>\n <div class=\"slider-fill\" part=\"fill\"></div>\n <div class=\"slider-thumb slider-thumb-sole\" part=\"thumb\"></div>\n <div\n class=\"slider-thumb slider-thumb-start\"\n part=\"thumb-start\"\n ref=${thumbStartRef}\n role=\"slider\"\n tabindex=\"${() => (isDisabled.value ? '-1' : '0')}\"\n aria-describedby=\"${ariaDescribedBy}\"\n id=\"${startId}\"></div>\n <div\n class=\"slider-thumb slider-thumb-end\"\n part=\"thumb-end\"\n ref=${thumbEndRef}\n role=\"slider\"\n tabindex=\"${() => (isDisabled.value ? '-1' : '0')}\"\n aria-describedby=\"${ariaDescribedBy}\"\n id=\"${endId}\"></div>\n </div>\n </div>\n <span class=\"label\" part=\"label\" ref=${labelRef}><slot></slot></span>\n ${renderHelperRegion(assistiveId, errorText, helperText)}\n `;\n },\n styles: [\n disabledStateMixin,\n colorThemeMixin,\n sizeVariantMixin(SLIDER_SIZE_PRESET),\n componentStyles,\n reducedMotionMixin,\n ],\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"slider.js","names":[],"sources":["../src/inputs/slider/slider.ts"],"sourcesContent":["import {\n bind,\n createStableId,\n define,\n getHost,\n html,\n onCleanup,\n onEvent,\n onMounted,\n prop,\n ref,\n useField,\n useSlots,\n} from '@vielzeug/ore';\nimport { computed, signal, watch } from '@vielzeug/ripple';\nimport { createErrorHelperState, createSliderControl } from '../../core';\nimport { disablableBundle, SLIDER_SIZE_PRESET, sizableBundle, themableBundle } from '../../shared';\nimport { colorThemeMixin, disabledStateMixin, reducedMotionMixin, sizeVariantMixin } from '../../styles';\nimport type { ComponentSize, ThemeColor } from '../../types';\nimport { defineFieldValue, dispatchNativeFieldEvent, setFieldValue } from '../shared/native-field-event';\nimport { renderHelperRegion } from '../shared/templates';\nimport componentStyles from './slider.css?inline';\n\nconst guard =\n <E extends Event = Event>(condition: () => unknown, handler: (e: E) => void): ((e: E) => void) =>\n (e) => {\n if (condition()) handler(e);\n };\n\n/** Slider component properties */\n\nexport type OreSliderEvents = {\n change: Event;\n input: Event;\n};\n\nexport type OreSliderProps = {\n /** Theme color */\n color?: ThemeColor;\n /** Disable interaction */\n disabled?: boolean;\n /** Error message — marks the field as invalid (fallback when the `error` slot is empty) */\n error?: string;\n /** Range mode: lower bound */\n from?: number | string;\n /** Range mode a11y label for the start thumb (e.g. \"$20\") */\n 'from-value-text'?: string;\n /** Stretch to full width of container */\n fullwidth?: boolean;\n /** Helper text displayed below the slider (fallback when the `helper` slot is empty) */\n helper?: string;\n /** Maximum value */\n max?: number | string;\n /** Minimum value */\n min?: number | string;\n /** Single-value mode: form field name */\n name?: string;\n /** Activate two-thumb range selection */\n range?: boolean;\n /** Component size */\n size?: ComponentSize;\n /** Step increment */\n step?: number | string;\n /** Range mode: upper bound */\n to?: number | string;\n /** Range mode a11y label for the end thumb (e.g. \"$80\") */\n 'to-value-text'?: string;\n /** Single-value mode: current value */\n value?: number | string;\n /** Single-value mode a11y label override (e.g. \"75%\"). Overrides raw aria-valuenow. */\n 'value-text'?: string;\n};\n\n/**\n * A slider for selecting a single numeric value or a numeric range.\n *\n * Add the boolean `range` attribute to activate two-thumb range mode.\n *\n * @element ore-slider\n *\n * @attr {number} min - Minimum value (default: 0)\n * @attr {number} max - Maximum value (default: 100)\n * @attr {number} step - Step increment (default: 1)\n * @attr {number} value - Current value (single mode)\n * @attr {number} from - Lower bound (range mode)\n * @attr {number} to - Upper bound (range mode)\n * @attr {boolean} range - Activate range mode\n * @attr {boolean} disabled - Disable interaction\n * @attr {string} name - Form field name (single mode)\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - 'sm' | 'md' | 'lg'\n * @attr {string} helper - Helper text below the slider\n * @attr {string} error - Error message below the slider\n * @attr {boolean} fullwidth - Stretch to full width of container\n *\n * @fires input - Emitted when the slider value changes.\n * @fires change - Emitted when the slider value changes.\n *\n * @slot - Slider label text\n *\n * @part slider - Slider container\n * @part track - Track element\n * @part fill - Fill element\n * @part thumb - Single-value thumb\n * @part thumb-start - Range start thumb\n * @part thumb-end - Range end thumb\n * @part label - Label element\n * @part helper-text - The helper/error text element\n *\n * @cssprop --slider-height - Track height\n * @cssprop --slider-size - Thumb dimensions\n * @cssprop --slider-track-bg - Track background color\n * @cssprop --slider-fill - Active fill color\n * @cssprop --slider-thumb-bg - Thumb background color\n *\n * @example\n * ```html\n * <ore-slider value=\"50\" name=\"volume\">Volume</ore-slider>\n * <ore-slider range from=\"20\" to=\"80\" color=\"primary\">Price range</ore-slider>\n * ```\n */\nexport const SLIDER_TAG = 'ore-slider' as const;\ndefine<OreSliderProps>(SLIDER_TAG, {\n formAssociated: true,\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...disablableBundle,\n error: prop.string(),\n from: prop.number(0),\n 'from-value-text': prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n max: prop.number(100),\n min: prop.number(0),\n name: prop.string(),\n range: prop.bool(false),\n step: prop.number(1),\n to: prop.number(100),\n 'to-value-text': prop.string(),\n value: prop.number(0),\n 'value-text': prop.string(),\n },\n setup(props) {\n const el = getHost();\n const slots = useSlots();\n\n // Treat `range` as static — determined at first render\n const isRange = props.range.value;\n // ── Shared helpers ────────────────────────────────────────────\n const sliderControl = createSliderControl({\n max: props.max,\n min: props.min,\n step: props.step,\n });\n // ── Single-value state ────────────────────────────────────────\n const isDragging = signal(false);\n const isDisabled = computed(() => Boolean(props.disabled.value));\n const labelledById = signal<string | undefined>(undefined);\n const assistiveId = createStableId('helper');\n const assistive = createErrorHelperState({ error: props.error, helper: props.helper });\n const errorText = computed(() => assistive.value.errorText);\n const helperText = computed(() => assistive.value.helperText);\n const ariaDescribedBy = computed(() => (errorText.value || helperText.value ? assistiveId : null));\n\n bind({\n attr: {\n 'data-dragging': () => (isDragging.value ? true : undefined),\n size: props.size,\n },\n });\n\n const valueSignal = signal('0');\n\n if (!isRange) {\n useField({ disabled: isDisabled, value: valueSignal });\n watch(\n props.value,\n (v) => {\n valueSignal.value = String(v);\n },\n { immediate: true },\n );\n bind({\n attr: {\n ariaDescribedby: () => ariaDescribedBy.value ?? null,\n ariaDisabled: () => (isDisabled.value ? 'true' : null),\n ariaLabelledby: () => labelledById.value ?? null,\n ariaValuemax: () => sliderControl.max(),\n ariaValuemin: () => sliderControl.min(),\n ariaValuenow: () => Number(valueSignal.value || 0),\n ariaValuetext: () => props['value-text'].value ?? null,\n role: () => 'slider',\n tabindex: () => (isDisabled.value ? null : '0'),\n },\n });\n }\n\n // ── Range state ───────────────────────────────────────────────\n const startVal = signal(0);\n const endVal = signal(100);\n\n defineFieldValue(\n el,\n () => (isRange ? `${startVal.value},${endVal.value}` : valueSignal.value),\n (value) => {\n if (isRange) {\n const [from, to] = value.split(',').map(Number);\n\n if (Number.isFinite(from)) startVal.value = sliderControl.snap(from);\n\n if (Number.isFinite(to)) endVal.value = sliderControl.snap(to);\n\n return;\n }\n\n const next = Number(value);\n\n if (Number.isFinite(next)) valueSignal.value = String(sliderControl.snap(next));\n },\n );\n\n if (isRange) {\n useField<{\n from: number;\n to: number;\n }>({\n disabled: isDisabled,\n toFormValue: ({ from, to }) => {\n const name = props.name.value;\n\n if (!name) return null;\n\n const fd = new FormData();\n\n fd.append(`${name}[from]`, String(from));\n fd.append(`${name}[to]`, String(to));\n\n return fd;\n },\n value: computed(() => ({ from: startVal.value, to: endVal.value })),\n });\n watch(\n props.from,\n (v) => {\n startVal.value = sliderControl.snap(Number(v));\n },\n { immediate: true },\n );\n watch(\n props.to,\n (v) => {\n endVal.value = sliderControl.snap(Number(v));\n },\n { immediate: true },\n );\n }\n\n // ── Refs ──────────────────────────────────────────────────────\n const containerRef = ref<HTMLDivElement>();\n const labelRef = ref<HTMLSpanElement>();\n const trackRef = ref<HTMLDivElement>();\n const thumbStartRef = ref<HTMLDivElement>();\n const thumbEndRef = ref<HTMLDivElement>();\n const startId = createStableId('slider-start');\n const endId = createStableId('slider-end');\n // ── CSS update helpers ────────────────────────────────────────\n const updateSingleCSS = (value: number) => {\n const pct = sliderControl.toPercent(value);\n\n el.style.setProperty('--_thumb-pos', `${pct}%`);\n el.style.setProperty('--_fill-start', '0%');\n el.style.setProperty('--_fill-width', `${pct}%`);\n };\n const updateRangeCSS = () => {\n const s = sliderControl.toPercent(startVal.value);\n const e = sliderControl.toPercent(endVal.value);\n\n el.style.setProperty('--_thumb-start', `${s}%`);\n el.style.setProperty('--_thumb-end', `${e}%`);\n el.style.setProperty('--_fill-start', `${s}%`);\n el.style.setProperty('--_fill-width', `${e - s}%`);\n };\n const emitValueChange = () => {\n const value = isRange ? `${startVal.value},${endVal.value}` : valueSignal.value;\n\n setFieldValue(el, value);\n dispatchNativeFieldEvent(el, 'input');\n dispatchNativeFieldEvent(el, 'change');\n };\n\n // ── Range mode setup ──────────────────────────────────────────\n const setupRangeMode = (container: HTMLDivElement, track: HTMLDivElement) => {\n updateRangeCSS();\n\n const clientToValue = (clientX: number) => {\n const rect = track.getBoundingClientRect();\n\n return sliderControl.fromClientX(clientX, rect);\n };\n let dragging: 'start' | 'end' | null = null;\n const applyDrag = (val: number) => {\n if (dragging === 'start') startVal.value = Math.min(sliderControl.snap(val), endVal.value);\n else if (dragging === 'end') endVal.value = Math.max(sliderControl.snap(val), startVal.value);\n\n startVal.value = sliderControl.clamp(startVal.value);\n endVal.value = sliderControl.clamp(endVal.value);\n updateRangeCSS();\n emitValueChange();\n };\n\n onEvent(\n container,\n 'pointerdown',\n guard(\n () => !isDisabled.value,\n (e: PointerEvent) => {\n e.preventDefault();\n\n const val = clientToValue(e.clientX);\n\n dragging = Math.abs(val - startVal.value) <= Math.abs(val - endVal.value) ? 'start' : 'end';\n (e.target as Element).setPointerCapture(e.pointerId);\n applyDrag(val);\n },\n ),\n );\n onEvent(\n container,\n 'pointermove',\n guard(\n () => !!dragging,\n (e: PointerEvent) => {\n e.preventDefault();\n\n if (!isDragging.value) isDragging.value = true;\n\n applyDrag(clientToValue(e.clientX));\n },\n ),\n );\n onEvent(\n container,\n 'pointerup',\n guard(\n () => !!dragging,\n (e: PointerEvent) => {\n e.preventDefault();\n dragging = null;\n isDragging.value = false;\n (e.target as Element).releasePointerCapture(e.pointerId);\n },\n ),\n );\n\n const makeThumbKeydown = (getVal: () => number, setVal: (v: number) => void) => (e: KeyboardEvent) => {\n if (isDisabled.value) return;\n\n const next = sliderControl.nextFromKey(e.key, getVal());\n\n if (next === null) return;\n\n e.preventDefault();\n setVal(sliderControl.snap(next));\n updateRangeCSS();\n emitValueChange();\n };\n const thumbStartEl = thumbStartRef.value;\n const thumbEndEl = thumbEndRef.value;\n\n if (thumbStartEl) {\n onEvent(\n thumbStartEl,\n 'keydown',\n makeThumbKeydown(\n () => startVal.value,\n (v) => {\n startVal.value = Math.min(v, endVal.value);\n },\n ),\n );\n onCleanup(\n bind(\n {\n aria: {\n label: 'Range start',\n valuemax: () => endVal.value,\n valuemin: () => sliderControl.min(),\n valuenow: () => startVal.value,\n valuetext: () => props['from-value-text'].value ?? null,\n },\n },\n { target: thumbStartEl },\n ),\n );\n }\n\n if (thumbEndEl) {\n onEvent(\n thumbEndEl,\n 'keydown',\n makeThumbKeydown(\n () => endVal.value,\n (v) => {\n endVal.value = Math.max(v, startVal.value);\n },\n ),\n );\n onCleanup(\n bind(\n {\n aria: {\n label: 'Range end',\n valuemax: () => sliderControl.max(),\n valuemin: () => startVal.value,\n valuenow: () => endVal.value,\n valuetext: () => props['to-value-text'].value ?? null,\n },\n },\n { target: thumbEndEl },\n ),\n );\n }\n };\n // ── Single-value mode setup ───────────────────────────────────\n const setupSingleMode = (container: HTMLDivElement, track: HTMLDivElement) => {\n updateSingleCSS(Number(valueSignal.value));\n\n const updateValue = (clientX: number) => {\n if (isDisabled.value) return;\n\n const rect = track.getBoundingClientRect();\n const newValue = sliderControl.fromClientX(clientX, rect);\n\n if (Number(valueSignal.value) !== newValue) {\n valueSignal.value = newValue.toString();\n updateSingleCSS(newValue);\n emitValueChange();\n }\n };\n let isPointerDragging = false;\n\n onEvent(\n container,\n 'pointerdown',\n guard(\n () => !isDisabled.value,\n (e: PointerEvent) => {\n e.preventDefault();\n isPointerDragging = true;\n updateValue(e.clientX);\n (e.target as Element).setPointerCapture(e.pointerId);\n },\n ),\n );\n onEvent(\n container,\n 'pointermove',\n guard(\n () => isPointerDragging,\n (e: PointerEvent) => {\n e.preventDefault();\n\n if (!isDragging.value) isDragging.value = true;\n\n updateValue(e.clientX);\n },\n ),\n );\n onEvent(\n container,\n 'pointerup',\n guard(\n () => isPointerDragging,\n (e: PointerEvent) => {\n e.preventDefault();\n isPointerDragging = false;\n isDragging.value = false;\n (e.target as Element).releasePointerCapture(e.pointerId);\n },\n ),\n );\n onEvent(\n el,\n 'keydown',\n guard(\n () => !isDisabled.value,\n (e: KeyboardEvent) => {\n const val = Number(valueSignal.value || 0);\n const next = sliderControl.nextFromKey(e.key, val);\n\n if (next === null) return;\n\n e.preventDefault();\n\n const newValue = sliderControl.clamp(next);\n\n if (newValue !== val) {\n valueSignal.value = newValue.toString();\n updateSingleCSS(newValue);\n emitValueChange();\n }\n },\n ),\n );\n };\n\n onMounted(() => {\n const container = containerRef.value;\n const track = trackRef.value;\n\n if (!container || !track) return;\n\n if (slots.has().value && labelRef.value) {\n const labelId = createStableId('slider-label');\n\n labelRef.value.id = labelId;\n\n if (!isRange) labelledById.value = labelId;\n }\n\n if (isRange) setupRangeMode(container, track);\n else setupSingleMode(container, track);\n });\n\n return html`\n <div class=\"slider-container\" part=\"slider\" ref=${containerRef}>\n <div class=\"slider-track\" part=\"track\" ref=${trackRef}>\n <div class=\"slider-fill\" part=\"fill\"></div>\n <div class=\"slider-thumb slider-thumb-sole\" part=\"thumb\"></div>\n <div\n class=\"slider-thumb slider-thumb-start\"\n part=\"thumb-start\"\n ref=${thumbStartRef}\n role=\"slider\"\n tabindex=\"${() => (isDisabled.value ? '-1' : '0')}\"\n aria-describedby=\"${ariaDescribedBy}\"\n id=\"${startId}\"></div>\n <div\n class=\"slider-thumb slider-thumb-end\"\n part=\"thumb-end\"\n ref=${thumbEndRef}\n role=\"slider\"\n tabindex=\"${() => (isDisabled.value ? '-1' : '0')}\"\n aria-describedby=\"${ariaDescribedBy}\"\n id=\"${endId}\"></div>\n </div>\n </div>\n <span class=\"label\" part=\"label\" ref=${labelRef}><slot></slot></span>\n ${renderHelperRegion(assistiveId, errorText, helperText)}\n `;\n },\n styles: [\n disabledStateMixin,\n colorThemeMixin,\n sizeVariantMixin(SLIDER_SIZE_PRESET),\n componentStyles,\n reducedMotionMixin,\n ],\n});\n"],"mappings":";;;;;;;;;;;;;;AAuBA,IAAM,KACsB,GAA0B,OACnD,MAAM;CACL,AAAI,EAAU,KAAG,EAAQ,CAAC;AAC5B,GA8FW,IAAa;AAC1B,EAAuB,GAAY;CACjC,gBAAgB;CAChB,OAAO;EACL,GAAG;EACH,GAAG;EACH,GAAG;EACH,OAAO,EAAK,OAAO;EACnB,MAAM,EAAK,OAAO,CAAC;EACnB,mBAAmB,EAAK,OAAO;EAC/B,WAAW,EAAK,KAAK,EAAK;EAC1B,QAAQ,EAAK,OAAO;EACpB,KAAK,EAAK,OAAO,GAAG;EACpB,KAAK,EAAK,OAAO,CAAC;EAClB,MAAM,EAAK,OAAO;EAClB,OAAO,EAAK,KAAK,EAAK;EACtB,MAAM,EAAK,OAAO,CAAC;EACnB,IAAI,EAAK,OAAO,GAAG;EACnB,iBAAiB,EAAK,OAAO;EAC7B,OAAO,EAAK,OAAO,CAAC;EACpB,cAAc,EAAK,OAAO;CAC5B;CACA,MAAM,GAAO;EACX,IAAM,IAAK,EAAQ,GACb,IAAQ,EAAS,GAGjB,IAAU,EAAM,MAAM,OAEtB,IAAgB,EAAoB;GACxC,KAAK,EAAM;GACX,KAAK,EAAM;GACX,MAAM,EAAM;EACd,CAAC,GAEK,IAAa,EAAO,EAAK,GACzB,IAAa,QAAe,EAAQ,EAAM,SAAS,KAAM,GACzD,IAAe,EAA2B,KAAA,CAAS,GACnD,IAAc,EAAe,QAAQ,GACrC,IAAY,EAAuB;GAAE,OAAO,EAAM;GAAO,QAAQ,EAAM;EAAO,CAAC,GAC/E,IAAY,QAAe,EAAU,MAAM,SAAS,GACpD,IAAa,QAAe,EAAU,MAAM,UAAU,GACtD,IAAkB,QAAgB,EAAU,SAAS,EAAW,QAAQ,IAAc,IAAK;EAEjG,EAAK,EACH,MAAM;GACJ,uBAAwB,EAAW,QAAQ,KAAO,KAAA;GAClD,MAAM,EAAM;EACd,EACF,CAAC;EAED,IAAM,IAAc,EAAO,GAAG;EAE9B,AAAK,MACH,EAAS;GAAE,UAAU;GAAY,OAAO;EAAY,CAAC,GACrD,EACE,EAAM,QACL,MAAM;GACL,EAAY,QAAQ,OAAO,CAAC;EAC9B,GACA,EAAE,WAAW,GAAK,CACpB,GACA,EAAK,EACH,MAAM;GACJ,uBAAuB,EAAgB,SAAS;GAChD,oBAAqB,EAAW,QAAQ,SAAS;GACjD,sBAAsB,EAAa,SAAS;GAC5C,oBAAoB,EAAc,IAAI;GACtC,oBAAoB,EAAc,IAAI;GACtC,oBAAoB,OAAO,EAAY,SAAS,CAAC;GACjD,qBAAqB,EAAM,aAAa,CAAC,SAAS;GAClD,YAAY;GACZ,gBAAiB,EAAW,QAAQ,OAAO;EAC7C,EACF,CAAC;EAIH,IAAM,IAAW,EAAO,CAAC,GACnB,IAAS,EAAO,GAAG;EAsBzB,AApBA,EACE,SACO,IAAU,GAAG,EAAS,MAAM,GAAG,EAAO,UAAU,EAAY,QAClE,MAAU;GACT,IAAI,GAAS;IACX,IAAM,CAAC,GAAM,KAAM,EAAM,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;IAI9C,AAFI,OAAO,SAAS,CAAI,MAAG,EAAS,QAAQ,EAAc,KAAK,CAAI,IAE/D,OAAO,SAAS,CAAE,MAAG,EAAO,QAAQ,EAAc,KAAK,CAAE;IAE7D;GACF;GAEA,IAAM,IAAO,OAAO,CAAK;GAEzB,AAAI,OAAO,SAAS,CAAI,MAAG,EAAY,QAAQ,OAAO,EAAc,KAAK,CAAI,CAAC;EAChF,CACF,GAEI,MACF,EAGG;GACD,UAAU;GACV,cAAc,EAAE,SAAM,YAAS;IAC7B,IAAM,IAAO,EAAM,KAAK;IAExB,IAAI,CAAC,GAAM,OAAO;IAElB,IAAM,IAAK,IAAI,SAAS;IAKxB,OAHA,EAAG,OAAO,GAAG,EAAK,SAAS,OAAO,CAAI,CAAC,GACvC,EAAG,OAAO,GAAG,EAAK,OAAO,OAAO,CAAE,CAAC,GAE5B;GACT;GACA,OAAO,SAAgB;IAAE,MAAM,EAAS;IAAO,IAAI,EAAO;GAAM,EAAE;EACpE,CAAC,GACD,EACE,EAAM,OACL,MAAM;GACL,EAAS,QAAQ,EAAc,KAAK,OAAO,CAAC,CAAC;EAC/C,GACA,EAAE,WAAW,GAAK,CACpB,GACA,EACE,EAAM,KACL,MAAM;GACL,EAAO,QAAQ,EAAc,KAAK,OAAO,CAAC,CAAC;EAC7C,GACA,EAAE,WAAW,GAAK,CACpB;EAIF,IAAM,IAAe,EAAoB,GACnC,IAAW,EAAqB,GAChC,IAAW,EAAoB,GAC/B,IAAgB,EAAoB,GACpC,IAAc,EAAoB,GAClC,IAAU,EAAe,cAAc,GACvC,IAAQ,EAAe,YAAY,GAEnC,KAAmB,MAAkB;GACzC,IAAM,IAAM,EAAc,UAAU,CAAK;GAIzC,AAFA,EAAG,MAAM,YAAY,gBAAgB,GAAG,EAAI,EAAE,GAC9C,EAAG,MAAM,YAAY,iBAAiB,IAAI,GAC1C,EAAG,MAAM,YAAY,iBAAiB,GAAG,EAAI,EAAE;EACjD,GACM,UAAuB;GAC3B,IAAM,IAAI,EAAc,UAAU,EAAS,KAAK,GAC1C,IAAI,EAAc,UAAU,EAAO,KAAK;GAK9C,AAHA,EAAG,MAAM,YAAY,kBAAkB,GAAG,EAAE,EAAE,GAC9C,EAAG,MAAM,YAAY,gBAAgB,GAAG,EAAE,EAAE,GAC5C,EAAG,MAAM,YAAY,iBAAiB,GAAG,EAAE,EAAE,GAC7C,EAAG,MAAM,YAAY,iBAAiB,GAAG,IAAI,EAAE,EAAE;EACnD,GACM,UAAwB;GAC5B,IAAM,IAAQ,IAAU,GAAG,EAAS,MAAM,GAAG,EAAO,UAAU,EAAY;GAI1E,AAFA,EAAc,GAAI,CAAK,GACvB,EAAyB,GAAI,OAAO,GACpC,EAAyB,GAAI,QAAQ;EACvC,GAGM,KAAkB,GAA2B,MAA0B;GAC3E,EAAe;GAEf,IAAM,KAAiB,MAAoB;IACzC,IAAM,IAAO,EAAM,sBAAsB;IAEzC,OAAO,EAAc,YAAY,GAAS,CAAI;GAChD,GACI,IAAmC,MACjC,KAAa,MAAgB;IAOjC,AANI,MAAa,UAAS,EAAS,QAAQ,KAAK,IAAI,EAAc,KAAK,CAAG,GAAG,EAAO,KAAK,IAChF,MAAa,UAAO,EAAO,QAAQ,KAAK,IAAI,EAAc,KAAK,CAAG,GAAG,EAAS,KAAK,IAE5F,EAAS,QAAQ,EAAc,MAAM,EAAS,KAAK,GACnD,EAAO,QAAQ,EAAc,MAAM,EAAO,KAAK,GAC/C,EAAe,GACf,EAAgB;GAClB;GAgCA,AA9BA,EACE,GACA,eACA,QACQ,CAAC,EAAW,QACjB,MAAoB;IACnB,EAAE,eAAe;IAEjB,IAAM,IAAM,EAAc,EAAE,OAAO;IAInC,AAFA,IAAW,KAAK,IAAI,IAAM,EAAS,KAAK,KAAK,KAAK,IAAI,IAAM,EAAO,KAAK,IAAI,UAAU,OACtF,EAAG,OAAmB,kBAAkB,EAAE,SAAS,GACnD,EAAU,CAAG;GACf,CACF,CACF,GACA,EACE,GACA,eACA,QACQ,CAAC,CAAC,IACP,MAAoB;IAKnB,AAJA,EAAE,eAAe,GAEjB,AAAuB,EAAW,UAAQ,IAE1C,EAAU,EAAc,EAAE,OAAO,CAAC;GACpC,CACF,CACF,GACA,EACE,GACA,aACA,QACQ,CAAC,CAAC,IACP,MAAoB;IAInB,AAHA,EAAE,eAAe,GACjB,IAAW,MACX,EAAW,QAAQ,IACnB,EAAG,OAAmB,sBAAsB,EAAE,SAAS;GACzD,CACF,CACF;GAEA,IAAM,KAAoB,GAAsB,OAAiC,MAAqB;IACpG,IAAI,EAAW,OAAO;IAEtB,IAAM,IAAO,EAAc,YAAY,EAAE,KAAK,EAAO,CAAC;IAElD,MAAS,SAEb,EAAE,eAAe,GACjB,EAAO,EAAc,KAAK,CAAI,CAAC,GAC/B,EAAe,GACf,EAAgB;GAClB,GACM,IAAe,EAAc,OAC7B,IAAa,EAAY;GA6B/B,AA3BI,MACF,EACE,GACA,WACA,QACQ,EAAS,QACd,MAAM;IACL,EAAS,QAAQ,KAAK,IAAI,GAAG,EAAO,KAAK;GAC3C,CACF,CACF,GACA,EACE,EACE,EACE,MAAM;IACJ,OAAO;IACP,gBAAgB,EAAO;IACvB,gBAAgB,EAAc,IAAI;IAClC,gBAAgB,EAAS;IACzB,iBAAiB,EAAM,kBAAkB,CAAC,SAAS;GACrD,EACF,GACA,EAAE,QAAQ,EAAa,CACzB,CACF,IAGE,MACF,EACE,GACA,WACA,QACQ,EAAO,QACZ,MAAM;IACL,EAAO,QAAQ,KAAK,IAAI,GAAG,EAAS,KAAK;GAC3C,CACF,CACF,GACA,EACE,EACE,EACE,MAAM;IACJ,OAAO;IACP,gBAAgB,EAAc,IAAI;IAClC,gBAAgB,EAAS;IACzB,gBAAgB,EAAO;IACvB,iBAAiB,EAAM,gBAAgB,CAAC,SAAS;GACnD,EACF,GACA,EAAE,QAAQ,EAAW,CACvB,CACF;EAEJ,GAEM,KAAmB,GAA2B,MAA0B;GAC5E,EAAgB,OAAO,EAAY,KAAK,CAAC;GAEzC,IAAM,KAAe,MAAoB;IACvC,IAAI,EAAW,OAAO;IAEtB,IAAM,IAAO,EAAM,sBAAsB,GACnC,IAAW,EAAc,YAAY,GAAS,CAAI;IAExD,AAAI,OAAO,EAAY,KAAK,MAAM,MAChC,EAAY,QAAQ,EAAS,SAAS,GACtC,EAAgB,CAAQ,GACxB,EAAgB;GAEpB,GACI,IAAoB;GA0CxB,AAxCA,EACE,GACA,eACA,QACQ,CAAC,EAAW,QACjB,MAAoB;IAInB,AAHA,EAAE,eAAe,GACjB,IAAoB,IACpB,EAAY,EAAE,OAAO,GACrB,EAAG,OAAmB,kBAAkB,EAAE,SAAS;GACrD,CACF,CACF,GACA,EACE,GACA,eACA,QACQ,IACL,MAAoB;IAKnB,AAJA,EAAE,eAAe,GAEjB,AAAuB,EAAW,UAAQ,IAE1C,EAAY,EAAE,OAAO;GACvB,CACF,CACF,GACA,EACE,GACA,aACA,QACQ,IACL,MAAoB;IAInB,AAHA,EAAE,eAAe,GACjB,IAAoB,IACpB,EAAW,QAAQ,IACnB,EAAG,OAAmB,sBAAsB,EAAE,SAAS;GACzD,CACF,CACF,GACA,EACE,GACA,WACA,QACQ,CAAC,EAAW,QACjB,MAAqB;IACpB,IAAM,IAAM,OAAO,EAAY,SAAS,CAAC,GACnC,IAAO,EAAc,YAAY,EAAE,KAAK,CAAG;IAEjD,IAAI,MAAS,MAAM;IAEnB,EAAE,eAAe;IAEjB,IAAM,IAAW,EAAc,MAAM,CAAI;IAEzC,AAAI,MAAa,MACf,EAAY,QAAQ,EAAS,SAAS,GACtC,EAAgB,CAAQ,GACxB,EAAgB;GAEpB,CACF,CACF;EACF;EAoBA,OAlBA,QAAgB;GACd,IAAM,IAAY,EAAa,OACzB,IAAQ,EAAS;GAEnB,OAAC,KAAa,CAAC,IAEnB;QAAI,EAAM,IAAI,CAAC,CAAC,SAAS,EAAS,OAAO;KACvC,IAAM,IAAU,EAAe,cAAc;KAI7C,AAFA,EAAS,MAAM,KAAK,GAEf,MAAS,EAAa,QAAQ;IACrC;IAEA,AAAI,IAAS,EAAe,GAAW,CAAK,IACvC,EAAgB,GAAW,CAAK;GAHrC;EAIF,CAAC,GAEM,CAAI;wDACyC,EAAa;qDAChB,EAAS;;;;;;kBAM5C,EAAc;;8BAED,EAAW,QAAQ,OAAO,IAAK;gCAC9B,EAAgB;kBAC9B,EAAQ;;;;kBAIR,EAAY;;8BAEC,EAAW,QAAQ,OAAO,IAAK;gCAC9B,EAAgB;kBAC9B,EAAM;;;6CAGqB,EAAS;QAC9C,EAAmB,GAAa,GAAW,CAAU,EAAE;;CAE7D;CACA,QAAQ;EACN;EACA;EACA,EAAiB,CAAkB;EACnC;EACA;CACF;AACF,CAAC"}
|
package/dist/step.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step.cjs","names":[],"sources":["../src/content/stepper/step.ts"],"sourcesContent":["import { define, html, inject, prop, bind, getHost, useSlots, watchEffect } from '@vielzeug/ore';\n\nimport type { ComponentSize, ThemeColor } from '../../types';\n\nimport '../icon/icon';\nimport { disablableBundle } from '../../shared';\nimport { coarsePointerMixin, colorThemeMixin, forcedColorsFocusMixin } from '../../styles';\nimport { isStepNavigable } from './_is-step-navigable';\nimport stepStyles from './step.css?inline';\nimport { STEPPER_CTX } from './stepper';\n\nexport type OreStepProps = {\n /**\n * Theme color. Inherited from the parent `ore-stepper` when nested inside one (overrides\n * this value); only takes effect on its own when `ore-step` is rendered standalone.\n */\n color?: ThemeColor;\n /** Disables this step — it cannot be navigated to and is skipped by keyboard navigation. */\n disabled?: boolean;\n /** Marks this step as failed/invalid. Overrides the completed/current indicator visuals. */\n error?: boolean;\n /**\n * Marks this step as optional. Renders a small \"(optional)\" hint next to the label.\n * Purely presentational — has no effect on navigation.\n */\n optional?: boolean;\n /** Orientation. Inherited from the parent `ore-stepper` when nested inside one. */\n orientation?: 'horizontal' | 'vertical';\n /** Component size. Inherited from the parent `ore-stepper` when nested inside one. */\n size?: ComponentSize;\n /** Unique identifier, matches `ore-stepper`'s `value` attribute. */\n value: string;\n};\n\n/**\n * A single step trigger. Must be placed as a direct child of `ore-stepper`, which provides\n * this step's current/completed/navigable/index/total state via context — those are derived,\n * read-only attributes on this element, not settable props.\n *\n * @element ore-step\n *\n * @attr {string} value - Unique identifier, matches the parent ore-stepper's `value` attribute\n * @attr {boolean} disabled - Prevents navigation to this step\n * @attr {boolean} error - Marks the step as failed/invalid\n * @attr {boolean} optional - Renders an \"(optional)\" hint next to the label\n * @attr {boolean} current - Read-only. Derived from position relative to the parent ore-stepper's `value`.\n * @attr {boolean} completed - Read-only. Derived from position relative to the parent ore-stepper's `value`.\n * @attr {boolean} navigable - Read-only. Derived from the parent ore-stepper's `clickable`/`linear`/`disabled`.\n * @attr {number} index - Read-only. This step's 1-based position among its siblings.\n * @attr {number} total - Read-only. Total sibling step count.\n * @attr {string} color - Inherited from ore-stepper: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - Inherited from ore-stepper: 'sm' | 'md' | 'lg'\n * @attr {string} orientation - Inherited from ore-stepper: 'horizontal' | 'vertical'\n *\n * @slot - Step label\n * @slot description - Optional supporting text shown below the label\n * @slot icon - Custom icon replacing the step number/check/error indicator\n *\n * @part control - Clickable (or static) root element for the step\n * @part indicator - Circular indicator holding the number/icon\n * @part content - Wrapper around the label and description\n * @part label - Step label element\n * @part description - Step description element\n * @part connector - Connector line segments (leading and trailing halves) either side of this step's indicator\n *\n * @example\n * ```html\n * <ore-step value=\"details\">Account details</ore-step>\n * <ore-step value=\"review\" disabled>Review</ore-step>\n * ```\n */\nexport const STEP_TAG = 'ore-step' as const;\ndefine<OreStepProps>(STEP_TAG, {\n props: {\n ...disablableBundle,\n color: prop.string<ThemeColor>(),\n error: prop.bool(false),\n optional: prop.bool(false),\n orientation: prop.oneOf(['horizontal', 'vertical'] as const, 'horizontal'),\n size: prop.string<ComponentSize>(),\n value: prop.string(''),\n },\n setup(props) {\n const el = getHost();\n const slots = useSlots();\n const stepperCtx = inject(STEPPER_CTX);\n\n // ────────────────────────────────────────────────────────────────\n // State derived from the parent ore-stepper's context — see stepper.ts's\n // module doc comment for why this replaced parent-side attribute fan-out.\n // ────────────────────────────────────────────────────────────────\n\n // Plain functions, not `computed()` — every one of these ultimately reads\n // `stepperCtx.stepValues`/`stepperCtx.currentValue`, which are themselves `computed()`s\n // owned by the parent `ore-stepper`. Wrapping a *child* `computed()` around a *parent*\n // `computed()` (a computed-to-computed dependency crossing a `provide()`/`inject()`\n // boundary) is exactly the shape that surfaced two related bugs: a step's `completed`/\n // `current` attributes going permanently stale after a few rapid selections, and — worse —\n // a step's entire clickable/static control silently failing to render at all when its\n // `ore-step` tag upgrades before its siblings exist in the light DOM yet (true whenever\n // `ore-step`/`ore-stepper` are already `customElements.define()`d before this markup is\n // parsed, e.g. every sandboxed live-preview iframe). Reading straight through to the\n // parent's computeds on every call — no intermediate computed layer of our own to go\n // stale — made both disappear. Cheap enough to not need memoizing (a couple of `indexOf`/\n // comparisons over an already-memoized parent computed).\n const stepIndex = (): number => (stepperCtx ? stepperCtx.stepValues.value.indexOf(props.value.value) : -1);\n const totalSteps = (): number => stepperCtx?.stepValues.value.length ?? 0;\n const currentIndex = (): number =>\n stepperCtx ? stepperCtx.stepValues.value.indexOf(stepperCtx.currentValue.value ?? '') : -1;\n // 1-based, always-sane values for on-screen text (the step number badge, the sr-only\n // \"Step X of Y\" label) — falls back to \"1 of 1\" when rendered standalone with no parent\n // `ore-stepper` to derive a real position from. Kept separate from the `index`/`total`\n // *attributes* below, which correctly reflect nothing at all in that same standalone case.\n const displayIndex = (): number => {\n const index = stepIndex();\n\n return index >= 0 ? index + 1 : 1;\n };\n const displayTotal = (): number => totalSteps() || 1;\n\n const isCurrent = (): boolean => {\n const index = stepIndex();\n const current = currentIndex();\n\n return index >= 0 && index === current;\n };\n // Purely positional — intentionally NOT gated on `props.error.value`. This also drives the\n // `completed` *attribute* below, which `step.css` uses to color both connector segments\n // either side of the indicator (`:host([completed]) .connector`); every *consumer* of this\n // (the icon choice, the sr-only state label) already checks `error` first and short-circuits\n // before it matters, so folding `!error` in here too would only end up suppressing\n // `[completed]` on an error step that's before the current one — breaking the connector\n // color chain right at that step instead of just swapping its icon.\n const isCompleted = (): boolean => {\n const index = stepIndex();\n const current = currentIndex();\n\n return index >= 0 && current >= 0 && index < current;\n };\n const isNavigable = (): boolean => {\n const index = stepIndex();\n const current = currentIndex();\n\n return (\n !!stepperCtx &&\n isStepNavigable({\n disabled: props.disabled.value === true,\n index,\n linear: stepperCtx.linear.value,\n stepperClickable: stepperCtx.clickable.value,\n stepperCurrentIndex: current,\n })\n );\n };\n const isDisabled = () => Boolean(props.disabled.value);\n\n // Purely derived, read-only state — no matching `prop.*` declaration, so `bind()` is the\n // sole writer and can safely reflect `undefined` (removes the attribute) when this step\n // isn't nested inside an `ore-stepper` at all.\n bind({\n attr: {\n completed: () => (isCompleted() ? true : undefined),\n current: () => (isCurrent() ? true : undefined),\n index: () => {\n const index = stepIndex();\n\n return index >= 0 ? String(index + 1) : undefined;\n },\n navigable: () => (isNavigable() ? true : undefined),\n total: () => (stepperCtx ? String(totalSteps()) : undefined),\n },\n });\n\n // `color`/`size`/`orientation` double as regular, independently-settable props (for a step\n // rendered standalone) *and* stepper-inherited values — mirrors ore-tab-item's handling of\n // its own `color`/`size`/`variant` inheritance from `ore-tabs`. Only forcibly overwrite the\n // attribute when a parent context actually exists, so the plain prop reflection is left\n // alone otherwise.\n if (stepperCtx) {\n watchEffect(() => {\n const color = stepperCtx.color.value;\n const size = stepperCtx.size.value;\n const orientation = stepperCtx.orientation.value;\n\n if (color !== undefined) el.setAttribute('color', color);\n\n if (size !== undefined) el.setAttribute('size', size);\n\n el.setAttribute('orientation', orientation);\n });\n }\n\n const stateLabel = (): string | undefined => {\n if (props.error.value) return 'error';\n\n if (isCompleted()) return 'completed';\n\n if (isCurrent()) return 'current step';\n\n return undefined;\n };\n\n const positionLabel = () => `Step ${displayIndex()} of ${displayTotal()}`;\n const srLabel = () => {\n const state = stateLabel();\n\n return state ? `${positionLabel()}, ${state}` : positionLabel();\n };\n\n const handleClick = (event: MouseEvent) => {\n event.stopPropagation();\n\n if (!isNavigable()) {\n event.preventDefault();\n\n return;\n }\n\n el.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: { value: props.value.value } }));\n };\n\n const indicatorTemplate = () => html`\n <span class=\"indicator\" part=\"indicator\" aria-hidden=\"true\">\n <span class=\"icon-slot\" ?hidden=\"${() => !slots.has('icon').value}\"><slot name=\"icon\"></slot></span>\n ${() =>\n slots.has('icon').value\n ? ''\n : props.error.value\n ? html`\n <ore-icon name=\"x\" size=\"14\" stroke-width=\"3\"></ore-icon>\n `\n : isCompleted()\n ? html`\n <ore-icon name=\"check\" size=\"14\" stroke-width=\"3\"></ore-icon>\n `\n : html`\n <span class=\"number\">${displayIndex}</span>\n `}\n </span>\n `;\n\n const contentTemplate = () => html`\n <span class=\"content\" part=\"content\">\n <span class=\"sr-only\">${srLabel}</span>\n <span class=\"label\" part=\"label\">\n <span class=\"label-text\"><slot></slot></span>\n ${() =>\n props.optional.value\n ? html`\n <span class=\"optional-hint\">(optional)</span>\n `\n : ''}\n </span>\n <span class=\"description\" part=\"description\" ?hidden=\"${() => !slots.has('description').value}\">\n <slot name=\"description\"></slot>\n </span>\n </span>\n `;\n\n return html`\n <li class=\"step\" role=\"listitem\">\n <span class=\"connector connector-leading\" part=\"connector\" aria-hidden=\"true\"></span>\n <span class=\"connector connector-trailing\" part=\"connector\" aria-hidden=\"true\"></span>\n ${() =>\n isNavigable()\n ? html`\n <button\n type=\"button\"\n class=\"control\"\n part=\"control\"\n aria-current=\"${() => (isCurrent() ? 'step' : null)}\"\n aria-disabled=\"${isDisabled}\"\n tabindex=\"${() => (isCurrent() ? '0' : '-1')}\"\n @click=\"${handleClick}\">\n ${indicatorTemplate()}${contentTemplate()}\n </button>\n `\n : html`\n <div class=\"control\" part=\"control\" aria-current=\"${() => (isCurrent() ? 'step' : null)}\">\n ${indicatorTemplate()}${contentTemplate()}\n </div>\n `}\n </li>\n `;\n },\n styles: [colorThemeMixin, coarsePointerMixin, forcedColorsFocusMixin('button.control'), stepStyles],\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"step.cjs","names":[],"sources":["../src/content/stepper/step.ts"],"sourcesContent":["import { bind, define, getHost, html, inject, prop, useSlots, watchEffect } from '@vielzeug/ore';\n\nimport type { ComponentSize, ThemeColor } from '../../types';\n\nimport '../icon/icon';\nimport { disablableBundle } from '../../shared';\nimport { coarsePointerMixin, colorThemeMixin, forcedColorsFocusMixin } from '../../styles';\nimport { isStepNavigable } from './_is-step-navigable';\nimport stepStyles from './step.css?inline';\nimport { STEPPER_CTX } from './stepper';\n\nexport type OreStepProps = {\n /**\n * Theme color. Inherited from the parent `ore-stepper` when nested inside one (overrides\n * this value); only takes effect on its own when `ore-step` is rendered standalone.\n */\n color?: ThemeColor;\n /** Disables this step — it cannot be navigated to and is skipped by keyboard navigation. */\n disabled?: boolean;\n /** Marks this step as failed/invalid. Overrides the completed/current indicator visuals. */\n error?: boolean;\n /**\n * Marks this step as optional. Renders a small \"(optional)\" hint next to the label.\n * Purely presentational — has no effect on navigation.\n */\n optional?: boolean;\n /** Orientation. Inherited from the parent `ore-stepper` when nested inside one. */\n orientation?: 'horizontal' | 'vertical';\n /** Component size. Inherited from the parent `ore-stepper` when nested inside one. */\n size?: ComponentSize;\n /** Unique identifier, matches `ore-stepper`'s `value` attribute. */\n value: string;\n};\n\n/**\n * A single step trigger. Must be placed as a direct child of `ore-stepper`, which provides\n * this step's current/completed/navigable/index/total state via context — those are derived,\n * read-only attributes on this element, not settable props.\n *\n * @element ore-step\n *\n * @attr {string} value - Unique identifier, matches the parent ore-stepper's `value` attribute\n * @attr {boolean} disabled - Prevents navigation to this step\n * @attr {boolean} error - Marks the step as failed/invalid\n * @attr {boolean} optional - Renders an \"(optional)\" hint next to the label\n * @attr {boolean} current - Read-only. Derived from position relative to the parent ore-stepper's `value`.\n * @attr {boolean} completed - Read-only. Derived from position relative to the parent ore-stepper's `value`.\n * @attr {boolean} navigable - Read-only. Derived from the parent ore-stepper's `clickable`/`linear`/`disabled`.\n * @attr {number} index - Read-only. This step's 1-based position among its siblings.\n * @attr {number} total - Read-only. Total sibling step count.\n * @attr {string} color - Inherited from ore-stepper: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - Inherited from ore-stepper: 'sm' | 'md' | 'lg'\n * @attr {string} orientation - Inherited from ore-stepper: 'horizontal' | 'vertical'\n *\n * @slot - Step label\n * @slot description - Optional supporting text shown below the label\n * @slot icon - Custom icon replacing the step number/check/error indicator\n *\n * @part control - Clickable (or static) root element for the step\n * @part indicator - Circular indicator holding the number/icon\n * @part content - Wrapper around the label and description\n * @part label - Step label element\n * @part description - Step description element\n * @part connector - Connector line segments (leading and trailing halves) either side of this step's indicator\n *\n * @example\n * ```html\n * <ore-step value=\"details\">Account details</ore-step>\n * <ore-step value=\"review\" disabled>Review</ore-step>\n * ```\n */\nexport const STEP_TAG = 'ore-step' as const;\ndefine<OreStepProps>(STEP_TAG, {\n props: {\n ...disablableBundle,\n color: prop.string<ThemeColor>(),\n error: prop.bool(false),\n optional: prop.bool(false),\n orientation: prop.oneOf(['horizontal', 'vertical'] as const, 'horizontal'),\n size: prop.string<ComponentSize>(),\n value: prop.string(''),\n },\n setup(props) {\n const el = getHost();\n const slots = useSlots();\n const stepperCtx = inject(STEPPER_CTX);\n\n // ────────────────────────────────────────────────────────────────\n // State derived from the parent ore-stepper's context — see stepper.ts's\n // module doc comment for why this replaced parent-side attribute fan-out.\n // ────────────────────────────────────────────────────────────────\n\n // Plain functions, not `computed()` — every one of these ultimately reads\n // `stepperCtx.stepValues`/`stepperCtx.currentValue`, which are themselves `computed()`s\n // owned by the parent `ore-stepper`. Wrapping a *child* `computed()` around a *parent*\n // `computed()` (a computed-to-computed dependency crossing a `provide()`/`inject()`\n // boundary) is exactly the shape that surfaced two related bugs: a step's `completed`/\n // `current` attributes going permanently stale after a few rapid selections, and — worse —\n // a step's entire clickable/static control silently failing to render at all when its\n // `ore-step` tag upgrades before its siblings exist in the light DOM yet (true whenever\n // `ore-step`/`ore-stepper` are already `customElements.define()`d before this markup is\n // parsed, e.g. every sandboxed live-preview iframe). Reading straight through to the\n // parent's computeds on every call — no intermediate computed layer of our own to go\n // stale — made both disappear. Cheap enough to not need memoizing (a couple of `indexOf`/\n // comparisons over an already-memoized parent computed).\n const stepIndex = (): number => (stepperCtx ? stepperCtx.stepValues.value.indexOf(props.value.value) : -1);\n const totalSteps = (): number => stepperCtx?.stepValues.value.length ?? 0;\n const currentIndex = (): number =>\n stepperCtx ? stepperCtx.stepValues.value.indexOf(stepperCtx.currentValue.value ?? '') : -1;\n // 1-based, always-sane values for on-screen text (the step number badge, the sr-only\n // \"Step X of Y\" label) — falls back to \"1 of 1\" when rendered standalone with no parent\n // `ore-stepper` to derive a real position from. Kept separate from the `index`/`total`\n // *attributes* below, which correctly reflect nothing at all in that same standalone case.\n const displayIndex = (): number => {\n const index = stepIndex();\n\n return index >= 0 ? index + 1 : 1;\n };\n const displayTotal = (): number => totalSteps() || 1;\n\n const isCurrent = (): boolean => {\n const index = stepIndex();\n const current = currentIndex();\n\n return index >= 0 && index === current;\n };\n // Purely positional — intentionally NOT gated on `props.error.value`. This also drives the\n // `completed` *attribute* below, which `step.css` uses to color both connector segments\n // either side of the indicator (`:host([completed]) .connector`); every *consumer* of this\n // (the icon choice, the sr-only state label) already checks `error` first and short-circuits\n // before it matters, so folding `!error` in here too would only end up suppressing\n // `[completed]` on an error step that's before the current one — breaking the connector\n // color chain right at that step instead of just swapping its icon.\n const isCompleted = (): boolean => {\n const index = stepIndex();\n const current = currentIndex();\n\n return index >= 0 && current >= 0 && index < current;\n };\n const isNavigable = (): boolean => {\n const index = stepIndex();\n const current = currentIndex();\n\n return (\n !!stepperCtx &&\n isStepNavigable({\n disabled: props.disabled.value === true,\n index,\n linear: stepperCtx.linear.value,\n stepperClickable: stepperCtx.clickable.value,\n stepperCurrentIndex: current,\n })\n );\n };\n const isDisabled = () => Boolean(props.disabled.value);\n\n // Purely derived, read-only state — no matching `prop.*` declaration, so `bind()` is the\n // sole writer and can safely reflect `undefined` (removes the attribute) when this step\n // isn't nested inside an `ore-stepper` at all.\n bind({\n attr: {\n completed: () => (isCompleted() ? true : undefined),\n current: () => (isCurrent() ? true : undefined),\n index: () => {\n const index = stepIndex();\n\n return index >= 0 ? String(index + 1) : undefined;\n },\n navigable: () => (isNavigable() ? true : undefined),\n total: () => (stepperCtx ? String(totalSteps()) : undefined),\n },\n });\n\n // `color`/`size`/`orientation` double as regular, independently-settable props (for a step\n // rendered standalone) *and* stepper-inherited values — mirrors ore-tab-item's handling of\n // its own `color`/`size`/`variant` inheritance from `ore-tabs`. Only forcibly overwrite the\n // attribute when a parent context actually exists, so the plain prop reflection is left\n // alone otherwise.\n if (stepperCtx) {\n watchEffect(() => {\n const color = stepperCtx.color.value;\n const size = stepperCtx.size.value;\n const orientation = stepperCtx.orientation.value;\n\n if (color !== undefined) el.setAttribute('color', color);\n\n if (size !== undefined) el.setAttribute('size', size);\n\n el.setAttribute('orientation', orientation);\n });\n }\n\n const stateLabel = (): string | undefined => {\n if (props.error.value) return 'error';\n\n if (isCompleted()) return 'completed';\n\n if (isCurrent()) return 'current step';\n\n return undefined;\n };\n\n const positionLabel = () => `Step ${displayIndex()} of ${displayTotal()}`;\n const srLabel = () => {\n const state = stateLabel();\n\n return state ? `${positionLabel()}, ${state}` : positionLabel();\n };\n\n const handleClick = (event: MouseEvent) => {\n event.stopPropagation();\n\n if (!isNavigable()) {\n event.preventDefault();\n\n return;\n }\n\n el.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: { value: props.value.value } }));\n };\n\n const indicatorTemplate = () => html`\n <span class=\"indicator\" part=\"indicator\" aria-hidden=\"true\">\n <span class=\"icon-slot\" ?hidden=\"${() => !slots.has('icon').value}\"><slot name=\"icon\"></slot></span>\n ${() =>\n slots.has('icon').value\n ? ''\n : props.error.value\n ? html`\n <ore-icon name=\"x\" size=\"14\" stroke-width=\"3\"></ore-icon>\n `\n : isCompleted()\n ? html`\n <ore-icon name=\"check\" size=\"14\" stroke-width=\"3\"></ore-icon>\n `\n : html`\n <span class=\"number\">${displayIndex}</span>\n `}\n </span>\n `;\n\n const contentTemplate = () => html`\n <span class=\"content\" part=\"content\">\n <span class=\"sr-only\">${srLabel}</span>\n <span class=\"label\" part=\"label\">\n <span class=\"label-text\"><slot></slot></span>\n ${() =>\n props.optional.value\n ? html`\n <span class=\"optional-hint\">(optional)</span>\n `\n : ''}\n </span>\n <span class=\"description\" part=\"description\" ?hidden=\"${() => !slots.has('description').value}\">\n <slot name=\"description\"></slot>\n </span>\n </span>\n `;\n\n return html`\n <li class=\"step\" role=\"listitem\">\n <span class=\"connector connector-leading\" part=\"connector\" aria-hidden=\"true\"></span>\n <span class=\"connector connector-trailing\" part=\"connector\" aria-hidden=\"true\"></span>\n ${() =>\n isNavigable()\n ? html`\n <button\n type=\"button\"\n class=\"control\"\n part=\"control\"\n aria-current=\"${() => (isCurrent() ? 'step' : null)}\"\n aria-disabled=\"${isDisabled}\"\n tabindex=\"${() => (isCurrent() ? '0' : '-1')}\"\n @click=\"${handleClick}\">\n ${indicatorTemplate()}${contentTemplate()}\n </button>\n `\n : html`\n <div class=\"control\" part=\"control\" aria-current=\"${() => (isCurrent() ? 'step' : null)}\">\n ${indicatorTemplate()}${contentTemplate()}\n </div>\n `}\n </li>\n `;\n },\n styles: [colorThemeMixin, coarsePointerMixin, forcedColorsFocusMixin('button.control'), stepStyles],\n});\n"],"mappings":"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"}
|
package/dist/step.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step.js","names":[],"sources":["../src/content/stepper/step.ts"],"sourcesContent":["import { define, html, inject, prop, bind, getHost, useSlots, watchEffect } from '@vielzeug/ore';\n\nimport type { ComponentSize, ThemeColor } from '../../types';\n\nimport '../icon/icon';\nimport { disablableBundle } from '../../shared';\nimport { coarsePointerMixin, colorThemeMixin, forcedColorsFocusMixin } from '../../styles';\nimport { isStepNavigable } from './_is-step-navigable';\nimport stepStyles from './step.css?inline';\nimport { STEPPER_CTX } from './stepper';\n\nexport type OreStepProps = {\n /**\n * Theme color. Inherited from the parent `ore-stepper` when nested inside one (overrides\n * this value); only takes effect on its own when `ore-step` is rendered standalone.\n */\n color?: ThemeColor;\n /** Disables this step — it cannot be navigated to and is skipped by keyboard navigation. */\n disabled?: boolean;\n /** Marks this step as failed/invalid. Overrides the completed/current indicator visuals. */\n error?: boolean;\n /**\n * Marks this step as optional. Renders a small \"(optional)\" hint next to the label.\n * Purely presentational — has no effect on navigation.\n */\n optional?: boolean;\n /** Orientation. Inherited from the parent `ore-stepper` when nested inside one. */\n orientation?: 'horizontal' | 'vertical';\n /** Component size. Inherited from the parent `ore-stepper` when nested inside one. */\n size?: ComponentSize;\n /** Unique identifier, matches `ore-stepper`'s `value` attribute. */\n value: string;\n};\n\n/**\n * A single step trigger. Must be placed as a direct child of `ore-stepper`, which provides\n * this step's current/completed/navigable/index/total state via context — those are derived,\n * read-only attributes on this element, not settable props.\n *\n * @element ore-step\n *\n * @attr {string} value - Unique identifier, matches the parent ore-stepper's `value` attribute\n * @attr {boolean} disabled - Prevents navigation to this step\n * @attr {boolean} error - Marks the step as failed/invalid\n * @attr {boolean} optional - Renders an \"(optional)\" hint next to the label\n * @attr {boolean} current - Read-only. Derived from position relative to the parent ore-stepper's `value`.\n * @attr {boolean} completed - Read-only. Derived from position relative to the parent ore-stepper's `value`.\n * @attr {boolean} navigable - Read-only. Derived from the parent ore-stepper's `clickable`/`linear`/`disabled`.\n * @attr {number} index - Read-only. This step's 1-based position among its siblings.\n * @attr {number} total - Read-only. Total sibling step count.\n * @attr {string} color - Inherited from ore-stepper: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - Inherited from ore-stepper: 'sm' | 'md' | 'lg'\n * @attr {string} orientation - Inherited from ore-stepper: 'horizontal' | 'vertical'\n *\n * @slot - Step label\n * @slot description - Optional supporting text shown below the label\n * @slot icon - Custom icon replacing the step number/check/error indicator\n *\n * @part control - Clickable (or static) root element for the step\n * @part indicator - Circular indicator holding the number/icon\n * @part content - Wrapper around the label and description\n * @part label - Step label element\n * @part description - Step description element\n * @part connector - Connector line segments (leading and trailing halves) either side of this step's indicator\n *\n * @example\n * ```html\n * <ore-step value=\"details\">Account details</ore-step>\n * <ore-step value=\"review\" disabled>Review</ore-step>\n * ```\n */\nexport const STEP_TAG = 'ore-step' as const;\ndefine<OreStepProps>(STEP_TAG, {\n props: {\n ...disablableBundle,\n color: prop.string<ThemeColor>(),\n error: prop.bool(false),\n optional: prop.bool(false),\n orientation: prop.oneOf(['horizontal', 'vertical'] as const, 'horizontal'),\n size: prop.string<ComponentSize>(),\n value: prop.string(''),\n },\n setup(props) {\n const el = getHost();\n const slots = useSlots();\n const stepperCtx = inject(STEPPER_CTX);\n\n // ────────────────────────────────────────────────────────────────\n // State derived from the parent ore-stepper's context — see stepper.ts's\n // module doc comment for why this replaced parent-side attribute fan-out.\n // ────────────────────────────────────────────────────────────────\n\n // Plain functions, not `computed()` — every one of these ultimately reads\n // `stepperCtx.stepValues`/`stepperCtx.currentValue`, which are themselves `computed()`s\n // owned by the parent `ore-stepper`. Wrapping a *child* `computed()` around a *parent*\n // `computed()` (a computed-to-computed dependency crossing a `provide()`/`inject()`\n // boundary) is exactly the shape that surfaced two related bugs: a step's `completed`/\n // `current` attributes going permanently stale after a few rapid selections, and — worse —\n // a step's entire clickable/static control silently failing to render at all when its\n // `ore-step` tag upgrades before its siblings exist in the light DOM yet (true whenever\n // `ore-step`/`ore-stepper` are already `customElements.define()`d before this markup is\n // parsed, e.g. every sandboxed live-preview iframe). Reading straight through to the\n // parent's computeds on every call — no intermediate computed layer of our own to go\n // stale — made both disappear. Cheap enough to not need memoizing (a couple of `indexOf`/\n // comparisons over an already-memoized parent computed).\n const stepIndex = (): number => (stepperCtx ? stepperCtx.stepValues.value.indexOf(props.value.value) : -1);\n const totalSteps = (): number => stepperCtx?.stepValues.value.length ?? 0;\n const currentIndex = (): number =>\n stepperCtx ? stepperCtx.stepValues.value.indexOf(stepperCtx.currentValue.value ?? '') : -1;\n // 1-based, always-sane values for on-screen text (the step number badge, the sr-only\n // \"Step X of Y\" label) — falls back to \"1 of 1\" when rendered standalone with no parent\n // `ore-stepper` to derive a real position from. Kept separate from the `index`/`total`\n // *attributes* below, which correctly reflect nothing at all in that same standalone case.\n const displayIndex = (): number => {\n const index = stepIndex();\n\n return index >= 0 ? index + 1 : 1;\n };\n const displayTotal = (): number => totalSteps() || 1;\n\n const isCurrent = (): boolean => {\n const index = stepIndex();\n const current = currentIndex();\n\n return index >= 0 && index === current;\n };\n // Purely positional — intentionally NOT gated on `props.error.value`. This also drives the\n // `completed` *attribute* below, which `step.css` uses to color both connector segments\n // either side of the indicator (`:host([completed]) .connector`); every *consumer* of this\n // (the icon choice, the sr-only state label) already checks `error` first and short-circuits\n // before it matters, so folding `!error` in here too would only end up suppressing\n // `[completed]` on an error step that's before the current one — breaking the connector\n // color chain right at that step instead of just swapping its icon.\n const isCompleted = (): boolean => {\n const index = stepIndex();\n const current = currentIndex();\n\n return index >= 0 && current >= 0 && index < current;\n };\n const isNavigable = (): boolean => {\n const index = stepIndex();\n const current = currentIndex();\n\n return (\n !!stepperCtx &&\n isStepNavigable({\n disabled: props.disabled.value === true,\n index,\n linear: stepperCtx.linear.value,\n stepperClickable: stepperCtx.clickable.value,\n stepperCurrentIndex: current,\n })\n );\n };\n const isDisabled = () => Boolean(props.disabled.value);\n\n // Purely derived, read-only state — no matching `prop.*` declaration, so `bind()` is the\n // sole writer and can safely reflect `undefined` (removes the attribute) when this step\n // isn't nested inside an `ore-stepper` at all.\n bind({\n attr: {\n completed: () => (isCompleted() ? true : undefined),\n current: () => (isCurrent() ? true : undefined),\n index: () => {\n const index = stepIndex();\n\n return index >= 0 ? String(index + 1) : undefined;\n },\n navigable: () => (isNavigable() ? true : undefined),\n total: () => (stepperCtx ? String(totalSteps()) : undefined),\n },\n });\n\n // `color`/`size`/`orientation` double as regular, independently-settable props (for a step\n // rendered standalone) *and* stepper-inherited values — mirrors ore-tab-item's handling of\n // its own `color`/`size`/`variant` inheritance from `ore-tabs`. Only forcibly overwrite the\n // attribute when a parent context actually exists, so the plain prop reflection is left\n // alone otherwise.\n if (stepperCtx) {\n watchEffect(() => {\n const color = stepperCtx.color.value;\n const size = stepperCtx.size.value;\n const orientation = stepperCtx.orientation.value;\n\n if (color !== undefined) el.setAttribute('color', color);\n\n if (size !== undefined) el.setAttribute('size', size);\n\n el.setAttribute('orientation', orientation);\n });\n }\n\n const stateLabel = (): string | undefined => {\n if (props.error.value) return 'error';\n\n if (isCompleted()) return 'completed';\n\n if (isCurrent()) return 'current step';\n\n return undefined;\n };\n\n const positionLabel = () => `Step ${displayIndex()} of ${displayTotal()}`;\n const srLabel = () => {\n const state = stateLabel();\n\n return state ? `${positionLabel()}, ${state}` : positionLabel();\n };\n\n const handleClick = (event: MouseEvent) => {\n event.stopPropagation();\n\n if (!isNavigable()) {\n event.preventDefault();\n\n return;\n }\n\n el.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: { value: props.value.value } }));\n };\n\n const indicatorTemplate = () => html`\n <span class=\"indicator\" part=\"indicator\" aria-hidden=\"true\">\n <span class=\"icon-slot\" ?hidden=\"${() => !slots.has('icon').value}\"><slot name=\"icon\"></slot></span>\n ${() =>\n slots.has('icon').value\n ? ''\n : props.error.value\n ? html`\n <ore-icon name=\"x\" size=\"14\" stroke-width=\"3\"></ore-icon>\n `\n : isCompleted()\n ? html`\n <ore-icon name=\"check\" size=\"14\" stroke-width=\"3\"></ore-icon>\n `\n : html`\n <span class=\"number\">${displayIndex}</span>\n `}\n </span>\n `;\n\n const contentTemplate = () => html`\n <span class=\"content\" part=\"content\">\n <span class=\"sr-only\">${srLabel}</span>\n <span class=\"label\" part=\"label\">\n <span class=\"label-text\"><slot></slot></span>\n ${() =>\n props.optional.value\n ? html`\n <span class=\"optional-hint\">(optional)</span>\n `\n : ''}\n </span>\n <span class=\"description\" part=\"description\" ?hidden=\"${() => !slots.has('description').value}\">\n <slot name=\"description\"></slot>\n </span>\n </span>\n `;\n\n return html`\n <li class=\"step\" role=\"listitem\">\n <span class=\"connector connector-leading\" part=\"connector\" aria-hidden=\"true\"></span>\n <span class=\"connector connector-trailing\" part=\"connector\" aria-hidden=\"true\"></span>\n ${() =>\n isNavigable()\n ? html`\n <button\n type=\"button\"\n class=\"control\"\n part=\"control\"\n aria-current=\"${() => (isCurrent() ? 'step' : null)}\"\n aria-disabled=\"${isDisabled}\"\n tabindex=\"${() => (isCurrent() ? '0' : '-1')}\"\n @click=\"${handleClick}\">\n ${indicatorTemplate()}${contentTemplate()}\n </button>\n `\n : html`\n <div class=\"control\" part=\"control\" aria-current=\"${() => (isCurrent() ? 'step' : null)}\">\n ${indicatorTemplate()}${contentTemplate()}\n </div>\n `}\n </li>\n `;\n },\n styles: [colorThemeMixin, coarsePointerMixin, forcedColorsFocusMixin('button.control'), stepStyles],\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"step.js","names":[],"sources":["../src/content/stepper/step.ts"],"sourcesContent":["import { bind, define, getHost, html, inject, prop, useSlots, watchEffect } from '@vielzeug/ore';\n\nimport type { ComponentSize, ThemeColor } from '../../types';\n\nimport '../icon/icon';\nimport { disablableBundle } from '../../shared';\nimport { coarsePointerMixin, colorThemeMixin, forcedColorsFocusMixin } from '../../styles';\nimport { isStepNavigable } from './_is-step-navigable';\nimport stepStyles from './step.css?inline';\nimport { STEPPER_CTX } from './stepper';\n\nexport type OreStepProps = {\n /**\n * Theme color. Inherited from the parent `ore-stepper` when nested inside one (overrides\n * this value); only takes effect on its own when `ore-step` is rendered standalone.\n */\n color?: ThemeColor;\n /** Disables this step — it cannot be navigated to and is skipped by keyboard navigation. */\n disabled?: boolean;\n /** Marks this step as failed/invalid. Overrides the completed/current indicator visuals. */\n error?: boolean;\n /**\n * Marks this step as optional. Renders a small \"(optional)\" hint next to the label.\n * Purely presentational — has no effect on navigation.\n */\n optional?: boolean;\n /** Orientation. Inherited from the parent `ore-stepper` when nested inside one. */\n orientation?: 'horizontal' | 'vertical';\n /** Component size. Inherited from the parent `ore-stepper` when nested inside one. */\n size?: ComponentSize;\n /** Unique identifier, matches `ore-stepper`'s `value` attribute. */\n value: string;\n};\n\n/**\n * A single step trigger. Must be placed as a direct child of `ore-stepper`, which provides\n * this step's current/completed/navigable/index/total state via context — those are derived,\n * read-only attributes on this element, not settable props.\n *\n * @element ore-step\n *\n * @attr {string} value - Unique identifier, matches the parent ore-stepper's `value` attribute\n * @attr {boolean} disabled - Prevents navigation to this step\n * @attr {boolean} error - Marks the step as failed/invalid\n * @attr {boolean} optional - Renders an \"(optional)\" hint next to the label\n * @attr {boolean} current - Read-only. Derived from position relative to the parent ore-stepper's `value`.\n * @attr {boolean} completed - Read-only. Derived from position relative to the parent ore-stepper's `value`.\n * @attr {boolean} navigable - Read-only. Derived from the parent ore-stepper's `clickable`/`linear`/`disabled`.\n * @attr {number} index - Read-only. This step's 1-based position among its siblings.\n * @attr {number} total - Read-only. Total sibling step count.\n * @attr {string} color - Inherited from ore-stepper: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - Inherited from ore-stepper: 'sm' | 'md' | 'lg'\n * @attr {string} orientation - Inherited from ore-stepper: 'horizontal' | 'vertical'\n *\n * @slot - Step label\n * @slot description - Optional supporting text shown below the label\n * @slot icon - Custom icon replacing the step number/check/error indicator\n *\n * @part control - Clickable (or static) root element for the step\n * @part indicator - Circular indicator holding the number/icon\n * @part content - Wrapper around the label and description\n * @part label - Step label element\n * @part description - Step description element\n * @part connector - Connector line segments (leading and trailing halves) either side of this step's indicator\n *\n * @example\n * ```html\n * <ore-step value=\"details\">Account details</ore-step>\n * <ore-step value=\"review\" disabled>Review</ore-step>\n * ```\n */\nexport const STEP_TAG = 'ore-step' as const;\ndefine<OreStepProps>(STEP_TAG, {\n props: {\n ...disablableBundle,\n color: prop.string<ThemeColor>(),\n error: prop.bool(false),\n optional: prop.bool(false),\n orientation: prop.oneOf(['horizontal', 'vertical'] as const, 'horizontal'),\n size: prop.string<ComponentSize>(),\n value: prop.string(''),\n },\n setup(props) {\n const el = getHost();\n const slots = useSlots();\n const stepperCtx = inject(STEPPER_CTX);\n\n // ────────────────────────────────────────────────────────────────\n // State derived from the parent ore-stepper's context — see stepper.ts's\n // module doc comment for why this replaced parent-side attribute fan-out.\n // ────────────────────────────────────────────────────────────────\n\n // Plain functions, not `computed()` — every one of these ultimately reads\n // `stepperCtx.stepValues`/`stepperCtx.currentValue`, which are themselves `computed()`s\n // owned by the parent `ore-stepper`. Wrapping a *child* `computed()` around a *parent*\n // `computed()` (a computed-to-computed dependency crossing a `provide()`/`inject()`\n // boundary) is exactly the shape that surfaced two related bugs: a step's `completed`/\n // `current` attributes going permanently stale after a few rapid selections, and — worse —\n // a step's entire clickable/static control silently failing to render at all when its\n // `ore-step` tag upgrades before its siblings exist in the light DOM yet (true whenever\n // `ore-step`/`ore-stepper` are already `customElements.define()`d before this markup is\n // parsed, e.g. every sandboxed live-preview iframe). Reading straight through to the\n // parent's computeds on every call — no intermediate computed layer of our own to go\n // stale — made both disappear. Cheap enough to not need memoizing (a couple of `indexOf`/\n // comparisons over an already-memoized parent computed).\n const stepIndex = (): number => (stepperCtx ? stepperCtx.stepValues.value.indexOf(props.value.value) : -1);\n const totalSteps = (): number => stepperCtx?.stepValues.value.length ?? 0;\n const currentIndex = (): number =>\n stepperCtx ? stepperCtx.stepValues.value.indexOf(stepperCtx.currentValue.value ?? '') : -1;\n // 1-based, always-sane values for on-screen text (the step number badge, the sr-only\n // \"Step X of Y\" label) — falls back to \"1 of 1\" when rendered standalone with no parent\n // `ore-stepper` to derive a real position from. Kept separate from the `index`/`total`\n // *attributes* below, which correctly reflect nothing at all in that same standalone case.\n const displayIndex = (): number => {\n const index = stepIndex();\n\n return index >= 0 ? index + 1 : 1;\n };\n const displayTotal = (): number => totalSteps() || 1;\n\n const isCurrent = (): boolean => {\n const index = stepIndex();\n const current = currentIndex();\n\n return index >= 0 && index === current;\n };\n // Purely positional — intentionally NOT gated on `props.error.value`. This also drives the\n // `completed` *attribute* below, which `step.css` uses to color both connector segments\n // either side of the indicator (`:host([completed]) .connector`); every *consumer* of this\n // (the icon choice, the sr-only state label) already checks `error` first and short-circuits\n // before it matters, so folding `!error` in here too would only end up suppressing\n // `[completed]` on an error step that's before the current one — breaking the connector\n // color chain right at that step instead of just swapping its icon.\n const isCompleted = (): boolean => {\n const index = stepIndex();\n const current = currentIndex();\n\n return index >= 0 && current >= 0 && index < current;\n };\n const isNavigable = (): boolean => {\n const index = stepIndex();\n const current = currentIndex();\n\n return (\n !!stepperCtx &&\n isStepNavigable({\n disabled: props.disabled.value === true,\n index,\n linear: stepperCtx.linear.value,\n stepperClickable: stepperCtx.clickable.value,\n stepperCurrentIndex: current,\n })\n );\n };\n const isDisabled = () => Boolean(props.disabled.value);\n\n // Purely derived, read-only state — no matching `prop.*` declaration, so `bind()` is the\n // sole writer and can safely reflect `undefined` (removes the attribute) when this step\n // isn't nested inside an `ore-stepper` at all.\n bind({\n attr: {\n completed: () => (isCompleted() ? true : undefined),\n current: () => (isCurrent() ? true : undefined),\n index: () => {\n const index = stepIndex();\n\n return index >= 0 ? String(index + 1) : undefined;\n },\n navigable: () => (isNavigable() ? true : undefined),\n total: () => (stepperCtx ? String(totalSteps()) : undefined),\n },\n });\n\n // `color`/`size`/`orientation` double as regular, independently-settable props (for a step\n // rendered standalone) *and* stepper-inherited values — mirrors ore-tab-item's handling of\n // its own `color`/`size`/`variant` inheritance from `ore-tabs`. Only forcibly overwrite the\n // attribute when a parent context actually exists, so the plain prop reflection is left\n // alone otherwise.\n if (stepperCtx) {\n watchEffect(() => {\n const color = stepperCtx.color.value;\n const size = stepperCtx.size.value;\n const orientation = stepperCtx.orientation.value;\n\n if (color !== undefined) el.setAttribute('color', color);\n\n if (size !== undefined) el.setAttribute('size', size);\n\n el.setAttribute('orientation', orientation);\n });\n }\n\n const stateLabel = (): string | undefined => {\n if (props.error.value) return 'error';\n\n if (isCompleted()) return 'completed';\n\n if (isCurrent()) return 'current step';\n\n return undefined;\n };\n\n const positionLabel = () => `Step ${displayIndex()} of ${displayTotal()}`;\n const srLabel = () => {\n const state = stateLabel();\n\n return state ? `${positionLabel()}, ${state}` : positionLabel();\n };\n\n const handleClick = (event: MouseEvent) => {\n event.stopPropagation();\n\n if (!isNavigable()) {\n event.preventDefault();\n\n return;\n }\n\n el.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: { value: props.value.value } }));\n };\n\n const indicatorTemplate = () => html`\n <span class=\"indicator\" part=\"indicator\" aria-hidden=\"true\">\n <span class=\"icon-slot\" ?hidden=\"${() => !slots.has('icon').value}\"><slot name=\"icon\"></slot></span>\n ${() =>\n slots.has('icon').value\n ? ''\n : props.error.value\n ? html`\n <ore-icon name=\"x\" size=\"14\" stroke-width=\"3\"></ore-icon>\n `\n : isCompleted()\n ? html`\n <ore-icon name=\"check\" size=\"14\" stroke-width=\"3\"></ore-icon>\n `\n : html`\n <span class=\"number\">${displayIndex}</span>\n `}\n </span>\n `;\n\n const contentTemplate = () => html`\n <span class=\"content\" part=\"content\">\n <span class=\"sr-only\">${srLabel}</span>\n <span class=\"label\" part=\"label\">\n <span class=\"label-text\"><slot></slot></span>\n ${() =>\n props.optional.value\n ? html`\n <span class=\"optional-hint\">(optional)</span>\n `\n : ''}\n </span>\n <span class=\"description\" part=\"description\" ?hidden=\"${() => !slots.has('description').value}\">\n <slot name=\"description\"></slot>\n </span>\n </span>\n `;\n\n return html`\n <li class=\"step\" role=\"listitem\">\n <span class=\"connector connector-leading\" part=\"connector\" aria-hidden=\"true\"></span>\n <span class=\"connector connector-trailing\" part=\"connector\" aria-hidden=\"true\"></span>\n ${() =>\n isNavigable()\n ? html`\n <button\n type=\"button\"\n class=\"control\"\n part=\"control\"\n aria-current=\"${() => (isCurrent() ? 'step' : null)}\"\n aria-disabled=\"${isDisabled}\"\n tabindex=\"${() => (isCurrent() ? '0' : '-1')}\"\n @click=\"${handleClick}\">\n ${indicatorTemplate()}${contentTemplate()}\n </button>\n `\n : html`\n <div class=\"control\" part=\"control\" aria-current=\"${() => (isCurrent() ? 'step' : null)}\">\n ${indicatorTemplate()}${contentTemplate()}\n </div>\n `}\n </li>\n `;\n },\n styles: [colorThemeMixin, coarsePointerMixin, forcedColorsFocusMixin('button.control'), stepStyles],\n});\n"],"mappings":"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"}
|
package/dist/stepper.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./core/
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./core/keyboard.cjs"),t=require("./core/ore.cjs"),n=require("./core/direction.cjs"),r=require("./core/nav.cjs"),i=require("./shared/prop-bundles.cjs"),a=require("./content/stepper/_is-step-navigable.cjs"),o=require("./content/stepper/stepper.css.cjs");let s=require("@vielzeug/ore"),c=require("@vielzeug/ripple");var l=(0,s.createContext)(`StepperContext`),u=`ore-stepper`;(0,s.define)(u,{props:{...i.themableBundle,...i.sizableBundle,...i.disablableBundle,clickable:s.prop.bool(!1),label:s.prop.string(`Progress`),linear:s.prop.bool(!1),orientation:s.prop.oneOf([`horizontal`,`vertical`],`horizontal`),value:s.prop.string()},setup(i){let o=(0,s.getHost)(),u=(0,s.useEmit)(),d=(0,s.useSlots)(),f=()=>Array.from(o.querySelectorAll(`:scope > ore-step`)),p=e=>{e?.shadowRoot?.querySelector(`button.control`)?.focus()},m=(0,c.signal)(i.value.value);(0,s.bind)({attr:{value:()=>m.value??null}});let h=(e,t=!1)=>{!e||e===m.value||(m.value=e,t&&u(`change`,{value:e}))},g=()=>{let e=f();if(e.length===0)return;let t=m.value;if(t&&e.some(e=>e.getAttribute(`value`)===t))return;let n=e.find(e=>!e.hasAttribute(`disabled`))?.getAttribute(`value`)??void 0;n&&h(n)};(0,c.watch)(i.value,e=>{m.value=e,g()});let _=(0,c.computed)(()=>(d.elements().value,f().map(e=>e.getAttribute(`value`)??``)));(0,s.provide)(l,{clickable:(0,c.computed)(()=>!!i.clickable.value&&!i.disabled.value),color:i.color,currentValue:m,linear:(0,c.computed)(()=>!!i.linear.value),orientation:(0,c.computed)(()=>i.orientation.value??`horizontal`),size:i.size,stepValues:_}),(0,s.onMounted)(()=>{g()});let v=()=>{let e=f(),t=e.map(e=>e.getAttribute(`value`)??``).indexOf(m.value??``),n=!!i.clickable.value&&!i.disabled.value,r=!!i.linear.value;return e.filter((e,i)=>a.isStepNavigable({disabled:e.hasAttribute(`disabled`),index:i,linear:r,stepperClickable:n,stepperCurrentIndex:t}))},y=r.createListControl({direction:()=>n.elementDirection(o),getItems:v,loop:!1,onNavigate:(e,t)=>{let n=v()[t],r=n?.getAttribute(`value`);r&&h(r,!0),p(n)},orientation:()=>i.orientation.value===`vertical`?`vertical`:`horizontal`,signal:t.lifecycleSignal(s.onCleanup)}),b=e=>{let t=e.composedPath().find(e=>e instanceof HTMLElement&&e.localName===`ore-step`);if(!t||t.closest(`ore-stepper`)!==o||!v().includes(t))return;let n=t.getAttribute(`value`);h(n??void 0,!0),p(t)},x=e.createInteraction({onPress:()=>{let e=v().find(e=>e===document.activeElement||e.shadowRoot?.activeElement===document.activeElement),t=e?.getAttribute(`value`);t&&(h(t,!0),p(e))}});return(0,s.bind)({on:{click:b,keydown:e=>{let t=v();if(t.length===0)return;let n=e.composedPath().find(e=>e instanceof HTMLElement&&e.localName===`ore-step`),r=n?t.indexOf(n):-1;r>=0&&y.set(r),!y.handleKeydown(e)&&x.handleKeydown(e)}}}),s.html`
|
|
2
2
|
<nav part="nav" aria-label="${i.label}">
|
|
3
3
|
<ol class="steps" role="list" part="list">
|
|
4
4
|
<slot></slot>
|
|
5
5
|
</ol>
|
|
6
6
|
</nav>
|
|
7
|
-
`},styles:[o.default]}),exports.STEPPER_CTX=
|
|
7
|
+
`},styles:[o.default]}),exports.STEPPER_CTX=l,exports.STEPPER_TAG=u;
|
|
8
8
|
//# sourceMappingURL=stepper.cjs.map
|