@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,2111 @@
1
+ import { flushSync, getContext, setContext } from 'svelte';
2
+ import { writable } from 'svelte/store';
3
+ const TABLE_KEY = Symbol('table');
4
+ const TABLE_SECTION_KEY = Symbol('table-section');
5
+ const TABLE_ROW_KEY = Symbol('table-row');
6
+ const TABLE_COLUMN_KEY = Symbol('table-column');
7
+ const TABLE_CELL_KEY = Symbol('table-cell');
8
+ const IS_BROWSER = typeof window !== 'undefined';
9
+ export const DEFAULT_TABLE_COLUMN_MIN_WIDTH = 60;
10
+ export function distributeRoundedWidths(entries, targetTotal) {
11
+ let delta = targetTotal - entries.reduce((total, entry) => total + entry.width, 0);
12
+ if (delta === 0)
13
+ return entries;
14
+ const prioritizedEntries = [...entries].sort((left, right) => {
15
+ if (delta > 0) {
16
+ if (right.remainder !== left.remainder)
17
+ return right.remainder - left.remainder;
18
+ return right.index - left.index;
19
+ }
20
+ if (left.remainder !== right.remainder)
21
+ return left.remainder - right.remainder;
22
+ return left.index - right.index;
23
+ });
24
+ while (delta !== 0) {
25
+ let updated = false;
26
+ for (const entry of prioritizedEntries) {
27
+ if (delta > 0) {
28
+ if (entry.maxWidth !== undefined && entry.width >= entry.maxWidth)
29
+ continue;
30
+ entry.width += 1;
31
+ delta -= 1;
32
+ updated = true;
33
+ }
34
+ else {
35
+ if (entry.width <= entry.minWidth)
36
+ continue;
37
+ entry.width -= 1;
38
+ delta += 1;
39
+ updated = true;
40
+ }
41
+ if (delta === 0)
42
+ break;
43
+ }
44
+ if (!updated)
45
+ break;
46
+ }
47
+ return entries;
48
+ }
49
+ export function createTableContext(options = {}) {
50
+ let selectionMode = options.selectionMode ?? 'none';
51
+ let selectionBehavior = options.selectionBehavior ?? 'toggle';
52
+ let disabledBehavior = options.disabledBehavior ?? 'all';
53
+ let disallowEmptySelection = options.disallowEmptySelection ?? false;
54
+ let onRowAction = options.onRowAction;
55
+ let sortDescriptor = options.initialSortDescriptor;
56
+ let focusedCellKey = null;
57
+ let focusedRowTarget = null;
58
+ let focusVisible = false;
59
+ let selectedKeys = new Set(options.initialSelectedKeys ?? []);
60
+ let selectionAnchorKey = selectedKeys.values().next().value ?? null;
61
+ const disabledKeys = new Set(options.disabledKeys ?? []);
62
+ const hiddenColumnIds = new Set(options.initialHiddenColumns ?? []);
63
+ let resizingColumnId = null;
64
+ let resizeSession = null;
65
+ let suppressNextHeaderClick = false;
66
+ const columns = new Map();
67
+ const columnIds = new Map();
68
+ const columnOrder = [];
69
+ const columnsWithSortTriggers = new Set();
70
+ const columnsWithResizers = new Set();
71
+ let resizerLayoutReady = false;
72
+ const columnWidths = new Map(options.initialColumnWidths ?? []);
73
+ const rows = new Map();
74
+ const headerRowOrder = [];
75
+ const bodyRowOrder = [];
76
+ let bodyRowsInitialized = false;
77
+ let selectableBodyRowCount = 0;
78
+ const cells = new Map();
79
+ const cellOrder = [];
80
+ let orderedRowTokensCache = {
81
+ header: null,
82
+ body: null
83
+ };
84
+ let orderedColumnTokensCache = null;
85
+ let visibleOrderedColumnTokensCache = null;
86
+ let columnWidthsCache = null;
87
+ let visibleColumnWidthsCache = null;
88
+ let resolvedVisibleColumnWidthsCache = null;
89
+ let navigableCellsCache = null;
90
+ let rowsWithCellsCache = null;
91
+ const layoutVersion = writable(0);
92
+ const selectionVersion = writable(0);
93
+ const focusVersion = writable(0);
94
+ const sortVersion = writable(0);
95
+ const widthVersion = writable(0);
96
+ const resizeVersion = writable(0);
97
+ const instanceCounters = new Map();
98
+ const selectionUnavailableDescriptionId = createInstanceToken('selection-unavailable');
99
+ setSelectedKeys(new Set(selectedKeys), selectionAnchorKey);
100
+ function createInstanceToken(prefix) {
101
+ const nextCount = (instanceCounters.get(prefix) ?? 0) + 1;
102
+ instanceCounters.set(prefix, nextCount);
103
+ return `table-${prefix}-${nextCount}`;
104
+ }
105
+ function invalidateLayoutCaches() {
106
+ orderedRowTokensCache = { header: null, body: null };
107
+ orderedColumnTokensCache = null;
108
+ visibleOrderedColumnTokensCache = null;
109
+ columnWidthsCache = null;
110
+ visibleColumnWidthsCache = null;
111
+ resolvedVisibleColumnWidthsCache = null;
112
+ navigableCellsCache = null;
113
+ rowsWithCellsCache = null;
114
+ }
115
+ let layoutNotifyScheduled = false;
116
+ let selectionNotifyScheduled = false;
117
+ let widthNotifyScheduled = false;
118
+ function syncResizerLayoutReady(nextReady) {
119
+ if (resizerLayoutReady === nextReady)
120
+ return;
121
+ resizerLayoutReady = nextReady;
122
+ invalidateLayoutCaches();
123
+ layoutVersion.update((value) => value + 1);
124
+ notifyWidth();
125
+ }
126
+ function notifyLayout() {
127
+ invalidateLayoutCaches();
128
+ if (!layoutNotifyScheduled) {
129
+ layoutNotifyScheduled = true;
130
+ queueMicrotask(() => {
131
+ layoutNotifyScheduled = false;
132
+ layoutVersion.update((value) => value + 1);
133
+ });
134
+ }
135
+ }
136
+ function notifySelection() {
137
+ if (!selectionNotifyScheduled) {
138
+ selectionNotifyScheduled = true;
139
+ queueMicrotask(() => {
140
+ selectionNotifyScheduled = false;
141
+ selectionVersion.update((value) => value + 1);
142
+ });
143
+ }
144
+ }
145
+ function notifyFocus() {
146
+ focusVersion.update((value) => value + 1);
147
+ }
148
+ function notifySort() {
149
+ invalidateLayoutCaches();
150
+ sortVersion.update((value) => value + 1);
151
+ }
152
+ function notifyWidth() {
153
+ columnWidthsCache = null;
154
+ visibleColumnWidthsCache = null;
155
+ resolvedVisibleColumnWidthsCache = null;
156
+ if (!widthNotifyScheduled) {
157
+ widthNotifyScheduled = true;
158
+ queueMicrotask(() => {
159
+ widthNotifyScheduled = false;
160
+ widthVersion.update((value) => value + 1);
161
+ });
162
+ }
163
+ }
164
+ function notifyWidthImmediately() {
165
+ columnWidthsCache = null;
166
+ visibleColumnWidthsCache = null;
167
+ resolvedVisibleColumnWidthsCache = null;
168
+ flushSync(() => {
169
+ widthVersion.update((value) => value + 1);
170
+ });
171
+ }
172
+ function refreshMeasuredLayout() {
173
+ notifyWidthImmediately();
174
+ }
175
+ function notifyResize() {
176
+ resizeVersion.update((value) => value + 1);
177
+ }
178
+ function parseColumnWidth(width) {
179
+ if (typeof width === 'number') {
180
+ return Number.isFinite(width) ? { unit: 'px', value: width } : undefined;
181
+ }
182
+ if (typeof width === 'string') {
183
+ const match = width.trim().match(/^(\d+(?:\.\d+)?)(px|%|fr)$/i);
184
+ if (!match)
185
+ return undefined;
186
+ const next = Number(match[1]);
187
+ if (!Number.isFinite(next))
188
+ return undefined;
189
+ const unit = match[2].toLowerCase();
190
+ return { unit, value: next };
191
+ }
192
+ return undefined;
193
+ }
194
+ function normalizeColumnWidth(width) {
195
+ const parsed = parseColumnWidth(width);
196
+ if (!parsed)
197
+ return undefined;
198
+ if (parsed.unit === 'px') {
199
+ return typeof width === 'number' ? width : `${parsed.value}px`;
200
+ }
201
+ if (parsed.unit === '%') {
202
+ return `${parsed.value}%`;
203
+ }
204
+ return `${parsed.value}fr`;
205
+ }
206
+ function isRelativeColumnWidth(width) {
207
+ const parsed = parseColumnWidth(width);
208
+ return parsed ? parsed.unit !== 'px' : false;
209
+ }
210
+ function getColumnRegistrationById(columnId) {
211
+ const token = columnIds.get(columnId);
212
+ return token ? columns.get(token) : undefined;
213
+ }
214
+ function isColumnHidden(columnId) {
215
+ return hiddenColumnIds.has(columnId);
216
+ }
217
+ function getColumnMinWidth(columnId) {
218
+ const registration = getColumnRegistrationById(columnId);
219
+ if (!registration)
220
+ return undefined;
221
+ if (registration.minWidth !== undefined)
222
+ return registration.minWidth;
223
+ if (!isColumnResizable(columnId) &&
224
+ !isRelativeColumnWidth(getEffectiveColumnWidthSpec(columnId))) {
225
+ return undefined;
226
+ }
227
+ return getColumnWidthBounds(columnId).minWidth;
228
+ }
229
+ function getColumnMaxWidth(columnId) {
230
+ return getColumnRegistrationById(columnId)?.maxWidth;
231
+ }
232
+ function getFixedColumnWidthSpec(columnId) {
233
+ return normalizeColumnWidth(getColumnRegistrationById(columnId)?.width);
234
+ }
235
+ function getManagedColumnWidthSpec(columnId) {
236
+ return normalizeColumnWidth(columnWidths.get(columnId));
237
+ }
238
+ function getDefaultColumnWidthSpec(columnId) {
239
+ return normalizeColumnWidth(getColumnRegistrationById(columnId)?.defaultWidth);
240
+ }
241
+ function hasAuthoredColumnWidthSpec(columnId) {
242
+ return (getFixedColumnWidthSpec(columnId) !== undefined ||
243
+ getManagedColumnWidthSpec(columnId) !== undefined ||
244
+ getDefaultColumnWidthSpec(columnId) !== undefined);
245
+ }
246
+ function getEffectiveColumnWidthSpec(columnId) {
247
+ const fixedWidth = getFixedColumnWidthSpec(columnId);
248
+ if (fixedWidth !== undefined) {
249
+ return fixedWidth;
250
+ }
251
+ const managedWidth = getManagedColumnWidthSpec(columnId);
252
+ if (managedWidth !== undefined) {
253
+ return managedWidth;
254
+ }
255
+ const defaultWidth = getDefaultColumnWidthSpec(columnId);
256
+ if (defaultWidth !== undefined) {
257
+ return defaultWidth;
258
+ }
259
+ return resizerLayoutReady && columnsWithResizers.size > 0 ? '1fr' : undefined;
260
+ }
261
+ function getMeasuredTableWidth() {
262
+ const tableCell = Array.from(cells.values()).find((cell) => cell.element)?.element;
263
+ const tableElement = tableCell?.closest('table');
264
+ const tableWidth = tableElement?.getBoundingClientRect().width;
265
+ const containerElement = tableElement?.parentElement;
266
+ const containerClientWidth = containerElement?.clientWidth;
267
+ const containerStyle = containerElement ? getComputedStyle(containerElement) : undefined;
268
+ const containerPaddingLeft = Number.parseFloat(containerStyle?.paddingLeft ?? '0');
269
+ const containerPaddingRight = Number.parseFloat(containerStyle?.paddingRight ?? '0');
270
+ const containerWidth = containerClientWidth !== undefined && Number.isFinite(containerClientWidth)
271
+ ? containerClientWidth - containerPaddingLeft - containerPaddingRight
272
+ : undefined;
273
+ // Use the container width as the stable reference for fr/% resolution.
274
+ // Using Math.max(table, container) causes a feedback loop during resize:
275
+ // the table grows → measurement returns more → fr columns get more space →
276
+ // the table grows further. The container width is stable and represents
277
+ // the actual available space the table should fill.
278
+ const width = containerWidth ?? tableWidth;
279
+ if (width === undefined || width <= 0 || !Number.isFinite(width)) {
280
+ return undefined;
281
+ }
282
+ return Math.round(width);
283
+ }
284
+ function getColumnWidthBounds(columnId) {
285
+ const registration = getColumnRegistrationById(columnId);
286
+ const fixedWidth = parseColumnWidth(registration?.width);
287
+ const minWidth = registration?.minWidth ??
288
+ (fixedWidth?.unit === 'px'
289
+ ? Math.min(fixedWidth.value, DEFAULT_TABLE_COLUMN_MIN_WIDTH)
290
+ : DEFAULT_TABLE_COLUMN_MIN_WIDTH);
291
+ return {
292
+ minWidth,
293
+ maxWidth: registration?.maxWidth
294
+ };
295
+ }
296
+ function clampColumnWidth(columnId, width) {
297
+ const { minWidth, maxWidth } = getColumnWidthBounds(columnId);
298
+ let next = Math.round(width);
299
+ if (Number.isNaN(next) || !Number.isFinite(next)) {
300
+ next = minWidth;
301
+ }
302
+ next = Math.max(minWidth, next);
303
+ if (maxWidth !== undefined) {
304
+ next = Math.min(maxWidth, next);
305
+ }
306
+ return next;
307
+ }
308
+ function resolveRelativeColumnWidthAllocations(entries, targetTotal) {
309
+ const allocations = entries.map((entry) => {
310
+ const { minWidth, maxWidth } = getColumnWidthBounds(entry.columnId);
311
+ return {
312
+ ...entry,
313
+ width: clampColumnWidth(entry.columnId, entry.exactWidth),
314
+ minWidth,
315
+ maxWidth,
316
+ remainder: entry.exactWidth - Math.floor(entry.exactWidth)
317
+ };
318
+ });
319
+ return distributeRoundedWidths(allocations, targetTotal);
320
+ }
321
+ function hasResizableColumns() {
322
+ for (const column of columns.values()) {
323
+ if (isColumnResizable(column.id))
324
+ return true;
325
+ }
326
+ return false;
327
+ }
328
+ function registerColumnResizer(columnToken) {
329
+ if (columnsWithResizers.has(columnToken))
330
+ return;
331
+ columnsWithResizers.add(columnToken);
332
+ if (IS_BROWSER) {
333
+ syncResizerLayoutReady(true);
334
+ return;
335
+ }
336
+ resizerLayoutReady = false;
337
+ invalidateLayoutCaches();
338
+ layoutVersion.update((value) => value + 1);
339
+ notifyWidth();
340
+ }
341
+ function unregisterColumnResizer(columnToken) {
342
+ if (!columnsWithResizers.delete(columnToken))
343
+ return;
344
+ if (IS_BROWSER) {
345
+ syncResizerLayoutReady(columnsWithResizers.size > 0);
346
+ return;
347
+ }
348
+ resizerLayoutReady = false;
349
+ invalidateLayoutCaches();
350
+ layoutVersion.update((value) => value + 1);
351
+ notifyWidth();
352
+ }
353
+ function sameColumnMetadata(left, right) {
354
+ return (left.token === right.token &&
355
+ left.id === right.id &&
356
+ left.isRowHeader === right.isRowHeader &&
357
+ left.textValue === right.textValue &&
358
+ left.width === right.width &&
359
+ left.defaultWidth === right.defaultWidth &&
360
+ left.minWidth === right.minWidth &&
361
+ left.maxWidth === right.maxWidth);
362
+ }
363
+ function sameRowRegistration(left, right) {
364
+ return (left.token === right.token &&
365
+ left.section === right.section &&
366
+ left.id === right.id &&
367
+ left.disabled === right.disabled &&
368
+ left.element === right.element);
369
+ }
370
+ function sameCellRegistration(left, right) {
371
+ return (left.key === right.key &&
372
+ left.rowToken === right.rowToken &&
373
+ left.section === right.section &&
374
+ left.columnIndex === right.columnIndex &&
375
+ left.columnToken === right.columnToken &&
376
+ left.element === right.element &&
377
+ left.focusDelegate === right.focusDelegate);
378
+ }
379
+ function registerColumn(column) {
380
+ const existing = columns.get(column.token);
381
+ const alreadyOrdered = columnOrder.includes(column.token);
382
+ if (existing && sameColumnMetadata(existing, column) && alreadyOrdered)
383
+ return;
384
+ if (existing && existing.id !== column.id && columnIds.get(existing.id) === column.token) {
385
+ columnIds.delete(existing.id);
386
+ }
387
+ columns.set(column.token, column);
388
+ columnIds.set(column.id, column.token);
389
+ if (!alreadyOrdered) {
390
+ columnOrder.push(column.token);
391
+ }
392
+ notifyLayout();
393
+ }
394
+ function unregisterColumn(token) {
395
+ const column = columns.get(token);
396
+ if (column && columnIds.get(column.id) === token) {
397
+ columnIds.delete(column.id);
398
+ }
399
+ columns.delete(token);
400
+ columnsWithSortTriggers.delete(token);
401
+ columnsWithResizers.delete(token);
402
+ const index = columnOrder.indexOf(token);
403
+ if (index >= 0) {
404
+ columnOrder.splice(index, 1);
405
+ }
406
+ notifyLayout();
407
+ }
408
+ function registerColumnSortTrigger(columnToken) {
409
+ if (columnsWithSortTriggers.has(columnToken))
410
+ return;
411
+ columnsWithSortTriggers.add(columnToken);
412
+ notifyLayout();
413
+ }
414
+ function unregisterColumnSortTrigger(columnToken) {
415
+ if (!columnsWithSortTriggers.delete(columnToken))
416
+ return;
417
+ notifyLayout();
418
+ }
419
+ function getOrderedColumnTokens() {
420
+ if (orderedColumnTokensCache)
421
+ return orderedColumnTokensCache;
422
+ // Pre-build a lookup from columnToken → header cell element to avoid
423
+ // O(columns × cells) scanning inside the comparator.
424
+ const headerElementByToken = new Map();
425
+ for (const cell of cells.values()) {
426
+ if (cell.section === 'header' && cell.columnToken && cell.element) {
427
+ headerElementByToken.set(cell.columnToken, cell.element);
428
+ }
429
+ }
430
+ orderedColumnTokensCache = [...columnOrder].sort((leftToken, rightToken) => {
431
+ const leftCell = headerElementByToken.get(leftToken);
432
+ const rightCell = headerElementByToken.get(rightToken);
433
+ if (!leftCell || !rightCell) {
434
+ return columnOrder.indexOf(leftToken) - columnOrder.indexOf(rightToken);
435
+ }
436
+ if (leftCell === rightCell)
437
+ return 0;
438
+ const position = leftCell.compareDocumentPosition(rightCell);
439
+ if (position & Node.DOCUMENT_POSITION_FOLLOWING)
440
+ return -1;
441
+ if (position & Node.DOCUMENT_POSITION_PRECEDING)
442
+ return 1;
443
+ return columnOrder.indexOf(leftToken) - columnOrder.indexOf(rightToken);
444
+ });
445
+ return orderedColumnTokensCache;
446
+ }
447
+ function getColumnCount() {
448
+ return getOrderedColumnTokens().length;
449
+ }
450
+ function getVisibleOrderedColumnTokens() {
451
+ if (visibleOrderedColumnTokensCache)
452
+ return visibleOrderedColumnTokensCache;
453
+ visibleOrderedColumnTokensCache = getOrderedColumnTokens().filter((token) => {
454
+ const column = columns.get(token);
455
+ return column ? !isColumnHidden(column.id) : false;
456
+ });
457
+ return visibleOrderedColumnTokensCache;
458
+ }
459
+ function getVisibleColumnCount() {
460
+ return getVisibleOrderedColumnTokens().length;
461
+ }
462
+ function getColumnAt(index) {
463
+ const token = getOrderedColumnTokens()[index];
464
+ return token ? columns.get(token) : undefined;
465
+ }
466
+ function getColumnIndexByToken(token) {
467
+ return getOrderedColumnTokens().indexOf(token);
468
+ }
469
+ function getVisibleColumnIndexByToken(token) {
470
+ return getVisibleOrderedColumnTokens().indexOf(token);
471
+ }
472
+ function getColumnTextValue(columnId) {
473
+ return getColumnRegistrationById(columnId)?.textValue;
474
+ }
475
+ function getColumnWidth(columnId) {
476
+ const parsed = parseColumnWidth(getEffectiveColumnWidthSpec(columnId));
477
+ if (!parsed)
478
+ return undefined;
479
+ if (!isColumnHidden(columnId)) {
480
+ if (parsed.unit !== 'px') {
481
+ return undefined;
482
+ }
483
+ return getResolvedVisibleColumnWidths().get(columnId);
484
+ }
485
+ return parsed?.unit === 'px' ? clampColumnWidth(columnId, parsed.value) : undefined;
486
+ }
487
+ function formatCssLength(length) {
488
+ const rounded = Math.round(length * 1000) / 1000;
489
+ return Number.isInteger(rounded) ? `${rounded}` : `${rounded}`;
490
+ }
491
+ function getColumnWidthStyle(columnId) {
492
+ const resolvedWidth = getColumnWidth(columnId);
493
+ if (resolvedWidth !== undefined) {
494
+ return `${resolvedWidth}px`;
495
+ }
496
+ const parsed = parseColumnWidth(getEffectiveColumnWidthSpec(columnId));
497
+ if (!parsed)
498
+ return undefined;
499
+ if (parsed.unit === 'px') {
500
+ return `${clampColumnWidth(columnId, parsed.value)}px`;
501
+ }
502
+ if (parsed.unit === '%') {
503
+ return `${parsed.value}%`;
504
+ }
505
+ let fixedPxTotal = 0;
506
+ let percentTotal = 0;
507
+ let totalFr = 0;
508
+ const resolvedVisibleWidths = getResolvedVisibleColumnWidths();
509
+ const tableWidth = getMeasuredTableWidth();
510
+ for (const token of getVisibleOrderedColumnTokens()) {
511
+ const column = columns.get(token);
512
+ if (!column)
513
+ continue;
514
+ const spec = parseColumnWidth(getEffectiveColumnWidthSpec(column.id));
515
+ if (!spec)
516
+ continue;
517
+ if (spec.unit === 'px') {
518
+ fixedPxTotal += clampColumnWidth(column.id, spec.value);
519
+ continue;
520
+ }
521
+ if (spec.unit === '%') {
522
+ percentTotal += spec.value;
523
+ continue;
524
+ }
525
+ totalFr += spec.value;
526
+ }
527
+ if (totalFr <= 0)
528
+ return undefined;
529
+ const frShare = parsed.value / totalFr;
530
+ const availableWidthTerms = ['100%'];
531
+ if (fixedPxTotal > 0) {
532
+ availableWidthTerms.push(`${formatCssLength(fixedPxTotal)}px`);
533
+ }
534
+ if (percentTotal > 0) {
535
+ availableWidthTerms.push(`${formatCssLength(percentTotal)}%`);
536
+ }
537
+ const availableWidthExpression = availableWidthTerms.length === 1
538
+ ? availableWidthTerms[0]
539
+ : `(${availableWidthTerms.join(' - ')})`;
540
+ if (tableWidth !== undefined) {
541
+ const targetRelativeTotal = Math.max(tableWidth - fixedPxTotal, 0);
542
+ let actualRelativeTotal = 0;
543
+ for (const token of getVisibleOrderedColumnTokens()) {
544
+ const column = columns.get(token);
545
+ if (!column)
546
+ continue;
547
+ const spec = parseColumnWidth(getEffectiveColumnWidthSpec(column.id));
548
+ if (!spec || spec.unit === 'px')
549
+ continue;
550
+ actualRelativeTotal += resolvedVisibleWidths.get(column.id) ?? 0;
551
+ }
552
+ if (Math.abs(actualRelativeTotal - targetRelativeTotal) > 1) {
553
+ const constrainedWidth = resolvedVisibleWidths.get(columnId);
554
+ if (constrainedWidth !== undefined) {
555
+ return `${constrainedWidth}px`;
556
+ }
557
+ }
558
+ }
559
+ if (frShare === 1) {
560
+ return `calc(${availableWidthExpression})`;
561
+ }
562
+ return `calc(${availableWidthExpression} * ${formatCssLength(frShare)})`;
563
+ }
564
+ function isColumnResizable(columnId) {
565
+ const column = getColumnRegistrationById(columnId);
566
+ if (!column)
567
+ return false;
568
+ if (isColumnHidden(columnId))
569
+ return false;
570
+ return columnsWithResizers.has(column.token);
571
+ }
572
+ function getColumnWidths() {
573
+ if (columnWidthsCache)
574
+ return columnWidthsCache;
575
+ const widths = new Map();
576
+ for (const token of getOrderedColumnTokens()) {
577
+ const column = columns.get(token);
578
+ if (!column)
579
+ continue;
580
+ const width = getManagedColumnWidthSpec(column.id);
581
+ if (width !== undefined) {
582
+ widths.set(column.id, width);
583
+ }
584
+ }
585
+ columnWidthsCache = widths;
586
+ return widths;
587
+ }
588
+ function getVisibleColumnWidths() {
589
+ if (visibleColumnWidthsCache)
590
+ return visibleColumnWidthsCache;
591
+ const widths = new Map();
592
+ for (const [columnId, width] of getColumnWidths()) {
593
+ if (isColumnHidden(columnId))
594
+ continue;
595
+ widths.set(columnId, width);
596
+ }
597
+ visibleColumnWidthsCache = widths;
598
+ return widths;
599
+ }
600
+ function hasRelativeVisibleColumnWidths() {
601
+ for (const token of getVisibleOrderedColumnTokens()) {
602
+ const column = columns.get(token);
603
+ if (!column)
604
+ continue;
605
+ if (isRelativeColumnWidth(getEffectiveColumnWidthSpec(column.id))) {
606
+ return true;
607
+ }
608
+ }
609
+ return false;
610
+ }
611
+ function getResolvedVisibleColumnWidths() {
612
+ if (resolvedVisibleColumnWidthsCache)
613
+ return resolvedVisibleColumnWidthsCache;
614
+ const widths = new Map();
615
+ const flexibleColumns = [];
616
+ const relativeColumns = [];
617
+ const tableWidth = getMeasuredTableWidth();
618
+ let fixedWidthTotal = 0;
619
+ let exactRelativeWidthTotal = 0;
620
+ let totalFr = 0;
621
+ for (const [index, token] of getVisibleOrderedColumnTokens().entries()) {
622
+ const column = columns.get(token);
623
+ if (!column)
624
+ continue;
625
+ const parsed = parseColumnWidth(getEffectiveColumnWidthSpec(column.id));
626
+ if (!parsed)
627
+ continue;
628
+ if (parsed.unit === 'px') {
629
+ const nextWidth = clampColumnWidth(column.id, parsed.value);
630
+ widths.set(column.id, nextWidth);
631
+ fixedWidthTotal += nextWidth;
632
+ continue;
633
+ }
634
+ if (parsed.unit === '%') {
635
+ if (tableWidth === undefined)
636
+ continue;
637
+ const exactWidth = (tableWidth * parsed.value) / 100;
638
+ relativeColumns.push({ columnId: column.id, index, exactWidth });
639
+ exactRelativeWidthTotal += exactWidth;
640
+ continue;
641
+ }
642
+ flexibleColumns.push({ columnId: column.id, fr: parsed.value, index });
643
+ totalFr += parsed.value;
644
+ }
645
+ if (tableWidth !== undefined && flexibleColumns.length > 0 && totalFr > 0) {
646
+ const distributableWidth = Math.max(tableWidth - fixedWidthTotal - exactRelativeWidthTotal, 0);
647
+ for (const entry of flexibleColumns) {
648
+ relativeColumns.push({
649
+ columnId: entry.columnId,
650
+ index: entry.index,
651
+ exactWidth: (distributableWidth * entry.fr) / totalFr
652
+ });
653
+ }
654
+ }
655
+ if (tableWidth !== undefined && relativeColumns.length > 0) {
656
+ const targetRelativeTotal = Math.max(tableWidth - fixedWidthTotal, 0);
657
+ for (const entry of resolveRelativeColumnWidthAllocations(relativeColumns, targetRelativeTotal)) {
658
+ widths.set(entry.columnId, entry.width);
659
+ }
660
+ }
661
+ resolvedVisibleColumnWidthsCache = widths;
662
+ return widths;
663
+ }
664
+ function getMeasuredHeaderWidth(columnToken) {
665
+ const headerCell = Array.from(cells.values()).find((cell) => cell.section === 'header' && cell.columnToken === columnToken && cell.element);
666
+ const width = headerCell?.element?.getBoundingClientRect().width;
667
+ if (width === undefined || width <= 0 || !Number.isFinite(width)) {
668
+ return undefined;
669
+ }
670
+ return Math.round(width);
671
+ }
672
+ function getFixedVisibleColumnWidthTotal() {
673
+ let total = 0;
674
+ for (const token of getVisibleOrderedColumnTokens()) {
675
+ const column = columns.get(token);
676
+ if (!column)
677
+ continue;
678
+ if (getFixedColumnWidthSpec(column.id) === undefined)
679
+ continue;
680
+ const measuredWidth = getMeasuredHeaderWidth(token);
681
+ const resolvedWidth = getColumnWidth(column.id) ?? measuredWidth;
682
+ if (resolvedWidth === undefined)
683
+ continue;
684
+ total += clampColumnWidth(column.id, resolvedWidth);
685
+ }
686
+ return total;
687
+ }
688
+ function getResizableRelativeTailColumnId(activeColumnId) {
689
+ return getVisibleOrderedColumnTokens()
690
+ .map((token) => columns.get(token))
691
+ .filter((column) => !!column)
692
+ .filter((column) => {
693
+ if (column.id === activeColumnId)
694
+ return false;
695
+ if (getFixedColumnWidthSpec(column.id) !== undefined)
696
+ return false;
697
+ return isRelativeColumnWidth(getEffectiveColumnWidthSpec(column.id));
698
+ })
699
+ .at(-1)?.id;
700
+ }
701
+ function prepareColumnWidthsForResize(activeColumnId) {
702
+ const next = new Map(columnWidths);
703
+ const baselineWidths = new Map();
704
+ const preservedFlexibleColumnId = getResizableRelativeTailColumnId(activeColumnId);
705
+ const preservedFlexibleEffectiveWidth = preservedFlexibleColumnId
706
+ ? normalizeColumnWidth(getEffectiveColumnWidthSpec(preservedFlexibleColumnId))
707
+ : undefined;
708
+ const measuredTableWidth = getMeasuredTableWidth();
709
+ const fixedVisibleColumnWidthTotal = getFixedVisibleColumnWidthTotal();
710
+ for (const token of getVisibleOrderedColumnTokens()) {
711
+ const column = columns.get(token);
712
+ if (!column)
713
+ continue;
714
+ if (getFixedColumnWidthSpec(column.id) !== undefined)
715
+ continue;
716
+ const measuredWidth = getMeasuredHeaderWidth(token);
717
+ const resolvedWidth = getColumnWidth(column.id) ?? measuredWidth;
718
+ if (resolvedWidth === undefined)
719
+ continue;
720
+ const frozenWidth = clampColumnWidth(column.id, resolvedWidth);
721
+ next.set(column.id, frozenWidth);
722
+ baselineWidths.set(column.id, frozenWidth);
723
+ }
724
+ let changed = next.size !== columnWidths.size;
725
+ if (!changed) {
726
+ for (const [columnId, width] of next) {
727
+ if (columnWidths.get(columnId) !== width) {
728
+ changed = true;
729
+ break;
730
+ }
731
+ }
732
+ }
733
+ if (!changed)
734
+ return;
735
+ columnWidths.clear();
736
+ for (const [columnId, width] of next) {
737
+ columnWidths.set(columnId, width);
738
+ }
739
+ columnWidthsCache = null;
740
+ visibleColumnWidthsCache = null;
741
+ const baselineTotalWidth = Array.from(baselineWidths.values()).reduce((total, current) => total + current, 0);
742
+ resizeSession = {
743
+ activeColumnId: activeColumnId,
744
+ flexibleTailColumnId: preservedFlexibleColumnId,
745
+ flexibleTailRestoreWidth: preservedFlexibleColumnId && isRelativeColumnWidth(preservedFlexibleEffectiveWidth)
746
+ ? preservedFlexibleEffectiveWidth
747
+ : undefined,
748
+ baselineWidths,
749
+ baselineAvailableTableWidth: measuredTableWidth !== undefined
750
+ ? Math.max(measuredTableWidth - fixedVisibleColumnWidthTotal, 0)
751
+ : baselineTotalWidth,
752
+ baselineTotalWidth
753
+ };
754
+ options.onColumnWidthsChange?.(getColumnWidths());
755
+ notifyWidth();
756
+ }
757
+ function shouldPrepareColumnWidthsForResize(columnId) {
758
+ if (getFixedColumnWidthSpec(columnId) !== undefined)
759
+ return false;
760
+ if (!hasRelativeVisibleColumnWidths())
761
+ return false;
762
+ return resizeSession?.activeColumnId !== columnId;
763
+ }
764
+ function setColumnWidths(widths) {
765
+ const next = new Map();
766
+ const incomingWidths = widths ? new Map(widths) : undefined;
767
+ for (const token of columnOrder) {
768
+ const column = columns.get(token);
769
+ if (!column)
770
+ continue;
771
+ if (getFixedColumnWidthSpec(column.id) !== undefined)
772
+ continue;
773
+ const incomingWidth = normalizeColumnWidth(incomingWidths?.get(column.id));
774
+ if (incomingWidth !== undefined) {
775
+ next.set(column.id, incomingWidth);
776
+ }
777
+ }
778
+ columnWidths.clear();
779
+ for (const [columnId, width] of next) {
780
+ columnWidths.set(columnId, width);
781
+ }
782
+ notifyWidth();
783
+ }
784
+ function setColumnWidth(columnId, width) {
785
+ if (getFixedColumnWidthSpec(columnId) !== undefined)
786
+ return;
787
+ if (!isColumnResizable(columnId))
788
+ return;
789
+ if (shouldPrepareColumnWidthsForResize(columnId)) {
790
+ prepareColumnWidthsForResize(columnId);
791
+ }
792
+ const nextWidth = clampColumnWidth(columnId, width);
793
+ const currentWidth = columnWidths.get(columnId);
794
+ if (resizeSession?.activeColumnId === columnId &&
795
+ resizeSession.flexibleTailColumnId !== undefined) {
796
+ const baselineActiveWidth = resizeSession.baselineWidths.get(columnId);
797
+ const baselineTailWidth = resizeSession.baselineWidths.get(resizeSession.flexibleTailColumnId);
798
+ if (baselineActiveWidth !== undefined && baselineTailWidth !== undefined) {
799
+ const widthDelta = nextWidth - baselineActiveWidth;
800
+ const overflowWidth = Math.max(resizeSession.baselineTotalWidth - resizeSession.baselineAvailableTableWidth, 0);
801
+ const tailTargetWidth = widthDelta >= 0
802
+ ? baselineTailWidth - widthDelta
803
+ : baselineTailWidth + Math.max(-widthDelta - overflowWidth, 0);
804
+ const tailWidth = clampColumnWidth(resizeSession.flexibleTailColumnId, tailTargetWidth);
805
+ if (columnWidths.get(resizeSession.flexibleTailColumnId) !== tailWidth) {
806
+ columnWidths.set(resizeSession.flexibleTailColumnId, tailWidth);
807
+ }
808
+ }
809
+ }
810
+ if (currentWidth === nextWidth)
811
+ return;
812
+ columnWidths.set(columnId, nextWidth);
813
+ columnWidthsCache = null;
814
+ visibleColumnWidthsCache = null;
815
+ options.onColumnWidthsChange?.(getColumnWidths());
816
+ notifyWidth();
817
+ }
818
+ function getCellColumn(cell) {
819
+ if (cell.section === 'header' && cell.columnToken) {
820
+ return columns.get(cell.columnToken);
821
+ }
822
+ return cell.columnIndex !== undefined ? getColumnAt(cell.columnIndex) : undefined;
823
+ }
824
+ function isCellColumnHidden(cell) {
825
+ const column = getCellColumn(cell);
826
+ return column ? isColumnHidden(column.id) : false;
827
+ }
828
+ function getNearestVisibleCellKey(targetCell) {
829
+ const targetPhysicalIndex = targetCell.section === 'header'
830
+ ? targetCell.columnToken
831
+ ? getColumnIndexByToken(targetCell.columnToken)
832
+ : -1
833
+ : (targetCell.columnIndex ?? -1);
834
+ const siblingCells = Array.from(cells.values())
835
+ .filter((candidate) => {
836
+ if (candidate.key === targetCell.key)
837
+ return false;
838
+ if (candidate.rowToken !== targetCell.rowToken)
839
+ return false;
840
+ if (candidate.section !== targetCell.section)
841
+ return false;
842
+ if (!candidate.element)
843
+ return false;
844
+ if (isCellColumnHidden(candidate))
845
+ return false;
846
+ if (candidate.section === 'body' &&
847
+ isRowDisabled(rows.get(candidate.rowToken)?.id, rows.get(candidate.rowToken)?.disabled)) {
848
+ return false;
849
+ }
850
+ return true;
851
+ })
852
+ .map((candidate) => {
853
+ const physicalIndex = candidate.section === 'header'
854
+ ? candidate.columnToken
855
+ ? getColumnIndexByToken(candidate.columnToken)
856
+ : -1
857
+ : (candidate.columnIndex ?? -1);
858
+ const candidateColumn = getCellColumn(candidate);
859
+ return { candidate, physicalIndex, candidateColumn };
860
+ })
861
+ .filter((entry) => entry.physicalIndex >= 0 && entry.candidateColumn);
862
+ if (siblingCells.length === 0)
863
+ return null;
864
+ siblingCells.sort((left, right) => {
865
+ const leftDistance = Math.abs(left.physicalIndex - targetPhysicalIndex);
866
+ const rightDistance = Math.abs(right.physicalIndex - targetPhysicalIndex);
867
+ if (leftDistance !== rightDistance)
868
+ return leftDistance - rightDistance;
869
+ return left.physicalIndex - right.physicalIndex;
870
+ });
871
+ return siblingCells[0]?.candidate.key ?? null;
872
+ }
873
+ function reconcileFocusAfterHiddenColumnsChange() {
874
+ if (resizingColumnId && isColumnHidden(resizingColumnId)) {
875
+ endColumnResize();
876
+ }
877
+ if (!focusedCellKey)
878
+ return;
879
+ const focusedCell = cells.get(focusedCellKey);
880
+ if (!focusedCell || !isCellColumnHidden(focusedCell))
881
+ return;
882
+ const replacementKey = getNearestVisibleCellKey(focusedCell);
883
+ if (replacementKey) {
884
+ focusCellByKey(replacementKey);
885
+ return;
886
+ }
887
+ focusedCellKey = null;
888
+ focusedRowTarget = null;
889
+ notifyFocus();
890
+ }
891
+ function reconcileFocusAfterDisabledStateChange() {
892
+ if (focusedCellKey) {
893
+ const focusedCell = cells.get(focusedCellKey);
894
+ if (focusedCell &&
895
+ focusedCell.section === 'body' &&
896
+ isRowDisabled(rows.get(focusedCell.rowToken)?.id, rows.get(focusedCell.rowToken)?.disabled)) {
897
+ moveFocus('down');
898
+ const nextFocusedCell = cells.get(focusedCellKey ?? '');
899
+ if (nextFocusedCell?.section === 'body' &&
900
+ isRowDisabled(rows.get(nextFocusedCell.rowToken)?.id, rows.get(nextFocusedCell.rowToken)?.disabled)) {
901
+ moveFocus('up');
902
+ }
903
+ }
904
+ }
905
+ if (focusedRowTarget) {
906
+ const focusedRow = rows.get(focusedRowTarget.rowToken);
907
+ if (focusedRow && isRowDisabled(focusedRow.id, focusedRow.disabled)) {
908
+ const nextToken = getFocusableBodyRowToken('start');
909
+ if (nextToken) {
910
+ setFocusedRow(nextToken, focusedRowTarget.edge);
911
+ }
912
+ else {
913
+ setFocusedRow(null);
914
+ }
915
+ }
916
+ }
917
+ }
918
+ function setHiddenColumns(columnIds) {
919
+ const next = new Set(columnIds ?? []);
920
+ let changed = next.size !== hiddenColumnIds.size;
921
+ if (!changed) {
922
+ for (const columnId of hiddenColumnIds) {
923
+ if (!next.has(columnId)) {
924
+ changed = true;
925
+ break;
926
+ }
927
+ }
928
+ }
929
+ if (!changed)
930
+ return;
931
+ hiddenColumnIds.clear();
932
+ for (const columnId of next) {
933
+ hiddenColumnIds.add(columnId);
934
+ }
935
+ reconcileFocusAfterHiddenColumnsChange();
936
+ notifyLayout();
937
+ notifyWidth();
938
+ }
939
+ function measureIntrinsicElementWidth(cell) {
940
+ const target = cell;
941
+ const clone = target.cloneNode(true);
942
+ for (const separator of clone.querySelectorAll('[role="separator"]')) {
943
+ separator.remove();
944
+ }
945
+ // Copy the cell's computed font so the clone inherits correct text metrics
946
+ // (the clone is appended to document.body which may have different font styles)
947
+ const cellFont = getComputedStyle(cell);
948
+ clone.style.font = cellFont.font;
949
+ clone.style.letterSpacing = cellFont.letterSpacing;
950
+ clone.style.wordSpacing = cellFont.wordSpacing;
951
+ clone.style.position = 'absolute';
952
+ clone.style.visibility = 'hidden';
953
+ clone.style.pointerEvents = 'none';
954
+ clone.style.left = '-99999px';
955
+ clone.style.top = '0';
956
+ clone.style.width = 'max-content';
957
+ clone.style.maxWidth = 'none';
958
+ clone.style.minWidth = '0';
959
+ clone.style.overflow = 'visible';
960
+ clone.style.whiteSpace = 'nowrap';
961
+ document.body.appendChild(clone);
962
+ const width = Math.ceil(clone.getBoundingClientRect().width);
963
+ clone.remove();
964
+ return width;
965
+ }
966
+ function measureColumnContentWidth(columnId) {
967
+ const registration = getColumnRegistrationById(columnId);
968
+ if (!registration)
969
+ return undefined;
970
+ const columnIndex = getColumnIndexByToken(registration.token);
971
+ if (columnIndex < 0)
972
+ return undefined;
973
+ const measuredWidths = [];
974
+ for (const cell of cells.values()) {
975
+ const matchesHeader = cell.section === 'header' && cell.columnToken === registration.token && cell.element;
976
+ const matchesBody = cell.section === 'body' && cell.columnIndex === columnIndex && cell.element;
977
+ if (!matchesHeader && !matchesBody)
978
+ continue;
979
+ const element = cell.element;
980
+ if (!element)
981
+ continue;
982
+ const computedStyle = getComputedStyle(element);
983
+ const paddingX = parseFloat(computedStyle.paddingLeft || '0') +
984
+ parseFloat(computedStyle.paddingRight || '0');
985
+ const borderX = parseFloat(computedStyle.borderLeftWidth || '0') +
986
+ parseFloat(computedStyle.borderRightWidth || '0');
987
+ const contentWidth = measureIntrinsicElementWidth(element);
988
+ if (contentWidth <= 0)
989
+ continue;
990
+ measuredWidths.push(Math.ceil(contentWidth + paddingX + borderX));
991
+ }
992
+ if (measuredWidths.length === 0)
993
+ return undefined;
994
+ return clampColumnWidth(columnId, Math.max(...measuredWidths));
995
+ }
996
+ function startColumnResize(columnId) {
997
+ if (!isColumnResizable(columnId) || resizingColumnId === columnId)
998
+ return;
999
+ resizeSession = null;
1000
+ resizingColumnId = columnId;
1001
+ options.onColumnResizeStart?.(columnId);
1002
+ notifyResize();
1003
+ }
1004
+ function endColumnResize() {
1005
+ if (!resizingColumnId)
1006
+ return;
1007
+ let restoredFlexibleTail = false;
1008
+ if (resizeSession?.flexibleTailColumnId !== undefined &&
1009
+ resizeSession.activeColumnId !== resizeSession.flexibleTailColumnId &&
1010
+ resizeSession.flexibleTailRestoreWidth !== undefined) {
1011
+ const tailColumnId = resizeSession.flexibleTailColumnId;
1012
+ columnWidths.set(tailColumnId, resizeSession.flexibleTailRestoreWidth);
1013
+ columnWidthsCache = null;
1014
+ visibleColumnWidthsCache = null;
1015
+ resolvedVisibleColumnWidthsCache = null;
1016
+ restoredFlexibleTail = true;
1017
+ }
1018
+ resizingColumnId = null;
1019
+ if (restoredFlexibleTail) {
1020
+ options.onColumnWidthsChange?.(getColumnWidths());
1021
+ }
1022
+ resizeSession = null;
1023
+ options.onColumnResizeEnd?.(getColumnWidths());
1024
+ notifyWidthImmediately();
1025
+ notifyResize();
1026
+ }
1027
+ function suppressHeaderClickOnce() {
1028
+ suppressNextHeaderClick = true;
1029
+ }
1030
+ function consumeHeaderClickSuppression() {
1031
+ const shouldSuppress = suppressNextHeaderClick;
1032
+ suppressNextHeaderClick = false;
1033
+ return shouldSuppress;
1034
+ }
1035
+ function registerRow(row) {
1036
+ const existing = rows.get(row.token);
1037
+ const previousSelectableBodyRowCount = selectableBodyRowCount;
1038
+ const targetOrder = row.section === 'header' ? headerRowOrder : row.section === 'body' ? bodyRowOrder : null;
1039
+ const alreadyOrdered = targetOrder ? targetOrder.includes(row.token) : false;
1040
+ const wasInHeader = headerRowOrder.includes(row.token);
1041
+ const wasInBody = bodyRowOrder.includes(row.token);
1042
+ if (existing &&
1043
+ sameRowRegistration(existing, row) &&
1044
+ (targetOrder ? alreadyOrdered : !wasInHeader && !wasInBody)) {
1045
+ return;
1046
+ }
1047
+ if (wasInHeader) {
1048
+ headerRowOrder.splice(headerRowOrder.indexOf(row.token), 1);
1049
+ }
1050
+ if (wasInBody) {
1051
+ bodyRowOrder.splice(bodyRowOrder.indexOf(row.token), 1);
1052
+ }
1053
+ const previousSelectableBodyRow = isSelectableBodyRow(existing);
1054
+ rows.set(row.token, row);
1055
+ if (targetOrder && !targetOrder.includes(row.token)) {
1056
+ targetOrder.push(row.token);
1057
+ }
1058
+ const nextSelectableBodyRow = isSelectableBodyRow(row);
1059
+ if (previousSelectableBodyRow !== nextSelectableBodyRow) {
1060
+ selectableBodyRowCount += nextSelectableBodyRow ? 1 : -1;
1061
+ }
1062
+ if ((selectedKeys.size > 0 && (existing?.section === 'body' || row.section === 'body')) ||
1063
+ (bodyRowsInitialized &&
1064
+ (previousSelectableBodyRowCount === 0) !== (selectableBodyRowCount === 0))) {
1065
+ notifySelection();
1066
+ }
1067
+ notifyLayout();
1068
+ }
1069
+ function unregisterRow(token) {
1070
+ const row = rows.get(token);
1071
+ const previousSelectableBodyRowCount = selectableBodyRowCount;
1072
+ rows.delete(token);
1073
+ if (isSelectableBodyRow(row)) {
1074
+ selectableBodyRowCount = Math.max(0, selectableBodyRowCount - 1);
1075
+ }
1076
+ if (focusedRowTarget?.rowToken === token) {
1077
+ focusedRowTarget = null;
1078
+ notifyFocus();
1079
+ }
1080
+ for (const order of [headerRowOrder, bodyRowOrder]) {
1081
+ const index = order.indexOf(token);
1082
+ if (index >= 0) {
1083
+ order.splice(index, 1);
1084
+ }
1085
+ }
1086
+ for (const [key, cell] of cells.entries()) {
1087
+ if (cell.rowToken === token) {
1088
+ cells.delete(key);
1089
+ }
1090
+ }
1091
+ if (row && focusedCellKey) {
1092
+ const focusedCell = cells.get(focusedCellKey);
1093
+ if (!focusedCell || focusedCell.rowToken === token) {
1094
+ focusedCellKey = null;
1095
+ notifyFocus();
1096
+ }
1097
+ }
1098
+ if ((selectedKeys.size > 0 && row?.section === 'body') ||
1099
+ (bodyRowsInitialized &&
1100
+ (previousSelectableBodyRowCount === 0) !== (selectableBodyRowCount === 0))) {
1101
+ notifySelection();
1102
+ }
1103
+ notifyLayout();
1104
+ }
1105
+ function markBodyRowsInitialized() {
1106
+ if (bodyRowsInitialized)
1107
+ return;
1108
+ const optimisticHasSelectableRows = selectionMode === 'multiple' || selectedKeys.size > 0;
1109
+ bodyRowsInitialized = true;
1110
+ const actualHasSelectableRows = selectableBodyRowCount > 0 || selectedKeys.size > 0;
1111
+ if (optimisticHasSelectableRows !== actualHasSelectableRows) {
1112
+ notifySelection();
1113
+ }
1114
+ }
1115
+ function getBodyRowCount() {
1116
+ return getOrderedRowTokens('body').length;
1117
+ }
1118
+ function getHeaderRowCount() {
1119
+ return getOrderedRowTokens('header').length;
1120
+ }
1121
+ function compareRowsByDocumentOrder(leftToken, rightToken, fallback) {
1122
+ const leftIndex = fallback.indexOf(leftToken);
1123
+ const rightIndex = fallback.indexOf(rightToken);
1124
+ const leftRow = rows.get(leftToken)?.element;
1125
+ const rightRow = rows.get(rightToken)?.element;
1126
+ if (!leftRow || !rightRow || leftRow === rightRow) {
1127
+ return leftIndex - rightIndex;
1128
+ }
1129
+ const position = leftRow.compareDocumentPosition(rightRow);
1130
+ if (position & Node.DOCUMENT_POSITION_FOLLOWING)
1131
+ return -1;
1132
+ if (position & Node.DOCUMENT_POSITION_PRECEDING)
1133
+ return 1;
1134
+ return leftIndex - rightIndex;
1135
+ }
1136
+ function getOrderedRowTokens(section) {
1137
+ const cached = orderedRowTokensCache[section];
1138
+ if (cached)
1139
+ return cached;
1140
+ const fallback = section === 'header' ? headerRowOrder : bodyRowOrder;
1141
+ const sorted = [...fallback].sort((leftToken, rightToken) => compareRowsByDocumentOrder(leftToken, rightToken, fallback));
1142
+ orderedRowTokensCache[section] = sorted;
1143
+ return sorted;
1144
+ }
1145
+ function getOrderedSelectableRowIds() {
1146
+ const rowIds = [];
1147
+ for (const token of getOrderedRowTokens('body')) {
1148
+ const row = rows.get(token);
1149
+ if (!row?.id)
1150
+ continue;
1151
+ if (isRowSelectionDisabled(row.id, row.disabled))
1152
+ continue;
1153
+ rowIds.push(row.id);
1154
+ }
1155
+ return rowIds;
1156
+ }
1157
+ function isRowSelectionDisabled(id, localDisabled = false) {
1158
+ if (localDisabled)
1159
+ return true;
1160
+ if (id === undefined)
1161
+ return false;
1162
+ return disabledKeys.has(id);
1163
+ }
1164
+ function isSelectableBodyRow(row) {
1165
+ return (row?.section === 'body' &&
1166
+ row.id !== undefined &&
1167
+ !isRowSelectionDisabled(row.id, row.disabled));
1168
+ }
1169
+ function recomputeSelectableBodyRowCount() {
1170
+ let nextSelectableBodyRowCount = 0;
1171
+ for (const token of bodyRowOrder) {
1172
+ if (isSelectableBodyRow(rows.get(token))) {
1173
+ nextSelectableBodyRowCount += 1;
1174
+ }
1175
+ }
1176
+ selectableBodyRowCount = nextSelectableBodyRowCount;
1177
+ }
1178
+ function isRowDisabled(id, localDisabled = false) {
1179
+ return disabledBehavior === 'all' && isRowSelectionDisabled(id, localDisabled);
1180
+ }
1181
+ function isRowActionDisabled(id, localDisabled = false) {
1182
+ return disabledBehavior === 'all' && isRowSelectionDisabled(id, localDisabled);
1183
+ }
1184
+ function isRowActionable(id, localDisabled = false) {
1185
+ return Boolean(onRowAction) && id !== undefined && !isRowActionDisabled(id, localDisabled);
1186
+ }
1187
+ function isRowSelected(id) {
1188
+ if (id === undefined)
1189
+ return false;
1190
+ return selectedKeys.has(id);
1191
+ }
1192
+ function getSelectionCheckboxState() {
1193
+ const orderedIds = getOrderedSelectableRowIds();
1194
+ if (orderedIds.length === 0) {
1195
+ return selectedKeys.size > 0 ? 'some' : 'none';
1196
+ }
1197
+ if (selectedKeys.size === 0) {
1198
+ return 'none';
1199
+ }
1200
+ let selectedCount = 0;
1201
+ for (const id of orderedIds) {
1202
+ if (selectedKeys.has(id)) {
1203
+ selectedCount += 1;
1204
+ }
1205
+ }
1206
+ if (selectedCount === 0)
1207
+ return 'none';
1208
+ if (selectedCount === orderedIds.length)
1209
+ return 'all';
1210
+ return 'some';
1211
+ }
1212
+ function hasSelectableRows() {
1213
+ if (!bodyRowsInitialized) {
1214
+ return selectionMode === 'multiple' || selectedKeys.size > 0;
1215
+ }
1216
+ return selectableBodyRowCount > 0 || selectedKeys.size > 0;
1217
+ }
1218
+ function isRowFocused(token) {
1219
+ if (focusedRowTarget?.rowToken === token)
1220
+ return true;
1221
+ if (!focusedCellKey)
1222
+ return false;
1223
+ return cells.get(focusedCellKey)?.rowToken === token;
1224
+ }
1225
+ function isRowFocusTarget(token) {
1226
+ return focusedRowTarget?.rowToken === token;
1227
+ }
1228
+ function getRowFocusEdge(token) {
1229
+ return focusedRowTarget?.rowToken === token ? focusedRowTarget.edge : null;
1230
+ }
1231
+ function registerCell(cell) {
1232
+ const existing = cells.get(cell.key);
1233
+ const alreadyOrdered = cellOrder.includes(cell.key);
1234
+ if (existing && sameCellRegistration(existing, cell) && alreadyOrdered)
1235
+ return;
1236
+ cells.set(cell.key, cell);
1237
+ if (!alreadyOrdered) {
1238
+ cellOrder.push(cell.key);
1239
+ }
1240
+ notifyLayout();
1241
+ notifyWidth();
1242
+ }
1243
+ function unregisterCell(key) {
1244
+ cells.delete(key);
1245
+ const index = cellOrder.indexOf(key);
1246
+ if (index >= 0) {
1247
+ cellOrder.splice(index, 1);
1248
+ }
1249
+ if (focusedCellKey === key) {
1250
+ focusedCellKey = null;
1251
+ notifyFocus();
1252
+ }
1253
+ notifyLayout();
1254
+ notifyWidth();
1255
+ }
1256
+ function isCellFocused(key) {
1257
+ return focusedCellKey === key;
1258
+ }
1259
+ function getDefaultFocusKey() {
1260
+ for (const rowToken of getOrderedRowTokens('header')) {
1261
+ const headerCells = Array.from(cells.values())
1262
+ .filter((cell) => cell.section === 'header' && cell.rowToken === rowToken)
1263
+ .sort((left, right) => getColumnIndex(left) - getColumnIndex(right));
1264
+ const firstHeaderCell = headerCells[0]?.key;
1265
+ if (firstHeaderCell)
1266
+ return firstHeaderCell;
1267
+ }
1268
+ for (const rowToken of getOrderedRowTokens('body')) {
1269
+ const row = rows.get(rowToken);
1270
+ if (isRowDisabled(row?.id, row?.disabled))
1271
+ continue;
1272
+ const bodyCells = Array.from(cells.values())
1273
+ .filter((cell) => cell.section === 'body' && cell.rowToken === rowToken)
1274
+ .sort((left, right) => (left.columnIndex ?? -1) - (right.columnIndex ?? -1));
1275
+ const firstBodyCell = bodyCells[0]?.key;
1276
+ if (firstBodyCell)
1277
+ return firstBodyCell;
1278
+ }
1279
+ return null;
1280
+ }
1281
+ function isCellTabStop(key) {
1282
+ if (focusedCellKey) {
1283
+ return focusedCellKey === key;
1284
+ }
1285
+ if (focusedRowTarget) {
1286
+ return false;
1287
+ }
1288
+ return getDefaultFocusKey() === key;
1289
+ }
1290
+ function isRowTabStop(token) {
1291
+ return focusedRowTarget?.rowToken === token;
1292
+ }
1293
+ function getGlobalRowIndex(rowToken) {
1294
+ const orderedHeaderRows = getOrderedRowTokens('header');
1295
+ const orderedBodyRows = getOrderedRowTokens('body');
1296
+ const headerIndex = orderedHeaderRows.indexOf(rowToken);
1297
+ if (headerIndex >= 0)
1298
+ return headerIndex;
1299
+ const bodyIndex = orderedBodyRows.indexOf(rowToken);
1300
+ if (bodyIndex >= 0)
1301
+ return orderedHeaderRows.length + bodyIndex;
1302
+ return -1;
1303
+ }
1304
+ function getColumnIndex(cell) {
1305
+ if (cell.section === 'header' && cell.columnToken) {
1306
+ return getVisibleColumnIndexByToken(cell.columnToken);
1307
+ }
1308
+ const column = cell.columnIndex !== undefined ? getColumnAt(cell.columnIndex) : undefined;
1309
+ if (!column || isColumnHidden(column.id))
1310
+ return -1;
1311
+ return getVisibleColumnIndexByToken(column.token);
1312
+ }
1313
+ function getCellCoord(cell) {
1314
+ const row = getGlobalRowIndex(cell.rowToken);
1315
+ const col = getColumnIndex(cell);
1316
+ if (row < 0 || col < 0)
1317
+ return null;
1318
+ return { row, col };
1319
+ }
1320
+ function getNavigableCells() {
1321
+ if (navigableCellsCache)
1322
+ return navigableCellsCache;
1323
+ navigableCellsCache = Array.from(cells.values())
1324
+ .map((cell) => ({ cell, coord: getCellCoord(cell) }))
1325
+ .filter((entry) => Boolean(entry.coord &&
1326
+ !isCellColumnHidden(entry.cell) &&
1327
+ entry.cell.element &&
1328
+ (entry.cell.section !== 'body' ||
1329
+ !isRowDisabled(rows.get(entry.cell.rowToken)?.id, rows.get(entry.cell.rowToken)?.disabled))))
1330
+ .sort((left, right) => left.coord.row === right.coord.row
1331
+ ? left.coord.col - right.coord.col
1332
+ : left.coord.row - right.coord.row);
1333
+ return navigableCellsCache;
1334
+ }
1335
+ function getRowsWithCells() {
1336
+ if (rowsWithCellsCache)
1337
+ return rowsWithCellsCache;
1338
+ const rowsByIndex = new Map();
1339
+ for (const { cell, coord } of getNavigableCells()) {
1340
+ const rowCells = rowsByIndex.get(coord.row) ?? [];
1341
+ rowCells.push({ col: coord.col, key: cell.key, element: cell.element });
1342
+ rowsByIndex.set(coord.row, rowCells);
1343
+ }
1344
+ for (const rowCells of rowsByIndex.values()) {
1345
+ rowCells.sort((a, b) => a.col - b.col);
1346
+ }
1347
+ rowsWithCellsCache = rowsByIndex;
1348
+ return rowsWithCellsCache;
1349
+ }
1350
+ function getClosestCellKey(rowIndex, preferredCol) {
1351
+ const rowCells = getRowsWithCells().get(rowIndex);
1352
+ if (!rowCells || rowCells.length === 0)
1353
+ return null;
1354
+ const exact = rowCells.find((rowCell) => rowCell.col === preferredCol);
1355
+ if (exact)
1356
+ return exact.key;
1357
+ const before = [...rowCells].reverse().find((rowCell) => rowCell.col <= preferredCol);
1358
+ if (before)
1359
+ return before.key;
1360
+ return rowCells[0]?.key ?? null;
1361
+ }
1362
+ function focusCellByKey(key) {
1363
+ if (!key)
1364
+ return;
1365
+ const cell = cells.get(key);
1366
+ if (!cell?.element)
1367
+ return;
1368
+ if (cell.section === 'body' &&
1369
+ isRowDisabled(rows.get(cell.rowToken)?.id, rows.get(cell.rowToken)?.disabled)) {
1370
+ return;
1371
+ }
1372
+ focusedRowTarget = null;
1373
+ focusedCellKey = key;
1374
+ notifyFocus();
1375
+ const focusTarget = cell.focusDelegate?.() ?? cell.element;
1376
+ focusTarget.focus();
1377
+ focusTarget.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });
1378
+ }
1379
+ function focusRowByToken(token, edge) {
1380
+ const row = rows.get(token);
1381
+ if (!row?.element || row.section !== 'body')
1382
+ return;
1383
+ if (isRowDisabled(row.id, row.disabled))
1384
+ return;
1385
+ focusedCellKey = null;
1386
+ focusedRowTarget = { rowToken: token, edge };
1387
+ notifyFocus();
1388
+ row.element.focus();
1389
+ row.element.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });
1390
+ }
1391
+ function setFocusedCell(key) {
1392
+ if (focusedCellKey === key && focusedRowTarget === null)
1393
+ return;
1394
+ focusedCellKey = key;
1395
+ focusedRowTarget = null;
1396
+ notifyFocus();
1397
+ }
1398
+ function setFocusedRow(token, edge = 'start') {
1399
+ if (token === null) {
1400
+ if (focusedCellKey === null && focusedRowTarget === null)
1401
+ return;
1402
+ focusedCellKey = null;
1403
+ focusedRowTarget = null;
1404
+ notifyFocus();
1405
+ return;
1406
+ }
1407
+ if (focusedCellKey === null &&
1408
+ focusedRowTarget?.rowToken === token &&
1409
+ focusedRowTarget.edge === edge) {
1410
+ return;
1411
+ }
1412
+ focusedCellKey = null;
1413
+ focusedRowTarget = { rowToken: token, edge };
1414
+ notifyFocus();
1415
+ }
1416
+ function setFocusVisible(visible) {
1417
+ if (focusVisible === visible)
1418
+ return;
1419
+ focusVisible = visible;
1420
+ notifyFocus();
1421
+ }
1422
+ function getFocusedCoord() {
1423
+ if (!focusedCellKey)
1424
+ return null;
1425
+ const cell = cells.get(focusedCellKey);
1426
+ return cell ? getCellCoord(cell) : null;
1427
+ }
1428
+ function getFocusedRowId() {
1429
+ const rowToken = focusedRowTarget?.rowToken ?? cells.get(focusedCellKey ?? '')?.rowToken;
1430
+ if (!rowToken)
1431
+ return null;
1432
+ const row = rows.get(rowToken);
1433
+ return row?.section === 'body' ? (row.id ?? null) : null;
1434
+ }
1435
+ function getRowTokenByGlobalIndex(index) {
1436
+ const headerRows = getOrderedRowTokens('header');
1437
+ if (index < headerRows.length) {
1438
+ return headerRows[index] ?? null;
1439
+ }
1440
+ return getOrderedRowTokens('body')[index - headerRows.length] ?? null;
1441
+ }
1442
+ function getFocusableBodyRowToken(direction) {
1443
+ const orderedBodyTokens = getOrderedRowTokens('body');
1444
+ const tokens = direction === 'start' ? orderedBodyTokens : [...orderedBodyTokens].reverse();
1445
+ for (const token of tokens) {
1446
+ const row = rows.get(token);
1447
+ if (!row || isRowDisabled(row.id, row.disabled))
1448
+ continue;
1449
+ return token;
1450
+ }
1451
+ return null;
1452
+ }
1453
+ function hasSameSelection(left, right) {
1454
+ if (left.size !== right.size)
1455
+ return false;
1456
+ for (const key of left) {
1457
+ if (!right.has(key))
1458
+ return false;
1459
+ }
1460
+ return true;
1461
+ }
1462
+ function setSelectedKeys(next, anchor) {
1463
+ const previousSelectedKeys = new Set(selectedKeys);
1464
+ selectedKeys =
1465
+ selectionMode === 'none'
1466
+ ? new Set()
1467
+ : selectionMode === 'single' && next.size > 1
1468
+ ? new Set([next.values().next().value])
1469
+ : next;
1470
+ if (selectionMode !== 'none' && disallowEmptySelection && selectedKeys.size === 0) {
1471
+ const fallbackKey = (anchor !== undefined && anchor !== null && !isRowSelectionDisabled(anchor)
1472
+ ? anchor
1473
+ : previousSelectedKeys.values().next().value) ??
1474
+ getFocusedRowId() ??
1475
+ getOrderedSelectableRowIds()[0];
1476
+ if (fallbackKey !== undefined &&
1477
+ fallbackKey !== null &&
1478
+ !isRowSelectionDisabled(fallbackKey)) {
1479
+ selectedKeys = new Set([fallbackKey]);
1480
+ }
1481
+ }
1482
+ const fallbackAnchor = selectedKeys.values().next().value ?? null;
1483
+ if (anchor === undefined) {
1484
+ selectionAnchorKey = fallbackAnchor;
1485
+ return;
1486
+ }
1487
+ selectionAnchorKey = anchor === null || selectedKeys.has(anchor) ? anchor : fallbackAnchor;
1488
+ }
1489
+ function replaceSelectionWithRow(id) {
1490
+ if (id === undefined || isRowSelectionDisabled(id))
1491
+ return;
1492
+ const next = new Set([id]);
1493
+ if (hasSameSelection(selectedKeys, next)) {
1494
+ setSelectedKeys(next, id);
1495
+ notifySelection();
1496
+ return;
1497
+ }
1498
+ setSelectedKeys(next, id);
1499
+ emitSelectionChange();
1500
+ }
1501
+ function applySelectionChange(next, anchor) {
1502
+ const previousSelection = new Set(selectedKeys);
1503
+ const previousAnchor = selectionAnchorKey;
1504
+ setSelectedKeys(next, anchor);
1505
+ if (!hasSameSelection(previousSelection, selectedKeys)) {
1506
+ emitSelectionChange();
1507
+ return;
1508
+ }
1509
+ if (!hasSameSelection(next, selectedKeys) || previousAnchor !== selectionAnchorKey) {
1510
+ notifySelection();
1511
+ }
1512
+ }
1513
+ function toggleSelectionForRow(id) {
1514
+ if (id === undefined || isRowSelectionDisabled(id))
1515
+ return;
1516
+ if (selectionMode === 'single') {
1517
+ const wasSelected = selectedKeys.has(id);
1518
+ applySelectionChange(selectionBehavior === 'toggle' && wasSelected ? new Set() : new Set([id]), selectionBehavior === 'toggle' && wasSelected ? null : id);
1519
+ return;
1520
+ }
1521
+ const next = new Set(selectedKeys);
1522
+ if (next.has(id)) {
1523
+ next.delete(id);
1524
+ }
1525
+ else {
1526
+ next.add(id);
1527
+ }
1528
+ applySelectionChange(next, id);
1529
+ }
1530
+ function extendSelectionToRow(id, anchorOverride) {
1531
+ if (id === undefined || isRowSelectionDisabled(id))
1532
+ return;
1533
+ if (selectionMode !== 'multiple') {
1534
+ replaceSelectionWithRow(id);
1535
+ return;
1536
+ }
1537
+ const orderedIds = getOrderedSelectableRowIds();
1538
+ const targetIndex = orderedIds.indexOf(id);
1539
+ if (targetIndex < 0)
1540
+ return;
1541
+ const anchor = anchorOverride ??
1542
+ (selectionAnchorKey && orderedIds.includes(selectionAnchorKey) ? selectionAnchorKey : null) ??
1543
+ getFocusedRowId() ??
1544
+ id;
1545
+ const anchorIndex = orderedIds.indexOf(anchor);
1546
+ if (anchorIndex < 0) {
1547
+ replaceSelectionWithRow(id);
1548
+ return;
1549
+ }
1550
+ const start = Math.min(anchorIndex, targetIndex);
1551
+ const end = Math.max(anchorIndex, targetIndex);
1552
+ applySelectionChange(new Set(orderedIds.slice(start, end + 1)), anchor);
1553
+ }
1554
+ function performRowAction(id) {
1555
+ if (!onRowAction || id === undefined || isRowActionDisabled(id))
1556
+ return;
1557
+ onRowAction(id);
1558
+ }
1559
+ function hasActiveSelection() {
1560
+ return selectedKeys.size > 0;
1561
+ }
1562
+ function pressRowSelection(id, interaction = {}) {
1563
+ if (selectionMode === 'none' || id === undefined || isRowSelectionDisabled(id))
1564
+ return;
1565
+ if (selectionBehavior === 'replace' && selectionMode === 'multiple') {
1566
+ if (interaction.shiftKey) {
1567
+ extendSelectionToRow(id);
1568
+ return;
1569
+ }
1570
+ if (interaction.ctrlKey || interaction.metaKey) {
1571
+ toggleSelectionForRow(id);
1572
+ return;
1573
+ }
1574
+ replaceSelectionWithRow(id);
1575
+ return;
1576
+ }
1577
+ toggleSelectionForRow(id);
1578
+ }
1579
+ function pressRow(id, source, interaction = {}, localDisabled = false) {
1580
+ if (id === undefined)
1581
+ return;
1582
+ if (isRowDisabled(id, localDisabled))
1583
+ return;
1584
+ if (source === 'keyboard-enter') {
1585
+ if (onRowAction) {
1586
+ performRowAction(id);
1587
+ return;
1588
+ }
1589
+ pressRowSelection(id, interaction);
1590
+ return;
1591
+ }
1592
+ if (source === 'keyboard-space') {
1593
+ if (interaction.shiftKey) {
1594
+ extendSelectionToRow(id);
1595
+ return;
1596
+ }
1597
+ if (interaction.ctrlKey || interaction.metaKey) {
1598
+ toggleSelectionForRow(id);
1599
+ return;
1600
+ }
1601
+ toggleRowSelection(id);
1602
+ return;
1603
+ }
1604
+ if (source === 'pointer-double') {
1605
+ if (onRowAction && selectionMode !== 'none' && selectionBehavior === 'replace') {
1606
+ performRowAction(id);
1607
+ }
1608
+ return;
1609
+ }
1610
+ if (!onRowAction) {
1611
+ pressRowSelection(id, interaction);
1612
+ return;
1613
+ }
1614
+ if (selectionMode === 'none') {
1615
+ performRowAction(id);
1616
+ return;
1617
+ }
1618
+ if (selectionBehavior === 'replace') {
1619
+ pressRowSelection(id, interaction);
1620
+ return;
1621
+ }
1622
+ if (hasActiveSelection()) {
1623
+ pressRowSelection(id, interaction);
1624
+ return;
1625
+ }
1626
+ performRowAction(id);
1627
+ }
1628
+ function moveFocus(direction, interaction = {}) {
1629
+ const rowMap = getRowsWithCells();
1630
+ const currentCoord = getFocusedCoord();
1631
+ const rowIndexes = Array.from(rowMap.keys()).sort((a, b) => a - b);
1632
+ if (rowIndexes.length === 0)
1633
+ return;
1634
+ const previousFocusedRowId = getFocusedRowId();
1635
+ function maybeSyncSelectionAfterFocus() {
1636
+ if (direction !== 'up' && direction !== 'down')
1637
+ return;
1638
+ if (selectionMode === 'none')
1639
+ return;
1640
+ if (interaction.ctrlKey || interaction.metaKey || interaction.altKey)
1641
+ return;
1642
+ const targetRowId = getFocusedRowId();
1643
+ if (targetRowId === null)
1644
+ return;
1645
+ if (interaction.shiftKey) {
1646
+ extendSelectionToRow(targetRowId, selectionAnchorKey ?? previousFocusedRowId);
1647
+ return;
1648
+ }
1649
+ if (selectionBehavior !== 'replace')
1650
+ return;
1651
+ replaceSelectionWithRow(targetRowId);
1652
+ }
1653
+ if (!currentCoord) {
1654
+ if (focusedRowTarget) {
1655
+ const currentRowIndex = getGlobalRowIndex(focusedRowTarget.rowToken);
1656
+ if (currentRowIndex < 0)
1657
+ return;
1658
+ if (direction === 'left' || direction === 'right') {
1659
+ const rowCells = rowMap.get(currentRowIndex) ?? [];
1660
+ if (focusedRowTarget.edge === 'start') {
1661
+ if (direction === 'right') {
1662
+ focusCellByKey(getClosestCellKey(currentRowIndex, -1));
1663
+ return;
1664
+ }
1665
+ focusCellByKey(rowCells[rowCells.length - 1]?.key ?? null);
1666
+ return;
1667
+ }
1668
+ if (direction === 'left') {
1669
+ focusCellByKey(rowCells[rowCells.length - 1]?.key ?? null);
1670
+ return;
1671
+ }
1672
+ focusCellByKey(getClosestCellKey(currentRowIndex, -1));
1673
+ return;
1674
+ }
1675
+ const rowPosition = rowIndexes.indexOf(currentRowIndex);
1676
+ const targetRowIndex = direction === 'up' ? rowIndexes[rowPosition - 1] : rowIndexes[rowPosition + 1];
1677
+ if (targetRowIndex === undefined)
1678
+ return;
1679
+ const targetRowToken = getRowTokenByGlobalIndex(targetRowIndex);
1680
+ const targetRow = targetRowToken ? rows.get(targetRowToken) : null;
1681
+ if (targetRow?.section === 'body' && !isRowDisabled(targetRow.id, targetRow.disabled)) {
1682
+ focusRowByToken(targetRowToken, focusedRowTarget.edge);
1683
+ }
1684
+ else if (focusedRowTarget.edge === 'start') {
1685
+ focusCellByKey(getClosestCellKey(targetRowIndex, -1));
1686
+ }
1687
+ else {
1688
+ const targetRowCells = rowMap.get(targetRowIndex) ?? [];
1689
+ focusCellByKey(targetRowCells[targetRowCells.length - 1]?.key ?? null);
1690
+ }
1691
+ maybeSyncSelectionAfterFocus();
1692
+ return;
1693
+ }
1694
+ const firstKey = getClosestCellKey(rowIndexes[0], 0);
1695
+ focusCellByKey(firstKey);
1696
+ maybeSyncSelectionAfterFocus();
1697
+ return;
1698
+ }
1699
+ if (direction === 'left' || direction === 'right') {
1700
+ const rowCells = rowMap.get(currentCoord.row) ?? [];
1701
+ const currentIndex = rowCells.findIndex((rowCell) => rowCell.key === focusedCellKey);
1702
+ if (currentIndex < 0)
1703
+ return;
1704
+ const nextIndex = direction === 'left' ? currentIndex - 1 : currentIndex + 1;
1705
+ const nextKey = rowCells[nextIndex]?.key;
1706
+ if (nextKey) {
1707
+ focusCellByKey(nextKey);
1708
+ return;
1709
+ }
1710
+ const currentCell = cells.get(focusedCellKey ?? '');
1711
+ if (currentCell?.section === 'body') {
1712
+ focusRowByToken(currentCell.rowToken, direction === 'left' ? 'start' : 'end');
1713
+ }
1714
+ return;
1715
+ }
1716
+ const rowPosition = rowIndexes.indexOf(currentCoord.row);
1717
+ const targetRowIndex = direction === 'up' ? rowIndexes[rowPosition - 1] : rowIndexes[rowPosition + 1];
1718
+ if (targetRowIndex === undefined)
1719
+ return;
1720
+ const targetKey = getClosestCellKey(targetRowIndex, currentCoord.col);
1721
+ focusCellByKey(targetKey);
1722
+ maybeSyncSelectionAfterFocus();
1723
+ }
1724
+ function moveToRowStart() {
1725
+ if (focusedRowTarget) {
1726
+ const rowIndex = getGlobalRowIndex(focusedRowTarget.rowToken);
1727
+ if (rowIndex < 0)
1728
+ return;
1729
+ focusCellByKey(getClosestCellKey(rowIndex, -1));
1730
+ return;
1731
+ }
1732
+ const currentCoord = getFocusedCoord();
1733
+ if (!currentCoord) {
1734
+ moveToGridStart();
1735
+ return;
1736
+ }
1737
+ focusCellByKey(getClosestCellKey(currentCoord.row, -1));
1738
+ }
1739
+ function moveToRowEnd() {
1740
+ const rowMap = getRowsWithCells();
1741
+ if (focusedRowTarget) {
1742
+ const rowIndex = getGlobalRowIndex(focusedRowTarget.rowToken);
1743
+ if (rowIndex < 0)
1744
+ return;
1745
+ const rowCells = rowMap.get(rowIndex) ?? [];
1746
+ focusCellByKey(rowCells[rowCells.length - 1]?.key ?? null);
1747
+ return;
1748
+ }
1749
+ const currentCoord = getFocusedCoord();
1750
+ if (!currentCoord) {
1751
+ moveToGridEnd();
1752
+ return;
1753
+ }
1754
+ const rowCells = rowMap.get(currentCoord.row) ?? [];
1755
+ focusCellByKey(rowCells[rowCells.length - 1]?.key ?? null);
1756
+ }
1757
+ function moveToGridStart() {
1758
+ const rowIndexes = Array.from(getRowsWithCells().keys()).sort((a, b) => a - b);
1759
+ if (rowIndexes.length === 0)
1760
+ return;
1761
+ focusCellByKey(getClosestCellKey(rowIndexes[0], -1));
1762
+ }
1763
+ function moveToBodyRowStart() {
1764
+ const targetToken = getFocusableBodyRowToken('start');
1765
+ if (!targetToken)
1766
+ return;
1767
+ focusRowByToken(targetToken, focusedRowTarget?.edge ?? 'start');
1768
+ }
1769
+ function moveToBodyRowEnd() {
1770
+ const targetToken = getFocusableBodyRowToken('end');
1771
+ if (!targetToken)
1772
+ return;
1773
+ focusRowByToken(targetToken, focusedRowTarget?.edge ?? 'end');
1774
+ }
1775
+ function moveToGridEnd() {
1776
+ const rowMap = getRowsWithCells();
1777
+ const bodyGlobalRows = getOrderedRowTokens('body')
1778
+ .map((token) => getGlobalRowIndex(token))
1779
+ .filter((index) => index >= 0)
1780
+ .sort((a, b) => a - b);
1781
+ const targetRow = bodyGlobalRows.at(-1) ??
1782
+ Array.from(rowMap.keys())
1783
+ .sort((a, b) => a - b)
1784
+ .at(-1);
1785
+ if (targetRow === undefined)
1786
+ return;
1787
+ const rowCells = rowMap.get(targetRow) ?? [];
1788
+ focusCellByKey(rowCells[rowCells.length - 1]?.key ?? null);
1789
+ }
1790
+ function emitSelectionChange() {
1791
+ options.onSelectionChange?.(new Set(selectedKeys));
1792
+ notifySelection();
1793
+ }
1794
+ function toggleRowSelection(id) {
1795
+ if (selectionMode === 'none' || id === undefined || isRowSelectionDisabled(id))
1796
+ return;
1797
+ if (selectionMode === 'single') {
1798
+ const wasSelected = selectedKeys.has(id);
1799
+ applySelectionChange(wasSelected ? new Set() : new Set([id]), wasSelected ? null : id);
1800
+ return;
1801
+ }
1802
+ const next = new Set(selectedKeys);
1803
+ if (next.has(id)) {
1804
+ next.delete(id);
1805
+ }
1806
+ else {
1807
+ next.add(id);
1808
+ }
1809
+ applySelectionChange(next, id);
1810
+ }
1811
+ function selectAllRows() {
1812
+ if (selectionMode !== 'multiple')
1813
+ return;
1814
+ const next = new Set();
1815
+ for (const token of getOrderedRowTokens('body')) {
1816
+ const row = rows.get(token);
1817
+ if (!row?.id || isRowSelectionDisabled(row.id, row.disabled))
1818
+ continue;
1819
+ next.add(row.id);
1820
+ }
1821
+ setSelectedKeys(next, next.values().next().value ?? null);
1822
+ emitSelectionChange();
1823
+ }
1824
+ function deselectAllRows() {
1825
+ if (selectedKeys.size === 0)
1826
+ return;
1827
+ applySelectionChange(new Set(), null);
1828
+ }
1829
+ function setSelection(keys) {
1830
+ const previousSelection = new Set(selectedKeys);
1831
+ const previousAnchor = selectionAnchorKey;
1832
+ const next = new Set(keys);
1833
+ const preservedAnchor = selectionAnchorKey !== null && next.has(selectionAnchorKey) ? selectionAnchorKey : undefined;
1834
+ setSelectedKeys(next, preservedAnchor);
1835
+ if (!hasSameSelection(previousSelection, selectedKeys)) {
1836
+ emitSelectionChange();
1837
+ return;
1838
+ }
1839
+ if (previousAnchor !== selectionAnchorKey) {
1840
+ notifySelection();
1841
+ }
1842
+ }
1843
+ function setSelectionMode(mode) {
1844
+ const previousSelectedKeys = new Set(selectedKeys);
1845
+ const previousAnchor = selectionAnchorKey;
1846
+ selectionMode = mode;
1847
+ setSelectedKeys(new Set(selectedKeys), selectionAnchorKey);
1848
+ if (!hasSameSelection(previousSelectedKeys, selectedKeys) ||
1849
+ previousAnchor !== selectionAnchorKey) {
1850
+ emitSelectionChange();
1851
+ return;
1852
+ }
1853
+ notifySelection();
1854
+ }
1855
+ function setSelectionBehavior(behavior) {
1856
+ selectionBehavior = behavior;
1857
+ notifySelection();
1858
+ }
1859
+ function setDisabledBehavior(behavior) {
1860
+ disabledBehavior = behavior;
1861
+ invalidateLayoutCaches();
1862
+ reconcileFocusAfterDisabledStateChange();
1863
+ notifyLayout();
1864
+ notifySelection();
1865
+ }
1866
+ function setDisallowEmptySelection(disallow) {
1867
+ disallowEmptySelection = disallow;
1868
+ const previousSelection = new Set(selectedKeys);
1869
+ setSelectedKeys(new Set(selectedKeys), selectionAnchorKey);
1870
+ if (!hasSameSelection(previousSelection, selectedKeys)) {
1871
+ emitSelectionChange();
1872
+ return;
1873
+ }
1874
+ notifySelection();
1875
+ }
1876
+ function setDisabledKeys(keys) {
1877
+ const previousSelectableBodyRowCount = selectableBodyRowCount;
1878
+ disabledKeys.clear();
1879
+ if (keys) {
1880
+ for (const key of keys) {
1881
+ disabledKeys.add(key);
1882
+ }
1883
+ }
1884
+ recomputeSelectableBodyRowCount();
1885
+ invalidateLayoutCaches();
1886
+ reconcileFocusAfterDisabledStateChange();
1887
+ notifyLayout();
1888
+ if (selectedKeys.size > 0 ||
1889
+ (bodyRowsInitialized &&
1890
+ (previousSelectableBodyRowCount === 0) !== (selectableBodyRowCount === 0))) {
1891
+ notifySelection();
1892
+ }
1893
+ }
1894
+ function setRowActionHandler(handler) {
1895
+ onRowAction = handler;
1896
+ notifySelection();
1897
+ }
1898
+ function setSortDescriptor(descriptor) {
1899
+ sortDescriptor = descriptor;
1900
+ options.onSortChange?.(descriptor);
1901
+ notifySort();
1902
+ }
1903
+ function isColumnSortable(columnId) {
1904
+ const token = columnIds.get(columnId);
1905
+ return token ? columnsWithSortTriggers.has(token) : false;
1906
+ }
1907
+ function toggleSort(columnId) {
1908
+ if (!isColumnSortable(columnId))
1909
+ return;
1910
+ if (!sortDescriptor || sortDescriptor.column !== columnId) {
1911
+ setSortDescriptor({ column: columnId, direction: 'ascending' });
1912
+ return;
1913
+ }
1914
+ setSortDescriptor({
1915
+ column: columnId,
1916
+ direction: sortDescriptor.direction === 'ascending' ? 'descending' : 'ascending'
1917
+ });
1918
+ }
1919
+ function getSortDirection(columnId) {
1920
+ if (sortDescriptor?.column !== columnId)
1921
+ return undefined;
1922
+ return sortDescriptor.direction;
1923
+ }
1924
+ return {
1925
+ layoutVersion,
1926
+ selectionVersion,
1927
+ focusVersion,
1928
+ sortVersion,
1929
+ widthVersion,
1930
+ resizeVersion,
1931
+ createInstanceToken,
1932
+ get selectionMode() {
1933
+ return selectionMode;
1934
+ },
1935
+ get selectionBehavior() {
1936
+ return selectionBehavior;
1937
+ },
1938
+ get disabledBehavior() {
1939
+ return disabledBehavior;
1940
+ },
1941
+ get disallowEmptySelection() {
1942
+ return disallowEmptySelection;
1943
+ },
1944
+ get selectionUnavailableDescriptionId() {
1945
+ return selectionUnavailableDescriptionId;
1946
+ },
1947
+ disabledKeys,
1948
+ get focusedCellKey() {
1949
+ return focusedCellKey;
1950
+ },
1951
+ get focusVisible() {
1952
+ return focusVisible;
1953
+ },
1954
+ get sortDescriptor() {
1955
+ return sortDescriptor;
1956
+ },
1957
+ get resizingColumnId() {
1958
+ return resizingColumnId;
1959
+ },
1960
+ registerColumn,
1961
+ unregisterColumn,
1962
+ registerColumnSortTrigger,
1963
+ unregisterColumnSortTrigger,
1964
+ registerColumnResizer,
1965
+ unregisterColumnResizer,
1966
+ getColumnCount,
1967
+ getVisibleColumnCount,
1968
+ getColumnAt,
1969
+ getColumnIndexByToken,
1970
+ getVisibleColumnIndexByToken,
1971
+ getColumnTextValue,
1972
+ getColumnWidth,
1973
+ getColumnWidthStyle,
1974
+ hasAuthoredColumnWidthSpec,
1975
+ getColumnMinWidth,
1976
+ getColumnMaxWidth,
1977
+ isColumnHidden,
1978
+ isColumnResizable,
1979
+ getColumnWidths,
1980
+ getVisibleColumnWidths,
1981
+ getResolvedVisibleColumnWidths,
1982
+ hasRelativeVisibleColumnWidths,
1983
+ refreshMeasuredLayout,
1984
+ setColumnWidths,
1985
+ setColumnWidth,
1986
+ setHiddenColumns,
1987
+ measureColumnContentWidth,
1988
+ startColumnResize,
1989
+ endColumnResize,
1990
+ suppressHeaderClickOnce,
1991
+ consumeHeaderClickSuppression,
1992
+ hasResizableColumns,
1993
+ registerRow,
1994
+ unregisterRow,
1995
+ markBodyRowsInitialized,
1996
+ getHeaderRowCount,
1997
+ getBodyRowCount,
1998
+ isRowSelected,
1999
+ isRowFocused,
2000
+ isRowFocusTarget,
2001
+ getRowFocusEdge,
2002
+ isRowDisabled,
2003
+ isRowSelectionDisabled,
2004
+ isRowActionDisabled,
2005
+ isRowActionable,
2006
+ hasSelectableRows,
2007
+ getSelectionCheckboxState,
2008
+ registerCell,
2009
+ unregisterCell,
2010
+ isCellFocused,
2011
+ isCellTabStop,
2012
+ isRowTabStop,
2013
+ focusCellByKey,
2014
+ focusRowByToken,
2015
+ pressRow,
2016
+ setFocusedCell,
2017
+ setFocusedRow,
2018
+ setFocusVisible,
2019
+ moveFocus,
2020
+ moveToRowStart,
2021
+ moveToRowEnd,
2022
+ moveToBodyRowStart,
2023
+ moveToBodyRowEnd,
2024
+ moveToGridStart,
2025
+ moveToGridEnd,
2026
+ toggleRowSelection,
2027
+ selectAllRows,
2028
+ deselectAllRows,
2029
+ setSelection,
2030
+ setSelectionMode,
2031
+ setSelectionBehavior,
2032
+ setDisabledBehavior,
2033
+ setDisallowEmptySelection,
2034
+ setDisabledKeys,
2035
+ setRowActionHandler,
2036
+ setSortDescriptor,
2037
+ toggleSort,
2038
+ isColumnSortable,
2039
+ getSortDirection
2040
+ };
2041
+ }
2042
+ export function setTableContext(context) {
2043
+ setContext(TABLE_KEY, context);
2044
+ return context;
2045
+ }
2046
+ export function getTableContext() {
2047
+ return getContext(TABLE_KEY);
2048
+ }
2049
+ export function useTableContext() {
2050
+ const context = getTableContext();
2051
+ if (!context) {
2052
+ throw new Error('Table parts must be used inside `Table.Root`.');
2053
+ }
2054
+ return context;
2055
+ }
2056
+ export function setTableSectionContext(context) {
2057
+ setContext(TABLE_SECTION_KEY, context);
2058
+ return context;
2059
+ }
2060
+ export function getTableSectionContext() {
2061
+ return getContext(TABLE_SECTION_KEY);
2062
+ }
2063
+ export function useTableSectionContext() {
2064
+ const context = getTableSectionContext();
2065
+ if (!context) {
2066
+ throw new Error('Table section parts must be used inside `Table.Root`.');
2067
+ }
2068
+ return context;
2069
+ }
2070
+ export function setTableRowContext(context) {
2071
+ setContext(TABLE_ROW_KEY, context);
2072
+ return context;
2073
+ }
2074
+ export function getTableRowContext() {
2075
+ return getContext(TABLE_ROW_KEY);
2076
+ }
2077
+ export function useTableRowContext() {
2078
+ const context = getTableRowContext();
2079
+ if (!context) {
2080
+ throw new Error('Table cells must be used inside `Table.Row`.');
2081
+ }
2082
+ return context;
2083
+ }
2084
+ export function setTableCellContext(context) {
2085
+ setContext(TABLE_CELL_KEY, context);
2086
+ return context;
2087
+ }
2088
+ export function getTableCellContext() {
2089
+ return getContext(TABLE_CELL_KEY);
2090
+ }
2091
+ export function useTableCellContext() {
2092
+ const context = getTableCellContext();
2093
+ if (!context) {
2094
+ throw new Error('Table interactive cell parts must be used inside `Table.Cell` or `Table.ColumnHeaderCell`.');
2095
+ }
2096
+ return context;
2097
+ }
2098
+ export function setTableColumnContext(context) {
2099
+ setContext(TABLE_COLUMN_KEY, context);
2100
+ return context;
2101
+ }
2102
+ export function getTableColumnContext() {
2103
+ return getContext(TABLE_COLUMN_KEY);
2104
+ }
2105
+ export function useTableColumnContext() {
2106
+ const context = getTableColumnContext();
2107
+ if (!context) {
2108
+ throw new Error('`Table.ColumnHeaderCell` must be used inside `Table.Column`.');
2109
+ }
2110
+ return context;
2111
+ }