@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.
Files changed (217) hide show
  1. package/dist/FOCUS_STATE_CONTRACT.md +63 -0
  2. package/dist/FOCUS_STATE_REVIEW_TEMPLATE.md +70 -0
  3. package/dist/calendar/README.md +2 -1
  4. package/dist/calendar/TODO.md +21 -107
  5. package/dist/calendar/body-cell/README.md +15 -0
  6. package/dist/calendar/body-cell/calendar-body-cell.svelte +116 -41
  7. package/dist/calendar/grid/README.md +13 -0
  8. package/dist/calendar/grid-body/README.md +13 -0
  9. package/dist/calendar/grid-header/README.md +13 -0
  10. package/dist/calendar/header-cell/README.md +14 -0
  11. package/dist/calendar/heading/README.md +13 -0
  12. package/dist/calendar/root/README.md +24 -0
  13. package/dist/calendar/root/calendar-root-test.svelte +4 -0
  14. package/dist/calendar/root/calendar-root-test.svelte.d.ts +1 -0
  15. package/dist/calendar/root/calendar-root.svelte +3 -0
  16. package/dist/calendar/root/calendar-root.svelte.d.ts +1 -0
  17. package/dist/calendar/root/context.d.ts +4 -0
  18. package/dist/calendar/root/context.js +28 -25
  19. package/dist/calendar/root/date-utils.d.ts +1 -1
  20. package/dist/calendar/root/date-utils.js +16 -26
  21. package/dist/calendar/trigger-next/README.md +14 -0
  22. package/dist/calendar/trigger-previous/README.md +14 -0
  23. package/dist/clock/README.md +75 -0
  24. package/dist/clock/axis/README.md +24 -0
  25. package/dist/clock/axis/clock-axis.svelte +37 -0
  26. package/dist/clock/axis/clock-axis.svelte.d.ts +8 -0
  27. package/dist/clock/hooks/use-wheel-scroll.svelte.d.ts +16 -0
  28. package/dist/clock/hooks/use-wheel-scroll.svelte.js +336 -0
  29. package/dist/clock/index.d.ts +10 -0
  30. package/dist/clock/index.js +10 -0
  31. package/dist/clock/index.parts.d.ts +4 -0
  32. package/dist/clock/index.parts.js +4 -0
  33. package/dist/clock/root/README.md +38 -0
  34. package/dist/clock/root/clock-root-test.svelte +62 -0
  35. package/dist/clock/root/clock-root-test.svelte.d.ts +14 -0
  36. package/dist/clock/root/clock-root.svelte +329 -0
  37. package/dist/clock/root/clock-root.svelte.d.ts +25 -0
  38. package/dist/clock/root/context.d.ts +22 -0
  39. package/dist/clock/root/context.js +15 -0
  40. package/dist/clock/root/resolve-visible-columns.d.ts +7 -0
  41. package/dist/clock/root/resolve-visible-columns.js +16 -0
  42. package/dist/clock/root/time-utils.d.ts +48 -0
  43. package/dist/clock/root/time-utils.js +314 -0
  44. package/dist/clock/root/wheel-options.d.ts +17 -0
  45. package/dist/clock/root/wheel-options.js +63 -0
  46. package/dist/clock/wheel-column/README.md +25 -0
  47. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte +16 -0
  48. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte.d.ts +3 -0
  49. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte +29 -0
  50. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte.d.ts +6 -0
  51. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte +11 -0
  52. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte.d.ts +3 -0
  53. package/dist/clock/wheel-column/clock-wheel-column-test.svelte +38 -0
  54. package/dist/clock/wheel-column/clock-wheel-column-test.svelte.d.ts +12 -0
  55. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte +38 -0
  56. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte.d.ts +12 -0
  57. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte +29 -0
  58. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte.d.ts +6 -0
  59. package/dist/clock/wheel-column/clock-wheel-column.svelte +499 -0
  60. package/dist/clock/wheel-column/clock-wheel-column.svelte.d.ts +17 -0
  61. package/dist/clock/wheel-item/README.md +17 -0
  62. package/dist/clock/wheel-item/clock-wheel-item.svelte +49 -0
  63. package/dist/clock/wheel-item/clock-wheel-item.svelte.d.ts +17 -0
  64. package/dist/combobox/TODO.md +28 -175
  65. package/dist/combobox/button/combobox-button.svelte +2 -0
  66. package/dist/combobox/root/combobox.svelte +30 -0
  67. package/dist/datepicker/README.md +100 -0
  68. package/dist/datepicker/TODO.md +28 -0
  69. package/dist/datepicker/calendar/README.md +19 -0
  70. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte +60 -0
  71. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte.d.ts +3 -0
  72. package/dist/datepicker/calendar/date-picker-calendar.svelte +65 -0
  73. package/dist/datepicker/calendar/date-picker-calendar.svelte.d.ts +10 -0
  74. package/dist/datepicker/index.d.ts +18 -0
  75. package/dist/datepicker/index.js +18 -0
  76. package/dist/datepicker/index.parts.d.ts +14 -0
  77. package/dist/datepicker/index.parts.js +14 -0
  78. package/dist/datepicker/input/README.md +15 -0
  79. package/dist/datepicker/input/date-picker-input.svelte +108 -0
  80. package/dist/datepicker/input/date-picker-input.svelte.d.ts +11 -0
  81. package/dist/datepicker/internal/strict-props.d.ts +2 -0
  82. package/dist/datepicker/internal/strict-props.js +28 -0
  83. package/dist/datepicker/popover/README.md +20 -0
  84. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte +57 -0
  85. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte.d.ts +3 -0
  86. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte +45 -0
  87. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte.d.ts +18 -0
  88. package/dist/datepicker/popover/date-picker-popover.svelte +87 -0
  89. package/dist/datepicker/popover/date-picker-popover.svelte.d.ts +7 -0
  90. package/dist/datepicker/root/README.md +38 -0
  91. package/dist/datepicker/root/context.d.ts +43 -0
  92. package/dist/datepicker/root/context.js +15 -0
  93. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte +24 -0
  94. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte.d.ts +3 -0
  95. package/dist/datepicker/root/date-picker-bindable-test.svelte +41 -0
  96. package/dist/datepicker/root/date-picker-bindable-test.svelte.d.ts +3 -0
  97. package/dist/datepicker/root/date-picker-empty-test.svelte +47 -0
  98. package/dist/datepicker/root/date-picker-empty-test.svelte.d.ts +3 -0
  99. package/dist/datepicker/root/date-picker-locale-typing-test.svelte +47 -0
  100. package/dist/datepicker/root/date-picker-locale-typing-test.svelte.d.ts +3 -0
  101. package/dist/datepicker/root/date-picker-open-cancel-test.svelte +54 -0
  102. package/dist/datepicker/root/date-picker-open-cancel-test.svelte.d.ts +8 -0
  103. package/dist/datepicker/root/date-picker-root.svelte +495 -0
  104. package/dist/datepicker/root/date-picker-root.svelte.d.ts +24 -0
  105. package/dist/datepicker/root/date-picker-test.svelte +86 -0
  106. package/dist/datepicker/root/date-picker-test.svelte.d.ts +13 -0
  107. package/dist/datepicker/root/date-utils.d.ts +17 -0
  108. package/dist/datepicker/root/date-utils.js +138 -0
  109. package/dist/datepicker/root/draft-evaluation.d.ts +13 -0
  110. package/dist/datepicker/root/draft-evaluation.js +56 -0
  111. package/dist/datepicker/root/focus-controller.d.ts +3 -0
  112. package/dist/datepicker/root/focus-controller.js +15 -0
  113. package/dist/datepicker/root/open-change.d.ts +5 -0
  114. package/dist/datepicker/root/open-change.js +13 -0
  115. package/dist/datepicker/root/open-controller.d.ts +7 -0
  116. package/dist/datepicker/root/open-controller.js +15 -0
  117. package/dist/datepicker/root/segment-controller.d.ts +8 -0
  118. package/dist/datepicker/root/segment-controller.js +53 -0
  119. package/dist/datepicker/root/segment-state.d.ts +18 -0
  120. package/dist/datepicker/root/segment-state.js +134 -0
  121. package/dist/datepicker/root/value-commit.d.ts +4 -0
  122. package/dist/datepicker/root/value-commit.js +8 -0
  123. package/dist/datepicker/segment/README.md +14 -0
  124. package/dist/datepicker/segment/date-picker-segment.svelte +319 -0
  125. package/dist/datepicker/segment/date-picker-segment.svelte.d.ts +9 -0
  126. package/dist/datepicker/trigger/README.md +14 -0
  127. package/dist/datepicker/trigger/date-picker-trigger.svelte +110 -0
  128. package/dist/datepicker/trigger/date-picker-trigger.svelte.d.ts +9 -0
  129. package/dist/dialog/content/dialog-content.svelte +6 -6
  130. package/dist/dialog/root/context.d.ts +2 -1
  131. package/dist/dialog/root/dialog-root.svelte +9 -2
  132. package/dist/index.d.ts +8 -0
  133. package/dist/index.js +8 -0
  134. package/dist/listbox/root/listbox.svelte +44 -0
  135. package/dist/popover/README.md +10 -0
  136. package/dist/popover/content/popover-content-standalone-test.svelte +28 -0
  137. package/dist/popover/content/popover-content-standalone-test.svelte.d.ts +6 -0
  138. package/dist/popover/content/popover-content-test.svelte +2 -1
  139. package/dist/popover/content/popover-content-test.svelte.d.ts +2 -1
  140. package/dist/popover/content/popover-content.svelte +91 -18
  141. package/dist/popover/content/popover-content.svelte.d.ts +5 -1
  142. package/dist/popover/index.d.ts +1 -1
  143. package/dist/popover/index.js +1 -3
  144. package/dist/popover/root/README.md +10 -15
  145. package/dist/popover/root/context.d.ts +16 -7
  146. package/dist/popover/root/context.js +0 -2
  147. package/dist/popover/root/focus-state.d.ts +4 -0
  148. package/dist/popover/root/focus-state.js +33 -0
  149. package/dist/popover/root/popover-root.svelte +90 -17
  150. package/dist/popover/root/popover-root.svelte.d.ts +2 -1
  151. package/dist/popover/root/popover-test.svelte +2 -1
  152. package/dist/popover/root/popover-test.svelte.d.ts +2 -1
  153. package/dist/popover/trigger/popover-trigger-button.svelte +4 -4
  154. package/dist/popover/trigger/popover-trigger.svelte +1 -1
  155. package/dist/portal/portal.svelte +3 -1
  156. package/dist/primitives/click-outside.d.ts +1 -1
  157. package/dist/primitives/click-outside.js +1 -1
  158. package/dist/primitives/focus-trap.d.ts +7 -2
  159. package/dist/primitives/focus-trap.js +50 -17
  160. package/dist/primitives/index.d.ts +1 -0
  161. package/dist/primitives/index.js +1 -0
  162. package/dist/primitives/input-modality.d.ts +7 -0
  163. package/dist/primitives/input-modality.js +125 -0
  164. package/dist/test-utils/focus-contract.d.ts +3 -0
  165. package/dist/test-utils/focus-contract.js +26 -0
  166. package/dist/timepicker/IMPLEMENTATION_PLAN.md +254 -0
  167. package/dist/timepicker/README.md +97 -0
  168. package/dist/timepicker/TODO.md +86 -0
  169. package/dist/timepicker/clock/README.md +14 -0
  170. package/dist/timepicker/clock/time-picker-clock-test.svelte +45 -0
  171. package/dist/timepicker/clock/time-picker-clock-test.svelte.d.ts +11 -0
  172. package/dist/timepicker/clock/time-picker-clock.svelte +65 -0
  173. package/dist/timepicker/clock/time-picker-clock.svelte.d.ts +10 -0
  174. package/dist/timepicker/index.d.ts +14 -0
  175. package/dist/timepicker/index.js +14 -0
  176. package/dist/timepicker/index.parts.d.ts +8 -0
  177. package/dist/timepicker/index.parts.js +8 -0
  178. package/dist/timepicker/input/README.md +15 -0
  179. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte +40 -0
  180. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte.d.ts +3 -0
  181. package/dist/timepicker/input/time-picker-input.svelte +109 -0
  182. package/dist/timepicker/input/time-picker-input.svelte.d.ts +11 -0
  183. package/dist/timepicker/internal/strict-props.d.ts +4 -0
  184. package/dist/timepicker/internal/strict-props.js +51 -0
  185. package/dist/timepicker/popover/README.md +20 -0
  186. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte +22 -0
  187. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte.d.ts +3 -0
  188. package/dist/timepicker/popover/time-picker-popover.svelte +89 -0
  189. package/dist/timepicker/popover/time-picker-popover.svelte.d.ts +7 -0
  190. package/dist/timepicker/root/README.md +42 -0
  191. package/dist/timepicker/root/context.d.ts +51 -0
  192. package/dist/timepicker/root/context.js +15 -0
  193. package/dist/timepicker/root/time-picker-12h-test.svelte +22 -0
  194. package/dist/timepicker/root/time-picker-12h-test.svelte.d.ts +3 -0
  195. package/dist/timepicker/root/time-picker-bindable-test.svelte +25 -0
  196. package/dist/timepicker/root/time-picker-bindable-test.svelte.d.ts +3 -0
  197. package/dist/timepicker/root/time-picker-empty-test.svelte +20 -0
  198. package/dist/timepicker/root/time-picker-empty-test.svelte.d.ts +3 -0
  199. package/dist/timepicker/root/time-picker-root.svelte +625 -0
  200. package/dist/timepicker/root/time-picker-root.svelte.d.ts +28 -0
  201. package/dist/timepicker/root/time-picker-test.svelte +72 -0
  202. package/dist/timepicker/root/time-picker-test.svelte.d.ts +15 -0
  203. package/dist/timepicker/root/time-utils.d.ts +1 -0
  204. package/dist/timepicker/root/time-utils.js +3 -0
  205. package/dist/timepicker/segment/README.md +14 -0
  206. package/dist/timepicker/segment/time-picker-segment.svelte +365 -0
  207. package/dist/timepicker/segment/time-picker-segment.svelte.d.ts +9 -0
  208. package/dist/timepicker/trigger/README.md +14 -0
  209. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte +35 -0
  210. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte.d.ts +3 -0
  211. package/dist/timepicker/trigger/time-picker-trigger.svelte +122 -0
  212. package/dist/timepicker/trigger/time-picker-trigger.svelte.d.ts +9 -0
  213. package/dist/utils/date-only.d.ts +11 -0
  214. package/dist/utils/date-only.js +53 -0
  215. package/dist/utils/index.d.ts +1 -0
  216. package/dist/utils/index.js +1 -0
  217. package/package.json +16 -1
@@ -1,175 +1,28 @@
1
- # ComboBox - Code Review & TODOs
2
-
3
- Comprehensive review based on: **Accessibility**, **Scalability**, **Performance**, **Svelte 5 Runes Best Practices**.
4
-
5
- ---
6
-
7
- ## Accessibility
8
-
9
- ### Completed (Accessibility)
10
-
11
- - [x] ARIA pattern: `aria-activedescendant` for virtual focus
12
- - [x] `aria-expanded`, `aria-haspopup`, `aria-controls` on input
13
- - [x] `aria-label` on ListBox
14
- - [x] `role="combobox"`, `role="listbox"`, `role="option"`
15
- - [x] `aria-selected` on selected items
16
- - [x] `aria-disabled` on disabled items/placeholder
17
- - [x] Input supports `aria-label` and `aria-labelledby` props
18
- - [x] ListBox has an ID so `aria-controls` works correctly
19
- - [x] Button has `aria-controls` pointing to the listbox
20
- - [x] Wrapper group supports `aria-label` and `aria-labelledby`
21
- - [x] Input supports `aria-describedby` for usage instructions
22
-
23
- ### Pending (Accessibility)
24
-
25
- - [ ] **Live regions for result count**
26
- - Add `<div aria-live="polite">` to announce "{N} results available" while filtering
27
- - Important for screen readers that cannot see visual updates
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.
@@ -24,6 +24,8 @@
24
24
  }
25
25
  </script>
26
26
 
27
+ <!-- * CHANGE: CHANGE NAME FROM BUTTON TO TRIGGER -->
28
+
27
29
  <button
28
30
  type="button"
29
31
  {tabindex}
@@ -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,3 @@
1
+ declare const DatePickerCalendarUnsafePropsTest: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type DatePickerCalendarUnsafePropsTest = ReturnType<typeof DatePickerCalendarUnsafePropsTest>;
3
+ export default DatePickerCalendarUnsafePropsTest;
@@ -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';