@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
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
|
-
- [ ] **Anuncio de selección**
|
|
30
|
-
- Anunciar "Item seleccionado: {label}" cuando se selecciona
|
|
31
|
-
- Usar `aria-live="assertive"` para cambios importantes
|
|
32
|
-
|
|
33
|
-
- [ ] **Soporte para grupos (sections)**
|
|
34
|
-
- Implementar `role="group"` con `aria-labelledby` para secciones
|
|
35
|
-
- Agregar `ComboBox.Section` component
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## 📈 Escalabilidad
|
|
40
|
-
|
|
41
|
-
### Completado ✅
|
|
42
|
-
|
|
43
|
-
- [x] Hook `useVirtualFocus` reutilizable
|
|
44
|
-
- [x] Controlled/uncontrolled mode
|
|
45
|
-
- [x] Filtrado automático en items
|
|
46
|
-
- [x] `emptyPlaceholder` reactivo
|
|
47
|
-
|
|
48
|
-
### Pendiente
|
|
49
|
-
|
|
50
|
-
- [ ] **`filterFn` prop customizable**
|
|
51
|
-
- Actualmente filtrado es case-insensitive includes
|
|
52
|
-
- Permitir: fuzzy search, startsWith, exact match, async search
|
|
53
|
-
|
|
54
|
-
- [ ] **`allowCreate` prop**
|
|
55
|
-
- Permitir crear nuevos items cuando no hay match
|
|
56
|
-
- Callback `onCreate?: (value: string) => void`
|
|
57
|
-
|
|
58
|
-
- [x] **Multiple selection UI**
|
|
59
|
-
- Chips/tags para items seleccionados ✅ `ComboBox.Tags`, `ComboBox.Tag`, `ComboBox.TagRemove`
|
|
60
|
-
- Clear all button (disponible via `clearSelection()` en context)
|
|
61
|
-
- Contador de seleccionados (disponible via `selectedValue.size`)
|
|
62
|
-
- Navegación de tags con teclado (ArrowLeft/Right, Delete/Backspace)
|
|
63
|
-
- `ComboBox.ItemIndicator` para mostrar checks en items seleccionados
|
|
64
|
-
|
|
65
|
-
- [ ] **Form integration**
|
|
66
|
-
- `name` prop para `<form>` nativo
|
|
67
|
-
- Hidden input con valor serializado
|
|
68
|
-
- Validación con `required`, `aria-invalid`
|
|
69
|
-
|
|
70
|
-
- [ ] **Async data support**
|
|
71
|
-
- Props: `isLoading`, `loadingPlaceholder`
|
|
72
|
-
- Callback: `onLoadMore` para infinite scroll
|
|
73
|
-
- Debounce integrado para búsqueda async
|
|
74
|
-
|
|
75
|
-
- [ ] **Virtualization**
|
|
76
|
-
- Para listas grandes (>100 items)
|
|
77
|
-
- Integrar con `@tanstack/virtual` o similar
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## ⚡ Performance
|
|
82
|
-
|
|
83
|
-
### Completado ✅
|
|
84
|
-
|
|
85
|
-
- [x] Cache de DOM queries con invalidación (`cachedItemOrder`)
|
|
86
|
-
- [x] `untrack()` para evitar loops infinitos en effects
|
|
87
|
-
- [x] Subscription pattern para `itemCount` reactivo
|
|
88
|
-
- [x] Scoped queries via `containerRef`
|
|
89
|
-
|
|
90
|
-
### Pendiente
|
|
91
|
-
|
|
92
|
-
- [ ] **Memoización de `isVisible` en ListBoxItem**
|
|
93
|
-
- Actualmente se recalcula en cada render
|
|
94
|
-
- Considerar memoizar con `$derived` más granular
|
|
95
|
-
|
|
96
|
-
- [ ] **Batch registration**
|
|
97
|
-
- `registerItem` se llama por cada item individualmente
|
|
98
|
-
- Para listas grandes, batch notifications
|
|
99
|
-
|
|
100
|
-
- [ ] **Lazy itemLabels**
|
|
101
|
-
- El Map `itemLabels` crece con cada item
|
|
102
|
-
- Limpiar en unmount está implementado, pero considerar WeakMap
|
|
103
|
-
|
|
104
|
-
- [ ] **Effect cleanup optimizations**
|
|
105
|
-
- Revisar effects que podrían consolidarse
|
|
106
|
-
- `combobox-listboxitem.svelte` tiene 2 effects que podrían ser 1
|
|
107
|
-
|
|
108
|
-
---
|
|
109
|
-
|
|
110
|
-
## 🔧 Svelte 5 Runes Best Practices
|
|
111
|
-
|
|
112
|
-
### Completado ✅
|
|
113
|
-
|
|
114
|
-
- [x] `$state` para estado reactivo
|
|
115
|
-
- [x] `$derived` para valores computados
|
|
116
|
-
- [x] `$effect` con cleanup functions
|
|
117
|
-
- [x] `$bindable` para two-way binding
|
|
118
|
-
- [x] `$props()` para destructuring
|
|
119
|
-
- [x] `untrack()` para evitar re-runs innecesarios
|
|
120
|
-
- [x] `$derived(expression)` en vez de `$derived(() => ...)` - Simplificado en `combobox-listboxitem.svelte`
|
|
121
|
-
- [x] Effects consolidados - Usando 1 `$effect` + `onDestroy` en vez de 2 effects
|
|
122
|
-
|
|
123
|
-
### Revisado - No requiere cambios
|
|
124
|
-
|
|
125
|
-
- [x] **`$effect.pre`**: Revisado - no hay race conditions que lo requieran
|
|
126
|
-
- [x] **Context typing**: El type único es apropiado - tree-shaking no aplica a context objects
|
|
127
|
-
|
|
128
|
-
---
|
|
129
|
-
|
|
130
|
-
## 🧪 Testing
|
|
131
|
-
|
|
132
|
-
### Completado ✅
|
|
133
|
-
|
|
134
|
-
- [x] 291 tests unitarios pasando
|
|
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) - incluye navegación por teclado
|
|
147
|
-
- [x] TagRemove component tests (6 tests)
|
|
148
|
-
- [x] ItemIndicator component tests (5 tests)
|
|
149
|
-
|
|
150
|
-
### Pendiente
|
|
151
|
-
|
|
152
|
-
- [ ] **Tests con muchos items (100+)** - performance tests
|
|
153
|
-
- [ ] **Visual regression tests** - screenshots de estados
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
## 📝 Documentación
|
|
158
|
-
|
|
159
|
-
- [ ] **JSDoc completo**
|
|
160
|
-
- Documentar todas las props públicas
|
|
161
|
-
- Ejemplos de uso en comments
|
|
162
|
-
|
|
163
|
-
- [ ] **Storybook/Demo page**
|
|
164
|
-
- Ejemplos interactivos de todos los casos de uso
|
|
165
|
-
- Estados: loading, error, disabled, readonly
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## 🎯 Próximos Pasos Priorizados
|
|
170
|
-
|
|
171
|
-
1. **Live regions** (accessibility - alto impacto)
|
|
172
|
-
2. **Form integration** (usabilidad - casos comunes)
|
|
173
|
-
3. **`filterFn` customizable** (escalabilidad)
|
|
174
|
-
4. **Consolidar effects** (performance/best practices)
|
|
175
|
-
5. **Async data support** (escalabilidad)
|
|
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.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# ComboBox Button
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### ComboBox.Button
|
|
6
|
+
|
|
7
|
+
Name: `ComboBox.Button`
|
|
8
|
+
Description: Compatibility alias for `ComboBox.Trigger`.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| -------------- | ---------------------- | ----------- | --------------------------------------------------------------- |
|
|
12
|
+
| `class` | `string` | `undefined` | CSS class names for the trigger element. |
|
|
13
|
+
| `children` | `Snippet` | `undefined` | Custom trigger content. If omitted, a chevron icon is rendered. |
|
|
14
|
+
| `tabindex` | `number` | `-1` | Tab index applied to the trigger button. |
|
|
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';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# ComboBox Input
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### ComboBox.Input
|
|
6
|
+
|
|
7
|
+
Name: `ComboBox.Input`
|
|
8
|
+
Description: Text input with `role="combobox"` that syncs typed value, active descendant, and keyboard handling with `ComboBox.Root`.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| ------------------ | --------------------- | ----------- | ----------------------------------------------- |
|
|
12
|
+
| `aria-label` | `string` | `undefined` | Accessible label applied directly to the input. |
|
|
13
|
+
| `aria-labelledby` | `string` | `undefined` | Element id that labels the input. |
|
|
14
|
+
| `aria-describedby` | `string` | `undefined` | Element id that describes the input behavior. |
|
|
15
|
+
| `class` | `string` | `undefined` | CSS class names for the input element. |
|
|
16
|
+
| `...restProps` | `HTMLInputAttributes` | `-` | Additional native input attributes. |
|
|
@@ -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"
|
|
@@ -83,13 +114,13 @@
|
|
|
83
114
|
aria-labelledby={ariaLabelledby}
|
|
84
115
|
aria-describedby={ariaDescribedby}
|
|
85
116
|
value={ctx.displayValue}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
oninput={handleInput}
|
|
89
|
-
onfocus={handleFocus}
|
|
90
|
-
onmousedown={handleMouseDown}
|
|
91
|
-
onblur={handleBlur}
|
|
92
|
-
onkeydown={
|
|
117
|
+
isDisabled={ctx.isDisabled}
|
|
118
|
+
isReadOnly={ctx.isReadOnly}
|
|
119
|
+
oninput={composeEventHandlers(handleInput, onInputExternal ?? undefined)}
|
|
120
|
+
onfocus={composeEventHandlers(handleFocus, onFocusExternal ?? undefined)}
|
|
121
|
+
onmousedown={composeEventHandlers(handleMouseDown, onMouseDownExternal ?? undefined)}
|
|
122
|
+
onblur={composeEventHandlers(handleBlur, onBlurExternal ?? undefined)}
|
|
123
|
+
onkeydown={composeEventHandlers(handleKeyDown, onKeyDownExternal ?? undefined)}
|
|
93
124
|
class={cn(
|
|
94
125
|
'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
126
|
className
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# ComboBox Item
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### ComboBox.Item
|
|
6
|
+
|
|
7
|
+
Name: `ComboBox.Item`
|
|
8
|
+
Description: Selectable option item with combobox-specific filtering, virtual focus, and registration logic.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| -------------- | -------------------------------- | -------------- | -------------------------------------------------------------- |
|
|
12
|
+
| `id` | `string \| number` | `required` | Unique item id used for selection and ARIA relationships. |
|
|
13
|
+
| `textValue` | `string` | `content text` | Text used for filtering and fallback label resolution. |
|
|
14
|
+
| `disabled` | `boolean` | `false` | Marks the item as disabled and non-selectable. |
|
|
15
|
+
| `class` | `string` | `undefined` | CSS class names for the item. |
|
|
16
|
+
| `children` | `Snippet` | `undefined` | Rendered item content. |
|
|
17
|
+
| `...restProps` | `HTMLAttributes<HTMLDivElement>` | `-` | Additional attributes passed to the underlying option element. |
|
|
18
|
+
|
|
19
|
+
### Item context utility
|
|
20
|
+
|
|
21
|
+
Name: `COMBOBOX_ITEM_CONTEXT_KEY` / `ComboBoxItemContext`
|
|
22
|
+
Description: Internal context consumed by `ComboBox.ItemIndicator` to read the parent item id.
|
|
23
|
+
|
|
24
|
+
| Prop | Type | Default | Description |
|
|
25
|
+
| --------------------------- | ------------------ | ----------------------------- | ----------------------------------------- |
|
|
26
|
+
| `COMBOBOX_ITEM_CONTEXT_KEY` | `symbol` | `Symbol.for('combobox-item')` | Context key shared by item and indicator. |
|
|
27
|
+
| `id` | `string \| number` | `required` | Current item id exposed through context. |
|