@multiplatform.one/table 6.6.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 (506) 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 +3 -2
  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 +33 -12
  7. package/dist/cjs/components/ColumnHeaderFilter/index.native.js.map +1 -1
  8. package/dist/cjs/components/DataTable/DataTableCardControls.native.js +1 -1
  9. package/dist/cjs/components/DataTable/DataTableCardControls.native.js.map +1 -1
  10. package/dist/cjs/components/DataTable/DataTableContext.native.js.map +1 -1
  11. package/dist/cjs/components/DataTable/DataTableDocumentList.cjs +222 -0
  12. package/dist/cjs/components/DataTable/DataTableDocumentList.native.js +237 -0
  13. package/dist/cjs/components/DataTable/DataTableDocumentList.native.js.map +1 -0
  14. package/dist/cjs/components/DataTable/DataTableMobileCards.cjs +5 -2
  15. package/dist/cjs/components/DataTable/DataTableMobileCards.native.js +6 -2
  16. package/dist/cjs/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  17. package/dist/cjs/components/DataTable/DataTableRoot.cjs +92 -41
  18. package/dist/cjs/components/DataTable/DataTableRoot.native.js +104 -50
  19. package/dist/cjs/components/DataTable/DataTableRoot.native.js.map +1 -1
  20. package/dist/cjs/components/DataTable/DataTableStateContext.native.js.map +1 -1
  21. package/dist/cjs/components/DataTable/DataTableVirtualized.cjs +8 -2
  22. package/dist/cjs/components/DataTable/DataTableVirtualized.native.js +9 -3
  23. package/dist/cjs/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  24. package/dist/cjs/components/DataTable/documentListSlots.cjs +59 -0
  25. package/dist/cjs/components/DataTable/documentListSlots.native.js +85 -0
  26. package/dist/cjs/components/DataTable/documentListSlots.native.js.map +1 -0
  27. package/dist/cjs/components/DataTable/index.native.js +84 -69
  28. package/dist/cjs/components/DataTable/index.native.js.map +1 -1
  29. package/dist/cjs/components/DataTable/rowStateChrome.cjs +55 -0
  30. package/dist/cjs/components/DataTable/rowStateChrome.native.js +59 -0
  31. package/dist/cjs/components/DataTable/rowStateChrome.native.js.map +1 -0
  32. package/dist/cjs/components/DataTableBulkActions/index.native.js.map +1 -1
  33. package/dist/cjs/components/DataTableCell/CellModalEditor.cjs +24 -3
  34. package/dist/cjs/components/DataTableCell/CellModalEditor.native.js +6 -1
  35. package/dist/cjs/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  36. package/dist/cjs/components/DataTableCell/CellOptionsEditor.cjs +9 -2
  37. package/dist/cjs/components/DataTableCell/CellOptionsEditor.native.js +11 -2
  38. package/dist/cjs/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  39. package/dist/cjs/components/DataTableCell/index.cjs +74 -63
  40. package/dist/cjs/components/DataTableCell/index.native.js +94 -82
  41. package/dist/cjs/components/DataTableCell/index.native.js.map +1 -1
  42. package/dist/cjs/components/DataTableColumnPinning/index.cjs +54 -37
  43. package/dist/cjs/components/DataTableColumnPinning/index.native.js +59 -38
  44. package/dist/cjs/components/DataTableColumnPinning/index.native.js.map +1 -1
  45. package/dist/cjs/components/DataTableDateFilter/index.cjs +33 -14
  46. package/dist/cjs/components/DataTableDateFilter/index.native.js +33 -12
  47. package/dist/cjs/components/DataTableDateFilter/index.native.js.map +1 -1
  48. package/dist/cjs/components/DataTableExport/index.cjs +35 -7
  49. package/dist/cjs/components/DataTableExport/index.native.js +42 -7
  50. package/dist/cjs/components/DataTableExport/index.native.js.map +1 -1
  51. package/dist/cjs/components/DataTableFacetMenu/index.cjs +140 -0
  52. package/dist/cjs/components/DataTableFacetMenu/index.native.js +156 -0
  53. package/dist/cjs/components/DataTableFacetMenu/index.native.js.map +1 -0
  54. package/dist/cjs/components/DataTableFilterButton/index.cjs +51 -32
  55. package/dist/cjs/components/DataTableFilterButton/index.native.js +64 -41
  56. package/dist/cjs/components/DataTableFilterButton/index.native.js.map +1 -1
  57. package/dist/cjs/components/DataTableFilterChips/FilterChip.cjs +143 -0
  58. package/dist/cjs/components/DataTableFilterChips/FilterChip.native.js +148 -0
  59. package/dist/cjs/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
  60. package/dist/cjs/components/DataTableFilterChips/index.cjs +9 -31
  61. package/dist/cjs/components/DataTableFilterChips/index.native.js +9 -32
  62. package/dist/cjs/components/DataTableFilterChips/index.native.js.map +1 -1
  63. package/dist/cjs/components/DataTableFilters/index.cjs +145 -502
  64. package/dist/cjs/components/DataTableFilters/index.native.js +171 -544
  65. package/dist/cjs/components/DataTableFilters/index.native.js.map +1 -1
  66. package/dist/cjs/components/DataTableGrouping/index.cjs +273 -108
  67. package/dist/cjs/components/DataTableGrouping/index.native.js +310 -157
  68. package/dist/cjs/components/DataTableGrouping/index.native.js.map +1 -1
  69. package/dist/cjs/components/DataTablePagination/index.cjs +147 -95
  70. package/dist/cjs/components/DataTablePagination/index.native.js +159 -106
  71. package/dist/cjs/components/DataTablePagination/index.native.js.map +1 -1
  72. package/dist/cjs/components/DataTableSearch/index.cjs +251 -210
  73. package/dist/cjs/components/DataTableSearch/index.native.js +292 -243
  74. package/dist/cjs/components/DataTableSearch/index.native.js.map +1 -1
  75. package/dist/cjs/components/DataTableToolbar/index.cjs +141 -115
  76. package/dist/cjs/components/DataTableToolbar/index.native.js +164 -149
  77. package/dist/cjs/components/DataTableToolbar/index.native.js.map +1 -1
  78. package/dist/cjs/components/DataTableViewOptions/index.cjs +25 -21
  79. package/dist/cjs/components/DataTableViewOptions/index.native.js +6 -4
  80. package/dist/cjs/components/DataTableViewOptions/index.native.js.map +1 -1
  81. package/dist/cjs/components/FilterManager.native.js.map +1 -1
  82. package/dist/cjs/components/FilterOperatorValueEditor/index.native.js.map +1 -1
  83. package/dist/cjs/components/KnobDialog.native.js.map +1 -1
  84. package/dist/cjs/components/SavedFilterDropdown.native.js.map +1 -1
  85. package/dist/cjs/components/SimpleTable/index.cjs +336 -46
  86. package/dist/cjs/components/SimpleTable/index.native.js +356 -48
  87. package/dist/cjs/components/SimpleTable/index.native.js.map +1 -1
  88. package/dist/cjs/components/TableInput/index.cjs +147 -38
  89. package/dist/cjs/components/TableInput/index.native.js +55 -39
  90. package/dist/cjs/components/TableInput/index.native.js.map +1 -1
  91. package/dist/cjs/components/TableInput/shared.cjs +36 -1
  92. package/dist/cjs/components/TableInput/shared.native.js +35 -0
  93. package/dist/cjs/components/TableInput/shared.native.js.map +1 -1
  94. package/dist/cjs/hooks/useDataTable.cjs +33 -2
  95. package/dist/cjs/hooks/useDataTable.native.js +41 -2
  96. package/dist/cjs/hooks/useDataTable.native.js.map +1 -1
  97. package/dist/cjs/hooks/useDataTableKeyboard.native.js.map +1 -1
  98. package/dist/cjs/hooks/useDragScroll.native.js.map +1 -1
  99. package/dist/cjs/hooks/useInfiniteRows.cjs +20 -3
  100. package/dist/cjs/hooks/useInfiniteRows.native.js +20 -3
  101. package/dist/cjs/hooks/useInfiniteRows.native.js.map +1 -1
  102. package/dist/cjs/hooks/useSavedFilters.native.js.map +1 -1
  103. package/dist/cjs/hooks/useTableColumnPinning.native.js.map +1 -1
  104. package/dist/cjs/hooks/useTableFiltering.native.js.map +1 -1
  105. package/dist/cjs/hooks/useTableGrouping.native.js.map +1 -1
  106. package/dist/cjs/hooks/useTableKeyboard.native.js.map +1 -1
  107. package/dist/cjs/hooks/useTablePagination.native.js.map +1 -1
  108. package/dist/cjs/hooks/useTableSearch.native.js.map +1 -1
  109. package/dist/cjs/hooks/useTableSelection.native.js.map +1 -1
  110. package/dist/cjs/hooks/useTableSorting.native.js.map +1 -1
  111. package/dist/cjs/hooks/useTableUrlSync.native.js.map +1 -1
  112. package/dist/cjs/hooks/useTableViews.native.js.map +1 -1
  113. package/dist/cjs/index.cjs +2 -0
  114. package/dist/cjs/index.native.js +2 -0
  115. package/dist/cjs/index.native.js.map +1 -1
  116. package/dist/cjs/shared/t.native.js.map +1 -1
  117. package/dist/cjs/shims/primitives.native.js.map +1 -1
  118. package/dist/cjs/shims/tableCellContext.native.js.map +1 -1
  119. package/dist/cjs/types.native.js.map +1 -1
  120. package/dist/cjs/utils/columnAlign.native.js.map +1 -1
  121. package/dist/cjs/utils/filterFields.native.js.map +1 -1
  122. package/dist/cjs/utils/filterUtils.cjs +12 -5
  123. package/dist/cjs/utils/filterUtils.native.js +20 -5
  124. package/dist/cjs/utils/filterUtils.native.js.map +1 -1
  125. package/dist/cjs/utils/paginationDefaults.native.js.map +1 -1
  126. package/dist/cjs/utils/rowPress.native.js.map +1 -1
  127. package/dist/cjs/utils/urlStateUtils.native.js.map +1 -1
  128. package/dist/cjs/utils/viewData.native.js.map +1 -1
  129. package/dist/cjs/utils/withInterp.native.js.map +1 -1
  130. package/dist/esm/components/ChildTable/index.mjs +2 -1
  131. package/dist/esm/components/ChildTable/index.mjs.map +1 -1
  132. package/dist/esm/components/ChildTable/index.native.js +2 -1
  133. package/dist/esm/components/ChildTable/index.native.js.map +1 -1
  134. package/dist/esm/components/ColumnHeaderFilter/index.mjs +17 -9
  135. package/dist/esm/components/ColumnHeaderFilter/index.mjs.map +1 -1
  136. package/dist/esm/components/ColumnHeaderFilter/index.native.js +32 -11
  137. package/dist/esm/components/ColumnHeaderFilter/index.native.js.map +1 -1
  138. package/dist/esm/components/DataTable/DataTableDocumentList.mjs +196 -0
  139. package/dist/esm/components/DataTable/DataTableDocumentList.mjs.map +1 -0
  140. package/dist/esm/components/DataTable/DataTableDocumentList.native.js +208 -0
  141. package/dist/esm/components/DataTable/DataTableDocumentList.native.js.map +1 -0
  142. package/dist/esm/components/DataTable/DataTableMobileCards.mjs +5 -2
  143. package/dist/esm/components/DataTable/DataTableMobileCards.mjs.map +1 -1
  144. package/dist/esm/components/DataTable/DataTableMobileCards.native.js +6 -2
  145. package/dist/esm/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  146. package/dist/esm/components/DataTable/DataTableRoot.mjs +93 -42
  147. package/dist/esm/components/DataTable/DataTableRoot.mjs.map +1 -1
  148. package/dist/esm/components/DataTable/DataTableRoot.native.js +98 -44
  149. package/dist/esm/components/DataTable/DataTableRoot.native.js.map +1 -1
  150. package/dist/esm/components/DataTable/DataTableVirtualized.mjs +8 -2
  151. package/dist/esm/components/DataTable/DataTableVirtualized.mjs.map +1 -1
  152. package/dist/esm/components/DataTable/DataTableVirtualized.native.js +9 -3
  153. package/dist/esm/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  154. package/dist/esm/components/DataTable/documentListSlots.mjs +33 -0
  155. package/dist/esm/components/DataTable/documentListSlots.mjs.map +1 -0
  156. package/dist/esm/components/DataTable/documentListSlots.native.js +56 -0
  157. package/dist/esm/components/DataTable/documentListSlots.native.js.map +1 -0
  158. package/dist/esm/components/DataTable/index.native.js +52 -37
  159. package/dist/esm/components/DataTable/index.native.js.map +1 -1
  160. package/dist/esm/components/DataTable/rowStateChrome.mjs +28 -0
  161. package/dist/esm/components/DataTable/rowStateChrome.mjs.map +1 -0
  162. package/dist/esm/components/DataTable/rowStateChrome.native.js +29 -0
  163. package/dist/esm/components/DataTable/rowStateChrome.native.js.map +1 -0
  164. package/dist/esm/components/DataTableCell/CellModalEditor.mjs +25 -4
  165. package/dist/esm/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  166. package/dist/esm/components/DataTableCell/CellModalEditor.native.js +6 -1
  167. package/dist/esm/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  168. package/dist/esm/components/DataTableCell/CellOptionsEditor.mjs +9 -2
  169. package/dist/esm/components/DataTableCell/CellOptionsEditor.mjs.map +1 -1
  170. package/dist/esm/components/DataTableCell/CellOptionsEditor.native.js +11 -2
  171. package/dist/esm/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  172. package/dist/esm/components/DataTableCell/index.mjs +75 -64
  173. package/dist/esm/components/DataTableCell/index.mjs.map +1 -1
  174. package/dist/esm/components/DataTableCell/index.native.js +95 -83
  175. package/dist/esm/components/DataTableCell/index.native.js.map +1 -1
  176. package/dist/esm/components/DataTableColumnPinning/index.mjs +54 -37
  177. package/dist/esm/components/DataTableColumnPinning/index.mjs.map +1 -1
  178. package/dist/esm/components/DataTableColumnPinning/index.native.js +59 -38
  179. package/dist/esm/components/DataTableColumnPinning/index.native.js.map +1 -1
  180. package/dist/esm/components/DataTableDateFilter/index.mjs +34 -15
  181. package/dist/esm/components/DataTableDateFilter/index.mjs.map +1 -1
  182. package/dist/esm/components/DataTableDateFilter/index.native.js +34 -13
  183. package/dist/esm/components/DataTableDateFilter/index.native.js.map +1 -1
  184. package/dist/esm/components/DataTableExport/index.mjs +36 -8
  185. package/dist/esm/components/DataTableExport/index.mjs.map +1 -1
  186. package/dist/esm/components/DataTableExport/index.native.js +43 -8
  187. package/dist/esm/components/DataTableExport/index.native.js.map +1 -1
  188. package/dist/esm/components/DataTableFacetMenu/index.mjs +115 -0
  189. package/dist/esm/components/DataTableFacetMenu/index.mjs.map +1 -0
  190. package/dist/esm/components/DataTableFacetMenu/index.native.js +128 -0
  191. package/dist/esm/components/DataTableFacetMenu/index.native.js.map +1 -0
  192. package/dist/esm/components/DataTableFilterButton/index.mjs +54 -35
  193. package/dist/esm/components/DataTableFilterButton/index.mjs.map +1 -1
  194. package/dist/esm/components/DataTableFilterButton/index.native.js +66 -43
  195. package/dist/esm/components/DataTableFilterButton/index.native.js.map +1 -1
  196. package/dist/esm/components/DataTableFilterChips/FilterChip.mjs +118 -0
  197. package/dist/esm/components/DataTableFilterChips/FilterChip.mjs.map +1 -0
  198. package/dist/esm/components/DataTableFilterChips/FilterChip.native.js +120 -0
  199. package/dist/esm/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
  200. package/dist/esm/components/DataTableFilterChips/index.mjs +9 -32
  201. package/dist/esm/components/DataTableFilterChips/index.mjs.map +1 -1
  202. package/dist/esm/components/DataTableFilterChips/index.native.js +9 -33
  203. package/dist/esm/components/DataTableFilterChips/index.native.js.map +1 -1
  204. package/dist/esm/components/DataTableFilters/index.mjs +149 -506
  205. package/dist/esm/components/DataTableFilters/index.mjs.map +1 -1
  206. package/dist/esm/components/DataTableFilters/index.native.js +175 -548
  207. package/dist/esm/components/DataTableFilters/index.native.js.map +1 -1
  208. package/dist/esm/components/DataTableGrouping/index.mjs +275 -110
  209. package/dist/esm/components/DataTableGrouping/index.mjs.map +1 -1
  210. package/dist/esm/components/DataTableGrouping/index.native.js +287 -134
  211. package/dist/esm/components/DataTableGrouping/index.native.js.map +1 -1
  212. package/dist/esm/components/DataTablePagination/index.mjs +148 -96
  213. package/dist/esm/components/DataTablePagination/index.mjs.map +1 -1
  214. package/dist/esm/components/DataTablePagination/index.native.js +160 -107
  215. package/dist/esm/components/DataTablePagination/index.native.js.map +1 -1
  216. package/dist/esm/components/DataTableSearch/index.mjs +256 -215
  217. package/dist/esm/components/DataTableSearch/index.mjs.map +1 -1
  218. package/dist/esm/components/DataTableSearch/index.native.js +297 -248
  219. package/dist/esm/components/DataTableSearch/index.native.js.map +1 -1
  220. package/dist/esm/components/DataTableToolbar/index.mjs +145 -119
  221. package/dist/esm/components/DataTableToolbar/index.mjs.map +1 -1
  222. package/dist/esm/components/DataTableToolbar/index.native.js +167 -152
  223. package/dist/esm/components/DataTableToolbar/index.native.js.map +1 -1
  224. package/dist/esm/components/DataTableViewOptions/index.mjs +26 -22
  225. package/dist/esm/components/DataTableViewOptions/index.mjs.map +1 -1
  226. package/dist/esm/components/DataTableViewOptions/index.native.js +7 -5
  227. package/dist/esm/components/DataTableViewOptions/index.native.js.map +1 -1
  228. package/dist/esm/components/SimpleTable/index.mjs +338 -48
  229. package/dist/esm/components/SimpleTable/index.mjs.map +1 -1
  230. package/dist/esm/components/SimpleTable/index.native.js +358 -50
  231. package/dist/esm/components/SimpleTable/index.native.js.map +1 -1
  232. package/dist/esm/components/TableInput/index.mjs +150 -41
  233. package/dist/esm/components/TableInput/index.mjs.map +1 -1
  234. package/dist/esm/components/TableInput/index.native.js +55 -39
  235. package/dist/esm/components/TableInput/index.native.js.map +1 -1
  236. package/dist/esm/components/TableInput/shared.mjs +34 -1
  237. package/dist/esm/components/TableInput/shared.mjs.map +1 -1
  238. package/dist/esm/components/TableInput/shared.native.js +34 -1
  239. package/dist/esm/components/TableInput/shared.native.js.map +1 -1
  240. package/dist/esm/hooks/useDataTable.mjs +33 -2
  241. package/dist/esm/hooks/useDataTable.mjs.map +1 -1
  242. package/dist/esm/hooks/useDataTable.native.js +41 -2
  243. package/dist/esm/hooks/useDataTable.native.js.map +1 -1
  244. package/dist/esm/hooks/useInfiniteRows.mjs +20 -3
  245. package/dist/esm/hooks/useInfiniteRows.mjs.map +1 -1
  246. package/dist/esm/hooks/useInfiniteRows.native.js +20 -3
  247. package/dist/esm/hooks/useInfiniteRows.native.js.map +1 -1
  248. package/dist/esm/index.mjs +2 -1
  249. package/dist/esm/index.mjs.map +1 -1
  250. package/dist/esm/index.native.js +2 -1
  251. package/dist/esm/index.native.js.map +1 -1
  252. package/dist/esm/utils/filterUtils.mjs +12 -5
  253. package/dist/esm/utils/filterUtils.mjs.map +1 -1
  254. package/dist/esm/utils/filterUtils.native.js +20 -5
  255. package/dist/esm/utils/filterUtils.native.js.map +1 -1
  256. package/dist/jsx/components/ChildTable/index.mjs +2 -1
  257. package/dist/jsx/components/ChildTable/index.mjs.map +1 -1
  258. package/dist/jsx/components/ChildTable/index.native.js +2 -1
  259. package/dist/jsx/components/ChildTable/index.native.js.map +1 -1
  260. package/dist/jsx/components/ColumnHeaderFilter/index.mjs +17 -9
  261. package/dist/jsx/components/ColumnHeaderFilter/index.mjs.map +1 -1
  262. package/dist/jsx/components/ColumnHeaderFilter/index.native.js +32 -11
  263. package/dist/jsx/components/ColumnHeaderFilter/index.native.js.map +1 -1
  264. package/dist/jsx/components/DataTable/DataTableDocumentList.mjs +196 -0
  265. package/dist/jsx/components/DataTable/DataTableDocumentList.mjs.map +1 -0
  266. package/dist/jsx/components/DataTable/DataTableDocumentList.native.js +237 -0
  267. package/dist/jsx/components/DataTable/DataTableDocumentList.native.js.map +1 -0
  268. package/dist/jsx/components/DataTable/DataTableMobileCards.mjs +5 -2
  269. package/dist/jsx/components/DataTable/DataTableMobileCards.mjs.map +1 -1
  270. package/dist/jsx/components/DataTable/DataTableMobileCards.native.js +6 -2
  271. package/dist/jsx/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  272. package/dist/jsx/components/DataTable/DataTableRoot.mjs +93 -42
  273. package/dist/jsx/components/DataTable/DataTableRoot.mjs.map +1 -1
  274. package/dist/jsx/components/DataTable/DataTableRoot.native.js +97 -43
  275. package/dist/jsx/components/DataTable/DataTableRoot.native.js.map +1 -1
  276. package/dist/jsx/components/DataTable/DataTableVirtualized.mjs +8 -2
  277. package/dist/jsx/components/DataTable/DataTableVirtualized.mjs.map +1 -1
  278. package/dist/jsx/components/DataTable/DataTableVirtualized.native.js +9 -3
  279. package/dist/jsx/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  280. package/dist/jsx/components/DataTable/documentListSlots.mjs +33 -0
  281. package/dist/jsx/components/DataTable/documentListSlots.mjs.map +1 -0
  282. package/dist/jsx/components/DataTable/documentListSlots.native.js +85 -0
  283. package/dist/jsx/components/DataTable/documentListSlots.native.js.map +1 -0
  284. package/dist/jsx/components/DataTable/index.native.js +74 -59
  285. package/dist/jsx/components/DataTable/index.native.js.map +1 -1
  286. package/dist/jsx/components/DataTable/rowStateChrome.mjs +28 -0
  287. package/dist/jsx/components/DataTable/rowStateChrome.mjs.map +1 -0
  288. package/dist/jsx/components/DataTable/rowStateChrome.native.js +59 -0
  289. package/dist/jsx/components/DataTable/rowStateChrome.native.js.map +1 -0
  290. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs +25 -4
  291. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  292. package/dist/jsx/components/DataTableCell/CellModalEditor.native.js +6 -1
  293. package/dist/jsx/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  294. package/dist/jsx/components/DataTableCell/CellOptionsEditor.mjs +9 -2
  295. package/dist/jsx/components/DataTableCell/CellOptionsEditor.mjs.map +1 -1
  296. package/dist/jsx/components/DataTableCell/CellOptionsEditor.native.js +11 -2
  297. package/dist/jsx/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  298. package/dist/jsx/components/DataTableCell/index.mjs +75 -64
  299. package/dist/jsx/components/DataTableCell/index.mjs.map +1 -1
  300. package/dist/jsx/components/DataTableCell/index.native.js +94 -82
  301. package/dist/jsx/components/DataTableCell/index.native.js.map +1 -1
  302. package/dist/jsx/components/DataTableColumnPinning/index.mjs +54 -37
  303. package/dist/jsx/components/DataTableColumnPinning/index.mjs.map +1 -1
  304. package/dist/jsx/components/DataTableColumnPinning/index.native.js +59 -38
  305. package/dist/jsx/components/DataTableColumnPinning/index.native.js.map +1 -1
  306. package/dist/jsx/components/DataTableDateFilter/index.mjs +34 -15
  307. package/dist/jsx/components/DataTableDateFilter/index.mjs.map +1 -1
  308. package/dist/jsx/components/DataTableDateFilter/index.native.js +33 -12
  309. package/dist/jsx/components/DataTableDateFilter/index.native.js.map +1 -1
  310. package/dist/jsx/components/DataTableExport/index.mjs +36 -8
  311. package/dist/jsx/components/DataTableExport/index.mjs.map +1 -1
  312. package/dist/jsx/components/DataTableExport/index.native.js +42 -7
  313. package/dist/jsx/components/DataTableExport/index.native.js.map +1 -1
  314. package/dist/jsx/components/DataTableFacetMenu/index.mjs +115 -0
  315. package/dist/jsx/components/DataTableFacetMenu/index.mjs.map +1 -0
  316. package/dist/jsx/components/DataTableFacetMenu/index.native.js +156 -0
  317. package/dist/jsx/components/DataTableFacetMenu/index.native.js.map +1 -0
  318. package/dist/jsx/components/DataTableFilterButton/index.mjs +54 -35
  319. package/dist/jsx/components/DataTableFilterButton/index.mjs.map +1 -1
  320. package/dist/jsx/components/DataTableFilterButton/index.native.js +63 -40
  321. package/dist/jsx/components/DataTableFilterButton/index.native.js.map +1 -1
  322. package/dist/jsx/components/DataTableFilterChips/FilterChip.mjs +118 -0
  323. package/dist/jsx/components/DataTableFilterChips/FilterChip.mjs.map +1 -0
  324. package/dist/jsx/components/DataTableFilterChips/FilterChip.native.js +148 -0
  325. package/dist/jsx/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
  326. package/dist/jsx/components/DataTableFilterChips/index.mjs +9 -32
  327. package/dist/jsx/components/DataTableFilterChips/index.mjs.map +1 -1
  328. package/dist/jsx/components/DataTableFilterChips/index.native.js +9 -32
  329. package/dist/jsx/components/DataTableFilterChips/index.native.js.map +1 -1
  330. package/dist/jsx/components/DataTableFilters/index.mjs +149 -506
  331. package/dist/jsx/components/DataTableFilters/index.mjs.map +1 -1
  332. package/dist/jsx/components/DataTableFilters/index.native.js +171 -544
  333. package/dist/jsx/components/DataTableFilters/index.native.js.map +1 -1
  334. package/dist/jsx/components/DataTableGrouping/index.mjs +275 -110
  335. package/dist/jsx/components/DataTableGrouping/index.mjs.map +1 -1
  336. package/dist/jsx/components/DataTableGrouping/index.native.js +310 -157
  337. package/dist/jsx/components/DataTableGrouping/index.native.js.map +1 -1
  338. package/dist/jsx/components/DataTablePagination/index.mjs +148 -96
  339. package/dist/jsx/components/DataTablePagination/index.mjs.map +1 -1
  340. package/dist/jsx/components/DataTablePagination/index.native.js +159 -106
  341. package/dist/jsx/components/DataTablePagination/index.native.js.map +1 -1
  342. package/dist/jsx/components/DataTableSearch/index.mjs +256 -215
  343. package/dist/jsx/components/DataTableSearch/index.mjs.map +1 -1
  344. package/dist/jsx/components/DataTableSearch/index.native.js +292 -243
  345. package/dist/jsx/components/DataTableSearch/index.native.js.map +1 -1
  346. package/dist/jsx/components/DataTableToolbar/index.mjs +145 -119
  347. package/dist/jsx/components/DataTableToolbar/index.mjs.map +1 -1
  348. package/dist/jsx/components/DataTableToolbar/index.native.js +163 -148
  349. package/dist/jsx/components/DataTableToolbar/index.native.js.map +1 -1
  350. package/dist/jsx/components/DataTableViewOptions/index.mjs +26 -22
  351. package/dist/jsx/components/DataTableViewOptions/index.mjs.map +1 -1
  352. package/dist/jsx/components/DataTableViewOptions/index.native.js +6 -4
  353. package/dist/jsx/components/DataTableViewOptions/index.native.js.map +1 -1
  354. package/dist/jsx/components/SimpleTable/index.mjs +338 -48
  355. package/dist/jsx/components/SimpleTable/index.mjs.map +1 -1
  356. package/dist/jsx/components/SimpleTable/index.native.js +356 -48
  357. package/dist/jsx/components/SimpleTable/index.native.js.map +1 -1
  358. package/dist/jsx/components/TableInput/index.mjs +150 -41
  359. package/dist/jsx/components/TableInput/index.mjs.map +1 -1
  360. package/dist/jsx/components/TableInput/index.native.js +54 -38
  361. package/dist/jsx/components/TableInput/index.native.js.map +1 -1
  362. package/dist/jsx/components/TableInput/shared.mjs +34 -1
  363. package/dist/jsx/components/TableInput/shared.mjs.map +1 -1
  364. package/dist/jsx/components/TableInput/shared.native.js +35 -0
  365. package/dist/jsx/components/TableInput/shared.native.js.map +1 -1
  366. package/dist/jsx/hooks/useDataTable.mjs +33 -2
  367. package/dist/jsx/hooks/useDataTable.mjs.map +1 -1
  368. package/dist/jsx/hooks/useDataTable.native.js +41 -2
  369. package/dist/jsx/hooks/useDataTable.native.js.map +1 -1
  370. package/dist/jsx/hooks/useInfiniteRows.mjs +20 -3
  371. package/dist/jsx/hooks/useInfiniteRows.mjs.map +1 -1
  372. package/dist/jsx/hooks/useInfiniteRows.native.js +20 -3
  373. package/dist/jsx/hooks/useInfiniteRows.native.js.map +1 -1
  374. package/dist/jsx/index.js +2 -1
  375. package/dist/jsx/index.js.map +1 -1
  376. package/dist/jsx/index.mjs +2 -1
  377. package/dist/jsx/index.mjs.map +1 -1
  378. package/dist/jsx/index.native.js +2 -0
  379. package/dist/jsx/index.native.js.map +1 -1
  380. package/dist/jsx/utils/filterUtils.mjs +12 -5
  381. package/dist/jsx/utils/filterUtils.mjs.map +1 -1
  382. package/dist/jsx/utils/filterUtils.native.js +20 -5
  383. package/dist/jsx/utils/filterUtils.native.js.map +1 -1
  384. package/package.json +16 -16
  385. package/src/components/ChildTable/index.tsx +1 -0
  386. package/src/components/ColumnHeaderFilter/ColumnHeaderFilter.spec.tsx +85 -0
  387. package/src/components/ColumnHeaderFilter/index.tsx +28 -10
  388. package/src/components/DataTable/DataTable.stories.tsx +30 -0
  389. package/src/components/DataTable/DataTableDocumentList.tsx +224 -0
  390. package/src/components/DataTable/DataTableMobileCards.tsx +20 -8
  391. package/src/components/DataTable/DataTableRoot.tsx +135 -58
  392. package/src/components/DataTable/DataTableVirtualized.tsx +8 -11
  393. package/src/components/DataTable/cardLayout.spec.tsx +89 -0
  394. package/src/components/DataTable/documentListSlots.ts +57 -0
  395. package/src/components/DataTable/index.native.tsx +76 -50
  396. package/src/components/DataTable/keepPreviousData.spec.tsx +137 -0
  397. package/src/components/DataTable/rowRing.spec.tsx +118 -0
  398. package/src/components/DataTable/rowStateChrome.ts +38 -0
  399. package/src/components/DataTableCell/CellModalEditor.native.tsx +4 -0
  400. package/src/components/DataTableCell/CellModalEditor.tsx +31 -3
  401. package/src/components/DataTableCell/CellOptionsEditor.tsx +29 -12
  402. package/src/components/DataTableCell/DataTableCell.stories.tsx +3 -3
  403. package/src/components/DataTableCell/cellDraftPolicy.spec.tsx +131 -4
  404. package/src/components/DataTableCell/dataTableCell.spec.tsx +36 -1
  405. package/src/components/DataTableCell/index.tsx +121 -86
  406. package/src/components/DataTableColumnPinning/DataTableColumnPinning.spec.tsx +66 -0
  407. package/src/components/DataTableColumnPinning/index.tsx +32 -17
  408. package/src/components/DataTableDateFilter/DataTableDateFilter.spec.tsx +9 -1
  409. package/src/components/DataTableDateFilter/dateFilterZones.spec.ts +316 -0
  410. package/src/components/DataTableDateFilter/index.tsx +42 -22
  411. package/src/components/DataTableExport/exportDateZones.spec.tsx +348 -0
  412. package/src/components/DataTableExport/index.tsx +107 -63
  413. package/src/components/DataTableFacetMenu/DataTableFacetMenu.spec.tsx +264 -0
  414. package/src/components/DataTableFacetMenu/DataTableFacetMenu.stories.tsx +212 -0
  415. package/src/components/DataTableFacetMenu/index.tsx +202 -0
  416. package/src/components/DataTableFilterButton/index.tsx +66 -49
  417. package/src/components/DataTableFilterChips/DataTableFilterChips.spec.tsx +22 -0
  418. package/src/components/DataTableFilterChips/FilterChip.tsx +122 -0
  419. package/src/components/DataTableFilterChips/index.tsx +13 -29
  420. package/src/components/DataTableFilters/DataTableFilters.spec.tsx +56 -0
  421. package/src/components/DataTableFilters/index.tsx +169 -584
  422. package/src/components/DataTableGrouping/DataTableGrouping.spec.tsx +85 -0
  423. package/src/components/DataTableGrouping/index.tsx +270 -130
  424. package/src/components/DataTablePagination/DataTablePagination.spec.tsx +79 -4
  425. package/src/components/DataTablePagination/index.tsx +168 -112
  426. package/src/components/DataTableSearch/DataTableSearch.spec.tsx +40 -0
  427. package/src/components/DataTableSearch/DataTableSearch.stories.tsx +1 -1
  428. package/src/components/DataTableSearch/index.tsx +192 -163
  429. package/src/components/DataTableToolbar/DataTableToolbar.spec.tsx +48 -18
  430. package/src/components/DataTableToolbar/DataTableToolbar.stories.tsx +5 -45
  431. package/src/components/DataTableToolbar/index.tsx +128 -99
  432. package/src/components/DataTableViewOptions/index.tsx +29 -22
  433. package/src/components/SimpleTable/SimpleTable.stories.tsx +29 -5
  434. package/src/components/SimpleTable/index.tsx +442 -61
  435. package/src/components/SimpleTable/simpleTable.spec.tsx +140 -12
  436. package/src/components/TableInput/index.native.tsx +91 -81
  437. package/src/components/TableInput/index.tsx +191 -50
  438. package/src/components/TableInput/shared.ts +57 -0
  439. package/src/components/TableInput/tableInput.spec.tsx +104 -0
  440. package/src/hooks/useDataTable.spec.ts +100 -3
  441. package/src/hooks/useDataTable.ts +44 -1
  442. package/src/hooks/useInfiniteRows.spec.tsx +37 -0
  443. package/src/hooks/useInfiniteRows.ts +34 -4
  444. package/src/index.ts +7 -0
  445. package/src/types.ts +54 -3
  446. package/src/utils/filterUtils.ts +27 -5
  447. package/types/components/ChildTable/index.d.ts.map +1 -1
  448. package/types/components/ColumnHeaderFilter/index.d.ts.map +1 -1
  449. package/types/components/DataTable/DataTableDocumentList.d.ts +32 -0
  450. package/types/components/DataTable/DataTableDocumentList.d.ts.map +1 -0
  451. package/types/components/DataTable/DataTableMobileCards.d.ts +3 -1
  452. package/types/components/DataTable/DataTableMobileCards.d.ts.map +1 -1
  453. package/types/components/DataTable/DataTableRoot.d.ts +1 -1
  454. package/types/components/DataTable/DataTableRoot.d.ts.map +1 -1
  455. package/types/components/DataTable/DataTableVirtualized.d.ts +1 -2
  456. package/types/components/DataTable/DataTableVirtualized.d.ts.map +1 -1
  457. package/types/components/DataTable/documentListSlots.d.ts +26 -0
  458. package/types/components/DataTable/documentListSlots.d.ts.map +1 -0
  459. package/types/components/DataTable/index.native.d.ts +1 -1
  460. package/types/components/DataTable/index.native.d.ts.map +1 -1
  461. package/types/components/DataTable/rowStateChrome.d.ts +18 -0
  462. package/types/components/DataTable/rowStateChrome.d.ts.map +1 -0
  463. package/types/components/DataTableCell/CellModalEditor.d.ts +6 -1
  464. package/types/components/DataTableCell/CellModalEditor.d.ts.map +1 -1
  465. package/types/components/DataTableCell/CellModalEditor.native.d.ts +1 -1
  466. package/types/components/DataTableCell/CellModalEditor.native.d.ts.map +1 -1
  467. package/types/components/DataTableCell/CellOptionsEditor.d.ts +11 -3
  468. package/types/components/DataTableCell/CellOptionsEditor.d.ts.map +1 -1
  469. package/types/components/DataTableCell/index.d.ts +1 -1
  470. package/types/components/DataTableCell/index.d.ts.map +1 -1
  471. package/types/components/DataTableColumnPinning/index.d.ts.map +1 -1
  472. package/types/components/DataTableDateFilter/index.d.ts.map +1 -1
  473. package/types/components/DataTableExport/index.d.ts +17 -6
  474. package/types/components/DataTableExport/index.d.ts.map +1 -1
  475. package/types/components/DataTableFacetMenu/index.d.ts +84 -0
  476. package/types/components/DataTableFacetMenu/index.d.ts.map +1 -0
  477. package/types/components/DataTableFilterButton/index.d.ts.map +1 -1
  478. package/types/components/DataTableFilterChips/FilterChip.d.ts +15 -0
  479. package/types/components/DataTableFilterChips/FilterChip.d.ts.map +1 -0
  480. package/types/components/DataTableFilterChips/index.d.ts +5 -0
  481. package/types/components/DataTableFilterChips/index.d.ts.map +1 -1
  482. package/types/components/DataTableFilters/index.d.ts +11 -0
  483. package/types/components/DataTableFilters/index.d.ts.map +1 -1
  484. package/types/components/DataTableGrouping/index.d.ts.map +1 -1
  485. package/types/components/DataTablePagination/index.d.ts +5 -0
  486. package/types/components/DataTablePagination/index.d.ts.map +1 -1
  487. package/types/components/DataTableSearch/index.d.ts.map +1 -1
  488. package/types/components/DataTableToolbar/index.d.ts +2 -0
  489. package/types/components/DataTableToolbar/index.d.ts.map +1 -1
  490. package/types/components/SimpleTable/index.d.ts +27 -5
  491. package/types/components/SimpleTable/index.d.ts.map +1 -1
  492. package/types/components/TableInput/index.d.ts +6 -1
  493. package/types/components/TableInput/index.d.ts.map +1 -1
  494. package/types/components/TableInput/index.native.d.ts +6 -1
  495. package/types/components/TableInput/index.native.d.ts.map +1 -1
  496. package/types/components/TableInput/shared.d.ts +38 -0
  497. package/types/components/TableInput/shared.d.ts.map +1 -1
  498. package/types/hooks/useDataTable.d.ts +1 -1
  499. package/types/hooks/useDataTable.d.ts.map +1 -1
  500. package/types/hooks/useInfiniteRows.d.ts +8 -1
  501. package/types/hooks/useInfiniteRows.d.ts.map +1 -1
  502. package/types/index.d.ts +1 -0
  503. package/types/index.d.ts.map +1 -1
  504. package/types/types.d.ts +54 -3
  505. package/types/types.d.ts.map +1 -1
  506. package/types/utils/filterUtils.d.ts.map +1 -1
@@ -15,11 +15,11 @@ import {
15
15
  } from "@phosphor-icons/react";
16
16
  import { FlashList, type FlashListRef } from "@shopify/flash-list";
17
17
  import { AsyncBoundary, EmptyState, useDirection } from "@multiplatform.one/components";
18
- import { Button, Field, useFormField, zIndex } from "@multiplatform.one/forms";
18
+ import { Button, Field, useFormField } from "@multiplatform.one/forms";
19
19
  import { flexRender } from "@tanstack/react-table";
20
20
  import { hairline, useResolvedKnobs } from "@multiplatform.one/theme";
21
21
  import React, { useRef, useMemo, useCallback } from "react";
22
- import { ScrollView, Spinner, Text, View, useMedia, withStaticProperties } from "tamagui";
22
+ import { ScrollView, Text, View, useMedia, withStaticProperties } from "tamagui";
23
23
  import { useTranslation } from "react-i18next";
24
24
  import { useDataTable } from "../../hooks/useDataTable";
25
25
  import type { DataTableColumn, DataTableField } from "../../types";
@@ -37,6 +37,8 @@ import { DataTableGrouping } from "../DataTableGrouping";
37
37
  import { DataTableCell } from "../DataTableCell";
38
38
  import { Table } from "@multiplatform.one/table-primitives";
39
39
  import { DataTableContext } from "./DataTableContext";
40
+ import { DataTableDocumentList } from "./DataTableDocumentList";
41
+ import { tableRowStateProps } from "./rowStateChrome";
40
42
  import { DataTableStateContext } from "./DataTableStateContext";
41
43
  import type { DataTableStateContextValue } from "./DataTableStateContext";
42
44
  import type { DataTableRootProps } from "./DataTableRoot";
@@ -110,6 +112,8 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
110
112
  initialState,
111
113
  onStateChange,
112
114
  onRetry,
115
+ isLoading: isLoadingProp,
116
+ isFetching: isFetchingProp,
113
117
  syncWithUrl = false,
114
118
  urlDebounceMs = 500,
115
119
  urlStrategy,
@@ -163,9 +167,10 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
163
167
  }: DataTableRootProps<TData>) {
164
168
  const { t } = useTranslation();
165
169
  const { sm } = useMedia();
166
- // Native keeps its certified card pattern; the `layout` prop only pins a
167
- // mode ("table" forces the grid, "cards" forces cards, default auto = !sm).
168
- const showCards = layout === "cards" || (layout === "auto" && !sm);
170
+ // Native: `list` is subject-led document rows (same as web). Cards stay
171
+ // the certified compact pattern; `table` pins the grid.
172
+ const showList = layout === "list";
173
+ const showCards = !showList && (layout === "cards" || (layout === "auto" && !sm));
169
174
  const { knobProps, disabledState } = useResolvedKnobs({
170
175
  intent: undefined,
171
176
  component: "DataTable",
@@ -210,6 +215,8 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
210
215
  enableKeyboardNavigation: false,
211
216
  rowCount,
212
217
  pageCount,
218
+ isLoading: isLoadingProp,
219
+ isFetching: isFetchingProp,
213
220
  });
214
221
 
215
222
  const resolvedSize: "sm" | "md" | "lg" =
@@ -219,6 +226,17 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
219
226
 
220
227
  const headerGroups = table.getHeaderGroups();
221
228
  const tableRows = table.getRowModel().rows;
229
+ const heldRowsRef = useRef(tableRows);
230
+ if (tableRows.length > 0) {
231
+ heldRowsRef.current = tableRows;
232
+ }
233
+ const queryInFlight = Boolean(state.isFetching || state.isPlaceholderData || state.isLoading);
234
+ const displayRows =
235
+ tableRows.length > 0
236
+ ? tableRows
237
+ : queryInFlight && heldRowsRef.current.length > 0
238
+ ? heldRowsRef.current
239
+ : tableRows;
222
240
  const footerGroups = table.getFooterGroups();
223
241
 
224
242
  const flashListRef = useRef<FlashListRef<(typeof tableRows)[0]>>(null);
@@ -502,7 +520,11 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
502
520
  const renderRow = useCallback(
503
521
  (row: (typeof tableRows)[0], index: number) => (
504
522
  <Table.Row
505
- backgroundColor={tableZebraOn && index % 2 === 1 ? "$color2" : "$color1"}
523
+ {...(tableRowStateProps({
524
+ selected: Boolean(row.getIsSelected?.()),
525
+ zebraOn: tableZebraOn,
526
+ index,
527
+ }) as any)}
506
528
  rowLocation="middle"
507
529
  key={`${row.id}-${index}`}
508
530
  aria-rowindex={index + 1}
@@ -622,6 +644,7 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
622
644
  onLoadView: actions.loadView,
623
645
  views: state.views,
624
646
  activeViewId: state.activeViewId,
647
+ isFetching: Boolean(state.isFetching),
625
648
  });
626
649
  }
627
650
  return (
@@ -636,6 +659,7 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
636
659
  enableViews={enableViews}
637
660
  enableGlobalSearch={enableGlobalSearch}
638
661
  enableFiltering={enableFiltering}
662
+ isFetching={Boolean(state.isFetching)}
639
663
  />
640
664
  );
641
665
  };
@@ -689,7 +713,7 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
689
713
  />
690
714
  );
691
715
  }
692
- if (state.isLoading && tableRows.length === 0) {
716
+ if (state.isLoading && displayRows.length === 0 && !state.isFetching) {
693
717
  return <AsyncBoundary loading layout="table" aria-label={ariaLabel || "Data table"} />;
694
718
  }
695
719
 
@@ -703,6 +727,7 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
703
727
  aria-describedby={ariaDescribedBy}
704
728
  aria-live="polite"
705
729
  aria-atomic="false"
730
+ aria-busy={queryInFlight || undefined}
706
731
  {...knobProps.containerRadius}
707
732
  // UX-011 / Axiom 6 HONEST STATE: `disabled` makes the whole
708
733
  // assembly inert (pointerEvents none blocks every touch) and
@@ -737,20 +762,32 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
737
762
  })),
738
763
  })}
739
764
 
740
- {showCards ? (
765
+ {showList ? (
766
+ <DataTableDocumentList
767
+ tableRows={displayRows}
768
+ disabled={disabled}
769
+ hasActiveFilters={computed.hasActiveFilters}
770
+ renderCellContent={renderCellContent}
771
+ compact={isCompact}
772
+ queryInFlight={queryInFlight}
773
+ {...(rowPressActive ? { getRowPressProps } : {})}
774
+ />
775
+ ) : showCards ? (
741
776
  <View flexDirection="column" gap="$2">
742
- {tableRows.length === 0 ? (
743
- <EmptyState
744
- compact
745
- backgroundColor="$color1"
746
- borderRadius="$4"
747
- aria-live="polite"
748
- title={
749
- computed.hasActiveFilters ? t("No results found") : t("No data available")
750
- }
751
- />
777
+ {displayRows.length === 0 ? (
778
+ queryInFlight ? null : (
779
+ <EmptyState
780
+ compact
781
+ backgroundColor="$color1"
782
+ borderRadius="$4"
783
+ aria-live="polite"
784
+ title={
785
+ computed.hasActiveFilters ? t("No results found") : t("No data available")
786
+ }
787
+ />
788
+ )
752
789
  ) : (
753
- tableRows.map((row, index) =>
790
+ displayRows.map((row, index) =>
754
791
  renderMobileCard(
755
792
  row,
756
793
  index,
@@ -898,32 +935,34 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
898
935
  </Table.Head>
899
936
 
900
937
  <Table.Body aria-label="Table data">
901
- {tableRows.length === 0 ? (
938
+ {displayRows.length === 0 ? (
902
939
  <Table.Row>
903
940
  <Table.Cell>
904
- <EmptyState
905
- compact
906
- aria-live="polite"
907
- title={
908
- computed.hasActiveFilters
909
- ? t("No results found")
910
- : t("No data available")
911
- }
912
- />
941
+ {queryInFlight ? null : (
942
+ <EmptyState
943
+ compact
944
+ aria-live="polite"
945
+ title={
946
+ computed.hasActiveFilters
947
+ ? t("No results found")
948
+ : t("No data available")
949
+ }
950
+ />
951
+ )}
913
952
  </Table.Cell>
914
953
  </Table.Row>
915
954
  ) : isVirtualized ? (
916
955
  <View style={{ height: virtualizationHeight }}>
917
956
  <FlashList
918
957
  ref={flashListRef}
919
- data={tableRows}
958
+ data={displayRows}
920
959
  drawDistance={rowHeightPx * virtualizationOverscan}
921
960
  keyExtractor={(row) => row.id}
922
961
  renderItem={({ item, index }) => renderRow(item, index)}
923
962
  />
924
963
  </View>
925
964
  ) : (
926
- tableRows.map((row, index) => {
965
+ displayRows.map((row, index) => {
927
966
  const mainRow = renderRow(row, index);
928
967
  const subRow =
929
968
  enableRowExpansion &&
@@ -994,25 +1033,6 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
994
1033
  {renderPaginationComponent()}
995
1034
  </View>
996
1035
  )}
997
-
998
- {state.isLoading && (
999
- <View
1000
- position="absolute"
1001
- top={0}
1002
- left={0}
1003
- right={0}
1004
- bottom={0}
1005
- alignItems="center"
1006
- justifyContent="center"
1007
- zIndex={zIndex.loading}
1008
- aria-busy={true}
1009
- aria-live="assertive"
1010
- aria-label="Loading table data"
1011
- role="status"
1012
- >
1013
- <Spinner size="large" color="$color10" />
1014
- </View>
1015
- )}
1016
1036
  </View>
1017
1037
  </DataTableStateContext.Provider>
1018
1038
  </DataTableContext.Provider>
@@ -1057,6 +1077,7 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
1057
1077
  renderSubComponent,
1058
1078
  footerGroups,
1059
1079
  sm,
1080
+ showList,
1060
1081
  showCards,
1061
1082
  renderPaginationComponent,
1062
1083
  showAddRow,
@@ -1068,6 +1089,11 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
1068
1089
  defaultRow,
1069
1090
  disabled,
1070
1091
  disabledState,
1092
+ renderCellContent,
1093
+ rowPressActive,
1094
+ getRowPressProps,
1095
+ displayRows,
1096
+ queryInFlight,
1071
1097
  t,
1072
1098
  ],
1073
1099
  );
@@ -0,0 +1,137 @@
1
+ /**
2
+ * keepPreviousData — a refetch must not blank the body.
3
+ *
4
+ * TanStack Query's placeholderData / keepPreviousData, AG Grid's delta
5
+ * row-data, and Frappe Desk's list all keep the last painted rows on
6
+ * screen while the next query is in flight. The only in-flight chrome
7
+ * allowed is a toolbar spinner (aria-busy). Skeleton, empty-state, and
8
+ * a covering overlay are first-load only.
9
+ */
10
+
11
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
12
+ import { describe, expect, it, vi } from "vitest";
13
+ import type { DataTableColumn } from "../../types";
14
+ import { DataTable } from "./index";
15
+
16
+ type Person = { id: number; firstName: string; age: number };
17
+
18
+ const sampleData: Person[] = [
19
+ { id: 1, firstName: "John", age: 28 },
20
+ { id: 2, firstName: "Jane", age: 32 },
21
+ ];
22
+
23
+ const columns: DataTableColumn<Person>[] = [
24
+ { id: "firstName", accessorKey: "firstName", header: "First Name" },
25
+ { id: "age", accessorKey: "age", header: "Age" },
26
+ ];
27
+
28
+ function renderTable(extra: Record<string, unknown> = {}, data: Person[] = sampleData) {
29
+ return renderWithProviders(
30
+ <DataTable
31
+ data={data}
32
+ columns={columns as DataTableColumn<Record<string, any>>[]}
33
+ layout="table"
34
+ enablePagination={false}
35
+ enableGlobalSearch={false}
36
+ enableFiltering={false}
37
+ onStateChange={vi.fn()}
38
+ {...extra}
39
+ />,
40
+ );
41
+ }
42
+
43
+ describe("DataTable keepPreviousData", () => {
44
+ it("keeps previous rows painted when isFetching arrives with empty data", () => {
45
+ const { rerender, getByText, queryByText } = renderTable({ isFetching: false });
46
+ expect(getByText("John")).toBeDefined();
47
+
48
+ rerender(
49
+ <DataTable
50
+ data={[]}
51
+ columns={columns as DataTableColumn<Record<string, any>>[]}
52
+ layout="table"
53
+ enablePagination={false}
54
+ enableGlobalSearch={false}
55
+ enableFiltering={false}
56
+ isFetching
57
+ onStateChange={vi.fn()}
58
+ />,
59
+ );
60
+
61
+ expect(getByText("John")).toBeDefined();
62
+ expect(getByText("Jane")).toBeDefined();
63
+ expect(queryByText("No data available")).toBeNull();
64
+ expect(queryByText("No results found")).toBeNull();
65
+ });
66
+
67
+ it("keeps previous rows in list layout while isFetching blanks the payload", () => {
68
+ const { rerender, getByText, queryByText, container } = renderWithProviders(
69
+ <DataTable
70
+ data={sampleData}
71
+ columns={columns as DataTableColumn<Record<string, any>>[]}
72
+ layout="list"
73
+ enablePagination={false}
74
+ enableGlobalSearch={false}
75
+ enableFiltering={false}
76
+ onStateChange={vi.fn()}
77
+ />,
78
+ );
79
+ expect(container.querySelectorAll('[data-testid="data-table-list-row"]').length).toBe(2);
80
+
81
+ rerender(
82
+ <DataTable
83
+ data={[]}
84
+ columns={columns as DataTableColumn<Record<string, any>>[]}
85
+ layout="list"
86
+ enablePagination={false}
87
+ enableGlobalSearch={false}
88
+ enableFiltering={false}
89
+ isFetching
90
+ onStateChange={vi.fn()}
91
+ />,
92
+ );
93
+
94
+ expect(getByText("John")).toBeDefined();
95
+ expect(container.querySelectorAll('[data-testid="data-table-list-row"]').length).toBe(2);
96
+ expect(queryByText("No data available")).toBeNull();
97
+ });
98
+
99
+ it("does not cover existing rows with a loading overlay when isLoading is set", () => {
100
+ const { getByText, queryByLabelText } = renderTable({ isLoading: true });
101
+ expect(getByText("John")).toBeDefined();
102
+ expect(queryByLabelText("Loading table data")).toBeNull();
103
+ });
104
+
105
+ it("does not unmount rows for a skeleton when isLoading arrives after a first paint", () => {
106
+ const { rerender, getByText, queryByLabelText } = renderTable({ isLoading: false });
107
+ expect(getByText("John")).toBeDefined();
108
+
109
+ rerender(
110
+ <DataTable
111
+ data={sampleData}
112
+ columns={columns as DataTableColumn<Record<string, any>>[]}
113
+ layout="table"
114
+ enablePagination={false}
115
+ enableGlobalSearch={false}
116
+ enableFiltering={false}
117
+ isLoading
118
+ onStateChange={vi.fn()}
119
+ />,
120
+ );
121
+
122
+ expect(getByText("John")).toBeDefined();
123
+ expect(queryByLabelText("Loading table data")).toBeNull();
124
+ });
125
+
126
+ it("does not paint the true-empty copy while a first fetch is in flight", () => {
127
+ const { queryByText, container } = renderTable({ isFetching: true }, []);
128
+ expect(queryByText("No data available")).toBeNull();
129
+ expect(queryByText("No results found")).toBeNull();
130
+ expect(container.querySelector('[aria-busy="true"]')).not.toBeNull();
131
+ });
132
+
133
+ it("shows empty state only after the query settles with zero rows", () => {
134
+ const { getByText } = renderTable({ isFetching: false, isLoading: false }, []);
135
+ expect(getByText("No data available")).toBeDefined();
136
+ });
137
+ });
@@ -0,0 +1,118 @@
1
+ /**
2
+ * LC-71 RING-ANATOMY on table rows and cells.
3
+ *
4
+ * Two channels, never shared: selected = fill; keyboard focus = one inset
5
+ * ring on the perceived control (the row when the row is the tab stop, the
6
+ * cell when Excel-mode keyboard nav is on the cell). Unselected siblings
7
+ * carry neither a selection border nor a ring. Pointer-origin focus paints
8
+ * no ring.
9
+ */
10
+
11
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
12
+ import { fireEvent, screen } from "@testing-library/react";
13
+ import { describe, expect, it, vi } from "vitest";
14
+ import type { DataTableColumn } from "../../types";
15
+ import { DataTable } from "./index";
16
+
17
+ type Person = { id: number; firstName: string; age: number };
18
+
19
+ const sampleData: Person[] = [
20
+ { id: 1, firstName: "Alice", age: 30 },
21
+ { id: 2, firstName: "Bob", age: 40 },
22
+ { id: 3, firstName: "Carol", age: 20 },
23
+ ];
24
+
25
+ const columns: DataTableColumn<Person>[] = [
26
+ { id: "firstName", accessorKey: "firstName", header: "First Name" },
27
+ { id: "age", accessorKey: "age", header: "Age" },
28
+ ];
29
+
30
+ function renderGrid(extra: Record<string, unknown> = {}) {
31
+ return renderWithProviders(
32
+ <DataTable
33
+ data={sampleData}
34
+ columns={columns as DataTableColumn<Record<string, any>>[]}
35
+ layout="table"
36
+ enablePagination={false}
37
+ enableGlobalSearch={false}
38
+ enableFiltering={false}
39
+ onStateChange={vi.fn()}
40
+ {...extra}
41
+ />,
42
+ );
43
+ }
44
+
45
+ describe("DataTable LC-71 row/cell rings", () => {
46
+ it("selected row is fill (data-row-selected), not a ring on every sibling", () => {
47
+ const { container } = renderGrid({ enableRowSelection: true });
48
+ fireEvent.click(screen.getByRole("checkbox", { name: "Select row Alice" }));
49
+
50
+ const selected = container.querySelectorAll('[data-row-selected="true"]');
51
+ const unselected = container.querySelectorAll('[data-row-selected="false"]');
52
+ expect(selected.length).toBe(1);
53
+ expect(unselected.length).toBe(2);
54
+ expect(selected[0]?.getAttribute("aria-selected")).toBe("true");
55
+ for (const row of unselected) {
56
+ expect(row.getAttribute("aria-selected")).not.toBe("true");
57
+ expect(row.getAttribute("data-row-keyboard-focus")).not.toBe("true");
58
+ }
59
+ });
60
+
61
+ it("keyboard-focused pressable row is the only ring (LC-71)", () => {
62
+ const { container } = renderGrid({ onRowPress: vi.fn() });
63
+ const rows = Array.from(container.querySelectorAll('[data-row-press="true"]')) as HTMLElement[];
64
+ expect(rows).toHaveLength(3);
65
+
66
+ rows[0].focus();
67
+ fireEvent.keyDown(rows[0], { key: "ArrowDown" });
68
+ expect(document.activeElement).toBe(rows[1]);
69
+
70
+ const focused = container.querySelectorAll('[data-row-keyboard-focus="true"]');
71
+ expect(focused.length).toBe(1);
72
+ expect(focused[0]).toBe(rows[1]);
73
+ expect(rows[0].getAttribute("data-row-keyboard-focus")).not.toBe("true");
74
+ expect(rows[2].getAttribute("data-row-keyboard-focus")).not.toBe("true");
75
+ });
76
+
77
+ it("Excel-mode keyboard nav rings exactly one cell, never every cell", () => {
78
+ const { container } = renderGrid({ enableKeyboardNavigation: true });
79
+ const grid = container.querySelector('[data-table-grid="true"]') as HTMLElement;
80
+ expect(grid).not.toBeNull();
81
+
82
+ fireEvent.keyDown(grid, { key: "ArrowDown" });
83
+ const focusedCells = container.querySelectorAll('[data-cell-keyboard-focus="true"]');
84
+ expect(focusedCells.length).toBe(1);
85
+
86
+ fireEvent.keyDown(grid, { key: "ArrowRight" });
87
+ const after = container.querySelectorAll('[data-cell-keyboard-focus="true"]');
88
+ expect(after.length).toBe(1);
89
+ expect(after[0]).not.toBe(focusedCells[0]);
90
+
91
+ const focusedRows = container.querySelectorAll('[data-row-keyboard-focus="true"]');
92
+ expect(focusedRows.length).toBe(0);
93
+ });
94
+
95
+ it("list layout selected row uses the same fill channel", () => {
96
+ const { container } = renderWithProviders(
97
+ <DataTable
98
+ data={sampleData}
99
+ columns={columns as DataTableColumn<Record<string, any>>[]}
100
+ layout="list"
101
+ enableRowSelection
102
+ enablePagination={false}
103
+ enableGlobalSearch={false}
104
+ enableFiltering={false}
105
+ onStateChange={vi.fn()}
106
+ />,
107
+ );
108
+ fireEvent.click(screen.getByRole("checkbox", { name: "Select row Alice" }));
109
+ const selected = container.querySelectorAll(
110
+ '[data-testid="data-table-list-row"][data-row-selected="true"]',
111
+ );
112
+ expect(selected.length).toBe(1);
113
+ expect(
114
+ container.querySelectorAll('[data-testid="data-table-list-row"][data-row-selected="false"]')
115
+ .length,
116
+ ).toBe(2);
117
+ });
118
+ });
@@ -0,0 +1,38 @@
1
+ /**
2
+ * LC-71 RING-ANATOMY for table rows and cells.
3
+ *
4
+ * Two channels, never shared: selected = fill; keyboard focus = one inset
5
+ * ring on the perceived control (the row when the row is the tab stop, the
6
+ * cell when Excel-mode keyboard nav is on the cell).
7
+ */
8
+
9
+ import { ensureFocusVisibleRing, keyboardFocusRingProps } from "@multiplatform.one/theme";
10
+
11
+ export const tableRowFocusVisibleStyle = ensureFocusVisibleRing({ outlineOffset: -2 });
12
+
13
+ export function tableRowStateProps(opts: {
14
+ selected?: boolean;
15
+ keyboardFocused?: boolean;
16
+ zebraOn?: boolean;
17
+ index?: number;
18
+ }): Record<string, unknown> {
19
+ const selected = Boolean(opts.selected);
20
+ const keyboardFocused = Boolean(opts.keyboardFocused);
21
+ const zebra = Boolean(opts.zebraOn) && (opts.index ?? 0) % 2 === 1;
22
+ const rest = zebra ? "$color2" : "$color1";
23
+ return {
24
+ backgroundColor: selected ? "$color4" : rest,
25
+ hoverStyle: { backgroundColor: selected ? "$color4" : "$color3" },
26
+ ...(keyboardFocused ? keyboardFocusRingProps : {}),
27
+ "aria-selected": selected ? true : undefined,
28
+ "data-row-selected": selected ? "true" : "false",
29
+ "data-row-keyboard-focus": keyboardFocused ? "true" : "false",
30
+ };
31
+ }
32
+
33
+ export function tableCellKeyboardProps(focused: boolean): Record<string, unknown> {
34
+ return {
35
+ ...(focused ? keyboardFocusRingProps : {}),
36
+ "data-cell-keyboard-focus": focused ? "true" : "false",
37
+ };
38
+ }
@@ -33,6 +33,7 @@ export function CellModalEditor({
33
33
  onCommit,
34
34
  children,
35
35
  title,
36
+ label,
36
37
  }: CellModalEditorProps) {
37
38
  const { knobProps } = useResolvedKnobs();
38
39
  const [open, setOpen] = useState(false);
@@ -95,6 +96,9 @@ export function CellModalEditor({
95
96
  paddingHorizontal="$1"
96
97
  paddingVertical="$1"
97
98
  borderRadius="$2"
99
+ {...(label
100
+ ? { accessibilityLabel: label, accessibilityRole: "button" as const }
101
+ : undefined)}
98
102
  >
99
103
  <FieldDisplay field={field} value={value} fieldProps={fieldProps} />
100
104
  </View>
@@ -17,7 +17,7 @@ import { FieldDisplay, type FieldDisplayType } from "@multiplatform.one/forms";
17
17
  import { TableCellContext } from "@multiplatform.one/table-primitives";
18
18
  import { useResolvedKnobs } from "@multiplatform.one/theme";
19
19
  import { useCallback, useRef, useState, type ReactNode } from "react";
20
- import { Button, Dialog, Text, View, XStack, YStack } from "tamagui";
20
+ import { Button, Dialog, Text, View, XStack, YStack, isWeb } from "tamagui";
21
21
  import { t } from "../../shared/t";
22
22
 
23
23
  export interface CellModalEditorProps {
@@ -36,6 +36,11 @@ export interface CellModalEditorProps {
36
36
  children: (draftValue: any, onDraftChange: (value: any) => void) => ReactNode;
37
37
  /** Title shown in the modal header. */
38
38
  title?: string;
39
+ /**
40
+ * Accessible name for the chromeless cell trigger (column header).
41
+ * Chromeless faces have no field label, so the trigger announces this.
42
+ */
43
+ label?: string;
39
44
  }
40
45
 
41
46
  export function CellModalEditor({
@@ -47,6 +52,7 @@ export function CellModalEditor({
47
52
  onCommit,
48
53
  children,
49
54
  title,
55
+ label,
50
56
  }: CellModalEditorProps) {
51
57
  const { knobProps } = useResolvedKnobs();
52
58
  const [open, setOpen] = useState(false);
@@ -101,11 +107,20 @@ export function CellModalEditor({
101
107
  setDraft(draftRef.current);
102
108
  }, []);
103
109
 
110
+ const triggerLocked = disabled || readOnly;
111
+ const handleTriggerKeyDown = (event: { key?: string; preventDefault?: () => void }) => {
112
+ if (triggerLocked) return;
113
+ if (event.key === "Enter" || event.key === " ") {
114
+ event.preventDefault?.();
115
+ handleOpen();
116
+ }
117
+ };
118
+
104
119
  return (
105
120
  <>
106
121
  <View
107
122
  onPress={handleOpen}
108
- cursor={disabled || readOnly ? "default" : "pointer"}
123
+ cursor={triggerLocked ? "default" : "pointer"}
109
124
  opacity={disabled ? 0.5 : 1}
110
125
  flexDirection="row"
111
126
  alignItems="center"
@@ -113,7 +128,20 @@ export function CellModalEditor({
113
128
  paddingHorizontal="$1"
114
129
  paddingVertical="$1"
115
130
  borderRadius="$2"
116
- hoverStyle={!disabled && !readOnly ? { backgroundColor: "$backgroundHover" } : undefined}
131
+ hoverStyle={!triggerLocked ? { backgroundColor: "$backgroundHover" } : undefined}
132
+ // LC-71: parent CellWrapper paints the one ring on the cell boundary.
133
+ outlineWidth={0}
134
+ focusVisibleStyle={{ outlineWidth: 0 }}
135
+ {...(isWeb && !triggerLocked
136
+ ? {
137
+ role: "button" as const,
138
+ tabIndex: 0,
139
+ "aria-label": label,
140
+ "aria-haspopup": "dialog" as const,
141
+ "aria-expanded": open,
142
+ onKeyDown: handleTriggerKeyDown,
143
+ }
144
+ : undefined)}
117
145
  >
118
146
  <FieldDisplay field={field} value={value} fieldProps={fieldProps} />
119
147
  </View>