@human-kit/svelte-components 1.0.0-alpha.2 → 1.0.0-alpha.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FOCUS_STATE_CONTRACT.md +63 -0
- package/dist/FOCUS_STATE_REVIEW_TEMPLATE.md +70 -0
- package/dist/button/README.md +48 -0
- package/dist/button/TODO.md +13 -0
- package/dist/button/index.d.ts +5 -0
- package/dist/button/index.js +4 -0
- package/dist/button/index.parts.d.ts +1 -0
- package/dist/button/index.parts.js +1 -0
- package/dist/button/root/README.md +43 -0
- package/dist/button/root/button-root.svelte +362 -0
- package/dist/button/root/button-root.svelte.d.ts +21 -0
- package/dist/button/root/button-test.svelte +76 -0
- package/dist/button/root/button-test.svelte.d.ts +11 -0
- package/dist/calendar/README.md +2 -1
- package/dist/calendar/TODO.md +21 -107
- package/dist/calendar/body-cell/README.md +15 -0
- package/dist/calendar/body-cell/calendar-body-cell.svelte +116 -41
- package/dist/calendar/grid/README.md +13 -0
- package/dist/calendar/grid-body/README.md +13 -0
- package/dist/calendar/grid-header/README.md +13 -0
- package/dist/calendar/header-cell/README.md +14 -0
- package/dist/calendar/heading/README.md +13 -0
- package/dist/calendar/index.d.ts +3 -3
- package/dist/calendar/index.js +3 -3
- package/dist/calendar/root/README.md +24 -0
- package/dist/calendar/root/calendar-root-test.svelte +4 -0
- package/dist/calendar/root/calendar-root-test.svelte.d.ts +1 -0
- package/dist/calendar/root/calendar-root.svelte +3 -0
- package/dist/calendar/root/calendar-root.svelte.d.ts +1 -0
- package/dist/calendar/root/context.d.ts +4 -0
- package/dist/calendar/root/context.js +28 -25
- package/dist/calendar/root/date-utils.d.ts +1 -1
- package/dist/calendar/root/date-utils.js +16 -26
- package/dist/calendar/trigger-next/README.md +14 -0
- package/dist/calendar/trigger-next/calendar-trigger-next.svelte +9 -4
- package/dist/calendar/trigger-next/calendar-trigger-next.svelte.d.ts +2 -1
- package/dist/calendar/trigger-previous/README.md +14 -0
- package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte +9 -4
- package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte.d.ts +2 -1
- package/dist/checkbox/README.md +53 -0
- package/dist/checkbox/TODO.md +16 -0
- package/dist/checkbox/index.d.ts +6 -0
- package/dist/checkbox/index.js +6 -0
- package/dist/checkbox/index.parts.d.ts +2 -0
- package/dist/checkbox/index.parts.js +2 -0
- package/dist/checkbox/indicator/README.md +23 -0
- package/dist/checkbox/indicator/checkbox-indicator.svelte +43 -0
- package/dist/checkbox/indicator/checkbox-indicator.svelte.d.ts +10 -0
- package/dist/checkbox/root/README.md +47 -0
- package/dist/checkbox/root/checkbox-label-test.svelte +10 -0
- package/dist/checkbox/root/checkbox-label-test.svelte.d.ts +18 -0
- package/dist/checkbox/root/checkbox-root.svelte +386 -0
- package/dist/checkbox/root/checkbox-root.svelte.d.ts +29 -0
- package/dist/checkbox/root/checkbox-test.svelte +59 -0
- package/dist/checkbox/root/checkbox-test.svelte.d.ts +18 -0
- package/dist/checkbox/root/context.d.ts +21 -0
- package/dist/checkbox/root/context.js +15 -0
- package/dist/clock/README.md +75 -0
- package/dist/clock/axis/README.md +24 -0
- package/dist/clock/axis/clock-axis.svelte +37 -0
- package/dist/clock/axis/clock-axis.svelte.d.ts +8 -0
- package/dist/clock/hooks/use-wheel-scroll.svelte.d.ts +16 -0
- package/dist/clock/hooks/use-wheel-scroll.svelte.js +336 -0
- package/dist/clock/index.d.ts +10 -0
- package/dist/clock/index.js +10 -0
- package/dist/clock/index.parts.d.ts +4 -0
- package/dist/clock/index.parts.js +4 -0
- package/dist/clock/root/README.md +38 -0
- package/dist/clock/root/clock-root-test.svelte +62 -0
- package/dist/clock/root/clock-root-test.svelte.d.ts +14 -0
- package/dist/clock/root/clock-root.svelte +329 -0
- package/dist/clock/root/clock-root.svelte.d.ts +25 -0
- package/dist/clock/root/context.d.ts +22 -0
- package/dist/clock/root/context.js +15 -0
- package/dist/clock/root/resolve-visible-columns.d.ts +7 -0
- package/dist/clock/root/resolve-visible-columns.js +16 -0
- package/dist/clock/root/time-utils.d.ts +48 -0
- package/dist/clock/root/time-utils.js +314 -0
- package/dist/clock/root/wheel-options.d.ts +17 -0
- package/dist/clock/root/wheel-options.js +63 -0
- package/dist/clock/wheel-column/README.md +25 -0
- package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte +16 -0
- package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte.d.ts +3 -0
- package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte +29 -0
- package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte.d.ts +6 -0
- package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte +11 -0
- package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte.d.ts +3 -0
- package/dist/clock/wheel-column/clock-wheel-column-test.svelte +38 -0
- package/dist/clock/wheel-column/clock-wheel-column-test.svelte.d.ts +12 -0
- package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte +38 -0
- package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte.d.ts +12 -0
- package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte +29 -0
- package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte.d.ts +6 -0
- package/dist/clock/wheel-column/clock-wheel-column.svelte +499 -0
- package/dist/clock/wheel-column/clock-wheel-column.svelte.d.ts +17 -0
- package/dist/clock/wheel-item/README.md +17 -0
- package/dist/clock/wheel-item/clock-wheel-item.svelte +49 -0
- package/dist/clock/wheel-item/clock-wheel-item.svelte.d.ts +17 -0
- package/dist/combobox/README.md +8 -2
- package/dist/combobox/TODO.md +28 -175
- package/dist/combobox/button/README.md +8 -3
- package/dist/combobox/button/combobox-button-test.svelte +27 -0
- package/dist/combobox/button/combobox-button-test.svelte.d.ts +6 -0
- package/dist/combobox/button/combobox-button.svelte +10 -11
- package/dist/combobox/clear/README.md +21 -0
- package/dist/combobox/clear/combobox-clear-test.svelte +34 -0
- package/dist/combobox/clear/combobox-clear-test.svelte.d.ts +3 -0
- package/dist/combobox/clear/combobox-clear.svelte +61 -0
- package/dist/combobox/clear/combobox-clear.svelte.d.ts +9 -0
- package/dist/combobox/index.d.ts +5 -3
- package/dist/combobox/index.js +5 -3
- package/dist/combobox/index.parts.d.ts +2 -0
- package/dist/combobox/index.parts.js +2 -0
- package/dist/combobox/input/combobox-input.svelte +44 -12
- package/dist/combobox/item/combobox-item-implicit-text-test.svelte +1 -1
- package/dist/combobox/item/combobox-listboxitem.svelte +14 -11
- package/dist/combobox/item-indicator/combobox-item-indicator.svelte +4 -15
- package/dist/combobox/list/combobox-listbox.svelte +1 -0
- package/dist/combobox/list/combobox-listbox.svelte.d.ts +2 -1
- package/dist/combobox/popover/README.md +18 -4
- package/dist/combobox/popover/combobox-popover-props-test.svelte +38 -0
- package/dist/combobox/popover/combobox-popover-props-test.svelte.d.ts +11 -0
- package/dist/combobox/popover/combobox-popover.svelte +166 -23
- package/dist/combobox/popover/combobox-popover.svelte.d.ts +3 -3
- package/dist/combobox/popover/combobox-scrollable-list-test.svelte +23 -0
- package/dist/combobox/popover/combobox-scrollable-list-test.svelte.d.ts +18 -0
- package/dist/combobox/root/README.md +1 -0
- package/dist/combobox/root/combobox-multiselect-test.svelte +5 -3
- package/dist/combobox/root/combobox-multiselect-test.svelte.d.ts +1 -0
- package/dist/combobox/root/combobox-numeric-string-id-test.svelte +1 -1
- package/dist/combobox/root/combobox-test.svelte +23 -4
- package/dist/combobox/root/combobox-test.svelte.d.ts +2 -0
- package/dist/combobox/root/combobox.svelte +119 -13
- package/dist/combobox/root/combobox.svelte.d.ts +1 -0
- package/dist/combobox/root/context.d.ts +19 -1
- package/dist/combobox/tag-remove/combobox-tag-remove.svelte +3 -2
- package/dist/combobox/trigger/README.md +21 -0
- package/dist/combobox/trigger/combobox-trigger.svelte +56 -0
- package/dist/combobox/trigger/combobox-trigger.svelte.d.ts +9 -0
- package/dist/datepicker/README.md +100 -0
- package/dist/datepicker/TODO.md +28 -0
- package/dist/datepicker/calendar/README.md +19 -0
- package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte +60 -0
- package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte.d.ts +3 -0
- package/dist/datepicker/calendar/date-picker-calendar.svelte +65 -0
- package/dist/datepicker/calendar/date-picker-calendar.svelte.d.ts +10 -0
- package/dist/datepicker/index.d.ts +18 -0
- package/dist/datepicker/index.js +18 -0
- package/dist/datepicker/index.parts.d.ts +14 -0
- package/dist/datepicker/index.parts.js +14 -0
- package/dist/datepicker/input/README.md +15 -0
- package/dist/datepicker/input/date-picker-input.svelte +108 -0
- package/dist/datepicker/input/date-picker-input.svelte.d.ts +11 -0
- package/dist/datepicker/internal/strict-props.d.ts +2 -0
- package/dist/datepicker/internal/strict-props.js +28 -0
- package/dist/datepicker/popover/README.md +20 -0
- package/dist/datepicker/popover/date-picker-popover-handler-test.svelte +57 -0
- package/dist/datepicker/popover/date-picker-popover-handler-test.svelte.d.ts +3 -0
- package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte +45 -0
- package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte.d.ts +18 -0
- package/dist/datepicker/popover/date-picker-popover.svelte +87 -0
- package/dist/datepicker/popover/date-picker-popover.svelte.d.ts +7 -0
- package/dist/datepicker/root/README.md +38 -0
- package/dist/datepicker/root/context.d.ts +43 -0
- package/dist/datepicker/root/context.js +15 -0
- package/dist/datepicker/root/date-picker-bindable-empty-test.svelte +24 -0
- package/dist/datepicker/root/date-picker-bindable-empty-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-bindable-test.svelte +41 -0
- package/dist/datepicker/root/date-picker-bindable-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-empty-test.svelte +47 -0
- package/dist/datepicker/root/date-picker-empty-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-locale-typing-test.svelte +47 -0
- package/dist/datepicker/root/date-picker-locale-typing-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-open-cancel-test.svelte +54 -0
- package/dist/datepicker/root/date-picker-open-cancel-test.svelte.d.ts +8 -0
- package/dist/datepicker/root/date-picker-root.svelte +495 -0
- package/dist/datepicker/root/date-picker-root.svelte.d.ts +24 -0
- package/dist/datepicker/root/date-picker-test.svelte +86 -0
- package/dist/datepicker/root/date-picker-test.svelte.d.ts +13 -0
- package/dist/datepicker/root/date-utils.d.ts +17 -0
- package/dist/datepicker/root/date-utils.js +138 -0
- package/dist/datepicker/root/draft-evaluation.d.ts +13 -0
- package/dist/datepicker/root/draft-evaluation.js +56 -0
- package/dist/datepicker/root/focus-controller.d.ts +3 -0
- package/dist/datepicker/root/focus-controller.js +15 -0
- package/dist/datepicker/root/open-change.d.ts +5 -0
- package/dist/datepicker/root/open-change.js +13 -0
- package/dist/datepicker/root/open-controller.d.ts +7 -0
- package/dist/datepicker/root/open-controller.js +15 -0
- package/dist/datepicker/root/segment-controller.d.ts +8 -0
- package/dist/datepicker/root/segment-controller.js +53 -0
- package/dist/datepicker/root/segment-state.d.ts +18 -0
- package/dist/datepicker/root/segment-state.js +134 -0
- package/dist/datepicker/root/value-commit.d.ts +4 -0
- package/dist/datepicker/root/value-commit.js +8 -0
- package/dist/datepicker/segment/README.md +14 -0
- package/dist/datepicker/segment/date-picker-segment.svelte +319 -0
- package/dist/datepicker/segment/date-picker-segment.svelte.d.ts +9 -0
- package/dist/datepicker/trigger/README.md +14 -0
- package/dist/datepicker/trigger/date-picker-trigger.svelte +110 -0
- package/dist/datepicker/trigger/date-picker-trigger.svelte.d.ts +9 -0
- package/dist/dialog/content/dialog-content.svelte +6 -6
- package/dist/dialog/index.d.ts +3 -3
- package/dist/dialog/index.js +2 -2
- package/dist/dialog/root/context.d.ts +2 -1
- package/dist/dialog/root/dialog-root.svelte +9 -2
- package/dist/hooks/use-virtual-focus.svelte.js +3 -1
- package/dist/index.d.ts +31 -17
- package/dist/index.js +31 -17
- package/dist/input/README.md +38 -0
- package/dist/input/TODO.md +12 -0
- package/dist/input/input-test.svelte +43 -0
- package/dist/input/input-test.svelte.d.ts +12 -0
- package/dist/input/input.svelte +151 -7
- package/dist/input/input.svelte.d.ts +8 -2
- package/dist/listbox/index.d.ts +3 -3
- package/dist/listbox/index.js +3 -3
- package/dist/listbox/item/README.md +2 -1
- package/dist/listbox/item/listbox-item.svelte +260 -6
- package/dist/listbox/item/listbox-item.svelte.d.ts +6 -0
- package/dist/listbox/root/context.d.ts +6 -0
- package/dist/listbox/root/context.js +23 -13
- package/dist/listbox/root/listbox-test.svelte +14 -2
- package/dist/listbox/root/listbox-test.svelte.d.ts +1 -0
- package/dist/listbox/root/listbox.svelte +49 -2
- package/dist/listbox/root/listbox.svelte.d.ts +4 -2
- package/dist/popover/README.md +10 -0
- package/dist/popover/content/README.md +11 -0
- package/dist/popover/content/popover-content-standalone-test.svelte +28 -0
- package/dist/popover/content/popover-content-standalone-test.svelte.d.ts +6 -0
- package/dist/popover/content/popover-content-test.svelte +32 -2
- package/dist/popover/content/popover-content-test.svelte.d.ts +3 -1
- package/dist/popover/content/popover-content.svelte +277 -24
- package/dist/popover/content/popover-content.svelte.d.ts +5 -1
- package/dist/popover/index.d.ts +3 -3
- package/dist/popover/index.js +3 -5
- package/dist/popover/root/README.md +10 -15
- package/dist/popover/root/context.d.ts +16 -7
- package/dist/popover/root/context.js +0 -2
- package/dist/popover/root/focus-state.d.ts +4 -0
- package/dist/popover/root/focus-state.js +33 -0
- package/dist/popover/root/popover-root.svelte +90 -17
- package/dist/popover/root/popover-root.svelte.d.ts +2 -1
- package/dist/popover/root/popover-test.svelte +2 -1
- package/dist/popover/root/popover-test.svelte.d.ts +2 -1
- package/dist/popover/trigger/popover-trigger-button.svelte +8 -7
- package/dist/popover/trigger/popover-trigger.svelte +14 -5
- package/dist/portal/portal.svelte +3 -1
- package/dist/primitives/click-outside.d.ts +1 -1
- package/dist/primitives/click-outside.js +1 -1
- package/dist/primitives/floating.js +12 -4
- package/dist/primitives/focus-trap.d.ts +7 -2
- package/dist/primitives/focus-trap.js +50 -17
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/index.js +1 -0
- package/dist/primitives/input-modality.d.ts +7 -0
- package/dist/primitives/input-modality.js +125 -0
- package/dist/primitives/keyboard-navigation.d.ts +1 -0
- package/dist/primitives/keyboard-navigation.js +17 -0
- package/dist/table/IMPLEMENTATION_NOTES.md +9 -0
- package/dist/table/PLAN-HIDDEN-COLUMNS.md +152 -0
- package/dist/table/PLAN.md +1336 -0
- package/dist/table/README.md +143 -0
- package/dist/table/SELECTION_CHECKBOX_PLAN.md +234 -0
- package/dist/table/TODO.md +138 -0
- package/dist/table/body/README.md +26 -0
- package/dist/table/body/table-body.svelte +24 -0
- package/dist/table/body/table-body.svelte.d.ts +4 -0
- package/dist/table/cell/README.md +27 -0
- package/dist/table/cell/table-cell.svelte +265 -0
- package/dist/table/cell/table-cell.svelte.d.ts +4 -0
- package/dist/table/checkbox/README.md +40 -0
- package/dist/table/checkbox/table-checkbox-test.svelte +128 -0
- package/dist/table/checkbox/table-checkbox-test.svelte.d.ts +18 -0
- package/dist/table/checkbox/table-checkbox.svelte +235 -0
- package/dist/table/checkbox/table-checkbox.svelte.d.ts +4 -0
- package/dist/table/checkbox-indicator/README.md +31 -0
- package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte +15 -0
- package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte.d.ts +4 -0
- package/dist/table/column/README.md +36 -0
- package/dist/table/column/table-column.svelte +79 -0
- package/dist/table/column/table-column.svelte.d.ts +4 -0
- package/dist/table/column-header-cell/README.md +30 -0
- package/dist/table/column-header-cell/table-column-header-cell.svelte +271 -0
- package/dist/table/column-header-cell/table-column-header-cell.svelte.d.ts +4 -0
- package/dist/table/column-resizer/README.md +33 -0
- package/dist/table/column-resizer/table-column-resizer-fixed-width-test.svelte +57 -0
- package/dist/table/column-resizer/table-column-resizer-fixed-width-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte +52 -0
- package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-narrow-min-width-test.svelte +76 -0
- package/dist/table/column-resizer/table-column-resizer-narrow-min-width-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-overflow-test.svelte +64 -0
- package/dist/table/column-resizer/table-column-resizer-overflow-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-padded-container-test.svelte +67 -0
- package/dist/table/column-resizer/table-column-resizer-padded-container-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-sandbox-overflow-test.svelte +87 -0
- package/dist/table/column-resizer/table-column-resizer-sandbox-overflow-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte +84 -0
- package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-test.svelte +77 -0
- package/dist/table/column-resizer/table-column-resizer-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer-three-column-relative-test.svelte +64 -0
- package/dist/table/column-resizer/table-column-resizer-three-column-relative-test.svelte.d.ts +3 -0
- package/dist/table/column-resizer/table-column-resizer.svelte +610 -0
- package/dist/table/column-resizer/table-column-resizer.svelte.d.ts +4 -0
- package/dist/table/empty-state/README.md +27 -0
- package/dist/table/empty-state/table-empty-state.svelte +33 -0
- package/dist/table/empty-state/table-empty-state.svelte.d.ts +4 -0
- package/dist/table/footer/README.md +26 -0
- package/dist/table/footer/table-footer.svelte +13 -0
- package/dist/table/footer/table-footer.svelte.d.ts +4 -0
- package/dist/table/header/README.md +26 -0
- package/dist/table/header/table-header.svelte +13 -0
- package/dist/table/header/table-header.svelte.d.ts +4 -0
- package/dist/table/index.d.ts +18 -0
- package/dist/table/index.js +17 -0
- package/dist/table/index.parts.d.ts +13 -0
- package/dist/table/index.parts.js +13 -0
- package/dist/table/root/README.md +66 -0
- package/dist/table/root/context.d.ts +228 -0
- package/dist/table/root/context.js +2111 -0
- package/dist/table/root/table-reorder-test.svelte +64 -0
- package/dist/table/root/table-reorder-test.svelte.d.ts +3 -0
- package/dist/table/root/table-root.svelte +553 -0
- package/dist/table/root/table-root.svelte.d.ts +4 -0
- package/dist/table/root/table-test.svelte +206 -0
- package/dist/table/root/table-test.svelte.d.ts +29 -0
- package/dist/table/row/README.md +29 -0
- package/dist/table/row/table-row.svelte +244 -0
- package/dist/table/row/table-row.svelte.d.ts +4 -0
- package/dist/table/sort-trigger/README.md +45 -0
- package/dist/table/sort-trigger/table-sort-trigger.svelte +183 -0
- package/dist/table/sort-trigger/table-sort-trigger.svelte.d.ts +4 -0
- package/dist/table/types.d.ts +95 -0
- package/dist/table/types.js +1 -0
- package/dist/table/utils/handle-body-keydown.d.ts +13 -0
- package/dist/table/utils/handle-body-keydown.js +67 -0
- package/dist/table/utils/visually-hidden-style.d.ts +1 -0
- package/dist/table/utils/visually-hidden-style.js +1 -0
- package/dist/test-utils/focus-contract.d.ts +3 -0
- package/dist/test-utils/focus-contract.js +26 -0
- package/dist/timepicker/IMPLEMENTATION_PLAN.md +254 -0
- package/dist/timepicker/README.md +97 -0
- package/dist/timepicker/TODO.md +86 -0
- package/dist/timepicker/clock/README.md +14 -0
- package/dist/timepicker/clock/time-picker-clock-test.svelte +45 -0
- package/dist/timepicker/clock/time-picker-clock-test.svelte.d.ts +11 -0
- package/dist/timepicker/clock/time-picker-clock.svelte +65 -0
- package/dist/timepicker/clock/time-picker-clock.svelte.d.ts +10 -0
- package/dist/timepicker/index.d.ts +14 -0
- package/dist/timepicker/index.js +14 -0
- package/dist/timepicker/index.parts.d.ts +8 -0
- package/dist/timepicker/index.parts.js +8 -0
- package/dist/timepicker/input/README.md +15 -0
- package/dist/timepicker/input/time-picker-input-forwarding-test.svelte +40 -0
- package/dist/timepicker/input/time-picker-input-forwarding-test.svelte.d.ts +3 -0
- package/dist/timepicker/input/time-picker-input.svelte +109 -0
- package/dist/timepicker/input/time-picker-input.svelte.d.ts +11 -0
- package/dist/timepicker/internal/strict-props.d.ts +4 -0
- package/dist/timepicker/internal/strict-props.js +51 -0
- package/dist/timepicker/popover/README.md +20 -0
- package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte +22 -0
- package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte.d.ts +3 -0
- package/dist/timepicker/popover/time-picker-popover.svelte +89 -0
- package/dist/timepicker/popover/time-picker-popover.svelte.d.ts +7 -0
- package/dist/timepicker/root/README.md +42 -0
- package/dist/timepicker/root/context.d.ts +51 -0
- package/dist/timepicker/root/context.js +15 -0
- package/dist/timepicker/root/time-picker-12h-test.svelte +22 -0
- package/dist/timepicker/root/time-picker-12h-test.svelte.d.ts +3 -0
- package/dist/timepicker/root/time-picker-bindable-test.svelte +25 -0
- package/dist/timepicker/root/time-picker-bindable-test.svelte.d.ts +3 -0
- package/dist/timepicker/root/time-picker-empty-test.svelte +20 -0
- package/dist/timepicker/root/time-picker-empty-test.svelte.d.ts +3 -0
- package/dist/timepicker/root/time-picker-root.svelte +625 -0
- package/dist/timepicker/root/time-picker-root.svelte.d.ts +28 -0
- package/dist/timepicker/root/time-picker-test.svelte +72 -0
- package/dist/timepicker/root/time-picker-test.svelte.d.ts +15 -0
- package/dist/timepicker/root/time-utils.d.ts +1 -0
- package/dist/timepicker/root/time-utils.js +3 -0
- package/dist/timepicker/segment/README.md +14 -0
- package/dist/timepicker/segment/time-picker-segment.svelte +365 -0
- package/dist/timepicker/segment/time-picker-segment.svelte.d.ts +9 -0
- package/dist/timepicker/trigger/README.md +14 -0
- package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte +35 -0
- package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte.d.ts +3 -0
- package/dist/timepicker/trigger/time-picker-trigger.svelte +122 -0
- package/dist/timepicker/trigger/time-picker-trigger.svelte.d.ts +9 -0
- package/dist/utils/date-only.d.ts +11 -0
- package/dist/utils/date-only.js +53 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/package.json +31 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Table.CheckboxIndicator
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### Indicator Part
|
|
6
|
+
|
|
7
|
+
Name: `Table.CheckboxIndicator`
|
|
8
|
+
Description: Headless presence wrapper for indicator content inside `Table.Checkbox`. It renders when the checkbox is checked or indeterminate.
|
|
9
|
+
|
|
10
|
+
Public prop type: `TableCheckboxIndicatorProps`
|
|
11
|
+
|
|
12
|
+
| Prop | Type | Default | Description |
|
|
13
|
+
| -------------- | --------------------------------- | ----------- | ------------------------------------------------------------------------------- |
|
|
14
|
+
| `keepMounted` | `boolean` | `false` | Keeps the indicator mounted while hidden when the checkbox is unchecked. |
|
|
15
|
+
| `children` | `Snippet` | `undefined` | Rendered indicator content, such as a check icon or dash icon. |
|
|
16
|
+
| `class` | `string` | `''` | CSS class names for the indicator wrapper. |
|
|
17
|
+
| `...restProps` | `HTMLAttributes<HTMLSpanElement>` | `-` | Additional native attributes forwarded to the composed checkbox indicator span. |
|
|
18
|
+
|
|
19
|
+
## Usage notes
|
|
20
|
+
|
|
21
|
+
- Use `Table.CheckboxIndicator` inside `Table.Checkbox`.
|
|
22
|
+
- The part is headless and unstyled.
|
|
23
|
+
- It mirrors the visibility behavior of `Checkbox.Indicator` and renders for checked and indeterminate states.
|
|
24
|
+
|
|
25
|
+
```svelte
|
|
26
|
+
<Table.Checkbox class="inline-flex h-5 w-5 items-center justify-center rounded border">
|
|
27
|
+
<Table.CheckboxIndicator>
|
|
28
|
+
<CheckIcon class="h-3.5 w-3.5" />
|
|
29
|
+
</Table.CheckboxIndicator>
|
|
30
|
+
</Table.Checkbox>
|
|
31
|
+
```
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Checkbox } from '../../checkbox';
|
|
3
|
+
import type { TableCheckboxIndicatorProps } from '../types.js';
|
|
4
|
+
|
|
5
|
+
let {
|
|
6
|
+
keepMounted = false,
|
|
7
|
+
children,
|
|
8
|
+
class: className = '',
|
|
9
|
+
...restProps
|
|
10
|
+
}: TableCheckboxIndicatorProps = $props();
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<Checkbox.Indicator {keepMounted} class={className} {...restProps}>
|
|
14
|
+
{@render children?.()}
|
|
15
|
+
</Checkbox.Indicator>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { TableCheckboxIndicatorProps } from '../types.js';
|
|
2
|
+
declare const TableCheckboxIndicator: import("svelte").Component<TableCheckboxIndicatorProps, {}, "">;
|
|
3
|
+
type TableCheckboxIndicator = ReturnType<typeof TableCheckboxIndicator>;
|
|
4
|
+
export default TableCheckboxIndicator;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<!-- markdownlint-disable MD024 MD060 -->
|
|
2
|
+
|
|
3
|
+
# Table.Column
|
|
4
|
+
|
|
5
|
+
## API reference
|
|
6
|
+
|
|
7
|
+
### Table.Column
|
|
8
|
+
|
|
9
|
+
Name: `Table.Column`
|
|
10
|
+
Description: Logical metadata wrapper for a header column. It does not render DOM and is used to register stable column identity, row-header semantics, and width constraints.
|
|
11
|
+
|
|
12
|
+
Public prop type: `TableColumnProps`
|
|
13
|
+
|
|
14
|
+
| Prop | Type | Default | Description |
|
|
15
|
+
| -------------- | --------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------- |
|
|
16
|
+
| `id` | `string` | `-` | Stable identifier for the column. |
|
|
17
|
+
| `isRowHeader` | `boolean` | `false` | Marks the associated body column as row-header cells. |
|
|
18
|
+
| `textValue` | `string` | `undefined` | Optional spoken label used by `Table.Root` sort announcements when it should differ from `id`. |
|
|
19
|
+
| `width` | `number \| \`${number}px\`` | `undefined` | Fixed column width. When set, the column keeps that width and user resize interactions are disabled. |
|
|
20
|
+
| `defaultWidth` | `number \| \`${number}px\`` | `undefined` | Uncontrolled initial width hint for the column. The column remains user-resizable when a resizer is composed. |
|
|
21
|
+
| `minWidth` | `number` | `undefined` | Minimum width in px enforced during resize interactions. |
|
|
22
|
+
| `maxWidth` | `number` | `undefined` | Maximum width in px enforced during resize interactions. |
|
|
23
|
+
| `children` | `Snippet` | `undefined` | Usually a single `Table.ColumnHeaderCell`. |
|
|
24
|
+
|
|
25
|
+
`Table.SortTrigger` is the public sorting opt-in. Compose it inside `Table.ColumnHeaderCell` when the owning column should be sortable.
|
|
26
|
+
|
|
27
|
+
`Table.ColumnResizer` is the public resize opt-in. Compose it inside `Table.ColumnHeaderCell` when the owning column should be resizable.
|
|
28
|
+
|
|
29
|
+
### Context utilities
|
|
30
|
+
|
|
31
|
+
Name: `Table.Column` column context
|
|
32
|
+
Description: Provides column metadata to `Table.ColumnHeaderCell`.
|
|
33
|
+
|
|
34
|
+
| Prop | Type | Default | Description |
|
|
35
|
+
| ----------------------- | -------------------------- | ------- | -------------------------------------------------------------------- |
|
|
36
|
+
| `useTableColumnContext` | `() => TableColumnContext` | `-` | Reads the current column metadata and throws outside `Table.Column`. |
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onDestroy } from 'svelte';
|
|
3
|
+
import { setTableColumnContext, useTableContext, useTableSectionContext } from '../root/context';
|
|
4
|
+
import type { TableColumnProps } from '../types.js';
|
|
5
|
+
|
|
6
|
+
let {
|
|
7
|
+
id,
|
|
8
|
+
isRowHeader = false,
|
|
9
|
+
textValue,
|
|
10
|
+
width,
|
|
11
|
+
defaultWidth,
|
|
12
|
+
minWidth,
|
|
13
|
+
maxWidth,
|
|
14
|
+
children
|
|
15
|
+
}: TableColumnProps = $props();
|
|
16
|
+
|
|
17
|
+
const table = useTableContext();
|
|
18
|
+
const section = useTableSectionContext();
|
|
19
|
+
const token = table.createInstanceToken('column');
|
|
20
|
+
|
|
21
|
+
if (section.section !== 'header') {
|
|
22
|
+
throw new Error('`Table.Column` must be used inside `Table.Header`.');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
setTableColumnContext({
|
|
26
|
+
token,
|
|
27
|
+
get id() {
|
|
28
|
+
return id;
|
|
29
|
+
},
|
|
30
|
+
get isHidden() {
|
|
31
|
+
return table.isColumnHidden(id);
|
|
32
|
+
},
|
|
33
|
+
get isRowHeader() {
|
|
34
|
+
return isRowHeader;
|
|
35
|
+
},
|
|
36
|
+
get textValue() {
|
|
37
|
+
return textValue;
|
|
38
|
+
},
|
|
39
|
+
get width() {
|
|
40
|
+
return width;
|
|
41
|
+
},
|
|
42
|
+
get defaultWidth() {
|
|
43
|
+
return defaultWidth;
|
|
44
|
+
},
|
|
45
|
+
get minWidth() {
|
|
46
|
+
return minWidth;
|
|
47
|
+
},
|
|
48
|
+
get maxWidth() {
|
|
49
|
+
return maxWidth;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
function syncColumnRegistration() {
|
|
54
|
+
table.registerColumn({
|
|
55
|
+
token,
|
|
56
|
+
id,
|
|
57
|
+
isRowHeader,
|
|
58
|
+
textValue,
|
|
59
|
+
width,
|
|
60
|
+
defaultWidth,
|
|
61
|
+
minWidth,
|
|
62
|
+
maxWidth
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
syncColumnRegistration();
|
|
67
|
+
|
|
68
|
+
$effect(() => {
|
|
69
|
+
syncColumnRegistration();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
onDestroy(() => {
|
|
73
|
+
table.unregisterColumn(token);
|
|
74
|
+
});
|
|
75
|
+
</script>
|
|
76
|
+
|
|
77
|
+
{#if children}
|
|
78
|
+
{@render children()}
|
|
79
|
+
{/if}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<!-- markdownlint-disable MD024 -->
|
|
2
|
+
|
|
3
|
+
# Table.ColumnHeaderCell
|
|
4
|
+
|
|
5
|
+
## API reference
|
|
6
|
+
|
|
7
|
+
### Table.ColumnHeaderCell
|
|
8
|
+
|
|
9
|
+
Name: `Table.ColumnHeaderCell`
|
|
10
|
+
Description: Focusable header cell for a column. It participates in roving focus, exposes `aria-sort` when a nested `Table.SortTrigger` is present, and can host additional header actions.
|
|
11
|
+
|
|
12
|
+
Public prop type: `TableColumnHeaderCellProps`
|
|
13
|
+
|
|
14
|
+
- When a nested control like `Table.ColumnResizer` receives focus, the header exposes `data-focus-within` / `data-focus-visible-within` instead of remaining `data-focused`.
|
|
15
|
+
|
|
16
|
+
| Prop | Type | Default | Description |
|
|
17
|
+
| ---------- | --------- | ----------- | --------------------------------- |
|
|
18
|
+
| `class` | `string` | `''` | Class names for the `th` element. |
|
|
19
|
+
| `children` | `Snippet` | `undefined` | Header content. |
|
|
20
|
+
|
|
21
|
+
### Context utilities
|
|
22
|
+
|
|
23
|
+
Name: `Table.ColumnHeaderCell` dependencies
|
|
24
|
+
Description: Consumes both column and row context to register a navigable header cell.
|
|
25
|
+
|
|
26
|
+
| Prop | Type | Default | Description |
|
|
27
|
+
| ----------------------- | -------------------------- | ------- | ------------------------------------ |
|
|
28
|
+
| `useTableColumnContext` | `() => TableColumnContext` | `-` | Reads current column metadata. |
|
|
29
|
+
| `useTableRowContext` | `() => TableRowContext` | `-` | Reads the current row token. |
|
|
30
|
+
| `useTableContext` | `() => TableContext` | `-` | Reads table focus and sorting state. |
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onDestroy } from 'svelte';
|
|
3
|
+
import {
|
|
4
|
+
setTableCellContext,
|
|
5
|
+
useTableColumnContext,
|
|
6
|
+
useTableContext,
|
|
7
|
+
useTableRowContext
|
|
8
|
+
} from '../root/context';
|
|
9
|
+
import type { TableColumnHeaderCellProps } from '../types.js';
|
|
10
|
+
import {
|
|
11
|
+
shouldShowFocusVisible,
|
|
12
|
+
trackInteractionModality
|
|
13
|
+
} from '../../primitives/input-modality';
|
|
14
|
+
|
|
15
|
+
let { children, class: className = '', ...restProps }: TableColumnHeaderCellProps = $props();
|
|
16
|
+
|
|
17
|
+
const table = useTableContext();
|
|
18
|
+
const column = useTableColumnContext();
|
|
19
|
+
const row = useTableRowContext();
|
|
20
|
+
const key = table.createInstanceToken('header-cell');
|
|
21
|
+
const focusVersion = table.focusVersion;
|
|
22
|
+
const layoutVersion = table.layoutVersion;
|
|
23
|
+
const sortVersion = table.sortVersion;
|
|
24
|
+
const widthVersion = table.widthVersion;
|
|
25
|
+
|
|
26
|
+
let element = $state<HTMLElement | undefined>(undefined);
|
|
27
|
+
let focusDelegate = $state<(() => HTMLElement | undefined) | undefined>(undefined);
|
|
28
|
+
let isElementFocused = $state(false);
|
|
29
|
+
let isElementFocusVisible = $state(false);
|
|
30
|
+
let isFocusWithin = $state(false);
|
|
31
|
+
let isFocusVisibleWithin = $state(false);
|
|
32
|
+
row.registerCellToken(key, () => element);
|
|
33
|
+
function syncHeaderCellRegistration() {
|
|
34
|
+
table.registerCell({
|
|
35
|
+
key,
|
|
36
|
+
rowToken: row.rowToken,
|
|
37
|
+
section: 'header',
|
|
38
|
+
columnToken: column.token,
|
|
39
|
+
element,
|
|
40
|
+
focusDelegate
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function registerFocusDelegate(getElement: () => HTMLElement | undefined) {
|
|
45
|
+
focusDelegate = getElement;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function unregisterFocusDelegate() {
|
|
49
|
+
focusDelegate = undefined;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function notifyResizerPresent() {
|
|
53
|
+
// No-op. Header cells now always provide the positioning context that
|
|
54
|
+
// column resizers need so the handle is available in SSR HTML too.
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function notifyResizerRemoved() {
|
|
58
|
+
// No-op. See notifyResizerPresent().
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
setTableCellContext({
|
|
62
|
+
cellKey: key,
|
|
63
|
+
registerFocusDelegate,
|
|
64
|
+
unregisterFocusDelegate,
|
|
65
|
+
notifyResizerPresent,
|
|
66
|
+
notifyResizerRemoved
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
syncHeaderCellRegistration();
|
|
70
|
+
|
|
71
|
+
$effect(() => {
|
|
72
|
+
syncHeaderCellRegistration();
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
onDestroy(() => {
|
|
76
|
+
row.unregisterCellToken(key);
|
|
77
|
+
table.unregisterCell(key);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const isFocused = $derived.by(() => {
|
|
81
|
+
void $focusVersion;
|
|
82
|
+
return table.isCellFocused(key) && isElementFocused;
|
|
83
|
+
});
|
|
84
|
+
const isFocusVisible = $derived.by(() => {
|
|
85
|
+
void $focusVersion;
|
|
86
|
+
return isFocused && isElementFocusVisible;
|
|
87
|
+
});
|
|
88
|
+
const sortDirection = $derived.by(() => {
|
|
89
|
+
void $sortVersion;
|
|
90
|
+
return table.getSortDirection(column.id);
|
|
91
|
+
});
|
|
92
|
+
const isHidden = $derived.by(() => {
|
|
93
|
+
void $layoutVersion;
|
|
94
|
+
return column.isHidden;
|
|
95
|
+
});
|
|
96
|
+
const columnWidthStyle = $derived.by(() => {
|
|
97
|
+
void $widthVersion;
|
|
98
|
+
return table.getColumnWidthStyle(column.id);
|
|
99
|
+
});
|
|
100
|
+
const columnMinWidth = $derived.by(() => {
|
|
101
|
+
void $widthVersion;
|
|
102
|
+
return table.getColumnMinWidth(column.id);
|
|
103
|
+
});
|
|
104
|
+
const columnMaxWidth = $derived.by(() => {
|
|
105
|
+
void $widthVersion;
|
|
106
|
+
return table.getColumnMaxWidth(column.id);
|
|
107
|
+
});
|
|
108
|
+
const visibleColumnIndex = $derived.by(() => {
|
|
109
|
+
void $layoutVersion;
|
|
110
|
+
return table.getVisibleColumnIndexByToken(column.token);
|
|
111
|
+
});
|
|
112
|
+
const isSortable = $derived.by(() => {
|
|
113
|
+
void $layoutVersion;
|
|
114
|
+
void $sortVersion;
|
|
115
|
+
return table.isColumnSortable(column.id);
|
|
116
|
+
});
|
|
117
|
+
const headerTabIndex = $derived.by(() => {
|
|
118
|
+
if (isHidden || focusDelegate) return undefined;
|
|
119
|
+
return table.isCellTabStop(key) ? 0 : -1;
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
function focusResizerInHeader(target: HTMLElement | undefined) {
|
|
123
|
+
const resizer = target?.querySelector<HTMLElement>('[data-table-column-resizer="true"]');
|
|
124
|
+
if (!resizer) return false;
|
|
125
|
+
resizer.focus();
|
|
126
|
+
return document.activeElement === resizer;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function getSiblingHeaderCell(direction: 'left' | 'right') {
|
|
130
|
+
const headerRow = element?.closest('tr');
|
|
131
|
+
if (!headerRow || !element) return null;
|
|
132
|
+
|
|
133
|
+
const headerCells = Array.from(
|
|
134
|
+
headerRow.querySelectorAll<HTMLElement>('th[role="columnheader"]')
|
|
135
|
+
);
|
|
136
|
+
const currentIndex = headerCells.indexOf(element);
|
|
137
|
+
if (currentIndex < 0) return null;
|
|
138
|
+
|
|
139
|
+
return headerCells[currentIndex + (direction === 'left' ? -1 : 1)] ?? null;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function moveFocusIntoResizeHandle(direction: 'left' | 'right') {
|
|
143
|
+
if (direction === 'right') {
|
|
144
|
+
return focusResizerInHeader(element);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return focusResizerInHeader(getSiblingHeaderCell('left') ?? undefined);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function handleFocus() {
|
|
151
|
+
isElementFocused = true;
|
|
152
|
+
isElementFocusVisible = shouldShowFocusVisible(element ?? null);
|
|
153
|
+
table.setFocusedCell(key);
|
|
154
|
+
table.setFocusVisible(isElementFocusVisible);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function handleBlur() {
|
|
158
|
+
isElementFocused = false;
|
|
159
|
+
isElementFocusVisible = false;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function handleFocusIn(event: FocusEvent) {
|
|
163
|
+
if (event.target === element) {
|
|
164
|
+
isFocusWithin = false;
|
|
165
|
+
isFocusVisibleWithin = false;
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
isFocusWithin = true;
|
|
169
|
+
isFocusVisibleWithin = shouldShowFocusVisible(event.target as HTMLElement | null);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function handleFocusOut(event: FocusEvent) {
|
|
173
|
+
const nextFocused = event.relatedTarget;
|
|
174
|
+
if (nextFocused instanceof Node && element?.contains(nextFocused)) return;
|
|
175
|
+
isFocusWithin = false;
|
|
176
|
+
isFocusVisibleWithin = false;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function handleClick() {
|
|
180
|
+
table.focusCellByKey(key);
|
|
181
|
+
table.consumeHeaderClickSuppression();
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function handleMouseDown(event: MouseEvent) {
|
|
185
|
+
trackInteractionModality(event, element ?? null);
|
|
186
|
+
isElementFocusVisible = false;
|
|
187
|
+
isFocusVisibleWithin = false;
|
|
188
|
+
table.setFocusVisible(false);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function handleKeyDown(event: KeyboardEvent) {
|
|
192
|
+
trackInteractionModality(event, element ?? null);
|
|
193
|
+
|
|
194
|
+
if ((event.ctrlKey || event.metaKey) && event.key === 'Home') {
|
|
195
|
+
event.preventDefault();
|
|
196
|
+
table.moveToGridStart();
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if ((event.ctrlKey || event.metaKey) && event.key === 'End') {
|
|
201
|
+
event.preventDefault();
|
|
202
|
+
table.moveToGridEnd();
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
switch (event.key) {
|
|
207
|
+
case 'ArrowUp':
|
|
208
|
+
event.preventDefault();
|
|
209
|
+
table.moveFocus('up');
|
|
210
|
+
return;
|
|
211
|
+
case 'ArrowDown':
|
|
212
|
+
event.preventDefault();
|
|
213
|
+
table.moveFocus('down');
|
|
214
|
+
return;
|
|
215
|
+
case 'ArrowLeft':
|
|
216
|
+
event.preventDefault();
|
|
217
|
+
if (moveFocusIntoResizeHandle('left')) return;
|
|
218
|
+
table.moveFocus('left');
|
|
219
|
+
return;
|
|
220
|
+
case 'ArrowRight':
|
|
221
|
+
event.preventDefault();
|
|
222
|
+
if (moveFocusIntoResizeHandle('right')) return;
|
|
223
|
+
table.moveFocus('right');
|
|
224
|
+
return;
|
|
225
|
+
case 'Home':
|
|
226
|
+
event.preventDefault();
|
|
227
|
+
table.moveToRowStart();
|
|
228
|
+
return;
|
|
229
|
+
case 'End':
|
|
230
|
+
event.preventDefault();
|
|
231
|
+
table.moveToRowEnd();
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
</script>
|
|
236
|
+
|
|
237
|
+
<th
|
|
238
|
+
bind:this={element}
|
|
239
|
+
role="columnheader"
|
|
240
|
+
class={className}
|
|
241
|
+
tabindex={headerTabIndex}
|
|
242
|
+
aria-colindex={!isHidden && visibleColumnIndex >= 0 ? visibleColumnIndex + 1 : undefined}
|
|
243
|
+
aria-hidden={isHidden ? true : undefined}
|
|
244
|
+
aria-sort={isSortable ? (sortDirection ?? 'none') : undefined}
|
|
245
|
+
data-focused={isFocused ? 'true' : undefined}
|
|
246
|
+
data-focus-visible={isFocusVisible ? 'true' : undefined}
|
|
247
|
+
data-focus-within={isFocusWithin ? 'true' : undefined}
|
|
248
|
+
data-focus-visible-within={isFocusVisibleWithin ? 'true' : undefined}
|
|
249
|
+
data-sortable={isSortable || undefined}
|
|
250
|
+
data-sort-direction={sortDirection}
|
|
251
|
+
data-column-index={visibleColumnIndex >= 0 ? visibleColumnIndex : undefined}
|
|
252
|
+
style:box-sizing="border-box"
|
|
253
|
+
style:position="relative"
|
|
254
|
+
style:overflow="visible"
|
|
255
|
+
style:width={columnWidthStyle}
|
|
256
|
+
style:min-width={columnMinWidth !== undefined ? `${columnMinWidth}px` : undefined}
|
|
257
|
+
style:max-width={columnMaxWidth !== undefined ? `${columnMaxWidth}px` : undefined}
|
|
258
|
+
style:display={isHidden ? 'none' : 'table-cell'}
|
|
259
|
+
onfocusin={handleFocusIn}
|
|
260
|
+
onfocusout={handleFocusOut}
|
|
261
|
+
onfocus={handleFocus}
|
|
262
|
+
onblur={handleBlur}
|
|
263
|
+
onclick={handleClick}
|
|
264
|
+
onmousedown={handleMouseDown}
|
|
265
|
+
onkeydown={handleKeyDown}
|
|
266
|
+
{...restProps}
|
|
267
|
+
>
|
|
268
|
+
{#if children}
|
|
269
|
+
{@render children()}
|
|
270
|
+
{/if}
|
|
271
|
+
</th>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { TableColumnHeaderCellProps } from '../types.js';
|
|
2
|
+
declare const TableColumnHeaderCell: import("svelte").Component<TableColumnHeaderCellProps, {}, "">;
|
|
3
|
+
type TableColumnHeaderCell = ReturnType<typeof TableColumnHeaderCell>;
|
|
4
|
+
export default TableColumnHeaderCell;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<!-- markdownlint-disable MD024 MD060 -->
|
|
2
|
+
|
|
3
|
+
# Table.ColumnResizer
|
|
4
|
+
|
|
5
|
+
## API reference
|
|
6
|
+
|
|
7
|
+
### Table.ColumnResizer
|
|
8
|
+
|
|
9
|
+
Name: `Table.ColumnResizer`
|
|
10
|
+
Description: Interactive resize handle for the current `Table.Column`. It must be composed inside `Table.ColumnHeaderCell`, and it resizes the column that owns the surrounding `Table.Column` context.
|
|
11
|
+
|
|
12
|
+
Public prop type: `TableColumnResizerProps`
|
|
13
|
+
|
|
14
|
+
| Prop | Type | Default | Description |
|
|
15
|
+
| ----------- | --------- | ----------- | -------------------------------------------------------------------- |
|
|
16
|
+
| `step` | `number` | `16` | Keyboard resize delta in px for `ArrowLeft` / `ArrowRight`. |
|
|
17
|
+
| `shiftStep` | `number` | `48` | Larger keyboard resize delta in px for `Shift+ArrowLeft/ArrowRight`. |
|
|
18
|
+
| `class` | `string` | `''` | Class names for the resize handle element. |
|
|
19
|
+
| `children` | `Snippet` | `undefined` | Optional custom resize affordance content. |
|
|
20
|
+
|
|
21
|
+
## Usage notes
|
|
22
|
+
|
|
23
|
+
- `Table.ColumnResizer` must be used inside `Table.ColumnHeaderCell`.
|
|
24
|
+
- Rendering `Table.ColumnResizer` inside `Table.ColumnHeaderCell` is enough to make the owning `Table.Column` resizable.
|
|
25
|
+
- The handle resolves the active column from `Table.Column` context. It does not accept a separate `columnId` prop.
|
|
26
|
+
- Width state lives in `Table.Root` through `columnWidths` / `defaultColumnWidths`.
|
|
27
|
+
- Pointer resizing uses Pointer Events, so mouse, touch, and pen interactions share the same behavior.
|
|
28
|
+
- Keyboard resizing uses an explicit resize mode: focus the handle, press `Enter` to capture resize, use `ArrowLeft` / `ArrowRight` (plus `Shift`) to adjust the width, `Home` to jump to the minimum width, and `End` to auto-fit the column to its content width, then press `Enter` again to commit the width and keep focus on the handle.
|
|
29
|
+
- While keyboard resize mode is active, pressing `Escape` restores the starting width, exits resize mode, and returns focus to the owning header cell.
|
|
30
|
+
- Keyboard resizing uses the same resize lifecycle callbacks as pointer resizing and announces committed widths through a polite live region.
|
|
31
|
+
- During pointer drag, pressing `Escape` restores the starting width and cancels the resize interaction.
|
|
32
|
+
- Double-click still auto-fits the column to its content width.
|
|
33
|
+
- In RTL layouts, `ArrowLeft` and `ArrowRight` are inverted so the logical resize direction matches the visual layout.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Table } from '../index';
|
|
3
|
+
import type { TableColumnWidth } from '../root/context';
|
|
4
|
+
|
|
5
|
+
let currentColumnWidths = $state<Map<string, TableColumnWidth>>(new Map());
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<Table.Root aria-label="Fixed width table" bind:columnWidths={currentColumnWidths}>
|
|
9
|
+
<Table.Header>
|
|
10
|
+
<Table.Row>
|
|
11
|
+
<Table.Column
|
|
12
|
+
id="email"
|
|
13
|
+
isRowHeader
|
|
14
|
+
textValue="Email"
|
|
15
|
+
width={220}
|
|
16
|
+
minWidth={220}
|
|
17
|
+
maxWidth={220}
|
|
18
|
+
>
|
|
19
|
+
<Table.ColumnHeaderCell>
|
|
20
|
+
<div class="flex items-center justify-between gap-3">
|
|
21
|
+
<span>Email</span>
|
|
22
|
+
<Table.ColumnResizer
|
|
23
|
+
data-testid="fixed-email-resizer"
|
|
24
|
+
class="inline-flex w-3 cursor-col-resize justify-center"
|
|
25
|
+
/>
|
|
26
|
+
</div>
|
|
27
|
+
</Table.ColumnHeaderCell>
|
|
28
|
+
</Table.Column>
|
|
29
|
+
<Table.Column id="role" textValue="Role" defaultWidth={180} minWidth={120}>
|
|
30
|
+
<Table.ColumnHeaderCell>
|
|
31
|
+
<div class="flex items-center justify-between gap-3">
|
|
32
|
+
<span>Role</span>
|
|
33
|
+
<Table.ColumnResizer
|
|
34
|
+
data-testid="role-resizer"
|
|
35
|
+
class="inline-flex w-3 cursor-col-resize justify-center"
|
|
36
|
+
/>
|
|
37
|
+
</div>
|
|
38
|
+
</Table.ColumnHeaderCell>
|
|
39
|
+
</Table.Column>
|
|
40
|
+
</Table.Row>
|
|
41
|
+
</Table.Header>
|
|
42
|
+
|
|
43
|
+
<Table.Body>
|
|
44
|
+
<Table.Row id="danilo">
|
|
45
|
+
<Table.Cell>danilo.fernandez+workspace-owner@example.com</Table.Cell>
|
|
46
|
+
<Table.Cell>Developer</Table.Cell>
|
|
47
|
+
</Table.Row>
|
|
48
|
+
<Table.Row id="zahra">
|
|
49
|
+
<Table.Cell>zahra@example.com</Table.Cell>
|
|
50
|
+
<Table.Cell>Admin</Table.Cell>
|
|
51
|
+
</Table.Row>
|
|
52
|
+
</Table.Body>
|
|
53
|
+
</Table.Root>
|
|
54
|
+
|
|
55
|
+
<output data-testid="column-widths"
|
|
56
|
+
>{JSON.stringify(Object.fromEntries(currentColumnWidths))}</output
|
|
57
|
+
>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Table } from '../index';
|
|
3
|
+
import type { TableColumnWidth } from '../root/context';
|
|
4
|
+
|
|
5
|
+
let currentColumnWidths = $state<Map<string, TableColumnWidth> | undefined>(undefined);
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<div style="width: 640px;">
|
|
9
|
+
<Table.Root
|
|
10
|
+
aria-label="Freeze layout table"
|
|
11
|
+
bind:columnWidths={currentColumnWidths}
|
|
12
|
+
class="min-w-full border-collapse text-left"
|
|
13
|
+
>
|
|
14
|
+
<Table.Header>
|
|
15
|
+
<Table.Row>
|
|
16
|
+
<Table.Column id="email" isRowHeader textValue="Email" minWidth={80}>
|
|
17
|
+
<Table.ColumnHeaderCell>
|
|
18
|
+
<div class="flex items-center justify-between gap-3">
|
|
19
|
+
<span>Email address</span>
|
|
20
|
+
<Table.ColumnResizer
|
|
21
|
+
data-testid="freeze-email-resizer"
|
|
22
|
+
class="inline-flex w-3 cursor-col-resize justify-center"
|
|
23
|
+
/>
|
|
24
|
+
</div>
|
|
25
|
+
</Table.ColumnHeaderCell>
|
|
26
|
+
</Table.Column>
|
|
27
|
+
<Table.Column id="group" textValue="Group" minWidth={80}>
|
|
28
|
+
<Table.ColumnHeaderCell>
|
|
29
|
+
<div class="flex items-center justify-between gap-3">
|
|
30
|
+
<span>Group membership</span>
|
|
31
|
+
<Table.ColumnResizer
|
|
32
|
+
data-testid="freeze-group-resizer"
|
|
33
|
+
class="inline-flex w-3 cursor-col-resize justify-center"
|
|
34
|
+
/>
|
|
35
|
+
</div>
|
|
36
|
+
</Table.ColumnHeaderCell>
|
|
37
|
+
</Table.Column>
|
|
38
|
+
</Table.Row>
|
|
39
|
+
</Table.Header>
|
|
40
|
+
|
|
41
|
+
<Table.Body>
|
|
42
|
+
<Table.Row id="danilo">
|
|
43
|
+
<Table.Cell>danilo@example.com</Table.Cell>
|
|
44
|
+
<Table.Cell>Developer relations</Table.Cell>
|
|
45
|
+
</Table.Row>
|
|
46
|
+
</Table.Body>
|
|
47
|
+
</Table.Root>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<output data-testid="freeze-column-widths"
|
|
51
|
+
>{JSON.stringify(Object.fromEntries(currentColumnWidths ?? new Map()))}</output
|
|
52
|
+
>
|