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

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 (394) hide show
  1. package/dist/FOCUS_STATE_CONTRACT.md +63 -0
  2. package/dist/FOCUS_STATE_REVIEW_TEMPLATE.md +70 -0
  3. package/dist/button/README.md +48 -0
  4. package/dist/button/TODO.md +13 -0
  5. package/dist/button/index.d.ts +5 -0
  6. package/dist/button/index.js +4 -0
  7. package/dist/button/index.parts.d.ts +1 -0
  8. package/dist/button/index.parts.js +1 -0
  9. package/dist/button/root/README.md +43 -0
  10. package/dist/button/root/button-root.svelte +362 -0
  11. package/dist/button/root/button-root.svelte.d.ts +21 -0
  12. package/dist/button/root/button-test.svelte +76 -0
  13. package/dist/button/root/button-test.svelte.d.ts +11 -0
  14. package/dist/calendar/README.md +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/hooks/use-virtual-focus.svelte.js +3 -1
  208. package/dist/index.d.ts +31 -17
  209. package/dist/index.js +31 -17
  210. package/dist/input/README.md +38 -0
  211. package/dist/input/TODO.md +12 -0
  212. package/dist/input/input-test.svelte +43 -0
  213. package/dist/input/input-test.svelte.d.ts +12 -0
  214. package/dist/input/input.svelte +151 -7
  215. package/dist/input/input.svelte.d.ts +8 -2
  216. package/dist/listbox/index.d.ts +3 -3
  217. package/dist/listbox/index.js +3 -3
  218. package/dist/listbox/item/README.md +2 -1
  219. package/dist/listbox/item/listbox-item.svelte +260 -6
  220. package/dist/listbox/item/listbox-item.svelte.d.ts +6 -0
  221. package/dist/listbox/root/context.d.ts +6 -0
  222. package/dist/listbox/root/context.js +23 -13
  223. package/dist/listbox/root/listbox-test.svelte +14 -2
  224. package/dist/listbox/root/listbox-test.svelte.d.ts +1 -0
  225. package/dist/listbox/root/listbox.svelte +49 -2
  226. package/dist/listbox/root/listbox.svelte.d.ts +4 -2
  227. package/dist/popover/README.md +10 -0
  228. package/dist/popover/content/README.md +11 -0
  229. package/dist/popover/content/popover-content-standalone-test.svelte +28 -0
  230. package/dist/popover/content/popover-content-standalone-test.svelte.d.ts +6 -0
  231. package/dist/popover/content/popover-content-test.svelte +32 -2
  232. package/dist/popover/content/popover-content-test.svelte.d.ts +3 -1
  233. package/dist/popover/content/popover-content.svelte +277 -24
  234. package/dist/popover/content/popover-content.svelte.d.ts +5 -1
  235. package/dist/popover/index.d.ts +3 -3
  236. package/dist/popover/index.js +3 -5
  237. package/dist/popover/root/README.md +10 -15
  238. package/dist/popover/root/context.d.ts +16 -7
  239. package/dist/popover/root/context.js +0 -2
  240. package/dist/popover/root/focus-state.d.ts +4 -0
  241. package/dist/popover/root/focus-state.js +33 -0
  242. package/dist/popover/root/popover-root.svelte +90 -17
  243. package/dist/popover/root/popover-root.svelte.d.ts +2 -1
  244. package/dist/popover/root/popover-test.svelte +2 -1
  245. package/dist/popover/root/popover-test.svelte.d.ts +2 -1
  246. package/dist/popover/trigger/popover-trigger-button.svelte +8 -7
  247. package/dist/popover/trigger/popover-trigger.svelte +14 -5
  248. package/dist/portal/portal.svelte +3 -1
  249. package/dist/primitives/click-outside.d.ts +1 -1
  250. package/dist/primitives/click-outside.js +1 -1
  251. package/dist/primitives/floating.js +12 -4
  252. package/dist/primitives/focus-trap.d.ts +7 -2
  253. package/dist/primitives/focus-trap.js +50 -17
  254. package/dist/primitives/index.d.ts +1 -0
  255. package/dist/primitives/index.js +1 -0
  256. package/dist/primitives/input-modality.d.ts +7 -0
  257. package/dist/primitives/input-modality.js +125 -0
  258. package/dist/primitives/keyboard-navigation.d.ts +1 -0
  259. package/dist/primitives/keyboard-navigation.js +17 -0
  260. package/dist/table/IMPLEMENTATION_NOTES.md +9 -0
  261. package/dist/table/PLAN-HIDDEN-COLUMNS.md +152 -0
  262. package/dist/table/PLAN.md +1336 -0
  263. package/dist/table/README.md +143 -0
  264. package/dist/table/SELECTION_CHECKBOX_PLAN.md +234 -0
  265. package/dist/table/TODO.md +138 -0
  266. package/dist/table/body/README.md +26 -0
  267. package/dist/table/body/table-body.svelte +24 -0
  268. package/dist/table/body/table-body.svelte.d.ts +4 -0
  269. package/dist/table/cell/README.md +27 -0
  270. package/dist/table/cell/table-cell.svelte +265 -0
  271. package/dist/table/cell/table-cell.svelte.d.ts +4 -0
  272. package/dist/table/checkbox/README.md +40 -0
  273. package/dist/table/checkbox/table-checkbox-test.svelte +128 -0
  274. package/dist/table/checkbox/table-checkbox-test.svelte.d.ts +18 -0
  275. package/dist/table/checkbox/table-checkbox.svelte +235 -0
  276. package/dist/table/checkbox/table-checkbox.svelte.d.ts +4 -0
  277. package/dist/table/checkbox-indicator/README.md +31 -0
  278. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte +15 -0
  279. package/dist/table/checkbox-indicator/table-checkbox-indicator.svelte.d.ts +4 -0
  280. package/dist/table/column/README.md +36 -0
  281. package/dist/table/column/table-column.svelte +79 -0
  282. package/dist/table/column/table-column.svelte.d.ts +4 -0
  283. package/dist/table/column-header-cell/README.md +30 -0
  284. package/dist/table/column-header-cell/table-column-header-cell.svelte +271 -0
  285. package/dist/table/column-header-cell/table-column-header-cell.svelte.d.ts +4 -0
  286. package/dist/table/column-resizer/README.md +33 -0
  287. package/dist/table/column-resizer/table-column-resizer-fixed-width-test.svelte +57 -0
  288. package/dist/table/column-resizer/table-column-resizer-fixed-width-test.svelte.d.ts +3 -0
  289. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte +52 -0
  290. package/dist/table/column-resizer/table-column-resizer-freeze-layout-test.svelte.d.ts +3 -0
  291. package/dist/table/column-resizer/table-column-resizer-narrow-min-width-test.svelte +76 -0
  292. package/dist/table/column-resizer/table-column-resizer-narrow-min-width-test.svelte.d.ts +3 -0
  293. package/dist/table/column-resizer/table-column-resizer-overflow-test.svelte +64 -0
  294. package/dist/table/column-resizer/table-column-resizer-overflow-test.svelte.d.ts +3 -0
  295. package/dist/table/column-resizer/table-column-resizer-padded-container-test.svelte +67 -0
  296. package/dist/table/column-resizer/table-column-resizer-padded-container-test.svelte.d.ts +3 -0
  297. package/dist/table/column-resizer/table-column-resizer-sandbox-overflow-test.svelte +87 -0
  298. package/dist/table/column-resizer/table-column-resizer-sandbox-overflow-test.svelte.d.ts +3 -0
  299. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte +84 -0
  300. package/dist/table/column-resizer/table-column-resizer-selection-column-test.svelte.d.ts +3 -0
  301. package/dist/table/column-resizer/table-column-resizer-test.svelte +77 -0
  302. package/dist/table/column-resizer/table-column-resizer-test.svelte.d.ts +3 -0
  303. package/dist/table/column-resizer/table-column-resizer-three-column-relative-test.svelte +64 -0
  304. package/dist/table/column-resizer/table-column-resizer-three-column-relative-test.svelte.d.ts +3 -0
  305. package/dist/table/column-resizer/table-column-resizer.svelte +610 -0
  306. package/dist/table/column-resizer/table-column-resizer.svelte.d.ts +4 -0
  307. package/dist/table/empty-state/README.md +27 -0
  308. package/dist/table/empty-state/table-empty-state.svelte +33 -0
  309. package/dist/table/empty-state/table-empty-state.svelte.d.ts +4 -0
  310. package/dist/table/footer/README.md +26 -0
  311. package/dist/table/footer/table-footer.svelte +13 -0
  312. package/dist/table/footer/table-footer.svelte.d.ts +4 -0
  313. package/dist/table/header/README.md +26 -0
  314. package/dist/table/header/table-header.svelte +13 -0
  315. package/dist/table/header/table-header.svelte.d.ts +4 -0
  316. package/dist/table/index.d.ts +18 -0
  317. package/dist/table/index.js +17 -0
  318. package/dist/table/index.parts.d.ts +13 -0
  319. package/dist/table/index.parts.js +13 -0
  320. package/dist/table/root/README.md +66 -0
  321. package/dist/table/root/context.d.ts +228 -0
  322. package/dist/table/root/context.js +2111 -0
  323. package/dist/table/root/table-reorder-test.svelte +64 -0
  324. package/dist/table/root/table-reorder-test.svelte.d.ts +3 -0
  325. package/dist/table/root/table-root.svelte +553 -0
  326. package/dist/table/root/table-root.svelte.d.ts +4 -0
  327. package/dist/table/root/table-test.svelte +206 -0
  328. package/dist/table/root/table-test.svelte.d.ts +29 -0
  329. package/dist/table/row/README.md +29 -0
  330. package/dist/table/row/table-row.svelte +244 -0
  331. package/dist/table/row/table-row.svelte.d.ts +4 -0
  332. package/dist/table/sort-trigger/README.md +45 -0
  333. package/dist/table/sort-trigger/table-sort-trigger.svelte +183 -0
  334. package/dist/table/sort-trigger/table-sort-trigger.svelte.d.ts +4 -0
  335. package/dist/table/types.d.ts +95 -0
  336. package/dist/table/types.js +1 -0
  337. package/dist/table/utils/handle-body-keydown.d.ts +13 -0
  338. package/dist/table/utils/handle-body-keydown.js +67 -0
  339. package/dist/table/utils/visually-hidden-style.d.ts +1 -0
  340. package/dist/table/utils/visually-hidden-style.js +1 -0
  341. package/dist/test-utils/focus-contract.d.ts +3 -0
  342. package/dist/test-utils/focus-contract.js +26 -0
  343. package/dist/timepicker/IMPLEMENTATION_PLAN.md +254 -0
  344. package/dist/timepicker/README.md +97 -0
  345. package/dist/timepicker/TODO.md +86 -0
  346. package/dist/timepicker/clock/README.md +14 -0
  347. package/dist/timepicker/clock/time-picker-clock-test.svelte +45 -0
  348. package/dist/timepicker/clock/time-picker-clock-test.svelte.d.ts +11 -0
  349. package/dist/timepicker/clock/time-picker-clock.svelte +65 -0
  350. package/dist/timepicker/clock/time-picker-clock.svelte.d.ts +10 -0
  351. package/dist/timepicker/index.d.ts +14 -0
  352. package/dist/timepicker/index.js +14 -0
  353. package/dist/timepicker/index.parts.d.ts +8 -0
  354. package/dist/timepicker/index.parts.js +8 -0
  355. package/dist/timepicker/input/README.md +15 -0
  356. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte +40 -0
  357. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte.d.ts +3 -0
  358. package/dist/timepicker/input/time-picker-input.svelte +109 -0
  359. package/dist/timepicker/input/time-picker-input.svelte.d.ts +11 -0
  360. package/dist/timepicker/internal/strict-props.d.ts +4 -0
  361. package/dist/timepicker/internal/strict-props.js +51 -0
  362. package/dist/timepicker/popover/README.md +20 -0
  363. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte +22 -0
  364. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte.d.ts +3 -0
  365. package/dist/timepicker/popover/time-picker-popover.svelte +89 -0
  366. package/dist/timepicker/popover/time-picker-popover.svelte.d.ts +7 -0
  367. package/dist/timepicker/root/README.md +42 -0
  368. package/dist/timepicker/root/context.d.ts +51 -0
  369. package/dist/timepicker/root/context.js +15 -0
  370. package/dist/timepicker/root/time-picker-12h-test.svelte +22 -0
  371. package/dist/timepicker/root/time-picker-12h-test.svelte.d.ts +3 -0
  372. package/dist/timepicker/root/time-picker-bindable-test.svelte +25 -0
  373. package/dist/timepicker/root/time-picker-bindable-test.svelte.d.ts +3 -0
  374. package/dist/timepicker/root/time-picker-empty-test.svelte +20 -0
  375. package/dist/timepicker/root/time-picker-empty-test.svelte.d.ts +3 -0
  376. package/dist/timepicker/root/time-picker-root.svelte +625 -0
  377. package/dist/timepicker/root/time-picker-root.svelte.d.ts +28 -0
  378. package/dist/timepicker/root/time-picker-test.svelte +72 -0
  379. package/dist/timepicker/root/time-picker-test.svelte.d.ts +15 -0
  380. package/dist/timepicker/root/time-utils.d.ts +1 -0
  381. package/dist/timepicker/root/time-utils.js +3 -0
  382. package/dist/timepicker/segment/README.md +14 -0
  383. package/dist/timepicker/segment/time-picker-segment.svelte +365 -0
  384. package/dist/timepicker/segment/time-picker-segment.svelte.d.ts +9 -0
  385. package/dist/timepicker/trigger/README.md +14 -0
  386. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte +35 -0
  387. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte.d.ts +3 -0
  388. package/dist/timepicker/trigger/time-picker-trigger.svelte +122 -0
  389. package/dist/timepicker/trigger/time-picker-trigger.svelte.d.ts +9 -0
  390. package/dist/utils/date-only.d.ts +11 -0
  391. package/dist/utils/date-only.js +53 -0
  392. package/dist/utils/index.d.ts +1 -0
  393. package/dist/utils/index.js +1 -0
  394. package/package.json +31 -1
@@ -0,0 +1,31 @@
1
+ # Table.CheckboxIndicator
2
+
3
+ ## API reference
4
+
5
+ ### Indicator Part
6
+
7
+ Name: `Table.CheckboxIndicator`
8
+ Description: Headless presence wrapper for indicator content inside `Table.Checkbox`. It renders when the checkbox is checked or indeterminate.
9
+
10
+ Public prop type: `TableCheckboxIndicatorProps`
11
+
12
+ | Prop | Type | Default | Description |
13
+ | -------------- | --------------------------------- | ----------- | ------------------------------------------------------------------------------- |
14
+ | `keepMounted` | `boolean` | `false` | Keeps the indicator mounted while hidden when the checkbox is unchecked. |
15
+ | `children` | `Snippet` | `undefined` | Rendered indicator content, such as a check icon or dash icon. |
16
+ | `class` | `string` | `''` | CSS class names for the indicator wrapper. |
17
+ | `...restProps` | `HTMLAttributes<HTMLSpanElement>` | `-` | Additional native attributes forwarded to the composed checkbox indicator span. |
18
+
19
+ ## Usage notes
20
+
21
+ - Use `Table.CheckboxIndicator` inside `Table.Checkbox`.
22
+ - The part is headless and unstyled.
23
+ - It mirrors the visibility behavior of `Checkbox.Indicator` and renders for checked and indeterminate states.
24
+
25
+ ```svelte
26
+ <Table.Checkbox class="inline-flex h-5 w-5 items-center justify-center rounded border">
27
+ <Table.CheckboxIndicator>
28
+ <CheckIcon class="h-3.5 w-3.5" />
29
+ </Table.CheckboxIndicator>
30
+ </Table.Checkbox>
31
+ ```
@@ -0,0 +1,15 @@
1
+ <script lang="ts">
2
+ import { Checkbox } from '../../checkbox';
3
+ import type { TableCheckboxIndicatorProps } from '../types.js';
4
+
5
+ let {
6
+ keepMounted = false,
7
+ children,
8
+ class: className = '',
9
+ ...restProps
10
+ }: TableCheckboxIndicatorProps = $props();
11
+ </script>
12
+
13
+ <Checkbox.Indicator {keepMounted} class={className} {...restProps}>
14
+ {@render children?.()}
15
+ </Checkbox.Indicator>
@@ -0,0 +1,4 @@
1
+ import type { TableCheckboxIndicatorProps } from '../types.js';
2
+ declare const TableCheckboxIndicator: import("svelte").Component<TableCheckboxIndicatorProps, {}, "">;
3
+ type TableCheckboxIndicator = ReturnType<typeof TableCheckboxIndicator>;
4
+ export default TableCheckboxIndicator;
@@ -0,0 +1,36 @@
1
+ <!-- markdownlint-disable MD024 MD060 -->
2
+
3
+ # Table.Column
4
+
5
+ ## API reference
6
+
7
+ ### Table.Column
8
+
9
+ Name: `Table.Column`
10
+ Description: Logical metadata wrapper for a header column. It does not render DOM and is used to register stable column identity, row-header semantics, and width constraints.
11
+
12
+ Public prop type: `TableColumnProps`
13
+
14
+ | Prop | Type | Default | Description |
15
+ | -------------- | --------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------- |
16
+ | `id` | `string` | `-` | Stable identifier for the column. |
17
+ | `isRowHeader` | `boolean` | `false` | Marks the associated body column as row-header cells. |
18
+ | `textValue` | `string` | `undefined` | Optional spoken label used by `Table.Root` sort announcements when it should differ from `id`. |
19
+ | `width` | `number \| \`${number}px\`` | `undefined` | Fixed column width. When set, the column keeps that width and user resize interactions are disabled. |
20
+ | `defaultWidth` | `number \| \`${number}px\`` | `undefined` | Uncontrolled initial width hint for the column. The column remains user-resizable when a resizer is composed. |
21
+ | `minWidth` | `number` | `undefined` | Minimum width in px enforced during resize interactions. |
22
+ | `maxWidth` | `number` | `undefined` | Maximum width in px enforced during resize interactions. |
23
+ | `children` | `Snippet` | `undefined` | Usually a single `Table.ColumnHeaderCell`. |
24
+
25
+ `Table.SortTrigger` is the public sorting opt-in. Compose it inside `Table.ColumnHeaderCell` when the owning column should be sortable.
26
+
27
+ `Table.ColumnResizer` is the public resize opt-in. Compose it inside `Table.ColumnHeaderCell` when the owning column should be resizable.
28
+
29
+ ### Context utilities
30
+
31
+ Name: `Table.Column` column context
32
+ Description: Provides column metadata to `Table.ColumnHeaderCell`.
33
+
34
+ | Prop | Type | Default | Description |
35
+ | ----------------------- | -------------------------- | ------- | -------------------------------------------------------------------- |
36
+ | `useTableColumnContext` | `() => TableColumnContext` | `-` | Reads the current column metadata and throws outside `Table.Column`. |
@@ -0,0 +1,79 @@
1
+ <script lang="ts">
2
+ import { onDestroy } from 'svelte';
3
+ import { setTableColumnContext, useTableContext, useTableSectionContext } from '../root/context';
4
+ import type { TableColumnProps } from '../types.js';
5
+
6
+ let {
7
+ id,
8
+ isRowHeader = false,
9
+ textValue,
10
+ width,
11
+ defaultWidth,
12
+ minWidth,
13
+ maxWidth,
14
+ children
15
+ }: TableColumnProps = $props();
16
+
17
+ const table = useTableContext();
18
+ const section = useTableSectionContext();
19
+ const token = table.createInstanceToken('column');
20
+
21
+ if (section.section !== 'header') {
22
+ throw new Error('`Table.Column` must be used inside `Table.Header`.');
23
+ }
24
+
25
+ setTableColumnContext({
26
+ token,
27
+ get id() {
28
+ return id;
29
+ },
30
+ get isHidden() {
31
+ return table.isColumnHidden(id);
32
+ },
33
+ get isRowHeader() {
34
+ return isRowHeader;
35
+ },
36
+ get textValue() {
37
+ return textValue;
38
+ },
39
+ get width() {
40
+ return width;
41
+ },
42
+ get defaultWidth() {
43
+ return defaultWidth;
44
+ },
45
+ get minWidth() {
46
+ return minWidth;
47
+ },
48
+ get maxWidth() {
49
+ return maxWidth;
50
+ }
51
+ });
52
+
53
+ function syncColumnRegistration() {
54
+ table.registerColumn({
55
+ token,
56
+ id,
57
+ isRowHeader,
58
+ textValue,
59
+ width,
60
+ defaultWidth,
61
+ minWidth,
62
+ maxWidth
63
+ });
64
+ }
65
+
66
+ syncColumnRegistration();
67
+
68
+ $effect(() => {
69
+ syncColumnRegistration();
70
+ });
71
+
72
+ onDestroy(() => {
73
+ table.unregisterColumn(token);
74
+ });
75
+ </script>
76
+
77
+ {#if children}
78
+ {@render children()}
79
+ {/if}
@@ -0,0 +1,4 @@
1
+ import type { TableColumnProps } from '../types.js';
2
+ declare const TableColumn: import("svelte").Component<TableColumnProps, {}, "">;
3
+ type TableColumn = ReturnType<typeof TableColumn>;
4
+ export default TableColumn;
@@ -0,0 +1,30 @@
1
+ <!-- markdownlint-disable MD024 -->
2
+
3
+ # Table.ColumnHeaderCell
4
+
5
+ ## API reference
6
+
7
+ ### Table.ColumnHeaderCell
8
+
9
+ Name: `Table.ColumnHeaderCell`
10
+ Description: Focusable header cell for a column. It participates in roving focus, exposes `aria-sort` when a nested `Table.SortTrigger` is present, and can host additional header actions.
11
+
12
+ Public prop type: `TableColumnHeaderCellProps`
13
+
14
+ - When a nested control like `Table.ColumnResizer` receives focus, the header exposes `data-focus-within` / `data-focus-visible-within` instead of remaining `data-focused`.
15
+
16
+ | Prop | Type | Default | Description |
17
+ | ---------- | --------- | ----------- | --------------------------------- |
18
+ | `class` | `string` | `''` | Class names for the `th` element. |
19
+ | `children` | `Snippet` | `undefined` | Header content. |
20
+
21
+ ### Context utilities
22
+
23
+ Name: `Table.ColumnHeaderCell` dependencies
24
+ Description: Consumes both column and row context to register a navigable header cell.
25
+
26
+ | Prop | Type | Default | Description |
27
+ | ----------------------- | -------------------------- | ------- | ------------------------------------ |
28
+ | `useTableColumnContext` | `() => TableColumnContext` | `-` | Reads current column metadata. |
29
+ | `useTableRowContext` | `() => TableRowContext` | `-` | Reads the current row token. |
30
+ | `useTableContext` | `() => TableContext` | `-` | Reads table focus and sorting state. |
@@ -0,0 +1,271 @@
1
+ <script lang="ts">
2
+ import { onDestroy } from 'svelte';
3
+ import {
4
+ setTableCellContext,
5
+ useTableColumnContext,
6
+ useTableContext,
7
+ useTableRowContext
8
+ } from '../root/context';
9
+ import type { TableColumnHeaderCellProps } from '../types.js';
10
+ import {
11
+ shouldShowFocusVisible,
12
+ trackInteractionModality
13
+ } from '../../primitives/input-modality';
14
+
15
+ let { children, class: className = '', ...restProps }: TableColumnHeaderCellProps = $props();
16
+
17
+ const table = useTableContext();
18
+ const column = useTableColumnContext();
19
+ const row = useTableRowContext();
20
+ const key = table.createInstanceToken('header-cell');
21
+ const focusVersion = table.focusVersion;
22
+ const layoutVersion = table.layoutVersion;
23
+ const sortVersion = table.sortVersion;
24
+ const widthVersion = table.widthVersion;
25
+
26
+ let element = $state<HTMLElement | undefined>(undefined);
27
+ let focusDelegate = $state<(() => HTMLElement | undefined) | undefined>(undefined);
28
+ let isElementFocused = $state(false);
29
+ let isElementFocusVisible = $state(false);
30
+ let isFocusWithin = $state(false);
31
+ let isFocusVisibleWithin = $state(false);
32
+ row.registerCellToken(key, () => element);
33
+ function syncHeaderCellRegistration() {
34
+ table.registerCell({
35
+ key,
36
+ rowToken: row.rowToken,
37
+ section: 'header',
38
+ columnToken: column.token,
39
+ element,
40
+ focusDelegate
41
+ });
42
+ }
43
+
44
+ function registerFocusDelegate(getElement: () => HTMLElement | undefined) {
45
+ focusDelegate = getElement;
46
+ }
47
+
48
+ function unregisterFocusDelegate() {
49
+ focusDelegate = undefined;
50
+ }
51
+
52
+ function notifyResizerPresent() {
53
+ // No-op. Header cells now always provide the positioning context that
54
+ // column resizers need so the handle is available in SSR HTML too.
55
+ }
56
+
57
+ function notifyResizerRemoved() {
58
+ // No-op. See notifyResizerPresent().
59
+ }
60
+
61
+ setTableCellContext({
62
+ cellKey: key,
63
+ registerFocusDelegate,
64
+ unregisterFocusDelegate,
65
+ notifyResizerPresent,
66
+ notifyResizerRemoved
67
+ });
68
+
69
+ syncHeaderCellRegistration();
70
+
71
+ $effect(() => {
72
+ syncHeaderCellRegistration();
73
+ });
74
+
75
+ onDestroy(() => {
76
+ row.unregisterCellToken(key);
77
+ table.unregisterCell(key);
78
+ });
79
+
80
+ const isFocused = $derived.by(() => {
81
+ void $focusVersion;
82
+ return table.isCellFocused(key) && isElementFocused;
83
+ });
84
+ const isFocusVisible = $derived.by(() => {
85
+ void $focusVersion;
86
+ return isFocused && isElementFocusVisible;
87
+ });
88
+ const sortDirection = $derived.by(() => {
89
+ void $sortVersion;
90
+ return table.getSortDirection(column.id);
91
+ });
92
+ const isHidden = $derived.by(() => {
93
+ void $layoutVersion;
94
+ return column.isHidden;
95
+ });
96
+ const columnWidthStyle = $derived.by(() => {
97
+ void $widthVersion;
98
+ return table.getColumnWidthStyle(column.id);
99
+ });
100
+ const columnMinWidth = $derived.by(() => {
101
+ void $widthVersion;
102
+ return table.getColumnMinWidth(column.id);
103
+ });
104
+ const columnMaxWidth = $derived.by(() => {
105
+ void $widthVersion;
106
+ return table.getColumnMaxWidth(column.id);
107
+ });
108
+ const visibleColumnIndex = $derived.by(() => {
109
+ void $layoutVersion;
110
+ return table.getVisibleColumnIndexByToken(column.token);
111
+ });
112
+ const isSortable = $derived.by(() => {
113
+ void $layoutVersion;
114
+ void $sortVersion;
115
+ return table.isColumnSortable(column.id);
116
+ });
117
+ const headerTabIndex = $derived.by(() => {
118
+ if (isHidden || focusDelegate) return undefined;
119
+ return table.isCellTabStop(key) ? 0 : -1;
120
+ });
121
+
122
+ function focusResizerInHeader(target: HTMLElement | undefined) {
123
+ const resizer = target?.querySelector<HTMLElement>('[data-table-column-resizer="true"]');
124
+ if (!resizer) return false;
125
+ resizer.focus();
126
+ return document.activeElement === resizer;
127
+ }
128
+
129
+ function getSiblingHeaderCell(direction: 'left' | 'right') {
130
+ const headerRow = element?.closest('tr');
131
+ if (!headerRow || !element) return null;
132
+
133
+ const headerCells = Array.from(
134
+ headerRow.querySelectorAll<HTMLElement>('th[role="columnheader"]')
135
+ );
136
+ const currentIndex = headerCells.indexOf(element);
137
+ if (currentIndex < 0) return null;
138
+
139
+ return headerCells[currentIndex + (direction === 'left' ? -1 : 1)] ?? null;
140
+ }
141
+
142
+ function moveFocusIntoResizeHandle(direction: 'left' | 'right') {
143
+ if (direction === 'right') {
144
+ return focusResizerInHeader(element);
145
+ }
146
+
147
+ return focusResizerInHeader(getSiblingHeaderCell('left') ?? undefined);
148
+ }
149
+
150
+ function handleFocus() {
151
+ isElementFocused = true;
152
+ isElementFocusVisible = shouldShowFocusVisible(element ?? null);
153
+ table.setFocusedCell(key);
154
+ table.setFocusVisible(isElementFocusVisible);
155
+ }
156
+
157
+ function handleBlur() {
158
+ isElementFocused = false;
159
+ isElementFocusVisible = false;
160
+ }
161
+
162
+ function handleFocusIn(event: FocusEvent) {
163
+ if (event.target === element) {
164
+ isFocusWithin = false;
165
+ isFocusVisibleWithin = false;
166
+ return;
167
+ }
168
+ isFocusWithin = true;
169
+ isFocusVisibleWithin = shouldShowFocusVisible(event.target as HTMLElement | null);
170
+ }
171
+
172
+ function handleFocusOut(event: FocusEvent) {
173
+ const nextFocused = event.relatedTarget;
174
+ if (nextFocused instanceof Node && element?.contains(nextFocused)) return;
175
+ isFocusWithin = false;
176
+ isFocusVisibleWithin = false;
177
+ }
178
+
179
+ function handleClick() {
180
+ table.focusCellByKey(key);
181
+ table.consumeHeaderClickSuppression();
182
+ }
183
+
184
+ function handleMouseDown(event: MouseEvent) {
185
+ trackInteractionModality(event, element ?? null);
186
+ isElementFocusVisible = false;
187
+ isFocusVisibleWithin = false;
188
+ table.setFocusVisible(false);
189
+ }
190
+
191
+ function handleKeyDown(event: KeyboardEvent) {
192
+ trackInteractionModality(event, element ?? null);
193
+
194
+ if ((event.ctrlKey || event.metaKey) && event.key === 'Home') {
195
+ event.preventDefault();
196
+ table.moveToGridStart();
197
+ return;
198
+ }
199
+
200
+ if ((event.ctrlKey || event.metaKey) && event.key === 'End') {
201
+ event.preventDefault();
202
+ table.moveToGridEnd();
203
+ return;
204
+ }
205
+
206
+ switch (event.key) {
207
+ case 'ArrowUp':
208
+ event.preventDefault();
209
+ table.moveFocus('up');
210
+ return;
211
+ case 'ArrowDown':
212
+ event.preventDefault();
213
+ table.moveFocus('down');
214
+ return;
215
+ case 'ArrowLeft':
216
+ event.preventDefault();
217
+ if (moveFocusIntoResizeHandle('left')) return;
218
+ table.moveFocus('left');
219
+ return;
220
+ case 'ArrowRight':
221
+ event.preventDefault();
222
+ if (moveFocusIntoResizeHandle('right')) return;
223
+ table.moveFocus('right');
224
+ return;
225
+ case 'Home':
226
+ event.preventDefault();
227
+ table.moveToRowStart();
228
+ return;
229
+ case 'End':
230
+ event.preventDefault();
231
+ table.moveToRowEnd();
232
+ return;
233
+ }
234
+ }
235
+ </script>
236
+
237
+ <th
238
+ bind:this={element}
239
+ role="columnheader"
240
+ class={className}
241
+ tabindex={headerTabIndex}
242
+ aria-colindex={!isHidden && visibleColumnIndex >= 0 ? visibleColumnIndex + 1 : undefined}
243
+ aria-hidden={isHidden ? true : undefined}
244
+ aria-sort={isSortable ? (sortDirection ?? 'none') : undefined}
245
+ data-focused={isFocused ? 'true' : undefined}
246
+ data-focus-visible={isFocusVisible ? 'true' : undefined}
247
+ data-focus-within={isFocusWithin ? 'true' : undefined}
248
+ data-focus-visible-within={isFocusVisibleWithin ? 'true' : undefined}
249
+ data-sortable={isSortable || undefined}
250
+ data-sort-direction={sortDirection}
251
+ data-column-index={visibleColumnIndex >= 0 ? visibleColumnIndex : undefined}
252
+ style:box-sizing="border-box"
253
+ style:position="relative"
254
+ style:overflow="visible"
255
+ style:width={columnWidthStyle}
256
+ style:min-width={columnMinWidth !== undefined ? `${columnMinWidth}px` : undefined}
257
+ style:max-width={columnMaxWidth !== undefined ? `${columnMaxWidth}px` : undefined}
258
+ style:display={isHidden ? 'none' : 'table-cell'}
259
+ onfocusin={handleFocusIn}
260
+ onfocusout={handleFocusOut}
261
+ onfocus={handleFocus}
262
+ onblur={handleBlur}
263
+ onclick={handleClick}
264
+ onmousedown={handleMouseDown}
265
+ onkeydown={handleKeyDown}
266
+ {...restProps}
267
+ >
268
+ {#if children}
269
+ {@render children()}
270
+ {/if}
271
+ </th>
@@ -0,0 +1,4 @@
1
+ import type { TableColumnHeaderCellProps } from '../types.js';
2
+ declare const TableColumnHeaderCell: import("svelte").Component<TableColumnHeaderCellProps, {}, "">;
3
+ type TableColumnHeaderCell = ReturnType<typeof TableColumnHeaderCell>;
4
+ export default TableColumnHeaderCell;
@@ -0,0 +1,33 @@
1
+ <!-- markdownlint-disable MD024 MD060 -->
2
+
3
+ # Table.ColumnResizer
4
+
5
+ ## API reference
6
+
7
+ ### Table.ColumnResizer
8
+
9
+ Name: `Table.ColumnResizer`
10
+ Description: Interactive resize handle for the current `Table.Column`. It must be composed inside `Table.ColumnHeaderCell`, and it resizes the column that owns the surrounding `Table.Column` context.
11
+
12
+ Public prop type: `TableColumnResizerProps`
13
+
14
+ | Prop | Type | Default | Description |
15
+ | ----------- | --------- | ----------- | -------------------------------------------------------------------- |
16
+ | `step` | `number` | `16` | Keyboard resize delta in px for `ArrowLeft` / `ArrowRight`. |
17
+ | `shiftStep` | `number` | `48` | Larger keyboard resize delta in px for `Shift+ArrowLeft/ArrowRight`. |
18
+ | `class` | `string` | `''` | Class names for the resize handle element. |
19
+ | `children` | `Snippet` | `undefined` | Optional custom resize affordance content. |
20
+
21
+ ## Usage notes
22
+
23
+ - `Table.ColumnResizer` must be used inside `Table.ColumnHeaderCell`.
24
+ - Rendering `Table.ColumnResizer` inside `Table.ColumnHeaderCell` is enough to make the owning `Table.Column` resizable.
25
+ - The handle resolves the active column from `Table.Column` context. It does not accept a separate `columnId` prop.
26
+ - Width state lives in `Table.Root` through `columnWidths` / `defaultColumnWidths`.
27
+ - Pointer resizing uses Pointer Events, so mouse, touch, and pen interactions share the same behavior.
28
+ - Keyboard resizing uses an explicit resize mode: focus the handle, press `Enter` to capture resize, use `ArrowLeft` / `ArrowRight` (plus `Shift`) to adjust the width, `Home` to jump to the minimum width, and `End` to auto-fit the column to its content width, then press `Enter` again to commit the width and keep focus on the handle.
29
+ - While keyboard resize mode is active, pressing `Escape` restores the starting width, exits resize mode, and returns focus to the owning header cell.
30
+ - Keyboard resizing uses the same resize lifecycle callbacks as pointer resizing and announces committed widths through a polite live region.
31
+ - During pointer drag, pressing `Escape` restores the starting width and cancels the resize interaction.
32
+ - Double-click still auto-fits the column to its content width.
33
+ - In RTL layouts, `ArrowLeft` and `ArrowRight` are inverted so the logical resize direction matches the visual layout.
@@ -0,0 +1,57 @@
1
+ <script lang="ts">
2
+ import { Table } from '../index';
3
+ import type { TableColumnWidth } from '../root/context';
4
+
5
+ let currentColumnWidths = $state<Map<string, TableColumnWidth>>(new Map());
6
+ </script>
7
+
8
+ <Table.Root aria-label="Fixed width table" bind:columnWidths={currentColumnWidths}>
9
+ <Table.Header>
10
+ <Table.Row>
11
+ <Table.Column
12
+ id="email"
13
+ isRowHeader
14
+ textValue="Email"
15
+ width={220}
16
+ minWidth={220}
17
+ maxWidth={220}
18
+ >
19
+ <Table.ColumnHeaderCell>
20
+ <div class="flex items-center justify-between gap-3">
21
+ <span>Email</span>
22
+ <Table.ColumnResizer
23
+ data-testid="fixed-email-resizer"
24
+ class="inline-flex w-3 cursor-col-resize justify-center"
25
+ />
26
+ </div>
27
+ </Table.ColumnHeaderCell>
28
+ </Table.Column>
29
+ <Table.Column id="role" textValue="Role" defaultWidth={180} minWidth={120}>
30
+ <Table.ColumnHeaderCell>
31
+ <div class="flex items-center justify-between gap-3">
32
+ <span>Role</span>
33
+ <Table.ColumnResizer
34
+ data-testid="role-resizer"
35
+ class="inline-flex w-3 cursor-col-resize justify-center"
36
+ />
37
+ </div>
38
+ </Table.ColumnHeaderCell>
39
+ </Table.Column>
40
+ </Table.Row>
41
+ </Table.Header>
42
+
43
+ <Table.Body>
44
+ <Table.Row id="danilo">
45
+ <Table.Cell>danilo.fernandez+workspace-owner@example.com</Table.Cell>
46
+ <Table.Cell>Developer</Table.Cell>
47
+ </Table.Row>
48
+ <Table.Row id="zahra">
49
+ <Table.Cell>zahra@example.com</Table.Cell>
50
+ <Table.Cell>Admin</Table.Cell>
51
+ </Table.Row>
52
+ </Table.Body>
53
+ </Table.Root>
54
+
55
+ <output data-testid="column-widths"
56
+ >{JSON.stringify(Object.fromEntries(currentColumnWidths))}</output
57
+ >
@@ -0,0 +1,3 @@
1
+ declare const TableColumnResizerFixedWidthTest: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type TableColumnResizerFixedWidthTest = ReturnType<typeof TableColumnResizerFixedWidthTest>;
3
+ export default TableColumnResizerFixedWidthTest;
@@ -0,0 +1,52 @@
1
+ <script lang="ts">
2
+ import { Table } from '../index';
3
+ import type { TableColumnWidth } from '../root/context';
4
+
5
+ let currentColumnWidths = $state<Map<string, TableColumnWidth> | undefined>(undefined);
6
+ </script>
7
+
8
+ <div style="width: 640px;">
9
+ <Table.Root
10
+ aria-label="Freeze layout table"
11
+ bind:columnWidths={currentColumnWidths}
12
+ class="min-w-full border-collapse text-left"
13
+ >
14
+ <Table.Header>
15
+ <Table.Row>
16
+ <Table.Column id="email" isRowHeader textValue="Email" minWidth={80}>
17
+ <Table.ColumnHeaderCell>
18
+ <div class="flex items-center justify-between gap-3">
19
+ <span>Email address</span>
20
+ <Table.ColumnResizer
21
+ data-testid="freeze-email-resizer"
22
+ class="inline-flex w-3 cursor-col-resize justify-center"
23
+ />
24
+ </div>
25
+ </Table.ColumnHeaderCell>
26
+ </Table.Column>
27
+ <Table.Column id="group" textValue="Group" minWidth={80}>
28
+ <Table.ColumnHeaderCell>
29
+ <div class="flex items-center justify-between gap-3">
30
+ <span>Group membership</span>
31
+ <Table.ColumnResizer
32
+ data-testid="freeze-group-resizer"
33
+ class="inline-flex w-3 cursor-col-resize justify-center"
34
+ />
35
+ </div>
36
+ </Table.ColumnHeaderCell>
37
+ </Table.Column>
38
+ </Table.Row>
39
+ </Table.Header>
40
+
41
+ <Table.Body>
42
+ <Table.Row id="danilo">
43
+ <Table.Cell>danilo@example.com</Table.Cell>
44
+ <Table.Cell>Developer relations</Table.Cell>
45
+ </Table.Row>
46
+ </Table.Body>
47
+ </Table.Root>
48
+ </div>
49
+
50
+ <output data-testid="freeze-column-widths"
51
+ >{JSON.stringify(Object.fromEntries(currentColumnWidths ?? new Map()))}</output
52
+ >
@@ -0,0 +1,3 @@
1
+ declare const TableColumnResizerFreezeLayoutTest: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type TableColumnResizerFreezeLayoutTest = ReturnType<typeof TableColumnResizerFreezeLayoutTest>;
3
+ export default TableColumnResizerFreezeLayoutTest;