@human-kit/svelte-components 1.0.0-alpha.2 → 1.0.0-alpha.21
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 +393 -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/dialog/trigger/dialog-trigger.svelte +3 -0
- 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-controlled-close-test.svelte +30 -0
- package/dist/popover/content/popover-content-controlled-close-test.svelte.d.ts +3 -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 +315 -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-root-test.svelte +17 -0
- package/dist/popover/trigger/popover-trigger-button-root-test.svelte.d.ts +18 -0
- package/dist/popover/trigger/popover-trigger-button.svelte +9 -7
- package/dist/popover/trigger/popover-trigger.svelte +17 -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 +39 -0
- package/dist/table/body/table-body-items-test.svelte +45 -0
- package/dist/table/body/table-body-items-test.svelte.d.ts +18 -0
- package/dist/table/body/table-body.svelte +171 -0
- package/dist/table/body/table-body.svelte.d.ts +45 -0
- package/dist/table/cell/README.md +27 -0
- package/dist/table/cell/table-cell.svelte +253 -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 +170 -0
- package/dist/table/checkbox/table-checkbox-test.svelte.d.ts +22 -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 +233 -0
- package/dist/table/root/context.js +2153 -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 +561 -0
- package/dist/table/root/table-root.svelte.d.ts +4 -0
- package/dist/table/root/table-ssr-wrapper-column.svelte +48 -0
- package/dist/table/root/table-ssr-wrapper-column.svelte.d.ts +4 -0
- package/dist/table/root/table-ssr-wrapper-context.d.ts +11 -0
- package/dist/table/root/table-ssr-wrapper-context.js +13 -0
- package/dist/table/root/table-ssr-wrapper-test.svelte +57 -0
- package/dist/table/root/table-ssr-wrapper-test.svelte.d.ts +3 -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 +112 -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 +33 -2
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
type CalendarRootProps = {
|
|
35
35
|
selectionMode?: CalendarSelectionMode;
|
|
36
36
|
visibleMonths?: number;
|
|
37
|
+
showOutsideDays?: boolean;
|
|
37
38
|
isDateUnavailable?: (date: string) => boolean;
|
|
38
39
|
isDisabled?: boolean;
|
|
39
40
|
isReadOnly?: boolean;
|
|
@@ -62,6 +63,7 @@
|
|
|
62
63
|
let {
|
|
63
64
|
selectionMode = 'single',
|
|
64
65
|
visibleMonths = 1,
|
|
66
|
+
showOutsideDays = false,
|
|
65
67
|
isDateUnavailable,
|
|
66
68
|
isDisabled = false,
|
|
67
69
|
isReadOnly = false,
|
|
@@ -100,6 +102,7 @@
|
|
|
100
102
|
return {
|
|
101
103
|
selectionMode,
|
|
102
104
|
visibleMonths,
|
|
105
|
+
showOutsideDays,
|
|
103
106
|
locale: resolvedLocale,
|
|
104
107
|
isDateUnavailable,
|
|
105
108
|
isDisabled,
|
|
@@ -4,6 +4,7 @@ import { type CalendarDateValue } from './date-utils';
|
|
|
4
4
|
type CalendarRootProps = {
|
|
5
5
|
selectionMode?: CalendarSelectionMode;
|
|
6
6
|
visibleMonths?: number;
|
|
7
|
+
showOutsideDays?: boolean;
|
|
7
8
|
isDateUnavailable?: (date: string) => boolean;
|
|
8
9
|
isDisabled?: boolean;
|
|
9
10
|
isReadOnly?: boolean;
|
|
@@ -16,6 +16,7 @@ export type CalendarMonth = {
|
|
|
16
16
|
export type CreateCalendarContextOptions<TSelectionMode extends CalendarSelectionMode = CalendarSelectionMode> = {
|
|
17
17
|
selectionMode?: TSelectionMode;
|
|
18
18
|
visibleMonths?: number;
|
|
19
|
+
showOutsideDays?: boolean;
|
|
19
20
|
locale?: string;
|
|
20
21
|
isDisabled?: boolean;
|
|
21
22
|
isReadOnly?: boolean;
|
|
@@ -31,12 +32,14 @@ export type CalendarContext = {
|
|
|
31
32
|
selectionMode: CalendarSelectionMode;
|
|
32
33
|
firstDayOfWeek: number;
|
|
33
34
|
visibleMonths: number;
|
|
35
|
+
showOutsideDays: boolean;
|
|
34
36
|
isDisabled: boolean;
|
|
35
37
|
isReadOnly: boolean;
|
|
36
38
|
months: CalendarMonth[];
|
|
37
39
|
selectedValue: CalendarDateValue | undefined;
|
|
38
40
|
rangeValue: CalendarRangeValue | undefined;
|
|
39
41
|
focusedValue: CalendarDateValue;
|
|
42
|
+
focusVisible: boolean;
|
|
40
43
|
weekdayLabels: string[];
|
|
41
44
|
headingLabel: string;
|
|
42
45
|
isSelected: (date: CalendarDateValue) => boolean;
|
|
@@ -47,6 +50,7 @@ export type CalendarContext = {
|
|
|
47
50
|
isDateDisabled: (date: CalendarDateValue) => boolean;
|
|
48
51
|
isOutsideVisibleRange: (date: CalendarDateValue, monthIndex: number) => boolean;
|
|
49
52
|
setFocusedValue: (date: CalendarDateValue) => void;
|
|
53
|
+
setFocusVisible: (visible: boolean) => void;
|
|
50
54
|
setHoveredValue: (date: CalendarDateValue | undefined) => void;
|
|
51
55
|
selectDate: (date: CalendarDateValue) => void;
|
|
52
56
|
goToNextPage: () => void;
|
|
@@ -2,9 +2,8 @@ import { getContext, setContext } from 'svelte';
|
|
|
2
2
|
import { writable } from 'svelte/store';
|
|
3
3
|
import { addDays, addMonths, buildMonthGrid, compareDates, formatCalendarDate, formatMonthHeading, getFirstDayOfWeek, getTodayUtcDate, getWeekdayLabels, isValidCalendarDateValue, parseCalendarDate, startOfMonth } from './date-utils';
|
|
4
4
|
const KEY = Symbol('calendar');
|
|
5
|
-
const MAX_FOCUS_SEARCH_DAYS = 370;
|
|
6
5
|
export function createCalendarContext(options) {
|
|
7
|
-
let { selectionMode = 'single', visibleMonths = 1, locale = Intl.DateTimeFormat().resolvedOptions().locale, isDisabled = false, isReadOnly = false, isDateUnavailable, onChange } = options;
|
|
6
|
+
let { selectionMode = 'single', visibleMonths = 1, showOutsideDays = false, locale = Intl.DateTimeFormat().resolvedOptions().locale, isDisabled = false, isReadOnly = false, isDateUnavailable, onChange } = options;
|
|
8
7
|
const { value, defaultValue } = options;
|
|
9
8
|
function isRangeValue(valueToCheck) {
|
|
10
9
|
if (!valueToCheck || typeof valueToCheck === 'string')
|
|
@@ -85,6 +84,7 @@ export function createCalendarContext(options) {
|
|
|
85
84
|
initialRangeSelected?.end ??
|
|
86
85
|
initialRangeSelected?.start ??
|
|
87
86
|
fallbackToday;
|
|
87
|
+
let currentFocusVisible = false;
|
|
88
88
|
let currentVisibleMonth = startOfMonth(parseCalendarDate(currentFocused) ?? getTodayUtcDate());
|
|
89
89
|
let cachedMonths = [];
|
|
90
90
|
let hasCachedMonths = false;
|
|
@@ -93,6 +93,7 @@ export function createCalendarContext(options) {
|
|
|
93
93
|
let pendingRangePathCacheStart;
|
|
94
94
|
let previousUnavailableFn = isDateUnavailable;
|
|
95
95
|
let previousVisibleMonths = visibleMonths;
|
|
96
|
+
let previousShowOutsideDays = showOutsideDays;
|
|
96
97
|
let previousLocale = locale;
|
|
97
98
|
let cachedFirstDayOfWeek = getFirstDayOfWeek(locale);
|
|
98
99
|
const layoutVersion = writable(0);
|
|
@@ -133,16 +134,19 @@ export function createCalendarContext(options) {
|
|
|
133
134
|
let shouldNotifySelection = false;
|
|
134
135
|
const nextSelectionMode = next.selectionMode ?? 'single';
|
|
135
136
|
const nextVisibleMonths = Math.max(1, next.visibleMonths ?? 1);
|
|
137
|
+
const nextShowOutsideDays = next.showOutsideDays ?? false;
|
|
136
138
|
const nextLocale = next.locale ?? Intl.DateTimeFormat().resolvedOptions().locale;
|
|
137
139
|
const nextUnavailableFn = next.isDateUnavailable;
|
|
138
140
|
if (nextUnavailableFn !== previousUnavailableFn ||
|
|
139
141
|
nextVisibleMonths !== previousVisibleMonths ||
|
|
142
|
+
nextShowOutsideDays !== previousShowOutsideDays ||
|
|
140
143
|
nextLocale !== previousLocale) {
|
|
141
144
|
clearUnavailableCache();
|
|
142
145
|
shouldNotifyLayout = true;
|
|
143
146
|
}
|
|
144
147
|
previousUnavailableFn = nextUnavailableFn;
|
|
145
148
|
previousVisibleMonths = nextVisibleMonths;
|
|
149
|
+
previousShowOutsideDays = nextShowOutsideDays;
|
|
146
150
|
previousLocale = nextLocale;
|
|
147
151
|
if (selectionMode !== nextSelectionMode) {
|
|
148
152
|
selectionMode = nextSelectionMode;
|
|
@@ -157,6 +161,7 @@ export function createCalendarContext(options) {
|
|
|
157
161
|
shouldNotifyLayout = true;
|
|
158
162
|
}
|
|
159
163
|
visibleMonths = nextVisibleMonths;
|
|
164
|
+
showOutsideDays = nextShowOutsideDays;
|
|
160
165
|
locale = nextLocale;
|
|
161
166
|
cachedFirstDayOfWeek = getFirstDayOfWeek(locale);
|
|
162
167
|
if (isDisabled !== (next.isDisabled ?? false) || isReadOnly !== (next.isReadOnly ?? false)) {
|
|
@@ -312,7 +317,7 @@ export function createCalendarContext(options) {
|
|
|
312
317
|
monthIndex,
|
|
313
318
|
monthStart,
|
|
314
319
|
heading: formatMonthHeading(monthStart, locale),
|
|
315
|
-
weeks: buildMonthGrid(monthStart, firstDayOfWeek)
|
|
320
|
+
weeks: buildMonthGrid(monthStart, firstDayOfWeek, showOutsideDays)
|
|
316
321
|
};
|
|
317
322
|
});
|
|
318
323
|
hasCachedMonths = true;
|
|
@@ -359,7 +364,7 @@ export function createCalendarContext(options) {
|
|
|
359
364
|
return result;
|
|
360
365
|
}
|
|
361
366
|
function isDateDisabled(date) {
|
|
362
|
-
if (isDisabled
|
|
367
|
+
if (isDisabled)
|
|
363
368
|
return true;
|
|
364
369
|
if (selectionMode === 'range' && currentRangeStart && !currentRangeEnd) {
|
|
365
370
|
return !isPendingRangePathSelectable(date);
|
|
@@ -386,6 +391,12 @@ export function createCalendarContext(options) {
|
|
|
386
391
|
}
|
|
387
392
|
notifySelection();
|
|
388
393
|
}
|
|
394
|
+
function setFocusVisible(visible) {
|
|
395
|
+
if (currentFocusVisible === visible)
|
|
396
|
+
return;
|
|
397
|
+
currentFocusVisible = visible;
|
|
398
|
+
notifySelection();
|
|
399
|
+
}
|
|
389
400
|
function setHoveredValue(date) {
|
|
390
401
|
if (selectionMode !== 'range')
|
|
391
402
|
return;
|
|
@@ -514,7 +525,7 @@ export function createCalendarContext(options) {
|
|
|
514
525
|
return undefined;
|
|
515
526
|
const next = addDays(parsed, amount);
|
|
516
527
|
const nextValue = formatCalendarDate(next);
|
|
517
|
-
const focusableValue = findFocusableDate(nextValue
|
|
528
|
+
const focusableValue = findFocusableDate(nextValue);
|
|
518
529
|
if (!focusableValue)
|
|
519
530
|
return undefined;
|
|
520
531
|
setFocusedValue(focusableValue);
|
|
@@ -526,8 +537,7 @@ export function createCalendarContext(options) {
|
|
|
526
537
|
return undefined;
|
|
527
538
|
const next = addMonths(parsed, amount);
|
|
528
539
|
const nextValue = formatCalendarDate(next);
|
|
529
|
-
const
|
|
530
|
-
const focusableValue = findFocusableDate(nextValue, dayStep);
|
|
540
|
+
const focusableValue = findFocusableDate(nextValue);
|
|
531
541
|
if (!focusableValue) {
|
|
532
542
|
if (selectionMode === 'range' && currentRangeStart && !currentRangeEnd) {
|
|
533
543
|
return moveToMonthEdge(baseDate, amount >= 0 ? 'end' : 'start');
|
|
@@ -545,33 +555,19 @@ export function createCalendarContext(options) {
|
|
|
545
555
|
const monthEnd = addDays(addMonths(monthStart, 1), -1);
|
|
546
556
|
const targetDate = edge === 'start' ? monthStart : monthEnd;
|
|
547
557
|
const nextValue = formatCalendarDate(targetDate);
|
|
548
|
-
const
|
|
549
|
-
const focusableValue = findFocusableDate(nextValue, dayStep);
|
|
558
|
+
const focusableValue = findFocusableDate(nextValue);
|
|
550
559
|
if (!focusableValue)
|
|
551
560
|
return undefined;
|
|
552
561
|
setFocusedValue(focusableValue);
|
|
553
562
|
return focusableValue;
|
|
554
563
|
}
|
|
555
|
-
function findFocusableDate(targetDate
|
|
564
|
+
function findFocusableDate(targetDate) {
|
|
556
565
|
if (isDisabled)
|
|
557
566
|
return undefined;
|
|
558
|
-
|
|
559
|
-
return targetDate;
|
|
560
|
-
if (dayStep === 0)
|
|
561
|
-
return undefined;
|
|
562
|
-
let current = parseCalendarDate(targetDate);
|
|
563
|
-
if (!current)
|
|
564
|
-
return undefined;
|
|
565
|
-
for (let index = 0; index < MAX_FOCUS_SEARCH_DAYS; index++) {
|
|
566
|
-
current = addDays(current, dayStep > 0 ? 1 : -1);
|
|
567
|
-
const candidate = formatCalendarDate(current);
|
|
568
|
-
if (!isDateDisabled(candidate)) {
|
|
569
|
-
return candidate;
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
return undefined;
|
|
567
|
+
return targetDate;
|
|
573
568
|
}
|
|
574
569
|
function handleCellKeydown(event, date) {
|
|
570
|
+
setFocusVisible(true);
|
|
575
571
|
const keyDate = isValidCalendarDateValue(currentFocused) ? currentFocused : date;
|
|
576
572
|
let movedDate;
|
|
577
573
|
function extendRangeWithKeyboard(nextDate) {
|
|
@@ -668,6 +664,9 @@ export function createCalendarContext(options) {
|
|
|
668
664
|
get visibleMonths() {
|
|
669
665
|
return visibleMonths;
|
|
670
666
|
},
|
|
667
|
+
get showOutsideDays() {
|
|
668
|
+
return showOutsideDays;
|
|
669
|
+
},
|
|
671
670
|
get isDisabled() {
|
|
672
671
|
return isDisabled;
|
|
673
672
|
},
|
|
@@ -686,6 +685,9 @@ export function createCalendarContext(options) {
|
|
|
686
685
|
get focusedValue() {
|
|
687
686
|
return currentFocused;
|
|
688
687
|
},
|
|
688
|
+
get focusVisible() {
|
|
689
|
+
return currentFocusVisible;
|
|
690
|
+
},
|
|
689
691
|
get weekdayLabels() {
|
|
690
692
|
return getWeekdayLabels(locale, cachedFirstDayOfWeek);
|
|
691
693
|
},
|
|
@@ -700,6 +702,7 @@ export function createCalendarContext(options) {
|
|
|
700
702
|
isDateDisabled,
|
|
701
703
|
isOutsideVisibleRange,
|
|
702
704
|
setFocusedValue,
|
|
705
|
+
setFocusVisible,
|
|
703
706
|
setHoveredValue,
|
|
704
707
|
selectDate,
|
|
705
708
|
goToNextPage,
|
|
@@ -13,5 +13,5 @@ export type CalendarDayCell = {
|
|
|
13
13
|
date: CalendarDateValue;
|
|
14
14
|
isOutsideMonth: boolean;
|
|
15
15
|
};
|
|
16
|
-
export declare function buildMonthGrid(monthStart: Date, firstDayOfWeek: number): CalendarDayCell[][];
|
|
16
|
+
export declare function buildMonthGrid(monthStart: Date, firstDayOfWeek: number, showOutsideDays?: boolean): CalendarDayCell[][];
|
|
17
17
|
export declare function formatMonthHeading(date: Date, locale: string): string;
|
|
@@ -1,43 +1,28 @@
|
|
|
1
|
-
|
|
1
|
+
import { createUtcDate, formatDateOnlyValue, isValidDateOnlyValue, parseDateOnlyValue } from '../../utils/date-only';
|
|
2
2
|
export function isValidCalendarDateValue(value) {
|
|
3
|
-
|
|
4
|
-
if (!match)
|
|
5
|
-
return false;
|
|
6
|
-
const year = Number(match[1]);
|
|
7
|
-
const month = Number(match[2]);
|
|
8
|
-
const day = Number(match[3]);
|
|
9
|
-
if (month < 1 || month > 12 || day < 1 || day > 31)
|
|
10
|
-
return false;
|
|
11
|
-
const date = new Date(Date.UTC(year, month - 1, day));
|
|
12
|
-
return (date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day);
|
|
3
|
+
return isValidDateOnlyValue(value);
|
|
13
4
|
}
|
|
14
5
|
export function parseCalendarDate(value) {
|
|
15
|
-
|
|
16
|
-
return null;
|
|
17
|
-
const [year, month, day] = value.split('-').map(Number);
|
|
18
|
-
return new Date(Date.UTC(year, month - 1, day));
|
|
6
|
+
return parseDateOnlyValue(value);
|
|
19
7
|
}
|
|
20
8
|
export function formatCalendarDate(date) {
|
|
21
|
-
|
|
22
|
-
const month = String(date.getUTCMonth() + 1).padStart(2, '0');
|
|
23
|
-
const day = String(date.getUTCDate()).padStart(2, '0');
|
|
24
|
-
return `${year}-${month}-${day}`;
|
|
9
|
+
return formatDateOnlyValue(date);
|
|
25
10
|
}
|
|
26
11
|
export function startOfMonth(date) {
|
|
27
|
-
return
|
|
12
|
+
return createUtcDate(date.getUTCFullYear(), date.getUTCMonth(), 1);
|
|
28
13
|
}
|
|
29
14
|
function getDaysInMonthUtc(year, monthIndex) {
|
|
30
|
-
return
|
|
15
|
+
return createUtcDate(year, monthIndex + 1, 0).getUTCDate();
|
|
31
16
|
}
|
|
32
17
|
export function addMonths(date, amount) {
|
|
33
18
|
const targetMonth = date.getUTCMonth() + amount;
|
|
34
19
|
const targetYear = date.getUTCFullYear() + Math.floor(targetMonth / 12);
|
|
35
20
|
const normalizedMonth = ((targetMonth % 12) + 12) % 12;
|
|
36
21
|
const targetDay = Math.min(date.getUTCDate(), getDaysInMonthUtc(targetYear, normalizedMonth));
|
|
37
|
-
return
|
|
22
|
+
return createUtcDate(targetYear, normalizedMonth, targetDay);
|
|
38
23
|
}
|
|
39
24
|
export function addDays(date, amount) {
|
|
40
|
-
return
|
|
25
|
+
return createUtcDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate() + amount);
|
|
41
26
|
}
|
|
42
27
|
export function compareDates(a, b) {
|
|
43
28
|
const at = a.getTime();
|
|
@@ -50,7 +35,7 @@ export function compareDates(a, b) {
|
|
|
50
35
|
}
|
|
51
36
|
export function getTodayUtcDate() {
|
|
52
37
|
const now = new Date();
|
|
53
|
-
return
|
|
38
|
+
return createUtcDate(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());
|
|
54
39
|
}
|
|
55
40
|
export function getFirstDayOfWeek(locale) {
|
|
56
41
|
try {
|
|
@@ -76,13 +61,18 @@ export function getWeekdayLabels(locale, firstDayOfWeek) {
|
|
|
76
61
|
return formatter.format(addDays(sunday, dayOffset));
|
|
77
62
|
});
|
|
78
63
|
}
|
|
79
|
-
export function buildMonthGrid(monthStart, firstDayOfWeek) {
|
|
64
|
+
export function buildMonthGrid(monthStart, firstDayOfWeek, showOutsideDays = true) {
|
|
80
65
|
const firstOfMonth = startOfMonth(monthStart);
|
|
81
66
|
const firstWeekday = firstOfMonth.getUTCDay();
|
|
82
67
|
const startOffset = (firstWeekday - firstDayOfWeek + 7) % 7;
|
|
83
68
|
const gridStart = addDays(firstOfMonth, -startOffset);
|
|
69
|
+
const lastOfMonth = addDays(addMonths(firstOfMonth, 1), -1);
|
|
70
|
+
const lastWeekday = lastOfMonth.getUTCDay();
|
|
71
|
+
const endOffset = (firstDayOfWeek + 6 - lastWeekday + 7) % 7;
|
|
72
|
+
const visibleDays = startOffset + lastOfMonth.getUTCDate() + endOffset;
|
|
73
|
+
const weekCount = showOutsideDays ? 6 : Math.max(1, Math.ceil(visibleDays / 7));
|
|
84
74
|
const weeks = [];
|
|
85
|
-
for (let weekIndex = 0; weekIndex <
|
|
75
|
+
for (let weekIndex = 0; weekIndex < weekCount; weekIndex++) {
|
|
86
76
|
const week = [];
|
|
87
77
|
for (let dayIndex = 0; dayIndex < 7; dayIndex++) {
|
|
88
78
|
const date = addDays(gridStart, weekIndex * 7 + dayIndex);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Calendar TriggerNext
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### Calendar.TriggerNext
|
|
6
|
+
|
|
7
|
+
Name: `Calendar.TriggerNext`
|
|
8
|
+
Description: Button part that advances the visible calendar period.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| -------------- | ---------------------- | ----------- | ------------------------------------------------------ |
|
|
12
|
+
| `children` | `Snippet` | `undefined` | Optional trigger content. |
|
|
13
|
+
| `class` | `string` | `''` | CSS class names for the trigger button. |
|
|
14
|
+
| `...restProps` | `HTMLButtonAttributes` | `-` | Additional button attributes forwarded to the trigger. |
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
4
|
+
import { ButtonRoot } from '../../button/index.js';
|
|
4
5
|
import { useCalendarContext } from '../root/context';
|
|
5
6
|
|
|
6
|
-
type CalendarTriggerNextProps = Omit<
|
|
7
|
+
type CalendarTriggerNextProps = Omit<
|
|
8
|
+
HTMLButtonAttributes,
|
|
9
|
+
'children' | 'class' | 'disabled' | 'aria-disabled'
|
|
10
|
+
> & {
|
|
11
|
+
class?: string;
|
|
7
12
|
children?: Snippet;
|
|
8
13
|
};
|
|
9
14
|
|
|
@@ -22,11 +27,11 @@
|
|
|
22
27
|
}
|
|
23
28
|
</script>
|
|
24
29
|
|
|
25
|
-
<
|
|
30
|
+
<ButtonRoot
|
|
26
31
|
type="button"
|
|
27
32
|
class={className}
|
|
28
33
|
aria-label="Next page"
|
|
29
|
-
|
|
34
|
+
{isDisabled}
|
|
30
35
|
onclick={handleClick}
|
|
31
36
|
{...restProps}
|
|
32
37
|
>
|
|
@@ -35,4 +40,4 @@
|
|
|
35
40
|
{:else}
|
|
36
41
|
Next
|
|
37
42
|
{/if}
|
|
38
|
-
</
|
|
43
|
+
</ButtonRoot>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
2
|
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
3
|
-
type CalendarTriggerNextProps = Omit<HTMLButtonAttributes, 'children'> & {
|
|
3
|
+
type CalendarTriggerNextProps = Omit<HTMLButtonAttributes, 'children' | 'class' | 'disabled' | 'aria-disabled'> & {
|
|
4
|
+
class?: string;
|
|
4
5
|
children?: Snippet;
|
|
5
6
|
};
|
|
6
7
|
declare const CalendarTriggerNext: import("svelte").Component<CalendarTriggerNextProps, {}, "">;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Calendar TriggerPrevious
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### Calendar.TriggerPrevious
|
|
6
|
+
|
|
7
|
+
Name: `Calendar.TriggerPrevious`
|
|
8
|
+
Description: Button part that moves the visible calendar period backward.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| -------------- | ---------------------- | ----------- | ------------------------------------------------------ |
|
|
12
|
+
| `children` | `Snippet` | `undefined` | Optional trigger content. |
|
|
13
|
+
| `class` | `string` | `''` | CSS class names for the trigger button. |
|
|
14
|
+
| `...restProps` | `HTMLButtonAttributes` | `-` | Additional button attributes forwarded to the trigger. |
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
4
|
+
import { ButtonRoot } from '../../button/index.js';
|
|
4
5
|
import { useCalendarContext } from '../root/context';
|
|
5
6
|
|
|
6
|
-
type CalendarTriggerPreviousProps = Omit<
|
|
7
|
+
type CalendarTriggerPreviousProps = Omit<
|
|
8
|
+
HTMLButtonAttributes,
|
|
9
|
+
'children' | 'class' | 'disabled' | 'aria-disabled'
|
|
10
|
+
> & {
|
|
11
|
+
class?: string;
|
|
7
12
|
children?: Snippet;
|
|
8
13
|
};
|
|
9
14
|
|
|
@@ -22,11 +27,11 @@
|
|
|
22
27
|
}
|
|
23
28
|
</script>
|
|
24
29
|
|
|
25
|
-
<
|
|
30
|
+
<ButtonRoot
|
|
26
31
|
type="button"
|
|
27
32
|
class={className}
|
|
28
33
|
aria-label="Previous page"
|
|
29
|
-
|
|
34
|
+
{isDisabled}
|
|
30
35
|
onclick={handleClick}
|
|
31
36
|
{...restProps}
|
|
32
37
|
>
|
|
@@ -35,4 +40,4 @@
|
|
|
35
40
|
{:else}
|
|
36
41
|
Prev
|
|
37
42
|
{/if}
|
|
38
|
-
</
|
|
43
|
+
</ButtonRoot>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
2
|
import type { HTMLButtonAttributes } from 'svelte/elements';
|
|
3
|
-
type CalendarTriggerPreviousProps = Omit<HTMLButtonAttributes, 'children'> & {
|
|
3
|
+
type CalendarTriggerPreviousProps = Omit<HTMLButtonAttributes, 'children' | 'class' | 'disabled' | 'aria-disabled'> & {
|
|
4
|
+
class?: string;
|
|
4
5
|
children?: Snippet;
|
|
5
6
|
};
|
|
6
7
|
declare const CalendarTriggerPrevious: import("svelte").Component<CalendarTriggerPreviousProps, {}, "">;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Checkbox
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
`Checkbox` is a composable tri-state checkbox with separate checked and indeterminate bindings, hidden input form support, and headless indicator rendering.
|
|
6
|
+
|
|
7
|
+
## Anatomy
|
|
8
|
+
|
|
9
|
+
- `Checkbox.Root`
|
|
10
|
+
- `Checkbox.Indicator`
|
|
11
|
+
|
|
12
|
+
```svelte
|
|
13
|
+
<Checkbox.Root aria-label="Accept terms">
|
|
14
|
+
<Checkbox.Indicator>
|
|
15
|
+
<CheckIcon />
|
|
16
|
+
</Checkbox.Indicator>
|
|
17
|
+
</Checkbox.Root>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Usage guidelines
|
|
21
|
+
|
|
22
|
+
- Use `isChecked` / `defaultChecked` for the checked state and `isIndeterminate` / `defaultIndeterminate` for the mixed state.
|
|
23
|
+
- `isIndeterminate` takes precedence over `isChecked`. When both are `true`, the checkbox is exposed as indeterminate.
|
|
24
|
+
- Use `value` only for form submission through the hidden native input; it does not represent the visual state.
|
|
25
|
+
- Wrap the checkbox in a native `<label>` for the simplest accessible labeling pattern.
|
|
26
|
+
|
|
27
|
+
## API reference
|
|
28
|
+
|
|
29
|
+
- `Checkbox.Root`
|
|
30
|
+
- `isChecked?: boolean`
|
|
31
|
+
- `defaultChecked?: boolean`
|
|
32
|
+
- `isIndeterminate?: boolean`
|
|
33
|
+
- `defaultIndeterminate?: boolean`
|
|
34
|
+
- `onCheckedChange?: (checked: boolean) => void`
|
|
35
|
+
- `onIndeterminateChange?: (indeterminate: boolean) => void`
|
|
36
|
+
- `isDisabled?: boolean`
|
|
37
|
+
- `isReadOnly?: boolean`
|
|
38
|
+
- `name?: string`
|
|
39
|
+
- `value?: string`
|
|
40
|
+
- `required?: boolean`
|
|
41
|
+
- `Checkbox.Indicator`
|
|
42
|
+
- `keepMounted?: boolean`
|
|
43
|
+
|
|
44
|
+
## Accessibility
|
|
45
|
+
|
|
46
|
+
- `Checkbox.Root` exposes `role="checkbox"` with `aria-checked="true" | "false" | "mixed"`.
|
|
47
|
+
- Press `Space` to toggle the checkbox.
|
|
48
|
+
- `isReadOnly` keeps the checkbox focusable while preventing state changes.
|
|
49
|
+
|
|
50
|
+
## Notes
|
|
51
|
+
|
|
52
|
+
- The first user toggle from the indeterminate state resolves to checked.
|
|
53
|
+
- A hidden checkbox input is kept in sync for form integration and `label[for]` support.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Checkbox TODO
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Track Checkbox work with a single mandatory TODO format.
|
|
6
|
+
|
|
7
|
+
## Backlog
|
|
8
|
+
|
|
9
|
+
- [x] [S][P0][Area: Architecture][Owner: Unassigned][Target: Done] Create base `root` and `indicator` parts with namespace exports.
|
|
10
|
+
- [x] [S][P0][Area: State][Owner: Unassigned][Target: Done] Implement checked, unchecked, and indeterminate state transitions.
|
|
11
|
+
- [x] [S][P0][Area: Accessibility][Owner: Unassigned][Target: Done] Add checkbox semantics, keyboard toggle, and readonly behavior.
|
|
12
|
+
- [x] [S][P0][Area: Forms][Owner: Unassigned][Target: Done] Sync a hidden native input for form submission and label targeting.
|
|
13
|
+
- [x] [S][P0][Area: Testing][Owner: Unassigned][Target: Done] Add baseline tests for root and indicator behavior.
|
|
14
|
+
- [ ] [S][P1][Area: API][Owner: Unassigned][Target: TBD] Add optional `nativeButton` rendering mode for sibling-label patterns.
|
|
15
|
+
- [ ] [S][P1][Area: Forms][Owner: Unassigned][Target: TBD] Support unchecked submission values and form reset synchronization.
|
|
16
|
+
- [ ] [C][P2][Area: Animation][Owner: Unassigned][Target: TBD] Add indicator presence data for enter and exit animations.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * as Checkbox from './index.parts.js';
|
|
2
|
+
export { default as CheckboxRoot } from './root/checkbox-root.svelte';
|
|
3
|
+
export { default as CheckboxIndicator } from './indicator/checkbox-indicator.svelte';
|
|
4
|
+
export { getCheckboxContext, setCheckboxContext, useCheckboxContext, type CheckboxContext, type CheckboxState } from './root/context.js';
|
|
5
|
+
import * as CheckboxParts from './index.parts.js';
|
|
6
|
+
export default CheckboxParts;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * as Checkbox from './index.parts.js';
|
|
2
|
+
export { default as CheckboxRoot } from './root/checkbox-root.svelte';
|
|
3
|
+
export { default as CheckboxIndicator } from './indicator/checkbox-indicator.svelte';
|
|
4
|
+
export { getCheckboxContext, setCheckboxContext, useCheckboxContext } from './root/context.js';
|
|
5
|
+
import * as CheckboxParts from './index.parts.js';
|
|
6
|
+
export default CheckboxParts;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Checkbox Indicator
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### Checkbox.Indicator
|
|
6
|
+
|
|
7
|
+
Name: `Checkbox.Indicator`
|
|
8
|
+
Description: Headless presence wrapper for checkbox indicator content. It renders when the checkbox is checked or indeterminate.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| -------------- | --------------------------------- | ----------- | ------------------------------------------------------------------------ |
|
|
12
|
+
| `keepMounted` | `boolean` | `false` | Keeps the indicator mounted while hidden when the checkbox is unchecked. |
|
|
13
|
+
| `children` | `Snippet` | `undefined` | Rendered indicator content, such as a check or dash icon. |
|
|
14
|
+
| `class` | `string` | `''` | CSS class names for the indicator wrapper. |
|
|
15
|
+
| `...restProps` | `HTMLAttributes<HTMLSpanElement>` | `-` | Additional attributes forwarded to the indicator span. |
|
|
16
|
+
|
|
17
|
+
```svelte
|
|
18
|
+
<Checkbox.Root aria-label="Select row">
|
|
19
|
+
<Checkbox.Indicator>
|
|
20
|
+
<CheckIcon />
|
|
21
|
+
</Checkbox.Indicator>
|
|
22
|
+
</Checkbox.Root>
|
|
23
|
+
```
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
import type { Snippet } from 'svelte';
|
|
4
|
+
import { cn } from '../../utils/cn';
|
|
5
|
+
import { useCheckboxContext } from '../root/context';
|
|
6
|
+
|
|
7
|
+
type CheckboxIndicatorProps = Omit<HTMLAttributes<HTMLSpanElement>, 'children' | 'class'> & {
|
|
8
|
+
keepMounted?: boolean;
|
|
9
|
+
children?: Snippet;
|
|
10
|
+
class?: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
let {
|
|
14
|
+
keepMounted = false,
|
|
15
|
+
children,
|
|
16
|
+
class: className = '',
|
|
17
|
+
...restProps
|
|
18
|
+
}: CheckboxIndicatorProps = $props();
|
|
19
|
+
|
|
20
|
+
const checkbox = useCheckboxContext();
|
|
21
|
+
const visible = $derived(checkbox.state !== 'unchecked');
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
{#if keepMounted || visible}
|
|
25
|
+
<span
|
|
26
|
+
{...restProps}
|
|
27
|
+
data-checkbox-indicator="true"
|
|
28
|
+
data-checked={checkbox.isChecked || undefined}
|
|
29
|
+
data-unchecked={checkbox.state === 'unchecked' || undefined}
|
|
30
|
+
data-indeterminate={checkbox.isIndeterminate || undefined}
|
|
31
|
+
data-pressed={checkbox.pressed || undefined}
|
|
32
|
+
data-disabled={checkbox.isDisabled || undefined}
|
|
33
|
+
data-readonly={checkbox.isReadOnly || undefined}
|
|
34
|
+
data-required={checkbox.required || undefined}
|
|
35
|
+
data-focused={checkbox.focused || undefined}
|
|
36
|
+
data-focus-visible={checkbox.focusVisible || undefined}
|
|
37
|
+
hidden={keepMounted && !visible}
|
|
38
|
+
aria-hidden={keepMounted && !visible ? 'true' : undefined}
|
|
39
|
+
class={cn('contents', className)}
|
|
40
|
+
>
|
|
41
|
+
{@render children?.()}
|
|
42
|
+
</span>
|
|
43
|
+
{/if}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
type CheckboxIndicatorProps = Omit<HTMLAttributes<HTMLSpanElement>, 'children' | 'class'> & {
|
|
4
|
+
keepMounted?: boolean;
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
class?: string;
|
|
7
|
+
};
|
|
8
|
+
declare const CheckboxIndicator: import("svelte").Component<CheckboxIndicatorProps, {}, "">;
|
|
9
|
+
type CheckboxIndicator = ReturnType<typeof CheckboxIndicator>;
|
|
10
|
+
export default CheckboxIndicator;
|