@human-kit/svelte-components 1.0.0-alpha.2 → 1.0.0-alpha.21
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/FOCUS_STATE_CONTRACT.md +63 -0
- package/dist/FOCUS_STATE_REVIEW_TEMPLATE.md +70 -0
- package/dist/button/README.md +48 -0
- package/dist/button/TODO.md +13 -0
- package/dist/button/index.d.ts +5 -0
- package/dist/button/index.js +4 -0
- package/dist/button/index.parts.d.ts +1 -0
- package/dist/button/index.parts.js +1 -0
- package/dist/button/root/README.md +43 -0
- package/dist/button/root/button-root.svelte +393 -0
- package/dist/button/root/button-root.svelte.d.ts +21 -0
- package/dist/button/root/button-test.svelte +76 -0
- package/dist/button/root/button-test.svelte.d.ts +11 -0
- package/dist/calendar/README.md +2 -1
- package/dist/calendar/TODO.md +21 -107
- package/dist/calendar/body-cell/README.md +15 -0
- package/dist/calendar/body-cell/calendar-body-cell.svelte +116 -41
- package/dist/calendar/grid/README.md +13 -0
- package/dist/calendar/grid-body/README.md +13 -0
- package/dist/calendar/grid-header/README.md +13 -0
- package/dist/calendar/header-cell/README.md +14 -0
- package/dist/calendar/heading/README.md +13 -0
- package/dist/calendar/index.d.ts +3 -3
- package/dist/calendar/index.js +3 -3
- package/dist/calendar/root/README.md +24 -0
- package/dist/calendar/root/calendar-root-test.svelte +4 -0
- package/dist/calendar/root/calendar-root-test.svelte.d.ts +1 -0
- package/dist/calendar/root/calendar-root.svelte +3 -0
- package/dist/calendar/root/calendar-root.svelte.d.ts +1 -0
- package/dist/calendar/root/context.d.ts +4 -0
- package/dist/calendar/root/context.js +28 -25
- package/dist/calendar/root/date-utils.d.ts +1 -1
- package/dist/calendar/root/date-utils.js +16 -26
- package/dist/calendar/trigger-next/README.md +14 -0
- package/dist/calendar/trigger-next/calendar-trigger-next.svelte +9 -4
- package/dist/calendar/trigger-next/calendar-trigger-next.svelte.d.ts +2 -1
- package/dist/calendar/trigger-previous/README.md +14 -0
- package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte +9 -4
- package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte.d.ts +2 -1
- package/dist/checkbox/README.md +53 -0
- package/dist/checkbox/TODO.md +16 -0
- package/dist/checkbox/index.d.ts +6 -0
- package/dist/checkbox/index.js +6 -0
- package/dist/checkbox/index.parts.d.ts +2 -0
- package/dist/checkbox/index.parts.js +2 -0
- package/dist/checkbox/indicator/README.md +23 -0
- package/dist/checkbox/indicator/checkbox-indicator.svelte +43 -0
- package/dist/checkbox/indicator/checkbox-indicator.svelte.d.ts +10 -0
- package/dist/checkbox/root/README.md +47 -0
- package/dist/checkbox/root/checkbox-label-test.svelte +10 -0
- package/dist/checkbox/root/checkbox-label-test.svelte.d.ts +18 -0
- package/dist/checkbox/root/checkbox-root.svelte +386 -0
- package/dist/checkbox/root/checkbox-root.svelte.d.ts +29 -0
- package/dist/checkbox/root/checkbox-test.svelte +59 -0
- package/dist/checkbox/root/checkbox-test.svelte.d.ts +18 -0
- package/dist/checkbox/root/context.d.ts +21 -0
- package/dist/checkbox/root/context.js +15 -0
- package/dist/clock/README.md +75 -0
- package/dist/clock/axis/README.md +24 -0
- package/dist/clock/axis/clock-axis.svelte +37 -0
- package/dist/clock/axis/clock-axis.svelte.d.ts +8 -0
- package/dist/clock/hooks/use-wheel-scroll.svelte.d.ts +16 -0
- package/dist/clock/hooks/use-wheel-scroll.svelte.js +336 -0
- package/dist/clock/index.d.ts +10 -0
- package/dist/clock/index.js +10 -0
- package/dist/clock/index.parts.d.ts +4 -0
- package/dist/clock/index.parts.js +4 -0
- package/dist/clock/root/README.md +38 -0
- package/dist/clock/root/clock-root-test.svelte +62 -0
- package/dist/clock/root/clock-root-test.svelte.d.ts +14 -0
- package/dist/clock/root/clock-root.svelte +329 -0
- package/dist/clock/root/clock-root.svelte.d.ts +25 -0
- package/dist/clock/root/context.d.ts +22 -0
- package/dist/clock/root/context.js +15 -0
- package/dist/clock/root/resolve-visible-columns.d.ts +7 -0
- package/dist/clock/root/resolve-visible-columns.js +16 -0
- package/dist/clock/root/time-utils.d.ts +48 -0
- package/dist/clock/root/time-utils.js +314 -0
- package/dist/clock/root/wheel-options.d.ts +17 -0
- package/dist/clock/root/wheel-options.js +63 -0
- package/dist/clock/wheel-column/README.md +25 -0
- package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte +16 -0
- package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte.d.ts +3 -0
- package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte +29 -0
- package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte.d.ts +6 -0
- package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte +11 -0
- package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte.d.ts +3 -0
- package/dist/clock/wheel-column/clock-wheel-column-test.svelte +38 -0
- package/dist/clock/wheel-column/clock-wheel-column-test.svelte.d.ts +12 -0
- package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte +38 -0
- package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte.d.ts +12 -0
- package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte +29 -0
- package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte.d.ts +6 -0
- package/dist/clock/wheel-column/clock-wheel-column.svelte +499 -0
- package/dist/clock/wheel-column/clock-wheel-column.svelte.d.ts +17 -0
- package/dist/clock/wheel-item/README.md +17 -0
- package/dist/clock/wheel-item/clock-wheel-item.svelte +49 -0
- package/dist/clock/wheel-item/clock-wheel-item.svelte.d.ts +17 -0
- package/dist/combobox/README.md +8 -2
- package/dist/combobox/TODO.md +28 -175
- package/dist/combobox/button/README.md +8 -3
- package/dist/combobox/button/combobox-button-test.svelte +27 -0
- package/dist/combobox/button/combobox-button-test.svelte.d.ts +6 -0
- package/dist/combobox/button/combobox-button.svelte +10 -11
- package/dist/combobox/clear/README.md +21 -0
- package/dist/combobox/clear/combobox-clear-test.svelte +34 -0
- package/dist/combobox/clear/combobox-clear-test.svelte.d.ts +3 -0
- package/dist/combobox/clear/combobox-clear.svelte +61 -0
- package/dist/combobox/clear/combobox-clear.svelte.d.ts +9 -0
- package/dist/combobox/index.d.ts +5 -3
- package/dist/combobox/index.js +5 -3
- package/dist/combobox/index.parts.d.ts +2 -0
- package/dist/combobox/index.parts.js +2 -0
- package/dist/combobox/input/combobox-input.svelte +44 -12
- package/dist/combobox/item/combobox-item-implicit-text-test.svelte +1 -1
- package/dist/combobox/item/combobox-listboxitem.svelte +14 -11
- package/dist/combobox/item-indicator/combobox-item-indicator.svelte +4 -15
- package/dist/combobox/list/combobox-listbox.svelte +1 -0
- package/dist/combobox/list/combobox-listbox.svelte.d.ts +2 -1
- package/dist/combobox/popover/README.md +18 -4
- package/dist/combobox/popover/combobox-popover-props-test.svelte +38 -0
- package/dist/combobox/popover/combobox-popover-props-test.svelte.d.ts +11 -0
- package/dist/combobox/popover/combobox-popover.svelte +166 -23
- package/dist/combobox/popover/combobox-popover.svelte.d.ts +3 -3
- package/dist/combobox/popover/combobox-scrollable-list-test.svelte +23 -0
- package/dist/combobox/popover/combobox-scrollable-list-test.svelte.d.ts +18 -0
- package/dist/combobox/root/README.md +1 -0
- package/dist/combobox/root/combobox-multiselect-test.svelte +5 -3
- package/dist/combobox/root/combobox-multiselect-test.svelte.d.ts +1 -0
- package/dist/combobox/root/combobox-numeric-string-id-test.svelte +1 -1
- package/dist/combobox/root/combobox-test.svelte +23 -4
- package/dist/combobox/root/combobox-test.svelte.d.ts +2 -0
- package/dist/combobox/root/combobox.svelte +119 -13
- package/dist/combobox/root/combobox.svelte.d.ts +1 -0
- package/dist/combobox/root/context.d.ts +19 -1
- package/dist/combobox/tag-remove/combobox-tag-remove.svelte +3 -2
- package/dist/combobox/trigger/README.md +21 -0
- package/dist/combobox/trigger/combobox-trigger.svelte +56 -0
- package/dist/combobox/trigger/combobox-trigger.svelte.d.ts +9 -0
- package/dist/datepicker/README.md +100 -0
- package/dist/datepicker/TODO.md +28 -0
- package/dist/datepicker/calendar/README.md +19 -0
- package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte +60 -0
- package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte.d.ts +3 -0
- package/dist/datepicker/calendar/date-picker-calendar.svelte +65 -0
- package/dist/datepicker/calendar/date-picker-calendar.svelte.d.ts +10 -0
- package/dist/datepicker/index.d.ts +18 -0
- package/dist/datepicker/index.js +18 -0
- package/dist/datepicker/index.parts.d.ts +14 -0
- package/dist/datepicker/index.parts.js +14 -0
- package/dist/datepicker/input/README.md +15 -0
- package/dist/datepicker/input/date-picker-input.svelte +108 -0
- package/dist/datepicker/input/date-picker-input.svelte.d.ts +11 -0
- package/dist/datepicker/internal/strict-props.d.ts +2 -0
- package/dist/datepicker/internal/strict-props.js +28 -0
- package/dist/datepicker/popover/README.md +20 -0
- package/dist/datepicker/popover/date-picker-popover-handler-test.svelte +57 -0
- package/dist/datepicker/popover/date-picker-popover-handler-test.svelte.d.ts +3 -0
- package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte +45 -0
- package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte.d.ts +18 -0
- package/dist/datepicker/popover/date-picker-popover.svelte +87 -0
- package/dist/datepicker/popover/date-picker-popover.svelte.d.ts +7 -0
- package/dist/datepicker/root/README.md +38 -0
- package/dist/datepicker/root/context.d.ts +43 -0
- package/dist/datepicker/root/context.js +15 -0
- package/dist/datepicker/root/date-picker-bindable-empty-test.svelte +24 -0
- package/dist/datepicker/root/date-picker-bindable-empty-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-bindable-test.svelte +41 -0
- package/dist/datepicker/root/date-picker-bindable-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-empty-test.svelte +47 -0
- package/dist/datepicker/root/date-picker-empty-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-locale-typing-test.svelte +47 -0
- package/dist/datepicker/root/date-picker-locale-typing-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-open-cancel-test.svelte +54 -0
- package/dist/datepicker/root/date-picker-open-cancel-test.svelte.d.ts +8 -0
- package/dist/datepicker/root/date-picker-root.svelte +495 -0
- package/dist/datepicker/root/date-picker-root.svelte.d.ts +24 -0
- package/dist/datepicker/root/date-picker-test.svelte +86 -0
- package/dist/datepicker/root/date-picker-test.svelte.d.ts +13 -0
- package/dist/datepicker/root/date-utils.d.ts +17 -0
- package/dist/datepicker/root/date-utils.js +138 -0
- package/dist/datepicker/root/draft-evaluation.d.ts +13 -0
- package/dist/datepicker/root/draft-evaluation.js +56 -0
- package/dist/datepicker/root/focus-controller.d.ts +3 -0
- package/dist/datepicker/root/focus-controller.js +15 -0
- package/dist/datepicker/root/open-change.d.ts +5 -0
- package/dist/datepicker/root/open-change.js +13 -0
- package/dist/datepicker/root/open-controller.d.ts +7 -0
- package/dist/datepicker/root/open-controller.js +15 -0
- package/dist/datepicker/root/segment-controller.d.ts +8 -0
- package/dist/datepicker/root/segment-controller.js +53 -0
- package/dist/datepicker/root/segment-state.d.ts +18 -0
- package/dist/datepicker/root/segment-state.js +134 -0
- package/dist/datepicker/root/value-commit.d.ts +4 -0
- package/dist/datepicker/root/value-commit.js +8 -0
- package/dist/datepicker/segment/README.md +14 -0
- package/dist/datepicker/segment/date-picker-segment.svelte +319 -0
- package/dist/datepicker/segment/date-picker-segment.svelte.d.ts +9 -0
- package/dist/datepicker/trigger/README.md +14 -0
- package/dist/datepicker/trigger/date-picker-trigger.svelte +110 -0
- package/dist/datepicker/trigger/date-picker-trigger.svelte.d.ts +9 -0
- package/dist/dialog/content/dialog-content.svelte +6 -6
- package/dist/dialog/index.d.ts +3 -3
- package/dist/dialog/index.js +2 -2
- package/dist/dialog/root/context.d.ts +2 -1
- package/dist/dialog/root/dialog-root.svelte +9 -2
- package/dist/dialog/trigger/dialog-trigger.svelte +3 -0
- package/dist/hooks/use-virtual-focus.svelte.js +3 -1
- package/dist/index.d.ts +31 -17
- package/dist/index.js +31 -17
- package/dist/input/README.md +38 -0
- package/dist/input/TODO.md +12 -0
- package/dist/input/input-test.svelte +43 -0
- package/dist/input/input-test.svelte.d.ts +12 -0
- package/dist/input/input.svelte +151 -7
- package/dist/input/input.svelte.d.ts +8 -2
- package/dist/listbox/index.d.ts +3 -3
- package/dist/listbox/index.js +3 -3
- package/dist/listbox/item/README.md +2 -1
- package/dist/listbox/item/listbox-item.svelte +260 -6
- package/dist/listbox/item/listbox-item.svelte.d.ts +6 -0
- package/dist/listbox/root/context.d.ts +6 -0
- package/dist/listbox/root/context.js +23 -13
- package/dist/listbox/root/listbox-test.svelte +14 -2
- package/dist/listbox/root/listbox-test.svelte.d.ts +1 -0
- package/dist/listbox/root/listbox.svelte +49 -2
- package/dist/listbox/root/listbox.svelte.d.ts +4 -2
- package/dist/popover/README.md +10 -0
- package/dist/popover/content/README.md +11 -0
- package/dist/popover/content/popover-content-controlled-close-test.svelte +30 -0
- package/dist/popover/content/popover-content-controlled-close-test.svelte.d.ts +3 -0
- package/dist/popover/content/popover-content-standalone-test.svelte +28 -0
- package/dist/popover/content/popover-content-standalone-test.svelte.d.ts +6 -0
- package/dist/popover/content/popover-content-test.svelte +32 -2
- package/dist/popover/content/popover-content-test.svelte.d.ts +3 -1
- package/dist/popover/content/popover-content.svelte +315 -24
- package/dist/popover/content/popover-content.svelte.d.ts +5 -1
- package/dist/popover/index.d.ts +3 -3
- package/dist/popover/index.js +3 -5
- package/dist/popover/root/README.md +10 -15
- package/dist/popover/root/context.d.ts +16 -7
- package/dist/popover/root/context.js +0 -2
- package/dist/popover/root/focus-state.d.ts +4 -0
- package/dist/popover/root/focus-state.js +33 -0
- package/dist/popover/root/popover-root.svelte +90 -17
- package/dist/popover/root/popover-root.svelte.d.ts +2 -1
- package/dist/popover/root/popover-test.svelte +2 -1
- package/dist/popover/root/popover-test.svelte.d.ts +2 -1
- package/dist/popover/trigger/popover-trigger-button-root-test.svelte +17 -0
- package/dist/popover/trigger/popover-trigger-button-root-test.svelte.d.ts +18 -0
- package/dist/popover/trigger/popover-trigger-button.svelte +9 -7
- package/dist/popover/trigger/popover-trigger.svelte +17 -5
- package/dist/portal/portal.svelte +3 -1
- package/dist/primitives/click-outside.d.ts +1 -1
- package/dist/primitives/click-outside.js +1 -1
- package/dist/primitives/floating.js +12 -4
- package/dist/primitives/focus-trap.d.ts +7 -2
- package/dist/primitives/focus-trap.js +50 -17
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/index.js +1 -0
- package/dist/primitives/input-modality.d.ts +7 -0
- package/dist/primitives/input-modality.js +125 -0
- package/dist/primitives/keyboard-navigation.d.ts +1 -0
- package/dist/primitives/keyboard-navigation.js +17 -0
- package/dist/table/IMPLEMENTATION_NOTES.md +9 -0
- package/dist/table/PLAN-HIDDEN-COLUMNS.md +152 -0
- package/dist/table/PLAN.md +1336 -0
- package/dist/table/README.md +143 -0
- package/dist/table/SELECTION_CHECKBOX_PLAN.md +234 -0
- package/dist/table/TODO.md +138 -0
- package/dist/table/body/README.md +39 -0
- package/dist/table/body/table-body-items-test.svelte +45 -0
- package/dist/table/body/table-body-items-test.svelte.d.ts +18 -0
- package/dist/table/body/table-body.svelte +171 -0
- package/dist/table/body/table-body.svelte.d.ts +45 -0
- package/dist/table/cell/README.md +27 -0
- package/dist/table/cell/table-cell.svelte +253 -0
- package/dist/table/cell/table-cell.svelte.d.ts +4 -0
- package/dist/table/checkbox/README.md +40 -0
- package/dist/table/checkbox/table-checkbox-test.svelte +170 -0
- package/dist/table/checkbox/table-checkbox-test.svelte.d.ts +22 -0
- package/dist/table/checkbox/table-checkbox.svelte +235 -0
- package/dist/table/checkbox/table-checkbox.svelte.d.ts +4 -0
- package/dist/table/checkbox-indicator/README.md +31 -0
- package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte +15 -0
- package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte.d.ts +4 -0
- package/dist/table/column/README.md +36 -0
- package/dist/table/column/table-column.svelte +79 -0
- package/dist/table/column/table-column.svelte.d.ts +4 -0
- package/dist/table/column-header-cell/README.md +30 -0
- package/dist/table/column-header-cell/table-column-header-cell.svelte +271 -0
- package/dist/table/column-header-cell/table-column-header-cell.svelte.d.ts +4 -0
- package/dist/table/column-resizer/README.md +33 -0
- package/dist/table/column-resizer/table-column-resizer-fixed-width-test.svelte +57 -0
- package/dist/table/column-resizer/table-column-resizer-fixed-width-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte +52 -0
- package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-narrow-min-width-test.svelte +76 -0
- package/dist/table/column-resizer/table-column-resizer-narrow-min-width-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-overflow-test.svelte +64 -0
- package/dist/table/column-resizer/table-column-resizer-overflow-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-padded-container-test.svelte +67 -0
- package/dist/table/column-resizer/table-column-resizer-padded-container-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-sandbox-overflow-test.svelte +87 -0
- package/dist/table/column-resizer/table-column-resizer-sandbox-overflow-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte +84 -0
- package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-test.svelte +77 -0
- package/dist/table/column-resizer/table-column-resizer-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-three-column-relative-test.svelte +64 -0
- package/dist/table/column-resizer/table-column-resizer-three-column-relative-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer.svelte +610 -0
- package/dist/table/column-resizer/table-column-resizer.svelte.d.ts +4 -0
- package/dist/table/empty-state/README.md +27 -0
- package/dist/table/empty-state/table-empty-state.svelte +33 -0
- package/dist/table/empty-state/table-empty-state.svelte.d.ts +4 -0
- package/dist/table/footer/README.md +26 -0
- package/dist/table/footer/table-footer.svelte +13 -0
- package/dist/table/footer/table-footer.svelte.d.ts +4 -0
- package/dist/table/header/README.md +26 -0
- package/dist/table/header/table-header.svelte +13 -0
- package/dist/table/header/table-header.svelte.d.ts +4 -0
- package/dist/table/index.d.ts +18 -0
- package/dist/table/index.js +17 -0
- package/dist/table/index.parts.d.ts +13 -0
- package/dist/table/index.parts.js +13 -0
- package/dist/table/root/README.md +66 -0
- package/dist/table/root/context.d.ts +233 -0
- package/dist/table/root/context.js +2153 -0
- package/dist/table/root/table-reorder-test.svelte +64 -0
- package/dist/table/root/table-reorder-test.svelte.d.ts +3 -0
- package/dist/table/root/table-root.svelte +561 -0
- package/dist/table/root/table-root.svelte.d.ts +4 -0
- package/dist/table/root/table-ssr-wrapper-column.svelte +48 -0
- package/dist/table/root/table-ssr-wrapper-column.svelte.d.ts +4 -0
- package/dist/table/root/table-ssr-wrapper-context.d.ts +11 -0
- package/dist/table/root/table-ssr-wrapper-context.js +13 -0
- package/dist/table/root/table-ssr-wrapper-test.svelte +57 -0
- package/dist/table/root/table-ssr-wrapper-test.svelte.d.ts +3 -0
- package/dist/table/root/table-test.svelte +206 -0
- package/dist/table/root/table-test.svelte.d.ts +29 -0
- package/dist/table/row/README.md +29 -0
- package/dist/table/row/table-row.svelte +244 -0
- package/dist/table/row/table-row.svelte.d.ts +4 -0
- package/dist/table/sort-trigger/README.md +45 -0
- package/dist/table/sort-trigger/table-sort-trigger.svelte +183 -0
- package/dist/table/sort-trigger/table-sort-trigger.svelte.d.ts +4 -0
- package/dist/table/types.d.ts +112 -0
- package/dist/table/types.js +1 -0
- package/dist/table/utils/handle-body-keydown.d.ts +13 -0
- package/dist/table/utils/handle-body-keydown.js +67 -0
- package/dist/table/utils/visually-hidden-style.d.ts +1 -0
- package/dist/table/utils/visually-hidden-style.js +1 -0
- package/dist/test-utils/focus-contract.d.ts +3 -0
- package/dist/test-utils/focus-contract.js +26 -0
- package/dist/timepicker/IMPLEMENTATION_PLAN.md +254 -0
- package/dist/timepicker/README.md +97 -0
- package/dist/timepicker/TODO.md +86 -0
- package/dist/timepicker/clock/README.md +14 -0
- package/dist/timepicker/clock/time-picker-clock-test.svelte +45 -0
- package/dist/timepicker/clock/time-picker-clock-test.svelte.d.ts +11 -0
- package/dist/timepicker/clock/time-picker-clock.svelte +65 -0
- package/dist/timepicker/clock/time-picker-clock.svelte.d.ts +10 -0
- package/dist/timepicker/index.d.ts +14 -0
- package/dist/timepicker/index.js +14 -0
- package/dist/timepicker/index.parts.d.ts +8 -0
- package/dist/timepicker/index.parts.js +8 -0
- package/dist/timepicker/input/README.md +15 -0
- package/dist/timepicker/input/time-picker-input-forwarding-test.svelte +40 -0
- package/dist/timepicker/input/time-picker-input-forwarding-test.svelte.d.ts +3 -0
- package/dist/timepicker/input/time-picker-input.svelte +109 -0
- package/dist/timepicker/input/time-picker-input.svelte.d.ts +11 -0
- package/dist/timepicker/internal/strict-props.d.ts +4 -0
- package/dist/timepicker/internal/strict-props.js +51 -0
- package/dist/timepicker/popover/README.md +20 -0
- package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte +22 -0
- package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte.d.ts +3 -0
- package/dist/timepicker/popover/time-picker-popover.svelte +89 -0
- package/dist/timepicker/popover/time-picker-popover.svelte.d.ts +7 -0
- package/dist/timepicker/root/README.md +42 -0
- package/dist/timepicker/root/context.d.ts +51 -0
- package/dist/timepicker/root/context.js +15 -0
- package/dist/timepicker/root/time-picker-12h-test.svelte +22 -0
- package/dist/timepicker/root/time-picker-12h-test.svelte.d.ts +3 -0
- package/dist/timepicker/root/time-picker-bindable-test.svelte +25 -0
- package/dist/timepicker/root/time-picker-bindable-test.svelte.d.ts +3 -0
- package/dist/timepicker/root/time-picker-empty-test.svelte +20 -0
- package/dist/timepicker/root/time-picker-empty-test.svelte.d.ts +3 -0
- package/dist/timepicker/root/time-picker-root.svelte +625 -0
- package/dist/timepicker/root/time-picker-root.svelte.d.ts +28 -0
- package/dist/timepicker/root/time-picker-test.svelte +72 -0
- package/dist/timepicker/root/time-picker-test.svelte.d.ts +15 -0
- package/dist/timepicker/root/time-utils.d.ts +1 -0
- package/dist/timepicker/root/time-utils.js +3 -0
- package/dist/timepicker/segment/README.md +14 -0
- package/dist/timepicker/segment/time-picker-segment.svelte +365 -0
- package/dist/timepicker/segment/time-picker-segment.svelte.d.ts +9 -0
- package/dist/timepicker/trigger/README.md +14 -0
- package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte +35 -0
- package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte.d.ts +3 -0
- package/dist/timepicker/trigger/time-picker-trigger.svelte +122 -0
- package/dist/timepicker/trigger/time-picker-trigger.svelte.d.ts +9 -0
- package/dist/utils/date-only.d.ts +11 -0
- package/dist/utils/date-only.js +53 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/package.json +33 -2
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
import { untrack, onDestroy, setContext } from 'svelte';
|
|
12
12
|
import ListBoxItem from '../../listbox/item/listbox-item.svelte';
|
|
13
13
|
import { useComboBoxContext } from '../root/context';
|
|
14
|
-
import { cn } from '../../utils/cn';
|
|
15
14
|
|
|
16
15
|
/**
|
|
17
16
|
* ComboBox.ListBoxItem wraps ListBox.Item and provides ComboBox-specific behavior:
|
|
@@ -33,7 +32,7 @@
|
|
|
33
32
|
| 'isParentDisabled'
|
|
34
33
|
>;
|
|
35
34
|
|
|
36
|
-
let { id,
|
|
35
|
+
let { id, ...props }: ComboBoxListBoxItemProps = $props();
|
|
37
36
|
|
|
38
37
|
const ctx = useComboBoxContext();
|
|
39
38
|
|
|
@@ -57,6 +56,7 @@
|
|
|
57
56
|
|
|
58
57
|
// Normalized input for filtering comparison
|
|
59
58
|
const normalizedInput = $derived(ctx.inputValue.trim().toLowerCase());
|
|
59
|
+
const isDisabled = $derived(Boolean(props.disabled) || ctx.isDisabled);
|
|
60
60
|
|
|
61
61
|
// Automatic filtering: if text is not resolved yet, keep item visible until mount resolves it.
|
|
62
62
|
const isVisible = $derived(
|
|
@@ -67,6 +67,7 @@
|
|
|
67
67
|
|
|
68
68
|
// Virtual focus from ComboBox context
|
|
69
69
|
const isFocused = $derived(ctx.focusedItemId === id);
|
|
70
|
+
const isFocusVisible = $derived(isFocused && ctx.isFocusVisible);
|
|
70
71
|
|
|
71
72
|
// Generate unique ID using instanceId
|
|
72
73
|
const uniqueId = $derived(`combobox-item-${ctx.instanceId}-${id}`);
|
|
@@ -77,14 +78,15 @@
|
|
|
77
78
|
// Reactive registration: register when visible, unregister when hidden
|
|
78
79
|
$effect(() => {
|
|
79
80
|
const visible = isVisible;
|
|
81
|
+
const disabled = isDisabled;
|
|
80
82
|
const label = effectiveTextValue || String(id);
|
|
81
83
|
const itemId = id;
|
|
82
84
|
|
|
83
85
|
untrack(() => {
|
|
84
|
-
if (visible && !isRegistered) {
|
|
86
|
+
if (visible && !disabled && !isRegistered) {
|
|
85
87
|
ctx.registerItem(itemId, label);
|
|
86
88
|
isRegistered = true;
|
|
87
|
-
} else if (!visible && isRegistered) {
|
|
89
|
+
} else if ((!visible || disabled) && isRegistered) {
|
|
88
90
|
ctx.unregisterItem(itemId);
|
|
89
91
|
isRegistered = false;
|
|
90
92
|
}
|
|
@@ -109,8 +111,14 @@
|
|
|
109
111
|
|
|
110
112
|
// Custom select handler that uses ComboBox context
|
|
111
113
|
function handleSelect(itemId: string | number, label: string) {
|
|
114
|
+
ctx.setFocusedItemId(itemId);
|
|
112
115
|
ctx.select(itemId, label);
|
|
113
116
|
}
|
|
117
|
+
|
|
118
|
+
function handleHoverStart(itemId: string | number) {
|
|
119
|
+
ctx.setFocusVisible(false);
|
|
120
|
+
ctx.setFocusedItemId(itemId);
|
|
121
|
+
}
|
|
114
122
|
</script>
|
|
115
123
|
|
|
116
124
|
{#if isVisible}
|
|
@@ -121,16 +129,11 @@
|
|
|
121
129
|
customId={uniqueId}
|
|
122
130
|
disableFocusHandling={true}
|
|
123
131
|
isFocusedOverride={isFocused}
|
|
132
|
+
isFocusVisibleOverride={isFocusVisible}
|
|
124
133
|
onItemSelect={handleSelect}
|
|
125
134
|
onResolvedTextValue={handleResolvedTextValue}
|
|
135
|
+
onItemHoverStart={handleHoverStart}
|
|
126
136
|
scrollOnFocus={true}
|
|
127
137
|
isParentDisabled={ctx.isDisabled}
|
|
128
|
-
class={cn(
|
|
129
|
-
'cursor-pointer px-3 py-2 transition-colors outline-none',
|
|
130
|
-
'data-focused:bg-accent data-hovered:bg-accent',
|
|
131
|
-
'data-selected:bg-primary/10 data-selected:font-medium',
|
|
132
|
-
'data-disabled:pointer-events-none data-disabled:opacity-50',
|
|
133
|
-
className
|
|
134
|
-
)}
|
|
135
138
|
/>
|
|
136
139
|
{/if}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
|
-
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
3
|
import { getContext } from 'svelte';
|
|
5
|
-
import {
|
|
6
|
-
import { useComboBoxContext } from '../root/context';
|
|
4
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
7
5
|
import {
|
|
8
6
|
COMBOBOX_ITEM_CONTEXT_KEY,
|
|
9
7
|
type ComboBoxItemContext
|
|
10
8
|
} from '../item/combobox-listboxitem.svelte';
|
|
9
|
+
import { useComboBoxContext } from '../root/context';
|
|
11
10
|
|
|
12
11
|
/**
|
|
13
12
|
* ComboBox.ItemIndicator - Visual indicator shown when an item is selected.
|
|
@@ -22,12 +21,7 @@
|
|
|
22
21
|
class?: string;
|
|
23
22
|
} & Omit<HTMLAttributes<HTMLSpanElement>, 'class' | 'children'>;
|
|
24
23
|
|
|
25
|
-
let {
|
|
26
|
-
children,
|
|
27
|
-
forceMount = false,
|
|
28
|
-
class: className,
|
|
29
|
-
...restProps
|
|
30
|
-
}: ComboBoxItemIndicatorProps = $props();
|
|
24
|
+
let { children, forceMount = false, ...restProps }: ComboBoxItemIndicatorProps = $props();
|
|
31
25
|
|
|
32
26
|
const comboboxCtx = useComboBoxContext();
|
|
33
27
|
const itemCtx = getContext<ComboBoxItemContext>(COMBOBOX_ITEM_CONTEXT_KEY);
|
|
@@ -37,12 +31,7 @@
|
|
|
37
31
|
</script>
|
|
38
32
|
|
|
39
33
|
{#if shouldRender}
|
|
40
|
-
<span
|
|
41
|
-
aria-hidden="true"
|
|
42
|
-
data-state={isSelected ? 'checked' : 'unchecked'}
|
|
43
|
-
class={cn('inline-flex items-center justify-center', className)}
|
|
44
|
-
{...restProps}
|
|
45
|
-
>
|
|
34
|
+
<span aria-hidden="true" data-state={isSelected ? 'checked' : 'unchecked'} {...restProps}>
|
|
46
35
|
{#if children}
|
|
47
36
|
{@render children()}
|
|
48
37
|
{:else}
|
|
@@ -14,10 +14,11 @@ declare function $$render<T extends object = object>(): {
|
|
|
14
14
|
id?: string;
|
|
15
15
|
'aria-label'?: string;
|
|
16
16
|
onChange?: ((value: Set<string | number>) => void) | undefined;
|
|
17
|
+
disableFocusHandling?: boolean;
|
|
17
18
|
} & {
|
|
18
19
|
context?: ListBoxContext;
|
|
19
20
|
element?: HTMLElement;
|
|
20
|
-
}, "
|
|
21
|
+
}, "children" | "value" | "id" | "element" | "selectionMode" | "selectionBehavior" | "defaultValue" | "onChange" | "items" | "context"> & {
|
|
21
22
|
/** Optional items for dynamic rendering - overrides items from ComboBox context */
|
|
22
23
|
items?: Iterable<T>;
|
|
23
24
|
/** Content of the listbox. Receives item in dynamic mode. */
|
|
@@ -7,7 +7,21 @@
|
|
|
7
7
|
Name: `ComboBox.Popover`
|
|
8
8
|
Description: Floating container for combobox options. Internally composes `Popover.Root` and `Popover.Content` in non-modal mode.
|
|
9
9
|
|
|
10
|
-
| Prop
|
|
11
|
-
|
|
|
12
|
-
| `
|
|
13
|
-
| `
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| ------------------------------ | ---------------------------------- | ---------------- | -------------------------------------------------------------------------- |
|
|
12
|
+
| `offset` | `number` | `8` | Main-axis offset from the combobox trigger. |
|
|
13
|
+
| `placement` | `ExtendedPlacement` | `'bottom-start'` | Preferred floating placement. |
|
|
14
|
+
| `shouldFlip` | `boolean` | `true` | Enables automatic fallback placement when space is limited. |
|
|
15
|
+
| `boundaryElement` | `Element \| null` | `null` | Optional boundary element for positioning constraints. |
|
|
16
|
+
| `class` | `string` | `''` | CSS class names for the floating panel. |
|
|
17
|
+
| `children` | `Snippet` | `undefined` | Popover content, typically `ComboBox.List`. |
|
|
18
|
+
| `isNonModal` | `boolean` | `true` | Controls whether the popover behaves as a non-modal overlay. |
|
|
19
|
+
| `shouldCloseOnInteractOutside` | `boolean` | `true` | Closes when interacting outside the panel. |
|
|
20
|
+
| `shouldCloseOnEscape` | `boolean` | `true` | Closes on Escape key press. |
|
|
21
|
+
| `shouldCloseOnBlur` | `boolean` | `true` | Closes on focus leaving trigger/content in the combobox interaction model. |
|
|
22
|
+
| `initialFocus` | `FocusTrapOptions['initialFocus']` | `undefined` | Initial focus target when modal focus trapping is enabled. |
|
|
23
|
+
|
|
24
|
+
## Notes
|
|
25
|
+
|
|
26
|
+
- `ComboBox.Popover` forwards all `Popover.Content` configuration props except the controlled open-state wiring (`open`, `triggerRef`, and `onOpenChange`).
|
|
27
|
+
- The default placement is `bottom-start` to match the combobox input.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { ComponentProps } from 'svelte';
|
|
3
|
+
import ComboBox from '../index';
|
|
4
|
+
import type { PopoverContent } from '../../popover';
|
|
5
|
+
|
|
6
|
+
type Props = {
|
|
7
|
+
offset?: number;
|
|
8
|
+
placement?: ComponentProps<typeof PopoverContent>['placement'];
|
|
9
|
+
shouldFlip?: boolean;
|
|
10
|
+
shouldCloseOnEscape?: boolean;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
let {
|
|
14
|
+
offset = 8,
|
|
15
|
+
placement = 'bottom-start',
|
|
16
|
+
shouldFlip = true,
|
|
17
|
+
shouldCloseOnEscape = true
|
|
18
|
+
}: Props = $props();
|
|
19
|
+
|
|
20
|
+
const countries = [
|
|
21
|
+
{ id: 'ar', name: 'Argentina' },
|
|
22
|
+
{ id: 'br', name: 'Brazil' },
|
|
23
|
+
{ id: 'ca', name: 'Canada' }
|
|
24
|
+
];
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<ComboBox.Root trigger="press">
|
|
28
|
+
<ComboBox.Input placeholder="Search countries..." />
|
|
29
|
+
<ComboBox.Trigger />
|
|
30
|
+
|
|
31
|
+
<ComboBox.Popover {offset} {placement} {shouldFlip} {shouldCloseOnEscape}>
|
|
32
|
+
<ComboBox.List emptyPlaceholder="No countries found">
|
|
33
|
+
{#each countries as country (country.id)}
|
|
34
|
+
<ComboBox.Item id={country.id} textValue={country.name}>{country.name}</ComboBox.Item>
|
|
35
|
+
{/each}
|
|
36
|
+
</ComboBox.List>
|
|
37
|
+
</ComboBox.Popover>
|
|
38
|
+
</ComboBox.Root>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ComponentProps } from 'svelte';
|
|
2
|
+
import type { PopoverContent } from '../../popover';
|
|
3
|
+
type Props = {
|
|
4
|
+
offset?: number;
|
|
5
|
+
placement?: ComponentProps<typeof PopoverContent>['placement'];
|
|
6
|
+
shouldFlip?: boolean;
|
|
7
|
+
shouldCloseOnEscape?: boolean;
|
|
8
|
+
};
|
|
9
|
+
declare const ComboboxPopoverPropsTest: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
type ComboboxPopoverPropsTest = ReturnType<typeof ComboboxPopoverPropsTest>;
|
|
11
|
+
export default ComboboxPopoverPropsTest;
|
|
@@ -1,66 +1,209 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { ComponentProps, Snippet } from 'svelte';
|
|
3
3
|
import { useComboBoxContext } from '../root/context';
|
|
4
4
|
import { Popover } from '../../popover';
|
|
5
|
+
import { focusWithModality, type InputModality } from '../../primitives/input-modality';
|
|
6
|
+
import type { PopoverOpenChangeDetails } from '../../popover/root/context';
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
9
|
* ComboBox.Popover - Just the floating container wrapper.
|
|
8
10
|
* Should contain ComboBox.ListBox as a child.
|
|
9
11
|
*/
|
|
10
|
-
type ComboBoxPopoverProps =
|
|
11
|
-
|
|
12
|
+
type ComboBoxPopoverProps = Omit<
|
|
13
|
+
ComponentProps<typeof Popover.Content>,
|
|
14
|
+
'open' | 'triggerRef' | 'onOpenChange' | 'children'
|
|
15
|
+
> & {
|
|
12
16
|
children?: Snippet;
|
|
13
17
|
};
|
|
14
18
|
|
|
15
|
-
let {
|
|
19
|
+
let {
|
|
20
|
+
class: className = '',
|
|
21
|
+
children,
|
|
22
|
+
placement = 'bottom-start',
|
|
23
|
+
isNonModal = true,
|
|
24
|
+
shouldCloseOnEscape = true,
|
|
25
|
+
shouldCloseOnBlur = true,
|
|
26
|
+
...contentProps
|
|
27
|
+
}: ComboBoxPopoverProps = $props();
|
|
16
28
|
|
|
17
29
|
const ctx = useComboBoxContext();
|
|
30
|
+
let restoreListboxMaxHeight: (() => void) | undefined;
|
|
31
|
+
|
|
32
|
+
function resolveFocusTarget(details?: PopoverOpenChangeDetails): HTMLElement | null {
|
|
33
|
+
const rawTarget = details?.event?.target;
|
|
34
|
+
if (!(rawTarget instanceof Node)) return null;
|
|
35
|
+
if (ctx.inputRef?.contains(rawTarget)) return null;
|
|
36
|
+
return rawTarget instanceof HTMLElement ? rawTarget : rawTarget.parentElement;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function handleOpenChange(open: boolean, details?: PopoverOpenChangeDetails) {
|
|
40
|
+
if (!open) {
|
|
41
|
+
// Cancel Popover.Root's close to prevent scheduleTriggerCloseFocus from
|
|
42
|
+
// setting stale data-focused on the trigger. The combobox passes triggerRef
|
|
43
|
+
// via prop (not Popover.Trigger), so Popover.Root never registers a
|
|
44
|
+
// blur-cleanup listener and any data-focused it sets persists forever.
|
|
45
|
+
//
|
|
46
|
+
// IMPORTANT: the actual state change is deferred to a microtask so that
|
|
47
|
+
// when Popover.Root's closePopover re-reads `isOpen` after the callback,
|
|
48
|
+
// the derived value is still `true` and the guard succeeds. A synchronous
|
|
49
|
+
// ctx.onOpenChange(false) would update the upstream signal immediately,
|
|
50
|
+
// making the derived `false` and bypassing the guard despite the cancel.
|
|
51
|
+
details?.cancel();
|
|
52
|
+
|
|
53
|
+
if (details?.reason === 'outside-press') {
|
|
54
|
+
const target = resolveFocusTarget(details);
|
|
55
|
+
queueMicrotask(() => {
|
|
56
|
+
ctx.onOpenChange(false);
|
|
57
|
+
|
|
58
|
+
if (target) {
|
|
59
|
+
focusWithModality(target, 'pointer' satisfies InputModality);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// If focus is still on the input (non-focusable target), blur it
|
|
63
|
+
// so focusWithin becomes false.
|
|
64
|
+
if (document.activeElement === ctx.inputRef) {
|
|
65
|
+
ctx.inputRef?.blur();
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
queueMicrotask(() => {
|
|
72
|
+
ctx.onOpenChange(false);
|
|
73
|
+
});
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
18
76
|
|
|
19
|
-
function handleOpenChange(open: boolean) {
|
|
20
77
|
ctx.onOpenChange(open);
|
|
21
78
|
}
|
|
22
79
|
|
|
80
|
+
function handleMouseDown() {
|
|
81
|
+
ctx.markPopoverPointerDown();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function applyListboxViewportConstraint() {
|
|
85
|
+
const listbox = ctx.listboxRef;
|
|
86
|
+
if (!listbox) return;
|
|
87
|
+
|
|
88
|
+
const previousInlineMaxHeight = listbox.style.maxHeight;
|
|
89
|
+
const computedMaxHeight = getComputedStyle(listbox).maxHeight;
|
|
90
|
+
|
|
91
|
+
listbox.style.maxHeight =
|
|
92
|
+
computedMaxHeight && computedMaxHeight !== 'none'
|
|
93
|
+
? `min(${computedMaxHeight}, var(--available-height))`
|
|
94
|
+
: 'var(--available-height)';
|
|
95
|
+
|
|
96
|
+
restoreListboxMaxHeight = () => {
|
|
97
|
+
listbox.style.maxHeight = previousInlineMaxHeight;
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function canElementScrollInDirection(element: HTMLElement, deltaY: number) {
|
|
102
|
+
const isScrollingDown = deltaY > 0;
|
|
103
|
+
const isScrollingUp = deltaY < 0;
|
|
104
|
+
const canScrollDown = element.scrollTop < element.scrollHeight - element.clientHeight;
|
|
105
|
+
const canScrollUp = element.scrollTop > 0;
|
|
106
|
+
|
|
107
|
+
return (isScrollingDown && canScrollDown) || (isScrollingUp && canScrollUp);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function isScrollableElement(element: HTMLElement) {
|
|
111
|
+
const { overflowY } = getComputedStyle(element);
|
|
112
|
+
return (
|
|
113
|
+
['auto', 'scroll', 'overlay'].includes(overflowY) &&
|
|
114
|
+
element.scrollHeight > element.clientHeight
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function hasScrollableDescendantForWheel(
|
|
119
|
+
boundary: HTMLElement,
|
|
120
|
+
target: EventTarget | null,
|
|
121
|
+
deltaY: number
|
|
122
|
+
) {
|
|
123
|
+
let current =
|
|
124
|
+
target instanceof HTMLElement ? target : target instanceof Node ? target.parentElement : null;
|
|
125
|
+
|
|
126
|
+
while (current) {
|
|
127
|
+
if (isScrollableElement(current) && canElementScrollInDirection(current, deltaY)) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (current === boundary) {
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
current = current.parentElement;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
|
|
23
141
|
/**
|
|
24
142
|
* Prevent wheel/scroll events from propagating to the page
|
|
25
143
|
* This keeps the page from scrolling when scrolling over the popover
|
|
26
|
-
* But allows internal scrolling when the popover
|
|
144
|
+
* But allows internal scrolling when either the popover or a descendant owns overflow
|
|
27
145
|
*/
|
|
28
146
|
function handleWheel(event: WheelEvent) {
|
|
29
147
|
const element = event.currentTarget as HTMLElement;
|
|
30
148
|
if (!element) return;
|
|
31
149
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
// Check if we can scroll in the direction of the wheel
|
|
37
|
-
const canScrollDown = scrollTop < scrollHeight - clientHeight;
|
|
38
|
-
const canScrollUp = scrollTop > 0;
|
|
39
|
-
|
|
40
|
-
// If we can scroll internally in this direction, allow it
|
|
41
|
-
if ((isScrollingDown && canScrollDown) || (isScrollingUp && canScrollUp)) {
|
|
42
|
-
// Allow internal scroll, but stop propagation to page
|
|
43
|
-
event.stopPropagation();
|
|
44
|
-
} else {
|
|
45
|
-
// Can't scroll internally, prevent both default and propagation
|
|
46
|
-
event.preventDefault();
|
|
150
|
+
if (
|
|
151
|
+
hasScrollableDescendantForWheel(element, event.target, event.deltaY) ||
|
|
152
|
+
(isScrollableElement(element) && canElementScrollInDirection(element, event.deltaY))
|
|
153
|
+
) {
|
|
47
154
|
event.stopPropagation();
|
|
155
|
+
return;
|
|
48
156
|
}
|
|
157
|
+
|
|
158
|
+
event.preventDefault();
|
|
159
|
+
event.stopPropagation();
|
|
49
160
|
}
|
|
50
161
|
|
|
162
|
+
$effect(() => {
|
|
163
|
+
restoreListboxMaxHeight?.();
|
|
164
|
+
restoreListboxMaxHeight = undefined;
|
|
165
|
+
|
|
166
|
+
if (ctx.isOpen && ctx.listboxRef) {
|
|
167
|
+
applyListboxViewportConstraint();
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return () => {
|
|
171
|
+
restoreListboxMaxHeight?.();
|
|
172
|
+
restoreListboxMaxHeight = undefined;
|
|
173
|
+
};
|
|
174
|
+
});
|
|
175
|
+
|
|
51
176
|
$effect(() => {
|
|
52
177
|
if (ctx.isOpen) {
|
|
53
178
|
ctx.inputRef?.focus();
|
|
54
179
|
}
|
|
55
180
|
});
|
|
181
|
+
|
|
182
|
+
$effect(() => {
|
|
183
|
+
ctx.setShouldCloseOnEscape(shouldCloseOnEscape);
|
|
184
|
+
return () => {
|
|
185
|
+
ctx.setShouldCloseOnEscape(true);
|
|
186
|
+
};
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
$effect(() => {
|
|
190
|
+
ctx.setShouldCloseOnBlur(shouldCloseOnBlur);
|
|
191
|
+
return () => {
|
|
192
|
+
ctx.setShouldCloseOnBlur(true);
|
|
193
|
+
};
|
|
194
|
+
});
|
|
56
195
|
</script>
|
|
57
196
|
|
|
58
197
|
<Popover.Root open={ctx.isOpen} triggerRef={ctx.triggerRef} onOpenChange={handleOpenChange}>
|
|
59
198
|
<Popover.Content
|
|
60
|
-
isNonModal
|
|
61
|
-
placement
|
|
199
|
+
{isNonModal}
|
|
200
|
+
{placement}
|
|
201
|
+
{shouldCloseOnEscape}
|
|
202
|
+
{shouldCloseOnBlur}
|
|
62
203
|
class={className}
|
|
204
|
+
onmousedown={handleMouseDown}
|
|
63
205
|
onwheel={handleWheel}
|
|
206
|
+
{...contentProps}
|
|
64
207
|
>
|
|
65
208
|
{#if children}
|
|
66
209
|
{@render children()}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { Snippet } from 'svelte';
|
|
1
|
+
import type { ComponentProps, Snippet } from 'svelte';
|
|
2
|
+
import { Popover } from '../../popover';
|
|
2
3
|
/**
|
|
3
4
|
* ComboBox.Popover - Just the floating container wrapper.
|
|
4
5
|
* Should contain ComboBox.ListBox as a child.
|
|
5
6
|
*/
|
|
6
|
-
type ComboBoxPopoverProps = {
|
|
7
|
-
class?: string;
|
|
7
|
+
type ComboBoxPopoverProps = Omit<ComponentProps<typeof Popover.Content>, 'open' | 'triggerRef' | 'onOpenChange' | 'children'> & {
|
|
8
8
|
children?: Snippet;
|
|
9
9
|
};
|
|
10
10
|
declare const ComboboxPopover: import("svelte").Component<ComboBoxPopoverProps, {}, "">;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import ComboBox from '../index';
|
|
3
|
+
|
|
4
|
+
const items = Array.from({ length: 12 }, (_, index) => ({
|
|
5
|
+
id: `item-${index + 1}`,
|
|
6
|
+
name: `Item ${index + 1}`
|
|
7
|
+
}));
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<ComboBox.Root trigger="press">
|
|
11
|
+
<ComboBox.Input placeholder="Search items..." />
|
|
12
|
+
<ComboBox.Trigger />
|
|
13
|
+
|
|
14
|
+
<ComboBox.Popover>
|
|
15
|
+
<ComboBox.List class="combobox-test-scroll-list" emptyPlaceholder="No items found">
|
|
16
|
+
{#each items as item (item.id)}
|
|
17
|
+
<ComboBox.Item id={item.id} textValue={item.name}>
|
|
18
|
+
{item.name}
|
|
19
|
+
</ComboBox.Item>
|
|
20
|
+
{/each}
|
|
21
|
+
</ComboBox.List>
|
|
22
|
+
</ComboBox.Popover>
|
|
23
|
+
</ComboBox.Root>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
2
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
3
|
+
$$bindings?: Bindings;
|
|
4
|
+
} & Exports;
|
|
5
|
+
(internal: unknown, props: {
|
|
6
|
+
$$events?: Events;
|
|
7
|
+
$$slots?: Slots;
|
|
8
|
+
}): Exports & {
|
|
9
|
+
$set?: any;
|
|
10
|
+
$on?: any;
|
|
11
|
+
};
|
|
12
|
+
z_$$bindings?: Bindings;
|
|
13
|
+
}
|
|
14
|
+
declare const ComboboxScrollableListTest: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
15
|
+
[evt: string]: CustomEvent<any>;
|
|
16
|
+
}, {}, {}, string>;
|
|
17
|
+
type ComboboxScrollableListTest = InstanceType<typeof ComboboxScrollableListTest>;
|
|
18
|
+
export default ComboboxScrollableListTest;
|
|
@@ -11,6 +11,7 @@ Description: State container for combobox behavior, including open state, input
|
|
|
11
11
|
| ------------------- | ------------------------------------------ | -------------------------------- | ----------------------------------------------------------- |
|
|
12
12
|
| `id` | `string` | `$props.id()` | Stable id used to derive internal ARIA ids. |
|
|
13
13
|
| `isDisabled` | `boolean` | `false` | Disables all user interaction. |
|
|
14
|
+
| `isPending` | `boolean` | `false` | Exposes busy async state on the root via `data-pending`. |
|
|
14
15
|
| `isReadOnly` | `boolean` | `false` | Keeps the component interactive but prevents value changes. |
|
|
15
16
|
| `value` | `string \| number \| (string \| number)[]` | `undefined` | Controlled selection value. Supports `bind:value`. |
|
|
16
17
|
| `defaultValue` | `string \| number \| (string \| number)[]` | `undefined` | Initial selection value in uncontrolled mode. |
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
onValueChange?: (value: (string | number)[]) => void;
|
|
8
8
|
trigger?: 'focus' | 'input' | 'press';
|
|
9
9
|
closeOnSelect?: boolean;
|
|
10
|
+
disabledIds?: string[];
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
let {
|
|
@@ -20,7 +21,8 @@
|
|
|
20
21
|
value = $bindable([]),
|
|
21
22
|
onValueChange,
|
|
22
23
|
trigger = 'press',
|
|
23
|
-
closeOnSelect = false
|
|
24
|
+
closeOnSelect = false,
|
|
25
|
+
disabledIds = []
|
|
24
26
|
}: Props = $props();
|
|
25
27
|
|
|
26
28
|
function handleChange(newValue: string | number | (string | number)[] | undefined) {
|
|
@@ -47,13 +49,13 @@
|
|
|
47
49
|
{/snippet}
|
|
48
50
|
</ComboBox.Tags>
|
|
49
51
|
<ComboBox.Input placeholder="Search fruits..." />
|
|
50
|
-
<ComboBox.
|
|
52
|
+
<ComboBox.Trigger>▼</ComboBox.Trigger>
|
|
51
53
|
</div>
|
|
52
54
|
|
|
53
55
|
<ComboBox.Popover>
|
|
54
56
|
<ComboBox.List>
|
|
55
57
|
{#each items as item (item.id)}
|
|
56
|
-
<ComboBox.Item id={item.id} textValue={item.name}>
|
|
58
|
+
<ComboBox.Item id={item.id} textValue={item.name} disabled={disabledIds.includes(item.id)}>
|
|
57
59
|
{item.name}
|
|
58
60
|
<ComboBox.ItemIndicator />
|
|
59
61
|
</ComboBox.Item>
|
|
@@ -7,6 +7,7 @@ interface Props {
|
|
|
7
7
|
onValueChange?: (value: (string | number)[]) => void;
|
|
8
8
|
trigger?: 'focus' | 'input' | 'press';
|
|
9
9
|
closeOnSelect?: boolean;
|
|
10
|
+
disabledIds?: string[];
|
|
10
11
|
}
|
|
11
12
|
declare const ComboboxMultiselectTest: import("svelte").Component<Props, {}, "value">;
|
|
12
13
|
type ComboboxMultiselectTest = ReturnType<typeof ComboboxMultiselectTest>;
|
|
@@ -4,11 +4,22 @@
|
|
|
4
4
|
type Props = {
|
|
5
5
|
id?: string;
|
|
6
6
|
isDisabled?: boolean;
|
|
7
|
+
isPending?: boolean;
|
|
7
8
|
isReadOnly?: boolean;
|
|
8
9
|
trigger?: 'focus' | 'input' | 'press';
|
|
10
|
+
disabledIds?: string[];
|
|
9
11
|
};
|
|
10
12
|
|
|
11
|
-
let {
|
|
13
|
+
let {
|
|
14
|
+
id,
|
|
15
|
+
isDisabled = false,
|
|
16
|
+
isPending = false,
|
|
17
|
+
isReadOnly = false,
|
|
18
|
+
trigger = 'press',
|
|
19
|
+
disabledIds = []
|
|
20
|
+
}: Props = $props();
|
|
21
|
+
|
|
22
|
+
let selectedValue = $state<string | number | undefined>();
|
|
12
23
|
|
|
13
24
|
const countries = [
|
|
14
25
|
{ id: 'ar', name: 'Argentina' },
|
|
@@ -24,14 +35,18 @@
|
|
|
24
35
|
];
|
|
25
36
|
</script>
|
|
26
37
|
|
|
27
|
-
<ComboBox.Root {id} {isDisabled} {isReadOnly} {trigger}>
|
|
38
|
+
<ComboBox.Root {id} {isDisabled} {isPending} {isReadOnly} {trigger} bind:value={selectedValue}>
|
|
28
39
|
<ComboBox.Input placeholder="Search countries..." />
|
|
29
|
-
<ComboBox.
|
|
40
|
+
<ComboBox.Trigger />
|
|
30
41
|
|
|
31
42
|
<ComboBox.Popover>
|
|
32
43
|
<ComboBox.List emptyPlaceholder="No countries found">
|
|
33
44
|
{#each countries as country (country.id)}
|
|
34
|
-
<ComboBox.Item
|
|
45
|
+
<ComboBox.Item
|
|
46
|
+
id={country.id}
|
|
47
|
+
textValue={country.name}
|
|
48
|
+
disabled={disabledIds.includes(country.id)}
|
|
49
|
+
>
|
|
35
50
|
{country.name}
|
|
36
51
|
</ComboBox.Item>
|
|
37
52
|
{/each}
|
|
@@ -39,5 +54,9 @@
|
|
|
39
54
|
</ComboBox.Popover>
|
|
40
55
|
</ComboBox.Root>
|
|
41
56
|
|
|
57
|
+
<output data-selected-value
|
|
58
|
+
>{selectedValue === undefined ? 'undefined' : String(selectedValue)}</output
|
|
59
|
+
>
|
|
60
|
+
|
|
42
61
|
<!-- Button outside the combobox for testing blur behavior -->
|
|
43
62
|
<button type="button" data-testid="outside-button">Outside</button>
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
type Props = {
|
|
2
2
|
id?: string;
|
|
3
3
|
isDisabled?: boolean;
|
|
4
|
+
isPending?: boolean;
|
|
4
5
|
isReadOnly?: boolean;
|
|
5
6
|
trigger?: 'focus' | 'input' | 'press';
|
|
7
|
+
disabledIds?: string[];
|
|
6
8
|
};
|
|
7
9
|
declare const ComboboxTest: import("svelte").Component<Props, {}, "">;
|
|
8
10
|
type ComboboxTest = ReturnType<typeof ComboboxTest>;
|