@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
@@ -0,0 +1,76 @@
1
+ <script lang="ts">
2
+ import { Button } from '../index';
3
+
4
+ type Props = {
5
+ isDisabled?: boolean;
6
+ isPending?: boolean;
7
+ type?: 'button' | 'submit' | 'reset';
8
+ ariaLabel?: string;
9
+ onMouseEnter?: (event: MouseEvent) => void;
10
+ onFocus?: (event: FocusEvent) => void;
11
+ };
12
+
13
+ let {
14
+ isDisabled = false,
15
+ isPending = false,
16
+ type = 'button',
17
+ ariaLabel = 'Save',
18
+ onMouseEnter,
19
+ onFocus
20
+ }: Props = $props();
21
+
22
+ let pendingOverride = $state<boolean | null>(null);
23
+ let clickCount = $state(0);
24
+ let submitCount = $state(0);
25
+ const pending = $derived(pendingOverride ?? isPending);
26
+
27
+ function handleClick() {
28
+ clickCount += 1;
29
+ }
30
+
31
+ function handleSubmit(event: SubmitEvent) {
32
+ event.preventDefault();
33
+ submitCount += 1;
34
+ }
35
+ </script>
36
+
37
+ <form onsubmit={handleSubmit}>
38
+ <label for="name">Name</label>
39
+ <input id="name" type="text" />
40
+
41
+ <Button.Root
42
+ {type}
43
+ {isDisabled}
44
+ isPending={pending}
45
+ onclick={handleClick}
46
+ onmouseenter={onMouseEnter}
47
+ onfocus={onFocus}
48
+ aria-label={ariaLabel}
49
+ class="inline-flex items-center"
50
+ >
51
+ {#snippet children(state)}
52
+ <span data-button-label>{pending ? 'Saving' : 'Save'}</span>
53
+ <span
54
+ data-render-state="true"
55
+ data-render-pressed={state.isPressed || undefined}
56
+ data-render-hovered={state.isHovered || undefined}
57
+ data-render-pending={state.isPending || undefined}
58
+ data-render-focused={state.isFocused || undefined}
59
+ data-render-focus-visible={state.isFocusVisible || undefined}
60
+ >
61
+ {state.isPressed ? 'pressed' : state.isPending ? 'pending' : 'idle'}
62
+ </span>
63
+ {/snippet}
64
+ </Button.Root>
65
+
66
+ <button type="button" data-set-pending onclick={() => (pendingOverride = true)}
67
+ >Set pending</button
68
+ >
69
+ <button type="button" data-clear-pending onclick={() => (pendingOverride = false)}>
70
+ Clear pending
71
+ </button>
72
+
73
+ <output data-click-count>{String(clickCount)}</output>
74
+ <output data-submit-count>{String(submitCount)}</output>
75
+ <output data-pending-state>{String(pending)}</output>
76
+ </form>
@@ -0,0 +1,11 @@
1
+ type Props = {
2
+ isDisabled?: boolean;
3
+ isPending?: boolean;
4
+ type?: 'button' | 'submit' | 'reset';
5
+ ariaLabel?: string;
6
+ onMouseEnter?: (event: MouseEvent) => void;
7
+ onFocus?: (event: FocusEvent) => void;
8
+ };
9
+ declare const ButtonTest: import("svelte").Component<Props, {}, "">;
10
+ type ButtonTest = ReturnType<typeof ButtonTest>;
11
+ export default ButtonTest;
@@ -12,6 +12,7 @@
12
12
  - In `single` mode, `value/defaultValue` is `YYYY-MM-DD`.
13
13
  - In `range` mode, `value/defaultValue` is `{ start?: 'YYYY-MM-DD', end?: 'YYYY-MM-DD' }`.
14
14
  - `visibleMonths` controls how many months are rendered and how paging behaves.
15
+ - `showOutsideDays` controls whether days outside the current month are shown; default is `false`.
15
16
  - `isDateUnavailable` marks specific days as non-focusable and non-selectable.
16
17
  - Use `LocaleProvider` to localize month/day labels and first day of week.
17
18
  - Keyboard navigation uses `Arrow` keys for day/week movement and `Home/End` for month edges.
@@ -20,7 +21,7 @@
20
21
 
21
22
  - Each `grid` exposes an accessible name using the visible month heading.
22
23
  - Today exposes `aria-current="date"`.
23
- - Unavailable cells expose `aria-disabled="true"` and are neither focusable nor selectable.
24
+ - Unavailable cells expose `aria-disabled="true"`. According to ARIA Grid specifications, disabled cells remain focusable so that screen reader users can spatially navigate and discover them, but they are not selectable.
24
25
 
25
26
  ### Keyboard
26
27
 
@@ -1,109 +1,23 @@
1
1
  # Calendar TODO
2
2
 
3
- ## MVP v1
4
-
5
- - [x] Controlled/uncontrolled root (`value`, `defaultValue`, `onChange`)
6
- - [x] Paginated navigation via `visibleMonths`
7
- - [x] Single-date selection
8
- - [x] `isDisabled`, `isReadOnly`, `isDateUnavailable` states
9
- - [x] Keyboard-accessible grid (baseline)
10
- - [x] Exports + docs page + initial tests
11
-
12
- ## Future
13
-
14
- - [x] Range selection
15
- - [ ] Multi-select
16
- - [ ] Non-Gregorian calendar configuration
17
- - [ ] Advanced unavailable API (ranges/collections)
18
-
19
- ### Advanced unavailable API (details)
20
-
21
- Goal: evolve from `isDateUnavailable?: (date) => boolean` to an expressive, composable, and performant API for blocking dates in real-world scenarios.
22
-
23
- #### 1) Functional requirements
24
-
25
- - [ ] Keep compatibility with the current `isDateUnavailable`.
26
- - [ ] Support `Set` of specific dates (`YYYY-MM-DD`) with O(1) lookup.
27
- - [ ] Support closed ranges `{ start, end }`.
28
- - [ ] Support recurring rules (for example: weekends, weekdays, dayOfWeek, dayOfMonth).
29
- - [ ] Support rule composition:
30
- - [ ] `anyOf` (OR)
31
- - [ ] `allOf` (AND)
32
- - [ ] `except` (subtract dates/ranges)
33
- - [ ] Support combined usage (function + set + ranges + recurring rules).
34
-
35
- #### 2) Public API proposal
36
-
37
- - [ ] Add optional `unavailable` prop in `Calendar.Root`.
38
- - [ ] Base type design:
39
- - [ ] `CalendarDateSet = Set<CalendarDateValue> | CalendarDateValue[]`
40
- - [ ] `CalendarDateRange = { start: CalendarDateValue; end: CalendarDateValue }`
41
- - [ ] `CalendarRecurringRule`
42
- - [ ] `CalendarUnavailableRule = CalendarDateSet | CalendarDateRange | CalendarRecurringRule | ((date) => boolean)`
43
- - [ ] `CalendarUnavailableConfig = CalendarUnavailableRule | { anyOf?: ...; allOf?: ...; except?: ... }`
44
- - [ ] Document precedence rules:
45
- - [ ] `except` first
46
- - [ ] then `allOf`
47
- - [ ] then `anyOf`
48
- - [ ] fallback to `false`
49
- - [ ] Clearly define how `unavailable` coexists with `isDateUnavailable` (for example: final OR for backward compatibility).
50
-
51
- #### 3) Validation and normalization
52
-
53
- - [ ] Validate invalid dates and reversed ranges in a robust way.
54
- - [ ] Normalize ranges (`start <= end`).
55
- - [ ] Silently ignore invalid entries or expose a dev warning (decide strategy).
56
- - [ ] Avoid runtime throws for partial input; prefer tolerant behavior.
57
-
58
- #### 4) Performance and caching
59
-
60
- - [ ] Compile `unavailable` to an internal predicate once per config change.
61
- - [ ] Cache results per visible date (`Map<CalendarDateValue, boolean>`).
62
- - [ ] Invalidate cache only when these change:
63
- - [ ] locale
64
- - [ ] visibleMonths
65
- - [ ] `isDateUnavailable`
66
- - [ ] `unavailable`
67
- - [ ] Avoid expensive recomputation during pending range selection.
68
- - [ ] Keep low complexity in `isDateDisabled` (prefer amortized O(1)).
69
-
70
- #### 5) Range mode integration
71
-
72
- - [ ] `isRangePathSelectable` must use the same unavailable source of truth.
73
- - [ ] If `except` exists, ensure endpoints and intermediate days follow the final composed rule.
74
- - [ ] Keep mouse hover preview and keyboard preview consistent.
75
-
76
- #### 6) Testing
77
-
78
- - [ ] Unit tests for unavailable parser/normalizer.
79
- - [ ] Compatibility tests with legacy `isDateUnavailable`.
80
- - [ ] Tests by type:
81
- - [ ] date sets
82
- - [ ] ranges
83
- - [ ] recurring rules
84
- - [ ] `anyOf`/`allOf`/`except` composition
85
- - [ ] Interaction tests (click/keyboard/range preview/confirm/cancel).
86
- - [ ] Performance tests (no unnecessary recomputation during selection and focus).
87
-
88
- #### 7) Documentation
89
-
90
- - [ ] Calendar README section for "Advanced unavailable".
91
- - [ ] Usage examples:
92
- - [ ] block weekends
93
- - [ ] block holidays (set)
94
- - [ ] blackout by range
95
- - [ ] composition with exceptions
96
- - [ ] Migration notes from current `isDateUnavailable`.
97
-
98
- #### 8) Demo
99
-
100
- - [ ] Extend docs demo with unavailable strategy selector.
101
- - [ ] Show derived state (active rule + visible blocked dates).
102
- - [ ] Include composition example (`anyOf` + `except`).
103
-
104
- #### 9) Completion criteria
105
-
106
- - [ ] `bun typecheck` passes without errors.
107
- - [ ] Calendar test suite is green.
108
- - [ ] Backward compatibility is verified.
109
- - [ ] API is documented with real examples.
3
+ ## Goal
4
+
5
+ Track Calendar work with a single mandatory TODO format.
6
+
7
+ ## Backlog
8
+
9
+ - [x] [M][P0][Area: Core API][Owner: Unassigned][Target: Done] Implement controlled/uncontrolled root (`value`, `defaultValue`, `onChange`).
10
+ - [x] [M][P0][Area: Navigation][Owner: Unassigned][Target: Done] Implement paginated navigation via `visibleMonths`.
11
+ - [x] [M][P0][Area: Selection][Owner: Unassigned][Target: Done] Implement single-date selection.
12
+ - [x] [M][P0][Area: State][Owner: Unassigned][Target: Done] Support `isDisabled`, `isReadOnly`, and `isDateUnavailable`.
13
+ - [x] [M][P0][Area: Accessibility][Owner: Unassigned][Target: Done] Deliver keyboard-accessible grid baseline.
14
+ - [x] [M][P0][Area: Delivery][Owner: Unassigned][Target: Done] Ship exports, docs page, and initial tests.
15
+ - [x] [S][P1][Area: Selection][Owner: Unassigned][Target: Done] Implement range selection.
16
+ - [ ] [S][P1][Area: Selection][Owner: Unassigned][Target: TBD] Implement multi-select mode.
17
+ - [ ] [C][P2][Area: Internationalization][Owner: Unassigned][Target: TBD] Add non-Gregorian calendar configuration.
18
+ - [ ] [S][P1][Area: Availability API][Owner: Unassigned][Target: TBD] Add advanced unavailable API (set/ranges/rules).
19
+ - [ ] [M][P0][Area: Availability API][Owner: Unassigned][Target: TBD] Keep backward compatibility with `isDateUnavailable`.
20
+ - [ ] [M][P0][Area: Performance][Owner: Unassigned][Target: TBD] Compile unavailability config to cached predicate with proper invalidation.
21
+ - [ ] [M][P0][Area: Testing][Owner: Unassigned][Target: TBD] Add coverage for unavailable parser, composition rules, and interaction flows.
22
+ - [ ] [S][P1][Area: Documentation][Owner: Unassigned][Target: TBD] Document advanced unavailable API with migration examples.
23
+ - [ ] [C][P2][Area: Demo][Owner: Unassigned][Target: TBD] Extend docs demo with unavailable strategy examples.
@@ -0,0 +1,15 @@
1
+ # Calendar BodyCell
2
+
3
+ ## API reference
4
+
5
+ ### Calendar.BodyCell
6
+
7
+ Name: `Calendar.BodyCell`
8
+ Description: Wrapper part for date grid cells inside `Calendar.GridBody`.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | -------------- | -------------------------------------- | ----------- | --------------------------------------------------------------- |
12
+ | `date` | `string` | `required` | Calendar date value rendered by the cell (`YYYY-MM-DD`). |
13
+ | `children` | `Snippet<[string]>` | `undefined` | Optional custom renderer receiving the day label text. |
14
+ | `class` | `string` | `''` | CSS class names for the inner gridcell element. |
15
+ | `...restProps` | `HTMLAttributes<HTMLTableCellElement>` | `-` | Additional attributes forwarded to the outer table cell (`td`). |
@@ -1,9 +1,45 @@
1
+ <script module lang="ts">
2
+ const ariaDateFormatterCache: Record<string, Intl.DateTimeFormat> = Object.create(null);
3
+
4
+ function getAriaDateFormatter(locale: string): Intl.DateTimeFormat {
5
+ let formatter = ariaDateFormatterCache[locale];
6
+ if (!formatter) {
7
+ formatter = new Intl.DateTimeFormat(locale, {
8
+ dateStyle: 'full',
9
+ timeZone: 'UTC'
10
+ });
11
+ ariaDateFormatterCache[locale] = formatter;
12
+ }
13
+ return formatter;
14
+ }
15
+
16
+ function formatAriaDateLabel(locale: string, date: string): string {
17
+ const [yearText, monthText, dayText] = date.split('-');
18
+ const year = Number(yearText);
19
+ const month = Number(monthText);
20
+ const day = Number(dayText);
21
+
22
+ if (!Number.isInteger(year) || !Number.isInteger(month) || !Number.isInteger(day)) {
23
+ return date;
24
+ }
25
+
26
+ const parsed = new Date(Date.UTC(year, month - 1, day));
27
+ if (Number.isNaN(parsed.getTime())) return date;
28
+
29
+ return getAriaDateFormatter(locale).format(parsed);
30
+ }
31
+ </script>
32
+
1
33
  <script lang="ts">
2
34
  import type { Snippet } from 'svelte';
3
35
  import type { HTMLAttributes } from 'svelte/elements';
4
36
  import { useCalendarContext } from '../root/context';
5
37
  import { getCalendarMonthIndex } from '../grid/month-scope';
6
38
  import { formatCalendarDate, getTodayUtcDate, parseCalendarDate } from '../root/date-utils';
39
+ import {
40
+ shouldShowFocusVisible,
41
+ trackInteractionModality
42
+ } from '../../primitives/input-modality';
7
43
 
8
44
  type CalendarBodyCellProps = Omit<HTMLAttributes<HTMLTableCellElement>, 'children'> & {
9
45
  date: string;
@@ -47,6 +83,11 @@
47
83
  void $selectionVersion;
48
84
  return calendar.focusedValue === date;
49
85
  });
86
+ const isFocusVisible = $derived.by(() => {
87
+ void $selectionVersion;
88
+ return calendar.focusVisible;
89
+ });
90
+ const isVisuallyFocused = $derived(isFocused && isFocusVisible);
50
91
  const isDisabled = $derived.by(() => {
51
92
  void $layoutVersion;
52
93
  void $selectionVersion;
@@ -56,56 +97,76 @@
56
97
  void $layoutVersion;
57
98
  return calendar.isDateUnavailable(date);
58
99
  });
100
+ const isAriaDisabled = $derived(isDisabled || isUnavailable);
59
101
  const isOutsideMonth = $derived.by(() => {
60
102
  void $layoutVersion;
61
103
  return calendar.isOutsideVisibleRange(date, monthIndex);
62
104
  });
105
+ const showOutsideDays = $derived.by(() => {
106
+ void $layoutVersion;
107
+ return calendar.showOutsideDays;
108
+ });
109
+ const hidesOutsideDay = $derived(isOutsideMonth && !showOutsideDays);
110
+ const isSelectionDisabled = $derived(isDisabled || hidesOutsideDay);
111
+ const isFocusDisabled = $derived(calendar.isDisabled || hidesOutsideDay);
63
112
  const todayDate = formatCalendarDate(getTodayUtcDate());
64
113
  const isToday = $derived(date === todayDate);
114
+ const ariaDateLabel = $derived.by(() => {
115
+ void $layoutVersion;
116
+ return formatAriaDateLabel(calendar.locale, date);
117
+ });
65
118
 
66
- let gridCellElement: HTMLDivElement | undefined;
119
+ let gridCellElement = $state<HTMLDivElement | undefined>(undefined);
67
120
 
68
121
  $effect(() => {
69
- if (!isFocused || isDisabled) return;
122
+ if (!isFocused || isFocusDisabled) return;
70
123
  if (!gridCellElement) return;
71
124
  if (document.activeElement === gridCellElement) return;
72
125
  gridCellElement.focus();
73
126
  });
74
127
 
75
128
  $effect(() => {
76
- if (!isDisabled) return;
129
+ if (!isFocusDisabled) return;
77
130
  if (!gridCellElement) return;
78
131
  if (document.activeElement !== gridCellElement) return;
79
132
  gridCellElement.blur();
80
133
  });
81
134
 
82
135
  function handleClick() {
83
- if (isDisabled) return;
136
+ if (isFocusDisabled) return;
84
137
  calendar.setFocusedValue(date);
85
- calendar.selectDate(date);
138
+ if (!isSelectionDisabled) {
139
+ calendar.selectDate(date);
140
+ }
86
141
  }
87
142
 
88
143
  function handleFocus() {
89
- if (isDisabled) return;
144
+ if (isFocusDisabled) return;
90
145
  calendar.setFocusedValue(date);
146
+ calendar.setFocusVisible(shouldShowFocusVisible(gridCellElement ?? null));
91
147
  }
92
148
 
93
149
  function handleMousedown(event: MouseEvent) {
94
- if (!isDisabled) return;
95
- event.preventDefault();
150
+ trackInteractionModality(event, gridCellElement ?? null);
151
+ calendar.setFocusVisible(false);
152
+ if (isSelectionDisabled) {
153
+ event.preventDefault();
154
+ }
96
155
  }
97
156
 
98
157
  function handleMouseenter() {
99
- if (isDisabled) return;
158
+ if (isFocusDisabled) return;
100
159
  calendar.setHoveredValue(date);
101
160
  }
102
161
 
103
162
  function handleMouseleave() {
104
- if (isDisabled) return;
163
+ if (isFocusDisabled) return;
105
164
  calendar.setHoveredValue(undefined);
106
165
  }
107
166
 
108
167
  function handleKeydown(event: KeyboardEvent) {
168
+ if (isFocusDisabled) return;
169
+ trackInteractionModality(event, gridCellElement ?? null);
109
170
  calendar.handleCellKeydown(event, date);
110
171
  }
111
172
  </script>
@@ -114,7 +175,8 @@
114
175
  role="presentation"
115
176
  data-selected={isSelected || undefined}
116
177
  data-focused={isFocused || undefined}
117
- data-disabled={isDisabled || undefined}
178
+ data-focus-visible={isVisuallyFocused || undefined}
179
+ data-disabled={isAriaDisabled || undefined}
118
180
  data-unavailable={isUnavailable || undefined}
119
181
  data-outside-month={isOutsideMonth || undefined}
120
182
  data-range-start={isRangeStart || undefined}
@@ -122,34 +184,47 @@
122
184
  data-in-range={isInRange || undefined}
123
185
  {...restProps}
124
186
  >
125
- <div
126
- bind:this={gridCellElement}
127
- class={className}
128
- role="gridcell"
129
- tabindex={isDisabled ? -1 : isFocused ? 0 : -1}
130
- data-selected={isSelected || undefined}
131
- data-focused={isFocused || undefined}
132
- data-disabled={isDisabled || undefined}
133
- data-unavailable={isUnavailable || undefined}
134
- data-outside-month={isOutsideMonth || undefined}
135
- data-range-start={isRangeStart || undefined}
136
- data-range-end={isRangeEnd || undefined}
137
- data-in-range={isInRange || undefined}
138
- aria-selected={isSelected}
139
- aria-disabled={isDisabled || undefined}
140
- aria-current={isToday ? 'date' : undefined}
141
- aria-label={date}
142
- onmousedown={handleMousedown}
143
- onmouseenter={handleMouseenter}
144
- onmouseleave={handleMouseleave}
145
- onclick={handleClick}
146
- onfocus={handleFocus}
147
- onkeydown={handleKeydown}
148
- >
149
- {#if children}
150
- {@render children(date)}
151
- {:else}
152
- {dayLabel}
153
- {/if}
154
- </div>
187
+ {#if hidesOutsideDay}
188
+ <div
189
+ class={className}
190
+ role="presentation"
191
+ data-disabled={true}
192
+ data-outside-month={true}
193
+ aria-hidden="true"
194
+ ></div>
195
+ {:else}
196
+ <div
197
+ bind:this={gridCellElement}
198
+ class={className}
199
+ role="gridcell"
200
+ tabindex={isFocusDisabled ? -1 : isFocused ? 0 : -1}
201
+ data-selected={isSelected || undefined}
202
+ data-focused={isFocused || undefined}
203
+ data-focus-visible={isVisuallyFocused || undefined}
204
+ data-disabled={isAriaDisabled || hidesOutsideDay || undefined}
205
+ data-unavailable={isUnavailable || undefined}
206
+ data-outside-month={isOutsideMonth || undefined}
207
+ data-range-start={isRangeStart || undefined}
208
+ data-range-end={isRangeEnd || undefined}
209
+ data-in-range={isInRange || undefined}
210
+ data-date={date}
211
+ aria-selected={isSelected}
212
+ aria-disabled={isAriaDisabled || hidesOutsideDay || undefined}
213
+ aria-current={isToday ? 'date' : undefined}
214
+ aria-label={ariaDateLabel}
215
+ style={isVisuallyFocused ? undefined : 'outline: none;'}
216
+ onmousedown={handleMousedown}
217
+ onmouseenter={handleMouseenter}
218
+ onmouseleave={handleMouseleave}
219
+ onclick={handleClick}
220
+ onfocus={handleFocus}
221
+ onkeydown={handleKeydown}
222
+ >
223
+ {#if children}
224
+ {@render children(date)}
225
+ {:else}
226
+ {dayLabel}
227
+ {/if}
228
+ </div>
229
+ {/if}
155
230
  </td>
@@ -0,0 +1,13 @@
1
+ # Calendar Grid
2
+
3
+ ## API reference
4
+
5
+ ### Calendar.Grid
6
+
7
+ Name: `Calendar.Grid`
8
+ Description: Calendar month table container rendered by `Calendar.Root`.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | ---------- | --------- | ----------- | --------------------------------------------- |
12
+ | `children` | `Snippet` | `undefined` | Optional custom month-grid content. |
13
+ | `class` | `string` | `''` | CSS class names for the outer grid container. |
@@ -0,0 +1,13 @@
1
+ # Calendar GridBody
2
+
3
+ ## API reference
4
+
5
+ ### Calendar.GridBody
6
+
7
+ Name: `Calendar.GridBody`
8
+ Description: TBody container for week rows in `Calendar.Grid`.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | ---------- | ------------------- | ----------- | -------------------------------------------------------- |
12
+ | `children` | `Snippet<[string]>` | `undefined` | Optional custom renderer receiving each day date string. |
13
+ | `class` | `string` | `''` | CSS class names for the `tbody` element. |
@@ -0,0 +1,13 @@
1
+ # Calendar GridHeader
2
+
3
+ ## API reference
4
+
5
+ ### Calendar.GridHeader
6
+
7
+ Name: `Calendar.GridHeader`
8
+ Description: Header row group for weekday labels in `Calendar.Grid`.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | ---------- | ------------------- | ----------- | ---------------------------------------------------------------- |
12
+ | `children` | `Snippet<[string]>` | `undefined` | Optional custom renderer receiving each localized weekday label. |
13
+ | `class` | `string` | `''` | CSS class names for the `thead` element. |
@@ -0,0 +1,14 @@
1
+ # Calendar HeaderCell
2
+
3
+ ## API reference
4
+
5
+ ### Calendar.HeaderCell
6
+
7
+ Name: `Calendar.HeaderCell`
8
+ Description: Weekday heading cell part used inside `Calendar.GridHeader`.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | -------------- | -------------------------------------- | ----------- | -------------------------------------------------- |
12
+ | `children` | `Snippet` | `undefined` | Optional custom header cell content. |
13
+ | `class` | `string` | `''` | CSS class names for the header cell element. |
14
+ | `...restProps` | `HTMLAttributes<HTMLTableCellElement>` | `-` | Additional attributes forwarded to the table cell. |
@@ -0,0 +1,13 @@
1
+ # Calendar Heading
2
+
3
+ ## API reference
4
+
5
+ ### Calendar.Heading
6
+
7
+ Name: `Calendar.Heading`
8
+ Description: Label part that displays the currently visible calendar period.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | -------------- | ------------------------------------ | ------- | ------------------------------------------------------- |
12
+ | `class` | `string` | `''` | CSS class names for the heading element (`h2`). |
13
+ | `...restProps` | `HTMLAttributes<HTMLHeadingElement>` | `-` | Additional attributes forwarded to the heading element. |
@@ -1,4 +1,4 @@
1
- export * as Calendar from './index.parts.ts';
1
+ export * as Calendar from './index.parts.js';
2
2
  export { default as CalendarRoot } from './root/calendar-root.svelte';
3
3
  export { default as CalendarTriggerPrevious } from './trigger-previous/calendar-trigger-previous.svelte';
4
4
  export { default as CalendarHeading } from './heading/calendar-heading.svelte';
@@ -8,6 +8,6 @@ export { default as CalendarGridHeader } from './grid-header/calendar-grid-heade
8
8
  export { default as CalendarHeaderCell } from './header-cell/calendar-header-cell.svelte';
9
9
  export { default as CalendarGridBody } from './grid-body/calendar-grid-body.svelte';
10
10
  export { default as CalendarBodyCell } from './body-cell/calendar-body-cell.svelte';
11
- export { getCalendarContext, setCalendarContext, useCalendarContext, createCalendarContext, type CalendarContext, type CalendarMonth, type CalendarSelectionMode, type CalendarRangeValue, type CalendarValueBySelectionMode, type CalendarValue, type CreateCalendarContextOptions } from './root/context';
12
- import * as CalendarParts from './index.parts.ts';
11
+ export { getCalendarContext, setCalendarContext, useCalendarContext, createCalendarContext, type CalendarContext, type CalendarMonth, type CalendarSelectionMode, type CalendarRangeValue, type CalendarValueBySelectionMode, type CalendarValue, type CreateCalendarContextOptions } from './root/context.js';
12
+ import * as CalendarParts from './index.parts.js';
13
13
  export default CalendarParts;
@@ -1,4 +1,4 @@
1
- export * as Calendar from './index.parts.ts';
1
+ export * as Calendar from './index.parts.js';
2
2
  export { default as CalendarRoot } from './root/calendar-root.svelte';
3
3
  export { default as CalendarTriggerPrevious } from './trigger-previous/calendar-trigger-previous.svelte';
4
4
  export { default as CalendarHeading } from './heading/calendar-heading.svelte';
@@ -8,6 +8,6 @@ export { default as CalendarGridHeader } from './grid-header/calendar-grid-heade
8
8
  export { default as CalendarHeaderCell } from './header-cell/calendar-header-cell.svelte';
9
9
  export { default as CalendarGridBody } from './grid-body/calendar-grid-body.svelte';
10
10
  export { default as CalendarBodyCell } from './body-cell/calendar-body-cell.svelte';
11
- export { getCalendarContext, setCalendarContext, useCalendarContext, createCalendarContext } from './root/context';
12
- import * as CalendarParts from './index.parts.ts';
11
+ export { getCalendarContext, setCalendarContext, useCalendarContext, createCalendarContext } from './root/context.js';
12
+ import * as CalendarParts from './index.parts.js';
13
13
  export default CalendarParts;
@@ -0,0 +1,24 @@
1
+ # Calendar Root
2
+
3
+ ## API reference
4
+
5
+ ### Calendar.Root
6
+
7
+ Name: `Calendar.Root`
8
+ Description: Root state container for date grid rendering, navigation, selection, and locale-aware formatting.
9
+
10
+ | Prop | Type | Default | Description |
11
+ | ------------------- | ---------------------------------------------------------- | ----------- | ------------------------------------------------------------------- |
12
+ | `selectionMode` | `'single' \| 'range'` | `'single'` | Selection behavior and value shape. |
13
+ | `value` | `CalendarDateValue \| CalendarRangeValue \| undefined` | `bindable` | Controlled selected value (single date or `{ start, end }`). |
14
+ | `defaultValue` | `CalendarDateValue \| CalendarRangeValue \| undefined` | `undefined` | Initial value for uncontrolled mode. |
15
+ | `onChange` | `(value: CalendarDateValue \| CalendarRangeValue) => void` | `undefined` | Called when selection changes. |
16
+ | `visibleMonths` | `number` | `1` | Number of month grids rendered simultaneously. |
17
+ | `showOutsideDays` | `boolean` | `false` | Whether days outside the visible month remain rendered/interactive. |
18
+ | `isDateUnavailable` | `(date: string) => boolean` | `undefined` | Marks specific dates as unavailable. |
19
+ | `isDisabled` | `boolean` | `false` | Disables interaction and navigation. |
20
+ | `isReadOnly` | `boolean` | `false` | Keeps navigation while preventing selection updates. |
21
+ | `children` | `Snippet` | `undefined` | Composed `Calendar` parts. |
22
+ | `class` | `string` | `''` | CSS class names for the root wrapper. |
23
+ | `id` | `string` | `undefined` | Optional root id. |
24
+ | `aria-label` | `string` | `undefined` | Accessible label for the root wrapper. |
@@ -5,6 +5,7 @@
5
5
  type Props = {
6
6
  selectionMode?: CalendarSelectionMode;
7
7
  visibleMonths?: number;
8
+ showOutsideDays?: boolean;
8
9
  isDisabled?: boolean;
9
10
  isReadOnly?: boolean;
10
11
  defaultValue?: CalendarValue;
@@ -14,6 +15,7 @@
14
15
  let {
15
16
  selectionMode = 'single',
16
17
  visibleMonths = 1,
18
+ showOutsideDays = false,
17
19
  isDisabled = false,
18
20
  isReadOnly = false,
19
21
  defaultValue,
@@ -32,6 +34,7 @@
32
34
  <Calendar.Root
33
35
  selectionMode="range"
34
36
  {visibleMonths}
37
+ {showOutsideDays}
35
38
  {isDisabled}
36
39
  {isReadOnly}
37
40
  defaultValue={rangeDefaultValue}
@@ -50,6 +53,7 @@
50
53
  <Calendar.Root
51
54
  selectionMode="single"
52
55
  {visibleMonths}
56
+ {showOutsideDays}
53
57
  {isDisabled}
54
58
  {isReadOnly}
55
59
  defaultValue={singleDefaultValue}
@@ -2,6 +2,7 @@ import type { CalendarSelectionMode, CalendarValue } from './context';
2
2
  type Props = {
3
3
  selectionMode?: CalendarSelectionMode;
4
4
  visibleMonths?: number;
5
+ showOutsideDays?: boolean;
5
6
  isDisabled?: boolean;
6
7
  isReadOnly?: boolean;
7
8
  defaultValue?: CalendarValue;