@human-kit/svelte-components 1.0.0-alpha.2 → 1.0.0-alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) 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 +393 -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 +2 -1
  15. package/dist/calendar/TODO.md +21 -107
  16. package/dist/calendar/body-cell/README.md +15 -0
  17. package/dist/calendar/body-cell/calendar-body-cell.svelte +116 -41
  18. package/dist/calendar/grid/README.md +13 -0
  19. package/dist/calendar/grid-body/README.md +13 -0
  20. package/dist/calendar/grid-header/README.md +13 -0
  21. package/dist/calendar/header-cell/README.md +14 -0
  22. package/dist/calendar/heading/README.md +13 -0
  23. package/dist/calendar/index.d.ts +3 -3
  24. package/dist/calendar/index.js +3 -3
  25. package/dist/calendar/root/README.md +24 -0
  26. package/dist/calendar/root/calendar-root-test.svelte +4 -0
  27. package/dist/calendar/root/calendar-root-test.svelte.d.ts +1 -0
  28. package/dist/calendar/root/calendar-root.svelte +3 -0
  29. package/dist/calendar/root/calendar-root.svelte.d.ts +1 -0
  30. package/dist/calendar/root/context.d.ts +4 -0
  31. package/dist/calendar/root/context.js +28 -25
  32. package/dist/calendar/root/date-utils.d.ts +1 -1
  33. package/dist/calendar/root/date-utils.js +16 -26
  34. package/dist/calendar/trigger-next/README.md +14 -0
  35. package/dist/calendar/trigger-next/calendar-trigger-next.svelte +9 -4
  36. package/dist/calendar/trigger-next/calendar-trigger-next.svelte.d.ts +2 -1
  37. package/dist/calendar/trigger-previous/README.md +14 -0
  38. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte +9 -4
  39. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte.d.ts +2 -1
  40. package/dist/checkbox/README.md +53 -0
  41. package/dist/checkbox/TODO.md +16 -0
  42. package/dist/checkbox/index.d.ts +6 -0
  43. package/dist/checkbox/index.js +6 -0
  44. package/dist/checkbox/index.parts.d.ts +2 -0
  45. package/dist/checkbox/index.parts.js +2 -0
  46. package/dist/checkbox/indicator/README.md +23 -0
  47. package/dist/checkbox/indicator/checkbox-indicator.svelte +43 -0
  48. package/dist/checkbox/indicator/checkbox-indicator.svelte.d.ts +10 -0
  49. package/dist/checkbox/root/README.md +47 -0
  50. package/dist/checkbox/root/checkbox-label-test.svelte +10 -0
  51. package/dist/checkbox/root/checkbox-label-test.svelte.d.ts +18 -0
  52. package/dist/checkbox/root/checkbox-root.svelte +386 -0
  53. package/dist/checkbox/root/checkbox-root.svelte.d.ts +29 -0
  54. package/dist/checkbox/root/checkbox-test.svelte +59 -0
  55. package/dist/checkbox/root/checkbox-test.svelte.d.ts +18 -0
  56. package/dist/checkbox/root/context.d.ts +21 -0
  57. package/dist/checkbox/root/context.js +15 -0
  58. package/dist/clock/README.md +75 -0
  59. package/dist/clock/axis/README.md +24 -0
  60. package/dist/clock/axis/clock-axis.svelte +37 -0
  61. package/dist/clock/axis/clock-axis.svelte.d.ts +8 -0
  62. package/dist/clock/hooks/use-wheel-scroll.svelte.d.ts +16 -0
  63. package/dist/clock/hooks/use-wheel-scroll.svelte.js +336 -0
  64. package/dist/clock/index.d.ts +10 -0
  65. package/dist/clock/index.js +10 -0
  66. package/dist/clock/index.parts.d.ts +4 -0
  67. package/dist/clock/index.parts.js +4 -0
  68. package/dist/clock/root/README.md +38 -0
  69. package/dist/clock/root/clock-root-test.svelte +62 -0
  70. package/dist/clock/root/clock-root-test.svelte.d.ts +14 -0
  71. package/dist/clock/root/clock-root.svelte +329 -0
  72. package/dist/clock/root/clock-root.svelte.d.ts +25 -0
  73. package/dist/clock/root/context.d.ts +22 -0
  74. package/dist/clock/root/context.js +15 -0
  75. package/dist/clock/root/resolve-visible-columns.d.ts +7 -0
  76. package/dist/clock/root/resolve-visible-columns.js +16 -0
  77. package/dist/clock/root/time-utils.d.ts +48 -0
  78. package/dist/clock/root/time-utils.js +314 -0
  79. package/dist/clock/root/wheel-options.d.ts +17 -0
  80. package/dist/clock/root/wheel-options.js +63 -0
  81. package/dist/clock/wheel-column/README.md +25 -0
  82. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte +16 -0
  83. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte.d.ts +3 -0
  84. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte +29 -0
  85. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte.d.ts +6 -0
  86. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte +11 -0
  87. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte.d.ts +3 -0
  88. package/dist/clock/wheel-column/clock-wheel-column-test.svelte +38 -0
  89. package/dist/clock/wheel-column/clock-wheel-column-test.svelte.d.ts +12 -0
  90. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte +38 -0
  91. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte.d.ts +12 -0
  92. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte +29 -0
  93. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte.d.ts +6 -0
  94. package/dist/clock/wheel-column/clock-wheel-column.svelte +499 -0
  95. package/dist/clock/wheel-column/clock-wheel-column.svelte.d.ts +17 -0
  96. package/dist/clock/wheel-item/README.md +17 -0
  97. package/dist/clock/wheel-item/clock-wheel-item.svelte +49 -0
  98. package/dist/clock/wheel-item/clock-wheel-item.svelte.d.ts +17 -0
  99. package/dist/combobox/README.md +8 -2
  100. package/dist/combobox/TODO.md +28 -175
  101. package/dist/combobox/button/README.md +8 -3
  102. package/dist/combobox/button/combobox-button-test.svelte +27 -0
  103. package/dist/combobox/button/combobox-button-test.svelte.d.ts +6 -0
  104. package/dist/combobox/button/combobox-button.svelte +10 -11
  105. package/dist/combobox/clear/README.md +21 -0
  106. package/dist/combobox/clear/combobox-clear-test.svelte +34 -0
  107. package/dist/combobox/clear/combobox-clear-test.svelte.d.ts +3 -0
  108. package/dist/combobox/clear/combobox-clear.svelte +61 -0
  109. package/dist/combobox/clear/combobox-clear.svelte.d.ts +9 -0
  110. package/dist/combobox/index.d.ts +5 -3
  111. package/dist/combobox/index.js +5 -3
  112. package/dist/combobox/index.parts.d.ts +2 -0
  113. package/dist/combobox/index.parts.js +2 -0
  114. package/dist/combobox/input/combobox-input.svelte +44 -12
  115. package/dist/combobox/item/combobox-item-implicit-text-test.svelte +1 -1
  116. package/dist/combobox/item/combobox-listboxitem.svelte +14 -11
  117. package/dist/combobox/item-indicator/combobox-item-indicator.svelte +4 -15
  118. package/dist/combobox/list/combobox-listbox.svelte +1 -0
  119. package/dist/combobox/list/combobox-listbox.svelte.d.ts +2 -1
  120. package/dist/combobox/popover/README.md +18 -4
  121. package/dist/combobox/popover/combobox-popover-props-test.svelte +38 -0
  122. package/dist/combobox/popover/combobox-popover-props-test.svelte.d.ts +11 -0
  123. package/dist/combobox/popover/combobox-popover.svelte +166 -23
  124. package/dist/combobox/popover/combobox-popover.svelte.d.ts +3 -3
  125. package/dist/combobox/popover/combobox-scrollable-list-test.svelte +23 -0
  126. package/dist/combobox/popover/combobox-scrollable-list-test.svelte.d.ts +18 -0
  127. package/dist/combobox/root/README.md +1 -0
  128. package/dist/combobox/root/combobox-multiselect-test.svelte +5 -3
  129. package/dist/combobox/root/combobox-multiselect-test.svelte.d.ts +1 -0
  130. package/dist/combobox/root/combobox-numeric-string-id-test.svelte +1 -1
  131. package/dist/combobox/root/combobox-test.svelte +23 -4
  132. package/dist/combobox/root/combobox-test.svelte.d.ts +2 -0
  133. package/dist/combobox/root/combobox.svelte +119 -13
  134. package/dist/combobox/root/combobox.svelte.d.ts +1 -0
  135. package/dist/combobox/root/context.d.ts +19 -1
  136. package/dist/combobox/tag-remove/combobox-tag-remove.svelte +3 -2
  137. package/dist/combobox/trigger/README.md +21 -0
  138. package/dist/combobox/trigger/combobox-trigger.svelte +56 -0
  139. package/dist/combobox/trigger/combobox-trigger.svelte.d.ts +9 -0
  140. package/dist/datepicker/README.md +100 -0
  141. package/dist/datepicker/TODO.md +28 -0
  142. package/dist/datepicker/calendar/README.md +19 -0
  143. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte +60 -0
  144. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte.d.ts +3 -0
  145. package/dist/datepicker/calendar/date-picker-calendar.svelte +65 -0
  146. package/dist/datepicker/calendar/date-picker-calendar.svelte.d.ts +10 -0
  147. package/dist/datepicker/index.d.ts +18 -0
  148. package/dist/datepicker/index.js +18 -0
  149. package/dist/datepicker/index.parts.d.ts +14 -0
  150. package/dist/datepicker/index.parts.js +14 -0
  151. package/dist/datepicker/input/README.md +15 -0
  152. package/dist/datepicker/input/date-picker-input.svelte +108 -0
  153. package/dist/datepicker/input/date-picker-input.svelte.d.ts +11 -0
  154. package/dist/datepicker/internal/strict-props.d.ts +2 -0
  155. package/dist/datepicker/internal/strict-props.js +28 -0
  156. package/dist/datepicker/popover/README.md +20 -0
  157. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte +57 -0
  158. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte.d.ts +3 -0
  159. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte +45 -0
  160. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte.d.ts +18 -0
  161. package/dist/datepicker/popover/date-picker-popover.svelte +87 -0
  162. package/dist/datepicker/popover/date-picker-popover.svelte.d.ts +7 -0
  163. package/dist/datepicker/root/README.md +38 -0
  164. package/dist/datepicker/root/context.d.ts +43 -0
  165. package/dist/datepicker/root/context.js +15 -0
  166. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte +24 -0
  167. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte.d.ts +3 -0
  168. package/dist/datepicker/root/date-picker-bindable-test.svelte +41 -0
  169. package/dist/datepicker/root/date-picker-bindable-test.svelte.d.ts +3 -0
  170. package/dist/datepicker/root/date-picker-empty-test.svelte +47 -0
  171. package/dist/datepicker/root/date-picker-empty-test.svelte.d.ts +3 -0
  172. package/dist/datepicker/root/date-picker-locale-typing-test.svelte +47 -0
  173. package/dist/datepicker/root/date-picker-locale-typing-test.svelte.d.ts +3 -0
  174. package/dist/datepicker/root/date-picker-open-cancel-test.svelte +54 -0
  175. package/dist/datepicker/root/date-picker-open-cancel-test.svelte.d.ts +8 -0
  176. package/dist/datepicker/root/date-picker-root.svelte +495 -0
  177. package/dist/datepicker/root/date-picker-root.svelte.d.ts +24 -0
  178. package/dist/datepicker/root/date-picker-test.svelte +86 -0
  179. package/dist/datepicker/root/date-picker-test.svelte.d.ts +13 -0
  180. package/dist/datepicker/root/date-utils.d.ts +17 -0
  181. package/dist/datepicker/root/date-utils.js +138 -0
  182. package/dist/datepicker/root/draft-evaluation.d.ts +13 -0
  183. package/dist/datepicker/root/draft-evaluation.js +56 -0
  184. package/dist/datepicker/root/focus-controller.d.ts +3 -0
  185. package/dist/datepicker/root/focus-controller.js +15 -0
  186. package/dist/datepicker/root/open-change.d.ts +5 -0
  187. package/dist/datepicker/root/open-change.js +13 -0
  188. package/dist/datepicker/root/open-controller.d.ts +7 -0
  189. package/dist/datepicker/root/open-controller.js +15 -0
  190. package/dist/datepicker/root/segment-controller.d.ts +8 -0
  191. package/dist/datepicker/root/segment-controller.js +53 -0
  192. package/dist/datepicker/root/segment-state.d.ts +18 -0
  193. package/dist/datepicker/root/segment-state.js +134 -0
  194. package/dist/datepicker/root/value-commit.d.ts +4 -0
  195. package/dist/datepicker/root/value-commit.js +8 -0
  196. package/dist/datepicker/segment/README.md +14 -0
  197. package/dist/datepicker/segment/date-picker-segment.svelte +319 -0
  198. package/dist/datepicker/segment/date-picker-segment.svelte.d.ts +9 -0
  199. package/dist/datepicker/trigger/README.md +14 -0
  200. package/dist/datepicker/trigger/date-picker-trigger.svelte +110 -0
  201. package/dist/datepicker/trigger/date-picker-trigger.svelte.d.ts +9 -0
  202. package/dist/dialog/content/dialog-content.svelte +6 -6
  203. package/dist/dialog/index.d.ts +3 -3
  204. package/dist/dialog/index.js +2 -2
  205. package/dist/dialog/root/context.d.ts +2 -1
  206. package/dist/dialog/root/dialog-root.svelte +9 -2
  207. package/dist/dialog/trigger/dialog-trigger.svelte +3 -0
  208. package/dist/hooks/use-virtual-focus.svelte.js +3 -1
  209. package/dist/index.d.ts +31 -17
  210. package/dist/index.js +31 -17
  211. package/dist/input/README.md +38 -0
  212. package/dist/input/TODO.md +12 -0
  213. package/dist/input/input-test.svelte +43 -0
  214. package/dist/input/input-test.svelte.d.ts +12 -0
  215. package/dist/input/input.svelte +151 -7
  216. package/dist/input/input.svelte.d.ts +8 -2
  217. package/dist/listbox/index.d.ts +3 -3
  218. package/dist/listbox/index.js +3 -3
  219. package/dist/listbox/item/README.md +2 -1
  220. package/dist/listbox/item/listbox-item.svelte +260 -6
  221. package/dist/listbox/item/listbox-item.svelte.d.ts +6 -0
  222. package/dist/listbox/root/context.d.ts +6 -0
  223. package/dist/listbox/root/context.js +23 -13
  224. package/dist/listbox/root/listbox-test.svelte +14 -2
  225. package/dist/listbox/root/listbox-test.svelte.d.ts +1 -0
  226. package/dist/listbox/root/listbox.svelte +49 -2
  227. package/dist/listbox/root/listbox.svelte.d.ts +4 -2
  228. package/dist/popover/README.md +10 -0
  229. package/dist/popover/content/README.md +11 -0
  230. package/dist/popover/content/popover-content-controlled-close-test.svelte +30 -0
  231. package/dist/popover/content/popover-content-controlled-close-test.svelte.d.ts +3 -0
  232. package/dist/popover/content/popover-content-standalone-test.svelte +28 -0
  233. package/dist/popover/content/popover-content-standalone-test.svelte.d.ts +6 -0
  234. package/dist/popover/content/popover-content-test.svelte +32 -2
  235. package/dist/popover/content/popover-content-test.svelte.d.ts +3 -1
  236. package/dist/popover/content/popover-content.svelte +315 -24
  237. package/dist/popover/content/popover-content.svelte.d.ts +5 -1
  238. package/dist/popover/index.d.ts +3 -3
  239. package/dist/popover/index.js +3 -5
  240. package/dist/popover/root/README.md +10 -15
  241. package/dist/popover/root/context.d.ts +16 -7
  242. package/dist/popover/root/context.js +0 -2
  243. package/dist/popover/root/focus-state.d.ts +4 -0
  244. package/dist/popover/root/focus-state.js +33 -0
  245. package/dist/popover/root/popover-root.svelte +90 -17
  246. package/dist/popover/root/popover-root.svelte.d.ts +2 -1
  247. package/dist/popover/root/popover-test.svelte +2 -1
  248. package/dist/popover/root/popover-test.svelte.d.ts +2 -1
  249. package/dist/popover/trigger/popover-trigger-button-root-test.svelte +17 -0
  250. package/dist/popover/trigger/popover-trigger-button-root-test.svelte.d.ts +18 -0
  251. package/dist/popover/trigger/popover-trigger-button.svelte +9 -7
  252. package/dist/popover/trigger/popover-trigger.svelte +17 -5
  253. package/dist/portal/portal.svelte +3 -1
  254. package/dist/primitives/click-outside.d.ts +1 -1
  255. package/dist/primitives/click-outside.js +1 -1
  256. package/dist/primitives/floating.js +12 -4
  257. package/dist/primitives/focus-trap.d.ts +7 -2
  258. package/dist/primitives/focus-trap.js +50 -17
  259. package/dist/primitives/index.d.ts +1 -0
  260. package/dist/primitives/index.js +1 -0
  261. package/dist/primitives/input-modality.d.ts +7 -0
  262. package/dist/primitives/input-modality.js +125 -0
  263. package/dist/primitives/keyboard-navigation.d.ts +1 -0
  264. package/dist/primitives/keyboard-navigation.js +17 -0
  265. package/dist/table/IMPLEMENTATION_NOTES.md +9 -0
  266. package/dist/table/PLAN-HIDDEN-COLUMNS.md +152 -0
  267. package/dist/table/PLAN.md +1336 -0
  268. package/dist/table/README.md +143 -0
  269. package/dist/table/SELECTION_CHECKBOX_PLAN.md +234 -0
  270. package/dist/table/TODO.md +138 -0
  271. package/dist/table/body/README.md +39 -0
  272. package/dist/table/body/table-body-items-test.svelte +45 -0
  273. package/dist/table/body/table-body-items-test.svelte.d.ts +18 -0
  274. package/dist/table/body/table-body.svelte +171 -0
  275. package/dist/table/body/table-body.svelte.d.ts +45 -0
  276. package/dist/table/cell/README.md +27 -0
  277. package/dist/table/cell/table-cell.svelte +253 -0
  278. package/dist/table/cell/table-cell.svelte.d.ts +4 -0
  279. package/dist/table/checkbox/README.md +40 -0
  280. package/dist/table/checkbox/table-checkbox-test.svelte +170 -0
  281. package/dist/table/checkbox/table-checkbox-test.svelte.d.ts +22 -0
  282. package/dist/table/checkbox/table-checkbox.svelte +235 -0
  283. package/dist/table/checkbox/table-checkbox.svelte.d.ts +4 -0
  284. package/dist/table/checkbox-indicator/README.md +31 -0
  285. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte +15 -0
  286. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte.d.ts +4 -0
  287. package/dist/table/column/README.md +36 -0
  288. package/dist/table/column/table-column.svelte +79 -0
  289. package/dist/table/column/table-column.svelte.d.ts +4 -0
  290. package/dist/table/column-header-cell/README.md +30 -0
  291. package/dist/table/column-header-cell/table-column-header-cell.svelte +271 -0
  292. package/dist/table/column-header-cell/table-column-header-cell.svelte.d.ts +4 -0
  293. package/dist/table/column-resizer/README.md +33 -0
  294. package/dist/table/column-resizer/table-column-resizer-fixed-width-test.svelte +57 -0
  295. package/dist/table/column-resizer/table-column-resizer-fixed-width-test.svelte.d.ts +3 -0
  296. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte +52 -0
  297. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte.d.ts +3 -0
  298. package/dist/table/column-resizer/table-column-resizer-narrow-min-width-test.svelte +76 -0
  299. package/dist/table/column-resizer/table-column-resizer-narrow-min-width-test.svelte.d.ts +3 -0
  300. package/dist/table/column-resizer/table-column-resizer-overflow-test.svelte +64 -0
  301. package/dist/table/column-resizer/table-column-resizer-overflow-test.svelte.d.ts +3 -0
  302. package/dist/table/column-resizer/table-column-resizer-padded-container-test.svelte +67 -0
  303. package/dist/table/column-resizer/table-column-resizer-padded-container-test.svelte.d.ts +3 -0
  304. package/dist/table/column-resizer/table-column-resizer-sandbox-overflow-test.svelte +87 -0
  305. package/dist/table/column-resizer/table-column-resizer-sandbox-overflow-test.svelte.d.ts +3 -0
  306. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte +84 -0
  307. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte.d.ts +3 -0
  308. package/dist/table/column-resizer/table-column-resizer-test.svelte +77 -0
  309. package/dist/table/column-resizer/table-column-resizer-test.svelte.d.ts +3 -0
  310. package/dist/table/column-resizer/table-column-resizer-three-column-relative-test.svelte +64 -0
  311. package/dist/table/column-resizer/table-column-resizer-three-column-relative-test.svelte.d.ts +3 -0
  312. package/dist/table/column-resizer/table-column-resizer.svelte +610 -0
  313. package/dist/table/column-resizer/table-column-resizer.svelte.d.ts +4 -0
  314. package/dist/table/empty-state/README.md +27 -0
  315. package/dist/table/empty-state/table-empty-state.svelte +33 -0
  316. package/dist/table/empty-state/table-empty-state.svelte.d.ts +4 -0
  317. package/dist/table/footer/README.md +26 -0
  318. package/dist/table/footer/table-footer.svelte +13 -0
  319. package/dist/table/footer/table-footer.svelte.d.ts +4 -0
  320. package/dist/table/header/README.md +26 -0
  321. package/dist/table/header/table-header.svelte +13 -0
  322. package/dist/table/header/table-header.svelte.d.ts +4 -0
  323. package/dist/table/index.d.ts +18 -0
  324. package/dist/table/index.js +17 -0
  325. package/dist/table/index.parts.d.ts +13 -0
  326. package/dist/table/index.parts.js +13 -0
  327. package/dist/table/root/README.md +66 -0
  328. package/dist/table/root/context.d.ts +233 -0
  329. package/dist/table/root/context.js +2153 -0
  330. package/dist/table/root/table-reorder-test.svelte +64 -0
  331. package/dist/table/root/table-reorder-test.svelte.d.ts +3 -0
  332. package/dist/table/root/table-root.svelte +561 -0
  333. package/dist/table/root/table-root.svelte.d.ts +4 -0
  334. package/dist/table/root/table-ssr-wrapper-column.svelte +48 -0
  335. package/dist/table/root/table-ssr-wrapper-column.svelte.d.ts +4 -0
  336. package/dist/table/root/table-ssr-wrapper-context.d.ts +11 -0
  337. package/dist/table/root/table-ssr-wrapper-context.js +13 -0
  338. package/dist/table/root/table-ssr-wrapper-test.svelte +57 -0
  339. package/dist/table/root/table-ssr-wrapper-test.svelte.d.ts +3 -0
  340. package/dist/table/root/table-test.svelte +206 -0
  341. package/dist/table/root/table-test.svelte.d.ts +29 -0
  342. package/dist/table/row/README.md +29 -0
  343. package/dist/table/row/table-row.svelte +244 -0
  344. package/dist/table/row/table-row.svelte.d.ts +4 -0
  345. package/dist/table/sort-trigger/README.md +45 -0
  346. package/dist/table/sort-trigger/table-sort-trigger.svelte +183 -0
  347. package/dist/table/sort-trigger/table-sort-trigger.svelte.d.ts +4 -0
  348. package/dist/table/types.d.ts +112 -0
  349. package/dist/table/types.js +1 -0
  350. package/dist/table/utils/handle-body-keydown.d.ts +13 -0
  351. package/dist/table/utils/handle-body-keydown.js +67 -0
  352. package/dist/table/utils/visually-hidden-style.d.ts +1 -0
  353. package/dist/table/utils/visually-hidden-style.js +1 -0
  354. package/dist/test-utils/focus-contract.d.ts +3 -0
  355. package/dist/test-utils/focus-contract.js +26 -0
  356. package/dist/timepicker/IMPLEMENTATION_PLAN.md +254 -0
  357. package/dist/timepicker/README.md +97 -0
  358. package/dist/timepicker/TODO.md +86 -0
  359. package/dist/timepicker/clock/README.md +14 -0
  360. package/dist/timepicker/clock/time-picker-clock-test.svelte +45 -0
  361. package/dist/timepicker/clock/time-picker-clock-test.svelte.d.ts +11 -0
  362. package/dist/timepicker/clock/time-picker-clock.svelte +65 -0
  363. package/dist/timepicker/clock/time-picker-clock.svelte.d.ts +10 -0
  364. package/dist/timepicker/index.d.ts +14 -0
  365. package/dist/timepicker/index.js +14 -0
  366. package/dist/timepicker/index.parts.d.ts +8 -0
  367. package/dist/timepicker/index.parts.js +8 -0
  368. package/dist/timepicker/input/README.md +15 -0
  369. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte +40 -0
  370. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte.d.ts +3 -0
  371. package/dist/timepicker/input/time-picker-input.svelte +109 -0
  372. package/dist/timepicker/input/time-picker-input.svelte.d.ts +11 -0
  373. package/dist/timepicker/internal/strict-props.d.ts +4 -0
  374. package/dist/timepicker/internal/strict-props.js +51 -0
  375. package/dist/timepicker/popover/README.md +20 -0
  376. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte +22 -0
  377. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte.d.ts +3 -0
  378. package/dist/timepicker/popover/time-picker-popover.svelte +89 -0
  379. package/dist/timepicker/popover/time-picker-popover.svelte.d.ts +7 -0
  380. package/dist/timepicker/root/README.md +42 -0
  381. package/dist/timepicker/root/context.d.ts +51 -0
  382. package/dist/timepicker/root/context.js +15 -0
  383. package/dist/timepicker/root/time-picker-12h-test.svelte +22 -0
  384. package/dist/timepicker/root/time-picker-12h-test.svelte.d.ts +3 -0
  385. package/dist/timepicker/root/time-picker-bindable-test.svelte +25 -0
  386. package/dist/timepicker/root/time-picker-bindable-test.svelte.d.ts +3 -0
  387. package/dist/timepicker/root/time-picker-empty-test.svelte +20 -0
  388. package/dist/timepicker/root/time-picker-empty-test.svelte.d.ts +3 -0
  389. package/dist/timepicker/root/time-picker-root.svelte +625 -0
  390. package/dist/timepicker/root/time-picker-root.svelte.d.ts +28 -0
  391. package/dist/timepicker/root/time-picker-test.svelte +72 -0
  392. package/dist/timepicker/root/time-picker-test.svelte.d.ts +15 -0
  393. package/dist/timepicker/root/time-utils.d.ts +1 -0
  394. package/dist/timepicker/root/time-utils.js +3 -0
  395. package/dist/timepicker/segment/README.md +14 -0
  396. package/dist/timepicker/segment/time-picker-segment.svelte +365 -0
  397. package/dist/timepicker/segment/time-picker-segment.svelte.d.ts +9 -0
  398. package/dist/timepicker/trigger/README.md +14 -0
  399. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte +35 -0
  400. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte.d.ts +3 -0
  401. package/dist/timepicker/trigger/time-picker-trigger.svelte +122 -0
  402. package/dist/timepicker/trigger/time-picker-trigger.svelte.d.ts +9 -0
  403. package/dist/utils/date-only.d.ts +11 -0
  404. package/dist/utils/date-only.js +53 -0
  405. package/dist/utils/index.d.ts +1 -0
  406. package/dist/utils/index.js +1 -0
  407. package/package.json +33 -2
@@ -34,6 +34,7 @@
34
34
  type CalendarRootProps = {
35
35
  selectionMode?: CalendarSelectionMode;
36
36
  visibleMonths?: number;
37
+ showOutsideDays?: boolean;
37
38
  isDateUnavailable?: (date: string) => boolean;
38
39
  isDisabled?: boolean;
39
40
  isReadOnly?: boolean;
@@ -62,6 +63,7 @@
62
63
  let {
63
64
  selectionMode = 'single',
64
65
  visibleMonths = 1,
66
+ showOutsideDays = false,
65
67
  isDateUnavailable,
66
68
  isDisabled = false,
67
69
  isReadOnly = false,
@@ -100,6 +102,7 @@
100
102
  return {
101
103
  selectionMode,
102
104
  visibleMonths,
105
+ showOutsideDays,
103
106
  locale: resolvedLocale,
104
107
  isDateUnavailable,
105
108
  isDisabled,
@@ -4,6 +4,7 @@ import { type CalendarDateValue } from './date-utils';
4
4
  type CalendarRootProps = {
5
5
  selectionMode?: CalendarSelectionMode;
6
6
  visibleMonths?: number;
7
+ showOutsideDays?: boolean;
7
8
  isDateUnavailable?: (date: string) => boolean;
8
9
  isDisabled?: boolean;
9
10
  isReadOnly?: boolean;
@@ -16,6 +16,7 @@ export type CalendarMonth = {
16
16
  export type CreateCalendarContextOptions<TSelectionMode extends CalendarSelectionMode = CalendarSelectionMode> = {
17
17
  selectionMode?: TSelectionMode;
18
18
  visibleMonths?: number;
19
+ showOutsideDays?: boolean;
19
20
  locale?: string;
20
21
  isDisabled?: boolean;
21
22
  isReadOnly?: boolean;
@@ -31,12 +32,14 @@ export type CalendarContext = {
31
32
  selectionMode: CalendarSelectionMode;
32
33
  firstDayOfWeek: number;
33
34
  visibleMonths: number;
35
+ showOutsideDays: boolean;
34
36
  isDisabled: boolean;
35
37
  isReadOnly: boolean;
36
38
  months: CalendarMonth[];
37
39
  selectedValue: CalendarDateValue | undefined;
38
40
  rangeValue: CalendarRangeValue | undefined;
39
41
  focusedValue: CalendarDateValue;
42
+ focusVisible: boolean;
40
43
  weekdayLabels: string[];
41
44
  headingLabel: string;
42
45
  isSelected: (date: CalendarDateValue) => boolean;
@@ -47,6 +50,7 @@ export type CalendarContext = {
47
50
  isDateDisabled: (date: CalendarDateValue) => boolean;
48
51
  isOutsideVisibleRange: (date: CalendarDateValue, monthIndex: number) => boolean;
49
52
  setFocusedValue: (date: CalendarDateValue) => void;
53
+ setFocusVisible: (visible: boolean) => void;
50
54
  setHoveredValue: (date: CalendarDateValue | undefined) => void;
51
55
  selectDate: (date: CalendarDateValue) => void;
52
56
  goToNextPage: () => void;
@@ -2,9 +2,8 @@ import { getContext, setContext } from 'svelte';
2
2
  import { writable } from 'svelte/store';
3
3
  import { addDays, addMonths, buildMonthGrid, compareDates, formatCalendarDate, formatMonthHeading, getFirstDayOfWeek, getTodayUtcDate, getWeekdayLabels, isValidCalendarDateValue, parseCalendarDate, startOfMonth } from './date-utils';
4
4
  const KEY = Symbol('calendar');
5
- const MAX_FOCUS_SEARCH_DAYS = 370;
6
5
  export function createCalendarContext(options) {
7
- let { selectionMode = 'single', visibleMonths = 1, locale = Intl.DateTimeFormat().resolvedOptions().locale, isDisabled = false, isReadOnly = false, isDateUnavailable, onChange } = options;
6
+ let { selectionMode = 'single', visibleMonths = 1, showOutsideDays = false, locale = Intl.DateTimeFormat().resolvedOptions().locale, isDisabled = false, isReadOnly = false, isDateUnavailable, onChange } = options;
8
7
  const { value, defaultValue } = options;
9
8
  function isRangeValue(valueToCheck) {
10
9
  if (!valueToCheck || typeof valueToCheck === 'string')
@@ -85,6 +84,7 @@ export function createCalendarContext(options) {
85
84
  initialRangeSelected?.end ??
86
85
  initialRangeSelected?.start ??
87
86
  fallbackToday;
87
+ let currentFocusVisible = false;
88
88
  let currentVisibleMonth = startOfMonth(parseCalendarDate(currentFocused) ?? getTodayUtcDate());
89
89
  let cachedMonths = [];
90
90
  let hasCachedMonths = false;
@@ -93,6 +93,7 @@ export function createCalendarContext(options) {
93
93
  let pendingRangePathCacheStart;
94
94
  let previousUnavailableFn = isDateUnavailable;
95
95
  let previousVisibleMonths = visibleMonths;
96
+ let previousShowOutsideDays = showOutsideDays;
96
97
  let previousLocale = locale;
97
98
  let cachedFirstDayOfWeek = getFirstDayOfWeek(locale);
98
99
  const layoutVersion = writable(0);
@@ -133,16 +134,19 @@ export function createCalendarContext(options) {
133
134
  let shouldNotifySelection = false;
134
135
  const nextSelectionMode = next.selectionMode ?? 'single';
135
136
  const nextVisibleMonths = Math.max(1, next.visibleMonths ?? 1);
137
+ const nextShowOutsideDays = next.showOutsideDays ?? false;
136
138
  const nextLocale = next.locale ?? Intl.DateTimeFormat().resolvedOptions().locale;
137
139
  const nextUnavailableFn = next.isDateUnavailable;
138
140
  if (nextUnavailableFn !== previousUnavailableFn ||
139
141
  nextVisibleMonths !== previousVisibleMonths ||
142
+ nextShowOutsideDays !== previousShowOutsideDays ||
140
143
  nextLocale !== previousLocale) {
141
144
  clearUnavailableCache();
142
145
  shouldNotifyLayout = true;
143
146
  }
144
147
  previousUnavailableFn = nextUnavailableFn;
145
148
  previousVisibleMonths = nextVisibleMonths;
149
+ previousShowOutsideDays = nextShowOutsideDays;
146
150
  previousLocale = nextLocale;
147
151
  if (selectionMode !== nextSelectionMode) {
148
152
  selectionMode = nextSelectionMode;
@@ -157,6 +161,7 @@ export function createCalendarContext(options) {
157
161
  shouldNotifyLayout = true;
158
162
  }
159
163
  visibleMonths = nextVisibleMonths;
164
+ showOutsideDays = nextShowOutsideDays;
160
165
  locale = nextLocale;
161
166
  cachedFirstDayOfWeek = getFirstDayOfWeek(locale);
162
167
  if (isDisabled !== (next.isDisabled ?? false) || isReadOnly !== (next.isReadOnly ?? false)) {
@@ -312,7 +317,7 @@ export function createCalendarContext(options) {
312
317
  monthIndex,
313
318
  monthStart,
314
319
  heading: formatMonthHeading(monthStart, locale),
315
- weeks: buildMonthGrid(monthStart, firstDayOfWeek)
320
+ weeks: buildMonthGrid(monthStart, firstDayOfWeek, showOutsideDays)
316
321
  };
317
322
  });
318
323
  hasCachedMonths = true;
@@ -359,7 +364,7 @@ export function createCalendarContext(options) {
359
364
  return result;
360
365
  }
361
366
  function isDateDisabled(date) {
362
- if (isDisabled || isUnavailable(date))
367
+ if (isDisabled)
363
368
  return true;
364
369
  if (selectionMode === 'range' && currentRangeStart && !currentRangeEnd) {
365
370
  return !isPendingRangePathSelectable(date);
@@ -386,6 +391,12 @@ export function createCalendarContext(options) {
386
391
  }
387
392
  notifySelection();
388
393
  }
394
+ function setFocusVisible(visible) {
395
+ if (currentFocusVisible === visible)
396
+ return;
397
+ currentFocusVisible = visible;
398
+ notifySelection();
399
+ }
389
400
  function setHoveredValue(date) {
390
401
  if (selectionMode !== 'range')
391
402
  return;
@@ -514,7 +525,7 @@ export function createCalendarContext(options) {
514
525
  return undefined;
515
526
  const next = addDays(parsed, amount);
516
527
  const nextValue = formatCalendarDate(next);
517
- const focusableValue = findFocusableDate(nextValue, amount);
528
+ const focusableValue = findFocusableDate(nextValue);
518
529
  if (!focusableValue)
519
530
  return undefined;
520
531
  setFocusedValue(focusableValue);
@@ -526,8 +537,7 @@ export function createCalendarContext(options) {
526
537
  return undefined;
527
538
  const next = addMonths(parsed, amount);
528
539
  const nextValue = formatCalendarDate(next);
529
- const dayStep = amount >= 0 ? 1 : -1;
530
- const focusableValue = findFocusableDate(nextValue, dayStep);
540
+ const focusableValue = findFocusableDate(nextValue);
531
541
  if (!focusableValue) {
532
542
  if (selectionMode === 'range' && currentRangeStart && !currentRangeEnd) {
533
543
  return moveToMonthEdge(baseDate, amount >= 0 ? 'end' : 'start');
@@ -545,33 +555,19 @@ export function createCalendarContext(options) {
545
555
  const monthEnd = addDays(addMonths(monthStart, 1), -1);
546
556
  const targetDate = edge === 'start' ? monthStart : monthEnd;
547
557
  const nextValue = formatCalendarDate(targetDate);
548
- const dayStep = edge === 'start' ? 1 : -1;
549
- const focusableValue = findFocusableDate(nextValue, dayStep);
558
+ const focusableValue = findFocusableDate(nextValue);
550
559
  if (!focusableValue)
551
560
  return undefined;
552
561
  setFocusedValue(focusableValue);
553
562
  return focusableValue;
554
563
  }
555
- function findFocusableDate(targetDate, dayStep) {
564
+ function findFocusableDate(targetDate) {
556
565
  if (isDisabled)
557
566
  return undefined;
558
- if (!isDateDisabled(targetDate))
559
- return targetDate;
560
- if (dayStep === 0)
561
- return undefined;
562
- let current = parseCalendarDate(targetDate);
563
- if (!current)
564
- return undefined;
565
- for (let index = 0; index < MAX_FOCUS_SEARCH_DAYS; index++) {
566
- current = addDays(current, dayStep > 0 ? 1 : -1);
567
- const candidate = formatCalendarDate(current);
568
- if (!isDateDisabled(candidate)) {
569
- return candidate;
570
- }
571
- }
572
- return undefined;
567
+ return targetDate;
573
568
  }
574
569
  function handleCellKeydown(event, date) {
570
+ setFocusVisible(true);
575
571
  const keyDate = isValidCalendarDateValue(currentFocused) ? currentFocused : date;
576
572
  let movedDate;
577
573
  function extendRangeWithKeyboard(nextDate) {
@@ -668,6 +664,9 @@ export function createCalendarContext(options) {
668
664
  get visibleMonths() {
669
665
  return visibleMonths;
670
666
  },
667
+ get showOutsideDays() {
668
+ return showOutsideDays;
669
+ },
671
670
  get isDisabled() {
672
671
  return isDisabled;
673
672
  },
@@ -686,6 +685,9 @@ export function createCalendarContext(options) {
686
685
  get focusedValue() {
687
686
  return currentFocused;
688
687
  },
688
+ get focusVisible() {
689
+ return currentFocusVisible;
690
+ },
689
691
  get weekdayLabels() {
690
692
  return getWeekdayLabels(locale, cachedFirstDayOfWeek);
691
693
  },
@@ -700,6 +702,7 @@ export function createCalendarContext(options) {
700
702
  isDateDisabled,
701
703
  isOutsideVisibleRange,
702
704
  setFocusedValue,
705
+ setFocusVisible,
703
706
  setHoveredValue,
704
707
  selectDate,
705
708
  goToNextPage,
@@ -13,5 +13,5 @@ export type CalendarDayCell = {
13
13
  date: CalendarDateValue;
14
14
  isOutsideMonth: boolean;
15
15
  };
16
- export declare function buildMonthGrid(monthStart: Date, firstDayOfWeek: number): CalendarDayCell[][];
16
+ export declare function buildMonthGrid(monthStart: Date, firstDayOfWeek: number, showOutsideDays?: boolean): CalendarDayCell[][];
17
17
  export declare function formatMonthHeading(date: Date, locale: string): string;
@@ -1,43 +1,28 @@
1
- const DATE_RE = /^(\d{4})-(\d{2})-(\d{2})$/;
1
+ import { createUtcDate, formatDateOnlyValue, isValidDateOnlyValue, parseDateOnlyValue } from '../../utils/date-only';
2
2
  export function isValidCalendarDateValue(value) {
3
- const match = DATE_RE.exec(value);
4
- if (!match)
5
- return false;
6
- const year = Number(match[1]);
7
- const month = Number(match[2]);
8
- const day = Number(match[3]);
9
- if (month < 1 || month > 12 || day < 1 || day > 31)
10
- return false;
11
- const date = new Date(Date.UTC(year, month - 1, day));
12
- return (date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day);
3
+ return isValidDateOnlyValue(value);
13
4
  }
14
5
  export function parseCalendarDate(value) {
15
- if (!isValidCalendarDateValue(value))
16
- return null;
17
- const [year, month, day] = value.split('-').map(Number);
18
- return new Date(Date.UTC(year, month - 1, day));
6
+ return parseDateOnlyValue(value);
19
7
  }
20
8
  export function formatCalendarDate(date) {
21
- const year = date.getUTCFullYear();
22
- const month = String(date.getUTCMonth() + 1).padStart(2, '0');
23
- const day = String(date.getUTCDate()).padStart(2, '0');
24
- return `${year}-${month}-${day}`;
9
+ return formatDateOnlyValue(date);
25
10
  }
26
11
  export function startOfMonth(date) {
27
- return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1));
12
+ return createUtcDate(date.getUTCFullYear(), date.getUTCMonth(), 1);
28
13
  }
29
14
  function getDaysInMonthUtc(year, monthIndex) {
30
- return new Date(Date.UTC(year, monthIndex + 1, 0)).getUTCDate();
15
+ return createUtcDate(year, monthIndex + 1, 0).getUTCDate();
31
16
  }
32
17
  export function addMonths(date, amount) {
33
18
  const targetMonth = date.getUTCMonth() + amount;
34
19
  const targetYear = date.getUTCFullYear() + Math.floor(targetMonth / 12);
35
20
  const normalizedMonth = ((targetMonth % 12) + 12) % 12;
36
21
  const targetDay = Math.min(date.getUTCDate(), getDaysInMonthUtc(targetYear, normalizedMonth));
37
- return new Date(Date.UTC(targetYear, normalizedMonth, targetDay));
22
+ return createUtcDate(targetYear, normalizedMonth, targetDay);
38
23
  }
39
24
  export function addDays(date, amount) {
40
- return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate() + amount));
25
+ return createUtcDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate() + amount);
41
26
  }
42
27
  export function compareDates(a, b) {
43
28
  const at = a.getTime();
@@ -50,7 +35,7 @@ export function compareDates(a, b) {
50
35
  }
51
36
  export function getTodayUtcDate() {
52
37
  const now = new Date();
53
- return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
38
+ return createUtcDate(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());
54
39
  }
55
40
  export function getFirstDayOfWeek(locale) {
56
41
  try {
@@ -76,13 +61,18 @@ export function getWeekdayLabels(locale, firstDayOfWeek) {
76
61
  return formatter.format(addDays(sunday, dayOffset));
77
62
  });
78
63
  }
79
- export function buildMonthGrid(monthStart, firstDayOfWeek) {
64
+ export function buildMonthGrid(monthStart, firstDayOfWeek, showOutsideDays = true) {
80
65
  const firstOfMonth = startOfMonth(monthStart);
81
66
  const firstWeekday = firstOfMonth.getUTCDay();
82
67
  const startOffset = (firstWeekday - firstDayOfWeek + 7) % 7;
83
68
  const gridStart = addDays(firstOfMonth, -startOffset);
69
+ const lastOfMonth = addDays(addMonths(firstOfMonth, 1), -1);
70
+ const lastWeekday = lastOfMonth.getUTCDay();
71
+ const endOffset = (firstDayOfWeek + 6 - lastWeekday + 7) % 7;
72
+ const visibleDays = startOffset + lastOfMonth.getUTCDate() + endOffset;
73
+ const weekCount = showOutsideDays ? 6 : Math.max(1, Math.ceil(visibleDays / 7));
84
74
  const weeks = [];
85
- for (let weekIndex = 0; weekIndex < 6; weekIndex++) {
75
+ for (let weekIndex = 0; weekIndex < weekCount; weekIndex++) {
86
76
  const week = [];
87
77
  for (let dayIndex = 0; dayIndex < 7; dayIndex++) {
88
78
  const date = addDays(gridStart, weekIndex * 7 + dayIndex);
@@ -0,0 +1,14 @@
1
+ # Calendar TriggerNext
2
+
3
+ ## API reference
4
+
5
+ ### Calendar.TriggerNext
6
+
7
+ Name: `Calendar.TriggerNext`
8
+ Description: Button part that advances the visible calendar period.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | -------------- | ---------------------- | ----------- | ------------------------------------------------------ |
12
+ | `children` | `Snippet` | `undefined` | Optional trigger content. |
13
+ | `class` | `string` | `''` | CSS class names for the trigger button. |
14
+ | `...restProps` | `HTMLButtonAttributes` | `-` | Additional button attributes forwarded to the trigger. |
@@ -1,9 +1,14 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLButtonAttributes } from 'svelte/elements';
4
+ import { ButtonRoot } from '../../button/index.js';
4
5
  import { useCalendarContext } from '../root/context';
5
6
 
6
- type CalendarTriggerNextProps = Omit<HTMLButtonAttributes, 'children'> & {
7
+ type CalendarTriggerNextProps = Omit<
8
+ HTMLButtonAttributes,
9
+ 'children' | 'class' | 'disabled' | 'aria-disabled'
10
+ > & {
11
+ class?: string;
7
12
  children?: Snippet;
8
13
  };
9
14
 
@@ -22,11 +27,11 @@
22
27
  }
23
28
  </script>
24
29
 
25
- <button
30
+ <ButtonRoot
26
31
  type="button"
27
32
  class={className}
28
33
  aria-label="Next page"
29
- disabled={isDisabled}
34
+ {isDisabled}
30
35
  onclick={handleClick}
31
36
  {...restProps}
32
37
  >
@@ -35,4 +40,4 @@
35
40
  {:else}
36
41
  Next
37
42
  {/if}
38
- </button>
43
+ </ButtonRoot>
@@ -1,6 +1,7 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { HTMLButtonAttributes } from 'svelte/elements';
3
- type CalendarTriggerNextProps = Omit<HTMLButtonAttributes, 'children'> & {
3
+ type CalendarTriggerNextProps = Omit<HTMLButtonAttributes, 'children' | 'class' | 'disabled' | 'aria-disabled'> & {
4
+ class?: string;
4
5
  children?: Snippet;
5
6
  };
6
7
  declare const CalendarTriggerNext: import("svelte").Component<CalendarTriggerNextProps, {}, "">;
@@ -0,0 +1,14 @@
1
+ # Calendar TriggerPrevious
2
+
3
+ ## API reference
4
+
5
+ ### Calendar.TriggerPrevious
6
+
7
+ Name: `Calendar.TriggerPrevious`
8
+ Description: Button part that moves the visible calendar period backward.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | -------------- | ---------------------- | ----------- | ------------------------------------------------------ |
12
+ | `children` | `Snippet` | `undefined` | Optional trigger content. |
13
+ | `class` | `string` | `''` | CSS class names for the trigger button. |
14
+ | `...restProps` | `HTMLButtonAttributes` | `-` | Additional button attributes forwarded to the trigger. |
@@ -1,9 +1,14 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLButtonAttributes } from 'svelte/elements';
4
+ import { ButtonRoot } from '../../button/index.js';
4
5
  import { useCalendarContext } from '../root/context';
5
6
 
6
- type CalendarTriggerPreviousProps = Omit<HTMLButtonAttributes, 'children'> & {
7
+ type CalendarTriggerPreviousProps = Omit<
8
+ HTMLButtonAttributes,
9
+ 'children' | 'class' | 'disabled' | 'aria-disabled'
10
+ > & {
11
+ class?: string;
7
12
  children?: Snippet;
8
13
  };
9
14
 
@@ -22,11 +27,11 @@
22
27
  }
23
28
  </script>
24
29
 
25
- <button
30
+ <ButtonRoot
26
31
  type="button"
27
32
  class={className}
28
33
  aria-label="Previous page"
29
- disabled={isDisabled}
34
+ {isDisabled}
30
35
  onclick={handleClick}
31
36
  {...restProps}
32
37
  >
@@ -35,4 +40,4 @@
35
40
  {:else}
36
41
  Prev
37
42
  {/if}
38
- </button>
43
+ </ButtonRoot>
@@ -1,6 +1,7 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { HTMLButtonAttributes } from 'svelte/elements';
3
- type CalendarTriggerPreviousProps = Omit<HTMLButtonAttributes, 'children'> & {
3
+ type CalendarTriggerPreviousProps = Omit<HTMLButtonAttributes, 'children' | 'class' | 'disabled' | 'aria-disabled'> & {
4
+ class?: string;
4
5
  children?: Snippet;
5
6
  };
6
7
  declare const CalendarTriggerPrevious: import("svelte").Component<CalendarTriggerPreviousProps, {}, "">;
@@ -0,0 +1,53 @@
1
+ # Checkbox
2
+
3
+ ## Description
4
+
5
+ `Checkbox` is a composable tri-state checkbox with separate checked and indeterminate bindings, hidden input form support, and headless indicator rendering.
6
+
7
+ ## Anatomy
8
+
9
+ - `Checkbox.Root`
10
+ - `Checkbox.Indicator`
11
+
12
+ ```svelte
13
+ <Checkbox.Root aria-label="Accept terms">
14
+ <Checkbox.Indicator>
15
+ <CheckIcon />
16
+ </Checkbox.Indicator>
17
+ </Checkbox.Root>
18
+ ```
19
+
20
+ ## Usage guidelines
21
+
22
+ - Use `isChecked` / `defaultChecked` for the checked state and `isIndeterminate` / `defaultIndeterminate` for the mixed state.
23
+ - `isIndeterminate` takes precedence over `isChecked`. When both are `true`, the checkbox is exposed as indeterminate.
24
+ - Use `value` only for form submission through the hidden native input; it does not represent the visual state.
25
+ - Wrap the checkbox in a native `<label>` for the simplest accessible labeling pattern.
26
+
27
+ ## API reference
28
+
29
+ - `Checkbox.Root`
30
+ - `isChecked?: boolean`
31
+ - `defaultChecked?: boolean`
32
+ - `isIndeterminate?: boolean`
33
+ - `defaultIndeterminate?: boolean`
34
+ - `onCheckedChange?: (checked: boolean) => void`
35
+ - `onIndeterminateChange?: (indeterminate: boolean) => void`
36
+ - `isDisabled?: boolean`
37
+ - `isReadOnly?: boolean`
38
+ - `name?: string`
39
+ - `value?: string`
40
+ - `required?: boolean`
41
+ - `Checkbox.Indicator`
42
+ - `keepMounted?: boolean`
43
+
44
+ ## Accessibility
45
+
46
+ - `Checkbox.Root` exposes `role="checkbox"` with `aria-checked="true" | "false" | "mixed"`.
47
+ - Press `Space` to toggle the checkbox.
48
+ - `isReadOnly` keeps the checkbox focusable while preventing state changes.
49
+
50
+ ## Notes
51
+
52
+ - The first user toggle from the indeterminate state resolves to checked.
53
+ - A hidden checkbox input is kept in sync for form integration and `label[for]` support.
@@ -0,0 +1,16 @@
1
+ # Checkbox TODO
2
+
3
+ ## Goal
4
+
5
+ Track Checkbox work with a single mandatory TODO format.
6
+
7
+ ## Backlog
8
+
9
+ - [x] [S][P0][Area: Architecture][Owner: Unassigned][Target: Done] Create base `root` and `indicator` parts with namespace exports.
10
+ - [x] [S][P0][Area: State][Owner: Unassigned][Target: Done] Implement checked, unchecked, and indeterminate state transitions.
11
+ - [x] [S][P0][Area: Accessibility][Owner: Unassigned][Target: Done] Add checkbox semantics, keyboard toggle, and readonly behavior.
12
+ - [x] [S][P0][Area: Forms][Owner: Unassigned][Target: Done] Sync a hidden native input for form submission and label targeting.
13
+ - [x] [S][P0][Area: Testing][Owner: Unassigned][Target: Done] Add baseline tests for root and indicator behavior.
14
+ - [ ] [S][P1][Area: API][Owner: Unassigned][Target: TBD] Add optional `nativeButton` rendering mode for sibling-label patterns.
15
+ - [ ] [S][P1][Area: Forms][Owner: Unassigned][Target: TBD] Support unchecked submission values and form reset synchronization.
16
+ - [ ] [C][P2][Area: Animation][Owner: Unassigned][Target: TBD] Add indicator presence data for enter and exit animations.
@@ -0,0 +1,6 @@
1
+ export * as Checkbox from './index.parts.js';
2
+ export { default as CheckboxRoot } from './root/checkbox-root.svelte';
3
+ export { default as CheckboxIndicator } from './indicator/checkbox-indicator.svelte';
4
+ export { getCheckboxContext, setCheckboxContext, useCheckboxContext, type CheckboxContext, type CheckboxState } from './root/context.js';
5
+ import * as CheckboxParts from './index.parts.js';
6
+ export default CheckboxParts;
@@ -0,0 +1,6 @@
1
+ export * as Checkbox from './index.parts.js';
2
+ export { default as CheckboxRoot } from './root/checkbox-root.svelte';
3
+ export { default as CheckboxIndicator } from './indicator/checkbox-indicator.svelte';
4
+ export { getCheckboxContext, setCheckboxContext, useCheckboxContext } from './root/context.js';
5
+ import * as CheckboxParts from './index.parts.js';
6
+ export default CheckboxParts;
@@ -0,0 +1,2 @@
1
+ export { default as Root } from './root/checkbox-root.svelte';
2
+ export { default as Indicator } from './indicator/checkbox-indicator.svelte';
@@ -0,0 +1,2 @@
1
+ export { default as Root } from './root/checkbox-root.svelte';
2
+ export { default as Indicator } from './indicator/checkbox-indicator.svelte';
@@ -0,0 +1,23 @@
1
+ # Checkbox Indicator
2
+
3
+ ## API reference
4
+
5
+ ### Checkbox.Indicator
6
+
7
+ Name: `Checkbox.Indicator`
8
+ Description: Headless presence wrapper for checkbox indicator content. It renders when the checkbox is checked or indeterminate.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | -------------- | --------------------------------- | ----------- | ------------------------------------------------------------------------ |
12
+ | `keepMounted` | `boolean` | `false` | Keeps the indicator mounted while hidden when the checkbox is unchecked. |
13
+ | `children` | `Snippet` | `undefined` | Rendered indicator content, such as a check or dash icon. |
14
+ | `class` | `string` | `''` | CSS class names for the indicator wrapper. |
15
+ | `...restProps` | `HTMLAttributes<HTMLSpanElement>` | `-` | Additional attributes forwarded to the indicator span. |
16
+
17
+ ```svelte
18
+ <Checkbox.Root aria-label="Select row">
19
+ <Checkbox.Indicator>
20
+ <CheckIcon />
21
+ </Checkbox.Indicator>
22
+ </Checkbox.Root>
23
+ ```
@@ -0,0 +1,43 @@
1
+ <script lang="ts">
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import type { Snippet } from 'svelte';
4
+ import { cn } from '../../utils/cn';
5
+ import { useCheckboxContext } from '../root/context';
6
+
7
+ type CheckboxIndicatorProps = Omit<HTMLAttributes<HTMLSpanElement>, 'children' | 'class'> & {
8
+ keepMounted?: boolean;
9
+ children?: Snippet;
10
+ class?: string;
11
+ };
12
+
13
+ let {
14
+ keepMounted = false,
15
+ children,
16
+ class: className = '',
17
+ ...restProps
18
+ }: CheckboxIndicatorProps = $props();
19
+
20
+ const checkbox = useCheckboxContext();
21
+ const visible = $derived(checkbox.state !== 'unchecked');
22
+ </script>
23
+
24
+ {#if keepMounted || visible}
25
+ <span
26
+ {...restProps}
27
+ data-checkbox-indicator="true"
28
+ data-checked={checkbox.isChecked || undefined}
29
+ data-unchecked={checkbox.state === 'unchecked' || undefined}
30
+ data-indeterminate={checkbox.isIndeterminate || undefined}
31
+ data-pressed={checkbox.pressed || undefined}
32
+ data-disabled={checkbox.isDisabled || undefined}
33
+ data-readonly={checkbox.isReadOnly || undefined}
34
+ data-required={checkbox.required || undefined}
35
+ data-focused={checkbox.focused || undefined}
36
+ data-focus-visible={checkbox.focusVisible || undefined}
37
+ hidden={keepMounted && !visible}
38
+ aria-hidden={keepMounted && !visible ? 'true' : undefined}
39
+ class={cn('contents', className)}
40
+ >
41
+ {@render children?.()}
42
+ </span>
43
+ {/if}
@@ -0,0 +1,10 @@
1
+ import type { HTMLAttributes } from 'svelte/elements';
2
+ import type { Snippet } from 'svelte';
3
+ type CheckboxIndicatorProps = Omit<HTMLAttributes<HTMLSpanElement>, 'children' | 'class'> & {
4
+ keepMounted?: boolean;
5
+ children?: Snippet;
6
+ class?: string;
7
+ };
8
+ declare const CheckboxIndicator: import("svelte").Component<CheckboxIndicatorProps, {}, "">;
9
+ type CheckboxIndicator = ReturnType<typeof CheckboxIndicator>;
10
+ export default CheckboxIndicator;