@human-kit/svelte-components 1.0.0-alpha.1 → 1.0.0-alpha.11
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 +66 -0
- package/dist/calendar/TODO.md +23 -0
- package/dist/calendar/body-cell/README.md +15 -0
- package/dist/calendar/body-cell/calendar-body-cell.svelte +230 -0
- package/dist/calendar/body-cell/calendar-body-cell.svelte.d.ts +9 -0
- package/dist/calendar/grid/README.md +13 -0
- package/dist/calendar/grid/calendar-grid-month-scope.svelte +16 -0
- package/dist/calendar/grid/calendar-grid-month-scope.svelte.d.ts +8 -0
- package/dist/calendar/grid/calendar-grid.svelte +45 -0
- package/dist/calendar/grid/calendar-grid.svelte.d.ts +8 -0
- package/dist/calendar/grid/month-scope.d.ts +2 -0
- package/dist/calendar/grid/month-scope.js +8 -0
- package/dist/calendar/grid-body/README.md +13 -0
- package/dist/calendar/grid-body/calendar-grid-body-custom-test.svelte +13 -0
- package/dist/calendar/grid-body/calendar-grid-body-custom-test.svelte.d.ts +18 -0
- package/dist/calendar/grid-body/calendar-grid-body.svelte +36 -0
- package/dist/calendar/grid-body/calendar-grid-body.svelte.d.ts +8 -0
- package/dist/calendar/grid-header/README.md +13 -0
- package/dist/calendar/grid-header/calendar-grid-header-custom-test.svelte +13 -0
- package/dist/calendar/grid-header/calendar-grid-header-custom-test.svelte.d.ts +18 -0
- package/dist/calendar/grid-header/calendar-grid-header.svelte +31 -0
- package/dist/calendar/grid-header/calendar-grid-header.svelte.d.ts +8 -0
- package/dist/calendar/header-cell/README.md +14 -0
- package/dist/calendar/header-cell/calendar-header-cell-test.svelte +11 -0
- package/dist/calendar/header-cell/calendar-header-cell-test.svelte.d.ts +18 -0
- package/dist/calendar/header-cell/calendar-header-cell.svelte +16 -0
- package/dist/calendar/header-cell/calendar-header-cell.svelte.d.ts +8 -0
- package/dist/calendar/heading/README.md +13 -0
- package/dist/calendar/heading/calendar-heading.svelte +17 -0
- package/dist/calendar/heading/calendar-heading.svelte.d.ts +5 -0
- package/dist/calendar/index.d.ts +13 -0
- package/dist/calendar/index.js +13 -0
- package/dist/calendar/index.parts.d.ts +9 -0
- package/dist/calendar/index.parts.js +9 -0
- package/dist/calendar/root/README.md +24 -0
- package/dist/calendar/root/calendar-root-bind-value-test.svelte +14 -0
- package/dist/calendar/root/calendar-root-bind-value-test.svelte.d.ts +3 -0
- package/dist/calendar/root/calendar-root-controlled-clear-test.svelte +20 -0
- package/dist/calendar/root/calendar-root-controlled-clear-test.svelte.d.ts +3 -0
- package/dist/calendar/root/calendar-root-test.svelte +71 -0
- package/dist/calendar/root/calendar-root-test.svelte.d.ts +13 -0
- package/dist/calendar/root/calendar-root.svelte +143 -0
- package/dist/calendar/root/calendar-root.svelte.d.ts +31 -0
- package/dist/calendar/root/context.d.ts +66 -0
- package/dist/calendar/root/context.js +727 -0
- package/dist/calendar/root/date-utils.d.ts +17 -0
- package/dist/calendar/root/date-utils.js +94 -0
- package/dist/calendar/trigger-next/README.md +14 -0
- package/dist/calendar/trigger-next/calendar-trigger-next.svelte +43 -0
- package/dist/calendar/trigger-next/calendar-trigger-next.svelte.d.ts +9 -0
- package/dist/calendar/trigger-previous/README.md +14 -0
- package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte +43 -0
- package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte.d.ts +9 -0
- 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 +361 -0
- package/dist/checkbox/root/checkbox-root.svelte.d.ts +23 -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 +46 -0
- package/dist/combobox/TODO.md +28 -175
- package/dist/combobox/button/README.md +20 -0
- 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/README.md +16 -0
- package/dist/combobox/input/combobox-input.svelte +43 -12
- package/dist/combobox/item/README.md +27 -0
- package/dist/combobox/item/combobox-item-implicit-text-test.svelte +1 -1
- package/dist/combobox/item/combobox-listboxitem.svelte +3 -9
- package/dist/combobox/item-indicator/README.md +15 -0
- package/dist/combobox/item-indicator/combobox-item-indicator.svelte +4 -15
- package/dist/combobox/list/README.md +27 -0
- package/dist/combobox/list/combobox-listbox.svelte.d.ts +1 -1
- package/dist/combobox/popover/README.md +27 -0
- 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 +45 -0
- package/dist/combobox/root/combobox-multiselect-test.svelte +1 -1
- package/dist/combobox/root/combobox-numeric-string-id-test.svelte +1 -1
- package/dist/combobox/root/combobox-test.svelte +16 -3
- package/dist/combobox/root/combobox-test.svelte.d.ts +1 -0
- package/dist/combobox/root/combobox.svelte +100 -4
- package/dist/combobox/root/combobox.svelte.d.ts +1 -0
- package/dist/combobox/root/context.d.ts +19 -1
- package/dist/combobox/tag/README.md +37 -0
- package/dist/combobox/tag-remove/README.md +14 -0
- package/dist/combobox/tag-remove/combobox-tag-remove.svelte +3 -2
- package/dist/combobox/tags/README.md +23 -0
- 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/README.md +35 -0
- package/dist/dialog/content/README.md +16 -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/overlay/README.md +13 -0
- package/dist/dialog/portal/README.md +12 -0
- package/dist/dialog/root/README.md +53 -0
- package/dist/dialog/root/context.d.ts +2 -1
- package/dist/dialog/root/dialog-root.svelte +9 -2
- package/dist/dialog/trigger/README.md +12 -0
- package/dist/dialog/trigger/dialog-trigger-multi-button-test.svelte +19 -0
- package/dist/dialog/trigger/dialog-trigger-multi-button-test.svelte.d.ts +18 -0
- package/dist/dialog/trigger/dialog-trigger.svelte +18 -6
- package/dist/index.d.ts +31 -13
- package/dist/index.js +31 -13
- 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/README.md +26 -0
- package/dist/listbox/index.d.ts +3 -3
- package/dist/listbox/index.js +3 -3
- package/dist/listbox/item/README.md +25 -0
- package/dist/listbox/item/listbox-item.svelte +158 -2
- package/dist/listbox/item/listbox-item.svelte.d.ts +4 -0
- package/dist/listbox/root/README.md +40 -0
- 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 +44 -0
- package/dist/listbox/root/listbox.svelte.d.ts +2 -2
- package/dist/locale-provider/context.d.ts +8 -0
- package/dist/locale-provider/context.js +18 -0
- package/dist/locale-provider/index.d.ts +4 -0
- package/dist/locale-provider/index.js +4 -0
- package/dist/locale-provider/locale-provider-initial-value-test.svelte +15 -0
- package/dist/locale-provider/locale-provider-initial-value-test.svelte.d.ts +7 -0
- package/dist/locale-provider/locale-provider-test.svelte +20 -0
- package/dist/locale-provider/locale-provider-test.svelte.d.ts +6 -0
- package/dist/locale-provider/locale-provider-value-probe.svelte +22 -0
- package/dist/locale-provider/locale-provider-value-probe.svelte.d.ts +6 -0
- package/dist/locale-provider/locale-provider.svelte +23 -0
- package/dist/locale-provider/locale-provider.svelte.d.ts +8 -0
- package/dist/popover/README.md +42 -0
- package/dist/popover/content/README.md +36 -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 +25 -0
- 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/README.md +23 -0
- package/dist/popover/trigger/popover-trigger-button.svelte +14 -10
- package/dist/popover/trigger/popover-trigger-button.svelte.d.ts +2 -3
- package/dist/popover/trigger/popover-trigger-multi-button-test.svelte +16 -0
- package/dist/popover/trigger/popover-trigger-multi-button-test.svelte.d.ts +18 -0
- package/dist/popover/trigger/popover-trigger.svelte +19 -7
- 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/table/IMPLEMENTATION_NOTES.md +8 -0
- package/dist/table/PLAN-HIDDEN-COLUMNS.md +152 -0
- package/dist/table/PLAN.md +924 -0
- package/dist/table/README.md +116 -0
- package/dist/table/SELECTION_CHECKBOX_PLAN.md +234 -0
- package/dist/table/TODO.md +100 -0
- package/dist/table/body/README.md +24 -0
- package/dist/table/body/table-body.svelte +25 -0
- package/dist/table/body/table-body.svelte.d.ts +9 -0
- package/dist/table/cell/README.md +25 -0
- package/dist/table/cell/table-cell.svelte +247 -0
- package/dist/table/cell/table-cell.svelte.d.ts +9 -0
- package/dist/table/checkbox/README.md +38 -0
- package/dist/table/checkbox/table-checkbox-test.svelte +121 -0
- package/dist/table/checkbox/table-checkbox-test.svelte.d.ts +16 -0
- package/dist/table/checkbox/table-checkbox.svelte +274 -0
- package/dist/table/checkbox/table-checkbox.svelte.d.ts +13 -0
- package/dist/table/checkbox-indicator/README.md +29 -0
- package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte +22 -0
- package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte.d.ts +10 -0
- package/dist/table/column/README.md +32 -0
- package/dist/table/column/table-column.svelte +108 -0
- package/dist/table/column/table-column.svelte.d.ts +18 -0
- package/dist/table/column-header-cell/README.md +28 -0
- package/dist/table/column-header-cell/table-column-header-cell.svelte +281 -0
- package/dist/table/column-header-cell/table-column-header-cell.svelte.d.ts +9 -0
- package/dist/table/column-resizer/README.md +32 -0
- package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte +51 -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-selection-column-test.svelte +83 -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 +75 -0
- package/dist/table/column-resizer/table-column-resizer-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer.svelte +616 -0
- package/dist/table/column-resizer/table-column-resizer.svelte.d.ts +11 -0
- package/dist/table/empty-state/README.md +25 -0
- package/dist/table/empty-state/table-empty-state.svelte +38 -0
- package/dist/table/empty-state/table-empty-state.svelte.d.ts +8 -0
- package/dist/table/footer/README.md +24 -0
- package/dist/table/footer/table-footer.svelte +19 -0
- package/dist/table/footer/table-footer.svelte.d.ts +9 -0
- package/dist/table/header/README.md +24 -0
- package/dist/table/header/table-header.svelte +19 -0
- package/dist/table/header/table-header.svelte.d.ts +9 -0
- package/dist/table/index.d.ts +16 -0
- package/dist/table/index.js +16 -0
- package/dist/table/index.parts.d.ts +12 -0
- package/dist/table/index.parts.js +12 -0
- package/dist/table/root/README.md +56 -0
- package/dist/table/root/context.d.ts +198 -0
- package/dist/table/root/context.js +1426 -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 +410 -0
- package/dist/table/root/table-root.svelte.d.ts +29 -0
- package/dist/table/root/table-test.svelte +165 -0
- package/dist/table/root/table-test.svelte.d.ts +25 -0
- package/dist/table/row/README.md +27 -0
- package/dist/table/row/table-row.svelte +321 -0
- package/dist/table/row/table-row.svelte.d.ts +13 -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 +41 -1
|
@@ -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
|
|
|
@@ -67,6 +66,7 @@
|
|
|
67
66
|
|
|
68
67
|
// Virtual focus from ComboBox context
|
|
69
68
|
const isFocused = $derived(ctx.focusedItemId === id);
|
|
69
|
+
const isFocusVisible = $derived(isFocused && ctx.isFocusVisible);
|
|
70
70
|
|
|
71
71
|
// Generate unique ID using instanceId
|
|
72
72
|
const uniqueId = $derived(`combobox-item-${ctx.instanceId}-${id}`);
|
|
@@ -121,16 +121,10 @@
|
|
|
121
121
|
customId={uniqueId}
|
|
122
122
|
disableFocusHandling={true}
|
|
123
123
|
isFocusedOverride={isFocused}
|
|
124
|
+
isFocusVisibleOverride={isFocusVisible}
|
|
124
125
|
onItemSelect={handleSelect}
|
|
125
126
|
onResolvedTextValue={handleResolvedTextValue}
|
|
126
127
|
scrollOnFocus={true}
|
|
127
128
|
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
129
|
/>
|
|
136
130
|
{/if}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# ComboBox Item Indicator
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### ComboBox.ItemIndicator
|
|
6
|
+
|
|
7
|
+
Name: `ComboBox.ItemIndicator`
|
|
8
|
+
Description: Visual selection indicator rendered inside `ComboBox.Item`.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| -------------- | --------------------------------- | ------------ | ---------------------------------------------------- |
|
|
12
|
+
| `children` | `Snippet` | `check icon` | Custom indicator content. |
|
|
13
|
+
| `forceMount` | `boolean` | `false` | Forces rendering even when the item is not selected. |
|
|
14
|
+
| `class` | `string` | `undefined` | CSS class names for the indicator wrapper. |
|
|
15
|
+
| `...restProps` | `HTMLAttributes<HTMLSpanElement>` | `-` | Additional attributes passed to the wrapper span. |
|
|
@@ -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}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# ComboBox List
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### ComboBox.List
|
|
6
|
+
|
|
7
|
+
Name: `ComboBox.List`
|
|
8
|
+
Description: Listbox bridge for combobox options. It delegates selection state and mode to `ComboBox.Root`.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| ----------------- | --------------------------------------------------- | ----------- | ------------------------------------------------------------------------------- |
|
|
12
|
+
| `aria-label` | `string` | `'Options'` | Accessible label for the internal listbox. |
|
|
13
|
+
| `items` | `Iterable<T>` | `ctx.items` | Dynamic data source. If omitted, uses items from root context. |
|
|
14
|
+
| `children` | `Snippet<[T]> \| Snippet` | `undefined` | Dynamic item renderer or static list content. |
|
|
15
|
+
| `...listBoxProps` | `Omit<ComponentProps<ListBoxRoot>, internal props>` | `-` | Additional listbox props such as `class`, `emptyPlaceholder`, or `disabledIds`. |
|
|
16
|
+
|
|
17
|
+
### Internally controlled props
|
|
18
|
+
|
|
19
|
+
Name: Controlled by `ComboBox.Root`
|
|
20
|
+
Description: The following values are set by `ComboBox.List` and should not be overridden directly.
|
|
21
|
+
|
|
22
|
+
| Prop | Type | Default | Description |
|
|
23
|
+
| --------------- | ------------------------ | -------------------------------- | ----------------------------------------------------- |
|
|
24
|
+
| `selectionMode` | `'single' \| 'multiple'` | `ctx.selectionMode` | Selection mode inherited from root. |
|
|
25
|
+
| `value` | `Set<string \| number>` | `ctx.selectedValue` | Current combobox selection state. |
|
|
26
|
+
| `onChange` | `(selection) => void` | `internal handler` | Delegates selected item handling to combobox context. |
|
|
27
|
+
| `id` | `string` | `combobox-listbox-${instanceId}` | Auto-generated listbox id for ARIA wiring. |
|
|
@@ -17,7 +17,7 @@ declare function $$render<T extends object = object>(): {
|
|
|
17
17
|
} & {
|
|
18
18
|
context?: ListBoxContext;
|
|
19
19
|
element?: HTMLElement;
|
|
20
|
-
}, "
|
|
20
|
+
}, "children" | "value" | "id" | "element" | "selectionMode" | "selectionBehavior" | "defaultValue" | "onChange" | "items" | "context"> & {
|
|
21
21
|
/** Optional items for dynamic rendering - overrides items from ComboBox context */
|
|
22
22
|
items?: Iterable<T>;
|
|
23
23
|
/** Content of the listbox. Receives item in dynamic mode. */
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# ComboBox Popover
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### ComboBox.Popover
|
|
6
|
+
|
|
7
|
+
Name: `ComboBox.Popover`
|
|
8
|
+
Description: Floating container for combobox options. Internally composes `Popover.Root` and `Popover.Content` in non-modal mode.
|
|
9
|
+
|
|
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;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# ComboBox Root
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### ComboBox.Root
|
|
6
|
+
|
|
7
|
+
Name: `ComboBox.Root`
|
|
8
|
+
Description: State container for combobox behavior, including open state, input value, selection logic, filtering, and keyboard interaction.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| ------------------- | ------------------------------------------ | -------------------------------- | ----------------------------------------------------------- |
|
|
12
|
+
| `id` | `string` | `$props.id()` | Stable id used to derive internal ARIA ids. |
|
|
13
|
+
| `isDisabled` | `boolean` | `false` | Disables all user interaction. |
|
|
14
|
+
| `isPending` | `boolean` | `false` | Exposes busy async state on the root via `data-pending`. |
|
|
15
|
+
| `isReadOnly` | `boolean` | `false` | Keeps the component interactive but prevents value changes. |
|
|
16
|
+
| `value` | `string \| number \| (string \| number)[]` | `undefined` | Controlled selection value. Supports `bind:value`. |
|
|
17
|
+
| `defaultValue` | `string \| number \| (string \| number)[]` | `undefined` | Initial selection value in uncontrolled mode. |
|
|
18
|
+
| `inputValue` | `string` | `undefined` | Controlled input value. Supports `bind:inputValue`. |
|
|
19
|
+
| `defaultInputValue` | `string` | `''` | Initial input value in uncontrolled mode. |
|
|
20
|
+
| `selectionBehavior` | `'toggle' \| 'replace'` | `'toggle'` | Selection behavior when selecting an option. |
|
|
21
|
+
| `selectionMode` | `'single' \| 'multiple'` | `'single'` | Single-select or multi-select mode. |
|
|
22
|
+
| `closeOnSelect` | `boolean` | `single: true / multiple: false` | Controls whether the popover closes after selection. |
|
|
23
|
+
| `isOpen` | `boolean` | `undefined` | Controlled open state. Supports `bind:isOpen`. |
|
|
24
|
+
| `trigger` | `'focus' \| 'input' \| 'press'` | `'press'` | Opening strategy for the popover. |
|
|
25
|
+
| `onInputChange` | `(value: string) => void` | `undefined` | Called when the input value changes. |
|
|
26
|
+
| `onOpenChange` | `(open: boolean) => void` | `undefined` | Called when open state changes. |
|
|
27
|
+
| `onChange` | `(value) => void` | `undefined` | Called when selection changes. |
|
|
28
|
+
| `items` | `T[]` | `undefined` | Optional item collection for dynamic rendering. |
|
|
29
|
+
| `renderItem` | `Snippet<[T]>` | `undefined` | Optional item renderer for dynamic mode. |
|
|
30
|
+
| `children` | `Snippet` | `undefined` | Composed combobox parts. |
|
|
31
|
+
| `class` | `string` | `''` | CSS class names for the root group element. |
|
|
32
|
+
| `aria-label` | `string` | `undefined` | Accessible label for the combobox group. |
|
|
33
|
+
| `aria-labelledby` | `string` | `undefined` | Id of an external labeling element. |
|
|
34
|
+
|
|
35
|
+
### Context utilities
|
|
36
|
+
|
|
37
|
+
Name: `context.ts` helpers
|
|
38
|
+
Description: Internal and advanced APIs for publishing and consuming combobox state.
|
|
39
|
+
|
|
40
|
+
| Prop | Type | Default | Description |
|
|
41
|
+
| -------------------- | ------------------------------------ | ------- | --------------------------------------------------- |
|
|
42
|
+
| `setComboBoxContext` | `(ctx: ComboBoxContext) => void` | `-` | Registers combobox context in root. |
|
|
43
|
+
| `getComboBoxContext` | `() => ComboBoxContext \| undefined` | `-` | Returns context if available. |
|
|
44
|
+
| `useComboBoxContext` | `() => ComboBoxContext` | `-` | Returns context and throws outside `ComboBox.Root`. |
|
|
45
|
+
| `ComboBoxContext` | `type` | `-` | Full context contract for state and actions. |
|
|
@@ -4,11 +4,20 @@
|
|
|
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';
|
|
9
10
|
};
|
|
10
11
|
|
|
11
|
-
let {
|
|
12
|
+
let {
|
|
13
|
+
id,
|
|
14
|
+
isDisabled = false,
|
|
15
|
+
isPending = false,
|
|
16
|
+
isReadOnly = false,
|
|
17
|
+
trigger = 'press'
|
|
18
|
+
}: Props = $props();
|
|
19
|
+
|
|
20
|
+
let selectedValue = $state<string | number | undefined>();
|
|
12
21
|
|
|
13
22
|
const countries = [
|
|
14
23
|
{ id: 'ar', name: 'Argentina' },
|
|
@@ -24,9 +33,9 @@
|
|
|
24
33
|
];
|
|
25
34
|
</script>
|
|
26
35
|
|
|
27
|
-
<ComboBox.Root {id} {isDisabled} {isReadOnly} {trigger}>
|
|
36
|
+
<ComboBox.Root {id} {isDisabled} {isPending} {isReadOnly} {trigger} bind:value={selectedValue}>
|
|
28
37
|
<ComboBox.Input placeholder="Search countries..." />
|
|
29
|
-
<ComboBox.
|
|
38
|
+
<ComboBox.Trigger />
|
|
30
39
|
|
|
31
40
|
<ComboBox.Popover>
|
|
32
41
|
<ComboBox.List emptyPlaceholder="No countries found">
|
|
@@ -39,5 +48,9 @@
|
|
|
39
48
|
</ComboBox.Popover>
|
|
40
49
|
</ComboBox.Root>
|
|
41
50
|
|
|
51
|
+
<output data-selected-value
|
|
52
|
+
>{selectedValue === undefined ? 'undefined' : String(selectedValue)}</output
|
|
53
|
+
>
|
|
54
|
+
|
|
42
55
|
<!-- Button outside the combobox for testing blur behavior -->
|
|
43
56
|
<button type="button" data-testid="outside-button">Outside</button>
|