@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
@@ -54,6 +54,15 @@ describe("DataTableToolbar", () => {
54
54
  expect(searchInput).toBeDefined();
55
55
  });
56
56
 
57
+ it("shows a toolbar spinner while isFetching without hiding search", () => {
58
+ const { container, getByRole } = renderWithProviders(
59
+ <DataTableToolbar {...defaultProps} isFetching />,
60
+ );
61
+
62
+ expect(getByRole("searchbox")).toBeDefined();
63
+ expect(container.querySelector("[data-table-fetching='true']")).toBeTruthy();
64
+ });
65
+
57
66
  it("should not render search input when enableGlobalSearch is false", () => {
58
67
  const { container } = renderWithProviders(
59
68
  <DataTableToolbar {...defaultProps} enableGlobalSearch={false} />,
@@ -191,45 +200,60 @@ describe("DataTableToolbar", () => {
191
200
 
192
201
  describe("views functionality", () => {
193
202
  it("should not render view selector when enableViews is false", () => {
194
- const { container } = renderWithProviders(
203
+ const { queryByRole } = renderWithProviders(
195
204
  <DataTableToolbar {...defaultProps} enableViews={false} />,
196
205
  );
197
206
 
198
- expect(container).toBeDefined();
207
+ expect(queryByRole("button", { name: "Saved views" })).toBeNull();
208
+ expect(queryByRole("button", { name: "Save view" })).toBeNull();
199
209
  });
200
210
 
201
211
  it("should render view selector when enableViews is true", () => {
202
- const { container } = renderWithProviders(
212
+ const { getByRole } = renderWithProviders(
203
213
  <DataTableToolbar {...defaultProps} enableViews={true} views={sampleViews} />,
204
214
  );
205
215
 
206
- expect(container).toBeDefined();
216
+ expect(getByRole("button", { name: "Saved views" })).toBeDefined();
207
217
  });
208
218
 
209
- it("should display available views", () => {
210
- const { container } = renderWithProviders(
211
- <DataTableToolbar {...defaultProps} enableViews={true} views={sampleViews} />,
219
+ it("should display the active view name on the picker", () => {
220
+ const { getByRole } = renderWithProviders(
221
+ <DataTableToolbar
222
+ {...defaultProps}
223
+ enableViews={true}
224
+ views={sampleViews}
225
+ activeViewId="view1"
226
+ />,
212
227
  );
213
228
 
214
- expect(container).toBeDefined();
229
+ expect(getByRole("button", { name: "Saved views" }).textContent).toContain("Default View");
215
230
  });
216
231
 
217
- it("should call onLoadView when a view is selected", () => {
232
+ it("should call onLoadView when a view is selected", async () => {
218
233
  const onLoadView = vi.fn();
219
- const { container } = renderWithProviders(
234
+ const { getByRole, getAllByRole } = renderWithProviders(
220
235
  <DataTableToolbar
221
236
  {...defaultProps}
222
237
  enableViews={true}
223
238
  views={sampleViews}
239
+ activeViewId="view1"
224
240
  onLoadView={onLoadView}
225
241
  />,
226
242
  );
227
243
 
228
- expect(container).toBeDefined();
244
+ fireEvent.click(getByRole("button", { name: "Saved views" }));
245
+ await waitFor(
246
+ () => {
247
+ expect(getAllByRole("menuitemcheckbox").length).toBeGreaterThan(0);
248
+ },
249
+ { timeout: 3000 },
250
+ );
251
+ fireEvent.click(getAllByRole("menuitemcheckbox")[1]);
252
+ expect(onLoadView).toHaveBeenCalledWith("view2");
229
253
  });
230
254
 
231
255
  it("should highlight active view", () => {
232
- const { container } = renderWithProviders(
256
+ const { getByRole } = renderWithProviders(
233
257
  <DataTableToolbar
234
258
  {...defaultProps}
235
259
  enableViews={true}
@@ -238,24 +262,30 @@ describe("DataTableToolbar", () => {
238
262
  />,
239
263
  );
240
264
 
241
- expect(container).toBeDefined();
265
+ expect(getByRole("button", { name: "Saved views" }).textContent).toContain("Default View");
242
266
  });
243
267
 
244
268
  it("should show save view dialog", () => {
245
- const { container } = renderWithProviders(
269
+ const { getByRole } = renderWithProviders(
246
270
  <DataTableToolbar {...defaultProps} enableViews={true} views={sampleViews} />,
247
271
  );
248
272
 
249
- expect(container).toBeDefined();
273
+ expect(getByRole("button", { name: "Save view" })).toBeDefined();
250
274
  });
251
275
 
252
- it("should call onSaveView when saving a new view", () => {
276
+ it("should call onSaveView when saving a new view", async () => {
253
277
  const onSaveView = vi.fn();
254
- const { container } = renderWithProviders(
278
+ const { getByRole } = renderWithProviders(
255
279
  <DataTableToolbar {...defaultProps} enableViews={true} onSaveView={onSaveView} />,
256
280
  );
257
281
 
258
- expect(container).toBeDefined();
282
+ fireEvent.click(getByRole("button", { name: "Save view" }));
283
+ const nameField = await waitFor(() => getByRole("textbox", { name: "View name" }), {
284
+ timeout: 3000,
285
+ });
286
+ fireEvent.change(nameField, { target: { value: "My view" } });
287
+ fireEvent.click(getByRole("button", { name: "Save" }));
288
+ expect(onSaveView).toHaveBeenCalledWith("My view");
259
289
  });
260
290
  });
261
291
 
@@ -2,7 +2,7 @@ import { action } from "@multiplatform.one/storybook";
2
2
  import type { Meta } from "@storybook/react-native-web-vite";
3
3
  import { useState } from "react";
4
4
  import { Button } from "@multiplatform.one/forms";
5
- import { Text, XStack, YStack } from "tamagui";
5
+ import { XStack, YStack } from "tamagui";
6
6
  import type { DataTableColumn, TableView } from "../../types";
7
7
  import { DataTable } from "../DataTable";
8
8
  import { DataTableToolbar } from "./index";
@@ -12,12 +12,6 @@ const meta: Meta<typeof DataTableToolbar> = {
12
12
  component: DataTableToolbar,
13
13
  parameters: {
14
14
  status: { type: "stable" },
15
- docs: {
16
- description: {
17
- component:
18
- "The DataTableToolbar integrates with DataTable to provide search, filters, and view options. It consumes DataTableStateContext when mounted inside a DataTable (compound pattern) or can be driven standalone through explicit props.",
19
- },
20
- },
21
15
  },
22
16
  };
23
17
 
@@ -68,21 +62,14 @@ const sampleViews: TableView[] = [
68
62
  },
69
63
  ];
70
64
 
71
- /**
72
- * Full toolbar mounted over a live DataTable: typing in the search box
73
- * filters the rows below, the save-view popover persists views into the
74
- * table state, and the custom actions slot carries an Export button.
75
- */
76
65
  const MainStory = () => {
77
66
  return (
78
- <YStack padding="$4" gap="$3">
67
+ <YStack padding="$4">
79
68
  <DataTable
80
69
  data={employees}
81
70
  columns={employeeColumns}
82
71
  enableGlobalSearch
83
72
  enableViews
84
- // Rest mid-page so the footer nav renders live — single-page rest
85
- // bare-disables prev/next and trips the `[theme]` guardrail (UX-P19).
86
73
  initialState={{ pagination: { pageIndex: 1, pageSize: 3 } }}
87
74
  renderToolbar={(props) => (
88
75
  <DataTableToolbar
@@ -104,32 +91,17 @@ const MainStory = () => {
104
91
  export const Default = {
105
92
  name: "Main",
106
93
  render: () => <MainStory />,
107
- parameters: {
108
- docs: {
109
- description: {
110
- story:
111
- "Toolbar wired into a DataTable through renderToolbar: global search filters rows live, views can be saved from the popover, and customActions adds an Export button.",
112
- },
113
- },
114
- },
115
94
  };
116
95
 
117
- /**
118
- * Default anatomy when used standalone: just the global search section,
119
- * controlled through explicit props (no DataTable context required).
120
- */
121
96
  const SearchOnlyStory = () => {
122
97
  const [search, setSearch] = useState("");
123
98
  return (
124
- <YStack padding="$4" gap="$3" maxWidth={560}>
99
+ <YStack padding="$4" maxWidth={560}>
125
100
  <DataTableToolbar
126
101
  globalFilter={search}
127
102
  onGlobalFilterChange={setSearch}
128
103
  onClearFilters={() => setSearch("")}
129
104
  />
130
- <Text fontSize="$2" color="$color10">
131
- {search ? `Searching for "${search}"` : "Type to search — value is controlled by the story"}
132
- </Text>
133
105
  </YStack>
134
106
  );
135
107
  };
@@ -138,17 +110,12 @@ export const SearchOnly = {
138
110
  render: () => <SearchOnlyStory />,
139
111
  };
140
112
 
141
- /**
142
- * Views section enabled: floppy-disk button opens the save-view popover,
143
- * saved views append to the list, and the active view indicator shows the
144
- * currently loaded view.
145
- */
146
113
  const WithViewsStory = () => {
147
114
  const [search, setSearch] = useState("");
148
115
  const [views, setViews] = useState<TableView[]>(sampleViews);
149
116
  const [activeViewId, setActiveViewId] = useState("view-engineering");
150
117
  return (
151
- <YStack padding="$4" gap="$3" maxWidth={640}>
118
+ <YStack padding="$4" maxWidth={640}>
152
119
  <DataTableToolbar
153
120
  globalFilter={search}
154
121
  onGlobalFilterChange={setSearch}
@@ -177,9 +144,6 @@ const WithViewsStory = () => {
177
144
  action("load-view")(viewId);
178
145
  }}
179
146
  />
180
- <Text fontSize="$2" color="$color10">
181
- Saved views: {views.map((view) => view.name).join(", ")}
182
- </Text>
183
147
  </YStack>
184
148
  );
185
149
  };
@@ -188,14 +152,10 @@ export const WithViews = {
188
152
  render: () => <WithViewsStory />,
189
153
  };
190
154
 
191
- /**
192
- * The customActions slot renders inside the roving-focus action section on
193
- * the right, separated from search by the toolbar divider.
194
- */
195
155
  const WithCustomActionsStory = () => {
196
156
  const [search, setSearch] = useState("");
197
157
  return (
198
- <YStack padding="$4" gap="$3" maxWidth={640}>
158
+ <YStack padding="$4" maxWidth={640}>
199
159
  <DataTableToolbar
200
160
  globalFilter={search}
201
161
  onGlobalFilterChange={setSearch}
@@ -1,10 +1,12 @@
1
- import { EyeIcon, FloppyDiskIcon } from "@phosphor-icons/react";
2
- import { ensureFocusVisibleRing, useResolvedKnobs } from "@multiplatform.one/theme";
1
+ import { CaretDownIcon, FloppyDiskIcon } from "@phosphor-icons/react";
2
+ import { DropdownMenu } from "@multiplatform.one/components";
3
+ import { Button, Input, SearchInput, Spinner } from "@multiplatform.one/forms";
4
+ import { hairline, sizeRecipeForToken, useResolvedKnobs } from "@multiplatform.one/theme";
3
5
  import { RovingFocusGroup } from "@tamagui/roving-focus";
4
6
  import type React from "react";
5
7
  import { useState } from "react";
6
- import { Button, Input, SearchInput } from "@multiplatform.one/forms";
7
- import { Popover, Text, View, XStack, YStack, styled } from "tamagui";
8
+ import { Popover, XStack, YStack } from "tamagui";
9
+ import { t } from "../../shared/t";
8
10
  import type { TableView } from "../../types";
9
11
  import { useDataTableState } from "../DataTable/DataTableStateContext";
10
12
  import { DataTableFilterButton } from "../DataTableFilterButton";
@@ -34,30 +36,27 @@ export interface DataTableToolbarProps {
34
36
  showFilterCount?: boolean;
35
37
  showViewSelector?: boolean;
36
38
  customActions?: React.ReactNode;
39
+ /** Subtle refetch indicator — must not unmount the table body. */
40
+ isFetching?: boolean;
37
41
 
38
42
  // Sizing
39
43
  size?: string;
40
44
  compact?: boolean;
41
45
  }
42
46
 
43
- // Toolbar separator
44
- const ToolbarDividerFrame = styled(View, {
45
- name: "DataTableToolbarDividerFrame",
46
- width: 1,
47
- alignSelf: "stretch",
48
- backgroundColor: "$color6",
49
- });
47
+ // Toolbar glyphs are control-internal icons (LC-75/LC-79): the generated
48
+ // recipe's icon channel — no handwritten per-token px map.
49
+ const iconSizeForToken = (token: string): number => sizeRecipeForToken(token).iconSize;
50
50
 
51
51
  export function DataTableToolbar(props: DataTableToolbarProps) {
52
- // Try to consume from DataTableStateContext (compound component pattern)
53
52
  const ctx = useDataTableState();
54
53
 
55
- // Resolve values: explicit props override context values
56
54
  const globalFilter = props.globalFilter ?? ctx?.state.globalFilter ?? "";
57
55
  const onGlobalFilterChange =
58
56
  props.onGlobalFilterChange ?? ctx?.actions.setGlobalFilter ?? (() => {});
59
57
  const onClearFilters = props.onClearFilters ?? ctx?.actions.clearFilters ?? (() => {});
60
58
  const onSaveView = props.onSaveView ?? ctx?.actions.saveView ?? (() => {});
59
+ const onLoadView = props.onLoadView ?? ctx?.actions.loadView ?? (() => {});
61
60
  const views = props.views ?? ctx?.state.views ?? [];
62
61
  const activeViewId = props.activeViewId ?? ctx?.state.activeViewId;
63
62
 
@@ -70,7 +69,9 @@ export function DataTableToolbar(props: DataTableToolbarProps) {
70
69
  customActions,
71
70
  size,
72
71
  compact: _compact = true,
72
+ isFetching: isFetchingProp,
73
73
  } = props;
74
+ const isFetching = isFetchingProp ?? ctx?.state.isFetching ?? false;
74
75
 
75
76
  // Toolbar Filter surface (hidden-column filtering). Needs the compound
76
77
  // context — DataTableFilterButton reads fields/actions from it.
@@ -91,139 +92,167 @@ export function DataTableToolbar(props: DataTableToolbarProps) {
91
92
  };
92
93
 
93
94
  const { knobProps } = useResolvedKnobs({ size, compact: true });
95
+ const sz = knobProps.sizeToken;
96
+ const iconPx = iconSizeForToken(String(sz));
97
+ const searchMaxWidth = sz === "$3" ? 280 : sz === "$5" ? 400 : 320;
98
+ const controlSize = "$2" as const;
99
+ const searchSize = "$3" as const;
100
+
101
+ const showViewPicker = enableViews && showViewSelector && views.length > 0;
102
+ const showSave = enableViews && showViewSelector;
103
+ const showActionCluster = Boolean(
104
+ customActions || showFilterButton || showViewPicker || showSave,
105
+ );
106
+ const hasTrailing = showActionCluster || isFetching;
94
107
 
95
108
  return (
96
109
  <XStack
97
- alignItems="stretch"
98
- backgroundColor="$color3"
99
- borderWidth={1}
100
- borderBottomWidth={0}
101
- borderColor="$color6"
102
- borderTopLeftRadius={knobProps.borderRadius.borderRadius}
103
- borderTopRightRadius={knobProps.borderRadius.borderRadius}
104
- overflow="hidden"
110
+ alignItems="center"
111
+ // LC-39: flush band — no painted panel, so no horizontal inset.
112
+ paddingVertical={knobProps.panelPadding.padding}
113
+ paddingHorizontal={0}
114
+ {...knobProps.gap}
115
+ {...hairline.bottom}
116
+ borderColor="$borderColor"
117
+ flexWrap="nowrap"
118
+ justifyContent={enableGlobalSearch && hasTrailing ? "space-between" : "flex-start"}
105
119
  role="toolbar"
106
- aria-label="Table toolbar"
120
+ aria-label={t("Table toolbar")}
121
+ aria-busy={isFetching || undefined}
107
122
  >
108
- {/* Search Section - fills available space. Consumes the catalog
109
- SearchInput (census item 6) instead of re-composing the
110
- icon + field + clear anatomy locally. */}
111
123
  {enableGlobalSearch && (
112
- <XStack flex={1} alignItems="center" paddingHorizontal="$2" paddingVertical="$2">
113
- <View flex={1}>
114
- <SearchInput
115
- value={globalFilter}
116
- onChange={onGlobalFilterChange}
117
- // Clear-X semantics follow filter ownership: when the toolbar
118
- // owns a filter surface (enableFiltering) the X clears search
119
- // AND filters (explicit clear intent). When the filter chrome
120
- // is suppressed (enableFiltering=false — an outer surface owns
121
- // filtering and injects tuples via initialState/state), the X
122
- // must not mutate those injected filters; SearchInput already
123
- // clears the text through onChange("").
124
- onClear={enableFiltering ? onClearFilters : undefined}
125
- aria-label="Search table data"
126
- compact
127
- size="$3"
128
- />
129
- </View>
124
+ <XStack flex={1} minWidth={160} maxWidth={searchMaxWidth} flexShrink={1}>
125
+ <SearchInput
126
+ value={globalFilter}
127
+ onChange={onGlobalFilterChange}
128
+ // Clear-X semantics follow filter ownership: when the toolbar
129
+ // owns a filter surface (enableFiltering) the X clears search
130
+ // AND filters (explicit clear intent). When the filter chrome
131
+ // is suppressed (enableFiltering=false — an outer surface owns
132
+ // filtering and injects tuples via initialState/state), the X
133
+ // must not mutate those injected filters; SearchInput already
134
+ // clears the text through onChange("").
135
+ onClear={enableFiltering ? onClearFilters : undefined}
136
+ placeholder={t("Search")}
137
+ aria-label={t("Search table data")}
138
+ compact
139
+ size={searchSize}
140
+ />
130
141
  </XStack>
131
142
  )}
132
143
 
133
- {/* Right Section - Actions with roving focus for keyboard navigation */}
134
- {(customActions || enableViews || showFilterButton) && (
135
- <>
136
- <ToolbarDividerFrame />
137
- <RovingFocusGroup orientation="horizontal" loop asChild>
138
- <XStack
139
- alignItems="center"
140
- paddingHorizontal="$2"
141
- gap="$1"
142
- // DG-A11Y-01: the roving group container is a focusable tab
143
- // entry point that forwards focus to its current item — paint
144
- // the ring synchronously while focus is WITHIN (CellWrapper
145
- // focusWithin pattern) and on its own :focus.
146
- focusStyle={ensureFocusVisibleRing()}
147
- focusVisibleStyle={ensureFocusVisibleRing()}
148
- focusWithinStyle={ensureFocusVisibleRing()}
149
- >
150
- {/* Filter surface — filters any field, incl. hidden columns */}
151
- {showFilterButton && <DataTableFilterButton />}
152
-
153
- {/* Custom Actions */}
154
- {customActions}
155
-
156
- {/* View Management */}
157
- {enableViews && showViewSelector && (
158
- <>
159
- {/* Save View Button. The roving item must wrap the Button
160
- (not the Popover): RovingFocusGroup collects item refs as
161
- focus candidates and calls `.focus()` on them — Popover's
162
- ref is its imperative handle, not an element, which threw
163
- `candidate.focus is not a function` on arrow-key nav. */}
144
+ {hasTrailing && (
145
+ <XStack
146
+ alignItems="center"
147
+ {...knobProps.gap}
148
+ flexShrink={0}
149
+ marginInlineStart={enableGlobalSearch ? "auto" : 0}
150
+ >
151
+ {showActionCluster && (
152
+ <RovingFocusGroup orientation="horizontal" loop asChild>
153
+ <XStack alignItems="center" {...knobProps.gap}>
154
+ {showFilterButton && <DataTableFilterButton />}
155
+
156
+ {customActions}
157
+
158
+ {showViewPicker && (
159
+ <DropdownMenu closeOnSelect placement="bottom-end">
160
+ <DropdownMenu.Trigger asChild>
161
+ <RovingFocusGroup.Item focusable asChild>
162
+ <Button
163
+ chromeless
164
+ size={controlSize}
165
+ iconAfter={<CaretDownIcon size={iconPx} />}
166
+ aria-label={t("Saved views")}
167
+ aria-haspopup="menu"
168
+ >
169
+ {activeView?.name ?? t("Views")}
170
+ </Button>
171
+ </RovingFocusGroup.Item>
172
+ </DropdownMenu.Trigger>
173
+ <DropdownMenu.Content>
174
+ {views.map((view) => (
175
+ <DropdownMenu.CheckboxItem
176
+ key={view.id}
177
+ checked={view.id === activeViewId}
178
+ closeOnSelect
179
+ onSelect={() => onLoadView(view.id)}
180
+ >
181
+ {view.name}
182
+ </DropdownMenu.CheckboxItem>
183
+ ))}
184
+ </DropdownMenu.Content>
185
+ </DropdownMenu>
186
+ )}
187
+
188
+ {showSave && (
164
189
  <Popover open={showSaveViewDialog} onOpenChange={setShowSaveViewDialog}>
165
190
  <Popover.Trigger asChild>
166
191
  <RovingFocusGroup.Item focusable asChild>
167
192
  <Button
168
193
  chromeless
169
- size="$2"
170
- icon={<FloppyDiskIcon size={16} />}
171
- aria-label="Save view"
172
- focusStyle={{ outlineColor: "$accentBackground", outlineWidth: 2 }}
194
+ size={controlSize}
195
+ icon={<FloppyDiskIcon size={iconPx} />}
196
+ aria-label={t("Save view")}
173
197
  />
174
198
  </RovingFocusGroup.Item>
175
199
  </Popover.Trigger>
176
200
  <Popover.Content
201
+ {...knobProps.elevatedSurface}
177
202
  {...knobProps.borderRadius}
178
203
  borderColor="$color6"
204
+ // LC-24: enter/exitStyle need a `transition` driver on the
205
+ // same element ({...string} spread set nothing).
179
206
  transition={knobProps.transition}
180
207
  enterStyle={{ x: 0, y: -10, opacity: 0 }}
181
208
  exitStyle={{ x: 0, y: -10, opacity: 0 }}
209
+ data-dismiss-class="compose"
182
210
  >
183
- <YStack {...knobProps.gap} {...knobProps.panelPadding} minWidth={250}>
184
- <Text fontWeight="600">Save Current View</Text>
211
+ <YStack {...knobProps.gap} {...knobProps.panelPadding} minWidth={240}>
185
212
  <Input
186
- placeholder="Enter view name..."
213
+ placeholder={t("View name")}
187
214
  value={newViewName}
188
215
  onChangeText={setNewViewName}
189
- size="$3"
216
+ size={searchSize}
190
217
  compact
191
218
  inputProps={{
219
+ "aria-label": t("View name"),
192
220
  onKeyDown: (e: React.KeyboardEvent) => {
193
221
  if (e.key === "Enter") handleSaveView();
194
222
  },
195
223
  }}
196
224
  />
197
- <XStack gap="$2" justifyContent="flex-end">
225
+ <XStack {...knobProps.gap} justifyContent="flex-end">
198
226
  <Button
199
227
  size="$2"
200
228
  variant="outlined"
201
229
  onPress={() => setShowSaveViewDialog(false)}
202
230
  >
203
- Cancel
231
+ {t("Cancel")}
204
232
  </Button>
205
- <Button size="$2" onPress={handleSaveView} disabled={!newViewName.trim()}>
206
- Save
233
+ <Button
234
+ size="$2"
235
+ onPress={handleSaveView}
236
+ disabled={!newViewName.trim()}
237
+ disabledReason={t("Enter a view name")}
238
+ >
239
+ {t("Save")}
207
240
  </Button>
208
241
  </XStack>
209
242
  </YStack>
210
243
  </Popover.Content>
211
244
  </Popover>
245
+ )}
246
+ </XStack>
247
+ </RovingFocusGroup>
248
+ )}
212
249
 
213
- {/* Active View Indicator */}
214
- {activeView && (
215
- <XStack alignItems="center" gap="$1" paddingHorizontal="$2">
216
- <EyeIcon size={14} />
217
- <Text fontSize="$2" color="$color10">
218
- {activeView.name}
219
- </Text>
220
- </XStack>
221
- )}
222
- </>
223
- )}
250
+ {isFetching && (
251
+ <XStack alignItems="center" aria-live="polite" data-table-fetching="true">
252
+ <Spinner size="small" />
224
253
  </XStack>
225
- </RovingFocusGroup>
226
- </>
254
+ )}
255
+ </XStack>
227
256
  )}
228
257
  </XStack>
229
258
  );
@@ -5,7 +5,7 @@ import {
5
5
  FloppyDiskIcon,
6
6
  GearIcon,
7
7
  } from "@phosphor-icons/react";
8
- import { useResolvedKnobs } from "@multiplatform.one/theme";
8
+ import { getGroupPosition, stackRadiusProps, useResolvedKnobs } from "@multiplatform.one/theme";
9
9
  import React, { useState } from "react";
10
10
  import { Button, Input, Slider, Switch } from "@multiplatform.one/forms";
11
11
  import { DropdownMenu } from "@multiplatform.one/components";
@@ -469,28 +469,35 @@ function ViewManagementSection({
469
469
 
470
470
  {/* Saved Views List */}
471
471
  {views.length > 0 && (
472
- <YStack gap="$1">
473
- {views.map((view) => (
474
- <XStack
475
- key={view.id}
476
- alignItems="center"
477
- justifyContent="space-between"
478
- padding="$2"
479
- backgroundColor={activeViewId === view.id ? "$color2" : "transparent"}
480
- borderRadius="$2"
481
- hoverStyle={{ backgroundColor: "$color1" }}
482
- >
483
- <Text fontSize="$3">{view.name}</Text>
484
- <Button
485
- size="$2"
486
- variant="outlined"
487
- onPress={() => onLoadView(view.id)}
488
- disabled={activeViewId === view.id}
472
+ <YStack>
473
+ {views.map((view, index) => {
474
+ const corners = stackRadiusProps(
475
+ getGroupPosition(index, views.length),
476
+ knobProps.borderRadius.borderRadius,
477
+ );
478
+ return (
479
+ <XStack
480
+ key={view.id}
481
+ alignItems="center"
482
+ justifyContent="space-between"
483
+ padding="$2"
484
+ overflow="hidden"
485
+ {...corners}
486
+ backgroundColor={activeViewId === view.id ? "$color2" : "transparent"}
487
+ hoverStyle={{ backgroundColor: "$color1", ...corners }}
489
488
  >
490
- {t("Load")}
491
- </Button>
492
- </XStack>
493
- ))}
489
+ <Text fontSize="$3">{view.name}</Text>
490
+ <Button
491
+ size="$2"
492
+ variant="outlined"
493
+ onPress={() => onLoadView(view.id)}
494
+ disabled={activeViewId === view.id}
495
+ >
496
+ {t("Load")}
497
+ </Button>
498
+ </XStack>
499
+ );
500
+ })}
494
501
  </YStack>
495
502
  )}
496
503
  </YStack>