@multiplatform.one/table 6.7.0 → 7.1.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
@@ -17,7 +17,7 @@ import {
17
17
  PlusIcon,
18
18
  TrashIcon,
19
19
  } from "@phosphor-icons/react";
20
- import { Button, Checkbox, Field, Spinner, useFormField, zIndex } from "@multiplatform.one/forms";
20
+ import { Button, Checkbox, Field, useFormField } from "@multiplatform.one/forms";
21
21
  import { flexRender } from "@tanstack/react-table";
22
22
  import { useVirtualizer } from "@tanstack/react-virtual";
23
23
  import { ensureFocusVisibleRing, useResolvedKnobs } from "@multiplatform.one/theme";
@@ -58,7 +58,9 @@ import type {
58
58
  } from "./DataTableStateContext";
59
59
  import { DataTableCardControls } from "./DataTableCardControls";
60
60
  import { DataTableMobileCards } from "./DataTableMobileCards";
61
+ import { DataTableDocumentList } from "./DataTableDocumentList";
61
62
  import { DataTableVirtualized } from "./DataTableVirtualized";
63
+ import { tableCellKeyboardProps, tableRowStateProps } from "./rowStateChrome";
62
64
  import { alignToFlex, getDefaultColumnAlign } from "../../utils/columnAlign";
63
65
  import { mapFieldToFilterType } from "../../utils/filterFields";
64
66
  import { INFINITE_TRIGGER_ROWS } from "../../utils/paginationDefaults";
@@ -103,8 +105,11 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
103
105
  data,
104
106
  columns,
105
107
  initialState,
108
+ controlledState,
106
109
  onStateChange,
107
110
  onRetry,
111
+ isLoading: isLoadingProp,
112
+ isFetching: isFetchingProp,
108
113
  syncWithUrl = false,
109
114
  urlDebounceMs = 500,
110
115
  urlStrategy,
@@ -169,7 +174,8 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
169
174
  const { sm } = useMedia();
170
175
  // Resolved responsive layout: cards below `$sm` (W11 compact class) unless
171
176
  // pinned via the `layout` prop. Same table state drives both layouts.
172
- const showCards = layout === "cards" || (layout === "auto" && sm === false);
177
+ const showList = layout === "list";
178
+ const showCards = !showList && (layout === "cards" || (layout === "auto" && sm === false));
173
179
  const { knobProps, disabledState } = useResolvedKnobs({
174
180
  intent: undefined,
175
181
  component: "DataTable",
@@ -194,6 +200,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
194
200
  data,
195
201
  columns,
196
202
  initialState,
203
+ controlledState,
197
204
  onStateChange,
198
205
  syncWithUrl,
199
206
  urlDebounceMs,
@@ -226,6 +233,8 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
226
233
  enableRowSelection,
227
234
  rowCount,
228
235
  pageCount,
236
+ isLoading: isLoadingProp,
237
+ isFetching: isFetchingProp,
229
238
  });
230
239
 
231
240
  const resolvedBulkActions = (bulkActions ?? []) as BulkAction<TData>[];
@@ -260,6 +269,23 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
260
269
  // already just the accumulated rows, so the slice is a no-op there.
261
270
  const infinite = computed.infinite;
262
271
  const tableRows = infinite ? rowModelRows.slice(0, infinite.visibleRowCount) : rowModelRows;
272
+ const heldRowsRef = useRef(tableRows);
273
+ if (tableRows.length > 0) {
274
+ heldRowsRef.current = tableRows;
275
+ }
276
+ const queryInFlight = Boolean(
277
+ state.isFetching ||
278
+ state.isPlaceholderData ||
279
+ infinite?.isAppending ||
280
+ state.isLoading ||
281
+ infinite?.isInitialLoading,
282
+ );
283
+ const displayRows =
284
+ tableRows.length > 0
285
+ ? tableRows
286
+ : queryInFlight && heldRowsRef.current.length > 0
287
+ ? heldRowsRef.current
288
+ : tableRows;
263
289
  const footerGroups = table.getFooterGroups();
264
290
 
265
291
  const hasFooter = footerGroups.some((group: any) =>
@@ -267,7 +293,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
267
293
  );
268
294
 
269
295
  const allRowsLength =
270
- tableRows.length + headerGroups.length + (hasFooter ? footerGroups.length : 0);
296
+ displayRows.length + headerGroups.length + (hasFooter ? footerGroups.length : 0);
271
297
  const rowCounter = useRef(-1);
272
298
  rowCounter.current = -1;
273
299
 
@@ -349,7 +375,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
349
375
  // appended pages grow geometry instead of collapsing it.
350
376
  const hasInfiniteTail = Boolean(infinite && !infinite.exhausted && tableRows.length > 0);
351
377
  const virtualizer = useVirtualizer({
352
- count: tableRows.length + (hasInfiniteTail ? 1 : 0),
378
+ count: displayRows.length + (hasInfiniteTail ? 1 : 0),
353
379
  getScrollElement: () => bodyScrollRef.current,
354
380
  estimateSize: () => rowHeightPx,
355
381
  overscan: virtualizationOverscan,
@@ -475,6 +501,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
475
501
  }
476
502
  : undefined,
477
503
  });
504
+ const [focusedColIndex, setFocusedColIndex] = useState(0);
478
505
 
479
506
  const isSSR = typeof window === "undefined";
480
507
 
@@ -484,7 +511,8 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
484
511
  // LC-49 roving anchor: the row set exposes exactly one tab stop — the
485
512
  // focused row while focus is inside the set, else the first row.
486
513
  const [rowPressAnchor, setRowPressAnchor] = useState(0);
487
- const effectiveRowPressAnchor = Math.min(rowPressAnchor, Math.max(tableRows.length - 1, 0));
514
+ const [rowPressHasFocus, setRowPressHasFocus] = useState(false);
515
+ const effectiveRowPressAnchor = Math.min(rowPressAnchor, Math.max(displayRows.length - 1, 0));
488
516
 
489
517
  // Row identity for accessible names (DG-A11Y-06): consumer accessor →
490
518
  // first visible column's cell value → undefined (caller picks its own
@@ -573,15 +601,21 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
573
601
  tabIndex: rowIndex === effectiveRowPressAnchor ? 0 : -1,
574
602
  focusVisibleStyle: ensureFocusVisibleRing({ outlineOffset: -2 }),
575
603
  "data-row-press": "true",
604
+ "data-row-keyboard-focus":
605
+ rowIndex === effectiveRowPressAnchor && rowPressHasFocus ? "true" : "false",
576
606
  onFocus: (e: React.FocusEvent) => {
577
607
  // Only a focused ROW moves the anchor; focus on an inner
578
608
  // control (own tab stop) leaves the roving state alone.
579
- if (e.target === e.currentTarget) setRowPressAnchor(rowIndex);
609
+ if (e.target === e.currentTarget) {
610
+ setRowPressAnchor(rowIndex);
611
+ setRowPressHasFocus(true);
612
+ }
580
613
  },
581
614
  onBlur: (e: React.FocusEvent) => {
582
615
  const next = e.relatedTarget;
583
616
  if (!(next instanceof Element) || !next.closest('[data-row-press="true"]')) {
584
617
  setRowPressAnchor(0);
618
+ setRowPressHasFocus(false);
585
619
  }
586
620
  },
587
621
  onKeyDown: (e: React.KeyboardEvent) => {
@@ -626,7 +660,14 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
626
660
  : {}),
627
661
  };
628
662
  },
629
- [rowPressActive, deriveRowLabel, activateRowPress, effectiveRowPressAnchor, isSSR],
663
+ [
664
+ rowPressActive,
665
+ deriveRowLabel,
666
+ activateRowPress,
667
+ effectiveRowPressAnchor,
668
+ isSSR,
669
+ rowPressHasFocus,
670
+ ],
630
671
  );
631
672
 
632
673
  const handleCellChange = useCallback(
@@ -736,6 +777,25 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
736
777
  const extraColumnsBefore =
737
778
  (enableRowSelection ? 1 : 0) + (showRowNumbers ? 1 : 0) + (enableRowExpansion ? 1 : 0);
738
779
  const extraColumnsAfter = showDeleteRow && !readOnly ? 1 : 0;
780
+ const excelCellNav = enableKeyboardNavigation && !rowPressActive && !disabled;
781
+ const gridColCount = Math.max(
782
+ table.getVisibleLeafColumns().length + extraColumnsBefore + extraColumnsAfter,
783
+ 1,
784
+ );
785
+ const handleGridKeyDown = useCallback(
786
+ (event: React.KeyboardEvent) => {
787
+ if (!enableKeyboardNavigation || disabled) return;
788
+ if (excelCellNav) {
789
+ if (event.key === "ArrowRight") {
790
+ setFocusedColIndex((i) => Math.min(i + 1, gridColCount - 1));
791
+ } else if (event.key === "ArrowLeft") {
792
+ setFocusedColIndex((i) => Math.max(i - 1, 0));
793
+ }
794
+ }
795
+ keyboardNav.handleKeyDown(event);
796
+ },
797
+ [disabled, enableKeyboardNavigation, excelCellNav, gridColCount, keyboardNav],
798
+ );
739
799
 
740
800
  const getStickyStyle = useCallback(
741
801
  (columnId: string) => {
@@ -806,12 +866,21 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
806
866
  (row: any, rowIndex: number, _isLastRow: boolean, cellElement?: "div") => {
807
867
  const rowData = row.original as TData;
808
868
  const cellRenderProps = cellElement ? ({ render: cellElement } as any) : {};
869
+ let cellSlot = 0;
870
+ const cellNavProps = () => {
871
+ const slot = cellSlot++;
872
+ if (!excelCellNav || !keyboardNav.isNavigating) return {};
873
+ return tableCellKeyboardProps(
874
+ rowIndex === keyboardNav.focusedRowIndex && slot === focusedColIndex,
875
+ );
876
+ };
809
877
 
810
878
  return (
811
879
  <>
812
880
  {enableRowSelection && (
813
881
  <Table.Cell
814
882
  {...cellRenderProps}
883
+ {...cellNavProps()}
815
884
  cellWidth={SELECTION_COL_WIDTH}
816
885
  cellHeight={cellHeight as any}
817
886
  cellLocation="first"
@@ -838,6 +907,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
838
907
  {showRowNumbers && (
839
908
  <Table.Cell
840
909
  {...cellRenderProps}
910
+ {...cellNavProps()}
841
911
  cellWidth={50}
842
912
  cellHeight={cellHeight as any}
843
913
  cellLocation={enableRowSelection ? "middle" : "first"}
@@ -851,6 +921,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
851
921
  {enableRowExpansion && (
852
922
  <Table.Cell
853
923
  {...cellRenderProps}
924
+ {...cellNavProps()}
854
925
  cellWidth={32 + row.depth * 20}
855
926
  cellHeight={cellHeight as any}
856
927
  cellLocation={enableRowSelection || showRowNumbers ? "middle" : "first"}
@@ -945,6 +1016,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
945
1016
  <Table.Cell
946
1017
  key={cell.id}
947
1018
  {...cellRenderProps}
1019
+ {...cellNavProps()}
948
1020
  {...cellFlexProps}
949
1021
  {...getColSizeProps(cell.column)}
950
1022
  cellHeight={cellHeight as any}
@@ -976,6 +1048,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
976
1048
  {showDeleteRow && !readOnly && (
977
1049
  <Table.Cell
978
1050
  {...cellRenderProps}
1051
+ {...cellNavProps()}
979
1052
  cellWidth={60}
980
1053
  cellHeight={cellHeight as any}
981
1054
  cellLocation="last"
@@ -1018,6 +1091,10 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1018
1091
  ExpandCaretIcon,
1019
1092
  expandedCaretRotation,
1020
1093
  clipBodyCells,
1094
+ excelCellNav,
1095
+ keyboardNav.isNavigating,
1096
+ keyboardNav.focusedRowIndex,
1097
+ focusedColIndex,
1021
1098
  ],
1022
1099
  );
1023
1100
 
@@ -1048,6 +1125,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1048
1125
  activeViewId: state.activeViewId,
1049
1126
  size: knobProps.sizeToken,
1050
1127
  compact: isCompact,
1128
+ isFetching: Boolean(state.isFetching),
1051
1129
  });
1052
1130
  }
1053
1131
 
@@ -1066,6 +1144,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1066
1144
  enableFiltering={enableFiltering}
1067
1145
  size={knobProps.sizeToken}
1068
1146
  compact={isCompact}
1147
+ isFetching={Boolean(state.isFetching)}
1069
1148
  />
1070
1149
  );
1071
1150
  };
@@ -1124,7 +1203,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1124
1203
  el.removeEventListener("scroll", update);
1125
1204
  ro?.disconnect();
1126
1205
  };
1127
- }, [tableRows.length, showCards]);
1206
+ }, [displayRows.length, showCards]);
1128
1207
 
1129
1208
  // Enable drag-to-scroll in the horizontal-overflow modes (scroll layout
1130
1209
  // and column pinning share the content-View scrollport).
@@ -1141,8 +1220,10 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1141
1220
 
1142
1221
  // W9 / DG-ST-01,02,04 / DG-TBL-06 — first-class async states.
1143
1222
  // Error wins over empty chrome; initial load uses a table-shaped skeleton.
1144
- // Selection API untouched.
1223
+ // A refetch (isFetching / placeholderData) MUST keep the body mounted —
1224
+ // skeleton only when there are no rows to hold (first load).
1145
1225
  const resolvedAriaLabel = ariaLabel || t("Data table");
1226
+ const isRefetching = queryInFlight;
1146
1227
  if (state.error) {
1147
1228
  return (
1148
1229
  <AsyncBoundary
@@ -1155,7 +1236,12 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1155
1236
  />
1156
1237
  );
1157
1238
  }
1158
- if ((state.isLoading || infinite?.isInitialLoading) && tableRows.length === 0) {
1239
+ if (
1240
+ (state.isLoading || infinite?.isInitialLoading) &&
1241
+ displayRows.length === 0 &&
1242
+ !state.isFetching &&
1243
+ !state.isPlaceholderData
1244
+ ) {
1159
1245
  return <AsyncBoundary loading layout="table" aria-label={resolvedAriaLabel} />;
1160
1246
  }
1161
1247
 
@@ -1180,6 +1266,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1180
1266
  aria-describedby={ariaDescribedBy}
1181
1267
  aria-live="polite"
1182
1268
  aria-atomic="false"
1269
+ aria-busy={isRefetching || undefined}
1183
1270
  // UX-011 / Axiom 6 HONEST STATE: the advertised `disabled` prop
1184
1271
  // makes the whole assembly inert and says so. `inert` (React 19)
1185
1272
  // blocks pointer, keyboard, and AT for every control inside —
@@ -1231,7 +1318,19 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1231
1318
  {children}
1232
1319
 
1233
1320
  {/* Card List View (layout="cards" or auto below $sm) */}
1234
- {showCards ? (
1321
+ {showList ? (
1322
+ <DataTableDocumentList
1323
+ tableRows={displayRows}
1324
+ enableRowSelection={enableRowSelection}
1325
+ disabled={disabled}
1326
+ hasActiveFilters={computed.hasActiveFilters}
1327
+ renderCellContent={renderCellContent}
1328
+ compact={isCompact}
1329
+ selectRowLabel={deriveSelectRowLabel}
1330
+ queryInFlight={queryInFlight}
1331
+ {...(rowPressActive ? { getRowPressProps } : {})}
1332
+ />
1333
+ ) : showCards ? (
1235
1334
  <>
1236
1335
  {/* Header affordances (sort / per-column filter) live in the
1237
1336
  grid headers; the card list restores them here. */}
@@ -1244,7 +1343,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1244
1343
  disabled={disabled}
1245
1344
  />
1246
1345
  <DataTableMobileCards
1247
- tableRows={tableRows}
1346
+ tableRows={displayRows}
1248
1347
  enableRowSelection={enableRowSelection}
1249
1348
  showRowNumbers={showRowNumbers}
1250
1349
  showDeleteRow={showDeleteRow}
@@ -1260,6 +1359,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1260
1359
  onToggleSelectAll={toggleSelectAll}
1261
1360
  compact={isCompact}
1262
1361
  selectRowLabel={deriveSelectRowLabel}
1362
+ queryInFlight={queryInFlight}
1263
1363
  {...(rowPressActive ? { getRowPressProps } : {})}
1264
1364
  />
1265
1365
  </>
@@ -1295,9 +1395,8 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1295
1395
  label: resolvedAriaLabel,
1296
1396
  })}
1297
1397
  tabIndex={enableKeyboardNavigation && !isSSR ? 0 : undefined}
1298
- onKeyDown={
1299
- enableKeyboardNavigation && !isSSR ? keyboardNav.handleKeyDown : undefined
1300
- }
1398
+ {...({ "data-table-grid": "true" } as any)}
1399
+ onKeyDown={enableKeyboardNavigation && !isSSR ? handleGridKeyDown : undefined}
1301
1400
  onPress={
1302
1401
  enableKeyboardNavigation && !isSSR ? keyboardNav.handleContainerClick : undefined
1303
1402
  }
@@ -1678,18 +1777,20 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1678
1777
  tableBodyRef.current = node ?? null;
1679
1778
  }}
1680
1779
  >
1681
- {tableRows.length === 0 ? (
1780
+ {displayRows.length === 0 ? (
1682
1781
  <Table.Row>
1683
1782
  <Table.Cell>
1684
- <EmptyState
1685
- compact
1686
- aria-live="polite"
1687
- title={
1688
- computed.hasActiveFilters
1689
- ? t("No results found")
1690
- : t("No data available")
1691
- }
1692
- />
1783
+ {isRefetching ? null : (
1784
+ <EmptyState
1785
+ compact
1786
+ aria-live="polite"
1787
+ title={
1788
+ computed.hasActiveFilters
1789
+ ? t("No results found")
1790
+ : t("No data available")
1791
+ }
1792
+ />
1793
+ )}
1693
1794
  </Table.Cell>
1694
1795
  </Table.Row>
1695
1796
  ) : isVirtualized ? (
@@ -1724,7 +1825,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1724
1825
  totalSize={totalSize}
1725
1826
  bodyScrollRef={bodyScrollRef}
1726
1827
  virtualizationHeight={virtualizationHeight}
1727
- tableRows={tableRows}
1828
+ tableRows={displayRows}
1728
1829
  headerGroups={headerGroups}
1729
1830
  showRowNumbers={showRowNumbers}
1730
1831
  enableRowExpansion={enableRowExpansion}
@@ -1744,9 +1845,9 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1744
1845
  </Table.Row>
1745
1846
  ) : (
1746
1847
  <>
1747
- {tableRows.map((row: any, index: number) => {
1848
+ {displayRows.map((row: any, index: number) => {
1748
1849
  rowCounter.current++;
1749
- const isLastRow = index === tableRows.length - 1;
1850
+ const isLastRow = index === displayRows.length - 1;
1750
1851
 
1751
1852
  // Grouped row: render a single header cell spanning all columns
1752
1853
  // with expand toggle, group label, and item count.
@@ -1800,17 +1901,13 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1800
1901
 
1801
1902
  const mainRow = (
1802
1903
  <Table.Row
1803
- backgroundColor={
1804
- enableKeyboardNavigation &&
1805
- keyboardNav.isNavigating &&
1806
- index === keyboardNav.focusedRowIndex
1807
- ? "$color4"
1808
- : tableZebraOn && index % 2 === 1
1809
- ? "$color2"
1810
- : "$color1"
1811
- }
1904
+ {...(tableRowStateProps({
1905
+ selected: Boolean(enableRowSelection && row.getIsSelected?.()),
1906
+ keyboardFocused: false,
1907
+ zebraOn: tableZebraOn,
1908
+ index,
1909
+ }) as any)}
1812
1910
  {...({ animation: "quick" } as any)}
1813
- hoverStyle={{ backgroundColor: "$color3" }}
1814
1911
  flexShrink={0}
1815
1912
  rowLocation={
1816
1913
  rowCounter.current === 0
@@ -2125,26 +2222,6 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
2125
2222
  </Text>
2126
2223
  </View>
2127
2224
  )}
2128
-
2129
- {/* Loading State */}
2130
- {state.isLoading && (
2131
- <View
2132
- position="absolute"
2133
- top={0}
2134
- left={0}
2135
- right={0}
2136
- bottom={0}
2137
- alignItems="center"
2138
- justifyContent="center"
2139
- zIndex={zIndex.loading}
2140
- aria-busy={true}
2141
- aria-live="assertive"
2142
- aria-label={t("Loading table data")}
2143
- role="status"
2144
- >
2145
- <Spinner size="large" color="$color10" />
2146
- </View>
2147
- )}
2148
2225
  </View>
2149
2226
  </DataTableStateContext.Provider>
2150
2227
  </DataTableContext.Provider>
@@ -7,7 +7,7 @@
7
7
  * column border extension.
8
8
  */
9
9
 
10
- import type React from "react";
10
+ import { tableRowStateProps } from "./rowStateChrome";
11
11
  import { Skeleton } from "@multiplatform.one/components";
12
12
  import { Text, View } from "tamagui";
13
13
 
@@ -61,7 +61,7 @@ export function DataTableVirtualized({
61
61
  enableRowExpansion,
62
62
  showDeleteRow,
63
63
  readOnly,
64
- enableKeyboardNavigation,
64
+ enableKeyboardNavigation: _enableKeyboardNavigation,
65
65
  keyboardNav,
66
66
  getColSizeProps,
67
67
  renderRowContent,
@@ -184,15 +184,12 @@ export function DataTableVirtualized({
184
184
  minHeight: rowHeightPx,
185
185
  }}
186
186
  flexDirection="row"
187
- backgroundColor={
188
- enableKeyboardNavigation &&
189
- keyboardNav.isNavigating &&
190
- virtualRow.index === keyboardNav.focusedRowIndex
191
- ? "$color4"
192
- : virtualRow.index % 2 === 0
193
- ? "$color1"
194
- : "$color2"
195
- }
187
+ {...(tableRowStateProps({
188
+ selected: Boolean(row.getIsSelected?.()),
189
+ keyboardFocused: false,
190
+ zebraOn: true,
191
+ index: virtualRow.index,
192
+ }) as any)}
196
193
  role="row"
197
194
  aria-rowindex={virtualRow.index + 1}
198
195
  {...(getRowPressProps ? (getRowPressProps(row, virtualRow.index) as any) : {})}
@@ -72,6 +72,58 @@ describe("DataTable card layout", () => {
72
72
  expect(container.querySelector('[data-testid="data-table-cards"]')).not.toBeNull();
73
73
  expect(container.querySelector(".is_Table")).toBeNull();
74
74
  });
75
+
76
+ it("layout=list renders document rows, not the grid or cards", () => {
77
+ const { container } = renderWithProviders(
78
+ <DataTable data={sampleData} columns={columns} layout="list" onStateChange={vi.fn()} />,
79
+ );
80
+ expect(container.querySelector('[data-testid="data-table-list"]')).not.toBeNull();
81
+ expect(container.querySelectorAll('[data-testid="data-table-list-row"]').length).toBe(
82
+ sampleData.length,
83
+ );
84
+ expect(container.querySelector('[data-testid="data-table-cards"]')).toBeNull();
85
+ expect(container.querySelector(".is_Table")).toBeNull();
86
+ expect(container.querySelector('[aria-label="Table headers"]')).toBeNull();
87
+ });
88
+
89
+ it("list title slot uses the title-role column, not a leading _liked_by glyph", () => {
90
+ const listColumns: DataTableColumn<Person>[] = [
91
+ { id: "_liked_by", accessorKey: "id", header: "♥", meta: { label: "Liked" } },
92
+ { accessorKey: "firstName", header: "First Name", meta: { role: "title" } },
93
+ { accessorKey: "lastName", header: "Last Name" },
94
+ { accessorKey: "email", header: "Email" },
95
+ ];
96
+ const { container } = renderWithProviders(
97
+ <DataTable data={sampleData} columns={listColumns} layout="list" onStateChange={vi.fn()} />,
98
+ );
99
+ const titleSlots = container.querySelectorAll('[data-list-slot="title"]');
100
+ expect(titleSlots.length).toBe(sampleData.length);
101
+ expect(titleSlots[0]?.textContent).toBe("John");
102
+ const metaSlots = container.querySelectorAll('[data-list-slot="meta"]');
103
+ expect(Array.from(metaSlots).some((slot) => slot.textContent === "Doe")).toBe(true);
104
+ });
105
+
106
+ it("list rows are a nowrap flex list, not a column grid or labeled cards", () => {
107
+ const listColumns: DataTableColumn<Person>[] = [
108
+ { accessorKey: "firstName", header: "Name", meta: { role: "title" } },
109
+ { accessorKey: "lastName", header: "Last Name" },
110
+ { accessorKey: "email", header: "Email" },
111
+ { accessorKey: "age", header: "Age", meta: { role: "indicator" } },
112
+ ];
113
+ const { container, queryByText } = renderWithProviders(
114
+ <DataTable data={sampleData} columns={listColumns} layout="list" onStateChange={vi.fn()} />,
115
+ );
116
+ const list = container.querySelector('[data-testid="data-table-list"]') as HTMLElement;
117
+ const row = container.querySelector('[data-testid="data-table-list-row"]') as HTMLElement;
118
+ expect(list.getAttribute("data-list-layout")).toBe("list");
119
+ expect(row.getAttribute("data-list-wrap")).toBe("nowrap");
120
+ expect(getComputedStyle(list).display).not.toBe("grid");
121
+ expect(getComputedStyle(row).flexWrap).toBe("nowrap");
122
+ expect(container.querySelector('[data-list-slot="indicator"]')?.textContent).toBe("28");
123
+ // A list is not a form: column headers do not reprint as labels.
124
+ expect(queryByText("Last Name")).toBeNull();
125
+ expect(queryByText("Email")).toBeNull();
126
+ });
75
127
  });
76
128
 
77
129
  describe("card anatomy", () => {
@@ -96,6 +148,43 @@ describe("DataTable card layout", () => {
96
148
  expect(firstCard.textContent).toContain("28");
97
149
  });
98
150
 
151
+ it("labels field rows from meta.label when the header is a render function", () => {
152
+ const glyphColumns: DataTableColumn<Person>[] = [
153
+ { id: "firstName", accessorKey: "firstName", header: "First Name" },
154
+ {
155
+ id: "_liked_by",
156
+ accessorKey: "lastName",
157
+ header: () => <span aria-label="Liked">♥</span>,
158
+ meta: { label: "Liked" },
159
+ },
160
+ ];
161
+ const { container } = renderWithProviders(
162
+ <DataTable data={sampleData} columns={glyphColumns} onStateChange={vi.fn()} />,
163
+ );
164
+ const [firstCard] = getCards(container);
165
+ expect(within(firstCard).getByText("Liked")).toBeDefined();
166
+ expect(firstCard.textContent).not.toContain("_liked_by");
167
+ });
168
+
169
+ it("meta.label wins over a string header; a bare function header falls back to the id", () => {
170
+ const mixedColumns: DataTableColumn<Person>[] = [
171
+ { id: "firstName", accessorKey: "firstName", header: "First Name" },
172
+ // Explicit channel beats the display string — a glyph header ("♥")
173
+ // is exactly what meta.label exists to replace in card labels.
174
+ { id: "age", accessorKey: "age", header: "♥", meta: { label: "Age (years)" } },
175
+ // No meta.label + non-string header: the raw id still prints — the
176
+ // fallback stays honest instead of inventing a label.
177
+ { id: "email_addr", accessorKey: "email", header: () => <span>Email</span> },
178
+ ];
179
+ const { container } = renderWithProviders(
180
+ <DataTable data={sampleData} columns={mixedColumns} onStateChange={vi.fn()} />,
181
+ );
182
+ const [firstCard] = getCards(container);
183
+ expect(within(firstCard).getByText("Age (years)")).toBeDefined();
184
+ expect(within(firstCard).queryByText("♥")).toBeNull();
185
+ expect(within(firstCard).getByText("email_addr")).toBeDefined();
186
+ });
187
+
99
188
  it("respects column visibility (hidden columns stay hidden in cards)", () => {
100
189
  const { container } = renderWithProviders(
101
190
  <DataTable
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Document-list slot taxonomy (Polaris Index / Frappe list, not a grid).
3
+ *
4
+ * A list row is subject-led: title + stacked muted meta, then a trailing
5
+ * indicator cluster and actions. Remaining columns never lay out as equal
6
+ * grid tracks — that is the table layout.
7
+ */
8
+
9
+ import type { DataTableColumn, DataTableField } from "../../types";
10
+
11
+ export type DocumentListSlot = "title" | "indicator" | "meta" | "actions" | "skip";
12
+
13
+ const INDICATOR_FIELDS = new Set<DataTableField>([
14
+ "select",
15
+ "combobox",
16
+ "togglegroup",
17
+ "radiogroup",
18
+ ]);
19
+
20
+ const INDICATOR_IDS = new Set(["status", "priority", "workflow_state", "state"]);
21
+
22
+ export function classifyDocumentListSlot(cell: {
23
+ column: { id: string; columnDef: unknown };
24
+ }): DocumentListSlot {
25
+ const id = String(cell.column.id ?? "");
26
+ const def = cell.column.columnDef as DataTableColumn;
27
+ const role = def.meta?.role;
28
+ if (role === "title") return "title";
29
+ if (role === "indicator") return "indicator";
30
+ if (role === "actions") return "actions";
31
+ if (role === "hidden" || role === "skip") return "skip";
32
+ if (id.startsWith("_")) return "actions";
33
+ if (INDICATOR_IDS.has(id) || (def.field != null && INDICATOR_FIELDS.has(def.field))) {
34
+ return "indicator";
35
+ }
36
+ return "meta";
37
+ }
38
+
39
+ export function partitionDocumentListCells<
40
+ TCell extends { id: string; column: { id: string; columnDef: unknown } },
41
+ >(
42
+ visibleCells: TCell[],
43
+ titleCell: TCell | undefined,
44
+ ): { indicators: TCell[]; metas: TCell[]; actions: TCell[] } {
45
+ const rest = visibleCells.filter((cell) => cell.id !== titleCell?.id);
46
+ const indicators: TCell[] = [];
47
+ const metas: TCell[] = [];
48
+ const actions: TCell[] = [];
49
+ for (const cell of rest) {
50
+ const slot = classifyDocumentListSlot(cell);
51
+ if (slot === "indicator") indicators.push(cell);
52
+ else if (slot === "actions") actions.push(cell);
53
+ else if (slot === "skip" || slot === "title") continue;
54
+ else metas.push(cell);
55
+ }
56
+ return { indicators, metas, actions };
57
+ }