@human-kit/svelte-components 1.0.0-alpha.2 → 1.0.0-alpha.20
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 +362 -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/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-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 +277 -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.svelte +8 -7
- package/dist/popover/trigger/popover-trigger.svelte +14 -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 +26 -0
- package/dist/table/body/table-body.svelte +24 -0
- package/dist/table/body/table-body.svelte.d.ts +4 -0
- package/dist/table/cell/README.md +27 -0
- package/dist/table/cell/table-cell.svelte +265 -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 +128 -0
- package/dist/table/checkbox/table-checkbox-test.svelte.d.ts +18 -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 +228 -0
- package/dist/table/root/context.js +2111 -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 +553 -0
- package/dist/table/root/table-root.svelte.d.ts +4 -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 +95 -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 +31 -1
package/dist/combobox/TODO.md
CHANGED
|
@@ -1,175 +1,28 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
- [x]
|
|
12
|
-
- [x]
|
|
13
|
-
- [x]
|
|
14
|
-
- [x]
|
|
15
|
-
- [x]
|
|
16
|
-
- [x]
|
|
17
|
-
- [x]
|
|
18
|
-
- [x]
|
|
19
|
-
- [x]
|
|
20
|
-
- [x]
|
|
21
|
-
- [x]
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
- [ ]
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
- [ ] **Selection announcement**
|
|
30
|
-
- Announce "Selected item: {label}" when an item is selected
|
|
31
|
-
- Use `aria-live="assertive"` for important changes
|
|
32
|
-
|
|
33
|
-
- [ ] **Support for groups (sections)**
|
|
34
|
-
- Implement `role="group"` with `aria-labelledby` for sections
|
|
35
|
-
- Add `ComboBox.Section` component
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## Scalability
|
|
40
|
-
|
|
41
|
-
### Completed (Scalability)
|
|
42
|
-
|
|
43
|
-
- [x] Reusable `useVirtualFocus` hook
|
|
44
|
-
- [x] Controlled/uncontrolled mode
|
|
45
|
-
- [x] Automatic item filtering
|
|
46
|
-
- [x] Reactive `emptyPlaceholder`
|
|
47
|
-
|
|
48
|
-
### Pending (Scalability)
|
|
49
|
-
|
|
50
|
-
- [ ] **Customizable `filterFn` prop**
|
|
51
|
-
- Filtering is currently case-insensitive includes
|
|
52
|
-
- Allow: fuzzy search, startsWith, exact match, async search
|
|
53
|
-
|
|
54
|
-
- [ ] **`allowCreate` prop**
|
|
55
|
-
- Allow creating new items when there is no match
|
|
56
|
-
- Callback `onCreate?: (value: string) => void`
|
|
57
|
-
|
|
58
|
-
- [x] **Multiple selection UI**
|
|
59
|
-
- Chips/tags for selected items: `ComboBox.Tags`, `ComboBox.Tag`, `ComboBox.TagRemove`
|
|
60
|
-
- Clear-all button (available via `clearSelection()` in context)
|
|
61
|
-
- Selected-count indicator (available via `selectedValue.size`)
|
|
62
|
-
- Keyboard tag navigation (ArrowLeft/Right, Delete/Backspace)
|
|
63
|
-
- `ComboBox.ItemIndicator` to show checks for selected items
|
|
64
|
-
|
|
65
|
-
- [ ] **Form integration**
|
|
66
|
-
- `name` prop for native `<form>`
|
|
67
|
-
- Hidden input with serialized value
|
|
68
|
-
- Validation with `required`, `aria-invalid`
|
|
69
|
-
|
|
70
|
-
- [ ] **Async data support**
|
|
71
|
-
- Props: `isLoading`, `loadingPlaceholder`
|
|
72
|
-
- Callback: `onLoadMore` for infinite scroll
|
|
73
|
-
- Built-in debounce for async search
|
|
74
|
-
|
|
75
|
-
- [ ] **Virtualization**
|
|
76
|
-
- For large lists (>100 items)
|
|
77
|
-
- Integrate with `@tanstack/virtual` or similar
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## Performance
|
|
82
|
-
|
|
83
|
-
### Completed (Performance)
|
|
84
|
-
|
|
85
|
-
- [x] DOM query cache with invalidation (`cachedItemOrder`)
|
|
86
|
-
- [x] `untrack()` to avoid infinite effect loops
|
|
87
|
-
- [x] Subscription pattern for reactive `itemCount`
|
|
88
|
-
- [x] Scoped queries via `containerRef`
|
|
89
|
-
|
|
90
|
-
### Pending (Performance)
|
|
91
|
-
|
|
92
|
-
- [ ] **`isVisible` memoization in ListBoxItem**
|
|
93
|
-
- It is currently recomputed on each render
|
|
94
|
-
- Consider more granular memoization with `$derived`
|
|
95
|
-
|
|
96
|
-
- [ ] **Batch registration**
|
|
97
|
-
- `registerItem` runs once per individual item
|
|
98
|
-
- For large lists, consider batched notifications
|
|
99
|
-
|
|
100
|
-
- [ ] **Lazy `itemLabels`**
|
|
101
|
-
- The `itemLabels` map grows with each item
|
|
102
|
-
- Cleanup on unmount is implemented, but consider `WeakMap`
|
|
103
|
-
|
|
104
|
-
- [ ] **Effect cleanup optimizations**
|
|
105
|
-
- Review effects that could be consolidated
|
|
106
|
-
- `combobox-listboxitem.svelte` has 2 effects that might become 1
|
|
107
|
-
|
|
108
|
-
---
|
|
109
|
-
|
|
110
|
-
## Svelte 5 Runes Best Practices
|
|
111
|
-
|
|
112
|
-
### Completed (Runes)
|
|
113
|
-
|
|
114
|
-
- [x] `$state` for reactive state
|
|
115
|
-
- [x] `$derived` for computed values
|
|
116
|
-
- [x] `$effect` with cleanup functions
|
|
117
|
-
- [x] `$bindable` for two-way binding
|
|
118
|
-
- [x] `$props()` for destructuring
|
|
119
|
-
- [x] `untrack()` to avoid unnecessary re-runs
|
|
120
|
-
- [x] `$derived(expression)` instead of `$derived(() => ...)` - simplified in `combobox-listboxitem.svelte`
|
|
121
|
-
- [x] Consolidated effects - using 1 `$effect` + `onDestroy` instead of 2 effects
|
|
122
|
-
|
|
123
|
-
### Reviewed - No Changes Required
|
|
124
|
-
|
|
125
|
-
- [x] **`$effect.pre`**: Reviewed - no race conditions requiring it
|
|
126
|
-
- [x] **Context typing**: Single shared type is appropriate - tree-shaking does not apply to context objects
|
|
127
|
-
|
|
128
|
-
---
|
|
129
|
-
|
|
130
|
-
## Testing
|
|
131
|
-
|
|
132
|
-
### Completed (Testing)
|
|
133
|
-
|
|
134
|
-
- [x] 291 passing unit tests
|
|
135
|
-
- [x] Keyboard navigation tests
|
|
136
|
-
- [x] Selection tests
|
|
137
|
-
- [x] Filtering tests
|
|
138
|
-
- [x] Empty placeholder tests
|
|
139
|
-
- [x] ARIA accessibility tests (6 tests)
|
|
140
|
-
- [x] Edge cases: rapid typing, whitespace, backspace
|
|
141
|
-
- [x] Disabled/ReadOnly state tests
|
|
142
|
-
- [x] Trigger modes (focus, input, manual)
|
|
143
|
-
- [x] Selection behavior (Enter, click, Escape restoration)
|
|
144
|
-
- [x] Multi-select tests (12 tests)
|
|
145
|
-
- [x] Tags component tests (4 tests)
|
|
146
|
-
- [x] Tag component tests (13 tests) - includes keyboard navigation
|
|
147
|
-
- [x] TagRemove component tests (6 tests)
|
|
148
|
-
- [x] ItemIndicator component tests (5 tests)
|
|
149
|
-
|
|
150
|
-
### Pending (Testing)
|
|
151
|
-
|
|
152
|
-
- [ ] **Tests with many items (100+)** - performance tests
|
|
153
|
-
- [ ] **Visual regression tests** - state screenshots
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
## Documentation
|
|
158
|
-
|
|
159
|
-
- [ ] **Complete JSDoc**
|
|
160
|
-
- Document all public props
|
|
161
|
-
- Add usage examples in comments
|
|
162
|
-
|
|
163
|
-
- [ ] **Storybook/Demo page**
|
|
164
|
-
- Interactive examples for all use cases
|
|
165
|
-
- States: loading, error, disabled, readonly
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## Prioritized Next Steps
|
|
170
|
-
|
|
171
|
-
1. **Live regions** (accessibility - high impact)
|
|
172
|
-
2. **Form integration** (usability - common cases)
|
|
173
|
-
3. **Customizable `filterFn`** (scalability)
|
|
174
|
-
4. **Consolidate effects** (performance/best practices)
|
|
175
|
-
5. **Async data support** (scalability)
|
|
1
|
+
# Combobox TODO
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Track Combobox work with a single mandatory TODO format.
|
|
6
|
+
|
|
7
|
+
## Backlog
|
|
8
|
+
|
|
9
|
+
- [x] [M][P0][Area: Architecture][Owner: Unassigned][Target: Done] Build base component parts (`root`, `input`, `list`, `item`).
|
|
10
|
+
- [x] [M][P0][Area: State][Owner: Unassigned][Target: Done] Implement open/close state management on root.
|
|
11
|
+
- [x] [M][P0][Area: Filtering][Owner: Unassigned][Target: Done] Support filtering items by input value.
|
|
12
|
+
- [x] [M][P0][Area: Selection][Owner: Unassigned][Target: Done] Implement item selection and emit `onSelectionChange`.
|
|
13
|
+
- [x] [M][P0][Area: Accessibility][Owner: Unassigned][Target: Done] Add keyboard navigation and ARIA combobox/listbox semantics.
|
|
14
|
+
- [x] [M][P0][Area: Interaction][Owner: Unassigned][Target: Done] Handle outside click and blur to close list.
|
|
15
|
+
- [x] [M][P0][Area: States][Owner: Unassigned][Target: Done] Support disabled state for root and items.
|
|
16
|
+
- [x] [M][P0][Area: Testing][Owner: Unassigned][Target: Done] Add baseline browser tests for open/filter/select behavior.
|
|
17
|
+
- [x] [S][P1][Area: API][Owner: Unassigned][Target: Done] Support controlled/uncontrolled selected value.
|
|
18
|
+
- [x] [M][P0][Area: Selection][Owner: Unassigned][Target: Done] Implement `supportsMultiple` mode with chips and remove action.
|
|
19
|
+
- [x] [M][P0][Area: Data Model][Owner: Unassigned][Target: Done] Support rich object values and hidden input synchronization.
|
|
20
|
+
- [x] [M][P0][Area: UX][Owner: Unassigned][Target: Done] Support loading, empty, and custom-value flows.
|
|
21
|
+
- [x] [M][P0][Area: Focus][Owner: Unassigned][Target: Done] Align focus-visible behavior with shared input modality primitive.
|
|
22
|
+
- [ ] [S][P1][Area: Data Source][Owner: Unassigned][Target: TBD] Add async item provider API (debounced remote filtering).
|
|
23
|
+
- [ ] [S][P1][Area: Data Model][Owner: Unassigned][Target: TBD] Add grouped items with section headers.
|
|
24
|
+
- [ ] [S][P1][Area: Performance][Owner: Unassigned][Target: TBD] Add optional virtualization for large datasets.
|
|
25
|
+
- [ ] [S][P1][Area: Interaction][Owner: Unassigned][Target: TBD] Add option to commit free-text value on blur.
|
|
26
|
+
- [ ] [S][P1][Area: API][Owner: Unassigned][Target: TBD] Add imperative focus/open API for advanced integrations.
|
|
27
|
+
- [ ] [C][P2][Area: UX][Owner: Unassigned][Target: TBD] Add built-in highlighting helper for matched text.
|
|
28
|
+
- [ ] [C][P2][Area: Performance][Owner: Unassigned][Target: TBD] Add benchmark tests for filtering and keyboard navigation.
|
|
@@ -5,11 +5,16 @@
|
|
|
5
5
|
### ComboBox.Button
|
|
6
6
|
|
|
7
7
|
Name: `ComboBox.Button`
|
|
8
|
-
Description:
|
|
8
|
+
Description: Compatibility alias for `ComboBox.Trigger`.
|
|
9
9
|
|
|
10
10
|
| Prop | Type | Default | Description |
|
|
11
11
|
| -------------- | ---------------------- | ----------- | --------------------------------------------------------------- |
|
|
12
|
-
| `class` | `string` | `undefined` | CSS class names for the
|
|
12
|
+
| `class` | `string` | `undefined` | CSS class names for the trigger element. |
|
|
13
13
|
| `children` | `Snippet` | `undefined` | Custom trigger content. If omitted, a chevron icon is rendered. |
|
|
14
|
-
| `tabindex` | `number` | `-1` | Tab index applied to the button.
|
|
14
|
+
| `tabindex` | `number` | `-1` | Tab index applied to the trigger button. |
|
|
15
15
|
| `...restProps` | `HTMLButtonAttributes` | `-` | Additional native button attributes. |
|
|
16
|
+
|
|
17
|
+
## Notes
|
|
18
|
+
|
|
19
|
+
- Prefer `ComboBox.Trigger` in new code.
|
|
20
|
+
- `ComboBox.Button` forwards all props and behavior to `ComboBox.Trigger`.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import ComboBox from '../index.js';
|
|
3
|
+
|
|
4
|
+
type Props = {
|
|
5
|
+
isPending?: boolean;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
let { isPending = false }: Props = $props();
|
|
9
|
+
|
|
10
|
+
const countries = [
|
|
11
|
+
{ id: 'ar', name: 'Argentina' },
|
|
12
|
+
{ id: 'br', name: 'Brazil' }
|
|
13
|
+
];
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<ComboBox.Root {isPending}>
|
|
17
|
+
<ComboBox.Input placeholder="Search countries..." />
|
|
18
|
+
<ComboBox.Button />
|
|
19
|
+
|
|
20
|
+
<ComboBox.Popover>
|
|
21
|
+
<ComboBox.List emptyPlaceholder="No countries found">
|
|
22
|
+
{#each countries as country (country.id)}
|
|
23
|
+
<ComboBox.Item id={country.id} textValue={country.name}>{country.name}</ComboBox.Item>
|
|
24
|
+
{/each}
|
|
25
|
+
</ComboBox.List>
|
|
26
|
+
</ComboBox.Popover>
|
|
27
|
+
</ComboBox.Root>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
4
|
+
import { ButtonRoot } from '../../button/index.js';
|
|
4
5
|
import { useComboBoxContext } from '../root/context';
|
|
5
6
|
|
|
6
7
|
type ComboBoxButtonProps = HTMLButtonAttributes & {
|
|
@@ -11,27 +12,25 @@
|
|
|
11
12
|
let { class: className, children, tabindex = -1, ...restProps }: ComboBoxButtonProps = $props();
|
|
12
13
|
|
|
13
14
|
const ctx = useComboBoxContext();
|
|
15
|
+
const isButtonDisabled = $derived(ctx.isDisabled || ctx.isReadOnly || ctx.isPending);
|
|
14
16
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
// 2. Then onclick fires -> popover opens again
|
|
19
|
-
function handleMouseDown(e: MouseEvent) {
|
|
20
|
-
e.preventDefault();
|
|
21
|
-
if (!ctx.isDisabled && !ctx.isReadOnly) {
|
|
17
|
+
function handleMouseDown(event: MouseEvent) {
|
|
18
|
+
event.preventDefault();
|
|
19
|
+
if (!isButtonDisabled) {
|
|
22
20
|
ctx.toggle();
|
|
23
21
|
}
|
|
24
22
|
}
|
|
25
23
|
</script>
|
|
26
24
|
|
|
27
|
-
<
|
|
25
|
+
<ButtonRoot
|
|
28
26
|
type="button"
|
|
29
27
|
{tabindex}
|
|
30
28
|
aria-label={ctx.isOpen ? 'Close menu' : 'Open menu'}
|
|
31
29
|
aria-expanded={ctx.isOpen}
|
|
32
30
|
aria-controls={`combobox-listbox-${ctx.instanceId}`}
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
isDisabled={ctx.isDisabled || ctx.isReadOnly}
|
|
32
|
+
isPending={ctx.isPending}
|
|
33
|
+
pressed={ctx.isOpen}
|
|
35
34
|
onmousedown={handleMouseDown}
|
|
36
35
|
class={className}
|
|
37
36
|
{...restProps}
|
|
@@ -54,4 +53,4 @@
|
|
|
54
53
|
<path d="m6 9 6 6 6-6" />
|
|
55
54
|
</svg>
|
|
56
55
|
{/if}
|
|
57
|
-
</
|
|
56
|
+
</ButtonRoot>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# ComboBox Clear
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### ComboBox.Clear
|
|
6
|
+
|
|
7
|
+
Name: `ComboBox.Clear`
|
|
8
|
+
Description: Optional clear button that resets the input value and clears the current selection without stealing focus from the input.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| -------------- | ---------------------- | ----------- | ---------------------------------------------------------- |
|
|
12
|
+
| `class` | `string` | `undefined` | CSS class names for the clear element. |
|
|
13
|
+
| `children` | `Snippet` | `undefined` | Custom clear content. If omitted, an “x” icon is rendered. |
|
|
14
|
+
| `tabindex` | `number` | `-1` | Tab index applied to the clear button. |
|
|
15
|
+
| `...restProps` | `HTMLButtonAttributes` | `-` | Additional native button attributes. |
|
|
16
|
+
|
|
17
|
+
## Notes
|
|
18
|
+
|
|
19
|
+
- `ComboBox.Clear` clears both the visible input text and the selected value(s).
|
|
20
|
+
- The clear button is disabled when there is nothing to clear, or when the combobox is disabled, read-only, or pending.
|
|
21
|
+
- Clicking the clear button keeps focus on the combobox input.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import ComboBox from '../index.js';
|
|
3
|
+
|
|
4
|
+
let value = $state<string | number | undefined>('ar');
|
|
5
|
+
let inputValue = $state('Argentina');
|
|
6
|
+
let isPending = $state(false);
|
|
7
|
+
|
|
8
|
+
const countries = [
|
|
9
|
+
{ id: 'ar', name: 'Argentina' },
|
|
10
|
+
{ id: 'br', name: 'Brazil' },
|
|
11
|
+
{ id: 'ca', name: 'Canada' }
|
|
12
|
+
];
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<ComboBox.Root bind:value bind:inputValue {isPending}>
|
|
16
|
+
<div class="flex gap-1">
|
|
17
|
+
<ComboBox.Input placeholder="Search countries..." />
|
|
18
|
+
<ComboBox.Clear />
|
|
19
|
+
<ComboBox.Trigger />
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
<ComboBox.Popover>
|
|
23
|
+
<ComboBox.List emptyPlaceholder="No countries found">
|
|
24
|
+
{#each countries as country (country.id)}
|
|
25
|
+
<ComboBox.Item id={country.id} textValue={country.name}>{country.name}</ComboBox.Item>
|
|
26
|
+
{/each}
|
|
27
|
+
</ComboBox.List>
|
|
28
|
+
</ComboBox.Popover>
|
|
29
|
+
</ComboBox.Root>
|
|
30
|
+
|
|
31
|
+
<button type="button" data-set-pending onclick={() => (isPending = true)}>Set pending</button>
|
|
32
|
+
<button type="button" data-clear-pending onclick={() => (isPending = false)}>Clear pending</button>
|
|
33
|
+
<output data-selected-value>{value === undefined ? 'undefined' : String(value)}</output>
|
|
34
|
+
<output data-input-value>{inputValue}</output>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
4
|
+
import { ButtonRoot } from '../../button/index.js';
|
|
5
|
+
import { useComboBoxContext } from '../root/context';
|
|
6
|
+
|
|
7
|
+
type ComboBoxClearProps = HTMLButtonAttributes & {
|
|
8
|
+
class?: string;
|
|
9
|
+
children?: Snippet;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
let { class: className, children, tabindex = -1, ...restProps }: ComboBoxClearProps = $props();
|
|
13
|
+
|
|
14
|
+
const ctx = useComboBoxContext();
|
|
15
|
+
const hasContent = $derived(ctx.displayValue.trim().length > 0 || ctx.selectedValue.size > 0);
|
|
16
|
+
const isClearDisabled = $derived(
|
|
17
|
+
ctx.isDisabled || ctx.isReadOnly || ctx.isPending || !hasContent
|
|
18
|
+
);
|
|
19
|
+
const ariaLabel = $derived(ctx.selectedValue.size > 0 ? 'Clear selection' : 'Clear input');
|
|
20
|
+
|
|
21
|
+
function handleMouseDown(event: MouseEvent) {
|
|
22
|
+
event.preventDefault();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function handleClick() {
|
|
26
|
+
if (isClearDisabled) return;
|
|
27
|
+
ctx.clearSelection();
|
|
28
|
+
ctx.inputRef?.focus();
|
|
29
|
+
}
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
<ButtonRoot
|
|
33
|
+
type="button"
|
|
34
|
+
{tabindex}
|
|
35
|
+
aria-label={ariaLabel}
|
|
36
|
+
isDisabled={ctx.isDisabled || ctx.isReadOnly || !hasContent}
|
|
37
|
+
isPending={ctx.isPending}
|
|
38
|
+
onmousedown={handleMouseDown}
|
|
39
|
+
onclick={handleClick}
|
|
40
|
+
class={className}
|
|
41
|
+
{...restProps}
|
|
42
|
+
>
|
|
43
|
+
{#if children}
|
|
44
|
+
{@render children()}
|
|
45
|
+
{:else}
|
|
46
|
+
<svg
|
|
47
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
48
|
+
width="16"
|
|
49
|
+
height="16"
|
|
50
|
+
viewBox="0 0 24 24"
|
|
51
|
+
fill="none"
|
|
52
|
+
stroke="currentColor"
|
|
53
|
+
stroke-width="2"
|
|
54
|
+
stroke-linecap="round"
|
|
55
|
+
stroke-linejoin="round"
|
|
56
|
+
>
|
|
57
|
+
<path d="M18 6 6 18" />
|
|
58
|
+
<path d="m6 6 12 12" />
|
|
59
|
+
</svg>
|
|
60
|
+
{/if}
|
|
61
|
+
</ButtonRoot>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
3
|
+
type ComboBoxClearProps = HTMLButtonAttributes & {
|
|
4
|
+
class?: string;
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
};
|
|
7
|
+
declare const ComboboxClear: import("svelte").Component<ComboBoxClearProps, {}, "">;
|
|
8
|
+
type ComboboxClear = ReturnType<typeof ComboboxClear>;
|
|
9
|
+
export default ComboboxClear;
|
package/dist/combobox/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
export * as ComboBox from './index.parts.
|
|
1
|
+
export * as ComboBox from './index.parts.js';
|
|
2
2
|
export { default as ComboBoxRoot } from './root/combobox.svelte';
|
|
3
3
|
export { default as ComboBoxInput } from './input/combobox-input.svelte';
|
|
4
|
+
export { default as ComboBoxTrigger } from './trigger/combobox-trigger.svelte';
|
|
4
5
|
export { default as ComboBoxButton } from './button/combobox-button.svelte';
|
|
6
|
+
export { default as ComboBoxClear } from './clear/combobox-clear.svelte';
|
|
5
7
|
export { default as ComboBoxPopover } from './popover/combobox-popover.svelte';
|
|
6
8
|
export { default as ComboBoxList } from './list/combobox-listbox.svelte';
|
|
7
9
|
export { default as ComboBoxItem } from './item/combobox-listboxitem.svelte';
|
|
@@ -9,6 +11,6 @@ export { default as ComboBoxItemIndicator } from './item-indicator/combobox-item
|
|
|
9
11
|
export { default as ComboBoxTags } from './tags/combobox-tags.svelte';
|
|
10
12
|
export { default as ComboBoxTag } from './tag/combobox-tag.svelte';
|
|
11
13
|
export { default as ComboBoxTagRemove } from './tag-remove/combobox-tag-remove.svelte';
|
|
12
|
-
export { getComboBoxContext, setComboBoxContext, useComboBoxContext, type ComboBoxContext } from './root/context.
|
|
13
|
-
import * as ComboBoxParts from './index.parts.
|
|
14
|
+
export { getComboBoxContext, setComboBoxContext, useComboBoxContext, type ComboBoxContext } from './root/context.js';
|
|
15
|
+
import * as ComboBoxParts from './index.parts.js';
|
|
14
16
|
export default ComboBoxParts;
|
package/dist/combobox/index.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
// Namespace export for component composition: <ComboBox.Root>, <ComboBox.Input>, etc.
|
|
2
|
-
export * as ComboBox from './index.parts.
|
|
2
|
+
export * as ComboBox from './index.parts.js';
|
|
3
3
|
// Direct named exports for individual imports
|
|
4
4
|
export { default as ComboBoxRoot } from './root/combobox.svelte';
|
|
5
5
|
export { default as ComboBoxInput } from './input/combobox-input.svelte';
|
|
6
|
+
export { default as ComboBoxTrigger } from './trigger/combobox-trigger.svelte';
|
|
6
7
|
export { default as ComboBoxButton } from './button/combobox-button.svelte';
|
|
8
|
+
export { default as ComboBoxClear } from './clear/combobox-clear.svelte';
|
|
7
9
|
export { default as ComboBoxPopover } from './popover/combobox-popover.svelte';
|
|
8
10
|
export { default as ComboBoxList } from './list/combobox-listbox.svelte';
|
|
9
11
|
export { default as ComboBoxItem } from './item/combobox-listboxitem.svelte';
|
|
@@ -12,7 +14,7 @@ export { default as ComboBoxTags } from './tags/combobox-tags.svelte';
|
|
|
12
14
|
export { default as ComboBoxTag } from './tag/combobox-tag.svelte';
|
|
13
15
|
export { default as ComboBoxTagRemove } from './tag-remove/combobox-tag-remove.svelte';
|
|
14
16
|
// Context and types
|
|
15
|
-
export { getComboBoxContext, setComboBoxContext, useComboBoxContext } from './root/context.
|
|
17
|
+
export { getComboBoxContext, setComboBoxContext, useComboBoxContext } from './root/context.js';
|
|
16
18
|
// Default export as namespace object
|
|
17
|
-
import * as ComboBoxParts from './index.parts.
|
|
19
|
+
import * as ComboBoxParts from './index.parts.js';
|
|
18
20
|
export default ComboBoxParts;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { default as Root } from './root/combobox.svelte';
|
|
2
2
|
export { default as Input } from './input/combobox-input.svelte';
|
|
3
|
+
export { default as Trigger } from './trigger/combobox-trigger.svelte';
|
|
3
4
|
export { default as Button } from './button/combobox-button.svelte';
|
|
5
|
+
export { default as Clear } from './clear/combobox-clear.svelte';
|
|
4
6
|
export { default as Popover } from './popover/combobox-popover.svelte';
|
|
5
7
|
export { default as List } from './list/combobox-listbox.svelte';
|
|
6
8
|
export { default as Item } from './item/combobox-listboxitem.svelte';
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// Short alias exports for namespace usage: ComboBox.Root, ComboBox.Input, etc.
|
|
2
2
|
export { default as Root } from './root/combobox.svelte';
|
|
3
3
|
export { default as Input } from './input/combobox-input.svelte';
|
|
4
|
+
export { default as Trigger } from './trigger/combobox-trigger.svelte';
|
|
4
5
|
export { default as Button } from './button/combobox-button.svelte';
|
|
6
|
+
export { default as Clear } from './clear/combobox-clear.svelte';
|
|
5
7
|
export { default as Popover } from './popover/combobox-popover.svelte';
|
|
6
8
|
export { default as List } from './list/combobox-listbox.svelte';
|
|
7
9
|
export { default as Item } from './item/combobox-listboxitem.svelte';
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { HTMLInputAttributes } from 'svelte/elements';
|
|
3
|
+
import { Input } from '../../input';
|
|
3
4
|
import { useComboBoxContext } from '../root/context';
|
|
5
|
+
import {
|
|
6
|
+
shouldShowFocusVisible,
|
|
7
|
+
trackInteractionModality
|
|
8
|
+
} from '../../primitives/input-modality';
|
|
4
9
|
import { cn } from '../../utils/cn';
|
|
5
10
|
|
|
6
11
|
type ComboBoxInputProps = HTMLInputAttributes & {
|
|
@@ -13,11 +18,26 @@
|
|
|
13
18
|
class?: string;
|
|
14
19
|
};
|
|
15
20
|
|
|
21
|
+
function composeEventHandlers<TEvent extends Event>(
|
|
22
|
+
internalHandler: ((event: TEvent) => void) | undefined,
|
|
23
|
+
externalHandler: ((event: TEvent) => void) | undefined
|
|
24
|
+
): (event: TEvent) => void {
|
|
25
|
+
return (event: TEvent) => {
|
|
26
|
+
internalHandler?.(event);
|
|
27
|
+
externalHandler?.(event);
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
16
31
|
let {
|
|
17
32
|
'aria-label': ariaLabel,
|
|
18
33
|
'aria-labelledby': ariaLabelledby,
|
|
19
34
|
'aria-describedby': ariaDescribedby,
|
|
20
35
|
class: className,
|
|
36
|
+
oninput: onInputExternal,
|
|
37
|
+
onfocus: onFocusExternal,
|
|
38
|
+
onmousedown: onMouseDownExternal,
|
|
39
|
+
onblur: onBlurExternal,
|
|
40
|
+
onkeydown: onKeyDownExternal,
|
|
21
41
|
...restProps
|
|
22
42
|
}: ComboBoxInputProps = $props();
|
|
23
43
|
|
|
@@ -42,6 +62,8 @@
|
|
|
42
62
|
}
|
|
43
63
|
|
|
44
64
|
function handleFocus() {
|
|
65
|
+
ctx.setFocusVisible(shouldShowFocusVisible(inputRef));
|
|
66
|
+
|
|
45
67
|
// Open on focus if trigger is 'focus'
|
|
46
68
|
// Use a small delay to avoid opening immediately on programmatic focus
|
|
47
69
|
// (e.g., from a focus trap). This gives time for refs to be set up.
|
|
@@ -54,7 +76,9 @@
|
|
|
54
76
|
}
|
|
55
77
|
}
|
|
56
78
|
|
|
57
|
-
function handleMouseDown() {
|
|
79
|
+
function handleMouseDown(event: MouseEvent) {
|
|
80
|
+
trackInteractionModality(event, inputRef);
|
|
81
|
+
ctx.setFocusVisible(false);
|
|
58
82
|
ctx.setFocusedTagId(null);
|
|
59
83
|
// Open on press if trigger is 'press'
|
|
60
84
|
if (ctx.trigger === 'press' && !ctx.isOpen && !ctx.isDisabled && !ctx.isReadOnly) {
|
|
@@ -62,14 +86,21 @@
|
|
|
62
86
|
}
|
|
63
87
|
}
|
|
64
88
|
|
|
65
|
-
function
|
|
89
|
+
function handleKeyDown(event: KeyboardEvent) {
|
|
90
|
+
trackInteractionModality(event, inputRef);
|
|
91
|
+
ctx.setFocusVisible(shouldShowFocusVisible(inputRef));
|
|
92
|
+
ctx.handleKeydown(event);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function handleBlur(event: FocusEvent) {
|
|
96
|
+
ctx.setFocusVisible(false);
|
|
66
97
|
// Restore selection label or deselect if empty
|
|
67
|
-
ctx.handleInputBlur();
|
|
98
|
+
ctx.handleInputBlur(event);
|
|
68
99
|
}
|
|
69
100
|
</script>
|
|
70
101
|
|
|
71
|
-
<
|
|
72
|
-
bind:
|
|
102
|
+
<Input
|
|
103
|
+
bind:element={inputRef}
|
|
73
104
|
type="text"
|
|
74
105
|
role="combobox"
|
|
75
106
|
aria-autocomplete="list"
|
|
@@ -82,14 +113,15 @@
|
|
|
82
113
|
aria-label={ariaLabel}
|
|
83
114
|
aria-labelledby={ariaLabelledby}
|
|
84
115
|
aria-describedby={ariaDescribedby}
|
|
116
|
+
autocomplete="off"
|
|
85
117
|
value={ctx.displayValue}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
oninput={handleInput}
|
|
89
|
-
onfocus={handleFocus}
|
|
90
|
-
onmousedown={handleMouseDown}
|
|
91
|
-
onblur={handleBlur}
|
|
92
|
-
onkeydown={
|
|
118
|
+
isDisabled={ctx.isDisabled}
|
|
119
|
+
isReadOnly={ctx.isReadOnly}
|
|
120
|
+
oninput={composeEventHandlers(handleInput, onInputExternal ?? undefined)}
|
|
121
|
+
onfocus={composeEventHandlers(handleFocus, onFocusExternal ?? undefined)}
|
|
122
|
+
onmousedown={composeEventHandlers(handleMouseDown, onMouseDownExternal ?? undefined)}
|
|
123
|
+
onblur={composeEventHandlers(handleBlur, onBlurExternal ?? undefined)}
|
|
124
|
+
onkeydown={composeEventHandlers(handleKeyDown, onKeyDownExternal ?? undefined)}
|
|
93
125
|
class={cn(
|
|
94
126
|
'bg-depth-2 sunken placeholder:text-muted-foreground hover:bg-depth-1 focus:ring-border h-8 w-full rounded-xs border px-2 text-sm shadow-xs transition-all ease-out outline-none focus:ring focus:ring-offset-1 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',
|
|
95
127
|
className
|