@human-kit/svelte-components 1.0.0-alpha.1 → 1.0.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/dist/FOCUS_STATE_CONTRACT.md +63 -0
  2. package/dist/FOCUS_STATE_REVIEW_TEMPLATE.md +70 -0
  3. package/dist/button/README.md +48 -0
  4. package/dist/button/TODO.md +13 -0
  5. package/dist/button/index.d.ts +5 -0
  6. package/dist/button/index.js +4 -0
  7. package/dist/button/index.parts.d.ts +1 -0
  8. package/dist/button/index.parts.js +1 -0
  9. package/dist/button/root/README.md +43 -0
  10. package/dist/button/root/button-root.svelte +362 -0
  11. package/dist/button/root/button-root.svelte.d.ts +21 -0
  12. package/dist/button/root/button-test.svelte +76 -0
  13. package/dist/button/root/button-test.svelte.d.ts +11 -0
  14. package/dist/calendar/README.md +66 -0
  15. package/dist/calendar/TODO.md +23 -0
  16. package/dist/calendar/body-cell/README.md +15 -0
  17. package/dist/calendar/body-cell/calendar-body-cell.svelte +230 -0
  18. package/dist/calendar/body-cell/calendar-body-cell.svelte.d.ts +9 -0
  19. package/dist/calendar/grid/README.md +13 -0
  20. package/dist/calendar/grid/calendar-grid-month-scope.svelte +16 -0
  21. package/dist/calendar/grid/calendar-grid-month-scope.svelte.d.ts +8 -0
  22. package/dist/calendar/grid/calendar-grid.svelte +45 -0
  23. package/dist/calendar/grid/calendar-grid.svelte.d.ts +8 -0
  24. package/dist/calendar/grid/month-scope.d.ts +2 -0
  25. package/dist/calendar/grid/month-scope.js +8 -0
  26. package/dist/calendar/grid-body/README.md +13 -0
  27. package/dist/calendar/grid-body/calendar-grid-body-custom-test.svelte +13 -0
  28. package/dist/calendar/grid-body/calendar-grid-body-custom-test.svelte.d.ts +18 -0
  29. package/dist/calendar/grid-body/calendar-grid-body.svelte +36 -0
  30. package/dist/calendar/grid-body/calendar-grid-body.svelte.d.ts +8 -0
  31. package/dist/calendar/grid-header/README.md +13 -0
  32. package/dist/calendar/grid-header/calendar-grid-header-custom-test.svelte +13 -0
  33. package/dist/calendar/grid-header/calendar-grid-header-custom-test.svelte.d.ts +18 -0
  34. package/dist/calendar/grid-header/calendar-grid-header.svelte +31 -0
  35. package/dist/calendar/grid-header/calendar-grid-header.svelte.d.ts +8 -0
  36. package/dist/calendar/header-cell/README.md +14 -0
  37. package/dist/calendar/header-cell/calendar-header-cell-test.svelte +11 -0
  38. package/dist/calendar/header-cell/calendar-header-cell-test.svelte.d.ts +18 -0
  39. package/dist/calendar/header-cell/calendar-header-cell.svelte +16 -0
  40. package/dist/calendar/header-cell/calendar-header-cell.svelte.d.ts +8 -0
  41. package/dist/calendar/heading/README.md +13 -0
  42. package/dist/calendar/heading/calendar-heading.svelte +17 -0
  43. package/dist/calendar/heading/calendar-heading.svelte.d.ts +5 -0
  44. package/dist/calendar/index.d.ts +13 -0
  45. package/dist/calendar/index.js +13 -0
  46. package/dist/calendar/index.parts.d.ts +9 -0
  47. package/dist/calendar/index.parts.js +9 -0
  48. package/dist/calendar/root/README.md +24 -0
  49. package/dist/calendar/root/calendar-root-bind-value-test.svelte +14 -0
  50. package/dist/calendar/root/calendar-root-bind-value-test.svelte.d.ts +3 -0
  51. package/dist/calendar/root/calendar-root-controlled-clear-test.svelte +20 -0
  52. package/dist/calendar/root/calendar-root-controlled-clear-test.svelte.d.ts +3 -0
  53. package/dist/calendar/root/calendar-root-test.svelte +71 -0
  54. package/dist/calendar/root/calendar-root-test.svelte.d.ts +13 -0
  55. package/dist/calendar/root/calendar-root.svelte +143 -0
  56. package/dist/calendar/root/calendar-root.svelte.d.ts +31 -0
  57. package/dist/calendar/root/context.d.ts +66 -0
  58. package/dist/calendar/root/context.js +727 -0
  59. package/dist/calendar/root/date-utils.d.ts +17 -0
  60. package/dist/calendar/root/date-utils.js +94 -0
  61. package/dist/calendar/trigger-next/README.md +14 -0
  62. package/dist/calendar/trigger-next/calendar-trigger-next.svelte +43 -0
  63. package/dist/calendar/trigger-next/calendar-trigger-next.svelte.d.ts +9 -0
  64. package/dist/calendar/trigger-previous/README.md +14 -0
  65. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte +43 -0
  66. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte.d.ts +9 -0
  67. package/dist/checkbox/README.md +53 -0
  68. package/dist/checkbox/TODO.md +16 -0
  69. package/dist/checkbox/index.d.ts +6 -0
  70. package/dist/checkbox/index.js +6 -0
  71. package/dist/checkbox/index.parts.d.ts +2 -0
  72. package/dist/checkbox/index.parts.js +2 -0
  73. package/dist/checkbox/indicator/README.md +23 -0
  74. package/dist/checkbox/indicator/checkbox-indicator.svelte +43 -0
  75. package/dist/checkbox/indicator/checkbox-indicator.svelte.d.ts +10 -0
  76. package/dist/checkbox/root/README.md +47 -0
  77. package/dist/checkbox/root/checkbox-label-test.svelte +10 -0
  78. package/dist/checkbox/root/checkbox-label-test.svelte.d.ts +18 -0
  79. package/dist/checkbox/root/checkbox-root.svelte +361 -0
  80. package/dist/checkbox/root/checkbox-root.svelte.d.ts +23 -0
  81. package/dist/checkbox/root/checkbox-test.svelte +59 -0
  82. package/dist/checkbox/root/checkbox-test.svelte.d.ts +18 -0
  83. package/dist/checkbox/root/context.d.ts +21 -0
  84. package/dist/checkbox/root/context.js +15 -0
  85. package/dist/clock/README.md +75 -0
  86. package/dist/clock/axis/README.md +24 -0
  87. package/dist/clock/axis/clock-axis.svelte +37 -0
  88. package/dist/clock/axis/clock-axis.svelte.d.ts +8 -0
  89. package/dist/clock/hooks/use-wheel-scroll.svelte.d.ts +16 -0
  90. package/dist/clock/hooks/use-wheel-scroll.svelte.js +336 -0
  91. package/dist/clock/index.d.ts +10 -0
  92. package/dist/clock/index.js +10 -0
  93. package/dist/clock/index.parts.d.ts +4 -0
  94. package/dist/clock/index.parts.js +4 -0
  95. package/dist/clock/root/README.md +38 -0
  96. package/dist/clock/root/clock-root-test.svelte +62 -0
  97. package/dist/clock/root/clock-root-test.svelte.d.ts +14 -0
  98. package/dist/clock/root/clock-root.svelte +329 -0
  99. package/dist/clock/root/clock-root.svelte.d.ts +25 -0
  100. package/dist/clock/root/context.d.ts +22 -0
  101. package/dist/clock/root/context.js +15 -0
  102. package/dist/clock/root/resolve-visible-columns.d.ts +7 -0
  103. package/dist/clock/root/resolve-visible-columns.js +16 -0
  104. package/dist/clock/root/time-utils.d.ts +48 -0
  105. package/dist/clock/root/time-utils.js +314 -0
  106. package/dist/clock/root/wheel-options.d.ts +17 -0
  107. package/dist/clock/root/wheel-options.js +63 -0
  108. package/dist/clock/wheel-column/README.md +25 -0
  109. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte +16 -0
  110. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte.d.ts +3 -0
  111. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte +29 -0
  112. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte.d.ts +6 -0
  113. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte +11 -0
  114. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte.d.ts +3 -0
  115. package/dist/clock/wheel-column/clock-wheel-column-test.svelte +38 -0
  116. package/dist/clock/wheel-column/clock-wheel-column-test.svelte.d.ts +12 -0
  117. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte +38 -0
  118. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte.d.ts +12 -0
  119. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte +29 -0
  120. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte.d.ts +6 -0
  121. package/dist/clock/wheel-column/clock-wheel-column.svelte +499 -0
  122. package/dist/clock/wheel-column/clock-wheel-column.svelte.d.ts +17 -0
  123. package/dist/clock/wheel-item/README.md +17 -0
  124. package/dist/clock/wheel-item/clock-wheel-item.svelte +49 -0
  125. package/dist/clock/wheel-item/clock-wheel-item.svelte.d.ts +17 -0
  126. package/dist/combobox/README.md +46 -0
  127. package/dist/combobox/TODO.md +28 -175
  128. package/dist/combobox/button/README.md +20 -0
  129. package/dist/combobox/button/combobox-button-test.svelte +27 -0
  130. package/dist/combobox/button/combobox-button-test.svelte.d.ts +6 -0
  131. package/dist/combobox/button/combobox-button.svelte +10 -11
  132. package/dist/combobox/clear/README.md +21 -0
  133. package/dist/combobox/clear/combobox-clear-test.svelte +34 -0
  134. package/dist/combobox/clear/combobox-clear-test.svelte.d.ts +3 -0
  135. package/dist/combobox/clear/combobox-clear.svelte +61 -0
  136. package/dist/combobox/clear/combobox-clear.svelte.d.ts +9 -0
  137. package/dist/combobox/index.d.ts +5 -3
  138. package/dist/combobox/index.js +5 -3
  139. package/dist/combobox/index.parts.d.ts +2 -0
  140. package/dist/combobox/index.parts.js +2 -0
  141. package/dist/combobox/input/README.md +16 -0
  142. package/dist/combobox/input/combobox-input.svelte +43 -12
  143. package/dist/combobox/item/README.md +27 -0
  144. package/dist/combobox/item/combobox-item-implicit-text-test.svelte +1 -1
  145. package/dist/combobox/item/combobox-listboxitem.svelte +1 -9
  146. package/dist/combobox/item-indicator/README.md +15 -0
  147. package/dist/combobox/item-indicator/combobox-item-indicator.svelte +4 -15
  148. package/dist/combobox/list/README.md +27 -0
  149. package/dist/combobox/list/combobox-listbox.svelte.d.ts +1 -1
  150. package/dist/combobox/popover/README.md +13 -0
  151. package/dist/combobox/popover/combobox-popover.svelte +133 -17
  152. package/dist/combobox/popover/combobox-scrollable-list-test.svelte +23 -0
  153. package/dist/combobox/popover/combobox-scrollable-list-test.svelte.d.ts +18 -0
  154. package/dist/combobox/root/README.md +45 -0
  155. package/dist/combobox/root/combobox-multiselect-test.svelte +1 -1
  156. package/dist/combobox/root/combobox-numeric-string-id-test.svelte +1 -1
  157. package/dist/combobox/root/combobox-test.svelte +16 -3
  158. package/dist/combobox/root/combobox-test.svelte.d.ts +1 -0
  159. package/dist/combobox/root/combobox.svelte +78 -2
  160. package/dist/combobox/root/combobox.svelte.d.ts +1 -0
  161. package/dist/combobox/root/context.d.ts +9 -1
  162. package/dist/combobox/tag/README.md +37 -0
  163. package/dist/combobox/tag-remove/README.md +14 -0
  164. package/dist/combobox/tag-remove/combobox-tag-remove.svelte +3 -2
  165. package/dist/combobox/tags/README.md +23 -0
  166. package/dist/combobox/trigger/README.md +21 -0
  167. package/dist/combobox/trigger/combobox-trigger.svelte +56 -0
  168. package/dist/combobox/trigger/combobox-trigger.svelte.d.ts +9 -0
  169. package/dist/datepicker/README.md +100 -0
  170. package/dist/datepicker/TODO.md +28 -0
  171. package/dist/datepicker/calendar/README.md +19 -0
  172. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte +60 -0
  173. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte.d.ts +3 -0
  174. package/dist/datepicker/calendar/date-picker-calendar.svelte +65 -0
  175. package/dist/datepicker/calendar/date-picker-calendar.svelte.d.ts +10 -0
  176. package/dist/datepicker/index.d.ts +18 -0
  177. package/dist/datepicker/index.js +18 -0
  178. package/dist/datepicker/index.parts.d.ts +14 -0
  179. package/dist/datepicker/index.parts.js +14 -0
  180. package/dist/datepicker/input/README.md +15 -0
  181. package/dist/datepicker/input/date-picker-input.svelte +108 -0
  182. package/dist/datepicker/input/date-picker-input.svelte.d.ts +11 -0
  183. package/dist/datepicker/internal/strict-props.d.ts +2 -0
  184. package/dist/datepicker/internal/strict-props.js +28 -0
  185. package/dist/datepicker/popover/README.md +20 -0
  186. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte +57 -0
  187. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte.d.ts +3 -0
  188. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte +45 -0
  189. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte.d.ts +18 -0
  190. package/dist/datepicker/popover/date-picker-popover.svelte +87 -0
  191. package/dist/datepicker/popover/date-picker-popover.svelte.d.ts +7 -0
  192. package/dist/datepicker/root/README.md +38 -0
  193. package/dist/datepicker/root/context.d.ts +43 -0
  194. package/dist/datepicker/root/context.js +15 -0
  195. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte +24 -0
  196. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte.d.ts +3 -0
  197. package/dist/datepicker/root/date-picker-bindable-test.svelte +41 -0
  198. package/dist/datepicker/root/date-picker-bindable-test.svelte.d.ts +3 -0
  199. package/dist/datepicker/root/date-picker-empty-test.svelte +47 -0
  200. package/dist/datepicker/root/date-picker-empty-test.svelte.d.ts +3 -0
  201. package/dist/datepicker/root/date-picker-locale-typing-test.svelte +47 -0
  202. package/dist/datepicker/root/date-picker-locale-typing-test.svelte.d.ts +3 -0
  203. package/dist/datepicker/root/date-picker-open-cancel-test.svelte +54 -0
  204. package/dist/datepicker/root/date-picker-open-cancel-test.svelte.d.ts +8 -0
  205. package/dist/datepicker/root/date-picker-root.svelte +495 -0
  206. package/dist/datepicker/root/date-picker-root.svelte.d.ts +24 -0
  207. package/dist/datepicker/root/date-picker-test.svelte +86 -0
  208. package/dist/datepicker/root/date-picker-test.svelte.d.ts +13 -0
  209. package/dist/datepicker/root/date-utils.d.ts +17 -0
  210. package/dist/datepicker/root/date-utils.js +138 -0
  211. package/dist/datepicker/root/draft-evaluation.d.ts +13 -0
  212. package/dist/datepicker/root/draft-evaluation.js +56 -0
  213. package/dist/datepicker/root/focus-controller.d.ts +3 -0
  214. package/dist/datepicker/root/focus-controller.js +15 -0
  215. package/dist/datepicker/root/open-change.d.ts +5 -0
  216. package/dist/datepicker/root/open-change.js +13 -0
  217. package/dist/datepicker/root/open-controller.d.ts +7 -0
  218. package/dist/datepicker/root/open-controller.js +15 -0
  219. package/dist/datepicker/root/segment-controller.d.ts +8 -0
  220. package/dist/datepicker/root/segment-controller.js +53 -0
  221. package/dist/datepicker/root/segment-state.d.ts +18 -0
  222. package/dist/datepicker/root/segment-state.js +134 -0
  223. package/dist/datepicker/root/value-commit.d.ts +4 -0
  224. package/dist/datepicker/root/value-commit.js +8 -0
  225. package/dist/datepicker/segment/README.md +14 -0
  226. package/dist/datepicker/segment/date-picker-segment.svelte +319 -0
  227. package/dist/datepicker/segment/date-picker-segment.svelte.d.ts +9 -0
  228. package/dist/datepicker/trigger/README.md +14 -0
  229. package/dist/datepicker/trigger/date-picker-trigger.svelte +110 -0
  230. package/dist/datepicker/trigger/date-picker-trigger.svelte.d.ts +9 -0
  231. package/dist/dialog/README.md +35 -0
  232. package/dist/dialog/content/README.md +16 -0
  233. package/dist/dialog/content/dialog-content.svelte +6 -6
  234. package/dist/dialog/index.d.ts +3 -3
  235. package/dist/dialog/index.js +2 -2
  236. package/dist/dialog/overlay/README.md +13 -0
  237. package/dist/dialog/portal/README.md +12 -0
  238. package/dist/dialog/root/README.md +53 -0
  239. package/dist/dialog/root/context.d.ts +2 -1
  240. package/dist/dialog/root/dialog-root.svelte +9 -2
  241. package/dist/dialog/trigger/README.md +12 -0
  242. package/dist/dialog/trigger/dialog-trigger-multi-button-test.svelte +19 -0
  243. package/dist/dialog/trigger/dialog-trigger-multi-button-test.svelte.d.ts +18 -0
  244. package/dist/dialog/trigger/dialog-trigger.svelte +18 -6
  245. package/dist/index.d.ts +31 -13
  246. package/dist/index.js +31 -13
  247. package/dist/input/README.md +38 -0
  248. package/dist/input/TODO.md +12 -0
  249. package/dist/input/input-test.svelte +43 -0
  250. package/dist/input/input-test.svelte.d.ts +12 -0
  251. package/dist/input/input.svelte +151 -7
  252. package/dist/input/input.svelte.d.ts +8 -2
  253. package/dist/listbox/README.md +26 -0
  254. package/dist/listbox/index.d.ts +3 -3
  255. package/dist/listbox/index.js +3 -3
  256. package/dist/listbox/item/README.md +25 -0
  257. package/dist/listbox/item/listbox-item.svelte +152 -2
  258. package/dist/listbox/item/listbox-item.svelte.d.ts +2 -0
  259. package/dist/listbox/root/README.md +40 -0
  260. package/dist/listbox/root/listbox-test.svelte +14 -2
  261. package/dist/listbox/root/listbox-test.svelte.d.ts +1 -0
  262. package/dist/listbox/root/listbox.svelte +44 -0
  263. package/dist/listbox/root/listbox.svelte.d.ts +2 -2
  264. package/dist/locale-provider/context.d.ts +8 -0
  265. package/dist/locale-provider/context.js +18 -0
  266. package/dist/locale-provider/index.d.ts +4 -0
  267. package/dist/locale-provider/index.js +4 -0
  268. package/dist/locale-provider/locale-provider-initial-value-test.svelte +15 -0
  269. package/dist/locale-provider/locale-provider-initial-value-test.svelte.d.ts +7 -0
  270. package/dist/locale-provider/locale-provider-test.svelte +20 -0
  271. package/dist/locale-provider/locale-provider-test.svelte.d.ts +6 -0
  272. package/dist/locale-provider/locale-provider-value-probe.svelte +22 -0
  273. package/dist/locale-provider/locale-provider-value-probe.svelte.d.ts +6 -0
  274. package/dist/locale-provider/locale-provider.svelte +23 -0
  275. package/dist/locale-provider/locale-provider.svelte.d.ts +8 -0
  276. package/dist/popover/README.md +42 -0
  277. package/dist/popover/content/README.md +36 -0
  278. package/dist/popover/content/popover-content-standalone-test.svelte +28 -0
  279. package/dist/popover/content/popover-content-standalone-test.svelte.d.ts +6 -0
  280. package/dist/popover/content/popover-content-test.svelte +32 -2
  281. package/dist/popover/content/popover-content-test.svelte.d.ts +3 -1
  282. package/dist/popover/content/popover-content.svelte +276 -23
  283. package/dist/popover/content/popover-content.svelte.d.ts +5 -1
  284. package/dist/popover/index.d.ts +3 -3
  285. package/dist/popover/index.js +3 -5
  286. package/dist/popover/root/README.md +25 -0
  287. package/dist/popover/root/context.d.ts +16 -7
  288. package/dist/popover/root/context.js +0 -2
  289. package/dist/popover/root/focus-state.d.ts +4 -0
  290. package/dist/popover/root/focus-state.js +33 -0
  291. package/dist/popover/root/popover-root.svelte +90 -17
  292. package/dist/popover/root/popover-root.svelte.d.ts +2 -1
  293. package/dist/popover/root/popover-test.svelte +2 -1
  294. package/dist/popover/root/popover-test.svelte.d.ts +2 -1
  295. package/dist/popover/trigger/README.md +23 -0
  296. package/dist/popover/trigger/popover-trigger-button.svelte +14 -10
  297. package/dist/popover/trigger/popover-trigger-button.svelte.d.ts +2 -3
  298. package/dist/popover/trigger/popover-trigger-multi-button-test.svelte +16 -0
  299. package/dist/popover/trigger/popover-trigger-multi-button-test.svelte.d.ts +18 -0
  300. package/dist/popover/trigger/popover-trigger.svelte +19 -7
  301. package/dist/portal/portal.svelte +3 -1
  302. package/dist/primitives/click-outside.d.ts +1 -1
  303. package/dist/primitives/click-outside.js +1 -1
  304. package/dist/primitives/floating.js +12 -4
  305. package/dist/primitives/focus-trap.d.ts +7 -2
  306. package/dist/primitives/focus-trap.js +50 -17
  307. package/dist/primitives/index.d.ts +1 -0
  308. package/dist/primitives/index.js +1 -0
  309. package/dist/primitives/input-modality.d.ts +7 -0
  310. package/dist/primitives/input-modality.js +125 -0
  311. package/dist/table/IMPLEMENTATION_NOTES.md +8 -0
  312. package/dist/table/PLAN-HIDDEN-COLUMNS.md +152 -0
  313. package/dist/table/PLAN.md +924 -0
  314. package/dist/table/README.md +116 -0
  315. package/dist/table/SELECTION_CHECKBOX_PLAN.md +234 -0
  316. package/dist/table/TODO.md +100 -0
  317. package/dist/table/body/README.md +24 -0
  318. package/dist/table/body/table-body.svelte +25 -0
  319. package/dist/table/body/table-body.svelte.d.ts +9 -0
  320. package/dist/table/cell/README.md +25 -0
  321. package/dist/table/cell/table-cell.svelte +247 -0
  322. package/dist/table/cell/table-cell.svelte.d.ts +9 -0
  323. package/dist/table/checkbox/README.md +38 -0
  324. package/dist/table/checkbox/table-checkbox-test.svelte +121 -0
  325. package/dist/table/checkbox/table-checkbox-test.svelte.d.ts +16 -0
  326. package/dist/table/checkbox/table-checkbox.svelte +274 -0
  327. package/dist/table/checkbox/table-checkbox.svelte.d.ts +13 -0
  328. package/dist/table/checkbox-indicator/README.md +29 -0
  329. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte +22 -0
  330. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte.d.ts +10 -0
  331. package/dist/table/column/README.md +32 -0
  332. package/dist/table/column/table-column.svelte +108 -0
  333. package/dist/table/column/table-column.svelte.d.ts +18 -0
  334. package/dist/table/column-header-cell/README.md +28 -0
  335. package/dist/table/column-header-cell/table-column-header-cell.svelte +281 -0
  336. package/dist/table/column-header-cell/table-column-header-cell.svelte.d.ts +9 -0
  337. package/dist/table/column-resizer/README.md +32 -0
  338. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte +51 -0
  339. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte.d.ts +3 -0
  340. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte +83 -0
  341. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte.d.ts +3 -0
  342. package/dist/table/column-resizer/table-column-resizer-test.svelte +75 -0
  343. package/dist/table/column-resizer/table-column-resizer-test.svelte.d.ts +3 -0
  344. package/dist/table/column-resizer/table-column-resizer.svelte +616 -0
  345. package/dist/table/column-resizer/table-column-resizer.svelte.d.ts +11 -0
  346. package/dist/table/empty-state/README.md +25 -0
  347. package/dist/table/empty-state/table-empty-state.svelte +38 -0
  348. package/dist/table/empty-state/table-empty-state.svelte.d.ts +8 -0
  349. package/dist/table/footer/README.md +24 -0
  350. package/dist/table/footer/table-footer.svelte +19 -0
  351. package/dist/table/footer/table-footer.svelte.d.ts +9 -0
  352. package/dist/table/header/README.md +24 -0
  353. package/dist/table/header/table-header.svelte +19 -0
  354. package/dist/table/header/table-header.svelte.d.ts +9 -0
  355. package/dist/table/index.d.ts +16 -0
  356. package/dist/table/index.js +16 -0
  357. package/dist/table/index.parts.d.ts +12 -0
  358. package/dist/table/index.parts.js +12 -0
  359. package/dist/table/root/README.md +56 -0
  360. package/dist/table/root/context.d.ts +198 -0
  361. package/dist/table/root/context.js +1426 -0
  362. package/dist/table/root/table-reorder-test.svelte +64 -0
  363. package/dist/table/root/table-reorder-test.svelte.d.ts +3 -0
  364. package/dist/table/root/table-root.svelte +410 -0
  365. package/dist/table/root/table-root.svelte.d.ts +29 -0
  366. package/dist/table/root/table-test.svelte +165 -0
  367. package/dist/table/root/table-test.svelte.d.ts +25 -0
  368. package/dist/table/row/README.md +27 -0
  369. package/dist/table/row/table-row.svelte +321 -0
  370. package/dist/table/row/table-row.svelte.d.ts +13 -0
  371. package/dist/test-utils/focus-contract.d.ts +3 -0
  372. package/dist/test-utils/focus-contract.js +26 -0
  373. package/dist/timepicker/IMPLEMENTATION_PLAN.md +254 -0
  374. package/dist/timepicker/README.md +97 -0
  375. package/dist/timepicker/TODO.md +86 -0
  376. package/dist/timepicker/clock/README.md +14 -0
  377. package/dist/timepicker/clock/time-picker-clock-test.svelte +45 -0
  378. package/dist/timepicker/clock/time-picker-clock-test.svelte.d.ts +11 -0
  379. package/dist/timepicker/clock/time-picker-clock.svelte +65 -0
  380. package/dist/timepicker/clock/time-picker-clock.svelte.d.ts +10 -0
  381. package/dist/timepicker/index.d.ts +14 -0
  382. package/dist/timepicker/index.js +14 -0
  383. package/dist/timepicker/index.parts.d.ts +8 -0
  384. package/dist/timepicker/index.parts.js +8 -0
  385. package/dist/timepicker/input/README.md +15 -0
  386. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte +40 -0
  387. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte.d.ts +3 -0
  388. package/dist/timepicker/input/time-picker-input.svelte +109 -0
  389. package/dist/timepicker/input/time-picker-input.svelte.d.ts +11 -0
  390. package/dist/timepicker/internal/strict-props.d.ts +4 -0
  391. package/dist/timepicker/internal/strict-props.js +51 -0
  392. package/dist/timepicker/popover/README.md +20 -0
  393. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte +22 -0
  394. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte.d.ts +3 -0
  395. package/dist/timepicker/popover/time-picker-popover.svelte +89 -0
  396. package/dist/timepicker/popover/time-picker-popover.svelte.d.ts +7 -0
  397. package/dist/timepicker/root/README.md +42 -0
  398. package/dist/timepicker/root/context.d.ts +51 -0
  399. package/dist/timepicker/root/context.js +15 -0
  400. package/dist/timepicker/root/time-picker-12h-test.svelte +22 -0
  401. package/dist/timepicker/root/time-picker-12h-test.svelte.d.ts +3 -0
  402. package/dist/timepicker/root/time-picker-bindable-test.svelte +25 -0
  403. package/dist/timepicker/root/time-picker-bindable-test.svelte.d.ts +3 -0
  404. package/dist/timepicker/root/time-picker-empty-test.svelte +20 -0
  405. package/dist/timepicker/root/time-picker-empty-test.svelte.d.ts +3 -0
  406. package/dist/timepicker/root/time-picker-root.svelte +625 -0
  407. package/dist/timepicker/root/time-picker-root.svelte.d.ts +28 -0
  408. package/dist/timepicker/root/time-picker-test.svelte +72 -0
  409. package/dist/timepicker/root/time-picker-test.svelte.d.ts +15 -0
  410. package/dist/timepicker/root/time-utils.d.ts +1 -0
  411. package/dist/timepicker/root/time-utils.js +3 -0
  412. package/dist/timepicker/segment/README.md +14 -0
  413. package/dist/timepicker/segment/time-picker-segment.svelte +365 -0
  414. package/dist/timepicker/segment/time-picker-segment.svelte.d.ts +9 -0
  415. package/dist/timepicker/trigger/README.md +14 -0
  416. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte +35 -0
  417. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte.d.ts +3 -0
  418. package/dist/timepicker/trigger/time-picker-trigger.svelte +122 -0
  419. package/dist/timepicker/trigger/time-picker-trigger.svelte.d.ts +9 -0
  420. package/dist/utils/date-only.d.ts +11 -0
  421. package/dist/utils/date-only.js +53 -0
  422. package/dist/utils/index.d.ts +1 -0
  423. package/dist/utils/index.js +1 -0
  424. package/package.json +41 -1
@@ -3,11 +3,16 @@
3
3
  import { setComboBoxContext, type ComboBoxContext } from './context';
4
4
  import type { ListBoxContext } from '../../listbox/root/context';
5
5
  import { useVirtualFocus } from '../../hooks/use-virtual-focus.svelte';
6
+ import {
7
+ shouldShowFocusVisible,
8
+ trackInteractionModality
9
+ } from '../../primitives/input-modality';
6
10
 
7
11
  type ComboBoxProps<T> = {
8
12
  /** Stable ID used to generate internal ARIA IDs (recommended for SSR). */
9
13
  id?: string;
10
14
  isDisabled?: boolean;
15
+ isPending?: boolean;
11
16
  isReadOnly?: boolean;
12
17
  /** Selected value(s). Single value for single mode, array for multiple mode. Can be bound with bind:value */
13
18
  value?: string | number | (string | number)[];
@@ -43,6 +48,7 @@
43
48
  let {
44
49
  id: rootId,
45
50
  isDisabled = false,
51
+ isPending = false,
46
52
  isReadOnly = false,
47
53
  value = $bindable(),
48
54
  defaultValue,
@@ -98,6 +104,9 @@
98
104
 
99
105
  // Virtual focus for tag navigation in multiple mode
100
106
  let focusedTagId: string | number | null = $state(null);
107
+ let focusWithin = $state(false);
108
+ let focusVisible = $state(false);
109
+ let popoverPointerDownPending = $state(false);
101
110
 
102
111
  // Flag to control whether inputValue should be used for filtering
103
112
  // When false, all items are shown regardless of inputValue
@@ -188,6 +197,7 @@
188
197
  // In multiple mode, selections are managed via tags, not input
189
198
  if (selectionMode === 'single' && val.trim() === '' && currentSelection.size > 0) {
190
199
  const emptySelection = new Set<string | number>();
200
+ selectedInternal = emptySelection;
191
201
  if (isSelectionControlled) {
192
202
  onChange?.(toExternalValue(emptySelection));
193
203
  } else {
@@ -236,6 +246,7 @@
236
246
  }
237
247
  }
238
248
 
249
+ selectedInternal = newSelection;
239
250
  if (isSelectionControlled) {
240
251
  onChange?.(toExternalValue(newSelection));
241
252
  } else {
@@ -257,6 +268,7 @@
257
268
  // Remove from persistent labels
258
269
  selectedLabels.delete(id);
259
270
 
271
+ selectedInternal = newSelection;
260
272
  if (isSelectionControlled) {
261
273
  onChange?.(toExternalValue(newSelection));
262
274
  } else {
@@ -274,6 +286,7 @@
274
286
  function clearSelection() {
275
287
  const emptySelection = new Set<string | number>();
276
288
 
289
+ selectedInternal = emptySelection;
277
290
  if (isSelectionControlled) {
278
291
  onChange?.(toExternalValue(emptySelection));
279
292
  } else {
@@ -335,6 +348,34 @@
335
348
  }
336
349
  }
337
350
 
351
+ function syncFocusWithin() {
352
+ focusWithin =
353
+ !!wrapperRef && !!document.activeElement && wrapperRef.contains(document.activeElement);
354
+ if (!focusWithin) {
355
+ focusVisible = false;
356
+ // Clean up stale data-focused/data-focus-visible that Popover.Root's
357
+ // focus-state module may have set imperatively on the wrapper (the
358
+ // wrapper is briefly used as triggerRef before the input overrides it).
359
+ if (wrapperRef) {
360
+ delete wrapperRef.dataset.focused;
361
+ delete wrapperRef.dataset.focusVisible;
362
+ }
363
+ }
364
+ }
365
+
366
+ function handleFocusIn(event: FocusEvent) {
367
+ focusWithin = true;
368
+ focusVisible = shouldShowFocusVisible(event.target as HTMLElement | null);
369
+ }
370
+
371
+ function handleFocusOut() {
372
+ queueMicrotask(syncFocusWithin);
373
+ }
374
+
375
+ function setFocusVisibleState(visible: boolean) {
376
+ focusVisible = visible && focusWithin;
377
+ }
378
+
338
379
  // Use navigation hook methods for keyboard navigation
339
380
  function selectFocusedItem() {
340
381
  if (navigation.focusedId !== null) {
@@ -346,9 +387,26 @@
346
387
  /**
347
388
  * Handle input blur or escape - restore selection label or clear if no selection
348
389
  */
349
- function handleInputBlur() {
390
+ function consumePopoverPointerDown() {
391
+ if (!popoverPointerDownPending) return false;
392
+ popoverPointerDownPending = false;
393
+ return true;
394
+ }
395
+
396
+ function handleInputBlur(event?: FocusEvent) {
350
397
  // Clear tag virtual focus
351
398
  focusedTagId = null;
399
+
400
+ const nextFocusedElement = event?.relatedTarget;
401
+ const isMovingFocusWithinCombobox =
402
+ nextFocusedElement instanceof Node &&
403
+ ((wrapperRef?.contains(nextFocusedElement) ?? false) ||
404
+ (listboxRef?.contains(nextFocusedElement) ?? false));
405
+
406
+ if (isMovingFocusWithinCombobox || consumePopoverPointerDown()) {
407
+ return;
408
+ }
409
+
352
410
  // Close popover first to prevent flash of options when clearing input
353
411
  closePopover();
354
412
 
@@ -385,6 +443,7 @@
385
443
 
386
444
  function handleKeydown(event: KeyboardEvent) {
387
445
  if (isDisabled) return;
446
+ trackInteractionModality(event, event.target as HTMLElement | null);
388
447
 
389
448
  // Handle tag virtual focus navigation in multiple mode
390
449
  if (focusedTagId !== null && selectionMode === 'multiple') {
@@ -559,6 +618,8 @@
559
618
  event.stopImmediatePropagation();
560
619
  }
561
620
  handleInputBlur();
621
+ // Escape is a keyboard-only path, so focus-visible remains enabled for the input.
622
+ focusVisible = true;
562
623
  event.preventDefault();
563
624
  break;
564
625
  case 'Backspace':
@@ -604,6 +665,9 @@
604
665
  get isDisabled() {
605
666
  return isDisabled;
606
667
  },
668
+ get isPending() {
669
+ return isPending;
670
+ },
607
671
  get isReadOnly() {
608
672
  return isReadOnly;
609
673
  },
@@ -668,12 +732,17 @@
668
732
  unregisterItem: navigation.unregister,
669
733
  handleKeydown,
670
734
  handleInputBlur,
735
+ setFocusVisible: setFocusVisibleState,
671
736
  get focusedTagId() {
672
737
  return focusedTagId;
673
738
  },
674
739
  setFocusedTagId: (id: string | number | null) => {
675
740
  focusedTagId = id;
676
- }
741
+ },
742
+ markPopoverPointerDown: () => {
743
+ popoverPointerDownPending = true;
744
+ },
745
+ consumePopoverPointerDown
677
746
  };
678
747
 
679
748
  setComboBoxContext(ctx);
@@ -684,11 +753,18 @@
684
753
  role="group"
685
754
  aria-label={ariaLabel}
686
755
  aria-labelledby={ariaLabelledby}
756
+ aria-busy={isPending ? 'true' : undefined}
687
757
  class={className}
688
758
  data-combobox
759
+ data-focused={focusWithin || undefined}
689
760
  data-disabled={isDisabled || undefined}
761
+ data-pending={isPending || undefined}
690
762
  data-readonly={isReadOnly || undefined}
763
+ data-focus-within={focusWithin || undefined}
764
+ data-focus-visible={focusVisible || undefined}
691
765
  use:setWrapperAsTrigger
766
+ onfocusin={handleFocusIn}
767
+ onfocusout={handleFocusOut}
692
768
  >
693
769
  {#if children}
694
770
  {@render children()}
@@ -3,6 +3,7 @@ type ComboBoxProps<T> = {
3
3
  /** Stable ID used to generate internal ARIA IDs (recommended for SSR). */
4
4
  id?: string;
5
5
  isDisabled?: boolean;
6
+ isPending?: boolean;
6
7
  isReadOnly?: boolean;
7
8
  /** Selected value(s). Single value for single mode, array for multiple mode. Can be bound with bind:value */
8
9
  value?: string | number | (string | number)[];
@@ -20,6 +20,8 @@ export type ComboBoxContext<T extends object = object> = {
20
20
  selectedValue: Set<string | number>;
21
21
  /** Whether the combobox is disabled */
22
22
  isDisabled: boolean;
23
+ /** Whether the combobox is pending async work */
24
+ isPending: boolean;
23
25
  /** Whether the combobox is read-only */
24
26
  isReadOnly: boolean;
25
27
  /** Selection mode */
@@ -79,11 +81,17 @@ export type ComboBoxContext<T extends object = object> = {
79
81
  /** Handle keyboard events (arrow navigation, enter, escape) */
80
82
  handleKeydown: (event: KeyboardEvent) => void;
81
83
  /** Handle input blur - restore selection or deselect if empty */
82
- handleInputBlur: () => void;
84
+ handleInputBlur: (event?: FocusEvent) => void;
85
+ /** Update root-level focus-visible state based on current modality. */
86
+ setFocusVisible: (visible: boolean) => void;
83
87
  /** Currently focused tag ID (virtual focus for tag navigation) */
84
88
  focusedTagId: string | number | null;
85
89
  /** Set focused tag ID (virtual focus for tag navigation) */
86
90
  setFocusedTagId: (id: string | number | null) => void;
91
+ /** Mark that the next input blur was caused by pointer interaction inside the popover. */
92
+ markPopoverPointerDown: () => void;
93
+ /** Consume the pending popover-pointer marker. */
94
+ consumePopoverPointerDown: () => boolean;
87
95
  };
88
96
  export declare function setComboBoxContext<T extends object = object>(ctx: ComboBoxContext<T>): void;
89
97
  export declare function getComboBoxContext<T extends object = object>(): ComboBoxContext<T> | undefined;
@@ -0,0 +1,37 @@
1
+ # ComboBox Tag
2
+
3
+ ## API reference
4
+
5
+ ### ComboBox.Tag
6
+
7
+ Name: `ComboBox.Tag`
8
+ Description: Visual token representing one selected value in multiple selection mode.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | -------------- | --------------------------------- | ----------- | ------------------------------------ |
12
+ | `children` | `Snippet` | `required` | Tag content. |
13
+ | `class` | `string` | `undefined` | CSS class names for the tag element. |
14
+ | `...restProps` | `HTMLAttributes<HTMLSpanElement>` | `-` | Additional span attributes. |
15
+
16
+ ### TagContextProvider (utility)
17
+
18
+ Name: `TagContextProvider`
19
+ Description: Internal provider used by `ComboBox.Tags` to expose `id`, `label`, `remove`, and `disabled` to tag sub-parts.
20
+
21
+ | Prop | Type | Default | Description |
22
+ | ---------- | ------------------ | ---------- | --------------------------------------- |
23
+ | `id` | `string \| number` | `required` | Selected item id. |
24
+ | `label` | `string` | `required` | Selected item label. |
25
+ | `remove` | `() => void` | `required` | Removes the selected item. |
26
+ | `disabled` | `boolean` | `required` | Disabled state propagated to tag parts. |
27
+ | `children` | `Snippet` | `required` | Wrapped tag subtree. |
28
+
29
+ ### Tag context exports
30
+
31
+ Name: `TAG_CONTEXT_KEY` / `TagContext`
32
+ Description: Shared context key and type consumed by `ComboBox.Tag` and `ComboBox.TagRemove`.
33
+
34
+ | Prop | Type | Default | Description |
35
+ | ----------------- | -------- | ---------------------------- | -------------------------------------------------- |
36
+ | `TAG_CONTEXT_KEY` | `symbol` | `Symbol.for('combobox-tag')` | Global context key for tag state. |
37
+ | `TagContext` | `type` | `-` | Type with `id`, `label`, `remove`, and `disabled`. |
@@ -0,0 +1,14 @@
1
+ # ComboBox Tag Remove
2
+
3
+ ## API reference
4
+
5
+ ### ComboBox.TagRemove
6
+
7
+ Name: `ComboBox.TagRemove`
8
+ Description: Remove action button for a selected tag.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | -------------- | ---------------------- | ----------- | --------------------------------------------------------------- |
12
+ | `children` | `Snippet` | `X icon` | Custom button content. |
13
+ | `class` | `string` | `undefined` | CSS class names for the remove button. |
14
+ | `...restProps` | `HTMLButtonAttributes` | `-` | Additional button attributes, excluding reserved trigger props. |
@@ -2,6 +2,7 @@
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLButtonAttributes } from 'svelte/elements';
4
4
  import { getContext } from 'svelte';
5
+ import { ButtonRoot } from '../../button/index.js';
5
6
  import { cn } from '../../utils/cn';
6
7
  import { TAG_CONTEXT_KEY, type TagContext } from '../tag/combobox-tag.svelte';
7
8
 
@@ -27,7 +28,7 @@
27
28
  </script>
28
29
 
29
30
  {#if !tagCtx.disabled}
30
- <button
31
+ <ButtonRoot
31
32
  type="button"
32
33
  onclick={handleClick}
33
34
  aria-label={`Remove ${tagCtx.label}`}
@@ -49,5 +50,5 @@
49
50
  />
50
51
  </svg>
51
52
  {/if}
52
- </button>
53
+ </ButtonRoot>
53
54
  {/if}
@@ -0,0 +1,23 @@
1
+ # ComboBox Tags
2
+
3
+ ## API reference
4
+
5
+ ### ComboBox.Tags
6
+
7
+ Name: `ComboBox.Tags`
8
+ Description: Container that renders selected values as tags in multiple mode.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | ---------- | ------------------------------ | ---------- | --------------------------------------------------------------------------------- |
12
+ | `children` | `Snippet<[{ item: TagItem }]>` | `required` | Render function that receives each selected item as `{ item: { value, label } }`. |
13
+ | `class` | `string` | `''` | CSS class names for the tags container. |
14
+
15
+ ### TagItem type
16
+
17
+ Name: `TagItem`
18
+ Description: Item shape provided to `ComboBox.Tags` render snippet.
19
+
20
+ | Prop | Type | Default | Description |
21
+ | ------- | ------------------ | ---------- | ------------------------------------- |
22
+ | `value` | `string \| number` | `required` | Selected value id. |
23
+ | `label` | `string` | `required` | Display label for the selected value. |
@@ -0,0 +1,21 @@
1
+ # ComboBox Trigger
2
+
3
+ ## API reference
4
+
5
+ ### ComboBox.Trigger
6
+
7
+ Name: `ComboBox.Trigger`
8
+ Description: Optional trigger button that toggles the combobox popover without stealing focus from the input.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | -------------- | ---------------------- | ----------- | --------------------------------------------------------------- |
12
+ | `class` | `string` | `undefined` | CSS class names for the trigger element. |
13
+ | `children` | `Snippet` | `undefined` | Custom trigger content. If omitted, a chevron icon is rendered. |
14
+ | `tabindex` | `number` | `-1` | Tab index applied to the trigger button. |
15
+ | `...restProps` | `HTMLButtonAttributes` | `-` | Additional native button attributes. |
16
+
17
+ ## Notes
18
+
19
+ - `ComboBox.Trigger` reflects the root pending state through `data-pending`.
20
+ - While the combobox is disabled, read-only, or pending, the trigger becomes non-interactive.
21
+ - `ComboBox.Button` remains available as a compatibility alias.
@@ -0,0 +1,56 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import type { HTMLButtonAttributes } from 'svelte/elements';
4
+ import { ButtonRoot } from '../../button/index.js';
5
+ import { useComboBoxContext } from '../root/context';
6
+
7
+ type ComboBoxTriggerProps = HTMLButtonAttributes & {
8
+ class?: string;
9
+ children?: Snippet;
10
+ };
11
+
12
+ let { class: className, children, tabindex = -1, ...restProps }: ComboBoxTriggerProps = $props();
13
+
14
+ const ctx = useComboBoxContext();
15
+ const isTriggerDisabled = $derived(ctx.isDisabled || ctx.isReadOnly || ctx.isPending);
16
+
17
+ function handleMouseDown(event: MouseEvent) {
18
+ event.preventDefault();
19
+ if (!isTriggerDisabled) {
20
+ ctx.toggle();
21
+ }
22
+ }
23
+ </script>
24
+
25
+ <ButtonRoot
26
+ type="button"
27
+ {tabindex}
28
+ aria-label={ctx.isOpen ? 'Close menu' : 'Open menu'}
29
+ aria-expanded={ctx.isOpen}
30
+ aria-controls={`combobox-listbox-${ctx.instanceId}`}
31
+ isDisabled={ctx.isDisabled || ctx.isReadOnly}
32
+ isPending={ctx.isPending}
33
+ pressed={ctx.isOpen}
34
+ onmousedown={handleMouseDown}
35
+ class={className}
36
+ {...restProps}
37
+ >
38
+ {#if children}
39
+ {@render children()}
40
+ {:else}
41
+ <svg
42
+ xmlns="http://www.w3.org/2000/svg"
43
+ width="16"
44
+ height="16"
45
+ viewBox="0 0 24 24"
46
+ fill="none"
47
+ stroke="currentColor"
48
+ stroke-width="2"
49
+ stroke-linecap="round"
50
+ stroke-linejoin="round"
51
+ class="transition-transform {ctx.isOpen ? 'rotate-180' : ''}"
52
+ >
53
+ <path d="m6 9 6 6 6-6" />
54
+ </svg>
55
+ {/if}
56
+ </ButtonRoot>
@@ -0,0 +1,9 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLButtonAttributes } from 'svelte/elements';
3
+ type ComboBoxTriggerProps = HTMLButtonAttributes & {
4
+ class?: string;
5
+ children?: Snippet;
6
+ };
7
+ declare const ComboboxTrigger: import("svelte").Component<ComboBoxTriggerProps, {}, "">;
8
+ type ComboboxTrigger = ReturnType<typeof ComboboxTrigger>;
9
+ export default ComboboxTrigger;
@@ -0,0 +1,100 @@
1
+ # DatePicker
2
+
3
+ ## Description
4
+
5
+ `DatePicker` composes a segmented date input with a calendar popover for selecting dates.
6
+
7
+ ## Anatomy
8
+
9
+ - `DatePicker.Root`
10
+ - `DatePicker.Input`
11
+ - `DatePicker.Segment`
12
+ - `DatePicker.Trigger`
13
+ - `DatePicker.Popover`
14
+ - `DatePicker.Calendar`
15
+ - `DatePicker.TriggerPrevious`
16
+ - `DatePicker.Heading`
17
+ - `DatePicker.TriggerNext`
18
+ - `DatePicker.Grid`
19
+ - `DatePicker.GridHeader`
20
+ - `DatePicker.HeaderCell`
21
+ - `DatePicker.GridBody`
22
+ - `DatePicker.BodyCell`
23
+
24
+ ```svelte
25
+ <DatePicker.Root>
26
+ <DatePicker.Input aria-label="Date input">
27
+ {#snippet children(segment)}
28
+ <DatePicker.Segment {segment} />
29
+ {/snippet}
30
+ </DatePicker.Input>
31
+ <DatePicker.Trigger />
32
+
33
+ <DatePicker.Popover>
34
+ <DatePicker.Calendar>
35
+ <div>
36
+ <DatePicker.TriggerPrevious />
37
+ <DatePicker.Heading />
38
+ <DatePicker.TriggerNext />
39
+ </div>
40
+ <DatePicker.Grid>
41
+ <DatePicker.GridHeader />
42
+ <DatePicker.GridBody />
43
+ </DatePicker.Grid>
44
+ </DatePicker.Calendar>
45
+ </DatePicker.Popover>
46
+ </DatePicker.Root>
47
+ ```
48
+
49
+ ## Root API
50
+
51
+ - `value?: string | null` (`YYYY-MM-DD`)
52
+ - `defaultValue?: string | null` (`YYYY-MM-DD`)
53
+ - `onChange?: (value: string | null) => void`
54
+ - `isDisabled?: boolean`
55
+ - `isReadOnly?: boolean`
56
+ - `minValue?: string` (`YYYY-MM-DD`)
57
+ - `maxValue?: string` (`YYYY-MM-DD`)
58
+ - `isDateUnavailable?: (date: string) => boolean`
59
+ - `open?: boolean`
60
+ - `defaultOpen?: boolean`
61
+ - `onOpenChange?: (open: boolean, details: { reason, event?, cancel(), isCanceled }) => void`
62
+ - `closeOnSelect?: boolean`
63
+ - Null-first empty contract: when `value` and `defaultValue` are omitted, the empty state is `null`.
64
+ - `DatePicker.Input` exposes `aria-invalid` and `data-invalid` when the current segment draft is not committeable.
65
+
66
+ ## Popover API
67
+
68
+ - `DatePicker.Popover` forwards `Popover.Content` props (for example `placement`, `offset`, `shouldFlip`, `boundaryElement`, `isNonModal`, and close behavior props).
69
+ - The following are controlled internally by `DatePicker` and are not accepted on `DatePicker.Popover`: `open`, `triggerRef`, `onOpenChange`, `id`.
70
+ - Defaults:
71
+ - `placement` defaults to `bottom-start`.
72
+ - `aria-label` defaults to `Calendar`.
73
+ - `initialFocus` defaults to focusing the current active day cell in the calendar grid.
74
+
75
+ ## Calendar API
76
+
77
+ - `DatePicker.Calendar` forwards `Calendar.Root` props except those controlled by `DatePicker.Root`.
78
+ - The following are controlled internally by `DatePicker` and are not accepted on `DatePicker.Calendar`: `selectionMode`, `value`, `defaultValue`, `onChange`, `isDisabled`, `isReadOnly`, `isDateUnavailable`.
79
+
80
+ ## Notes
81
+
82
+ - Locale is read from `LocaleProvider` when available.
83
+ - Segment accessible names are resolved automatically from the active locale.
84
+ - During segment editing, the committed value is set to `null` when the draft is incomplete, invalid, out-of-range, or unavailable.
85
+ - Current MVP focuses on date-only values.
86
+
87
+ ## UX Decisions
88
+
89
+ - **No Date Auto-Correction:** When users manually type dates out of the configured bounds (`minValue`/`maxValue`) or dates that are unavailable, the DatePicker **does not auto-correct** the typed value. Instead, it exposes `aria-invalid="true"` and `data-invalid` on the input, allowing the user to see what they typed incorrectly. The underlying committed value is kept as `null` until a valid date is completed. Auto-correcting input without explicit user consent is an inaccessible anti-pattern.
90
+ - **Navigable Disabled Dates:** When using the Calendar, disabled dates remain focusable via keyboard navigation. This ensures ARIA Grid spatial navigation parity so that screen readers can consistently announce all calendar cells and report them as "disabled", rather than skipping over them and disorienting the user.
91
+
92
+ ## Focus behavior decisions
93
+
94
+ - DatePicker aligns with the shared modality primitive (`primitives/input-modality.ts`) for `keyboard`, `pointer`, and `virtual` interactions.
95
+ - `data-focus-visible` is modality-driven; `data-focused` and `data-focus-within` continue to represent real DOM focus state.
96
+ - Trigger focus restore after calendar close is modality-aware:
97
+ - keyboard close paths keep visible focus,
98
+ - pointer outside close restores focus without visible focus.
99
+ - The component keeps explicit `trackInteractionModality(...)` calls in local handlers to ensure deterministic modality updates before local focus-state logic runs.
100
+ - Cross-component focus contract and invariants are documented in `FOCUS_STATE_CONTRACT.md`.
@@ -0,0 +1,28 @@
1
+ # DatePicker TODO
2
+
3
+ ## Goal
4
+
5
+ Track DatePicker work with a single mandatory TODO format.
6
+
7
+ ## Backlog
8
+
9
+ - [x] [M][P0][Area: Context][Owner: Unassigned][Target: Done] Complete core context wiring.
10
+ - [x] [M][P0][Area: State][Owner: Unassigned][Target: Done] Implement root state and value handling.
11
+ - [x] [M][P0][Area: Parsing][Owner: Unassigned][Target: Done] Integrate segment parser and formatter.
12
+ - [x] [M][P0][Area: Input][Owner: Unassigned][Target: Done] Deliver baseline segmented input rendering.
13
+ - [x] [M][P0][Area: Composition][Owner: Unassigned][Target: Done] Integrate calendar popover behavior.
14
+ - [x] [M][P0][Area: Accessibility][Owner: Unassigned][Target: Done] Implement keyboard navigation baseline.
15
+ - [x] [M][P0][Area: Validation][Owner: Unassigned][Target: Done] Implement min/max and unavailable date validation baseline.
16
+ - [x] [M][P0][Area: API][Owner: Unassigned][Target: Done] Ship public exports and baseline docs/tests.
17
+ - [x] [M][P0][Area: Forms][Owner: Unassigned][Target: Done] Support rich object values and hidden input synchronization.
18
+ - [x] [M][P0][Area: Focus][Owner: Unassigned][Target: Done] Unify focus-visible behavior with shared modality semantics.
19
+ - [x] [S][P1][Area: Focus][Owner: Unassigned][Target: Done] Remove DatePicker-local modality tracking in favor of shared primitive.
20
+ - [x] [S][P1][Area: Documentation][Owner: Unassigned][Target: Done] Document focus contract updates and DatePicker rationale.
21
+ - [ ] [S][P1][Area: Calendar][Owner: Unassigned][Target: TBD] Add multi-month calendar display.
22
+ - [ ] [S][P1][Area: Accessibility][Owner: Unassigned][Target: TBD] Run deep accessibility audit (SR + keyboard edge cases).
23
+ - [ ] [C][P2][Area: Time][Owner: Unassigned][Target: TBD] Add time selection integration.
24
+ - [ ] [C][P2][Area: API][Owner: Unassigned][Target: TBD] Decide and implement date-range mode strategy.
25
+ - [ ] [C][P2][Area: Input][Owner: Unassigned][Target: TBD] Add input mask helper utilities.
26
+ - [ ] [C][P2][Area: Mobile][Owner: Unassigned][Target: TBD] Add mobile-optimized interaction pass.
27
+ - [ ] [C][P2][Area: UX][Owner: Unassigned][Target: TBD] Add preset shortcuts (today, next week, custom).
28
+ - [ ] [C][P2][Area: Performance][Owner: Unassigned][Target: TBD] Add segment update micro-benchmarks and optimizations.
@@ -0,0 +1,19 @@
1
+ # DatePicker Calendar
2
+
3
+ ## API reference
4
+
5
+ ### DatePicker.Calendar
6
+
7
+ Name: `DatePicker.Calendar`
8
+ Description: Calendar composition part connected to `DatePicker.Root` selected date and navigation state.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------------ |
12
+ | `children` | `Snippet` | `undefined` | Optional custom calendar content. |
13
+ | `class` | `string` | `''` | CSS class names for the calendar wrapper. |
14
+ | `...restProps` | `Omit<ComponentProps<typeof Calendar.Root>, 'selectionMode' \| 'value' \| 'defaultValue' \| 'onChange' \| 'isDisabled' \| 'isReadOnly' \| 'isDateUnavailable'>` | `-` | Additional calendar root props forwarded by this part. |
15
+
16
+ ### Notes
17
+
18
+ Name: Root-controlled calendar props
19
+ Description: `selectionMode`, `value`, `defaultValue`, `onChange`, `isDisabled`, `isReadOnly`, and `isDateUnavailable` are controlled by `DatePicker.Root` and ignored when passed to this part.
@@ -0,0 +1,60 @@
1
+ <script lang="ts">
2
+ import DatePicker from '../index';
3
+
4
+ let unsafeOnChangeCalls = $state(0);
5
+ let selectedValue = $state<string | null>('');
6
+
7
+ const unsafeCalendarProps: Record<string, unknown> = {
8
+ selectionMode: 'range',
9
+ value: { start: '2026-02-01', end: '2026-02-05' },
10
+ defaultValue: '2026-02-20',
11
+ onChange: () => {
12
+ unsafeOnChangeCalls += 1;
13
+ },
14
+ isDisabled: true,
15
+ isReadOnly: true,
16
+ isDateUnavailable: () => true
17
+ };
18
+ </script>
19
+
20
+ <DatePicker.Root
21
+ defaultValue="2026-02-10"
22
+ defaultOpen={true}
23
+ onChange={(nextValue) => {
24
+ selectedValue = nextValue;
25
+ }}
26
+ >
27
+ <DatePicker.Input class="date-picker-input" aria-label="Date input">
28
+ {#snippet children(segment)}
29
+ <DatePicker.Segment class="date-picker-segment" {segment} />
30
+ {/snippet}
31
+ </DatePicker.Input>
32
+ <DatePicker.Trigger class="date-picker-trigger">Open calendar</DatePicker.Trigger>
33
+
34
+ <DatePicker.Popover class="date-picker-popover">
35
+ <DatePicker.Calendar class="date-picker-calendar" {...unsafeCalendarProps}>
36
+ <div class="flex items-center justify-between gap-2 p-2">
37
+ <DatePicker.TriggerPrevious />
38
+ <DatePicker.Heading />
39
+ <DatePicker.TriggerNext />
40
+ </div>
41
+ <DatePicker.Grid>
42
+ <DatePicker.GridHeader>
43
+ {#snippet children(dayLabel: string)}
44
+ <DatePicker.HeaderCell>
45
+ {dayLabel}
46
+ </DatePicker.HeaderCell>
47
+ {/snippet}
48
+ </DatePicker.GridHeader>
49
+ <DatePicker.GridBody>
50
+ {#snippet children(date: string)}
51
+ <DatePicker.BodyCell {date} />
52
+ {/snippet}
53
+ </DatePicker.GridBody>
54
+ </DatePicker.Grid>
55
+ </DatePicker.Calendar>
56
+ </DatePicker.Popover>
57
+ </DatePicker.Root>
58
+
59
+ <p data-testid="unsafe-on-change-calls">{unsafeOnChangeCalls}</p>
60
+ <p data-testid="selected-value">{selectedValue}</p>
@@ -0,0 +1,3 @@
1
+ declare const DatePickerCalendarUnsafePropsTest: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type DatePickerCalendarUnsafePropsTest = ReturnType<typeof DatePickerCalendarUnsafePropsTest>;
3
+ export default DatePickerCalendarUnsafePropsTest;