@human-kit/svelte-components 1.0.0-alpha.1 → 1.0.0-alpha.10
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 +1 -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 +13 -0
- package/dist/combobox/popover/combobox-popover.svelte +133 -17
- 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 +78 -2
- package/dist/combobox/root/combobox.svelte.d.ts +1 -0
- package/dist/combobox/root/context.d.ts +9 -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 +152 -2
- package/dist/listbox/item/listbox-item.svelte.d.ts +2 -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 +276 -23
- 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
|
@@ -3,11 +3,16 @@
|
|
|
3
3
|
import { setComboBoxContext, type ComboBoxContext } from './context';
|
|
4
4
|
import type { ListBoxContext } from '../../listbox/root/context';
|
|
5
5
|
import { useVirtualFocus } from '../../hooks/use-virtual-focus.svelte';
|
|
6
|
+
import {
|
|
7
|
+
shouldShowFocusVisible,
|
|
8
|
+
trackInteractionModality
|
|
9
|
+
} from '../../primitives/input-modality';
|
|
6
10
|
|
|
7
11
|
type ComboBoxProps<T> = {
|
|
8
12
|
/** Stable ID used to generate internal ARIA IDs (recommended for SSR). */
|
|
9
13
|
id?: string;
|
|
10
14
|
isDisabled?: boolean;
|
|
15
|
+
isPending?: boolean;
|
|
11
16
|
isReadOnly?: boolean;
|
|
12
17
|
/** Selected value(s). Single value for single mode, array for multiple mode. Can be bound with bind:value */
|
|
13
18
|
value?: string | number | (string | number)[];
|
|
@@ -43,6 +48,7 @@
|
|
|
43
48
|
let {
|
|
44
49
|
id: rootId,
|
|
45
50
|
isDisabled = false,
|
|
51
|
+
isPending = false,
|
|
46
52
|
isReadOnly = false,
|
|
47
53
|
value = $bindable(),
|
|
48
54
|
defaultValue,
|
|
@@ -98,6 +104,9 @@
|
|
|
98
104
|
|
|
99
105
|
// Virtual focus for tag navigation in multiple mode
|
|
100
106
|
let focusedTagId: string | number | null = $state(null);
|
|
107
|
+
let focusWithin = $state(false);
|
|
108
|
+
let focusVisible = $state(false);
|
|
109
|
+
let popoverPointerDownPending = $state(false);
|
|
101
110
|
|
|
102
111
|
// Flag to control whether inputValue should be used for filtering
|
|
103
112
|
// When false, all items are shown regardless of inputValue
|
|
@@ -188,6 +197,7 @@
|
|
|
188
197
|
// In multiple mode, selections are managed via tags, not input
|
|
189
198
|
if (selectionMode === 'single' && val.trim() === '' && currentSelection.size > 0) {
|
|
190
199
|
const emptySelection = new Set<string | number>();
|
|
200
|
+
selectedInternal = emptySelection;
|
|
191
201
|
if (isSelectionControlled) {
|
|
192
202
|
onChange?.(toExternalValue(emptySelection));
|
|
193
203
|
} else {
|
|
@@ -236,6 +246,7 @@
|
|
|
236
246
|
}
|
|
237
247
|
}
|
|
238
248
|
|
|
249
|
+
selectedInternal = newSelection;
|
|
239
250
|
if (isSelectionControlled) {
|
|
240
251
|
onChange?.(toExternalValue(newSelection));
|
|
241
252
|
} else {
|
|
@@ -257,6 +268,7 @@
|
|
|
257
268
|
// Remove from persistent labels
|
|
258
269
|
selectedLabels.delete(id);
|
|
259
270
|
|
|
271
|
+
selectedInternal = newSelection;
|
|
260
272
|
if (isSelectionControlled) {
|
|
261
273
|
onChange?.(toExternalValue(newSelection));
|
|
262
274
|
} else {
|
|
@@ -274,6 +286,7 @@
|
|
|
274
286
|
function clearSelection() {
|
|
275
287
|
const emptySelection = new Set<string | number>();
|
|
276
288
|
|
|
289
|
+
selectedInternal = emptySelection;
|
|
277
290
|
if (isSelectionControlled) {
|
|
278
291
|
onChange?.(toExternalValue(emptySelection));
|
|
279
292
|
} else {
|
|
@@ -335,6 +348,34 @@
|
|
|
335
348
|
}
|
|
336
349
|
}
|
|
337
350
|
|
|
351
|
+
function syncFocusWithin() {
|
|
352
|
+
focusWithin =
|
|
353
|
+
!!wrapperRef && !!document.activeElement && wrapperRef.contains(document.activeElement);
|
|
354
|
+
if (!focusWithin) {
|
|
355
|
+
focusVisible = false;
|
|
356
|
+
// Clean up stale data-focused/data-focus-visible that Popover.Root's
|
|
357
|
+
// focus-state module may have set imperatively on the wrapper (the
|
|
358
|
+
// wrapper is briefly used as triggerRef before the input overrides it).
|
|
359
|
+
if (wrapperRef) {
|
|
360
|
+
delete wrapperRef.dataset.focused;
|
|
361
|
+
delete wrapperRef.dataset.focusVisible;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
function handleFocusIn(event: FocusEvent) {
|
|
367
|
+
focusWithin = true;
|
|
368
|
+
focusVisible = shouldShowFocusVisible(event.target as HTMLElement | null);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
function handleFocusOut() {
|
|
372
|
+
queueMicrotask(syncFocusWithin);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function setFocusVisibleState(visible: boolean) {
|
|
376
|
+
focusVisible = visible && focusWithin;
|
|
377
|
+
}
|
|
378
|
+
|
|
338
379
|
// Use navigation hook methods for keyboard navigation
|
|
339
380
|
function selectFocusedItem() {
|
|
340
381
|
if (navigation.focusedId !== null) {
|
|
@@ -346,9 +387,26 @@
|
|
|
346
387
|
/**
|
|
347
388
|
* Handle input blur or escape - restore selection label or clear if no selection
|
|
348
389
|
*/
|
|
349
|
-
function
|
|
390
|
+
function consumePopoverPointerDown() {
|
|
391
|
+
if (!popoverPointerDownPending) return false;
|
|
392
|
+
popoverPointerDownPending = false;
|
|
393
|
+
return true;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
function handleInputBlur(event?: FocusEvent) {
|
|
350
397
|
// Clear tag virtual focus
|
|
351
398
|
focusedTagId = null;
|
|
399
|
+
|
|
400
|
+
const nextFocusedElement = event?.relatedTarget;
|
|
401
|
+
const isMovingFocusWithinCombobox =
|
|
402
|
+
nextFocusedElement instanceof Node &&
|
|
403
|
+
((wrapperRef?.contains(nextFocusedElement) ?? false) ||
|
|
404
|
+
(listboxRef?.contains(nextFocusedElement) ?? false));
|
|
405
|
+
|
|
406
|
+
if (isMovingFocusWithinCombobox || consumePopoverPointerDown()) {
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
|
|
352
410
|
// Close popover first to prevent flash of options when clearing input
|
|
353
411
|
closePopover();
|
|
354
412
|
|
|
@@ -385,6 +443,7 @@
|
|
|
385
443
|
|
|
386
444
|
function handleKeydown(event: KeyboardEvent) {
|
|
387
445
|
if (isDisabled) return;
|
|
446
|
+
trackInteractionModality(event, event.target as HTMLElement | null);
|
|
388
447
|
|
|
389
448
|
// Handle tag virtual focus navigation in multiple mode
|
|
390
449
|
if (focusedTagId !== null && selectionMode === 'multiple') {
|
|
@@ -559,6 +618,8 @@
|
|
|
559
618
|
event.stopImmediatePropagation();
|
|
560
619
|
}
|
|
561
620
|
handleInputBlur();
|
|
621
|
+
// Escape is a keyboard-only path, so focus-visible remains enabled for the input.
|
|
622
|
+
focusVisible = true;
|
|
562
623
|
event.preventDefault();
|
|
563
624
|
break;
|
|
564
625
|
case 'Backspace':
|
|
@@ -604,6 +665,9 @@
|
|
|
604
665
|
get isDisabled() {
|
|
605
666
|
return isDisabled;
|
|
606
667
|
},
|
|
668
|
+
get isPending() {
|
|
669
|
+
return isPending;
|
|
670
|
+
},
|
|
607
671
|
get isReadOnly() {
|
|
608
672
|
return isReadOnly;
|
|
609
673
|
},
|
|
@@ -668,12 +732,17 @@
|
|
|
668
732
|
unregisterItem: navigation.unregister,
|
|
669
733
|
handleKeydown,
|
|
670
734
|
handleInputBlur,
|
|
735
|
+
setFocusVisible: setFocusVisibleState,
|
|
671
736
|
get focusedTagId() {
|
|
672
737
|
return focusedTagId;
|
|
673
738
|
},
|
|
674
739
|
setFocusedTagId: (id: string | number | null) => {
|
|
675
740
|
focusedTagId = id;
|
|
676
|
-
}
|
|
741
|
+
},
|
|
742
|
+
markPopoverPointerDown: () => {
|
|
743
|
+
popoverPointerDownPending = true;
|
|
744
|
+
},
|
|
745
|
+
consumePopoverPointerDown
|
|
677
746
|
};
|
|
678
747
|
|
|
679
748
|
setComboBoxContext(ctx);
|
|
@@ -684,11 +753,18 @@
|
|
|
684
753
|
role="group"
|
|
685
754
|
aria-label={ariaLabel}
|
|
686
755
|
aria-labelledby={ariaLabelledby}
|
|
756
|
+
aria-busy={isPending ? 'true' : undefined}
|
|
687
757
|
class={className}
|
|
688
758
|
data-combobox
|
|
759
|
+
data-focused={focusWithin || undefined}
|
|
689
760
|
data-disabled={isDisabled || undefined}
|
|
761
|
+
data-pending={isPending || undefined}
|
|
690
762
|
data-readonly={isReadOnly || undefined}
|
|
763
|
+
data-focus-within={focusWithin || undefined}
|
|
764
|
+
data-focus-visible={focusVisible || undefined}
|
|
691
765
|
use:setWrapperAsTrigger
|
|
766
|
+
onfocusin={handleFocusIn}
|
|
767
|
+
onfocusout={handleFocusOut}
|
|
692
768
|
>
|
|
693
769
|
{#if children}
|
|
694
770
|
{@render children()}
|
|
@@ -3,6 +3,7 @@ type ComboBoxProps<T> = {
|
|
|
3
3
|
/** Stable ID used to generate internal ARIA IDs (recommended for SSR). */
|
|
4
4
|
id?: string;
|
|
5
5
|
isDisabled?: boolean;
|
|
6
|
+
isPending?: boolean;
|
|
6
7
|
isReadOnly?: boolean;
|
|
7
8
|
/** Selected value(s). Single value for single mode, array for multiple mode. Can be bound with bind:value */
|
|
8
9
|
value?: string | number | (string | number)[];
|
|
@@ -20,6 +20,8 @@ export type ComboBoxContext<T extends object = object> = {
|
|
|
20
20
|
selectedValue: Set<string | number>;
|
|
21
21
|
/** Whether the combobox is disabled */
|
|
22
22
|
isDisabled: boolean;
|
|
23
|
+
/** Whether the combobox is pending async work */
|
|
24
|
+
isPending: boolean;
|
|
23
25
|
/** Whether the combobox is read-only */
|
|
24
26
|
isReadOnly: boolean;
|
|
25
27
|
/** Selection mode */
|
|
@@ -79,11 +81,17 @@ export type ComboBoxContext<T extends object = object> = {
|
|
|
79
81
|
/** Handle keyboard events (arrow navigation, enter, escape) */
|
|
80
82
|
handleKeydown: (event: KeyboardEvent) => void;
|
|
81
83
|
/** Handle input blur - restore selection or deselect if empty */
|
|
82
|
-
handleInputBlur: () => void;
|
|
84
|
+
handleInputBlur: (event?: FocusEvent) => void;
|
|
85
|
+
/** Update root-level focus-visible state based on current modality. */
|
|
86
|
+
setFocusVisible: (visible: boolean) => void;
|
|
83
87
|
/** Currently focused tag ID (virtual focus for tag navigation) */
|
|
84
88
|
focusedTagId: string | number | null;
|
|
85
89
|
/** Set focused tag ID (virtual focus for tag navigation) */
|
|
86
90
|
setFocusedTagId: (id: string | number | null) => void;
|
|
91
|
+
/** Mark that the next input blur was caused by pointer interaction inside the popover. */
|
|
92
|
+
markPopoverPointerDown: () => void;
|
|
93
|
+
/** Consume the pending popover-pointer marker. */
|
|
94
|
+
consumePopoverPointerDown: () => boolean;
|
|
87
95
|
};
|
|
88
96
|
export declare function setComboBoxContext<T extends object = object>(ctx: ComboBoxContext<T>): void;
|
|
89
97
|
export declare function getComboBoxContext<T extends object = object>(): ComboBoxContext<T> | undefined;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# ComboBox Tag
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### ComboBox.Tag
|
|
6
|
+
|
|
7
|
+
Name: `ComboBox.Tag`
|
|
8
|
+
Description: Visual token representing one selected value in multiple selection mode.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| -------------- | --------------------------------- | ----------- | ------------------------------------ |
|
|
12
|
+
| `children` | `Snippet` | `required` | Tag content. |
|
|
13
|
+
| `class` | `string` | `undefined` | CSS class names for the tag element. |
|
|
14
|
+
| `...restProps` | `HTMLAttributes<HTMLSpanElement>` | `-` | Additional span attributes. |
|
|
15
|
+
|
|
16
|
+
### TagContextProvider (utility)
|
|
17
|
+
|
|
18
|
+
Name: `TagContextProvider`
|
|
19
|
+
Description: Internal provider used by `ComboBox.Tags` to expose `id`, `label`, `remove`, and `disabled` to tag sub-parts.
|
|
20
|
+
|
|
21
|
+
| Prop | Type | Default | Description |
|
|
22
|
+
| ---------- | ------------------ | ---------- | --------------------------------------- |
|
|
23
|
+
| `id` | `string \| number` | `required` | Selected item id. |
|
|
24
|
+
| `label` | `string` | `required` | Selected item label. |
|
|
25
|
+
| `remove` | `() => void` | `required` | Removes the selected item. |
|
|
26
|
+
| `disabled` | `boolean` | `required` | Disabled state propagated to tag parts. |
|
|
27
|
+
| `children` | `Snippet` | `required` | Wrapped tag subtree. |
|
|
28
|
+
|
|
29
|
+
### Tag context exports
|
|
30
|
+
|
|
31
|
+
Name: `TAG_CONTEXT_KEY` / `TagContext`
|
|
32
|
+
Description: Shared context key and type consumed by `ComboBox.Tag` and `ComboBox.TagRemove`.
|
|
33
|
+
|
|
34
|
+
| Prop | Type | Default | Description |
|
|
35
|
+
| ----------------- | -------- | ---------------------------- | -------------------------------------------------- |
|
|
36
|
+
| `TAG_CONTEXT_KEY` | `symbol` | `Symbol.for('combobox-tag')` | Global context key for tag state. |
|
|
37
|
+
| `TagContext` | `type` | `-` | Type with `id`, `label`, `remove`, and `disabled`. |
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# ComboBox Tag Remove
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### ComboBox.TagRemove
|
|
6
|
+
|
|
7
|
+
Name: `ComboBox.TagRemove`
|
|
8
|
+
Description: Remove action button for a selected tag.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| -------------- | ---------------------- | ----------- | --------------------------------------------------------------- |
|
|
12
|
+
| `children` | `Snippet` | `X icon` | Custom button content. |
|
|
13
|
+
| `class` | `string` | `undefined` | CSS class names for the remove button. |
|
|
14
|
+
| `...restProps` | `HTMLButtonAttributes` | `-` | Additional button attributes, excluding reserved trigger props. |
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
4
4
|
import { getContext } from 'svelte';
|
|
5
|
+
import { ButtonRoot } from '../../button/index.js';
|
|
5
6
|
import { cn } from '../../utils/cn';
|
|
6
7
|
import { TAG_CONTEXT_KEY, type TagContext } from '../tag/combobox-tag.svelte';
|
|
7
8
|
|
|
@@ -27,7 +28,7 @@
|
|
|
27
28
|
</script>
|
|
28
29
|
|
|
29
30
|
{#if !tagCtx.disabled}
|
|
30
|
-
<
|
|
31
|
+
<ButtonRoot
|
|
31
32
|
type="button"
|
|
32
33
|
onclick={handleClick}
|
|
33
34
|
aria-label={`Remove ${tagCtx.label}`}
|
|
@@ -49,5 +50,5 @@
|
|
|
49
50
|
/>
|
|
50
51
|
</svg>
|
|
51
52
|
{/if}
|
|
52
|
-
</
|
|
53
|
+
</ButtonRoot>
|
|
53
54
|
{/if}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# ComboBox Tags
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### ComboBox.Tags
|
|
6
|
+
|
|
7
|
+
Name: `ComboBox.Tags`
|
|
8
|
+
Description: Container that renders selected values as tags in multiple mode.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| ---------- | ------------------------------ | ---------- | --------------------------------------------------------------------------------- |
|
|
12
|
+
| `children` | `Snippet<[{ item: TagItem }]>` | `required` | Render function that receives each selected item as `{ item: { value, label } }`. |
|
|
13
|
+
| `class` | `string` | `''` | CSS class names for the tags container. |
|
|
14
|
+
|
|
15
|
+
### TagItem type
|
|
16
|
+
|
|
17
|
+
Name: `TagItem`
|
|
18
|
+
Description: Item shape provided to `ComboBox.Tags` render snippet.
|
|
19
|
+
|
|
20
|
+
| Prop | Type | Default | Description |
|
|
21
|
+
| ------- | ------------------ | ---------- | ------------------------------------- |
|
|
22
|
+
| `value` | `string \| number` | `required` | Selected value id. |
|
|
23
|
+
| `label` | `string` | `required` | Display label for the selected value. |
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# ComboBox Trigger
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### ComboBox.Trigger
|
|
6
|
+
|
|
7
|
+
Name: `ComboBox.Trigger`
|
|
8
|
+
Description: Optional trigger button that toggles the combobox popover without stealing focus from the input.
|
|
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
|
+
- `ComboBox.Trigger` reflects the root pending state through `data-pending`.
|
|
20
|
+
- While the combobox is disabled, read-only, or pending, the trigger becomes non-interactive.
|
|
21
|
+
- `ComboBox.Button` remains available as a compatibility alias.
|
|
@@ -0,0 +1,56 @@
|
|
|
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 ComboBoxTriggerProps = HTMLButtonAttributes & {
|
|
8
|
+
class?: string;
|
|
9
|
+
children?: Snippet;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
let { class: className, children, tabindex = -1, ...restProps }: ComboBoxTriggerProps = $props();
|
|
13
|
+
|
|
14
|
+
const ctx = useComboBoxContext();
|
|
15
|
+
const isTriggerDisabled = $derived(ctx.isDisabled || ctx.isReadOnly || ctx.isPending);
|
|
16
|
+
|
|
17
|
+
function handleMouseDown(event: MouseEvent) {
|
|
18
|
+
event.preventDefault();
|
|
19
|
+
if (!isTriggerDisabled) {
|
|
20
|
+
ctx.toggle();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
<ButtonRoot
|
|
26
|
+
type="button"
|
|
27
|
+
{tabindex}
|
|
28
|
+
aria-label={ctx.isOpen ? 'Close menu' : 'Open menu'}
|
|
29
|
+
aria-expanded={ctx.isOpen}
|
|
30
|
+
aria-controls={`combobox-listbox-${ctx.instanceId}`}
|
|
31
|
+
isDisabled={ctx.isDisabled || ctx.isReadOnly}
|
|
32
|
+
isPending={ctx.isPending}
|
|
33
|
+
pressed={ctx.isOpen}
|
|
34
|
+
onmousedown={handleMouseDown}
|
|
35
|
+
class={className}
|
|
36
|
+
{...restProps}
|
|
37
|
+
>
|
|
38
|
+
{#if children}
|
|
39
|
+
{@render children()}
|
|
40
|
+
{:else}
|
|
41
|
+
<svg
|
|
42
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
43
|
+
width="16"
|
|
44
|
+
height="16"
|
|
45
|
+
viewBox="0 0 24 24"
|
|
46
|
+
fill="none"
|
|
47
|
+
stroke="currentColor"
|
|
48
|
+
stroke-width="2"
|
|
49
|
+
stroke-linecap="round"
|
|
50
|
+
stroke-linejoin="round"
|
|
51
|
+
class="transition-transform {ctx.isOpen ? 'rotate-180' : ''}"
|
|
52
|
+
>
|
|
53
|
+
<path d="m6 9 6 6 6-6" />
|
|
54
|
+
</svg>
|
|
55
|
+
{/if}
|
|
56
|
+
</ButtonRoot>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
3
|
+
type ComboBoxTriggerProps = HTMLButtonAttributes & {
|
|
4
|
+
class?: string;
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
};
|
|
7
|
+
declare const ComboboxTrigger: import("svelte").Component<ComboBoxTriggerProps, {}, "">;
|
|
8
|
+
type ComboboxTrigger = ReturnType<typeof ComboboxTrigger>;
|
|
9
|
+
export default ComboboxTrigger;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# DatePicker
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
`DatePicker` composes a segmented date input with a calendar popover for selecting dates.
|
|
6
|
+
|
|
7
|
+
## Anatomy
|
|
8
|
+
|
|
9
|
+
- `DatePicker.Root`
|
|
10
|
+
- `DatePicker.Input`
|
|
11
|
+
- `DatePicker.Segment`
|
|
12
|
+
- `DatePicker.Trigger`
|
|
13
|
+
- `DatePicker.Popover`
|
|
14
|
+
- `DatePicker.Calendar`
|
|
15
|
+
- `DatePicker.TriggerPrevious`
|
|
16
|
+
- `DatePicker.Heading`
|
|
17
|
+
- `DatePicker.TriggerNext`
|
|
18
|
+
- `DatePicker.Grid`
|
|
19
|
+
- `DatePicker.GridHeader`
|
|
20
|
+
- `DatePicker.HeaderCell`
|
|
21
|
+
- `DatePicker.GridBody`
|
|
22
|
+
- `DatePicker.BodyCell`
|
|
23
|
+
|
|
24
|
+
```svelte
|
|
25
|
+
<DatePicker.Root>
|
|
26
|
+
<DatePicker.Input aria-label="Date input">
|
|
27
|
+
{#snippet children(segment)}
|
|
28
|
+
<DatePicker.Segment {segment} />
|
|
29
|
+
{/snippet}
|
|
30
|
+
</DatePicker.Input>
|
|
31
|
+
<DatePicker.Trigger />
|
|
32
|
+
|
|
33
|
+
<DatePicker.Popover>
|
|
34
|
+
<DatePicker.Calendar>
|
|
35
|
+
<div>
|
|
36
|
+
<DatePicker.TriggerPrevious />
|
|
37
|
+
<DatePicker.Heading />
|
|
38
|
+
<DatePicker.TriggerNext />
|
|
39
|
+
</div>
|
|
40
|
+
<DatePicker.Grid>
|
|
41
|
+
<DatePicker.GridHeader />
|
|
42
|
+
<DatePicker.GridBody />
|
|
43
|
+
</DatePicker.Grid>
|
|
44
|
+
</DatePicker.Calendar>
|
|
45
|
+
</DatePicker.Popover>
|
|
46
|
+
</DatePicker.Root>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Root API
|
|
50
|
+
|
|
51
|
+
- `value?: string | null` (`YYYY-MM-DD`)
|
|
52
|
+
- `defaultValue?: string | null` (`YYYY-MM-DD`)
|
|
53
|
+
- `onChange?: (value: string | null) => void`
|
|
54
|
+
- `isDisabled?: boolean`
|
|
55
|
+
- `isReadOnly?: boolean`
|
|
56
|
+
- `minValue?: string` (`YYYY-MM-DD`)
|
|
57
|
+
- `maxValue?: string` (`YYYY-MM-DD`)
|
|
58
|
+
- `isDateUnavailable?: (date: string) => boolean`
|
|
59
|
+
- `open?: boolean`
|
|
60
|
+
- `defaultOpen?: boolean`
|
|
61
|
+
- `onOpenChange?: (open: boolean, details: { reason, event?, cancel(), isCanceled }) => void`
|
|
62
|
+
- `closeOnSelect?: boolean`
|
|
63
|
+
- Null-first empty contract: when `value` and `defaultValue` are omitted, the empty state is `null`.
|
|
64
|
+
- `DatePicker.Input` exposes `aria-invalid` and `data-invalid` when the current segment draft is not committeable.
|
|
65
|
+
|
|
66
|
+
## Popover API
|
|
67
|
+
|
|
68
|
+
- `DatePicker.Popover` forwards `Popover.Content` props (for example `placement`, `offset`, `shouldFlip`, `boundaryElement`, `isNonModal`, and close behavior props).
|
|
69
|
+
- The following are controlled internally by `DatePicker` and are not accepted on `DatePicker.Popover`: `open`, `triggerRef`, `onOpenChange`, `id`.
|
|
70
|
+
- Defaults:
|
|
71
|
+
- `placement` defaults to `bottom-start`.
|
|
72
|
+
- `aria-label` defaults to `Calendar`.
|
|
73
|
+
- `initialFocus` defaults to focusing the current active day cell in the calendar grid.
|
|
74
|
+
|
|
75
|
+
## Calendar API
|
|
76
|
+
|
|
77
|
+
- `DatePicker.Calendar` forwards `Calendar.Root` props except those controlled by `DatePicker.Root`.
|
|
78
|
+
- The following are controlled internally by `DatePicker` and are not accepted on `DatePicker.Calendar`: `selectionMode`, `value`, `defaultValue`, `onChange`, `isDisabled`, `isReadOnly`, `isDateUnavailable`.
|
|
79
|
+
|
|
80
|
+
## Notes
|
|
81
|
+
|
|
82
|
+
- Locale is read from `LocaleProvider` when available.
|
|
83
|
+
- Segment accessible names are resolved automatically from the active locale.
|
|
84
|
+
- During segment editing, the committed value is set to `null` when the draft is incomplete, invalid, out-of-range, or unavailable.
|
|
85
|
+
- Current MVP focuses on date-only values.
|
|
86
|
+
|
|
87
|
+
## UX Decisions
|
|
88
|
+
|
|
89
|
+
- **No Date Auto-Correction:** When users manually type dates out of the configured bounds (`minValue`/`maxValue`) or dates that are unavailable, the DatePicker **does not auto-correct** the typed value. Instead, it exposes `aria-invalid="true"` and `data-invalid` on the input, allowing the user to see what they typed incorrectly. The underlying committed value is kept as `null` until a valid date is completed. Auto-correcting input without explicit user consent is an inaccessible anti-pattern.
|
|
90
|
+
- **Navigable Disabled Dates:** When using the Calendar, disabled dates remain focusable via keyboard navigation. This ensures ARIA Grid spatial navigation parity so that screen readers can consistently announce all calendar cells and report them as "disabled", rather than skipping over them and disorienting the user.
|
|
91
|
+
|
|
92
|
+
## Focus behavior decisions
|
|
93
|
+
|
|
94
|
+
- DatePicker aligns with the shared modality primitive (`primitives/input-modality.ts`) for `keyboard`, `pointer`, and `virtual` interactions.
|
|
95
|
+
- `data-focus-visible` is modality-driven; `data-focused` and `data-focus-within` continue to represent real DOM focus state.
|
|
96
|
+
- Trigger focus restore after calendar close is modality-aware:
|
|
97
|
+
- keyboard close paths keep visible focus,
|
|
98
|
+
- pointer outside close restores focus without visible focus.
|
|
99
|
+
- The component keeps explicit `trackInteractionModality(...)` calls in local handlers to ensure deterministic modality updates before local focus-state logic runs.
|
|
100
|
+
- Cross-component focus contract and invariants are documented in `FOCUS_STATE_CONTRACT.md`.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# DatePicker TODO
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Track DatePicker work with a single mandatory TODO format.
|
|
6
|
+
|
|
7
|
+
## Backlog
|
|
8
|
+
|
|
9
|
+
- [x] [M][P0][Area: Context][Owner: Unassigned][Target: Done] Complete core context wiring.
|
|
10
|
+
- [x] [M][P0][Area: State][Owner: Unassigned][Target: Done] Implement root state and value handling.
|
|
11
|
+
- [x] [M][P0][Area: Parsing][Owner: Unassigned][Target: Done] Integrate segment parser and formatter.
|
|
12
|
+
- [x] [M][P0][Area: Input][Owner: Unassigned][Target: Done] Deliver baseline segmented input rendering.
|
|
13
|
+
- [x] [M][P0][Area: Composition][Owner: Unassigned][Target: Done] Integrate calendar popover behavior.
|
|
14
|
+
- [x] [M][P0][Area: Accessibility][Owner: Unassigned][Target: Done] Implement keyboard navigation baseline.
|
|
15
|
+
- [x] [M][P0][Area: Validation][Owner: Unassigned][Target: Done] Implement min/max and unavailable date validation baseline.
|
|
16
|
+
- [x] [M][P0][Area: API][Owner: Unassigned][Target: Done] Ship public exports and baseline docs/tests.
|
|
17
|
+
- [x] [M][P0][Area: Forms][Owner: Unassigned][Target: Done] Support rich object values and hidden input synchronization.
|
|
18
|
+
- [x] [M][P0][Area: Focus][Owner: Unassigned][Target: Done] Unify focus-visible behavior with shared modality semantics.
|
|
19
|
+
- [x] [S][P1][Area: Focus][Owner: Unassigned][Target: Done] Remove DatePicker-local modality tracking in favor of shared primitive.
|
|
20
|
+
- [x] [S][P1][Area: Documentation][Owner: Unassigned][Target: Done] Document focus contract updates and DatePicker rationale.
|
|
21
|
+
- [ ] [S][P1][Area: Calendar][Owner: Unassigned][Target: TBD] Add multi-month calendar display.
|
|
22
|
+
- [ ] [S][P1][Area: Accessibility][Owner: Unassigned][Target: TBD] Run deep accessibility audit (SR + keyboard edge cases).
|
|
23
|
+
- [ ] [C][P2][Area: Time][Owner: Unassigned][Target: TBD] Add time selection integration.
|
|
24
|
+
- [ ] [C][P2][Area: API][Owner: Unassigned][Target: TBD] Decide and implement date-range mode strategy.
|
|
25
|
+
- [ ] [C][P2][Area: Input][Owner: Unassigned][Target: TBD] Add input mask helper utilities.
|
|
26
|
+
- [ ] [C][P2][Area: Mobile][Owner: Unassigned][Target: TBD] Add mobile-optimized interaction pass.
|
|
27
|
+
- [ ] [C][P2][Area: UX][Owner: Unassigned][Target: TBD] Add preset shortcuts (today, next week, custom).
|
|
28
|
+
- [ ] [C][P2][Area: Performance][Owner: Unassigned][Target: TBD] Add segment update micro-benchmarks and optimizations.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# DatePicker Calendar
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### DatePicker.Calendar
|
|
6
|
+
|
|
7
|
+
Name: `DatePicker.Calendar`
|
|
8
|
+
Description: Calendar composition part connected to `DatePicker.Root` selected date and navigation state.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------------ |
|
|
12
|
+
| `children` | `Snippet` | `undefined` | Optional custom calendar content. |
|
|
13
|
+
| `class` | `string` | `''` | CSS class names for the calendar wrapper. |
|
|
14
|
+
| `...restProps` | `Omit<ComponentProps<typeof Calendar.Root>, 'selectionMode' \| 'value' \| 'defaultValue' \| 'onChange' \| 'isDisabled' \| 'isReadOnly' \| 'isDateUnavailable'>` | `-` | Additional calendar root props forwarded by this part. |
|
|
15
|
+
|
|
16
|
+
### Notes
|
|
17
|
+
|
|
18
|
+
Name: Root-controlled calendar props
|
|
19
|
+
Description: `selectionMode`, `value`, `defaultValue`, `onChange`, `isDisabled`, `isReadOnly`, and `isDateUnavailable` are controlled by `DatePicker.Root` and ignored when passed to this part.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import DatePicker from '../index';
|
|
3
|
+
|
|
4
|
+
let unsafeOnChangeCalls = $state(0);
|
|
5
|
+
let selectedValue = $state<string | null>('');
|
|
6
|
+
|
|
7
|
+
const unsafeCalendarProps: Record<string, unknown> = {
|
|
8
|
+
selectionMode: 'range',
|
|
9
|
+
value: { start: '2026-02-01', end: '2026-02-05' },
|
|
10
|
+
defaultValue: '2026-02-20',
|
|
11
|
+
onChange: () => {
|
|
12
|
+
unsafeOnChangeCalls += 1;
|
|
13
|
+
},
|
|
14
|
+
isDisabled: true,
|
|
15
|
+
isReadOnly: true,
|
|
16
|
+
isDateUnavailable: () => true
|
|
17
|
+
};
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<DatePicker.Root
|
|
21
|
+
defaultValue="2026-02-10"
|
|
22
|
+
defaultOpen={true}
|
|
23
|
+
onChange={(nextValue) => {
|
|
24
|
+
selectedValue = nextValue;
|
|
25
|
+
}}
|
|
26
|
+
>
|
|
27
|
+
<DatePicker.Input class="date-picker-input" aria-label="Date input">
|
|
28
|
+
{#snippet children(segment)}
|
|
29
|
+
<DatePicker.Segment class="date-picker-segment" {segment} />
|
|
30
|
+
{/snippet}
|
|
31
|
+
</DatePicker.Input>
|
|
32
|
+
<DatePicker.Trigger class="date-picker-trigger">Open calendar</DatePicker.Trigger>
|
|
33
|
+
|
|
34
|
+
<DatePicker.Popover class="date-picker-popover">
|
|
35
|
+
<DatePicker.Calendar class="date-picker-calendar" {...unsafeCalendarProps}>
|
|
36
|
+
<div class="flex items-center justify-between gap-2 p-2">
|
|
37
|
+
<DatePicker.TriggerPrevious />
|
|
38
|
+
<DatePicker.Heading />
|
|
39
|
+
<DatePicker.TriggerNext />
|
|
40
|
+
</div>
|
|
41
|
+
<DatePicker.Grid>
|
|
42
|
+
<DatePicker.GridHeader>
|
|
43
|
+
{#snippet children(dayLabel: string)}
|
|
44
|
+
<DatePicker.HeaderCell>
|
|
45
|
+
{dayLabel}
|
|
46
|
+
</DatePicker.HeaderCell>
|
|
47
|
+
{/snippet}
|
|
48
|
+
</DatePicker.GridHeader>
|
|
49
|
+
<DatePicker.GridBody>
|
|
50
|
+
{#snippet children(date: string)}
|
|
51
|
+
<DatePicker.BodyCell {date} />
|
|
52
|
+
{/snippet}
|
|
53
|
+
</DatePicker.GridBody>
|
|
54
|
+
</DatePicker.Grid>
|
|
55
|
+
</DatePicker.Calendar>
|
|
56
|
+
</DatePicker.Popover>
|
|
57
|
+
</DatePicker.Root>
|
|
58
|
+
|
|
59
|
+
<p data-testid="unsafe-on-change-calls">{unsafeOnChangeCalls}</p>
|
|
60
|
+
<p data-testid="selected-value">{selectedValue}</p>
|