@proyecto-viviana/solidaria-components 0.3.1 → 0.4.0

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 (398) hide show
  1. package/dist/ActionBar.js +184 -0
  2. package/dist/ActionBar.js.map +1 -0
  3. package/dist/ActionBar.jsx +128 -0
  4. package/dist/ActionBar.jsx.map +1 -0
  5. package/dist/ActionGroup.js +179 -0
  6. package/dist/ActionGroup.js.map +1 -0
  7. package/dist/ActionGroup.jsx +129 -0
  8. package/dist/ActionGroup.jsx.map +1 -0
  9. package/dist/Alert.js +111 -0
  10. package/dist/Alert.js.map +1 -0
  11. package/dist/Alert.jsx +82 -0
  12. package/dist/Alert.jsx.map +1 -0
  13. package/dist/Autocomplete.js +130 -0
  14. package/dist/Autocomplete.js.map +1 -0
  15. package/dist/Autocomplete.jsx +116 -0
  16. package/dist/Autocomplete.jsx.map +1 -0
  17. package/dist/Breadcrumbs.d.ts.map +1 -1
  18. package/dist/Breadcrumbs.js +334 -0
  19. package/dist/Breadcrumbs.js.map +1 -0
  20. package/dist/Breadcrumbs.jsx +266 -0
  21. package/dist/Breadcrumbs.jsx.map +1 -0
  22. package/dist/Button.d.ts.map +1 -1
  23. package/dist/Button.js +348 -0
  24. package/dist/Button.js.map +1 -0
  25. package/dist/Button.jsx +314 -0
  26. package/dist/Button.jsx.map +1 -0
  27. package/dist/Calendar.d.ts +4 -4
  28. package/dist/Calendar.d.ts.map +1 -1
  29. package/dist/Calendar.js +538 -0
  30. package/dist/Calendar.js.map +1 -0
  31. package/dist/Calendar.jsx +333 -0
  32. package/dist/Calendar.jsx.map +1 -0
  33. package/dist/CalendarPicker.d.ts +33 -0
  34. package/dist/CalendarPicker.d.ts.map +1 -0
  35. package/dist/CalendarPicker.js +44 -0
  36. package/dist/CalendarPicker.js.map +1 -0
  37. package/dist/CalendarPicker.jsx +44 -0
  38. package/dist/CalendarPicker.jsx.map +1 -0
  39. package/dist/Checkbox.d.ts +83 -4
  40. package/dist/Checkbox.d.ts.map +1 -1
  41. package/dist/Checkbox.js +923 -0
  42. package/dist/Checkbox.js.map +1 -0
  43. package/dist/Checkbox.jsx +707 -0
  44. package/dist/Checkbox.jsx.map +1 -0
  45. package/dist/Collection.d.ts.map +1 -1
  46. package/dist/Collection.js +202 -0
  47. package/dist/Collection.js.map +1 -0
  48. package/dist/Collection.jsx +152 -0
  49. package/dist/Collection.jsx.map +1 -0
  50. package/dist/Color.d.ts.map +1 -1
  51. package/dist/Color.js +1720 -0
  52. package/dist/Color.js.map +1 -0
  53. package/dist/Color.jsx +1344 -0
  54. package/dist/Color.jsx.map +1 -0
  55. package/dist/ColorEditor.js +208 -0
  56. package/dist/ColorEditor.js.map +1 -0
  57. package/dist/ColorEditor.jsx +120 -0
  58. package/dist/ColorEditor.jsx.map +1 -0
  59. package/dist/ComboBox.d.ts +8 -5
  60. package/dist/ComboBox.d.ts.map +1 -1
  61. package/dist/ComboBox.js +992 -0
  62. package/dist/ComboBox.js.map +1 -0
  63. package/dist/ComboBox.jsx +714 -0
  64. package/dist/ComboBox.jsx.map +1 -0
  65. package/dist/ContextualHelpTrigger.js +146 -0
  66. package/dist/ContextualHelpTrigger.js.map +1 -0
  67. package/dist/ContextualHelpTrigger.jsx +109 -0
  68. package/dist/ContextualHelpTrigger.jsx.map +1 -0
  69. package/dist/DateField.d.ts +3 -3
  70. package/dist/DateField.d.ts.map +1 -1
  71. package/dist/DateField.js +4 -0
  72. package/dist/DateField.jsx +4 -0
  73. package/dist/DateField2.js +499 -0
  74. package/dist/DateField2.js.map +1 -0
  75. package/dist/DateField2.jsx +317 -0
  76. package/dist/DateField2.jsx.map +1 -0
  77. package/dist/DatePicker.d.ts +4 -4
  78. package/dist/DatePicker.d.ts.map +1 -1
  79. package/dist/DatePicker.js +991 -0
  80. package/dist/DatePicker.js.map +1 -0
  81. package/dist/DatePicker.jsx +682 -0
  82. package/dist/DatePicker.jsx.map +1 -0
  83. package/dist/Dialog.d.ts.map +1 -1
  84. package/dist/Dialog.js +337 -0
  85. package/dist/Dialog.js.map +1 -0
  86. package/dist/Dialog.jsx +192 -0
  87. package/dist/Dialog.jsx.map +1 -0
  88. package/dist/Disclosure.d.ts.map +1 -1
  89. package/dist/Disclosure.js +328 -0
  90. package/dist/Disclosure.js.map +1 -0
  91. package/dist/Disclosure.jsx +230 -0
  92. package/dist/Disclosure.jsx.map +1 -0
  93. package/dist/DragAndDrop.d.ts.map +1 -1
  94. package/dist/DragAndDrop.js +176 -0
  95. package/dist/DragAndDrop.js.map +1 -0
  96. package/dist/DragAndDrop.jsx +160 -0
  97. package/dist/DragAndDrop.jsx.map +1 -0
  98. package/dist/DropZone.d.ts.map +1 -1
  99. package/dist/DropZone.js +189 -0
  100. package/dist/DropZone.js.map +1 -0
  101. package/dist/DropZone.jsx +144 -0
  102. package/dist/DropZone.jsx.map +1 -0
  103. package/dist/FieldError.js +66 -0
  104. package/dist/FieldError.js.map +1 -0
  105. package/dist/FieldError.jsx +47 -0
  106. package/dist/FieldError.jsx.map +1 -0
  107. package/dist/FileTrigger.js +79 -0
  108. package/dist/FileTrigger.js.map +1 -0
  109. package/dist/FileTrigger.jsx +49 -0
  110. package/dist/FileTrigger.jsx.map +1 -0
  111. package/dist/Focusable.js +70 -0
  112. package/dist/Focusable.js.map +1 -0
  113. package/dist/Focusable.jsx +69 -0
  114. package/dist/Focusable.jsx.map +1 -0
  115. package/dist/Form.js +99 -0
  116. package/dist/Form.js.map +1 -0
  117. package/dist/Form.jsx +73 -0
  118. package/dist/Form.jsx.map +1 -0
  119. package/dist/GridList.d.ts +34 -2
  120. package/dist/GridList.d.ts.map +1 -1
  121. package/dist/GridList.js +723 -0
  122. package/dist/GridList.js.map +1 -0
  123. package/dist/GridList.jsx +552 -0
  124. package/dist/GridList.jsx.map +1 -0
  125. package/dist/HiddenTimeInput.js +104 -0
  126. package/dist/HiddenTimeInput.js.map +1 -0
  127. package/dist/HiddenTimeInput.jsx +69 -0
  128. package/dist/HiddenTimeInput.jsx.map +1 -0
  129. package/dist/Icon.d.ts.map +1 -1
  130. package/dist/Icon.js +127 -0
  131. package/dist/Icon.js.map +1 -0
  132. package/dist/Icon.jsx +72 -0
  133. package/dist/Icon.jsx.map +1 -0
  134. package/dist/Keyboard.js +30 -0
  135. package/dist/Keyboard.js.map +1 -0
  136. package/dist/Keyboard.jsx +24 -0
  137. package/dist/Keyboard.jsx.map +1 -0
  138. package/dist/Landmark.js +134 -0
  139. package/dist/Landmark.js.map +1 -0
  140. package/dist/Landmark.jsx +118 -0
  141. package/dist/Landmark.jsx.map +1 -0
  142. package/dist/Link.d.ts.map +1 -1
  143. package/dist/Link.js +219 -0
  144. package/dist/Link.js.map +1 -0
  145. package/dist/Link.jsx +189 -0
  146. package/dist/Link.jsx.map +1 -0
  147. package/dist/ListBox.d.ts.map +1 -1
  148. package/dist/ListBox.js +670 -0
  149. package/dist/ListBox.js.map +1 -0
  150. package/dist/ListBox.jsx +508 -0
  151. package/dist/ListBox.jsx.map +1 -0
  152. package/dist/Menu.d.ts +27 -9
  153. package/dist/Menu.d.ts.map +1 -1
  154. package/dist/Menu.js +1254 -0
  155. package/dist/Menu.js.map +1 -0
  156. package/dist/Menu.jsx +1042 -0
  157. package/dist/Menu.jsx.map +1 -0
  158. package/dist/Meter.d.ts.map +1 -1
  159. package/dist/Meter.js +123 -0
  160. package/dist/Meter.js.map +1 -0
  161. package/dist/Meter.jsx +107 -0
  162. package/dist/Meter.jsx.map +1 -0
  163. package/dist/Modal.d.ts.map +1 -1
  164. package/dist/Modal.js +380 -0
  165. package/dist/Modal.js.map +1 -0
  166. package/dist/Modal.jsx +314 -0
  167. package/dist/Modal.jsx.map +1 -0
  168. package/dist/NumberField.d.ts +3 -3
  169. package/dist/NumberField.d.ts.map +1 -1
  170. package/dist/NumberField.js +573 -0
  171. package/dist/NumberField.js.map +1 -0
  172. package/dist/NumberField.jsx +443 -0
  173. package/dist/NumberField.jsx.map +1 -0
  174. package/dist/Popover.d.ts +10 -2
  175. package/dist/Popover.d.ts.map +1 -1
  176. package/dist/Popover.js +464 -0
  177. package/dist/Popover.js.map +1 -0
  178. package/dist/Popover.jsx +333 -0
  179. package/dist/Popover.jsx.map +1 -0
  180. package/dist/Pressable.js +69 -0
  181. package/dist/Pressable.js.map +1 -0
  182. package/dist/Pressable.jsx +68 -0
  183. package/dist/Pressable.jsx.map +1 -0
  184. package/dist/ProgressBar.d.ts.map +1 -1
  185. package/dist/ProgressBar.js +130 -0
  186. package/dist/ProgressBar.js.map +1 -0
  187. package/dist/ProgressBar.jsx +114 -0
  188. package/dist/ProgressBar.jsx.map +1 -0
  189. package/dist/RadioGroup.d.ts +82 -4
  190. package/dist/RadioGroup.d.ts.map +1 -1
  191. package/dist/RadioGroup.js +931 -0
  192. package/dist/RadioGroup.js.map +1 -0
  193. package/dist/RadioGroup.jsx +681 -0
  194. package/dist/RadioGroup.jsx.map +1 -0
  195. package/dist/RangeCalendar.d.ts.map +1 -1
  196. package/dist/RangeCalendar.js +410 -0
  197. package/dist/RangeCalendar.js.map +1 -0
  198. package/dist/RangeCalendar.jsx +253 -0
  199. package/dist/RangeCalendar.jsx.map +1 -0
  200. package/dist/RouterProvider.js +118 -0
  201. package/dist/RouterProvider.js.map +1 -0
  202. package/dist/RouterProvider.jsx +112 -0
  203. package/dist/RouterProvider.jsx.map +1 -0
  204. package/dist/SearchField.d.ts +2 -2
  205. package/dist/SearchField.d.ts.map +1 -1
  206. package/dist/SearchField.js +643 -0
  207. package/dist/SearchField.js.map +1 -0
  208. package/dist/SearchField.jsx +526 -0
  209. package/dist/SearchField.jsx.map +1 -0
  210. package/dist/Select.d.ts.map +1 -1
  211. package/dist/Select.js +1031 -0
  212. package/dist/Select.js.map +1 -0
  213. package/dist/Select.jsx +744 -0
  214. package/dist/Select.jsx.map +1 -0
  215. package/dist/SelectionIndicator.d.ts.map +1 -1
  216. package/dist/SelectionIndicator.js +86 -0
  217. package/dist/SelectionIndicator.js.map +1 -0
  218. package/dist/SelectionIndicator.jsx +50 -0
  219. package/dist/SelectionIndicator.jsx.map +1 -0
  220. package/dist/Separator.js +97 -0
  221. package/dist/Separator.js.map +1 -0
  222. package/dist/Separator.jsx +85 -0
  223. package/dist/Separator.jsx.map +1 -0
  224. package/dist/SharedElementTransition.d.ts.map +1 -1
  225. package/dist/SharedElementTransition.js +165 -0
  226. package/dist/SharedElementTransition.js.map +1 -0
  227. package/dist/SharedElementTransition.jsx +138 -0
  228. package/dist/SharedElementTransition.jsx.map +1 -0
  229. package/dist/Slider.d.ts +33 -1
  230. package/dist/Slider.d.ts.map +1 -1
  231. package/dist/Slider.js +515 -0
  232. package/dist/Slider.js.map +1 -0
  233. package/dist/Slider.jsx +403 -0
  234. package/dist/Slider.jsx.map +1 -0
  235. package/dist/StepList.js +198 -0
  236. package/dist/StepList.js.map +1 -0
  237. package/dist/StepList.jsx +141 -0
  238. package/dist/StepList.jsx.map +1 -0
  239. package/dist/Switch.d.ts +65 -2
  240. package/dist/Switch.d.ts.map +1 -1
  241. package/dist/Switch.js +534 -0
  242. package/dist/Switch.js.map +1 -0
  243. package/dist/Switch.jsx +393 -0
  244. package/dist/Switch.jsx.map +1 -0
  245. package/dist/Table.d.ts +48 -0
  246. package/dist/Table.d.ts.map +1 -1
  247. package/dist/Table.js +1759 -0
  248. package/dist/Table.js.map +1 -0
  249. package/dist/Table.jsx +1348 -0
  250. package/dist/Table.jsx.map +1 -0
  251. package/dist/Tabs.d.ts +0 -4
  252. package/dist/Tabs.d.ts.map +1 -1
  253. package/dist/Tabs.js +595 -0
  254. package/dist/Tabs.js.map +1 -0
  255. package/dist/Tabs.jsx +367 -0
  256. package/dist/Tabs.jsx.map +1 -0
  257. package/dist/TagGroup.d.ts.map +1 -1
  258. package/dist/TagGroup.js +378 -0
  259. package/dist/TagGroup.js.map +1 -0
  260. package/dist/TagGroup.jsx +270 -0
  261. package/dist/TagGroup.jsx.map +1 -0
  262. package/dist/Text.d.ts +18 -6
  263. package/dist/Text.d.ts.map +1 -1
  264. package/dist/Text.js +42 -0
  265. package/dist/Text.js.map +1 -0
  266. package/dist/Text.jsx +35 -0
  267. package/dist/Text.jsx.map +1 -0
  268. package/dist/TextField.d.ts +7 -6
  269. package/dist/TextField.d.ts.map +1 -1
  270. package/dist/TextField.js +436 -0
  271. package/dist/TextField.js.map +1 -0
  272. package/dist/TextField.jsx +403 -0
  273. package/dist/TextField.jsx.map +1 -0
  274. package/dist/TimeField.d.ts +3 -3
  275. package/dist/TimeField.d.ts.map +1 -1
  276. package/dist/TimeField.js +372 -0
  277. package/dist/TimeField.js.map +1 -0
  278. package/dist/TimeField.jsx +224 -0
  279. package/dist/TimeField.jsx.map +1 -0
  280. package/dist/Toast.d.ts +14 -0
  281. package/dist/Toast.d.ts.map +1 -1
  282. package/dist/Toast.js +551 -0
  283. package/dist/Toast.js.map +1 -0
  284. package/dist/Toast.jsx +361 -0
  285. package/dist/Toast.jsx.map +1 -0
  286. package/dist/ToggleButton.d.ts.map +1 -1
  287. package/dist/ToggleButton.js +123 -0
  288. package/dist/ToggleButton.js.map +1 -0
  289. package/dist/ToggleButton.jsx +88 -0
  290. package/dist/ToggleButton.jsx.map +1 -0
  291. package/dist/ToggleButtonGroup.d.ts.map +1 -1
  292. package/dist/ToggleButtonGroup.js +114 -0
  293. package/dist/ToggleButtonGroup.js.map +1 -0
  294. package/dist/ToggleButtonGroup.jsx +85 -0
  295. package/dist/ToggleButtonGroup.jsx.map +1 -0
  296. package/dist/Toolbar.js +112 -0
  297. package/dist/Toolbar.js.map +1 -0
  298. package/dist/Toolbar.jsx +92 -0
  299. package/dist/Toolbar.jsx.map +1 -0
  300. package/dist/Tooltip.d.ts.map +1 -1
  301. package/dist/Tooltip.js +539 -0
  302. package/dist/Tooltip.js.map +1 -0
  303. package/dist/Tooltip.jsx +465 -0
  304. package/dist/Tooltip.jsx.map +1 -0
  305. package/dist/Tree.d.ts +14 -2
  306. package/dist/Tree.d.ts.map +1 -1
  307. package/dist/Tree.js +1424 -0
  308. package/dist/Tree.js.map +1 -0
  309. package/dist/Tree.jsx +1172 -0
  310. package/dist/Tree.jsx.map +1 -0
  311. package/dist/Virtualizer.d.ts +16 -2
  312. package/dist/Virtualizer.d.ts.map +1 -1
  313. package/dist/Virtualizer.js +2 -0
  314. package/dist/Virtualizer.jsx +2 -0
  315. package/dist/Virtualizer2.js +751 -0
  316. package/dist/Virtualizer2.js.map +1 -0
  317. package/dist/Virtualizer2.jsx +730 -0
  318. package/dist/Virtualizer2.jsx.map +1 -0
  319. package/dist/VirtualizerLayouts.d.ts +18 -0
  320. package/dist/VirtualizerLayouts.d.ts.map +1 -1
  321. package/dist/VisuallyHidden.js +42 -0
  322. package/dist/VisuallyHidden.js.map +1 -0
  323. package/dist/VisuallyHidden.jsx +35 -0
  324. package/dist/VisuallyHidden.jsx.map +1 -0
  325. package/dist/contexts.js +33 -0
  326. package/dist/contexts.js.map +1 -0
  327. package/dist/contexts.jsx +33 -0
  328. package/dist/contexts.jsx.map +1 -0
  329. package/dist/index.d.ts +7 -6
  330. package/dist/index.d.ts.map +1 -1
  331. package/dist/index.js +70 -23711
  332. package/dist/index.jsx +70 -18116
  333. package/dist/useDragAndDrop.js +2 -0
  334. package/dist/useDragAndDrop.jsx +2 -0
  335. package/dist/useDragAndDrop2.js +395 -0
  336. package/dist/useDragAndDrop2.js.map +1 -0
  337. package/dist/useDragAndDrop2.jsx +395 -0
  338. package/dist/useDragAndDrop2.jsx.map +1 -0
  339. package/dist/utils.d.ts +83 -11
  340. package/dist/utils.d.ts.map +1 -1
  341. package/dist/utils.js +285 -0
  342. package/dist/utils.js.map +1 -0
  343. package/dist/utils.jsx +277 -0
  344. package/dist/utils.jsx.map +1 -0
  345. package/dist/virtualizer/Layout.js +144 -0
  346. package/dist/virtualizer/Layout.js.map +1 -0
  347. package/dist/virtualizer/Layout.jsx +144 -0
  348. package/dist/virtualizer/Layout.jsx.map +1 -0
  349. package/package.json +401 -4
  350. package/src/Breadcrumbs.tsx +3 -1
  351. package/src/Button.tsx +90 -23
  352. package/src/Calendar.tsx +27 -10
  353. package/src/CalendarPicker.tsx +73 -0
  354. package/src/Checkbox.tsx +539 -3
  355. package/src/Collection.tsx +9 -3
  356. package/src/Color.tsx +42 -14
  357. package/src/ComboBox.tsx +126 -14
  358. package/src/DateField.tsx +20 -2
  359. package/src/DatePicker.tsx +117 -10
  360. package/src/Dialog.tsx +13 -5
  361. package/src/Disclosure.tsx +3 -1
  362. package/src/DragAndDrop.tsx +3 -1
  363. package/src/DropZone.tsx +3 -1
  364. package/src/GridList.tsx +125 -24
  365. package/src/Icon.tsx +3 -1
  366. package/src/Link.tsx +3 -1
  367. package/src/ListBox.tsx +31 -4
  368. package/src/Menu.tsx +298 -131
  369. package/src/Meter.tsx +3 -1
  370. package/src/Modal.tsx +100 -52
  371. package/src/NumberField.tsx +73 -10
  372. package/src/Popover.tsx +49 -11
  373. package/src/ProgressBar.tsx +3 -1
  374. package/src/RadioGroup.tsx +468 -4
  375. package/src/RangeCalendar.tsx +3 -1
  376. package/src/SearchField.tsx +27 -3
  377. package/src/Select.tsx +22 -7
  378. package/src/SelectionIndicator.tsx +3 -1
  379. package/src/SharedElementTransition.tsx +3 -1
  380. package/src/Slider.tsx +159 -13
  381. package/src/Switch.tsx +395 -2
  382. package/src/Table.tsx +409 -95
  383. package/src/Tabs.tsx +16 -45
  384. package/src/TagGroup.tsx +4 -1
  385. package/src/Text.tsx +31 -10
  386. package/src/TextField.tsx +73 -10
  387. package/src/TimeField.tsx +20 -2
  388. package/src/Toast.tsx +79 -14
  389. package/src/ToggleButton.tsx +3 -1
  390. package/src/ToggleButtonGroup.tsx +3 -1
  391. package/src/Tooltip.tsx +55 -8
  392. package/src/Tree.tsx +77 -9
  393. package/src/Virtualizer.tsx +180 -31
  394. package/src/VirtualizerLayouts.ts +45 -10
  395. package/src/index.ts +50 -0
  396. package/src/utils.tsx +243 -27
  397. package/dist/index.js.map +0 -1
  398. package/dist/index.jsx.map +0 -1
package/dist/Table.jsx ADDED
@@ -0,0 +1,1348 @@
1
+ import { dataAttr, filterDOMProps, useRenderProps } from "./utils.jsx";
2
+ import { ButtonContext } from "./Button.jsx";
3
+ import { SharedElementTransition } from "./SharedElementTransition.jsx";
4
+ import { useLinkProps, useRouter } from "./RouterProvider.jsx";
5
+ import { CollectionRendererContext, useCollectionRenderer } from "./Collection.jsx";
6
+ import { r as useVirtualizerContext } from "./Virtualizer2.jsx";
7
+ import { getNormalizedDropTargetKey, mergePersistedKeysIntoVirtualRange, useDndPersistedKeys, useRenderDropIndicator } from "./DragAndDrop.jsx";
8
+ import { For, Show, createContext, createEffect, createMemo, createSignal, createUniqueId, onCleanup, splitProps, untrack, useContext } from "solid-js";
9
+ import { createFocusRing, createHover, createTable, createTableCell, createTableColumnHeader, createTableColumnResize, createTableRow, createTableRowGroup, createTableSelectAllCheckbox, createTableSelectionCheckbox, getTableData, isFocusVisible, mergeProps as mergeProps$1 } from "@proyecto-viviana/solidaria";
10
+ import { createTableCollection, createTableColumnResizeState, createTableState, createTreeGridState } from "@proyecto-viviana/solid-stately";
11
+ //#region src/Table.tsx
12
+ /**
13
+ * Table component for solidaria-components
14
+ *
15
+ * A pre-wired headless table that combines state + aria hooks.
16
+ * Based on react-aria-components/src/Table.tsx
17
+ */
18
+ function assignRef(ref, el) {
19
+ if (!ref) return;
20
+ if (typeof ref === "function") ref(el);
21
+ else ref.current = el;
22
+ }
23
+ function normalizeColumnDefinitions(columns, parentKey) {
24
+ return columns.map((column, index) => {
25
+ const key = column.key ?? column.id ?? (parentKey == null ? index : `${parentKey}-${index}`);
26
+ const id = column.id ?? column.key;
27
+ return {
28
+ ...column,
29
+ key,
30
+ id,
31
+ children: column.children ? normalizeColumnDefinitions(column.children, key) : void 0
32
+ };
33
+ });
34
+ }
35
+ /** Resolves a stable, unique key for a tree-grid item (keys must be unique across levels). */
36
+ function resolveItemKey(item, getKey, index) {
37
+ if (getKey) return getKey(item);
38
+ const record = item;
39
+ return record.id ?? record.key ?? index;
40
+ }
41
+ /**
42
+ * Turns the flat `items` into nested {@link RowDefinition}s by recursively expanding each
43
+ * item's children via `getChildItems`. The result feeds the tree-grid collection.
44
+ */
45
+ function toTreeRowDefinitions(items, getKey, getChildItems) {
46
+ return Array.from(items).map((item, index) => {
47
+ const childItems = getChildItems?.(item);
48
+ const childRows = childItems ? toTreeRowDefinitions(childItems, getKey, getChildItems) : void 0;
49
+ return {
50
+ key: resolveItemKey(item, getKey, index),
51
+ value: item,
52
+ childRows: childRows && childRows.length > 0 ? childRows : void 0
53
+ };
54
+ });
55
+ }
56
+ function getRowHeaderColumnKeys(columns) {
57
+ const keys = /* @__PURE__ */ new Set();
58
+ for (const column of columns) {
59
+ if (column.isRowHeader) keys.add(column.key);
60
+ if (column.children) for (const key of getRowHeaderColumnKeys(column.children)) keys.add(key);
61
+ }
62
+ return keys;
63
+ }
64
+ const TableContext = createContext(null);
65
+ const TableStateContext = createContext(null);
66
+ /** The resize context carries a getter for the resize state. The getter may return null before columns register. */
67
+ const TableColumnResizeStateContext = createContext(null);
68
+ const TableRowContext = createContext(null);
69
+ /**
70
+ * A table displays data in rows and columns and enables a user to navigate its contents via directional navigation keys,
71
+ * and optionally supports row selection and sorting.
72
+ */
73
+ function Table(props) {
74
+ const [local, stateProps, ariaProps] = splitProps(props, [
75
+ "class",
76
+ "style",
77
+ "render",
78
+ "slot",
79
+ "renderEmptyState",
80
+ "dragAndDropHooks",
81
+ "ref"
82
+ ], [
83
+ "items",
84
+ "columns",
85
+ "getKey",
86
+ "getTextValue",
87
+ "disabledKeys",
88
+ "disabledBehavior",
89
+ "escapeKeyBehavior",
90
+ "selectionMode",
91
+ "selectionBehavior",
92
+ "selectedKeys",
93
+ "defaultSelectedKeys",
94
+ "onSelectionChange",
95
+ "sortDescriptor",
96
+ "onSortChange",
97
+ "showSelectionCheckboxes",
98
+ "UNSTABLE_childItems",
99
+ "UNSTABLE_expandedKeys",
100
+ "UNSTABLE_defaultExpandedKeys",
101
+ "UNSTABLE_onExpandedChange"
102
+ ]);
103
+ const [ref, setRef] = createSignal(null);
104
+ const normalizedColumns = createMemo(() => normalizeColumnDefinitions(stateProps.columns));
105
+ const rowHeaderColumnKeys = createMemo(() => getRowHeaderColumnKeys(normalizedColumns()));
106
+ const isTreeGrid = stateProps.UNSTABLE_childItems !== void 0 || stateProps.UNSTABLE_expandedKeys !== void 0 || stateProps.UNSTABLE_defaultExpandedKeys !== void 0 || stateProps.UNSTABLE_onExpandedChange !== void 0;
107
+ const getTextValue = () => stateProps.getTextValue;
108
+ const state = isTreeGrid ? createTreeGridState(() => ({
109
+ columns: normalizedColumns(),
110
+ rows: toTreeRowDefinitions(stateProps.items, stateProps.getKey, stateProps.UNSTABLE_childItems),
111
+ getKey: stateProps.getKey,
112
+ getTextValue: getTextValue(),
113
+ showSelectionCheckboxes: stateProps.showSelectionCheckboxes ?? false,
114
+ rowHeaderColumnKeys: rowHeaderColumnKeys().size > 0 ? rowHeaderColumnKeys() : void 0,
115
+ disabledKeys: stateProps.disabledKeys,
116
+ disabledBehavior: stateProps.disabledBehavior,
117
+ selectionMode: stateProps.selectionMode,
118
+ selectionBehavior: stateProps.selectionBehavior,
119
+ selectedKeys: stateProps.selectedKeys,
120
+ defaultSelectedKeys: stateProps.defaultSelectedKeys,
121
+ onSelectionChange: stateProps.onSelectionChange,
122
+ sortDescriptor: stateProps.sortDescriptor,
123
+ onSortChange: stateProps.onSortChange,
124
+ UNSTABLE_expandedKeys: stateProps.UNSTABLE_expandedKeys,
125
+ UNSTABLE_defaultExpandedKeys: stateProps.UNSTABLE_defaultExpandedKeys,
126
+ UNSTABLE_onExpandedChange: stateProps.UNSTABLE_onExpandedChange
127
+ })) : createTableState(() => ({
128
+ collection: createTableCollection({
129
+ columns: normalizedColumns(),
130
+ rows: stateProps.items,
131
+ getKey: stateProps.getKey,
132
+ getTextValue: getTextValue(),
133
+ showSelectionCheckboxes: stateProps.showSelectionCheckboxes ?? false,
134
+ rowHeaderColumnKeys: rowHeaderColumnKeys().size > 0 ? rowHeaderColumnKeys() : void 0
135
+ }),
136
+ disabledKeys: stateProps.disabledKeys,
137
+ disabledBehavior: stateProps.disabledBehavior,
138
+ selectionMode: stateProps.selectionMode,
139
+ selectionBehavior: stateProps.selectionBehavior,
140
+ selectedKeys: stateProps.selectedKeys,
141
+ defaultSelectedKeys: stateProps.defaultSelectedKeys,
142
+ onSelectionChange: stateProps.onSelectionChange,
143
+ sortDescriptor: stateProps.sortDescriptor,
144
+ onSortChange: stateProps.onSortChange,
145
+ showSelectionCheckboxes: stateProps.showSelectionCheckboxes
146
+ }));
147
+ const collection = () => state.collection;
148
+ const parentCollectionRenderer = useCollectionRenderer();
149
+ const { gridProps } = createTable(() => ({
150
+ id: ariaProps.id,
151
+ "aria-label": ariaProps["aria-label"],
152
+ "aria-labelledby": ariaProps["aria-labelledby"],
153
+ "aria-describedby": ariaProps["aria-describedby"],
154
+ isVirtualized: ariaProps.isVirtualized ?? parentCollectionRenderer?.isVirtualized,
155
+ onRowAction: ariaProps.onRowAction,
156
+ onCellAction: ariaProps.onCellAction,
157
+ shouldSelectOnPressUp: ariaProps.shouldSelectOnPressUp,
158
+ focusMode: ariaProps.focusMode,
159
+ escapeKeyBehavior: stateProps.escapeKeyBehavior
160
+ }), () => state, ref);
161
+ const { isFocused, isFocusVisible, focusProps } = createFocusRing();
162
+ const renderValues = createMemo(() => ({
163
+ isFocused: state.isFocused || isFocused(),
164
+ isFocusVisible: isFocusVisible(),
165
+ isDisabled: false,
166
+ isEmpty: stateProps.items.length === 0
167
+ }));
168
+ const renderProps = useRenderProps({
169
+ class: local.class,
170
+ style: local.style,
171
+ defaultClassName: "solidaria-Table"
172
+ }, renderValues);
173
+ const domProps = createMemo(() => {
174
+ return filterDOMProps(ariaProps, { global: true });
175
+ });
176
+ const cleanGridProps = () => {
177
+ const { ref: _ref1, ...rest } = gridProps;
178
+ return rest;
179
+ };
180
+ const cleanFocusProps = () => {
181
+ const { ref: _ref2, ...rest } = focusProps;
182
+ return rest;
183
+ };
184
+ const getItemNodes = createMemo(() => Array.from(state.collection).filter((node) => node.type === "item"));
185
+ const getDropTargetByIndex = (index, position) => {
186
+ const node = getItemNodes()[index];
187
+ if (!node) return null;
188
+ return {
189
+ type: "item",
190
+ key: node.key,
191
+ dropPosition: position
192
+ };
193
+ };
194
+ const hasDroppableDnd = createMemo(() => {
195
+ const hooks = local.dragAndDropHooks;
196
+ return Boolean(hooks?.useDroppableCollectionState && hooks.useDroppableCollection && (hooks.dropTargetDelegate || parentCollectionRenderer?.dropTargetDelegate || hooks.ListDropTargetDelegate));
197
+ });
198
+ const hasDraggableDnd = createMemo(() => {
199
+ const hooks = local.dragAndDropHooks;
200
+ return Boolean(hooks?.useDraggableCollectionState && hooks.useDraggableCollection);
201
+ });
202
+ const dragState = createMemo(() => {
203
+ if (!hasDraggableDnd()) return void 0;
204
+ return local.dragAndDropHooks?.useDraggableCollectionState?.({ items: stateProps.items });
205
+ });
206
+ const dropState = createMemo(() => {
207
+ if (!hasDroppableDnd()) return void 0;
208
+ return local.dragAndDropHooks?.useDroppableCollectionState?.({});
209
+ });
210
+ createEffect(() => {
211
+ if (!hasDraggableDnd()) return;
212
+ const hooks = local.dragAndDropHooks;
213
+ const activeDragState = dragState();
214
+ if (!hooks?.useDraggableCollection || !activeDragState) return;
215
+ hooks.useDraggableCollection({}, activeDragState, () => ref());
216
+ });
217
+ const droppableCollection = createMemo(() => {
218
+ if (!hasDroppableDnd()) return void 0;
219
+ const hooks = local.dragAndDropHooks;
220
+ const activeDropState = dropState();
221
+ if (!hooks?.useDroppableCollection || !activeDropState) return void 0;
222
+ const resolveDirection = () => {
223
+ const el = ref();
224
+ if (el && typeof window !== "undefined" && typeof window.getComputedStyle === "function") {
225
+ if (window.getComputedStyle(el).direction === "rtl") return "rtl";
226
+ }
227
+ return typeof document !== "undefined" && document.dir === "rtl" ? "rtl" : "ltr";
228
+ };
229
+ const dropTargetDelegate = hooks.dropTargetDelegate ?? parentCollectionRenderer?.dropTargetDelegate ?? (hooks.ListDropTargetDelegate ? new hooks.ListDropTargetDelegate(() => state.collection, () => ref(), {
230
+ layout: "grid",
231
+ orientation: "vertical",
232
+ direction: resolveDirection()
233
+ }) : void 0);
234
+ if (!dropTargetDelegate) return void 0;
235
+ return hooks.useDroppableCollection({
236
+ dropTargetDelegate,
237
+ keyboardDelegate: {
238
+ getFirstKey: () => state.collection.getFirstKey?.() ?? null,
239
+ getLastKey: () => state.collection.getLastKey?.() ?? null,
240
+ getKeyBelow: (key) => state.collection.getKeyAfter?.(key) ?? null,
241
+ getKeyAbove: (key) => state.collection.getKeyBefore?.(key) ?? null,
242
+ getKeyLeftOf: (key) => resolveDirection() === "rtl" ? state.collection.getKeyAfter?.(key) ?? null : state.collection.getKeyBefore?.(key) ?? null,
243
+ getKeyRightOf: (key) => resolveDirection() === "rtl" ? state.collection.getKeyBefore?.(key) ?? null : state.collection.getKeyAfter?.(key) ?? null,
244
+ getKeyPageBelow: (key) => state.collection.getKeyAfter?.(key) ?? null,
245
+ getKeyPageAbove: (key) => state.collection.getKeyBefore?.(key) ?? null
246
+ },
247
+ get collection() {
248
+ return state.collection;
249
+ },
250
+ get selectedKeys() {
251
+ return state.selectedKeys;
252
+ },
253
+ setSelectedKeys: (keys) => {
254
+ if (state.selectionMode === "none") return;
255
+ state.clearSelection();
256
+ for (const key of keys) state.toggleSelection(key);
257
+ },
258
+ setFocusedKey: (key) => state.setFocusedKey(key)
259
+ }, activeDropState, () => ref());
260
+ });
261
+ const isRootDropTarget = createMemo(() => {
262
+ return Boolean(dropState()?.target?.type === "root");
263
+ });
264
+ const dndRenderDropIndicator = createMemo(() => useRenderDropIndicator(local.dragAndDropHooks, dropState()));
265
+ const dndDropIndicator = (index, position) => {
266
+ const target = getDropTargetByIndex(index, position);
267
+ if (!target || target.type !== "item") return void 0;
268
+ return dndRenderDropIndicator()?.(target);
269
+ };
270
+ const contextValue = {
271
+ state,
272
+ get collection() {
273
+ return collection();
274
+ },
275
+ get items() {
276
+ return stateProps.items;
277
+ },
278
+ get columns() {
279
+ return normalizedColumns();
280
+ },
281
+ isDisabled: false,
282
+ get showSelectionCheckboxes() {
283
+ return stateProps.showSelectionCheckboxes ?? false;
284
+ },
285
+ get dragAndDropHooks() {
286
+ return local.dragAndDropHooks;
287
+ },
288
+ get dragState() {
289
+ return dragState();
290
+ },
291
+ get dropState() {
292
+ return dropState();
293
+ },
294
+ get isVirtualized() {
295
+ return ariaProps.isVirtualized ?? parentCollectionRenderer?.isVirtualized ?? false;
296
+ }
297
+ };
298
+ const collectionRenderer = createMemo(() => ({
299
+ ...parentCollectionRenderer,
300
+ renderItem: (item) => item,
301
+ renderDropIndicator: (index, position) => dndDropIndicator(index, position) ?? parentCollectionRenderer?.renderDropIndicator?.(index, position)
302
+ }));
303
+ const tableChildren = () => typeof props.children === "function" ? props.children(untrack(renderValues)) : props.children;
304
+ const tableProps = () => ({
305
+ ref: (el) => {
306
+ setRef(el);
307
+ assignRef(local.ref, el);
308
+ },
309
+ ...mergeProps$1(domProps(), cleanGridProps(), cleanFocusProps(), droppableCollection()?.collectionProps ?? {}),
310
+ class: renderProps.class(),
311
+ style: renderProps.style(),
312
+ "data-focused": state.isFocused || void 0,
313
+ "data-focus-visible": isFocusVisible() || void 0,
314
+ "data-empty": stateProps.items.length === 0 || void 0,
315
+ "data-drop-target": isRootDropTarget() || void 0,
316
+ slot: local.slot
317
+ });
318
+ return <TableContext.Provider value={contextValue}>
319
+ <TableStateContext.Provider value={state}>
320
+ <CollectionRendererContext.Provider value={collectionRenderer()}>
321
+ {local.render ? local.render({
322
+ ...tableProps(),
323
+ children: tableChildren()
324
+ }, renderValues()) : <table {...tableProps()}>{tableChildren()}</table>}
325
+ </CollectionRendererContext.Provider>
326
+ </TableStateContext.Provider>
327
+ </TableContext.Provider>;
328
+ }
329
+ /**
330
+ * A header row in a table containing column headers.
331
+ */
332
+ function TableHeader(props) {
333
+ const [local, domProps] = splitProps(props, [
334
+ "class",
335
+ "style",
336
+ "render",
337
+ "slot",
338
+ "children",
339
+ "ref"
340
+ ]);
341
+ if (!useContext(TableContext)) throw new Error("TableHeader must be used within a Table");
342
+ const { rowGroupProps } = createTableRowGroup(() => ({ type: "thead" }));
343
+ const { isHovered, hoverProps } = createHover({
344
+ isDisabled: false,
345
+ onHoverStart(e) {
346
+ domProps.onHoverStart?.(e);
347
+ },
348
+ onHoverEnd(e) {
349
+ domProps.onHoverEnd?.(e);
350
+ },
351
+ onHoverChange(isHovering) {
352
+ domProps.onHoverChange?.(isHovering);
353
+ }
354
+ });
355
+ const renderValues = createMemo(() => ({
356
+ isFocused: false,
357
+ isHovered: isHovered()
358
+ }));
359
+ const renderProps = useRenderProps({
360
+ class: local.class,
361
+ style: local.style,
362
+ defaultClassName: "solidaria-Table-header"
363
+ }, renderValues);
364
+ const cleanRowGroupProps = () => {
365
+ const { ref: _ref, ...rest } = rowGroupProps;
366
+ return rest;
367
+ };
368
+ const cleanHoverProps = () => {
369
+ const { ref: _ref, ...rest } = hoverProps;
370
+ return rest;
371
+ };
372
+ const headerProps = () => ({
373
+ ref: (el) => assignRef(local.ref, el),
374
+ ...domProps,
375
+ ...cleanRowGroupProps(),
376
+ ...cleanHoverProps(),
377
+ class: renderProps.class(),
378
+ style: renderProps.style(),
379
+ "data-hovered": isHovered() || void 0,
380
+ children: <tr role="row">{local.children}</tr>
381
+ });
382
+ return local.render ? local.render(headerProps(), renderValues()) : <thead ref={(el) => assignRef(local.ref, el)} {...domProps} {...cleanRowGroupProps()} {...cleanHoverProps()} class={renderProps.class()} style={renderProps.style()} data-hovered={isHovered() || void 0}>
383
+ <tr role="row">{local.children}</tr>
384
+ </thead>;
385
+ }
386
+ /**
387
+ * A column header in a table.
388
+ */
389
+ function TableColumn(props) {
390
+ const [local, domProps] = splitProps(props, [
391
+ "class",
392
+ "style",
393
+ "render",
394
+ "slot",
395
+ "id",
396
+ "allowsSorting",
397
+ "allowsResizing",
398
+ "width",
399
+ "defaultWidth",
400
+ "minWidth",
401
+ "maxWidth",
402
+ "children",
403
+ "ref"
404
+ ]);
405
+ const context = useContext(TableContext);
406
+ if (!context) throw new Error("TableColumn must be used within a Table");
407
+ const { state, collection } = context;
408
+ const [ref, setRef] = createSignal(null);
409
+ const columnNode = createMemo(() => {
410
+ const node = collection.getItem(local.id);
411
+ if (!node) return {
412
+ type: "column",
413
+ key: local.id,
414
+ value: null,
415
+ textValue: String(local.id),
416
+ level: 0,
417
+ index: 0,
418
+ hasChildNodes: false,
419
+ childNodes: []
420
+ };
421
+ return node;
422
+ });
423
+ const columnHeaderAria = createTableColumnHeader(() => ({
424
+ node: columnNode(),
425
+ allowsSorting: local.allowsSorting
426
+ }), () => state, ref);
427
+ const { isHovered, hoverProps } = createHover({
428
+ get isDisabled() {
429
+ return !local.allowsSorting;
430
+ },
431
+ onHoverStart(e) {
432
+ domProps.onHoverStart?.(e);
433
+ },
434
+ onHoverEnd(e) {
435
+ domProps.onHoverEnd?.(e);
436
+ },
437
+ onHoverChange(isHovering) {
438
+ domProps.onHoverChange?.(isHovering);
439
+ }
440
+ });
441
+ const { isFocusVisible, focusProps } = createFocusRing();
442
+ const sortDirection = createMemo(() => {
443
+ const sortDescriptor = state.sortDescriptor;
444
+ if (sortDescriptor?.column === local.id) return sortDescriptor.direction;
445
+ });
446
+ const resizeCtx = useContext(TableColumnResizeStateContext);
447
+ const isResizing = createMemo(() => {
448
+ const rs = resizeCtx?.getState();
449
+ if (!rs) return false;
450
+ return rs.resizingColumn() === local.id;
451
+ });
452
+ const resizeWidth = createMemo(() => {
453
+ const rs = resizeCtx?.getState();
454
+ if (!rs) return void 0;
455
+ const w = rs.getColumnWidth(local.id);
456
+ return w > 0 ? w : void 0;
457
+ });
458
+ const renderValues = createMemo(() => ({
459
+ isFocused: state.focusedKey === local.id,
460
+ isFocusVisible: isFocusVisible() && state.focusedKey === local.id,
461
+ isSortable: local.allowsSorting ?? false,
462
+ sortDirection: sortDirection(),
463
+ isHovered: isHovered(),
464
+ allowsResizing: local.allowsResizing ?? false,
465
+ isResizing: isResizing()
466
+ }));
467
+ const renderProps = useRenderProps({
468
+ class: local.class,
469
+ style: local.style,
470
+ defaultClassName: "solidaria-Table-column"
471
+ }, renderValues);
472
+ const cleanColumnHeaderProps = () => {
473
+ const { ref: _ref1, ...rest } = columnHeaderAria.columnHeaderProps;
474
+ return rest;
475
+ };
476
+ const cleanHoverProps = () => {
477
+ const { ref: _ref2, ...rest } = hoverProps;
478
+ return rest;
479
+ };
480
+ const cleanFocusProps = () => {
481
+ const { ref: _ref3, ...rest } = focusProps;
482
+ return rest;
483
+ };
484
+ const columnStyle = createMemo(() => {
485
+ const base = renderProps.style();
486
+ const rw = resizeWidth();
487
+ if (rw == null) return base;
488
+ const widthStyle = {
489
+ width: `${rw}px`,
490
+ "min-width": `${rw}px`,
491
+ "max-width": `${rw}px`
492
+ };
493
+ if (!base) return widthStyle;
494
+ if (typeof base === "string") return widthStyle;
495
+ return {
496
+ ...base,
497
+ ...widthStyle
498
+ };
499
+ });
500
+ const columnChildren = () => typeof local.children === "function" ? local.children(renderValues()) : local.children;
501
+ const columnProps = () => ({
502
+ ref: (el) => {
503
+ setRef(el);
504
+ assignRef(local.ref, el);
505
+ },
506
+ ...domProps,
507
+ ...mergeProps$1(cleanColumnHeaderProps(), cleanHoverProps(), cleanFocusProps()),
508
+ class: renderProps.class(),
509
+ style: columnStyle(),
510
+ "data-sortable": local.allowsSorting || void 0,
511
+ "data-sort-direction": sortDirection() || void 0,
512
+ "data-resizable": local.allowsResizing || void 0,
513
+ "data-resizing": isResizing() || void 0,
514
+ "data-hovered": isHovered() || void 0,
515
+ "data-focused": state.focusedKey === local.id || void 0,
516
+ "data-focus-visible": isFocusVisible() && state.focusedKey === local.id || void 0,
517
+ children: columnChildren()
518
+ });
519
+ return local.render ? local.render(columnProps(), renderValues()) : <th ref={(el) => {
520
+ setRef(el);
521
+ assignRef(local.ref, el);
522
+ }} {...domProps} {...mergeProps$1(cleanColumnHeaderProps(), cleanHoverProps(), cleanFocusProps())} class={renderProps.class()} style={columnStyle()} data-sortable={local.allowsSorting || void 0} data-sort-direction={sortDirection() || void 0} data-resizable={local.allowsResizing || void 0} data-resizing={isResizing() || void 0} data-hovered={isHovered() || void 0} data-focused={state.focusedKey === local.id || void 0} data-focus-visible={isFocusVisible() && state.focusedKey === local.id || void 0}>
523
+ {columnChildren()}
524
+ </th>;
525
+ }
526
+ /**
527
+ * The body of a table containing data rows.
528
+ */
529
+ function TableBody(props) {
530
+ const [local, domProps] = splitProps(props, [
531
+ "items",
532
+ "class",
533
+ "style",
534
+ "render",
535
+ "slot",
536
+ "renderEmptyState",
537
+ "hasMore",
538
+ "isLoading",
539
+ "onLoadMore",
540
+ "children",
541
+ "ref"
542
+ ]);
543
+ const context = useContext(TableContext);
544
+ if (!context) throw new Error("TableBody must be used within a Table");
545
+ const { rowGroupProps } = createTableRowGroup(() => ({ type: "tbody" }));
546
+ const items = createMemo(() => local.items ?? context.items);
547
+ const renderValues = createMemo(() => ({ isEmpty: items().length === 0 }));
548
+ const renderProps = useRenderProps({
549
+ class: local.class,
550
+ style: local.style,
551
+ defaultClassName: "solidaria-Table-body"
552
+ }, renderValues);
553
+ const cleanRowGroupProps = () => {
554
+ const { ref: _ref, ...rest } = rowGroupProps;
555
+ return rest;
556
+ };
557
+ const isEmpty = () => items().length === 0;
558
+ const virtualizer = useVirtualizerContext();
559
+ const parentCollectionRenderer = useCollectionRenderer();
560
+ const rowNodes = createMemo(() => Array.from(context.collection).filter((node) => node.type === "item"));
561
+ const persistedKeys = useDndPersistedKeys({ focusedKey: () => context.state.focusedKey }, context.dragAndDropHooks, context.dropState, context.collection);
562
+ const virtualRange = createMemo(() => {
563
+ if (context.state.treeColumn != null) return null;
564
+ if (!virtualizer || !parentCollectionRenderer?.isVirtualized) return null;
565
+ const rowCount = items().length;
566
+ const baseRange = virtualizer.getVisibleRange(rowCount);
567
+ const persistedIndexes = Array.from(persistedKeys()).map((key) => rowNodes().findIndex((node) => node.key === key)).filter((index) => index >= 0);
568
+ const dropTarget = context.dropState?.target;
569
+ const normalizedDropKey = getNormalizedDropTargetKey(dropTarget, context.collection);
570
+ const focusedKey = context.state.focusedKey;
571
+ const focusedIndex = focusedKey != null ? rowNodes().findIndex((node) => node.key === focusedKey) : -1;
572
+ return mergePersistedKeysIntoVirtualRange(baseRange, persistedIndexes, rowCount, virtualizer, 80, {
573
+ forceIncludeIndexes: [
574
+ dropTarget?.type === "item" ? rowNodes().findIndex((node) => node.key === dropTarget.key) : -1,
575
+ normalizedDropKey != null ? rowNodes().findIndex((node) => node.key === normalizedDropKey) : -1,
576
+ dropTarget?.type === "item" ? -1 : focusedIndex
577
+ ].filter((index) => index >= 0),
578
+ forceIncludeMaxSpan: 320
579
+ });
580
+ });
581
+ createEffect(() => {
582
+ if (!virtualizer || !parentCollectionRenderer?.isVirtualized) return;
583
+ virtualizer.setDropTargetItemCountResolver(() => items().length);
584
+ virtualizer.setDropTargetIndexResolver((key) => {
585
+ const index = rowNodes().findIndex((node) => node.key === key);
586
+ return index >= 0 ? index : null;
587
+ });
588
+ virtualizer.setDropTargetResolver((target) => {
589
+ const node = rowNodes()[target.index];
590
+ if (!node) return target;
591
+ return {
592
+ ...target,
593
+ key: typeof node.key === "string" || typeof node.key === "number" ? node.key : void 0
594
+ };
595
+ });
596
+ onCleanup(() => {
597
+ virtualizer.setDropTargetIndexResolver(void 0);
598
+ virtualizer.setDropTargetItemCountResolver(void 0);
599
+ virtualizer.setDropTargetResolver(void 0);
600
+ });
601
+ });
602
+ const visibleItems = createMemo(() => {
603
+ if (context.state.treeColumn != null) return rowNodes().map((node) => node.value);
604
+ const range = virtualRange();
605
+ if (!range) return items();
606
+ return items().slice(range.start, range.end);
607
+ });
608
+ const spacerColSpan = () => context.columns.length + (context.showSelectionCheckboxes ? 1 : 0);
609
+ const bodyChildren = () => <>
610
+ <SharedElementTransition>
611
+ <Show when={isEmpty() && local.renderEmptyState && !local.isLoading} fallback={<>
612
+ {virtualRange()?.offsetTop ? <tr role="presentation" aria-hidden="true" data-virtualizer-spacer="top">
613
+ <td colSpan={spacerColSpan()} style={{
614
+ height: `${virtualRange().offsetTop}px`,
615
+ padding: "0",
616
+ border: "0"
617
+ }} />
618
+ </tr> : null}
619
+ <For each={visibleItems()}>
620
+ {(item, index) => {
621
+ const itemIndex = () => (virtualRange()?.start ?? 0) + index();
622
+ const beforeIndicator = () => parentCollectionRenderer?.renderDropIndicator?.(itemIndex(), "before");
623
+ const onIndicator = () => parentCollectionRenderer?.renderDropIndicator?.(itemIndex(), "on");
624
+ const afterIndicator = () => parentCollectionRenderer?.renderDropIndicator?.(itemIndex(), "after");
625
+ return <>
626
+ {beforeIndicator()}
627
+ {onIndicator()}
628
+ {local.children?.(item)}
629
+ {afterIndicator()}
630
+ </>;
631
+ }}
632
+ </For>
633
+ {virtualRange()?.offsetBottom ? <tr role="presentation" aria-hidden="true" data-virtualizer-spacer="bottom">
634
+ <td colSpan={spacerColSpan()} style={{
635
+ height: `${virtualRange().offsetBottom}px`,
636
+ padding: "0",
637
+ border: "0"
638
+ }} />
639
+ </tr> : null}
640
+ </>}>
641
+ <tr role="row" data-empty-state>
642
+ <th role="rowheader" colSpan={spacerColSpan()}>
643
+ {local.renderEmptyState?.()}
644
+ </th>
645
+ </tr>
646
+ </Show>
647
+ </SharedElementTransition>
648
+ <Show when={local.hasMore && local.onLoadMore}>
649
+ <TableLoadMoreItem onLoadMore={local.onLoadMore} isLoading={local.isLoading} colSpan={spacerColSpan()} />
650
+ </Show>
651
+ </>;
652
+ const bodyProps = () => ({
653
+ ref: (el) => assignRef(local.ref, el),
654
+ ...domProps,
655
+ ...cleanRowGroupProps(),
656
+ class: renderProps.class(),
657
+ style: renderProps.style(),
658
+ "data-empty": isEmpty() || void 0,
659
+ children: bodyChildren()
660
+ });
661
+ return local.render ? local.render(bodyProps(), renderValues()) : <tbody ref={(el) => assignRef(local.ref, el)} {...domProps} {...cleanRowGroupProps()} class={renderProps.class()} style={renderProps.style()} data-empty={isEmpty() || void 0}>
662
+ <SharedElementTransition>
663
+ <Show when={isEmpty() && local.renderEmptyState && !local.isLoading} fallback={<>
664
+ {virtualRange()?.offsetTop ? <tr role="presentation" aria-hidden="true" data-virtualizer-spacer="top">
665
+ <td colSpan={spacerColSpan()} style={{
666
+ height: `${virtualRange().offsetTop}px`,
667
+ padding: "0",
668
+ border: "0"
669
+ }} />
670
+ </tr> : null}
671
+ <For each={visibleItems()}>
672
+ {(item, index) => {
673
+ const itemIndex = () => (virtualRange()?.start ?? 0) + index();
674
+ const beforeIndicator = () => parentCollectionRenderer?.renderDropIndicator?.(itemIndex(), "before");
675
+ const onIndicator = () => parentCollectionRenderer?.renderDropIndicator?.(itemIndex(), "on");
676
+ const afterIndicator = () => parentCollectionRenderer?.renderDropIndicator?.(itemIndex(), "after");
677
+ return <>
678
+ {beforeIndicator()}
679
+ {onIndicator()}
680
+ {local.children?.(item)}
681
+ {afterIndicator()}
682
+ </>;
683
+ }}
684
+ </For>
685
+ {virtualRange()?.offsetBottom ? <tr role="presentation" aria-hidden="true" data-virtualizer-spacer="bottom">
686
+ <td colSpan={spacerColSpan()} style={{
687
+ height: `${virtualRange().offsetBottom}px`,
688
+ padding: "0",
689
+ border: "0"
690
+ }} />
691
+ </tr> : null}
692
+ </>}>
693
+ <tr role="row" data-empty-state>
694
+ <th role="rowheader" colSpan={spacerColSpan()}>
695
+ {local.renderEmptyState?.()}
696
+ </th>
697
+ </tr>
698
+ </Show>
699
+ </SharedElementTransition>
700
+ <Show when={local.hasMore && local.onLoadMore}>
701
+ <TableLoadMoreItem onLoadMore={local.onLoadMore} isLoading={local.isLoading} colSpan={spacerColSpan()} />
702
+ </Show>
703
+ </tbody>;
704
+ }
705
+ /**
706
+ * The footer of a table containing summary rows.
707
+ */
708
+ function TableFooter(props) {
709
+ const [local, domProps] = splitProps(props, [
710
+ "items",
711
+ "class",
712
+ "style",
713
+ "slot",
714
+ "children"
715
+ ]);
716
+ if (!useContext(TableContext)) throw new Error("TableFooter must be used within a Table");
717
+ const { rowGroupProps } = createTableRowGroup(() => ({ type: "tfoot" }));
718
+ const items = createMemo(() => local.items ?? []);
719
+ const renderValues = createMemo(() => ({ isEmpty: items().length === 0 }));
720
+ const renderProps = useRenderProps({
721
+ class: local.class,
722
+ style: local.style,
723
+ defaultClassName: "solidaria-Table-footer"
724
+ }, renderValues);
725
+ const cleanRowGroupProps = () => {
726
+ const { ref: _ref, ...rest } = rowGroupProps;
727
+ return rest;
728
+ };
729
+ return <tfoot {...domProps} {...cleanRowGroupProps()} class={renderProps.class()} style={renderProps.style()}>
730
+ <Show when={local.items && typeof local.children === "function"} fallback={local.children}>
731
+ <For each={items()}>{(item) => local.children(item)}</For>
732
+ </Show>
733
+ </tfoot>;
734
+ }
735
+ function TableLoadMoreItem(props) {
736
+ let sentinelRef;
737
+ const [isPending, setIsPending] = createSignal(false);
738
+ const isLoading = () => !!props.isLoading || isPending();
739
+ const triggerLoadMore = async () => {
740
+ if (isPending()) return;
741
+ setIsPending(true);
742
+ try {
743
+ await props.onLoadMore();
744
+ } finally {
745
+ setIsPending(false);
746
+ }
747
+ };
748
+ createEffect(() => {});
749
+ const renderProps = useRenderProps({
750
+ children: props.children ?? (() => isLoading() ? <div role="progressbar" aria-label="loading" /> : null),
751
+ class: props.class,
752
+ style: props.style,
753
+ defaultClassName: "solidaria-Table-loadMore"
754
+ }, () => ({ isLoading: isLoading() }));
755
+ return <>
756
+ <tr style={{
757
+ position: "relative",
758
+ width: 0,
759
+ height: 0,
760
+ overflow: "hidden"
761
+ }} inert>
762
+ <td>
763
+ <div ref={sentinelRef} data-testid="loadMoreSentinel" style={{
764
+ position: "absolute",
765
+ height: "1px",
766
+ width: "1px"
767
+ }} />
768
+ </td>
769
+ </tr>
770
+ <Show when={isLoading()}>
771
+ <tr role="row" tabIndex={0} onFocus={() => {
772
+ triggerLoadMore();
773
+ }} class={renderProps.class()} style={renderProps.style()} data-loading>
774
+ <td role="rowheader" colSpan={props.colSpan ?? 1}>
775
+ {renderProps.renderChildren()}
776
+ </td>
777
+ </tr>
778
+ </Show>
779
+ </>;
780
+ }
781
+ /**
782
+ * A row in a table.
783
+ */
784
+ function TableRow(props) {
785
+ const [local, domProps] = splitProps(props, [
786
+ "class",
787
+ "style",
788
+ "render",
789
+ "slot",
790
+ "id",
791
+ "item",
792
+ "columns",
793
+ "isDisabled",
794
+ "onAction",
795
+ "children",
796
+ "ref",
797
+ "href",
798
+ "target",
799
+ "rel",
800
+ "download",
801
+ "ping",
802
+ "referrerPolicy",
803
+ "routerOptions"
804
+ ]);
805
+ const context = useContext(TableContext);
806
+ if (!context) throw new Error("TableRow must be used within a Table");
807
+ const { state } = context;
808
+ const tableContext = context;
809
+ const registeredCellIds = [];
810
+ const generatedId = createUniqueId();
811
+ const rowKey = () => local.id ?? generatedId;
812
+ const router = useRouter();
813
+ const linkProps = createMemo(() => useLinkProps({
814
+ href: local.href,
815
+ target: local.target,
816
+ rel: local.rel,
817
+ download: local.download,
818
+ ping: local.ping,
819
+ referrerPolicy: local.referrerPolicy
820
+ }));
821
+ const [ref, setRef] = createSignal(null);
822
+ const rowNode = createMemo(() => {
823
+ const node = state.collection.getItem(rowKey());
824
+ if (!node) return {
825
+ type: "item",
826
+ key: rowKey(),
827
+ value: local.item ?? null,
828
+ textValue: String(local.id),
829
+ level: 0,
830
+ index: 0,
831
+ hasChildNodes: true,
832
+ childNodes: []
833
+ };
834
+ return node;
835
+ });
836
+ const rowAria = createTableRow(() => ({
837
+ node: rowNode(),
838
+ isVirtualized: tableContext.isVirtualized,
839
+ isDisabled: local.isDisabled,
840
+ onAction: local.onAction,
841
+ href: linkProps().href,
842
+ onLinkAction: (event) => {
843
+ const target = ref();
844
+ if (!target || !local.href) return;
845
+ router.open(target, event, local.href, local.routerOptions);
846
+ }
847
+ }), () => state, ref);
848
+ const isSelected = () => rowAria.isSelected;
849
+ const isDisabled = () => rowAria.isDisabled;
850
+ const isPressed = () => rowAria.isPressed;
851
+ const isInteractive = () => {
852
+ const tableData = getTableData(state);
853
+ return state.selectionMode !== "none" || !!tableData?.actions.onRowAction || !!local.onAction || !!local.href;
854
+ };
855
+ const { isHovered, hoverProps } = createHover({
856
+ get isDisabled() {
857
+ return isDisabled() || !isInteractive();
858
+ },
859
+ onHoverStart(e) {
860
+ domProps.onHoverStart?.(e);
861
+ },
862
+ onHoverEnd(e) {
863
+ domProps.onHoverEnd?.(e);
864
+ },
865
+ onHoverChange(isHovering) {
866
+ domProps.onHoverChange?.(isHovering);
867
+ }
868
+ });
869
+ const { isFocusVisible: isFocusVisible$1, focusProps } = createFocusRing();
870
+ const [isFocusWithin, setIsFocusWithin] = createSignal(false);
871
+ const focusWithinProps = {
872
+ onFocusIn() {
873
+ setIsFocusWithin(true);
874
+ },
875
+ onFocusOut(e) {
876
+ const currentTarget = e.currentTarget;
877
+ const nextTarget = e.relatedTarget;
878
+ if (!nextTarget || !currentTarget.contains(nextTarget)) setIsFocusWithin(false);
879
+ }
880
+ };
881
+ const isFocused = createMemo(() => state.focusedKey === rowKey());
882
+ const draggableItem = createMemo(() => {
883
+ if (!tableContext.dragAndDropHooks?.useDraggableItem || !tableContext.dragState) return void 0;
884
+ return tableContext.dragAndDropHooks.useDraggableItem({
885
+ key: rowKey(),
886
+ hasDragButton: true
887
+ }, tableContext.dragState);
888
+ });
889
+ const droppableItem = createMemo(() => {
890
+ if (!tableContext.dragAndDropHooks?.useDroppableItem || !tableContext.dropState) return void 0;
891
+ return tableContext.dragAndDropHooks.useDroppableItem({ key: rowKey() }, tableContext.dropState, () => ref());
892
+ });
893
+ const isTreeRow = () => state.treeColumn != null;
894
+ const rowLevel = () => rowNode().level + 1;
895
+ const hasChildItems = () => rowAria.hasChildRows;
896
+ const isExpanded = () => rowAria.isExpanded;
897
+ const renderValues = createMemo(() => ({
898
+ isSelected: isSelected(),
899
+ isFocused: isFocused(),
900
+ isFocusVisible: isFocusVisible$1() && isFocused(),
901
+ isPressed: isPressed(),
902
+ isHovered: isHovered(),
903
+ isDisabled: isDisabled(),
904
+ isExpanded: isExpanded(),
905
+ hasChildItems: hasChildItems(),
906
+ level: rowLevel()
907
+ }));
908
+ const renderProps = useRenderProps({
909
+ class: local.class,
910
+ style: local.style,
911
+ defaultClassName: "solidaria-Table-row"
912
+ }, renderValues);
913
+ const cleanRowProps = () => {
914
+ const { ref: _ref1, ...rest } = rowAria.rowProps;
915
+ return rest;
916
+ };
917
+ const cleanHoverProps = () => {
918
+ const { ref: _ref2, ...rest } = hoverProps;
919
+ return rest;
920
+ };
921
+ const cleanFocusProps = () => {
922
+ const { ref: _ref3, ...rest } = focusProps;
923
+ return rest;
924
+ };
925
+ const rowContextValue = {
926
+ rowKey: rowKey(),
927
+ rowNode: rowNode(),
928
+ getCellColumnKey(cellId, explicitId) {
929
+ if (explicitId === "__selection__") return explicitId;
930
+ let index = registeredCellIds.indexOf(cellId);
931
+ if (index < 0) {
932
+ index = registeredCellIds.length;
933
+ registeredCellIds.push(cellId);
934
+ }
935
+ return explicitId ?? tableContext.columns[index]?.key;
936
+ }
937
+ };
938
+ const dragButtonProps = createMemo(() => {
939
+ const props = draggableItem()?.dragButtonProps ?? {};
940
+ const textValue = (rowNode().textValue || String(rowKey())).trim();
941
+ return {
942
+ ...props,
943
+ "aria-label": `Drag ${textValue}`,
944
+ style: {
945
+ ...typeof props.style === "object" ? props.style : {},
946
+ "pointer-events": "none"
947
+ }
948
+ };
949
+ });
950
+ const buttonContextValue = { slots: {
951
+ default: {},
952
+ get drag() {
953
+ return dragButtonProps();
954
+ },
955
+ get chevron() {
956
+ return rowAria.expandButtonProps;
957
+ }
958
+ } };
959
+ const childRenderProps = {
960
+ get isSelected() {
961
+ return isSelected();
962
+ },
963
+ get isFocused() {
964
+ return isFocused();
965
+ },
966
+ get isFocusVisible() {
967
+ return isFocusVisible$1() && isFocused();
968
+ },
969
+ get isPressed() {
970
+ return isPressed();
971
+ },
972
+ get isHovered() {
973
+ return isHovered();
974
+ },
975
+ get isDisabled() {
976
+ return isDisabled();
977
+ },
978
+ get isExpanded() {
979
+ return isExpanded();
980
+ },
981
+ get hasChildItems() {
982
+ return hasChildItems();
983
+ },
984
+ get level() {
985
+ return rowLevel();
986
+ }
987
+ };
988
+ const rowStyle = () => {
989
+ const base = renderProps.style();
990
+ if (!isTreeRow()) return base;
991
+ return {
992
+ ...base ?? {},
993
+ "--table-row-level": rowLevel()
994
+ };
995
+ };
996
+ return <TableRowContext.Provider value={rowContextValue}>
997
+ <ButtonContext.Provider value={buttonContextValue}>
998
+ {(() => {
999
+ registeredCellIds.length = 0;
1000
+ const rowChildrenContent = typeof local.children === "function" ? local.columns ? <For each={local.columns}>
1001
+ {(column) => local.children(column)}
1002
+ </For> : local.children(childRenderProps) : local.children;
1003
+ const tableRowProps = () => ({
1004
+ ref: (el) => {
1005
+ setRef(el);
1006
+ assignRef(local.ref, el);
1007
+ },
1008
+ ...domProps,
1009
+ ...mergeProps$1(cleanRowProps(), cleanHoverProps(), cleanFocusProps(), focusWithinProps, draggableItem()?.dragProps ?? {}, droppableItem()?.dropProps ?? {}),
1010
+ class: renderProps.class(),
1011
+ style: rowStyle(),
1012
+ "data-key": rowKey(),
1013
+ "data-selected": isSelected() || void 0,
1014
+ "data-focused": isFocused() || void 0,
1015
+ "data-focus-visible": isFocusVisible$1() && isFocused() || void 0,
1016
+ "data-focus-visible-within": dataAttr(isFocusWithin() && isFocusVisible()),
1017
+ "data-pressed": isPressed() || void 0,
1018
+ "data-hovered": isHovered() || void 0,
1019
+ "data-disabled": isDisabled() || void 0,
1020
+ "data-href": linkProps().href,
1021
+ "data-target": linkProps().target,
1022
+ "data-rel": linkProps().rel,
1023
+ "data-download": typeof linkProps().download === "string" ? linkProps().download : linkProps().download ? "" : void 0,
1024
+ "data-ping": linkProps().ping,
1025
+ "data-referrer-policy": linkProps().referrerPolicy,
1026
+ "data-dragging": draggableItem()?.isDragging || void 0,
1027
+ "data-drop-target": droppableItem()?.isDropTarget || void 0,
1028
+ "data-expanded": isTreeRow() && isExpanded() || void 0,
1029
+ "data-has-child-items": isTreeRow() && hasChildItems() || void 0,
1030
+ "data-level": isTreeRow() ? rowLevel() : void 0,
1031
+ children: rowChildrenContent
1032
+ });
1033
+ return <Show when={local.render} fallback={<tr ref={(el) => {
1034
+ setRef(el);
1035
+ assignRef(local.ref, el);
1036
+ }} {...domProps} {...mergeProps$1(cleanRowProps(), cleanHoverProps(), cleanFocusProps(), focusWithinProps, draggableItem()?.dragProps ?? {}, droppableItem()?.dropProps ?? {})} class={renderProps.class()} style={rowStyle()} data-key={rowKey()} data-selected={isSelected() || void 0} data-focused={isFocused() || void 0} data-focus-visible={isFocusVisible$1() && isFocused() || void 0} data-focus-visible-within={dataAttr(isFocusWithin() && isFocusVisible())} data-pressed={isPressed() || void 0} data-hovered={isHovered() || void 0} data-disabled={isDisabled() || void 0} data-href={linkProps().href} data-target={linkProps().target} data-rel={linkProps().rel} data-download={typeof linkProps().download === "string" ? linkProps().download : linkProps().download ? "" : void 0} data-ping={linkProps().ping} data-referrer-policy={linkProps().referrerPolicy} data-dragging={draggableItem()?.isDragging || void 0} data-drop-target={droppableItem()?.isDropTarget || void 0} data-expanded={isTreeRow() && isExpanded() || void 0} data-has-child-items={isTreeRow() && hasChildItems() || void 0} data-level={isTreeRow() ? rowLevel() : void 0}>
1037
+ {rowChildrenContent}
1038
+ </tr>}>
1039
+ {local.render(tableRowProps(), renderValues())}
1040
+ </Show>;
1041
+ })()}
1042
+ </ButtonContext.Provider>
1043
+ </TableRowContext.Provider>;
1044
+ }
1045
+ /**
1046
+ * A cell in a table row.
1047
+ */
1048
+ function TableCell(props) {
1049
+ const [local, domProps] = splitProps(props, [
1050
+ "class",
1051
+ "style",
1052
+ "render",
1053
+ "slot",
1054
+ "id",
1055
+ "colSpan",
1056
+ "children",
1057
+ "ref"
1058
+ ]);
1059
+ const tableContext = useContext(TableContext);
1060
+ const rowContext = useContext(TableRowContext);
1061
+ if (!tableContext) throw new Error("TableCell must be used within a Table");
1062
+ if (!rowContext) throw new Error("TableCell must be used within a Table");
1063
+ const { state } = tableContext;
1064
+ const { rowKey, rowNode } = rowContext;
1065
+ const [ref, setRef] = createSignal(null);
1066
+ const cellId = createUniqueId();
1067
+ const columnKey = createMemo(() => rowContext.getCellColumnKey(cellId, local.id));
1068
+ const cellNode = createMemo(() => {
1069
+ const key = columnKey();
1070
+ if (key != null) {
1071
+ const cellKey = `${rowKey}-${key}`;
1072
+ const node = state.collection.getItem(cellKey);
1073
+ if (node) return node;
1074
+ }
1075
+ return {
1076
+ type: "cell",
1077
+ key: key ?? `${rowKey}-cell`,
1078
+ value: rowNode.value,
1079
+ textValue: "",
1080
+ level: 1,
1081
+ index: 0,
1082
+ parentKey: rowKey,
1083
+ hasChildNodes: false,
1084
+ childNodes: []
1085
+ };
1086
+ });
1087
+ const cellColumnIndex = createMemo(() => {
1088
+ const key = columnKey();
1089
+ if (key == null) return void 0;
1090
+ const cellKey = `${rowKey}-${key}`;
1091
+ return state.collection.getItem(cellKey) ? cellNode().index ?? 0 : void 0;
1092
+ });
1093
+ const isTreeGridCell = () => state.treeColumn != null;
1094
+ const parentRowNode = createMemo(() => state.collection.getItem(rowKey));
1095
+ const cellLevel = () => (parentRowNode()?.level ?? rowNode.level ?? 0) + 1;
1096
+ const cellHasChildItems = () => parentRowNode()?.isExpandable ?? false;
1097
+ const cellIsExpanded = () => {
1098
+ if (!isTreeGridCell() || !cellHasChildItems()) return false;
1099
+ return state.expandedKeys === "all" || state.expandedKeys.has(rowKey);
1100
+ };
1101
+ const isTreeColumn = () => isTreeGridCell() && columnKey() === state.treeColumn;
1102
+ const cellAria = createTableCell(() => ({ node: cellNode() }), () => state, ref);
1103
+ const isPressed = () => cellAria.isPressed;
1104
+ const { isHovered, hoverProps } = createHover({ isDisabled: false });
1105
+ const { isFocusVisible, focusProps } = createFocusRing();
1106
+ const isFocused = createMemo(() => state.focusedKey === cellNode().key);
1107
+ const renderValues = createMemo(() => ({
1108
+ isFocused: isFocused(),
1109
+ isFocusVisible: isFocusVisible() && isFocused(),
1110
+ columnIndex: cellColumnIndex() ?? 0,
1111
+ isPressed: isPressed(),
1112
+ isHovered: isHovered(),
1113
+ isTreeColumn: isTreeColumn(),
1114
+ isExpanded: cellIsExpanded(),
1115
+ hasChildItems: cellHasChildItems(),
1116
+ level: cellLevel()
1117
+ }));
1118
+ const renderProps = useRenderProps({
1119
+ class: local.class,
1120
+ style: local.style,
1121
+ defaultClassName: "solidaria-Table-cell"
1122
+ }, renderValues);
1123
+ const cleanCellProps = () => {
1124
+ const { ref: _ref1, ...rest } = cellAria.gridCellProps;
1125
+ return rest;
1126
+ };
1127
+ const cleanHoverProps = () => {
1128
+ const { ref: _ref2, ...rest } = hoverProps;
1129
+ return rest;
1130
+ };
1131
+ const cleanFocusProps = () => {
1132
+ const { ref: _ref3, ...rest } = focusProps;
1133
+ return rest;
1134
+ };
1135
+ const cellChildren = () => typeof local.children === "function" ? local.children(renderValues()) : local.children;
1136
+ const tableCellProps = () => ({
1137
+ ref: (el) => {
1138
+ setRef(el);
1139
+ assignRef(local.ref, el);
1140
+ },
1141
+ ...domProps,
1142
+ ...mergeProps$1(cleanCellProps(), cleanHoverProps(), cleanFocusProps()),
1143
+ colSpan: local.colSpan,
1144
+ class: renderProps.class(),
1145
+ style: renderProps.style(),
1146
+ "data-key": cellNode().key,
1147
+ "data-focused": isFocused() || void 0,
1148
+ "data-focus-visible": isFocusVisible() && isFocused() || void 0,
1149
+ "data-column-index": cellColumnIndex(),
1150
+ "data-pressed": isPressed() || void 0,
1151
+ "data-hovered": isHovered() || void 0,
1152
+ "data-tree-column": isTreeColumn() || void 0,
1153
+ "data-expanded": isTreeGridCell() && cellIsExpanded() || void 0,
1154
+ "data-has-child-items": isTreeGridCell() && cellHasChildItems() || void 0,
1155
+ "data-level": isTreeGridCell() ? cellLevel() : void 0,
1156
+ children: cellChildren()
1157
+ });
1158
+ return local.render ? local.render(tableCellProps(), renderValues()) : <td ref={(el) => {
1159
+ setRef(el);
1160
+ assignRef(local.ref, el);
1161
+ }} {...domProps} {...mergeProps$1(cleanCellProps(), cleanHoverProps(), cleanFocusProps())} colSpan={local.colSpan} class={renderProps.class()} style={renderProps.style()} data-key={cellNode().key} data-focused={isFocused() || void 0} data-focus-visible={isFocusVisible() && isFocused() || void 0} data-column-index={cellColumnIndex()} data-pressed={isPressed() || void 0} data-hovered={isHovered() || void 0} data-tree-column={isTreeColumn() || void 0} data-expanded={isTreeGridCell() && cellIsExpanded() || void 0} data-has-child-items={isTreeGridCell() && cellHasChildItems() || void 0} data-level={isTreeGridCell() ? cellLevel() : void 0}>
1162
+ {cellChildren()}
1163
+ </td>;
1164
+ }
1165
+ /**
1166
+ * A checkbox cell for row selection.
1167
+ */
1168
+ function TableSelectionCheckbox(props) {
1169
+ const context = useContext(TableContext);
1170
+ if (!context) throw new Error("TableSelectionCheckbox must be used within a Table");
1171
+ const { state } = context;
1172
+ const selectionCheckboxAria = createTableSelectionCheckbox(() => ({ key: props.rowKey }), () => state);
1173
+ return <input {...selectionCheckboxAria.checkboxProps} class={props.class} style={props.style} tabIndex={props.excludeFromTabOrder ? -1 : selectionCheckboxAria.checkboxProps.tabIndex} aria-label={props["aria-label"] ?? selectionCheckboxAria.checkboxProps["aria-label"]} onClick={(event) => event.stopPropagation()} onKeyDown={(event) => event.stopPropagation()} onKeyUp={(event) => event.stopPropagation()} onPointerDown={(event) => event.stopPropagation()} onPointerUp={(event) => event.stopPropagation()} />;
1174
+ }
1175
+ /**
1176
+ * A checkbox for select-all functionality.
1177
+ */
1178
+ function TableSelectAllCheckbox(props = {}) {
1179
+ const context = useContext(TableContext);
1180
+ if (!context) throw new Error("TableSelectAllCheckbox must be used within a Table");
1181
+ const { state } = context;
1182
+ const selectAllCheckboxAria = createTableSelectAllCheckbox(() => state);
1183
+ let inputRef;
1184
+ createEffect(() => {});
1185
+ return <input ref={inputRef} {...selectAllCheckboxAria.checkboxProps} class={props.class} style={props.style} aria-label={props["aria-label"] ?? selectAllCheckboxAria.checkboxProps["aria-label"]} />;
1186
+ }
1187
+ Table.Header = TableHeader;
1188
+ Table.Column = TableColumn;
1189
+ Table.Body = TableBody;
1190
+ Table.LoadMoreItem = TableLoadMoreItem;
1191
+ Table.Row = TableRow;
1192
+ Table.Cell = TableCell;
1193
+ Table.SelectionCheckbox = TableSelectionCheckbox;
1194
+ Table.SelectAllCheckbox = TableSelectAllCheckbox;
1195
+ function ColumnResizer(props) {
1196
+ const [local, domProps] = splitProps(props, [
1197
+ "column",
1198
+ "aria-label",
1199
+ "isDisabled",
1200
+ "onResizeStart",
1201
+ "onResize",
1202
+ "onResizeEnd",
1203
+ "class",
1204
+ "style",
1205
+ "slot",
1206
+ "children"
1207
+ ]);
1208
+ const registerColumn = useContext(ResizableTableRegisterContext);
1209
+ if (registerColumn) registerColumn(local.column.key, { key: local.column.key });
1210
+ const resizeCtx = useContext(TableColumnResizeStateContext);
1211
+ const hasResizeContext = !!resizeCtx;
1212
+ const noopResizeState = {
1213
+ resizingColumn: () => null,
1214
+ columnWidths: () => /* @__PURE__ */ new Map(),
1215
+ startResize() {},
1216
+ endResize() {},
1217
+ updateResizedColumns(_key, _width) {
1218
+ return /* @__PURE__ */ new Map();
1219
+ },
1220
+ getColumnWidth() {
1221
+ return 0;
1222
+ },
1223
+ getColumnMinWidth() {
1224
+ return 75;
1225
+ },
1226
+ getColumnMaxWidth() {
1227
+ return Infinity;
1228
+ }
1229
+ };
1230
+ const { isHovered, hoverProps } = createHover({ isDisabled: local.isDisabled ?? false });
1231
+ const [isFocused, setIsFocused] = createSignal(false);
1232
+ const columnResize = createTableColumnResize(() => ({
1233
+ column: local.column,
1234
+ "aria-label": local["aria-label"] ?? "Resizer",
1235
+ isDisabled: local.isDisabled,
1236
+ onResizeStart: (widths) => {
1237
+ resizeCtx?.getCallbacks?.().onResizeStart?.(widths);
1238
+ local.onResizeStart?.(widths);
1239
+ },
1240
+ onResize: (widths) => {
1241
+ resizeCtx?.getCallbacks?.().onResize?.(widths);
1242
+ local.onResize?.(widths);
1243
+ },
1244
+ onResizeEnd: (widths) => {
1245
+ resizeCtx?.getCallbacks?.().onResizeEnd?.(widths);
1246
+ local.onResizeEnd?.(widths);
1247
+ }
1248
+ }), () => resizeCtx?.getState() ?? noopResizeState);
1249
+ const renderValues = createMemo(() => ({
1250
+ isHovered: isHovered(),
1251
+ isFocused: isFocused(),
1252
+ isResizing: columnResize.isResizing(),
1253
+ resizableDirection: "both"
1254
+ }));
1255
+ const renderProps = useRenderProps({
1256
+ class: local.class,
1257
+ style: local.style,
1258
+ defaultClassName: "solidaria-Table-columnResizer"
1259
+ }, renderValues);
1260
+ const cleanHoverProps = () => {
1261
+ const { ref: _ref, ...rest } = hoverProps;
1262
+ return rest;
1263
+ };
1264
+ return <div {...domProps} {...columnResize.resizerProps} {...cleanHoverProps()} class={renderProps.class()} style={renderProps.style()} data-hovered={isHovered() || void 0} data-resizing={columnResize.isResizing() || void 0}>
1265
+ <Show when={hasResizeContext}>
1266
+ <input {...columnResize.inputProps} onFocus={() => setIsFocused(true)} onBlur={() => setIsFocused(false)} />
1267
+ </Show>
1268
+ {typeof local.children === "function" ? local.children(renderValues()) : local.children}
1269
+ </div>;
1270
+ }
1271
+ function ResizableTableContainer(props) {
1272
+ const [local, domProps] = splitProps(props, [
1273
+ "class",
1274
+ "style",
1275
+ "slot",
1276
+ "children",
1277
+ "columns",
1278
+ "onResizeStart",
1279
+ "onResize",
1280
+ "onResizeEnd"
1281
+ ]);
1282
+ const [containerRef, setContainerRef] = createSignal(null);
1283
+ const [tableWidth, setTableWidth] = createSignal(0);
1284
+ createEffect(() => {
1285
+ const el = containerRef();
1286
+ if (!el) return;
1287
+ setTableWidth(el.clientWidth);
1288
+ if (typeof ResizeObserver !== "undefined") {
1289
+ const observer = new ResizeObserver((entries) => {
1290
+ for (const entry of entries) setTableWidth(entry.contentRect.width);
1291
+ });
1292
+ observer.observe(el);
1293
+ onCleanup(() => observer.disconnect());
1294
+ }
1295
+ });
1296
+ const [autoColumns, setAutoColumns] = createSignal(/* @__PURE__ */ new Map());
1297
+ const registerColumn = (key, def) => {
1298
+ setAutoColumns((prev) => {
1299
+ const next = new Map(prev);
1300
+ next.set(key, def);
1301
+ return next;
1302
+ });
1303
+ };
1304
+ const effectiveColumns = createMemo(() => {
1305
+ if (local.columns && local.columns.length > 0) return local.columns;
1306
+ return Array.from(autoColumns().values());
1307
+ });
1308
+ const effectiveWidth = createMemo(() => {
1309
+ const w = tableWidth();
1310
+ return w > 0 ? w : 800;
1311
+ });
1312
+ const resizeState = createMemo(() => {
1313
+ const cols = effectiveColumns();
1314
+ if (cols.length === 0) return null;
1315
+ return createTableColumnResizeState(() => ({
1316
+ tableWidth: effectiveWidth(),
1317
+ columns: cols
1318
+ }));
1319
+ });
1320
+ const contextValue = {
1321
+ getState: () => resizeState(),
1322
+ getCallbacks: () => ({
1323
+ onResizeStart: local.onResizeStart,
1324
+ onResize: local.onResize,
1325
+ onResizeEnd: local.onResizeEnd
1326
+ })
1327
+ };
1328
+ return <ResizableTableRegisterContext.Provider value={registerColumn}>
1329
+ <TableColumnResizeStateContext.Provider value={contextValue}>
1330
+ <div ref={setContainerRef} {...domProps} class={local.class ?? "solidaria-ResizableTableContainer"} style={{
1331
+ position: "relative",
1332
+ overflow: "auto",
1333
+ ...local.style
1334
+ }}>
1335
+ {local.children}
1336
+ </div>
1337
+ </TableColumnResizeStateContext.Provider>
1338
+ </ResizableTableRegisterContext.Provider>;
1339
+ }
1340
+ /** Internal context for ColumnResizer to register itself with ResizableTableContainer */
1341
+ const ResizableTableRegisterContext = createContext(null);
1342
+ function useTableOptions() {
1343
+ return useContext(TableContext);
1344
+ }
1345
+ //#endregion
1346
+ export { ColumnResizer, ResizableTableContainer, Table, TableBody, TableCell, TableColumn, TableColumnResizeStateContext, TableContext, TableFooter, TableHeader, TableLoadMoreItem, TableRow, TableRowContext, TableSelectAllCheckbox, TableSelectionCheckbox, TableStateContext, useTableOptions };
1347
+
1348
+ //# sourceMappingURL=Table.jsx.map