@human-kit/svelte-components 1.0.0-alpha.2 → 1.0.0-alpha.4
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/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/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-previous/README.md +14 -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/TODO.md +28 -175
- package/dist/combobox/button/combobox-button.svelte +2 -0
- package/dist/combobox/root/combobox.svelte +30 -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/root/context.d.ts +2 -1
- package/dist/dialog/root/dialog-root.svelte +9 -2
- package/dist/index.d.ts +8 -0
- package/dist/index.js +8 -0
- package/dist/listbox/root/listbox.svelte +44 -0
- package/dist/popover/README.md +10 -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 +2 -1
- package/dist/popover/content/popover-content-test.svelte.d.ts +2 -1
- package/dist/popover/content/popover-content.svelte +91 -18
- package/dist/popover/content/popover-content.svelte.d.ts +5 -1
- package/dist/popover/index.d.ts +1 -1
- package/dist/popover/index.js +1 -3
- 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 +4 -4
- package/dist/popover/trigger/popover-trigger.svelte +1 -1
- 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/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/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 +16 -1
package/dist/combobox/TODO.md
CHANGED
|
@@ -1,175 +1,28 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
- [x]
|
|
12
|
-
- [x]
|
|
13
|
-
- [x]
|
|
14
|
-
- [x]
|
|
15
|
-
- [x]
|
|
16
|
-
- [x]
|
|
17
|
-
- [x]
|
|
18
|
-
- [x]
|
|
19
|
-
- [x]
|
|
20
|
-
- [x]
|
|
21
|
-
- [x]
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
- [ ]
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
- [ ] **Selection announcement**
|
|
30
|
-
- Announce "Selected item: {label}" when an item is selected
|
|
31
|
-
- Use `aria-live="assertive"` for important changes
|
|
32
|
-
|
|
33
|
-
- [ ] **Support for groups (sections)**
|
|
34
|
-
- Implement `role="group"` with `aria-labelledby` for sections
|
|
35
|
-
- Add `ComboBox.Section` component
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## Scalability
|
|
40
|
-
|
|
41
|
-
### Completed (Scalability)
|
|
42
|
-
|
|
43
|
-
- [x] Reusable `useVirtualFocus` hook
|
|
44
|
-
- [x] Controlled/uncontrolled mode
|
|
45
|
-
- [x] Automatic item filtering
|
|
46
|
-
- [x] Reactive `emptyPlaceholder`
|
|
47
|
-
|
|
48
|
-
### Pending (Scalability)
|
|
49
|
-
|
|
50
|
-
- [ ] **Customizable `filterFn` prop**
|
|
51
|
-
- Filtering is currently case-insensitive includes
|
|
52
|
-
- Allow: fuzzy search, startsWith, exact match, async search
|
|
53
|
-
|
|
54
|
-
- [ ] **`allowCreate` prop**
|
|
55
|
-
- Allow creating new items when there is no match
|
|
56
|
-
- Callback `onCreate?: (value: string) => void`
|
|
57
|
-
|
|
58
|
-
- [x] **Multiple selection UI**
|
|
59
|
-
- Chips/tags for selected items: `ComboBox.Tags`, `ComboBox.Tag`, `ComboBox.TagRemove`
|
|
60
|
-
- Clear-all button (available via `clearSelection()` in context)
|
|
61
|
-
- Selected-count indicator (available via `selectedValue.size`)
|
|
62
|
-
- Keyboard tag navigation (ArrowLeft/Right, Delete/Backspace)
|
|
63
|
-
- `ComboBox.ItemIndicator` to show checks for selected items
|
|
64
|
-
|
|
65
|
-
- [ ] **Form integration**
|
|
66
|
-
- `name` prop for native `<form>`
|
|
67
|
-
- Hidden input with serialized value
|
|
68
|
-
- Validation with `required`, `aria-invalid`
|
|
69
|
-
|
|
70
|
-
- [ ] **Async data support**
|
|
71
|
-
- Props: `isLoading`, `loadingPlaceholder`
|
|
72
|
-
- Callback: `onLoadMore` for infinite scroll
|
|
73
|
-
- Built-in debounce for async search
|
|
74
|
-
|
|
75
|
-
- [ ] **Virtualization**
|
|
76
|
-
- For large lists (>100 items)
|
|
77
|
-
- Integrate with `@tanstack/virtual` or similar
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## Performance
|
|
82
|
-
|
|
83
|
-
### Completed (Performance)
|
|
84
|
-
|
|
85
|
-
- [x] DOM query cache with invalidation (`cachedItemOrder`)
|
|
86
|
-
- [x] `untrack()` to avoid infinite effect loops
|
|
87
|
-
- [x] Subscription pattern for reactive `itemCount`
|
|
88
|
-
- [x] Scoped queries via `containerRef`
|
|
89
|
-
|
|
90
|
-
### Pending (Performance)
|
|
91
|
-
|
|
92
|
-
- [ ] **`isVisible` memoization in ListBoxItem**
|
|
93
|
-
- It is currently recomputed on each render
|
|
94
|
-
- Consider more granular memoization with `$derived`
|
|
95
|
-
|
|
96
|
-
- [ ] **Batch registration**
|
|
97
|
-
- `registerItem` runs once per individual item
|
|
98
|
-
- For large lists, consider batched notifications
|
|
99
|
-
|
|
100
|
-
- [ ] **Lazy `itemLabels`**
|
|
101
|
-
- The `itemLabels` map grows with each item
|
|
102
|
-
- Cleanup on unmount is implemented, but consider `WeakMap`
|
|
103
|
-
|
|
104
|
-
- [ ] **Effect cleanup optimizations**
|
|
105
|
-
- Review effects that could be consolidated
|
|
106
|
-
- `combobox-listboxitem.svelte` has 2 effects that might become 1
|
|
107
|
-
|
|
108
|
-
---
|
|
109
|
-
|
|
110
|
-
## Svelte 5 Runes Best Practices
|
|
111
|
-
|
|
112
|
-
### Completed (Runes)
|
|
113
|
-
|
|
114
|
-
- [x] `$state` for reactive state
|
|
115
|
-
- [x] `$derived` for computed values
|
|
116
|
-
- [x] `$effect` with cleanup functions
|
|
117
|
-
- [x] `$bindable` for two-way binding
|
|
118
|
-
- [x] `$props()` for destructuring
|
|
119
|
-
- [x] `untrack()` to avoid unnecessary re-runs
|
|
120
|
-
- [x] `$derived(expression)` instead of `$derived(() => ...)` - simplified in `combobox-listboxitem.svelte`
|
|
121
|
-
- [x] Consolidated effects - using 1 `$effect` + `onDestroy` instead of 2 effects
|
|
122
|
-
|
|
123
|
-
### Reviewed - No Changes Required
|
|
124
|
-
|
|
125
|
-
- [x] **`$effect.pre`**: Reviewed - no race conditions requiring it
|
|
126
|
-
- [x] **Context typing**: Single shared type is appropriate - tree-shaking does not apply to context objects
|
|
127
|
-
|
|
128
|
-
---
|
|
129
|
-
|
|
130
|
-
## Testing
|
|
131
|
-
|
|
132
|
-
### Completed (Testing)
|
|
133
|
-
|
|
134
|
-
- [x] 291 passing unit tests
|
|
135
|
-
- [x] Keyboard navigation tests
|
|
136
|
-
- [x] Selection tests
|
|
137
|
-
- [x] Filtering tests
|
|
138
|
-
- [x] Empty placeholder tests
|
|
139
|
-
- [x] ARIA accessibility tests (6 tests)
|
|
140
|
-
- [x] Edge cases: rapid typing, whitespace, backspace
|
|
141
|
-
- [x] Disabled/ReadOnly state tests
|
|
142
|
-
- [x] Trigger modes (focus, input, manual)
|
|
143
|
-
- [x] Selection behavior (Enter, click, Escape restoration)
|
|
144
|
-
- [x] Multi-select tests (12 tests)
|
|
145
|
-
- [x] Tags component tests (4 tests)
|
|
146
|
-
- [x] Tag component tests (13 tests) - includes keyboard navigation
|
|
147
|
-
- [x] TagRemove component tests (6 tests)
|
|
148
|
-
- [x] ItemIndicator component tests (5 tests)
|
|
149
|
-
|
|
150
|
-
### Pending (Testing)
|
|
151
|
-
|
|
152
|
-
- [ ] **Tests with many items (100+)** - performance tests
|
|
153
|
-
- [ ] **Visual regression tests** - state screenshots
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
## Documentation
|
|
158
|
-
|
|
159
|
-
- [ ] **Complete JSDoc**
|
|
160
|
-
- Document all public props
|
|
161
|
-
- Add usage examples in comments
|
|
162
|
-
|
|
163
|
-
- [ ] **Storybook/Demo page**
|
|
164
|
-
- Interactive examples for all use cases
|
|
165
|
-
- States: loading, error, disabled, readonly
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## Prioritized Next Steps
|
|
170
|
-
|
|
171
|
-
1. **Live regions** (accessibility - high impact)
|
|
172
|
-
2. **Form integration** (usability - common cases)
|
|
173
|
-
3. **Customizable `filterFn`** (scalability)
|
|
174
|
-
4. **Consolidate effects** (performance/best practices)
|
|
175
|
-
5. **Async data support** (scalability)
|
|
1
|
+
# Combobox TODO
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Track Combobox work with a single mandatory TODO format.
|
|
6
|
+
|
|
7
|
+
## Backlog
|
|
8
|
+
|
|
9
|
+
- [x] [M][P0][Area: Architecture][Owner: Unassigned][Target: Done] Build base component parts (`root`, `input`, `list`, `item`).
|
|
10
|
+
- [x] [M][P0][Area: State][Owner: Unassigned][Target: Done] Implement open/close state management on root.
|
|
11
|
+
- [x] [M][P0][Area: Filtering][Owner: Unassigned][Target: Done] Support filtering items by input value.
|
|
12
|
+
- [x] [M][P0][Area: Selection][Owner: Unassigned][Target: Done] Implement item selection and emit `onSelectionChange`.
|
|
13
|
+
- [x] [M][P0][Area: Accessibility][Owner: Unassigned][Target: Done] Add keyboard navigation and ARIA combobox/listbox semantics.
|
|
14
|
+
- [x] [M][P0][Area: Interaction][Owner: Unassigned][Target: Done] Handle outside click and blur to close list.
|
|
15
|
+
- [x] [M][P0][Area: States][Owner: Unassigned][Target: Done] Support disabled state for root and items.
|
|
16
|
+
- [x] [M][P0][Area: Testing][Owner: Unassigned][Target: Done] Add baseline browser tests for open/filter/select behavior.
|
|
17
|
+
- [x] [S][P1][Area: API][Owner: Unassigned][Target: Done] Support controlled/uncontrolled selected value.
|
|
18
|
+
- [x] [M][P0][Area: Selection][Owner: Unassigned][Target: Done] Implement `supportsMultiple` mode with chips and remove action.
|
|
19
|
+
- [x] [M][P0][Area: Data Model][Owner: Unassigned][Target: Done] Support rich object values and hidden input synchronization.
|
|
20
|
+
- [x] [M][P0][Area: UX][Owner: Unassigned][Target: Done] Support loading, empty, and custom-value flows.
|
|
21
|
+
- [x] [M][P0][Area: Focus][Owner: Unassigned][Target: Done] Align focus-visible behavior with shared input modality primitive.
|
|
22
|
+
- [ ] [S][P1][Area: Data Source][Owner: Unassigned][Target: TBD] Add async item provider API (debounced remote filtering).
|
|
23
|
+
- [ ] [S][P1][Area: Data Model][Owner: Unassigned][Target: TBD] Add grouped items with section headers.
|
|
24
|
+
- [ ] [S][P1][Area: Performance][Owner: Unassigned][Target: TBD] Add optional virtualization for large datasets.
|
|
25
|
+
- [ ] [S][P1][Area: Interaction][Owner: Unassigned][Target: TBD] Add option to commit free-text value on blur.
|
|
26
|
+
- [ ] [S][P1][Area: API][Owner: Unassigned][Target: TBD] Add imperative focus/open API for advanced integrations.
|
|
27
|
+
- [ ] [C][P2][Area: UX][Owner: Unassigned][Target: TBD] Add built-in highlighting helper for matched text.
|
|
28
|
+
- [ ] [C][P2][Area: Performance][Owner: Unassigned][Target: TBD] Add benchmark tests for filtering and keyboard navigation.
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
import { setComboBoxContext, type ComboBoxContext } from './context';
|
|
4
4
|
import type { ListBoxContext } from '../../listbox/root/context';
|
|
5
5
|
import { useVirtualFocus } from '../../hooks/use-virtual-focus.svelte';
|
|
6
|
+
import {
|
|
7
|
+
shouldShowFocusVisible,
|
|
8
|
+
trackInteractionModality
|
|
9
|
+
} from '../../primitives/input-modality';
|
|
6
10
|
|
|
7
11
|
type ComboBoxProps<T> = {
|
|
8
12
|
/** Stable ID used to generate internal ARIA IDs (recommended for SSR). */
|
|
@@ -98,6 +102,8 @@
|
|
|
98
102
|
|
|
99
103
|
// Virtual focus for tag navigation in multiple mode
|
|
100
104
|
let focusedTagId: string | number | null = $state(null);
|
|
105
|
+
let focusWithin = $state(false);
|
|
106
|
+
let focusVisible = $state(false);
|
|
101
107
|
|
|
102
108
|
// Flag to control whether inputValue should be used for filtering
|
|
103
109
|
// When false, all items are shown regardless of inputValue
|
|
@@ -335,6 +341,23 @@
|
|
|
335
341
|
}
|
|
336
342
|
}
|
|
337
343
|
|
|
344
|
+
function syncFocusWithin() {
|
|
345
|
+
focusWithin =
|
|
346
|
+
!!wrapperRef && !!document.activeElement && wrapperRef.contains(document.activeElement);
|
|
347
|
+
if (!focusWithin) {
|
|
348
|
+
focusVisible = false;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function handleFocusIn(event: FocusEvent) {
|
|
353
|
+
focusWithin = true;
|
|
354
|
+
focusVisible = shouldShowFocusVisible(event.target as HTMLElement | null);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
function handleFocusOut() {
|
|
358
|
+
queueMicrotask(syncFocusWithin);
|
|
359
|
+
}
|
|
360
|
+
|
|
338
361
|
// Use navigation hook methods for keyboard navigation
|
|
339
362
|
function selectFocusedItem() {
|
|
340
363
|
if (navigation.focusedId !== null) {
|
|
@@ -385,6 +408,7 @@
|
|
|
385
408
|
|
|
386
409
|
function handleKeydown(event: KeyboardEvent) {
|
|
387
410
|
if (isDisabled) return;
|
|
411
|
+
trackInteractionModality(event, event.target as HTMLElement | null);
|
|
388
412
|
|
|
389
413
|
// Handle tag virtual focus navigation in multiple mode
|
|
390
414
|
if (focusedTagId !== null && selectionMode === 'multiple') {
|
|
@@ -559,6 +583,8 @@
|
|
|
559
583
|
event.stopImmediatePropagation();
|
|
560
584
|
}
|
|
561
585
|
handleInputBlur();
|
|
586
|
+
// Escape is a keyboard-only path, so focus-visible remains enabled for the input.
|
|
587
|
+
focusVisible = true;
|
|
562
588
|
event.preventDefault();
|
|
563
589
|
break;
|
|
564
590
|
case 'Backspace':
|
|
@@ -688,7 +714,11 @@
|
|
|
688
714
|
data-combobox
|
|
689
715
|
data-disabled={isDisabled || undefined}
|
|
690
716
|
data-readonly={isReadOnly || undefined}
|
|
717
|
+
data-focus-within={focusWithin || undefined}
|
|
718
|
+
data-focus-visible={focusVisible || undefined}
|
|
691
719
|
use:setWrapperAsTrigger
|
|
720
|
+
onfocusin={handleFocusIn}
|
|
721
|
+
onfocusout={handleFocusOut}
|
|
692
722
|
>
|
|
693
723
|
{#if children}
|
|
694
724
|
{@render children()}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# DatePicker
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
`DatePicker` composes a segmented date input with a calendar popover for selecting dates.
|
|
6
|
+
|
|
7
|
+
## Anatomy
|
|
8
|
+
|
|
9
|
+
- `DatePicker.Root`
|
|
10
|
+
- `DatePicker.Input`
|
|
11
|
+
- `DatePicker.Segment`
|
|
12
|
+
- `DatePicker.Trigger`
|
|
13
|
+
- `DatePicker.Popover`
|
|
14
|
+
- `DatePicker.Calendar`
|
|
15
|
+
- `DatePicker.TriggerPrevious`
|
|
16
|
+
- `DatePicker.Heading`
|
|
17
|
+
- `DatePicker.TriggerNext`
|
|
18
|
+
- `DatePicker.Grid`
|
|
19
|
+
- `DatePicker.GridHeader`
|
|
20
|
+
- `DatePicker.HeaderCell`
|
|
21
|
+
- `DatePicker.GridBody`
|
|
22
|
+
- `DatePicker.BodyCell`
|
|
23
|
+
|
|
24
|
+
```svelte
|
|
25
|
+
<DatePicker.Root>
|
|
26
|
+
<DatePicker.Input aria-label="Date input">
|
|
27
|
+
{#snippet children(segment)}
|
|
28
|
+
<DatePicker.Segment {segment} />
|
|
29
|
+
{/snippet}
|
|
30
|
+
</DatePicker.Input>
|
|
31
|
+
<DatePicker.Trigger />
|
|
32
|
+
|
|
33
|
+
<DatePicker.Popover>
|
|
34
|
+
<DatePicker.Calendar>
|
|
35
|
+
<div>
|
|
36
|
+
<DatePicker.TriggerPrevious />
|
|
37
|
+
<DatePicker.Heading />
|
|
38
|
+
<DatePicker.TriggerNext />
|
|
39
|
+
</div>
|
|
40
|
+
<DatePicker.Grid>
|
|
41
|
+
<DatePicker.GridHeader />
|
|
42
|
+
<DatePicker.GridBody />
|
|
43
|
+
</DatePicker.Grid>
|
|
44
|
+
</DatePicker.Calendar>
|
|
45
|
+
</DatePicker.Popover>
|
|
46
|
+
</DatePicker.Root>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Root API
|
|
50
|
+
|
|
51
|
+
- `value?: string | null` (`YYYY-MM-DD`)
|
|
52
|
+
- `defaultValue?: string | null` (`YYYY-MM-DD`)
|
|
53
|
+
- `onChange?: (value: string | null) => void`
|
|
54
|
+
- `isDisabled?: boolean`
|
|
55
|
+
- `isReadOnly?: boolean`
|
|
56
|
+
- `minValue?: string` (`YYYY-MM-DD`)
|
|
57
|
+
- `maxValue?: string` (`YYYY-MM-DD`)
|
|
58
|
+
- `isDateUnavailable?: (date: string) => boolean`
|
|
59
|
+
- `open?: boolean`
|
|
60
|
+
- `defaultOpen?: boolean`
|
|
61
|
+
- `onOpenChange?: (open: boolean, details: { reason, event?, cancel(), isCanceled }) => void`
|
|
62
|
+
- `closeOnSelect?: boolean`
|
|
63
|
+
- Null-first empty contract: when `value` and `defaultValue` are omitted, the empty state is `null`.
|
|
64
|
+
- `DatePicker.Input` exposes `aria-invalid` and `data-invalid` when the current segment draft is not committeable.
|
|
65
|
+
|
|
66
|
+
## Popover API
|
|
67
|
+
|
|
68
|
+
- `DatePicker.Popover` forwards `Popover.Content` props (for example `placement`, `offset`, `shouldFlip`, `boundaryElement`, `isNonModal`, and close behavior props).
|
|
69
|
+
- The following are controlled internally by `DatePicker` and are not accepted on `DatePicker.Popover`: `open`, `triggerRef`, `onOpenChange`, `id`.
|
|
70
|
+
- Defaults:
|
|
71
|
+
- `placement` defaults to `bottom-start`.
|
|
72
|
+
- `aria-label` defaults to `Calendar`.
|
|
73
|
+
- `initialFocus` defaults to focusing the current active day cell in the calendar grid.
|
|
74
|
+
|
|
75
|
+
## Calendar API
|
|
76
|
+
|
|
77
|
+
- `DatePicker.Calendar` forwards `Calendar.Root` props except those controlled by `DatePicker.Root`.
|
|
78
|
+
- The following are controlled internally by `DatePicker` and are not accepted on `DatePicker.Calendar`: `selectionMode`, `value`, `defaultValue`, `onChange`, `isDisabled`, `isReadOnly`, `isDateUnavailable`.
|
|
79
|
+
|
|
80
|
+
## Notes
|
|
81
|
+
|
|
82
|
+
- Locale is read from `LocaleProvider` when available.
|
|
83
|
+
- Segment accessible names are resolved automatically from the active locale.
|
|
84
|
+
- During segment editing, the committed value is set to `null` when the draft is incomplete, invalid, out-of-range, or unavailable.
|
|
85
|
+
- Current MVP focuses on date-only values.
|
|
86
|
+
|
|
87
|
+
## UX Decisions
|
|
88
|
+
|
|
89
|
+
- **No Date Auto-Correction:** When users manually type dates out of the configured bounds (`minValue`/`maxValue`) or dates that are unavailable, the DatePicker **does not auto-correct** the typed value. Instead, it exposes `aria-invalid="true"` and `data-invalid` on the input, allowing the user to see what they typed incorrectly. The underlying committed value is kept as `null` until a valid date is completed. Auto-correcting input without explicit user consent is an inaccessible anti-pattern.
|
|
90
|
+
- **Navigable Disabled Dates:** When using the Calendar, disabled dates remain focusable via keyboard navigation. This ensures ARIA Grid spatial navigation parity so that screen readers can consistently announce all calendar cells and report them as "disabled", rather than skipping over them and disorienting the user.
|
|
91
|
+
|
|
92
|
+
## Focus behavior decisions
|
|
93
|
+
|
|
94
|
+
- DatePicker aligns with the shared modality primitive (`primitives/input-modality.ts`) for `keyboard`, `pointer`, and `virtual` interactions.
|
|
95
|
+
- `data-focus-visible` is modality-driven; `data-focused` and `data-focus-within` continue to represent real DOM focus state.
|
|
96
|
+
- Trigger focus restore after calendar close is modality-aware:
|
|
97
|
+
- keyboard close paths keep visible focus,
|
|
98
|
+
- pointer outside close restores focus without visible focus.
|
|
99
|
+
- The component keeps explicit `trackInteractionModality(...)` calls in local handlers to ensure deterministic modality updates before local focus-state logic runs.
|
|
100
|
+
- Cross-component focus contract and invariants are documented in `FOCUS_STATE_CONTRACT.md`.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# DatePicker TODO
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Track DatePicker work with a single mandatory TODO format.
|
|
6
|
+
|
|
7
|
+
## Backlog
|
|
8
|
+
|
|
9
|
+
- [x] [M][P0][Area: Context][Owner: Unassigned][Target: Done] Complete core context wiring.
|
|
10
|
+
- [x] [M][P0][Area: State][Owner: Unassigned][Target: Done] Implement root state and value handling.
|
|
11
|
+
- [x] [M][P0][Area: Parsing][Owner: Unassigned][Target: Done] Integrate segment parser and formatter.
|
|
12
|
+
- [x] [M][P0][Area: Input][Owner: Unassigned][Target: Done] Deliver baseline segmented input rendering.
|
|
13
|
+
- [x] [M][P0][Area: Composition][Owner: Unassigned][Target: Done] Integrate calendar popover behavior.
|
|
14
|
+
- [x] [M][P0][Area: Accessibility][Owner: Unassigned][Target: Done] Implement keyboard navigation baseline.
|
|
15
|
+
- [x] [M][P0][Area: Validation][Owner: Unassigned][Target: Done] Implement min/max and unavailable date validation baseline.
|
|
16
|
+
- [x] [M][P0][Area: API][Owner: Unassigned][Target: Done] Ship public exports and baseline docs/tests.
|
|
17
|
+
- [x] [M][P0][Area: Forms][Owner: Unassigned][Target: Done] Support rich object values and hidden input synchronization.
|
|
18
|
+
- [x] [M][P0][Area: Focus][Owner: Unassigned][Target: Done] Unify focus-visible behavior with shared modality semantics.
|
|
19
|
+
- [x] [S][P1][Area: Focus][Owner: Unassigned][Target: Done] Remove DatePicker-local modality tracking in favor of shared primitive.
|
|
20
|
+
- [x] [S][P1][Area: Documentation][Owner: Unassigned][Target: Done] Document focus contract updates and DatePicker rationale.
|
|
21
|
+
- [ ] [S][P1][Area: Calendar][Owner: Unassigned][Target: TBD] Add multi-month calendar display.
|
|
22
|
+
- [ ] [S][P1][Area: Accessibility][Owner: Unassigned][Target: TBD] Run deep accessibility audit (SR + keyboard edge cases).
|
|
23
|
+
- [ ] [C][P2][Area: Time][Owner: Unassigned][Target: TBD] Add time selection integration.
|
|
24
|
+
- [ ] [C][P2][Area: API][Owner: Unassigned][Target: TBD] Decide and implement date-range mode strategy.
|
|
25
|
+
- [ ] [C][P2][Area: Input][Owner: Unassigned][Target: TBD] Add input mask helper utilities.
|
|
26
|
+
- [ ] [C][P2][Area: Mobile][Owner: Unassigned][Target: TBD] Add mobile-optimized interaction pass.
|
|
27
|
+
- [ ] [C][P2][Area: UX][Owner: Unassigned][Target: TBD] Add preset shortcuts (today, next week, custom).
|
|
28
|
+
- [ ] [C][P2][Area: Performance][Owner: Unassigned][Target: TBD] Add segment update micro-benchmarks and optimizations.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# DatePicker Calendar
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### DatePicker.Calendar
|
|
6
|
+
|
|
7
|
+
Name: `DatePicker.Calendar`
|
|
8
|
+
Description: Calendar composition part connected to `DatePicker.Root` selected date and navigation state.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------------ |
|
|
12
|
+
| `children` | `Snippet` | `undefined` | Optional custom calendar content. |
|
|
13
|
+
| `class` | `string` | `''` | CSS class names for the calendar wrapper. |
|
|
14
|
+
| `...restProps` | `Omit<ComponentProps<typeof Calendar.Root>, 'selectionMode' \| 'value' \| 'defaultValue' \| 'onChange' \| 'isDisabled' \| 'isReadOnly' \| 'isDateUnavailable'>` | `-` | Additional calendar root props forwarded by this part. |
|
|
15
|
+
|
|
16
|
+
### Notes
|
|
17
|
+
|
|
18
|
+
Name: Root-controlled calendar props
|
|
19
|
+
Description: `selectionMode`, `value`, `defaultValue`, `onChange`, `isDisabled`, `isReadOnly`, and `isDateUnavailable` are controlled by `DatePicker.Root` and ignored when passed to this part.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import DatePicker from '../index';
|
|
3
|
+
|
|
4
|
+
let unsafeOnChangeCalls = $state(0);
|
|
5
|
+
let selectedValue = $state<string | null>('');
|
|
6
|
+
|
|
7
|
+
const unsafeCalendarProps: Record<string, unknown> = {
|
|
8
|
+
selectionMode: 'range',
|
|
9
|
+
value: { start: '2026-02-01', end: '2026-02-05' },
|
|
10
|
+
defaultValue: '2026-02-20',
|
|
11
|
+
onChange: () => {
|
|
12
|
+
unsafeOnChangeCalls += 1;
|
|
13
|
+
},
|
|
14
|
+
isDisabled: true,
|
|
15
|
+
isReadOnly: true,
|
|
16
|
+
isDateUnavailable: () => true
|
|
17
|
+
};
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<DatePicker.Root
|
|
21
|
+
defaultValue="2026-02-10"
|
|
22
|
+
defaultOpen={true}
|
|
23
|
+
onChange={(nextValue) => {
|
|
24
|
+
selectedValue = nextValue;
|
|
25
|
+
}}
|
|
26
|
+
>
|
|
27
|
+
<DatePicker.Input class="date-picker-input" aria-label="Date input">
|
|
28
|
+
{#snippet children(segment)}
|
|
29
|
+
<DatePicker.Segment class="date-picker-segment" {segment} />
|
|
30
|
+
{/snippet}
|
|
31
|
+
</DatePicker.Input>
|
|
32
|
+
<DatePicker.Trigger class="date-picker-trigger">Open calendar</DatePicker.Trigger>
|
|
33
|
+
|
|
34
|
+
<DatePicker.Popover class="date-picker-popover">
|
|
35
|
+
<DatePicker.Calendar class="date-picker-calendar" {...unsafeCalendarProps}>
|
|
36
|
+
<div class="flex items-center justify-between gap-2 p-2">
|
|
37
|
+
<DatePicker.TriggerPrevious />
|
|
38
|
+
<DatePicker.Heading />
|
|
39
|
+
<DatePicker.TriggerNext />
|
|
40
|
+
</div>
|
|
41
|
+
<DatePicker.Grid>
|
|
42
|
+
<DatePicker.GridHeader>
|
|
43
|
+
{#snippet children(dayLabel: string)}
|
|
44
|
+
<DatePicker.HeaderCell>
|
|
45
|
+
{dayLabel}
|
|
46
|
+
</DatePicker.HeaderCell>
|
|
47
|
+
{/snippet}
|
|
48
|
+
</DatePicker.GridHeader>
|
|
49
|
+
<DatePicker.GridBody>
|
|
50
|
+
{#snippet children(date: string)}
|
|
51
|
+
<DatePicker.BodyCell {date} />
|
|
52
|
+
{/snippet}
|
|
53
|
+
</DatePicker.GridBody>
|
|
54
|
+
</DatePicker.Grid>
|
|
55
|
+
</DatePicker.Calendar>
|
|
56
|
+
</DatePicker.Popover>
|
|
57
|
+
</DatePicker.Root>
|
|
58
|
+
|
|
59
|
+
<p data-testid="unsafe-on-change-calls">{unsafeOnChangeCalls}</p>
|
|
60
|
+
<p data-testid="selected-value">{selectedValue}</p>
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { ComponentProps, Snippet } from 'svelte';
|
|
3
|
+
import { Calendar } from '../../calendar';
|
|
4
|
+
import { sanitizeDatePickerProps } from '../internal/strict-props';
|
|
5
|
+
import { useDatePickerContext } from '../root/context';
|
|
6
|
+
|
|
7
|
+
type ForbiddenCalendarProp =
|
|
8
|
+
| 'selectionMode'
|
|
9
|
+
| 'value'
|
|
10
|
+
| 'defaultValue'
|
|
11
|
+
| 'onChange'
|
|
12
|
+
| 'isDisabled'
|
|
13
|
+
| 'isReadOnly'
|
|
14
|
+
| 'isDateUnavailable';
|
|
15
|
+
|
|
16
|
+
type DatePickerCalendarProps = Omit<
|
|
17
|
+
ComponentProps<typeof Calendar.Root>,
|
|
18
|
+
ForbiddenCalendarProp
|
|
19
|
+
> & {
|
|
20
|
+
class?: string;
|
|
21
|
+
children?: Snippet;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const forbiddenCalendarProps: ForbiddenCalendarProp[] = [
|
|
25
|
+
'selectionMode',
|
|
26
|
+
'value',
|
|
27
|
+
'defaultValue',
|
|
28
|
+
'onChange',
|
|
29
|
+
'isDisabled',
|
|
30
|
+
'isReadOnly',
|
|
31
|
+
'isDateUnavailable'
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
let { class: className = '', children, ...unsafeRestProps }: DatePickerCalendarProps = $props();
|
|
35
|
+
|
|
36
|
+
const datePicker = useDatePickerContext();
|
|
37
|
+
const restProps = $derived.by(
|
|
38
|
+
() =>
|
|
39
|
+
sanitizeDatePickerProps(
|
|
40
|
+
'Calendar',
|
|
41
|
+
unsafeRestProps as Record<string, unknown>,
|
|
42
|
+
forbiddenCalendarProps
|
|
43
|
+
) as Omit<ComponentProps<typeof Calendar.Root>, ForbiddenCalendarProp>
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
function handleChange(nextValue: string) {
|
|
47
|
+
datePicker.setValue(nextValue, 'calendar');
|
|
48
|
+
}
|
|
49
|
+
</script>
|
|
50
|
+
|
|
51
|
+
<Calendar.Root
|
|
52
|
+
selectionMode="single"
|
|
53
|
+
showOutsideDays={false}
|
|
54
|
+
value={datePicker.value ?? undefined}
|
|
55
|
+
onChange={handleChange}
|
|
56
|
+
isDisabled={datePicker.isDisabled}
|
|
57
|
+
isReadOnly={datePicker.isReadOnly}
|
|
58
|
+
isDateUnavailable={datePicker.isDateUnavailable}
|
|
59
|
+
class={className}
|
|
60
|
+
{...restProps}
|
|
61
|
+
>
|
|
62
|
+
{#if children}
|
|
63
|
+
{@render children()}
|
|
64
|
+
{/if}
|
|
65
|
+
</Calendar.Root>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ComponentProps, Snippet } from 'svelte';
|
|
2
|
+
import { Calendar } from '../../calendar';
|
|
3
|
+
type ForbiddenCalendarProp = 'selectionMode' | 'value' | 'defaultValue' | 'onChange' | 'isDisabled' | 'isReadOnly' | 'isDateUnavailable';
|
|
4
|
+
type DatePickerCalendarProps = Omit<ComponentProps<typeof Calendar.Root>, ForbiddenCalendarProp> & {
|
|
5
|
+
class?: string;
|
|
6
|
+
children?: Snippet;
|
|
7
|
+
};
|
|
8
|
+
declare const DatePickerCalendar: import("svelte").Component<DatePickerCalendarProps, {}, "">;
|
|
9
|
+
type DatePickerCalendar = ReturnType<typeof DatePickerCalendar>;
|
|
10
|
+
export default DatePickerCalendar;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * as DatePicker from './index.parts.ts';
|
|
2
|
+
export { default as DatePickerRoot } from './root/date-picker-root.svelte';
|
|
3
|
+
export { default as DatePickerInput } from './input/date-picker-input.svelte';
|
|
4
|
+
export { default as DatePickerSegment } from './segment/date-picker-segment.svelte';
|
|
5
|
+
export { default as DatePickerTrigger } from './trigger/date-picker-trigger.svelte';
|
|
6
|
+
export { default as DatePickerPopover } from './popover/date-picker-popover.svelte';
|
|
7
|
+
export { default as DatePickerCalendar } from './calendar/date-picker-calendar.svelte';
|
|
8
|
+
export { default as DatePickerTriggerPrevious } from '../calendar/trigger-previous/calendar-trigger-previous.svelte';
|
|
9
|
+
export { default as DatePickerHeading } from '../calendar/heading/calendar-heading.svelte';
|
|
10
|
+
export { default as DatePickerTriggerNext } from '../calendar/trigger-next/calendar-trigger-next.svelte';
|
|
11
|
+
export { default as DatePickerGrid } from '../calendar/grid/calendar-grid.svelte';
|
|
12
|
+
export { default as DatePickerGridHeader } from '../calendar/grid-header/calendar-grid-header.svelte';
|
|
13
|
+
export { default as DatePickerHeaderCell } from '../calendar/header-cell/calendar-header-cell.svelte';
|
|
14
|
+
export { default as DatePickerGridBody } from '../calendar/grid-body/calendar-grid-body.svelte';
|
|
15
|
+
export { default as DatePickerBodyCell } from '../calendar/body-cell/calendar-body-cell.svelte';
|
|
16
|
+
export { getDatePickerContext, setDatePickerContext, useDatePickerContext, type DatePickerContext, type DatePickerOpenChangeDetails, type DatePickerOpenChangeReason, type DatePickerSegmentPart, type DatePickerSegmentType } from './root/context.ts';
|
|
17
|
+
import * as DatePickerParts from './index.parts.ts';
|
|
18
|
+
export default DatePickerParts;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * as DatePicker from './index.parts.ts';
|
|
2
|
+
export { default as DatePickerRoot } from './root/date-picker-root.svelte';
|
|
3
|
+
export { default as DatePickerInput } from './input/date-picker-input.svelte';
|
|
4
|
+
export { default as DatePickerSegment } from './segment/date-picker-segment.svelte';
|
|
5
|
+
export { default as DatePickerTrigger } from './trigger/date-picker-trigger.svelte';
|
|
6
|
+
export { default as DatePickerPopover } from './popover/date-picker-popover.svelte';
|
|
7
|
+
export { default as DatePickerCalendar } from './calendar/date-picker-calendar.svelte';
|
|
8
|
+
export { default as DatePickerTriggerPrevious } from '../calendar/trigger-previous/calendar-trigger-previous.svelte';
|
|
9
|
+
export { default as DatePickerHeading } from '../calendar/heading/calendar-heading.svelte';
|
|
10
|
+
export { default as DatePickerTriggerNext } from '../calendar/trigger-next/calendar-trigger-next.svelte';
|
|
11
|
+
export { default as DatePickerGrid } from '../calendar/grid/calendar-grid.svelte';
|
|
12
|
+
export { default as DatePickerGridHeader } from '../calendar/grid-header/calendar-grid-header.svelte';
|
|
13
|
+
export { default as DatePickerHeaderCell } from '../calendar/header-cell/calendar-header-cell.svelte';
|
|
14
|
+
export { default as DatePickerGridBody } from '../calendar/grid-body/calendar-grid-body.svelte';
|
|
15
|
+
export { default as DatePickerBodyCell } from '../calendar/body-cell/calendar-body-cell.svelte';
|
|
16
|
+
export { getDatePickerContext, setDatePickerContext, useDatePickerContext } from './root/context.ts';
|
|
17
|
+
import * as DatePickerParts from './index.parts.ts';
|
|
18
|
+
export default DatePickerParts;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { default as Root } from './root/date-picker-root.svelte';
|
|
2
|
+
export { default as Input } from './input/date-picker-input.svelte';
|
|
3
|
+
export { default as Segment } from './segment/date-picker-segment.svelte';
|
|
4
|
+
export { default as Trigger } from './trigger/date-picker-trigger.svelte';
|
|
5
|
+
export { default as Popover } from './popover/date-picker-popover.svelte';
|
|
6
|
+
export { default as Calendar } from './calendar/date-picker-calendar.svelte';
|
|
7
|
+
export { default as TriggerPrevious } from '../calendar/trigger-previous/calendar-trigger-previous.svelte';
|
|
8
|
+
export { default as Heading } from '../calendar/heading/calendar-heading.svelte';
|
|
9
|
+
export { default as TriggerNext } from '../calendar/trigger-next/calendar-trigger-next.svelte';
|
|
10
|
+
export { default as Grid } from '../calendar/grid/calendar-grid.svelte';
|
|
11
|
+
export { default as GridHeader } from '../calendar/grid-header/calendar-grid-header.svelte';
|
|
12
|
+
export { default as HeaderCell } from '../calendar/header-cell/calendar-header-cell.svelte';
|
|
13
|
+
export { default as GridBody } from '../calendar/grid-body/calendar-grid-body.svelte';
|
|
14
|
+
export { default as BodyCell } from '../calendar/body-cell/calendar-body-cell.svelte';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { default as Root } from './root/date-picker-root.svelte';
|
|
2
|
+
export { default as Input } from './input/date-picker-input.svelte';
|
|
3
|
+
export { default as Segment } from './segment/date-picker-segment.svelte';
|
|
4
|
+
export { default as Trigger } from './trigger/date-picker-trigger.svelte';
|
|
5
|
+
export { default as Popover } from './popover/date-picker-popover.svelte';
|
|
6
|
+
export { default as Calendar } from './calendar/date-picker-calendar.svelte';
|
|
7
|
+
export { default as TriggerPrevious } from '../calendar/trigger-previous/calendar-trigger-previous.svelte';
|
|
8
|
+
export { default as Heading } from '../calendar/heading/calendar-heading.svelte';
|
|
9
|
+
export { default as TriggerNext } from '../calendar/trigger-next/calendar-trigger-next.svelte';
|
|
10
|
+
export { default as Grid } from '../calendar/grid/calendar-grid.svelte';
|
|
11
|
+
export { default as GridHeader } from '../calendar/grid-header/calendar-grid-header.svelte';
|
|
12
|
+
export { default as HeaderCell } from '../calendar/header-cell/calendar-header-cell.svelte';
|
|
13
|
+
export { default as GridBody } from '../calendar/grid-body/calendar-grid-body.svelte';
|
|
14
|
+
export { default as BodyCell } from '../calendar/body-cell/calendar-body-cell.svelte';
|