@multiplatform.one/table 6.7.0 → 7.0.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 (473) hide show
  1. package/README.md +4 -3
  2. package/dist/cjs/components/ChildTable/index.cjs +2 -1
  3. package/dist/cjs/components/ChildTable/index.native.js +2 -1
  4. package/dist/cjs/components/ChildTable/index.native.js.map +1 -1
  5. package/dist/cjs/components/ColumnHeaderFilter/index.cjs +17 -9
  6. package/dist/cjs/components/ColumnHeaderFilter/index.native.js +32 -11
  7. package/dist/cjs/components/ColumnHeaderFilter/index.native.js.map +1 -1
  8. package/dist/cjs/components/DataTable/DataTableDocumentList.cjs +222 -0
  9. package/dist/cjs/components/DataTable/DataTableDocumentList.native.js +237 -0
  10. package/dist/cjs/components/DataTable/DataTableDocumentList.native.js.map +1 -0
  11. package/dist/cjs/components/DataTable/DataTableMobileCards.cjs +5 -2
  12. package/dist/cjs/components/DataTable/DataTableMobileCards.native.js +6 -2
  13. package/dist/cjs/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  14. package/dist/cjs/components/DataTable/DataTableRoot.cjs +92 -41
  15. package/dist/cjs/components/DataTable/DataTableRoot.native.js +97 -43
  16. package/dist/cjs/components/DataTable/DataTableRoot.native.js.map +1 -1
  17. package/dist/cjs/components/DataTable/DataTableVirtualized.cjs +8 -2
  18. package/dist/cjs/components/DataTable/DataTableVirtualized.native.js +9 -3
  19. package/dist/cjs/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  20. package/dist/cjs/components/DataTable/documentListSlots.cjs +59 -0
  21. package/dist/cjs/components/DataTable/documentListSlots.native.js +85 -0
  22. package/dist/cjs/components/DataTable/documentListSlots.native.js.map +1 -0
  23. package/dist/cjs/components/DataTable/index.native.js +74 -59
  24. package/dist/cjs/components/DataTable/index.native.js.map +1 -1
  25. package/dist/cjs/components/DataTable/rowStateChrome.cjs +55 -0
  26. package/dist/cjs/components/DataTable/rowStateChrome.native.js +59 -0
  27. package/dist/cjs/components/DataTable/rowStateChrome.native.js.map +1 -0
  28. package/dist/cjs/components/DataTableCell/CellModalEditor.cjs +24 -3
  29. package/dist/cjs/components/DataTableCell/CellModalEditor.native.js +6 -1
  30. package/dist/cjs/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  31. package/dist/cjs/components/DataTableCell/CellOptionsEditor.cjs +9 -2
  32. package/dist/cjs/components/DataTableCell/CellOptionsEditor.native.js +11 -2
  33. package/dist/cjs/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  34. package/dist/cjs/components/DataTableCell/index.cjs +74 -63
  35. package/dist/cjs/components/DataTableCell/index.native.js +94 -82
  36. package/dist/cjs/components/DataTableCell/index.native.js.map +1 -1
  37. package/dist/cjs/components/DataTableColumnPinning/index.cjs +54 -37
  38. package/dist/cjs/components/DataTableColumnPinning/index.native.js +59 -38
  39. package/dist/cjs/components/DataTableColumnPinning/index.native.js.map +1 -1
  40. package/dist/cjs/components/DataTableDateFilter/index.cjs +33 -14
  41. package/dist/cjs/components/DataTableDateFilter/index.native.js +33 -12
  42. package/dist/cjs/components/DataTableDateFilter/index.native.js.map +1 -1
  43. package/dist/cjs/components/DataTableExport/index.cjs +35 -7
  44. package/dist/cjs/components/DataTableExport/index.native.js +42 -7
  45. package/dist/cjs/components/DataTableExport/index.native.js.map +1 -1
  46. package/dist/cjs/components/DataTableFacetMenu/index.cjs +140 -0
  47. package/dist/cjs/components/DataTableFacetMenu/index.native.js +156 -0
  48. package/dist/cjs/components/DataTableFacetMenu/index.native.js.map +1 -0
  49. package/dist/cjs/components/DataTableFilterButton/index.cjs +51 -32
  50. package/dist/cjs/components/DataTableFilterButton/index.native.js +63 -40
  51. package/dist/cjs/components/DataTableFilterButton/index.native.js.map +1 -1
  52. package/dist/cjs/components/DataTableFilterChips/FilterChip.cjs +143 -0
  53. package/dist/cjs/components/DataTableFilterChips/FilterChip.native.js +148 -0
  54. package/dist/cjs/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
  55. package/dist/cjs/components/DataTableFilterChips/index.cjs +9 -31
  56. package/dist/cjs/components/DataTableFilterChips/index.native.js +9 -32
  57. package/dist/cjs/components/DataTableFilterChips/index.native.js.map +1 -1
  58. package/dist/cjs/components/DataTableFilters/index.cjs +145 -502
  59. package/dist/cjs/components/DataTableFilters/index.native.js +171 -544
  60. package/dist/cjs/components/DataTableFilters/index.native.js.map +1 -1
  61. package/dist/cjs/components/DataTableGrouping/index.cjs +273 -108
  62. package/dist/cjs/components/DataTableGrouping/index.native.js +310 -157
  63. package/dist/cjs/components/DataTableGrouping/index.native.js.map +1 -1
  64. package/dist/cjs/components/DataTablePagination/index.cjs +147 -95
  65. package/dist/cjs/components/DataTablePagination/index.native.js +159 -106
  66. package/dist/cjs/components/DataTablePagination/index.native.js.map +1 -1
  67. package/dist/cjs/components/DataTableSearch/index.cjs +251 -210
  68. package/dist/cjs/components/DataTableSearch/index.native.js +292 -243
  69. package/dist/cjs/components/DataTableSearch/index.native.js.map +1 -1
  70. package/dist/cjs/components/DataTableToolbar/index.cjs +141 -115
  71. package/dist/cjs/components/DataTableToolbar/index.native.js +163 -148
  72. package/dist/cjs/components/DataTableToolbar/index.native.js.map +1 -1
  73. package/dist/cjs/components/DataTableViewOptions/index.cjs +25 -21
  74. package/dist/cjs/components/DataTableViewOptions/index.native.js +6 -4
  75. package/dist/cjs/components/DataTableViewOptions/index.native.js.map +1 -1
  76. package/dist/cjs/components/SimpleTable/index.cjs +336 -46
  77. package/dist/cjs/components/SimpleTable/index.native.js +356 -48
  78. package/dist/cjs/components/SimpleTable/index.native.js.map +1 -1
  79. package/dist/cjs/components/TableInput/index.cjs +147 -38
  80. package/dist/cjs/components/TableInput/index.native.js +54 -38
  81. package/dist/cjs/components/TableInput/index.native.js.map +1 -1
  82. package/dist/cjs/components/TableInput/shared.cjs +36 -1
  83. package/dist/cjs/components/TableInput/shared.native.js +35 -0
  84. package/dist/cjs/components/TableInput/shared.native.js.map +1 -1
  85. package/dist/cjs/hooks/useDataTable.cjs +33 -2
  86. package/dist/cjs/hooks/useDataTable.native.js +41 -2
  87. package/dist/cjs/hooks/useDataTable.native.js.map +1 -1
  88. package/dist/cjs/hooks/useInfiniteRows.cjs +20 -3
  89. package/dist/cjs/hooks/useInfiniteRows.native.js +20 -3
  90. package/dist/cjs/hooks/useInfiniteRows.native.js.map +1 -1
  91. package/dist/cjs/index.cjs +2 -0
  92. package/dist/cjs/index.native.js +2 -0
  93. package/dist/cjs/index.native.js.map +1 -1
  94. package/dist/cjs/utils/filterUtils.cjs +12 -5
  95. package/dist/cjs/utils/filterUtils.native.js +20 -5
  96. package/dist/cjs/utils/filterUtils.native.js.map +1 -1
  97. package/dist/esm/components/ChildTable/index.mjs +2 -1
  98. package/dist/esm/components/ChildTable/index.mjs.map +1 -1
  99. package/dist/esm/components/ChildTable/index.native.js +2 -1
  100. package/dist/esm/components/ChildTable/index.native.js.map +1 -1
  101. package/dist/esm/components/ColumnHeaderFilter/index.mjs +17 -9
  102. package/dist/esm/components/ColumnHeaderFilter/index.mjs.map +1 -1
  103. package/dist/esm/components/ColumnHeaderFilter/index.native.js +32 -11
  104. package/dist/esm/components/ColumnHeaderFilter/index.native.js.map +1 -1
  105. package/dist/esm/components/DataTable/DataTableDocumentList.mjs +196 -0
  106. package/dist/esm/components/DataTable/DataTableDocumentList.mjs.map +1 -0
  107. package/dist/esm/components/DataTable/DataTableDocumentList.native.js +208 -0
  108. package/dist/esm/components/DataTable/DataTableDocumentList.native.js.map +1 -0
  109. package/dist/esm/components/DataTable/DataTableMobileCards.mjs +5 -2
  110. package/dist/esm/components/DataTable/DataTableMobileCards.mjs.map +1 -1
  111. package/dist/esm/components/DataTable/DataTableMobileCards.native.js +6 -2
  112. package/dist/esm/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  113. package/dist/esm/components/DataTable/DataTableRoot.mjs +93 -42
  114. package/dist/esm/components/DataTable/DataTableRoot.mjs.map +1 -1
  115. package/dist/esm/components/DataTable/DataTableRoot.native.js +98 -44
  116. package/dist/esm/components/DataTable/DataTableRoot.native.js.map +1 -1
  117. package/dist/esm/components/DataTable/DataTableVirtualized.mjs +8 -2
  118. package/dist/esm/components/DataTable/DataTableVirtualized.mjs.map +1 -1
  119. package/dist/esm/components/DataTable/DataTableVirtualized.native.js +9 -3
  120. package/dist/esm/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  121. package/dist/esm/components/DataTable/documentListSlots.mjs +33 -0
  122. package/dist/esm/components/DataTable/documentListSlots.mjs.map +1 -0
  123. package/dist/esm/components/DataTable/documentListSlots.native.js +56 -0
  124. package/dist/esm/components/DataTable/documentListSlots.native.js.map +1 -0
  125. package/dist/esm/components/DataTable/index.native.js +52 -37
  126. package/dist/esm/components/DataTable/index.native.js.map +1 -1
  127. package/dist/esm/components/DataTable/rowStateChrome.mjs +28 -0
  128. package/dist/esm/components/DataTable/rowStateChrome.mjs.map +1 -0
  129. package/dist/esm/components/DataTable/rowStateChrome.native.js +29 -0
  130. package/dist/esm/components/DataTable/rowStateChrome.native.js.map +1 -0
  131. package/dist/esm/components/DataTableCell/CellModalEditor.mjs +25 -4
  132. package/dist/esm/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  133. package/dist/esm/components/DataTableCell/CellModalEditor.native.js +6 -1
  134. package/dist/esm/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  135. package/dist/esm/components/DataTableCell/CellOptionsEditor.mjs +9 -2
  136. package/dist/esm/components/DataTableCell/CellOptionsEditor.mjs.map +1 -1
  137. package/dist/esm/components/DataTableCell/CellOptionsEditor.native.js +11 -2
  138. package/dist/esm/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  139. package/dist/esm/components/DataTableCell/index.mjs +75 -64
  140. package/dist/esm/components/DataTableCell/index.mjs.map +1 -1
  141. package/dist/esm/components/DataTableCell/index.native.js +95 -83
  142. package/dist/esm/components/DataTableCell/index.native.js.map +1 -1
  143. package/dist/esm/components/DataTableColumnPinning/index.mjs +54 -37
  144. package/dist/esm/components/DataTableColumnPinning/index.mjs.map +1 -1
  145. package/dist/esm/components/DataTableColumnPinning/index.native.js +59 -38
  146. package/dist/esm/components/DataTableColumnPinning/index.native.js.map +1 -1
  147. package/dist/esm/components/DataTableDateFilter/index.mjs +34 -15
  148. package/dist/esm/components/DataTableDateFilter/index.mjs.map +1 -1
  149. package/dist/esm/components/DataTableDateFilter/index.native.js +34 -13
  150. package/dist/esm/components/DataTableDateFilter/index.native.js.map +1 -1
  151. package/dist/esm/components/DataTableExport/index.mjs +36 -8
  152. package/dist/esm/components/DataTableExport/index.mjs.map +1 -1
  153. package/dist/esm/components/DataTableExport/index.native.js +43 -8
  154. package/dist/esm/components/DataTableExport/index.native.js.map +1 -1
  155. package/dist/esm/components/DataTableFacetMenu/index.mjs +115 -0
  156. package/dist/esm/components/DataTableFacetMenu/index.mjs.map +1 -0
  157. package/dist/esm/components/DataTableFacetMenu/index.native.js +128 -0
  158. package/dist/esm/components/DataTableFacetMenu/index.native.js.map +1 -0
  159. package/dist/esm/components/DataTableFilterButton/index.mjs +54 -35
  160. package/dist/esm/components/DataTableFilterButton/index.mjs.map +1 -1
  161. package/dist/esm/components/DataTableFilterButton/index.native.js +66 -43
  162. package/dist/esm/components/DataTableFilterButton/index.native.js.map +1 -1
  163. package/dist/esm/components/DataTableFilterChips/FilterChip.mjs +118 -0
  164. package/dist/esm/components/DataTableFilterChips/FilterChip.mjs.map +1 -0
  165. package/dist/esm/components/DataTableFilterChips/FilterChip.native.js +120 -0
  166. package/dist/esm/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
  167. package/dist/esm/components/DataTableFilterChips/index.mjs +9 -32
  168. package/dist/esm/components/DataTableFilterChips/index.mjs.map +1 -1
  169. package/dist/esm/components/DataTableFilterChips/index.native.js +9 -33
  170. package/dist/esm/components/DataTableFilterChips/index.native.js.map +1 -1
  171. package/dist/esm/components/DataTableFilters/index.mjs +149 -506
  172. package/dist/esm/components/DataTableFilters/index.mjs.map +1 -1
  173. package/dist/esm/components/DataTableFilters/index.native.js +175 -548
  174. package/dist/esm/components/DataTableFilters/index.native.js.map +1 -1
  175. package/dist/esm/components/DataTableGrouping/index.mjs +275 -110
  176. package/dist/esm/components/DataTableGrouping/index.mjs.map +1 -1
  177. package/dist/esm/components/DataTableGrouping/index.native.js +287 -134
  178. package/dist/esm/components/DataTableGrouping/index.native.js.map +1 -1
  179. package/dist/esm/components/DataTablePagination/index.mjs +148 -96
  180. package/dist/esm/components/DataTablePagination/index.mjs.map +1 -1
  181. package/dist/esm/components/DataTablePagination/index.native.js +160 -107
  182. package/dist/esm/components/DataTablePagination/index.native.js.map +1 -1
  183. package/dist/esm/components/DataTableSearch/index.mjs +256 -215
  184. package/dist/esm/components/DataTableSearch/index.mjs.map +1 -1
  185. package/dist/esm/components/DataTableSearch/index.native.js +297 -248
  186. package/dist/esm/components/DataTableSearch/index.native.js.map +1 -1
  187. package/dist/esm/components/DataTableToolbar/index.mjs +145 -119
  188. package/dist/esm/components/DataTableToolbar/index.mjs.map +1 -1
  189. package/dist/esm/components/DataTableToolbar/index.native.js +167 -152
  190. package/dist/esm/components/DataTableToolbar/index.native.js.map +1 -1
  191. package/dist/esm/components/DataTableViewOptions/index.mjs +26 -22
  192. package/dist/esm/components/DataTableViewOptions/index.mjs.map +1 -1
  193. package/dist/esm/components/DataTableViewOptions/index.native.js +7 -5
  194. package/dist/esm/components/DataTableViewOptions/index.native.js.map +1 -1
  195. package/dist/esm/components/SimpleTable/index.mjs +338 -48
  196. package/dist/esm/components/SimpleTable/index.mjs.map +1 -1
  197. package/dist/esm/components/SimpleTable/index.native.js +358 -50
  198. package/dist/esm/components/SimpleTable/index.native.js.map +1 -1
  199. package/dist/esm/components/TableInput/index.mjs +150 -41
  200. package/dist/esm/components/TableInput/index.mjs.map +1 -1
  201. package/dist/esm/components/TableInput/index.native.js +55 -39
  202. package/dist/esm/components/TableInput/index.native.js.map +1 -1
  203. package/dist/esm/components/TableInput/shared.mjs +34 -1
  204. package/dist/esm/components/TableInput/shared.mjs.map +1 -1
  205. package/dist/esm/components/TableInput/shared.native.js +34 -1
  206. package/dist/esm/components/TableInput/shared.native.js.map +1 -1
  207. package/dist/esm/hooks/useDataTable.mjs +33 -2
  208. package/dist/esm/hooks/useDataTable.mjs.map +1 -1
  209. package/dist/esm/hooks/useDataTable.native.js +41 -2
  210. package/dist/esm/hooks/useDataTable.native.js.map +1 -1
  211. package/dist/esm/hooks/useInfiniteRows.mjs +20 -3
  212. package/dist/esm/hooks/useInfiniteRows.mjs.map +1 -1
  213. package/dist/esm/hooks/useInfiniteRows.native.js +20 -3
  214. package/dist/esm/hooks/useInfiniteRows.native.js.map +1 -1
  215. package/dist/esm/index.mjs +2 -1
  216. package/dist/esm/index.mjs.map +1 -1
  217. package/dist/esm/index.native.js +2 -1
  218. package/dist/esm/index.native.js.map +1 -1
  219. package/dist/esm/utils/filterUtils.mjs +12 -5
  220. package/dist/esm/utils/filterUtils.mjs.map +1 -1
  221. package/dist/esm/utils/filterUtils.native.js +20 -5
  222. package/dist/esm/utils/filterUtils.native.js.map +1 -1
  223. package/dist/jsx/components/ChildTable/index.mjs +2 -1
  224. package/dist/jsx/components/ChildTable/index.mjs.map +1 -1
  225. package/dist/jsx/components/ChildTable/index.native.js +2 -1
  226. package/dist/jsx/components/ChildTable/index.native.js.map +1 -1
  227. package/dist/jsx/components/ColumnHeaderFilter/index.mjs +17 -9
  228. package/dist/jsx/components/ColumnHeaderFilter/index.mjs.map +1 -1
  229. package/dist/jsx/components/ColumnHeaderFilter/index.native.js +32 -11
  230. package/dist/jsx/components/ColumnHeaderFilter/index.native.js.map +1 -1
  231. package/dist/jsx/components/DataTable/DataTableDocumentList.mjs +196 -0
  232. package/dist/jsx/components/DataTable/DataTableDocumentList.mjs.map +1 -0
  233. package/dist/jsx/components/DataTable/DataTableDocumentList.native.js +237 -0
  234. package/dist/jsx/components/DataTable/DataTableDocumentList.native.js.map +1 -0
  235. package/dist/jsx/components/DataTable/DataTableMobileCards.mjs +5 -2
  236. package/dist/jsx/components/DataTable/DataTableMobileCards.mjs.map +1 -1
  237. package/dist/jsx/components/DataTable/DataTableMobileCards.native.js +6 -2
  238. package/dist/jsx/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  239. package/dist/jsx/components/DataTable/DataTableRoot.mjs +93 -42
  240. package/dist/jsx/components/DataTable/DataTableRoot.mjs.map +1 -1
  241. package/dist/jsx/components/DataTable/DataTableRoot.native.js +97 -43
  242. package/dist/jsx/components/DataTable/DataTableRoot.native.js.map +1 -1
  243. package/dist/jsx/components/DataTable/DataTableVirtualized.mjs +8 -2
  244. package/dist/jsx/components/DataTable/DataTableVirtualized.mjs.map +1 -1
  245. package/dist/jsx/components/DataTable/DataTableVirtualized.native.js +9 -3
  246. package/dist/jsx/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  247. package/dist/jsx/components/DataTable/documentListSlots.mjs +33 -0
  248. package/dist/jsx/components/DataTable/documentListSlots.mjs.map +1 -0
  249. package/dist/jsx/components/DataTable/documentListSlots.native.js +85 -0
  250. package/dist/jsx/components/DataTable/documentListSlots.native.js.map +1 -0
  251. package/dist/jsx/components/DataTable/index.native.js +74 -59
  252. package/dist/jsx/components/DataTable/index.native.js.map +1 -1
  253. package/dist/jsx/components/DataTable/rowStateChrome.mjs +28 -0
  254. package/dist/jsx/components/DataTable/rowStateChrome.mjs.map +1 -0
  255. package/dist/jsx/components/DataTable/rowStateChrome.native.js +59 -0
  256. package/dist/jsx/components/DataTable/rowStateChrome.native.js.map +1 -0
  257. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs +25 -4
  258. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  259. package/dist/jsx/components/DataTableCell/CellModalEditor.native.js +6 -1
  260. package/dist/jsx/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  261. package/dist/jsx/components/DataTableCell/CellOptionsEditor.mjs +9 -2
  262. package/dist/jsx/components/DataTableCell/CellOptionsEditor.mjs.map +1 -1
  263. package/dist/jsx/components/DataTableCell/CellOptionsEditor.native.js +11 -2
  264. package/dist/jsx/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  265. package/dist/jsx/components/DataTableCell/index.mjs +75 -64
  266. package/dist/jsx/components/DataTableCell/index.mjs.map +1 -1
  267. package/dist/jsx/components/DataTableCell/index.native.js +94 -82
  268. package/dist/jsx/components/DataTableCell/index.native.js.map +1 -1
  269. package/dist/jsx/components/DataTableColumnPinning/index.mjs +54 -37
  270. package/dist/jsx/components/DataTableColumnPinning/index.mjs.map +1 -1
  271. package/dist/jsx/components/DataTableColumnPinning/index.native.js +59 -38
  272. package/dist/jsx/components/DataTableColumnPinning/index.native.js.map +1 -1
  273. package/dist/jsx/components/DataTableDateFilter/index.mjs +34 -15
  274. package/dist/jsx/components/DataTableDateFilter/index.mjs.map +1 -1
  275. package/dist/jsx/components/DataTableDateFilter/index.native.js +33 -12
  276. package/dist/jsx/components/DataTableDateFilter/index.native.js.map +1 -1
  277. package/dist/jsx/components/DataTableExport/index.mjs +36 -8
  278. package/dist/jsx/components/DataTableExport/index.mjs.map +1 -1
  279. package/dist/jsx/components/DataTableExport/index.native.js +42 -7
  280. package/dist/jsx/components/DataTableExport/index.native.js.map +1 -1
  281. package/dist/jsx/components/DataTableFacetMenu/index.mjs +115 -0
  282. package/dist/jsx/components/DataTableFacetMenu/index.mjs.map +1 -0
  283. package/dist/jsx/components/DataTableFacetMenu/index.native.js +156 -0
  284. package/dist/jsx/components/DataTableFacetMenu/index.native.js.map +1 -0
  285. package/dist/jsx/components/DataTableFilterButton/index.mjs +54 -35
  286. package/dist/jsx/components/DataTableFilterButton/index.mjs.map +1 -1
  287. package/dist/jsx/components/DataTableFilterButton/index.native.js +63 -40
  288. package/dist/jsx/components/DataTableFilterButton/index.native.js.map +1 -1
  289. package/dist/jsx/components/DataTableFilterChips/FilterChip.mjs +118 -0
  290. package/dist/jsx/components/DataTableFilterChips/FilterChip.mjs.map +1 -0
  291. package/dist/jsx/components/DataTableFilterChips/FilterChip.native.js +148 -0
  292. package/dist/jsx/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
  293. package/dist/jsx/components/DataTableFilterChips/index.mjs +9 -32
  294. package/dist/jsx/components/DataTableFilterChips/index.mjs.map +1 -1
  295. package/dist/jsx/components/DataTableFilterChips/index.native.js +9 -32
  296. package/dist/jsx/components/DataTableFilterChips/index.native.js.map +1 -1
  297. package/dist/jsx/components/DataTableFilters/index.mjs +149 -506
  298. package/dist/jsx/components/DataTableFilters/index.mjs.map +1 -1
  299. package/dist/jsx/components/DataTableFilters/index.native.js +171 -544
  300. package/dist/jsx/components/DataTableFilters/index.native.js.map +1 -1
  301. package/dist/jsx/components/DataTableGrouping/index.mjs +275 -110
  302. package/dist/jsx/components/DataTableGrouping/index.mjs.map +1 -1
  303. package/dist/jsx/components/DataTableGrouping/index.native.js +310 -157
  304. package/dist/jsx/components/DataTableGrouping/index.native.js.map +1 -1
  305. package/dist/jsx/components/DataTablePagination/index.mjs +148 -96
  306. package/dist/jsx/components/DataTablePagination/index.mjs.map +1 -1
  307. package/dist/jsx/components/DataTablePagination/index.native.js +159 -106
  308. package/dist/jsx/components/DataTablePagination/index.native.js.map +1 -1
  309. package/dist/jsx/components/DataTableSearch/index.mjs +256 -215
  310. package/dist/jsx/components/DataTableSearch/index.mjs.map +1 -1
  311. package/dist/jsx/components/DataTableSearch/index.native.js +292 -243
  312. package/dist/jsx/components/DataTableSearch/index.native.js.map +1 -1
  313. package/dist/jsx/components/DataTableToolbar/index.mjs +145 -119
  314. package/dist/jsx/components/DataTableToolbar/index.mjs.map +1 -1
  315. package/dist/jsx/components/DataTableToolbar/index.native.js +163 -148
  316. package/dist/jsx/components/DataTableToolbar/index.native.js.map +1 -1
  317. package/dist/jsx/components/DataTableViewOptions/index.mjs +26 -22
  318. package/dist/jsx/components/DataTableViewOptions/index.mjs.map +1 -1
  319. package/dist/jsx/components/DataTableViewOptions/index.native.js +6 -4
  320. package/dist/jsx/components/DataTableViewOptions/index.native.js.map +1 -1
  321. package/dist/jsx/components/SimpleTable/index.mjs +338 -48
  322. package/dist/jsx/components/SimpleTable/index.mjs.map +1 -1
  323. package/dist/jsx/components/SimpleTable/index.native.js +356 -48
  324. package/dist/jsx/components/SimpleTable/index.native.js.map +1 -1
  325. package/dist/jsx/components/TableInput/index.mjs +150 -41
  326. package/dist/jsx/components/TableInput/index.mjs.map +1 -1
  327. package/dist/jsx/components/TableInput/index.native.js +54 -38
  328. package/dist/jsx/components/TableInput/index.native.js.map +1 -1
  329. package/dist/jsx/components/TableInput/shared.mjs +34 -1
  330. package/dist/jsx/components/TableInput/shared.mjs.map +1 -1
  331. package/dist/jsx/components/TableInput/shared.native.js +35 -0
  332. package/dist/jsx/components/TableInput/shared.native.js.map +1 -1
  333. package/dist/jsx/hooks/useDataTable.mjs +33 -2
  334. package/dist/jsx/hooks/useDataTable.mjs.map +1 -1
  335. package/dist/jsx/hooks/useDataTable.native.js +41 -2
  336. package/dist/jsx/hooks/useDataTable.native.js.map +1 -1
  337. package/dist/jsx/hooks/useInfiniteRows.mjs +20 -3
  338. package/dist/jsx/hooks/useInfiniteRows.mjs.map +1 -1
  339. package/dist/jsx/hooks/useInfiniteRows.native.js +20 -3
  340. package/dist/jsx/hooks/useInfiniteRows.native.js.map +1 -1
  341. package/dist/jsx/index.js +2 -1
  342. package/dist/jsx/index.js.map +1 -1
  343. package/dist/jsx/index.mjs +2 -1
  344. package/dist/jsx/index.mjs.map +1 -1
  345. package/dist/jsx/index.native.js +2 -0
  346. package/dist/jsx/index.native.js.map +1 -1
  347. package/dist/jsx/utils/filterUtils.mjs +12 -5
  348. package/dist/jsx/utils/filterUtils.mjs.map +1 -1
  349. package/dist/jsx/utils/filterUtils.native.js +20 -5
  350. package/dist/jsx/utils/filterUtils.native.js.map +1 -1
  351. package/package.json +15 -15
  352. package/src/components/ChildTable/index.tsx +1 -0
  353. package/src/components/ColumnHeaderFilter/ColumnHeaderFilter.spec.tsx +85 -0
  354. package/src/components/ColumnHeaderFilter/index.tsx +28 -10
  355. package/src/components/DataTable/DataTable.stories.tsx +30 -0
  356. package/src/components/DataTable/DataTableDocumentList.tsx +224 -0
  357. package/src/components/DataTable/DataTableMobileCards.tsx +20 -8
  358. package/src/components/DataTable/DataTableRoot.tsx +135 -58
  359. package/src/components/DataTable/DataTableVirtualized.tsx +8 -11
  360. package/src/components/DataTable/cardLayout.spec.tsx +89 -0
  361. package/src/components/DataTable/documentListSlots.ts +57 -0
  362. package/src/components/DataTable/index.native.tsx +76 -50
  363. package/src/components/DataTable/keepPreviousData.spec.tsx +137 -0
  364. package/src/components/DataTable/rowRing.spec.tsx +118 -0
  365. package/src/components/DataTable/rowStateChrome.ts +38 -0
  366. package/src/components/DataTableCell/CellModalEditor.native.tsx +4 -0
  367. package/src/components/DataTableCell/CellModalEditor.tsx +31 -3
  368. package/src/components/DataTableCell/CellOptionsEditor.tsx +29 -12
  369. package/src/components/DataTableCell/DataTableCell.stories.tsx +3 -3
  370. package/src/components/DataTableCell/cellDraftPolicy.spec.tsx +131 -4
  371. package/src/components/DataTableCell/dataTableCell.spec.tsx +36 -1
  372. package/src/components/DataTableCell/index.tsx +121 -86
  373. package/src/components/DataTableColumnPinning/DataTableColumnPinning.spec.tsx +66 -0
  374. package/src/components/DataTableColumnPinning/index.tsx +32 -17
  375. package/src/components/DataTableDateFilter/DataTableDateFilter.spec.tsx +9 -1
  376. package/src/components/DataTableDateFilter/dateFilterZones.spec.ts +316 -0
  377. package/src/components/DataTableDateFilter/index.tsx +42 -22
  378. package/src/components/DataTableExport/exportDateZones.spec.tsx +348 -0
  379. package/src/components/DataTableExport/index.tsx +107 -63
  380. package/src/components/DataTableFacetMenu/DataTableFacetMenu.spec.tsx +264 -0
  381. package/src/components/DataTableFacetMenu/DataTableFacetMenu.stories.tsx +212 -0
  382. package/src/components/DataTableFacetMenu/index.tsx +202 -0
  383. package/src/components/DataTableFilterButton/index.tsx +66 -49
  384. package/src/components/DataTableFilterChips/DataTableFilterChips.spec.tsx +22 -0
  385. package/src/components/DataTableFilterChips/FilterChip.tsx +122 -0
  386. package/src/components/DataTableFilterChips/index.tsx +13 -29
  387. package/src/components/DataTableFilters/DataTableFilters.spec.tsx +56 -0
  388. package/src/components/DataTableFilters/index.tsx +169 -584
  389. package/src/components/DataTableGrouping/DataTableGrouping.spec.tsx +85 -0
  390. package/src/components/DataTableGrouping/index.tsx +270 -130
  391. package/src/components/DataTablePagination/DataTablePagination.spec.tsx +79 -4
  392. package/src/components/DataTablePagination/index.tsx +168 -112
  393. package/src/components/DataTableSearch/DataTableSearch.spec.tsx +40 -0
  394. package/src/components/DataTableSearch/DataTableSearch.stories.tsx +1 -1
  395. package/src/components/DataTableSearch/index.tsx +192 -163
  396. package/src/components/DataTableToolbar/DataTableToolbar.spec.tsx +48 -18
  397. package/src/components/DataTableToolbar/DataTableToolbar.stories.tsx +5 -45
  398. package/src/components/DataTableToolbar/index.tsx +128 -99
  399. package/src/components/DataTableViewOptions/index.tsx +29 -22
  400. package/src/components/SimpleTable/SimpleTable.stories.tsx +29 -5
  401. package/src/components/SimpleTable/index.tsx +442 -61
  402. package/src/components/SimpleTable/simpleTable.spec.tsx +140 -12
  403. package/src/components/TableInput/index.native.tsx +91 -81
  404. package/src/components/TableInput/index.tsx +191 -50
  405. package/src/components/TableInput/shared.ts +57 -0
  406. package/src/components/TableInput/tableInput.spec.tsx +104 -0
  407. package/src/hooks/useDataTable.spec.ts +100 -3
  408. package/src/hooks/useDataTable.ts +44 -1
  409. package/src/hooks/useInfiniteRows.spec.tsx +37 -0
  410. package/src/hooks/useInfiniteRows.ts +34 -4
  411. package/src/index.ts +7 -0
  412. package/src/types.ts +54 -3
  413. package/src/utils/filterUtils.ts +27 -5
  414. package/types/components/ChildTable/index.d.ts.map +1 -1
  415. package/types/components/ColumnHeaderFilter/index.d.ts.map +1 -1
  416. package/types/components/DataTable/DataTableDocumentList.d.ts +32 -0
  417. package/types/components/DataTable/DataTableDocumentList.d.ts.map +1 -0
  418. package/types/components/DataTable/DataTableMobileCards.d.ts +3 -1
  419. package/types/components/DataTable/DataTableMobileCards.d.ts.map +1 -1
  420. package/types/components/DataTable/DataTableRoot.d.ts +1 -1
  421. package/types/components/DataTable/DataTableRoot.d.ts.map +1 -1
  422. package/types/components/DataTable/DataTableVirtualized.d.ts +1 -2
  423. package/types/components/DataTable/DataTableVirtualized.d.ts.map +1 -1
  424. package/types/components/DataTable/documentListSlots.d.ts +26 -0
  425. package/types/components/DataTable/documentListSlots.d.ts.map +1 -0
  426. package/types/components/DataTable/index.native.d.ts +1 -1
  427. package/types/components/DataTable/index.native.d.ts.map +1 -1
  428. package/types/components/DataTable/rowStateChrome.d.ts +18 -0
  429. package/types/components/DataTable/rowStateChrome.d.ts.map +1 -0
  430. package/types/components/DataTableCell/CellModalEditor.d.ts +6 -1
  431. package/types/components/DataTableCell/CellModalEditor.d.ts.map +1 -1
  432. package/types/components/DataTableCell/CellModalEditor.native.d.ts +1 -1
  433. package/types/components/DataTableCell/CellModalEditor.native.d.ts.map +1 -1
  434. package/types/components/DataTableCell/CellOptionsEditor.d.ts +11 -3
  435. package/types/components/DataTableCell/CellOptionsEditor.d.ts.map +1 -1
  436. package/types/components/DataTableCell/index.d.ts +1 -1
  437. package/types/components/DataTableCell/index.d.ts.map +1 -1
  438. package/types/components/DataTableColumnPinning/index.d.ts.map +1 -1
  439. package/types/components/DataTableDateFilter/index.d.ts.map +1 -1
  440. package/types/components/DataTableExport/index.d.ts +17 -6
  441. package/types/components/DataTableExport/index.d.ts.map +1 -1
  442. package/types/components/DataTableFacetMenu/index.d.ts +84 -0
  443. package/types/components/DataTableFacetMenu/index.d.ts.map +1 -0
  444. package/types/components/DataTableFilterButton/index.d.ts.map +1 -1
  445. package/types/components/DataTableFilterChips/FilterChip.d.ts +15 -0
  446. package/types/components/DataTableFilterChips/FilterChip.d.ts.map +1 -0
  447. package/types/components/DataTableFilterChips/index.d.ts +5 -0
  448. package/types/components/DataTableFilterChips/index.d.ts.map +1 -1
  449. package/types/components/DataTableFilters/index.d.ts +11 -0
  450. package/types/components/DataTableFilters/index.d.ts.map +1 -1
  451. package/types/components/DataTableGrouping/index.d.ts.map +1 -1
  452. package/types/components/DataTablePagination/index.d.ts +5 -0
  453. package/types/components/DataTablePagination/index.d.ts.map +1 -1
  454. package/types/components/DataTableSearch/index.d.ts.map +1 -1
  455. package/types/components/DataTableToolbar/index.d.ts +2 -0
  456. package/types/components/DataTableToolbar/index.d.ts.map +1 -1
  457. package/types/components/SimpleTable/index.d.ts +27 -5
  458. package/types/components/SimpleTable/index.d.ts.map +1 -1
  459. package/types/components/TableInput/index.d.ts +6 -1
  460. package/types/components/TableInput/index.d.ts.map +1 -1
  461. package/types/components/TableInput/index.native.d.ts +6 -1
  462. package/types/components/TableInput/index.native.d.ts.map +1 -1
  463. package/types/components/TableInput/shared.d.ts +38 -0
  464. package/types/components/TableInput/shared.d.ts.map +1 -1
  465. package/types/hooks/useDataTable.d.ts +1 -1
  466. package/types/hooks/useDataTable.d.ts.map +1 -1
  467. package/types/hooks/useInfiniteRows.d.ts +8 -1
  468. package/types/hooks/useInfiniteRows.d.ts.map +1 -1
  469. package/types/index.d.ts +1 -0
  470. package/types/index.d.ts.map +1 -1
  471. package/types/types.d.ts +54 -3
  472. package/types/types.d.ts.map +1 -1
  473. package/types/utils/filterUtils.d.ts.map +1 -1
@@ -1,4 +1,6 @@
1
1
  import {
2
+ ArrowDownIcon,
3
+ ArrowUpIcon,
2
4
  ChartBarIcon,
3
5
  CalculatorIcon,
4
6
  CaretDownIcon,
@@ -11,7 +13,17 @@ import {
11
13
  GearIcon,
12
14
  } from "@phosphor-icons/react";
13
15
  import { useDirection } from "@multiplatform.one/components";
14
- import { formatNumber, useResolvedKnobs } from "@multiplatform.one/theme";
16
+ import {
17
+ ensureFocusVisibleRing,
18
+ formatNumber,
19
+ getGroupPosition,
20
+ hairline,
21
+ sizeRecipeForToken,
22
+ stackEdgeRadius,
23
+ stackRadiusProps,
24
+ useResolvedKnobs,
25
+ type GroupPosition,
26
+ } from "@multiplatform.one/theme";
15
27
  import { useCallback, useMemo, useState } from "react";
16
28
  import { Button, Select } from "@multiplatform.one/forms";
17
29
  import { Popover, Separator, Text, View, XStack, YStack, isWeb } from "tamagui";
@@ -80,6 +92,15 @@ const groupItemPaddingMap: Record<string, string> = {
80
92
  large: "$3",
81
93
  };
82
94
 
95
+ // Tree indent rides the space knob so nested groups stay flush full-bleed
96
+ // rows (padding, never margin) — AG Grid / Excel / Airtable grouping: the
97
+ // chevron and label step in, the painted row still spans the stack.
98
+ const groupIndentStepMap: Record<string, number> = {
99
+ small: 12,
100
+ medium: 16,
101
+ large: 24,
102
+ };
103
+
83
104
  // T-VALUE meta text rides one step below the size-knob body scale (LC-18);
84
105
  // medium keeps the previous $3.
85
106
  const groupMetaSizeMap: Record<string, string> = {
@@ -88,6 +109,30 @@ const groupMetaSizeMap: Record<string, string> = {
88
109
  $5: "$4",
89
110
  };
90
111
 
112
+ // Chevron/tree glyphs are control-internal icons (LC-75/LC-79): the
113
+ // generated recipe's icon channel (lossless vs the old $3/$4/$5 map).
114
+ const groupIconSize = (token: string): number => sizeRecipeForToken(token).iconSize;
115
+
116
+ const startRail = isWeb
117
+ ? {
118
+ borderInlineStartWidth: 4,
119
+ borderInlineStartStyle: "solid" as const,
120
+ borderInlineStartColor: "$color6",
121
+ }
122
+ : { borderStartWidth: 4, borderStartColor: "$color6" };
123
+
124
+ function groupIndent(space: string | undefined, level: number): number {
125
+ return (groupIndentStepMap[space ?? "medium"] ?? 16) * Math.max(0, level);
126
+ }
127
+
128
+ function formatCellValue(value: unknown): string {
129
+ if (value == null) return "";
130
+ if (typeof value === "number") {
131
+ return Number.isFinite(value) ? formatNumber(value) : "";
132
+ }
133
+ return String(value);
134
+ }
135
+
91
136
  /**
92
137
  * Group aggregates are the same number class as the cells they summarise, so
93
138
  * they render through the house number register (LC-12 render channel) —
@@ -185,6 +230,8 @@ export function DataTableGrouping<T = any>(props: DataTableGroupingProps<T>) {
185
230
  groupedData={groupedData}
186
231
  columns={columns}
187
232
  level={0}
233
+ stackStart
234
+ stackEnd
188
235
  aggregations={aggregations}
189
236
  showAggregations={showAggregations}
190
237
  expandedGroups={expandedGroups}
@@ -199,6 +246,10 @@ interface GroupedDataRendererProps<T = any> {
199
246
  groupedData: GroupedData<T>[];
200
247
  columns: DataTableGroupingProps<T>["columns"];
201
248
  level: number;
249
+ /** This level occupies the root stack's leading edge (LC-72). */
250
+ stackStart: boolean;
251
+ /** This level occupies the root stack's trailing edge (LC-72). */
252
+ stackEnd: boolean;
202
253
  aggregations: AggregationConfig[];
203
254
  showAggregations?: boolean;
204
255
  expandedGroups: Set<string>;
@@ -211,6 +262,8 @@ function GroupedDataRenderer<T = any>({
211
262
  groupedData,
212
263
  columns,
213
264
  level,
265
+ stackStart,
266
+ stackEnd,
214
267
  aggregations,
215
268
  showAggregations,
216
269
  expandedGroups,
@@ -220,16 +273,23 @@ function GroupedDataRenderer<T = any>({
220
273
  }: GroupedDataRendererProps<T>) {
221
274
  return (
222
275
  <YStack>
223
- {groupedData.map((group) => {
276
+ {groupedData.map((group, groupIndex) => {
224
277
  const groupKey = getGroupKey(group);
225
278
  const isExpanded = expandedGroups.has(groupKey);
226
- // Every group is expandable: child groups OR leaf items render on
227
- // expand — the caret affordance must not vanish for leaf groups.
228
279
  const isExpandable = (group.children?.length ?? 0) > 0 || group.items.length > 0;
280
+ const position = getGroupPosition(groupIndex, groupedData.length);
281
+ const isFirst = position === "first" || position === "only";
282
+ const isLast = position === "last" || position === "only";
283
+ // Nested groups sit under a parent header, so they never own the
284
+ // stack's leading corners. An OPEN header abuts its own content, so
285
+ // it drops trailing radius even when it is last (accordion corollary).
286
+ const headerStart = stackStart && isFirst;
287
+ const headerEnd = stackEnd && isLast && !isExpanded;
288
+ const childStackEnd = stackEnd && isLast;
229
289
 
230
290
  return (
231
291
  <YStack key={groupKey}>
232
- {/* Group Header */}
292
+ {groupIndex > 0 ? <View {...hairline.line} /> : null}
233
293
  <GroupHeader
234
294
  group={group}
235
295
  level={level}
@@ -239,16 +299,21 @@ function GroupedDataRenderer<T = any>({
239
299
  showAggregations={showAggregations ?? true}
240
300
  onToggleExpansion={() => onToggleExpansion(groupKey)}
241
301
  renderCustomHeader={renderGroupHeader}
302
+ position={position}
303
+ stackStart={headerStart}
304
+ stackEnd={headerEnd}
242
305
  />
243
306
 
244
- {/* Group Content */}
245
307
  {isExpanded && (
246
- <YStack marginInlineStart={level * 20}>
308
+ <>
309
+ <View {...hairline.line} />
247
310
  {group.children && group.children.length > 0 ? (
248
311
  <GroupedDataRenderer
249
312
  groupedData={group.children}
250
313
  columns={columns}
251
314
  level={level + 1}
315
+ stackStart={false}
316
+ stackEnd={childStackEnd}
252
317
  aggregations={aggregations}
253
318
  showAggregations={showAggregations}
254
319
  expandedGroups={expandedGroups}
@@ -257,12 +322,16 @@ function GroupedDataRenderer<T = any>({
257
322
  renderGroupFooter={renderGroupFooter}
258
323
  />
259
324
  ) : (
260
- <GroupItems items={group.items} columns={columns} />
325
+ <GroupItems
326
+ items={group.items}
327
+ columns={columns}
328
+ level={level + 1}
329
+ stackEnd={childStackEnd}
330
+ />
261
331
  )}
262
- </YStack>
332
+ </>
263
333
  )}
264
334
 
265
- {/* Group Footer */}
266
335
  {renderGroupFooter && isExpanded && (
267
336
  <GroupFooter group={group} level={level} renderCustomFooter={renderGroupFooter} />
268
337
  )}
@@ -282,6 +351,9 @@ interface GroupHeaderProps<T = any> {
282
351
  showAggregations?: boolean;
283
352
  onToggleExpansion: () => void;
284
353
  renderCustomHeader?: (group: GroupedData<T>, level: number) => React.ReactNode;
354
+ position?: GroupPosition;
355
+ stackStart: boolean;
356
+ stackEnd: boolean;
285
357
  }
286
358
 
287
359
  function GroupHeader<T = any>({
@@ -293,12 +365,23 @@ function GroupHeader<T = any>({
293
365
  showAggregations,
294
366
  onToggleExpansion,
295
367
  renderCustomHeader,
368
+ position = "only",
369
+ stackStart,
370
+ stackEnd,
296
371
  }: GroupHeaderProps<T>) {
297
372
  const { knobProps } = useResolvedKnobs();
298
- // Collapsed caret encodes the expansion direction (inline-end), so it
299
- // mirrors in RTL via glyph swap (useDirection); the expanded CaretDown is
300
- // direction-neutral and never mirrors.
301
373
  const CollapsedCaretIcon = useDirection() === "rtl" ? CaretLeftIcon : CaretRightIcon;
374
+ const corners = stackEdgeRadius(knobProps.borderRadius.borderRadius, {
375
+ start: stackStart,
376
+ end: stackEnd,
377
+ });
378
+ const iconSize = groupIconSize(String(knobProps.sizeToken));
379
+ const metaSize = groupMetaSizeMap[knobProps.sizeToken] ?? "$3";
380
+ const indent = groupIndent(knobProps.space, level);
381
+ const label = group.value == null || group.value === "" ? "No Value" : String(group.value);
382
+ const countLabel = `${formatNumber(group.count, { maximumFractionDigits: 0 })} item${
383
+ group.count !== 1 ? "s" : ""
384
+ }`;
302
385
 
303
386
  if (renderCustomHeader) {
304
387
  return <View>{renderCustomHeader(group, level)}</View>;
@@ -306,33 +389,30 @@ function GroupHeader<T = any>({
306
389
 
307
390
  return (
308
391
  <XStack
309
- {...knobProps.borderRadius}
392
+ {...corners}
393
+ {...startRail}
310
394
  alignItems="center"
395
+ gap="$2"
396
+ minHeight={44}
311
397
  padding={groupHeaderPaddingMap[knobProps.space] ?? "$3"}
312
- // SF-CONTROL fill tier: filled keeps the previous $color2; outlined
313
- // flips to transparent (InputParts pattern, spec:388-392).
314
398
  backgroundColor={knobProps.inputBackground}
315
- // Logical start accent so the group rail mirrors in RTL; tamagui
316
- // borderStartWidth does not compile to working CSS on web (SB-M-1215).
317
- {...(isWeb
318
- ? {
319
- borderInlineStartWidth: 4,
320
- borderInlineStartStyle: "solid" as any,
321
- borderInlineStartColor: "$color6",
322
- }
323
- : { borderStartWidth: 4, borderStartColor: "$color6" })}
399
+ overflow="hidden"
324
400
  cursor="pointer"
325
- hoverStyle={{
326
- backgroundColor:
327
- level === 0 ? "$accentBackground" : { backgroundColor: "$color2" }.backgroundColor,
328
- }}
401
+ hoverStyle={{ backgroundColor: "$backgroundHover", ...corners }}
402
+ pressStyle={{ backgroundColor: "$backgroundPress", ...corners }}
329
403
  onPress={onToggleExpansion}
330
- // Keyboard + AT contract: the header is a toggle button with an
331
- // expanded state; Enter/Space activate it like the pointer does.
332
404
  role="button"
333
405
  tabIndex={0}
334
406
  aria-expanded={isExpanded}
407
+ aria-label={`${label}, ${countLabel}`}
408
+ outlineWidth={0}
409
+ focusStyle={{ outlineWidth: 0 }}
410
+ focusVisibleStyle={ensureFocusVisibleRing({ outlineOffset: -2 })}
335
411
  {...({
412
+ "data-testid": "data-table-group-header",
413
+ "data-group-position": position,
414
+ "data-stack-start": stackStart ? "true" : "false",
415
+ "data-stack-end": stackEnd ? "true" : "false",
336
416
  onKeyDown: (e: React.KeyboardEvent) => {
337
417
  if (e.key === "Enter" || e.key === " ") {
338
418
  e.preventDefault();
@@ -341,41 +421,36 @@ function GroupHeader<T = any>({
341
421
  },
342
422
  } as any)}
343
423
  >
344
- {/* Expansion Toggle */}
345
- <View width={20} alignItems="center">
424
+ <View width={iconSize + 4} alignItems="center" marginInlineStart={indent}>
346
425
  {hasChildren &&
347
- (isExpanded ? <CaretDownIcon size={16} /> : <CollapsedCaretIcon size={16} />)}
426
+ (isExpanded ? <CaretDownIcon size={iconSize} /> : <CollapsedCaretIcon size={iconSize} />)}
348
427
  </View>
349
428
 
350
- {/* Group Info */}
351
- <YStack flex={1}>
352
- <XStack alignItems="center" gap="$2">
353
- <Text fontSize={knobProps.sizeToken} fontWeight="600">
354
- {/* Nullish/empty shows the placeholder; falsy-but-real values
355
- like 0 and false render as themselves. */}
356
- {group.value == null || group.value === "" ? "No Value" : String(group.value)}
429
+ <XStack flex={1} alignItems="center" justifyContent="space-between" gap="$3" flexWrap="wrap">
430
+ <XStack alignItems="center" gap="$2" flexShrink={1} minWidth={0}>
431
+ <Text fontSize={knobProps.sizeToken} fontWeight="600" numberOfLines={1}>
432
+ {label}
357
433
  </Text>
358
- <Text fontSize={groupMetaSizeMap[knobProps.sizeToken] ?? "$3"} color="$color10">
359
- ({group.count} item{group.count !== 1 ? "s" : ""})
434
+ <Text fontSize={metaSize} color="$color10">
435
+ ({countLabel})
360
436
  </Text>
361
437
  </XStack>
362
438
 
363
- {/* Aggregations */}
364
439
  {showAggregations && aggregations.length > 0 && (
365
- <XStack gap="$4" marginTop="$2">
440
+ <XStack gap="$3" flexWrap="wrap" justifyContent="flex-end">
366
441
  {aggregations.map((agg, index) => (
367
- <XStack key={index} alignItems="center" gap="$1">
368
- <Text fontSize={groupMetaSizeMap[knobProps.sizeToken] ?? "$3"} color="$color10">
369
- {agg.label || `${agg.function}(${agg.column})`}:
442
+ <XStack key={index} alignItems="baseline" gap="$1">
443
+ <Text fontSize={metaSize} color="$color10">
444
+ {`${agg.label || `${agg.function}(${agg.column})`}:`}
370
445
  </Text>
371
- <Text fontSize={groupMetaSizeMap[knobProps.sizeToken] ?? "$3"} fontWeight="500">
446
+ <Text fontSize={metaSize} fontWeight="600">
372
447
  {formatAggregateValue(group.aggregations[agg.column]?.[agg.function], agg)}
373
448
  </Text>
374
449
  </XStack>
375
450
  ))}
376
451
  </XStack>
377
452
  )}
378
- </YStack>
453
+ </XStack>
379
454
  </XStack>
380
455
  );
381
456
  }
@@ -387,47 +462,62 @@ interface GroupItemsProps<T = any> {
387
462
  header?: string | React.ReactNode;
388
463
  id?: string;
389
464
  }>;
465
+ level: number;
466
+ stackEnd: boolean;
390
467
  }
391
468
 
392
- function GroupItems<T = any>({ items, columns = [] }: GroupItemsProps<T>) {
469
+ function GroupItems<T = any>({ items, columns = [], level, stackEnd }: GroupItemsProps<T>) {
393
470
  const { knobProps } = useResolvedKnobs();
471
+ const metaSize = groupMetaSizeMap[knobProps.sizeToken] ?? "$3";
472
+ const indent = groupIndent(knobProps.space, level);
394
473
  return (
395
474
  <YStack>
396
- {items.map((item, index) => (
397
- <XStack
398
- {...knobProps.borderRadius}
399
- key={index}
400
- padding={groupItemPaddingMap[knobProps.space] ?? "$2"}
401
- paddingInlineStart="$4"
402
- backgroundColor={index % 2 === 0 ? "$background" : "$color2"}
403
- borderBottomWidth={1}
404
- borderBottomColor="$borderColor"
405
- >
406
- {columns.length > 0 ? (
407
- columns.map((column, colIndex) => {
408
- const key = column.accessorKey || column.id || `col-${colIndex}`;
409
- const value = (item as any)[key];
410
- return (
411
- <View key={key} flex={1}>
412
- <Text fontSize={groupMetaSizeMap[knobProps.sizeToken] ?? "$3"}>
413
- {String(value ?? "")}
414
- </Text>
415
- </View>
416
- );
417
- })
418
- ) : (
419
- <Text fontSize={groupMetaSizeMap[knobProps.sizeToken] ?? "$3"}>
420
- {JSON.stringify(item, null, 2)}
421
- </Text>
422
- )}
423
- </XStack>
424
- ))}
475
+ {items.map((item, index) => {
476
+ const position = getGroupPosition(index, items.length);
477
+ const isLast = position === "last" || position === "only";
478
+ const corners = stackEdgeRadius(knobProps.borderRadius.borderRadius, {
479
+ start: false,
480
+ end: stackEnd && isLast,
481
+ });
482
+ return (
483
+ <YStack key={index}>
484
+ {index > 0 ? <View {...hairline.line} /> : null}
485
+ <XStack
486
+ {...corners}
487
+ padding={groupItemPaddingMap[knobProps.space] ?? "$2"}
488
+ paddingInlineStart={indent + 12}
489
+ overflow="hidden"
490
+ backgroundColor={index % 2 === 0 ? "$background" : "$color2"}
491
+ hoverStyle={{ backgroundColor: "$backgroundHover", ...corners }}
492
+ {...({
493
+ "data-testid": "data-table-group-item",
494
+ "data-group-position": position,
495
+ "data-stack-end": stackEnd && isLast ? "true" : "false",
496
+ } as any)}
497
+ >
498
+ {columns.length > 0 ? (
499
+ columns.map((column, colIndex) => {
500
+ const key = column.accessorKey || column.id || `col-${colIndex}`;
501
+ const value = (item as any)[key];
502
+ return (
503
+ <View key={key} flex={1} minWidth={0}>
504
+ <Text fontSize={metaSize} numberOfLines={1}>
505
+ {formatCellValue(value)}
506
+ </Text>
507
+ </View>
508
+ );
509
+ })
510
+ ) : (
511
+ <Text fontSize={metaSize}>{JSON.stringify(item, null, 2)}</Text>
512
+ )}
513
+ </XStack>
514
+ </YStack>
515
+ );
516
+ })}
425
517
  </YStack>
426
518
  );
427
519
  }
428
520
 
429
- // Group Footer Component
430
-
431
521
  interface GroupFooterProps<T = any> {
432
522
  group: GroupedData<T>;
433
523
  level: number;
@@ -435,7 +525,12 @@ interface GroupFooterProps<T = any> {
435
525
  }
436
526
 
437
527
  function GroupFooter<T = any>({ group, level, renderCustomFooter }: GroupFooterProps<T>) {
438
- return <View marginInlineStart={level * 20}>{renderCustomFooter(group, level)}</View>;
528
+ const { knobProps } = useResolvedKnobs();
529
+ return (
530
+ <View paddingInlineStart={groupIndent(knobProps.space, level)}>
531
+ {renderCustomFooter(group, level)}
532
+ </View>
533
+ );
439
534
  }
440
535
 
441
536
  // Grouping Configuration Component
@@ -519,6 +614,17 @@ export function DataTableGroupingConfig<T = any>(props: DataTableGroupingConfigP
519
614
  onConfigChange(newConfig);
520
615
  };
521
616
 
617
+ const handleMoveGroupBy = (index: number, direction: -1 | 1) => {
618
+ const next = [...currentConfig.columns];
619
+ const swap = index + direction;
620
+ if (swap < 0 || swap >= next.length) return;
621
+ [next[index], next[swap]] = [next[swap], next[index]];
622
+ onConfigChange({ ...currentConfig, columns: next });
623
+ };
624
+
625
+ const iconSize = groupIconSize(String(sz));
626
+ const radius = knobProps.borderRadius.borderRadius;
627
+
522
628
  return (
523
629
  // LC-06/LC-10: collision handling — the config list grows with every
524
630
  // group-by/aggregation added and must clamp + scroll inside the viewport
@@ -528,24 +634,22 @@ export function DataTableGroupingConfig<T = any>(props: DataTableGroupingConfigP
528
634
  <Button
529
635
  size={knobProps.sizeToken}
530
636
  variant="outlined"
531
- icon={<GearIcon size={16} />}
637
+ icon={<GearIcon size={iconSize} />}
532
638
  disabled={disabled}
533
639
  aria-label="Grouping configuration"
534
640
  >
535
641
  <XStack alignItems="center" gap="$2">
536
- <ChartBarIcon size={16} />
642
+ <ChartBarIcon size={iconSize} />
537
643
  <Text>Group & Aggregate</Text>
538
644
  {(currentConfig.columns.length > 0 || currentConfig.aggregations.length > 0) && (
539
645
  <View
540
646
  backgroundColor="$color6"
541
- borderRadius={knobProps.borderRadius.borderRadius}
647
+ borderRadius={1000}
542
648
  paddingHorizontal="$1"
543
649
  paddingVertical={2}
544
650
  minWidth={20}
545
651
  alignItems="center"
546
652
  >
547
- {/* LC-05/DG-COL-01: theme ink, not a named hue — "white" was
548
- unreadable on the light-scheme $color6 badge fill. */}
549
653
  <Text fontSize="$2" color="$color12" fontWeight="600">
550
654
  {currentConfig.columns.length + currentConfig.aggregations.length}
551
655
  </Text>
@@ -559,6 +663,7 @@ export function DataTableGroupingConfig<T = any>(props: DataTableGroupingConfigP
559
663
  {...knobProps.borderRadius}
560
664
  borderWidth={1}
561
665
  borderColor="$borderColor"
666
+ // LC-24: enter/exit styles are dead code without a resolved token
562
667
  transition={knobProps.transition}
563
668
  enterStyle={{ x: 0, y: -10, opacity: 0 }}
564
669
  exitStyle={{ x: 0, y: -10, opacity: 0 }}
@@ -585,29 +690,54 @@ export function DataTableGroupingConfig<T = any>(props: DataTableGroupingConfigP
585
690
  </XStack>
586
691
 
587
692
  {/* Current Group By Columns */}
588
- <YStack gap="$1">
693
+ <YStack>
589
694
  {currentConfig.columns.map((columnKey, index) => {
590
695
  const column = columns.find((col) => (col.accessorKey || col.id) === columnKey);
696
+ const position = getGroupPosition(index, currentConfig.columns.length);
697
+ const corners = stackRadiusProps(position, radius);
698
+ const label = String(column?.header || columnKey);
591
699
  return (
592
- <XStack
593
- key={columnKey}
594
- alignItems="center"
595
- gap="$2"
596
- padding="$2"
597
- {...{ backgroundColor: "$color2" }}
598
- borderRadius={knobProps.borderRadius.borderRadius}
599
- >
600
- <Text fontSize="$3" flex={1}>
601
- {column?.header || columnKey} ({index + 1})
602
- </Text>
603
- <Button
604
- size={knobProps.sizeToken}
605
- variant="outlined"
606
- icon={<MinusIcon size={16} />}
607
- onPress={() => handleRemoveGroupBy(columnKey)}
608
- aria-label={`Remove grouping by ${column?.header || columnKey}`}
609
- />
610
- </XStack>
700
+ <YStack key={columnKey}>
701
+ {index > 0 ? <View {...hairline.line} /> : null}
702
+ <XStack
703
+ alignItems="center"
704
+ gap="$2"
705
+ padding="$2"
706
+ overflow="hidden"
707
+ backgroundColor="$color2"
708
+ {...corners}
709
+ hoverStyle={{ backgroundColor: "$backgroundHover", ...corners }}
710
+ {...({ "data-group-position": position } as any)}
711
+ >
712
+ <Text fontSize="$3" flex={1} numberOfLines={1}>
713
+ {`${label} · ${index + 1}`}
714
+ </Text>
715
+ <Button
716
+ size="$2"
717
+ variant="outlined"
718
+ icon={<ArrowUpIcon size={iconSize} />}
719
+ disabled={disabled || index === 0}
720
+ onPress={() => handleMoveGroupBy(index, -1)}
721
+ aria-label={`Move ${label} up`}
722
+ />
723
+ <Button
724
+ size="$2"
725
+ variant="outlined"
726
+ icon={<ArrowDownIcon size={iconSize} />}
727
+ disabled={disabled || index === currentConfig.columns.length - 1}
728
+ onPress={() => handleMoveGroupBy(index, 1)}
729
+ aria-label={`Move ${label} down`}
730
+ />
731
+ <Button
732
+ size="$2"
733
+ variant="outlined"
734
+ icon={<MinusIcon size={iconSize} />}
735
+ disabled={disabled}
736
+ onPress={() => handleRemoveGroupBy(columnKey)}
737
+ aria-label={`Remove grouping by ${label}`}
738
+ />
739
+ </XStack>
740
+ </YStack>
611
741
  );
612
742
  })}
613
743
  </YStack>
@@ -649,28 +779,38 @@ export function DataTableGroupingConfig<T = any>(props: DataTableGroupingConfigP
649
779
  </XStack>
650
780
 
651
781
  {/* Current Aggregations */}
652
- <YStack gap="$1">
653
- {currentConfig.aggregations.map((agg, index) => (
654
- <XStack
655
- key={index}
656
- alignItems="center"
657
- gap="$2"
658
- padding="$2"
659
- {...{ backgroundColor: "$color2" }}
660
- borderRadius={knobProps.borderRadius.borderRadius}
661
- >
662
- <Text fontSize="$3" flex={1}>
663
- {agg.function}({agg.column}){agg.label && ` as "${agg.label}"`}
664
- </Text>
665
- <Button
666
- size={knobProps.sizeToken}
667
- variant="outlined"
668
- icon={<MinusIcon size={16} />}
669
- onPress={() => handleRemoveAggregation(index)}
670
- aria-label={`Remove ${agg.function} aggregation on ${agg.column}`}
671
- />
672
- </XStack>
673
- ))}
782
+ <YStack>
783
+ {currentConfig.aggregations.map((agg, index) => {
784
+ const position = getGroupPosition(index, currentConfig.aggregations.length);
785
+ const corners = stackRadiusProps(position, radius);
786
+ return (
787
+ <YStack key={`${agg.function}-${agg.column}-${index}`}>
788
+ {index > 0 ? <View {...hairline.line} /> : null}
789
+ <XStack
790
+ alignItems="center"
791
+ gap="$2"
792
+ padding="$2"
793
+ overflow="hidden"
794
+ backgroundColor="$color2"
795
+ {...corners}
796
+ hoverStyle={{ backgroundColor: "$backgroundHover", ...corners }}
797
+ {...({ "data-group-position": position } as any)}
798
+ >
799
+ <Text fontSize="$3" flex={1} numberOfLines={1}>
800
+ {agg.function}({agg.column}){agg.label && ` as "${agg.label}"`}
801
+ </Text>
802
+ <Button
803
+ size="$2"
804
+ variant="outlined"
805
+ icon={<MinusIcon size={iconSize} />}
806
+ disabled={disabled}
807
+ onPress={() => handleRemoveAggregation(index)}
808
+ aria-label={`Remove ${agg.function} aggregation on ${agg.column}`}
809
+ />
810
+ </XStack>
811
+ </YStack>
812
+ );
813
+ })}
674
814
  </YStack>
675
815
 
676
816
  {/* Add Aggregation */}