@multiplatform.one/table 6.7.0 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. package/README.md +4 -3
  2. package/dist/cjs/components/ChildTable/index.cjs +2 -1
  3. package/dist/cjs/components/ChildTable/index.native.js +2 -1
  4. package/dist/cjs/components/ChildTable/index.native.js.map +1 -1
  5. package/dist/cjs/components/ColumnHeaderFilter/index.cjs +17 -9
  6. package/dist/cjs/components/ColumnHeaderFilter/index.native.js +32 -11
  7. package/dist/cjs/components/ColumnHeaderFilter/index.native.js.map +1 -1
  8. package/dist/cjs/components/DataTable/DataTableDocumentList.cjs +222 -0
  9. package/dist/cjs/components/DataTable/DataTableDocumentList.native.js +237 -0
  10. package/dist/cjs/components/DataTable/DataTableDocumentList.native.js.map +1 -0
  11. package/dist/cjs/components/DataTable/DataTableMobileCards.cjs +5 -2
  12. package/dist/cjs/components/DataTable/DataTableMobileCards.native.js +6 -2
  13. package/dist/cjs/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  14. package/dist/cjs/components/DataTable/DataTableRoot.cjs +92 -41
  15. package/dist/cjs/components/DataTable/DataTableRoot.native.js +97 -43
  16. package/dist/cjs/components/DataTable/DataTableRoot.native.js.map +1 -1
  17. package/dist/cjs/components/DataTable/DataTableVirtualized.cjs +8 -2
  18. package/dist/cjs/components/DataTable/DataTableVirtualized.native.js +9 -3
  19. package/dist/cjs/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  20. package/dist/cjs/components/DataTable/documentListSlots.cjs +59 -0
  21. package/dist/cjs/components/DataTable/documentListSlots.native.js +85 -0
  22. package/dist/cjs/components/DataTable/documentListSlots.native.js.map +1 -0
  23. package/dist/cjs/components/DataTable/index.native.js +74 -59
  24. package/dist/cjs/components/DataTable/index.native.js.map +1 -1
  25. package/dist/cjs/components/DataTable/rowStateChrome.cjs +55 -0
  26. package/dist/cjs/components/DataTable/rowStateChrome.native.js +59 -0
  27. package/dist/cjs/components/DataTable/rowStateChrome.native.js.map +1 -0
  28. package/dist/cjs/components/DataTableCell/CellModalEditor.cjs +24 -3
  29. package/dist/cjs/components/DataTableCell/CellModalEditor.native.js +6 -1
  30. package/dist/cjs/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  31. package/dist/cjs/components/DataTableCell/CellOptionsEditor.cjs +9 -2
  32. package/dist/cjs/components/DataTableCell/CellOptionsEditor.native.js +11 -2
  33. package/dist/cjs/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  34. package/dist/cjs/components/DataTableCell/index.cjs +74 -63
  35. package/dist/cjs/components/DataTableCell/index.native.js +94 -82
  36. package/dist/cjs/components/DataTableCell/index.native.js.map +1 -1
  37. package/dist/cjs/components/DataTableColumnPinning/index.cjs +54 -37
  38. package/dist/cjs/components/DataTableColumnPinning/index.native.js +59 -38
  39. package/dist/cjs/components/DataTableColumnPinning/index.native.js.map +1 -1
  40. package/dist/cjs/components/DataTableDateFilter/index.cjs +33 -14
  41. package/dist/cjs/components/DataTableDateFilter/index.native.js +33 -12
  42. package/dist/cjs/components/DataTableDateFilter/index.native.js.map +1 -1
  43. package/dist/cjs/components/DataTableExport/index.cjs +35 -7
  44. package/dist/cjs/components/DataTableExport/index.native.js +42 -7
  45. package/dist/cjs/components/DataTableExport/index.native.js.map +1 -1
  46. package/dist/cjs/components/DataTableFacetMenu/index.cjs +140 -0
  47. package/dist/cjs/components/DataTableFacetMenu/index.native.js +156 -0
  48. package/dist/cjs/components/DataTableFacetMenu/index.native.js.map +1 -0
  49. package/dist/cjs/components/DataTableFilterButton/index.cjs +51 -32
  50. package/dist/cjs/components/DataTableFilterButton/index.native.js +63 -40
  51. package/dist/cjs/components/DataTableFilterButton/index.native.js.map +1 -1
  52. package/dist/cjs/components/DataTableFilterChips/FilterChip.cjs +143 -0
  53. package/dist/cjs/components/DataTableFilterChips/FilterChip.native.js +148 -0
  54. package/dist/cjs/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
  55. package/dist/cjs/components/DataTableFilterChips/index.cjs +9 -31
  56. package/dist/cjs/components/DataTableFilterChips/index.native.js +9 -32
  57. package/dist/cjs/components/DataTableFilterChips/index.native.js.map +1 -1
  58. package/dist/cjs/components/DataTableFilters/index.cjs +145 -502
  59. package/dist/cjs/components/DataTableFilters/index.native.js +171 -544
  60. package/dist/cjs/components/DataTableFilters/index.native.js.map +1 -1
  61. package/dist/cjs/components/DataTableGrouping/index.cjs +273 -108
  62. package/dist/cjs/components/DataTableGrouping/index.native.js +310 -157
  63. package/dist/cjs/components/DataTableGrouping/index.native.js.map +1 -1
  64. package/dist/cjs/components/DataTablePagination/index.cjs +147 -95
  65. package/dist/cjs/components/DataTablePagination/index.native.js +159 -106
  66. package/dist/cjs/components/DataTablePagination/index.native.js.map +1 -1
  67. package/dist/cjs/components/DataTableSearch/index.cjs +251 -210
  68. package/dist/cjs/components/DataTableSearch/index.native.js +292 -243
  69. package/dist/cjs/components/DataTableSearch/index.native.js.map +1 -1
  70. package/dist/cjs/components/DataTableToolbar/index.cjs +141 -115
  71. package/dist/cjs/components/DataTableToolbar/index.native.js +163 -148
  72. package/dist/cjs/components/DataTableToolbar/index.native.js.map +1 -1
  73. package/dist/cjs/components/DataTableViewOptions/index.cjs +25 -21
  74. package/dist/cjs/components/DataTableViewOptions/index.native.js +6 -4
  75. package/dist/cjs/components/DataTableViewOptions/index.native.js.map +1 -1
  76. package/dist/cjs/components/SimpleTable/index.cjs +336 -46
  77. package/dist/cjs/components/SimpleTable/index.native.js +356 -48
  78. package/dist/cjs/components/SimpleTable/index.native.js.map +1 -1
  79. package/dist/cjs/components/TableInput/index.cjs +147 -38
  80. package/dist/cjs/components/TableInput/index.native.js +54 -38
  81. package/dist/cjs/components/TableInput/index.native.js.map +1 -1
  82. package/dist/cjs/components/TableInput/shared.cjs +36 -1
  83. package/dist/cjs/components/TableInput/shared.native.js +35 -0
  84. package/dist/cjs/components/TableInput/shared.native.js.map +1 -1
  85. package/dist/cjs/hooks/useDataTable.cjs +33 -2
  86. package/dist/cjs/hooks/useDataTable.native.js +41 -2
  87. package/dist/cjs/hooks/useDataTable.native.js.map +1 -1
  88. package/dist/cjs/hooks/useInfiniteRows.cjs +20 -3
  89. package/dist/cjs/hooks/useInfiniteRows.native.js +20 -3
  90. package/dist/cjs/hooks/useInfiniteRows.native.js.map +1 -1
  91. package/dist/cjs/index.cjs +2 -0
  92. package/dist/cjs/index.native.js +2 -0
  93. package/dist/cjs/index.native.js.map +1 -1
  94. package/dist/cjs/utils/filterUtils.cjs +12 -5
  95. package/dist/cjs/utils/filterUtils.native.js +20 -5
  96. package/dist/cjs/utils/filterUtils.native.js.map +1 -1
  97. package/dist/esm/components/ChildTable/index.mjs +2 -1
  98. package/dist/esm/components/ChildTable/index.mjs.map +1 -1
  99. package/dist/esm/components/ChildTable/index.native.js +2 -1
  100. package/dist/esm/components/ChildTable/index.native.js.map +1 -1
  101. package/dist/esm/components/ColumnHeaderFilter/index.mjs +17 -9
  102. package/dist/esm/components/ColumnHeaderFilter/index.mjs.map +1 -1
  103. package/dist/esm/components/ColumnHeaderFilter/index.native.js +32 -11
  104. package/dist/esm/components/ColumnHeaderFilter/index.native.js.map +1 -1
  105. package/dist/esm/components/DataTable/DataTableDocumentList.mjs +196 -0
  106. package/dist/esm/components/DataTable/DataTableDocumentList.mjs.map +1 -0
  107. package/dist/esm/components/DataTable/DataTableDocumentList.native.js +208 -0
  108. package/dist/esm/components/DataTable/DataTableDocumentList.native.js.map +1 -0
  109. package/dist/esm/components/DataTable/DataTableMobileCards.mjs +5 -2
  110. package/dist/esm/components/DataTable/DataTableMobileCards.mjs.map +1 -1
  111. package/dist/esm/components/DataTable/DataTableMobileCards.native.js +6 -2
  112. package/dist/esm/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  113. package/dist/esm/components/DataTable/DataTableRoot.mjs +93 -42
  114. package/dist/esm/components/DataTable/DataTableRoot.mjs.map +1 -1
  115. package/dist/esm/components/DataTable/DataTableRoot.native.js +98 -44
  116. package/dist/esm/components/DataTable/DataTableRoot.native.js.map +1 -1
  117. package/dist/esm/components/DataTable/DataTableVirtualized.mjs +8 -2
  118. package/dist/esm/components/DataTable/DataTableVirtualized.mjs.map +1 -1
  119. package/dist/esm/components/DataTable/DataTableVirtualized.native.js +9 -3
  120. package/dist/esm/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  121. package/dist/esm/components/DataTable/documentListSlots.mjs +33 -0
  122. package/dist/esm/components/DataTable/documentListSlots.mjs.map +1 -0
  123. package/dist/esm/components/DataTable/documentListSlots.native.js +56 -0
  124. package/dist/esm/components/DataTable/documentListSlots.native.js.map +1 -0
  125. package/dist/esm/components/DataTable/index.native.js +52 -37
  126. package/dist/esm/components/DataTable/index.native.js.map +1 -1
  127. package/dist/esm/components/DataTable/rowStateChrome.mjs +28 -0
  128. package/dist/esm/components/DataTable/rowStateChrome.mjs.map +1 -0
  129. package/dist/esm/components/DataTable/rowStateChrome.native.js +29 -0
  130. package/dist/esm/components/DataTable/rowStateChrome.native.js.map +1 -0
  131. package/dist/esm/components/DataTableCell/CellModalEditor.mjs +25 -4
  132. package/dist/esm/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  133. package/dist/esm/components/DataTableCell/CellModalEditor.native.js +6 -1
  134. package/dist/esm/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  135. package/dist/esm/components/DataTableCell/CellOptionsEditor.mjs +9 -2
  136. package/dist/esm/components/DataTableCell/CellOptionsEditor.mjs.map +1 -1
  137. package/dist/esm/components/DataTableCell/CellOptionsEditor.native.js +11 -2
  138. package/dist/esm/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  139. package/dist/esm/components/DataTableCell/index.mjs +75 -64
  140. package/dist/esm/components/DataTableCell/index.mjs.map +1 -1
  141. package/dist/esm/components/DataTableCell/index.native.js +95 -83
  142. package/dist/esm/components/DataTableCell/index.native.js.map +1 -1
  143. package/dist/esm/components/DataTableColumnPinning/index.mjs +54 -37
  144. package/dist/esm/components/DataTableColumnPinning/index.mjs.map +1 -1
  145. package/dist/esm/components/DataTableColumnPinning/index.native.js +59 -38
  146. package/dist/esm/components/DataTableColumnPinning/index.native.js.map +1 -1
  147. package/dist/esm/components/DataTableDateFilter/index.mjs +34 -15
  148. package/dist/esm/components/DataTableDateFilter/index.mjs.map +1 -1
  149. package/dist/esm/components/DataTableDateFilter/index.native.js +34 -13
  150. package/dist/esm/components/DataTableDateFilter/index.native.js.map +1 -1
  151. package/dist/esm/components/DataTableExport/index.mjs +36 -8
  152. package/dist/esm/components/DataTableExport/index.mjs.map +1 -1
  153. package/dist/esm/components/DataTableExport/index.native.js +43 -8
  154. package/dist/esm/components/DataTableExport/index.native.js.map +1 -1
  155. package/dist/esm/components/DataTableFacetMenu/index.mjs +115 -0
  156. package/dist/esm/components/DataTableFacetMenu/index.mjs.map +1 -0
  157. package/dist/esm/components/DataTableFacetMenu/index.native.js +128 -0
  158. package/dist/esm/components/DataTableFacetMenu/index.native.js.map +1 -0
  159. package/dist/esm/components/DataTableFilterButton/index.mjs +54 -35
  160. package/dist/esm/components/DataTableFilterButton/index.mjs.map +1 -1
  161. package/dist/esm/components/DataTableFilterButton/index.native.js +66 -43
  162. package/dist/esm/components/DataTableFilterButton/index.native.js.map +1 -1
  163. package/dist/esm/components/DataTableFilterChips/FilterChip.mjs +118 -0
  164. package/dist/esm/components/DataTableFilterChips/FilterChip.mjs.map +1 -0
  165. package/dist/esm/components/DataTableFilterChips/FilterChip.native.js +120 -0
  166. package/dist/esm/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
  167. package/dist/esm/components/DataTableFilterChips/index.mjs +9 -32
  168. package/dist/esm/components/DataTableFilterChips/index.mjs.map +1 -1
  169. package/dist/esm/components/DataTableFilterChips/index.native.js +9 -33
  170. package/dist/esm/components/DataTableFilterChips/index.native.js.map +1 -1
  171. package/dist/esm/components/DataTableFilters/index.mjs +149 -506
  172. package/dist/esm/components/DataTableFilters/index.mjs.map +1 -1
  173. package/dist/esm/components/DataTableFilters/index.native.js +175 -548
  174. package/dist/esm/components/DataTableFilters/index.native.js.map +1 -1
  175. package/dist/esm/components/DataTableGrouping/index.mjs +275 -110
  176. package/dist/esm/components/DataTableGrouping/index.mjs.map +1 -1
  177. package/dist/esm/components/DataTableGrouping/index.native.js +287 -134
  178. package/dist/esm/components/DataTableGrouping/index.native.js.map +1 -1
  179. package/dist/esm/components/DataTablePagination/index.mjs +148 -96
  180. package/dist/esm/components/DataTablePagination/index.mjs.map +1 -1
  181. package/dist/esm/components/DataTablePagination/index.native.js +160 -107
  182. package/dist/esm/components/DataTablePagination/index.native.js.map +1 -1
  183. package/dist/esm/components/DataTableSearch/index.mjs +256 -215
  184. package/dist/esm/components/DataTableSearch/index.mjs.map +1 -1
  185. package/dist/esm/components/DataTableSearch/index.native.js +297 -248
  186. package/dist/esm/components/DataTableSearch/index.native.js.map +1 -1
  187. package/dist/esm/components/DataTableToolbar/index.mjs +145 -119
  188. package/dist/esm/components/DataTableToolbar/index.mjs.map +1 -1
  189. package/dist/esm/components/DataTableToolbar/index.native.js +167 -152
  190. package/dist/esm/components/DataTableToolbar/index.native.js.map +1 -1
  191. package/dist/esm/components/DataTableViewOptions/index.mjs +26 -22
  192. package/dist/esm/components/DataTableViewOptions/index.mjs.map +1 -1
  193. package/dist/esm/components/DataTableViewOptions/index.native.js +7 -5
  194. package/dist/esm/components/DataTableViewOptions/index.native.js.map +1 -1
  195. package/dist/esm/components/SimpleTable/index.mjs +338 -48
  196. package/dist/esm/components/SimpleTable/index.mjs.map +1 -1
  197. package/dist/esm/components/SimpleTable/index.native.js +358 -50
  198. package/dist/esm/components/SimpleTable/index.native.js.map +1 -1
  199. package/dist/esm/components/TableInput/index.mjs +150 -41
  200. package/dist/esm/components/TableInput/index.mjs.map +1 -1
  201. package/dist/esm/components/TableInput/index.native.js +55 -39
  202. package/dist/esm/components/TableInput/index.native.js.map +1 -1
  203. package/dist/esm/components/TableInput/shared.mjs +34 -1
  204. package/dist/esm/components/TableInput/shared.mjs.map +1 -1
  205. package/dist/esm/components/TableInput/shared.native.js +34 -1
  206. package/dist/esm/components/TableInput/shared.native.js.map +1 -1
  207. package/dist/esm/hooks/useDataTable.mjs +33 -2
  208. package/dist/esm/hooks/useDataTable.mjs.map +1 -1
  209. package/dist/esm/hooks/useDataTable.native.js +41 -2
  210. package/dist/esm/hooks/useDataTable.native.js.map +1 -1
  211. package/dist/esm/hooks/useInfiniteRows.mjs +20 -3
  212. package/dist/esm/hooks/useInfiniteRows.mjs.map +1 -1
  213. package/dist/esm/hooks/useInfiniteRows.native.js +20 -3
  214. package/dist/esm/hooks/useInfiniteRows.native.js.map +1 -1
  215. package/dist/esm/index.mjs +2 -1
  216. package/dist/esm/index.mjs.map +1 -1
  217. package/dist/esm/index.native.js +2 -1
  218. package/dist/esm/index.native.js.map +1 -1
  219. package/dist/esm/utils/filterUtils.mjs +12 -5
  220. package/dist/esm/utils/filterUtils.mjs.map +1 -1
  221. package/dist/esm/utils/filterUtils.native.js +20 -5
  222. package/dist/esm/utils/filterUtils.native.js.map +1 -1
  223. package/dist/jsx/components/ChildTable/index.mjs +2 -1
  224. package/dist/jsx/components/ChildTable/index.mjs.map +1 -1
  225. package/dist/jsx/components/ChildTable/index.native.js +2 -1
  226. package/dist/jsx/components/ChildTable/index.native.js.map +1 -1
  227. package/dist/jsx/components/ColumnHeaderFilter/index.mjs +17 -9
  228. package/dist/jsx/components/ColumnHeaderFilter/index.mjs.map +1 -1
  229. package/dist/jsx/components/ColumnHeaderFilter/index.native.js +32 -11
  230. package/dist/jsx/components/ColumnHeaderFilter/index.native.js.map +1 -1
  231. package/dist/jsx/components/DataTable/DataTableDocumentList.mjs +196 -0
  232. package/dist/jsx/components/DataTable/DataTableDocumentList.mjs.map +1 -0
  233. package/dist/jsx/components/DataTable/DataTableDocumentList.native.js +237 -0
  234. package/dist/jsx/components/DataTable/DataTableDocumentList.native.js.map +1 -0
  235. package/dist/jsx/components/DataTable/DataTableMobileCards.mjs +5 -2
  236. package/dist/jsx/components/DataTable/DataTableMobileCards.mjs.map +1 -1
  237. package/dist/jsx/components/DataTable/DataTableMobileCards.native.js +6 -2
  238. package/dist/jsx/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  239. package/dist/jsx/components/DataTable/DataTableRoot.mjs +93 -42
  240. package/dist/jsx/components/DataTable/DataTableRoot.mjs.map +1 -1
  241. package/dist/jsx/components/DataTable/DataTableRoot.native.js +97 -43
  242. package/dist/jsx/components/DataTable/DataTableRoot.native.js.map +1 -1
  243. package/dist/jsx/components/DataTable/DataTableVirtualized.mjs +8 -2
  244. package/dist/jsx/components/DataTable/DataTableVirtualized.mjs.map +1 -1
  245. package/dist/jsx/components/DataTable/DataTableVirtualized.native.js +9 -3
  246. package/dist/jsx/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  247. package/dist/jsx/components/DataTable/documentListSlots.mjs +33 -0
  248. package/dist/jsx/components/DataTable/documentListSlots.mjs.map +1 -0
  249. package/dist/jsx/components/DataTable/documentListSlots.native.js +85 -0
  250. package/dist/jsx/components/DataTable/documentListSlots.native.js.map +1 -0
  251. package/dist/jsx/components/DataTable/index.native.js +74 -59
  252. package/dist/jsx/components/DataTable/index.native.js.map +1 -1
  253. package/dist/jsx/components/DataTable/rowStateChrome.mjs +28 -0
  254. package/dist/jsx/components/DataTable/rowStateChrome.mjs.map +1 -0
  255. package/dist/jsx/components/DataTable/rowStateChrome.native.js +59 -0
  256. package/dist/jsx/components/DataTable/rowStateChrome.native.js.map +1 -0
  257. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs +25 -4
  258. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  259. package/dist/jsx/components/DataTableCell/CellModalEditor.native.js +6 -1
  260. package/dist/jsx/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  261. package/dist/jsx/components/DataTableCell/CellOptionsEditor.mjs +9 -2
  262. package/dist/jsx/components/DataTableCell/CellOptionsEditor.mjs.map +1 -1
  263. package/dist/jsx/components/DataTableCell/CellOptionsEditor.native.js +11 -2
  264. package/dist/jsx/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  265. package/dist/jsx/components/DataTableCell/index.mjs +75 -64
  266. package/dist/jsx/components/DataTableCell/index.mjs.map +1 -1
  267. package/dist/jsx/components/DataTableCell/index.native.js +94 -82
  268. package/dist/jsx/components/DataTableCell/index.native.js.map +1 -1
  269. package/dist/jsx/components/DataTableColumnPinning/index.mjs +54 -37
  270. package/dist/jsx/components/DataTableColumnPinning/index.mjs.map +1 -1
  271. package/dist/jsx/components/DataTableColumnPinning/index.native.js +59 -38
  272. package/dist/jsx/components/DataTableColumnPinning/index.native.js.map +1 -1
  273. package/dist/jsx/components/DataTableDateFilter/index.mjs +34 -15
  274. package/dist/jsx/components/DataTableDateFilter/index.mjs.map +1 -1
  275. package/dist/jsx/components/DataTableDateFilter/index.native.js +33 -12
  276. package/dist/jsx/components/DataTableDateFilter/index.native.js.map +1 -1
  277. package/dist/jsx/components/DataTableExport/index.mjs +36 -8
  278. package/dist/jsx/components/DataTableExport/index.mjs.map +1 -1
  279. package/dist/jsx/components/DataTableExport/index.native.js +42 -7
  280. package/dist/jsx/components/DataTableExport/index.native.js.map +1 -1
  281. package/dist/jsx/components/DataTableFacetMenu/index.mjs +115 -0
  282. package/dist/jsx/components/DataTableFacetMenu/index.mjs.map +1 -0
  283. package/dist/jsx/components/DataTableFacetMenu/index.native.js +156 -0
  284. package/dist/jsx/components/DataTableFacetMenu/index.native.js.map +1 -0
  285. package/dist/jsx/components/DataTableFilterButton/index.mjs +54 -35
  286. package/dist/jsx/components/DataTableFilterButton/index.mjs.map +1 -1
  287. package/dist/jsx/components/DataTableFilterButton/index.native.js +63 -40
  288. package/dist/jsx/components/DataTableFilterButton/index.native.js.map +1 -1
  289. package/dist/jsx/components/DataTableFilterChips/FilterChip.mjs +118 -0
  290. package/dist/jsx/components/DataTableFilterChips/FilterChip.mjs.map +1 -0
  291. package/dist/jsx/components/DataTableFilterChips/FilterChip.native.js +148 -0
  292. package/dist/jsx/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
  293. package/dist/jsx/components/DataTableFilterChips/index.mjs +9 -32
  294. package/dist/jsx/components/DataTableFilterChips/index.mjs.map +1 -1
  295. package/dist/jsx/components/DataTableFilterChips/index.native.js +9 -32
  296. package/dist/jsx/components/DataTableFilterChips/index.native.js.map +1 -1
  297. package/dist/jsx/components/DataTableFilters/index.mjs +149 -506
  298. package/dist/jsx/components/DataTableFilters/index.mjs.map +1 -1
  299. package/dist/jsx/components/DataTableFilters/index.native.js +171 -544
  300. package/dist/jsx/components/DataTableFilters/index.native.js.map +1 -1
  301. package/dist/jsx/components/DataTableGrouping/index.mjs +275 -110
  302. package/dist/jsx/components/DataTableGrouping/index.mjs.map +1 -1
  303. package/dist/jsx/components/DataTableGrouping/index.native.js +310 -157
  304. package/dist/jsx/components/DataTableGrouping/index.native.js.map +1 -1
  305. package/dist/jsx/components/DataTablePagination/index.mjs +148 -96
  306. package/dist/jsx/components/DataTablePagination/index.mjs.map +1 -1
  307. package/dist/jsx/components/DataTablePagination/index.native.js +159 -106
  308. package/dist/jsx/components/DataTablePagination/index.native.js.map +1 -1
  309. package/dist/jsx/components/DataTableSearch/index.mjs +256 -215
  310. package/dist/jsx/components/DataTableSearch/index.mjs.map +1 -1
  311. package/dist/jsx/components/DataTableSearch/index.native.js +292 -243
  312. package/dist/jsx/components/DataTableSearch/index.native.js.map +1 -1
  313. package/dist/jsx/components/DataTableToolbar/index.mjs +145 -119
  314. package/dist/jsx/components/DataTableToolbar/index.mjs.map +1 -1
  315. package/dist/jsx/components/DataTableToolbar/index.native.js +163 -148
  316. package/dist/jsx/components/DataTableToolbar/index.native.js.map +1 -1
  317. package/dist/jsx/components/DataTableViewOptions/index.mjs +26 -22
  318. package/dist/jsx/components/DataTableViewOptions/index.mjs.map +1 -1
  319. package/dist/jsx/components/DataTableViewOptions/index.native.js +6 -4
  320. package/dist/jsx/components/DataTableViewOptions/index.native.js.map +1 -1
  321. package/dist/jsx/components/SimpleTable/index.mjs +338 -48
  322. package/dist/jsx/components/SimpleTable/index.mjs.map +1 -1
  323. package/dist/jsx/components/SimpleTable/index.native.js +356 -48
  324. package/dist/jsx/components/SimpleTable/index.native.js.map +1 -1
  325. package/dist/jsx/components/TableInput/index.mjs +150 -41
  326. package/dist/jsx/components/TableInput/index.mjs.map +1 -1
  327. package/dist/jsx/components/TableInput/index.native.js +54 -38
  328. package/dist/jsx/components/TableInput/index.native.js.map +1 -1
  329. package/dist/jsx/components/TableInput/shared.mjs +34 -1
  330. package/dist/jsx/components/TableInput/shared.mjs.map +1 -1
  331. package/dist/jsx/components/TableInput/shared.native.js +35 -0
  332. package/dist/jsx/components/TableInput/shared.native.js.map +1 -1
  333. package/dist/jsx/hooks/useDataTable.mjs +33 -2
  334. package/dist/jsx/hooks/useDataTable.mjs.map +1 -1
  335. package/dist/jsx/hooks/useDataTable.native.js +41 -2
  336. package/dist/jsx/hooks/useDataTable.native.js.map +1 -1
  337. package/dist/jsx/hooks/useInfiniteRows.mjs +20 -3
  338. package/dist/jsx/hooks/useInfiniteRows.mjs.map +1 -1
  339. package/dist/jsx/hooks/useInfiniteRows.native.js +20 -3
  340. package/dist/jsx/hooks/useInfiniteRows.native.js.map +1 -1
  341. package/dist/jsx/index.js +2 -1
  342. package/dist/jsx/index.js.map +1 -1
  343. package/dist/jsx/index.mjs +2 -1
  344. package/dist/jsx/index.mjs.map +1 -1
  345. package/dist/jsx/index.native.js +2 -0
  346. package/dist/jsx/index.native.js.map +1 -1
  347. package/dist/jsx/utils/filterUtils.mjs +12 -5
  348. package/dist/jsx/utils/filterUtils.mjs.map +1 -1
  349. package/dist/jsx/utils/filterUtils.native.js +20 -5
  350. package/dist/jsx/utils/filterUtils.native.js.map +1 -1
  351. package/package.json +15 -15
  352. package/src/components/ChildTable/index.tsx +1 -0
  353. package/src/components/ColumnHeaderFilter/ColumnHeaderFilter.spec.tsx +85 -0
  354. package/src/components/ColumnHeaderFilter/index.tsx +28 -10
  355. package/src/components/DataTable/DataTable.stories.tsx +30 -0
  356. package/src/components/DataTable/DataTableDocumentList.tsx +224 -0
  357. package/src/components/DataTable/DataTableMobileCards.tsx +20 -8
  358. package/src/components/DataTable/DataTableRoot.tsx +135 -58
  359. package/src/components/DataTable/DataTableVirtualized.tsx +8 -11
  360. package/src/components/DataTable/cardLayout.spec.tsx +89 -0
  361. package/src/components/DataTable/documentListSlots.ts +57 -0
  362. package/src/components/DataTable/index.native.tsx +76 -50
  363. package/src/components/DataTable/keepPreviousData.spec.tsx +137 -0
  364. package/src/components/DataTable/rowRing.spec.tsx +118 -0
  365. package/src/components/DataTable/rowStateChrome.ts +38 -0
  366. package/src/components/DataTableCell/CellModalEditor.native.tsx +4 -0
  367. package/src/components/DataTableCell/CellModalEditor.tsx +31 -3
  368. package/src/components/DataTableCell/CellOptionsEditor.tsx +29 -12
  369. package/src/components/DataTableCell/DataTableCell.stories.tsx +3 -3
  370. package/src/components/DataTableCell/cellDraftPolicy.spec.tsx +131 -4
  371. package/src/components/DataTableCell/dataTableCell.spec.tsx +36 -1
  372. package/src/components/DataTableCell/index.tsx +121 -86
  373. package/src/components/DataTableColumnPinning/DataTableColumnPinning.spec.tsx +66 -0
  374. package/src/components/DataTableColumnPinning/index.tsx +32 -17
  375. package/src/components/DataTableDateFilter/DataTableDateFilter.spec.tsx +9 -1
  376. package/src/components/DataTableDateFilter/dateFilterZones.spec.ts +316 -0
  377. package/src/components/DataTableDateFilter/index.tsx +42 -22
  378. package/src/components/DataTableExport/exportDateZones.spec.tsx +348 -0
  379. package/src/components/DataTableExport/index.tsx +107 -63
  380. package/src/components/DataTableFacetMenu/DataTableFacetMenu.spec.tsx +264 -0
  381. package/src/components/DataTableFacetMenu/DataTableFacetMenu.stories.tsx +212 -0
  382. package/src/components/DataTableFacetMenu/index.tsx +202 -0
  383. package/src/components/DataTableFilterButton/index.tsx +66 -49
  384. package/src/components/DataTableFilterChips/DataTableFilterChips.spec.tsx +22 -0
  385. package/src/components/DataTableFilterChips/FilterChip.tsx +122 -0
  386. package/src/components/DataTableFilterChips/index.tsx +13 -29
  387. package/src/components/DataTableFilters/DataTableFilters.spec.tsx +56 -0
  388. package/src/components/DataTableFilters/index.tsx +169 -584
  389. package/src/components/DataTableGrouping/DataTableGrouping.spec.tsx +85 -0
  390. package/src/components/DataTableGrouping/index.tsx +270 -130
  391. package/src/components/DataTablePagination/DataTablePagination.spec.tsx +79 -4
  392. package/src/components/DataTablePagination/index.tsx +168 -112
  393. package/src/components/DataTableSearch/DataTableSearch.spec.tsx +40 -0
  394. package/src/components/DataTableSearch/DataTableSearch.stories.tsx +1 -1
  395. package/src/components/DataTableSearch/index.tsx +192 -163
  396. package/src/components/DataTableToolbar/DataTableToolbar.spec.tsx +48 -18
  397. package/src/components/DataTableToolbar/DataTableToolbar.stories.tsx +5 -45
  398. package/src/components/DataTableToolbar/index.tsx +128 -99
  399. package/src/components/DataTableViewOptions/index.tsx +29 -22
  400. package/src/components/SimpleTable/SimpleTable.stories.tsx +29 -5
  401. package/src/components/SimpleTable/index.tsx +442 -61
  402. package/src/components/SimpleTable/simpleTable.spec.tsx +140 -12
  403. package/src/components/TableInput/index.native.tsx +91 -81
  404. package/src/components/TableInput/index.tsx +191 -50
  405. package/src/components/TableInput/shared.ts +57 -0
  406. package/src/components/TableInput/tableInput.spec.tsx +104 -0
  407. package/src/hooks/useDataTable.spec.ts +100 -3
  408. package/src/hooks/useDataTable.ts +44 -1
  409. package/src/hooks/useInfiniteRows.spec.tsx +37 -0
  410. package/src/hooks/useInfiniteRows.ts +34 -4
  411. package/src/index.ts +7 -0
  412. package/src/types.ts +54 -3
  413. package/src/utils/filterUtils.ts +27 -5
  414. package/types/components/ChildTable/index.d.ts.map +1 -1
  415. package/types/components/ColumnHeaderFilter/index.d.ts.map +1 -1
  416. package/types/components/DataTable/DataTableDocumentList.d.ts +32 -0
  417. package/types/components/DataTable/DataTableDocumentList.d.ts.map +1 -0
  418. package/types/components/DataTable/DataTableMobileCards.d.ts +3 -1
  419. package/types/components/DataTable/DataTableMobileCards.d.ts.map +1 -1
  420. package/types/components/DataTable/DataTableRoot.d.ts +1 -1
  421. package/types/components/DataTable/DataTableRoot.d.ts.map +1 -1
  422. package/types/components/DataTable/DataTableVirtualized.d.ts +1 -2
  423. package/types/components/DataTable/DataTableVirtualized.d.ts.map +1 -1
  424. package/types/components/DataTable/documentListSlots.d.ts +26 -0
  425. package/types/components/DataTable/documentListSlots.d.ts.map +1 -0
  426. package/types/components/DataTable/index.native.d.ts +1 -1
  427. package/types/components/DataTable/index.native.d.ts.map +1 -1
  428. package/types/components/DataTable/rowStateChrome.d.ts +18 -0
  429. package/types/components/DataTable/rowStateChrome.d.ts.map +1 -0
  430. package/types/components/DataTableCell/CellModalEditor.d.ts +6 -1
  431. package/types/components/DataTableCell/CellModalEditor.d.ts.map +1 -1
  432. package/types/components/DataTableCell/CellModalEditor.native.d.ts +1 -1
  433. package/types/components/DataTableCell/CellModalEditor.native.d.ts.map +1 -1
  434. package/types/components/DataTableCell/CellOptionsEditor.d.ts +11 -3
  435. package/types/components/DataTableCell/CellOptionsEditor.d.ts.map +1 -1
  436. package/types/components/DataTableCell/index.d.ts +1 -1
  437. package/types/components/DataTableCell/index.d.ts.map +1 -1
  438. package/types/components/DataTableColumnPinning/index.d.ts.map +1 -1
  439. package/types/components/DataTableDateFilter/index.d.ts.map +1 -1
  440. package/types/components/DataTableExport/index.d.ts +17 -6
  441. package/types/components/DataTableExport/index.d.ts.map +1 -1
  442. package/types/components/DataTableFacetMenu/index.d.ts +84 -0
  443. package/types/components/DataTableFacetMenu/index.d.ts.map +1 -0
  444. package/types/components/DataTableFilterButton/index.d.ts.map +1 -1
  445. package/types/components/DataTableFilterChips/FilterChip.d.ts +15 -0
  446. package/types/components/DataTableFilterChips/FilterChip.d.ts.map +1 -0
  447. package/types/components/DataTableFilterChips/index.d.ts +5 -0
  448. package/types/components/DataTableFilterChips/index.d.ts.map +1 -1
  449. package/types/components/DataTableFilters/index.d.ts +11 -0
  450. package/types/components/DataTableFilters/index.d.ts.map +1 -1
  451. package/types/components/DataTableGrouping/index.d.ts.map +1 -1
  452. package/types/components/DataTablePagination/index.d.ts +5 -0
  453. package/types/components/DataTablePagination/index.d.ts.map +1 -1
  454. package/types/components/DataTableSearch/index.d.ts.map +1 -1
  455. package/types/components/DataTableToolbar/index.d.ts +2 -0
  456. package/types/components/DataTableToolbar/index.d.ts.map +1 -1
  457. package/types/components/SimpleTable/index.d.ts +27 -5
  458. package/types/components/SimpleTable/index.d.ts.map +1 -1
  459. package/types/components/TableInput/index.d.ts +6 -1
  460. package/types/components/TableInput/index.d.ts.map +1 -1
  461. package/types/components/TableInput/index.native.d.ts +6 -1
  462. package/types/components/TableInput/index.native.d.ts.map +1 -1
  463. package/types/components/TableInput/shared.d.ts +38 -0
  464. package/types/components/TableInput/shared.d.ts.map +1 -1
  465. package/types/hooks/useDataTable.d.ts +1 -1
  466. package/types/hooks/useDataTable.d.ts.map +1 -1
  467. package/types/hooks/useInfiniteRows.d.ts +8 -1
  468. package/types/hooks/useInfiniteRows.d.ts.map +1 -1
  469. package/types/index.d.ts +1 -0
  470. package/types/index.d.ts.map +1 -1
  471. package/types/types.d.ts +54 -3
  472. package/types/types.d.ts.map +1 -1
  473. package/types/utils/filterUtils.d.ts.map +1 -1
@@ -15,10 +15,14 @@
15
15
 
16
16
  import { CaretLeftIcon, CaretRightIcon, FunnelIcon } from "@phosphor-icons/react";
17
17
  import { useDirection } from "@multiplatform.one/components";
18
- import { Button, FloatingPanel, SearchInput, useViewportGtSm } from "@multiplatform.one/forms";
19
- import { useResolvedKnobs } from "@multiplatform.one/theme";
18
+ import { Button, FloatingPanel, SearchInput } from "@multiplatform.one/forms";
19
+ import {
20
+ keyboardFocusRingProps,
21
+ useResolvedKnobs,
22
+ wasKeyboardFocus,
23
+ } from "@multiplatform.one/theme";
20
24
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
21
- import { isWeb, Text, View, XStack, YStack } from "tamagui";
25
+ import { Text, View, XStack, YStack } from "tamagui";
22
26
  import { t } from "../../shared/t";
23
27
  import type { FilterOperator, FilterValue, ResolvedFilterField } from "../../types";
24
28
  import {
@@ -33,16 +37,20 @@ import { FilterOperatorValueEditor } from "../FilterOperatorValueEditor";
33
37
  interface FieldRowProps {
34
38
  field: ResolvedFilterField;
35
39
  highlighted: boolean;
40
+ /** LC-71: inset ring on the active option only while the listbox has keyboard focus. */
41
+ keyboardHighlight: boolean;
36
42
  onSelect: (field: ResolvedFilterField) => void;
37
43
  }
38
44
 
39
- function FieldRow({ field, highlighted, onSelect }: FieldRowProps) {
45
+ function FieldRow({ field, highlighted, keyboardHighlight, onSelect }: FieldRowProps) {
40
46
  const { knobProps } = useResolvedKnobs();
41
47
  return (
42
48
  <View
43
49
  role="option"
50
+ id={`filter-field-${field.id}`}
44
51
  aria-selected={highlighted}
45
- tabIndex={0}
52
+ // LC-49 / LC-71: the listbox is the tab stop; options are not.
53
+ tabIndex={-1}
46
54
  cursor="pointer"
47
55
  paddingHorizontal="$2.5"
48
56
  paddingVertical="$2"
@@ -53,20 +61,10 @@ function FieldRow({ field, highlighted, onSelect }: FieldRowProps) {
53
61
  backgroundColor={highlighted ? "$color4" : "transparent"}
54
62
  hoverStyle={{ backgroundColor: "$color4" }}
55
63
  pressStyle={{ backgroundColor: "$color5" }}
56
- focusVisibleStyle={{
57
- outlineColor: "$outlineColor",
58
- outlineWidth: 2,
59
- outlineStyle: "solid",
60
- }}
64
+ outlineWidth={0}
65
+ focusStyle={{ outlineWidth: 0 }}
66
+ {...(keyboardHighlight ? keyboardFocusRingProps : null)}
61
67
  onPress={() => onSelect(field)}
62
- onKeyDown={
63
- ((e: KeyboardEvent) => {
64
- if (e.key === "Enter" || e.key === " ") {
65
- e.preventDefault();
66
- onSelect(field);
67
- }
68
- }) as unknown as () => void
69
- }
70
68
  >
71
69
  <Text fontSize="$3" color="$color12" numberOfLines={1}>
72
70
  {field.label}
@@ -95,7 +93,6 @@ function GroupHeader({ children }: { children: string }) {
95
93
  export function DataTableFilterButton() {
96
94
  const ctx = useDataTableState();
97
95
  const { knobProps } = useResolvedKnobs();
98
- const viewportGtSm = useViewportGtSm();
99
96
  // "Back to field list" points toward the panel's start edge — directional,
100
97
  // so the caret pair swaps under RTL (useDirection glyph-swap pattern).
101
98
  const BackCaretIcon = useDirection() === "rtl" ? CaretRightIcon : CaretLeftIcon;
@@ -103,6 +100,7 @@ export function DataTableFilterButton() {
103
100
  const [open, setOpen] = useState(false);
104
101
  const [search, setSearch] = useState("");
105
102
  const [highlightedIndex, setHighlightedIndex] = useState(0);
103
+ const [listboxFocused, setListboxFocused] = useState(false);
106
104
  const [activeField, setActiveField] = useState<ResolvedFilterField | null>(null);
107
105
  const [operator, setOperator] = useState<FilterOperator>("contains");
108
106
  const [value, setValue] = useState("");
@@ -292,21 +290,21 @@ export function DataTableFilterButton() {
292
290
  (ctx.state.filters?.length ?? 0) +
293
291
  (ctx.state.columnFilters?.filter((cf) => isFilterValueShape(cf.value)).length ?? 0);
294
292
 
295
- // Who owns the trigger press depends on FloatingPanel's mode:
296
- // - desktop web (floating): FloatingPanel opens on DOM mousedown (useClick)
297
- // — the Button must NOT also toggle `open` or every click double-toggles.
298
- // - sheet (native / ≤860px web): the Button is the deepest pressable and
299
- // swallows the press before the sheet's trigger wrapper View sees it —
300
- // the Button itself must toggle `open` (harmless on native, where the
301
- // trigger subtree is pointerEvents="none" and the wrapper handles it).
302
- const sheetMode = !isWeb || !viewportGtSm;
293
+ // FloatingPanel owns the trigger press in every mode. This Button used to
294
+ // toggle `open` itself in sheet mode, because the deepest pressable swallows
295
+ // the click before the sheet's wrapper View sees it — that swallow is fixed
296
+ // at the source now (FloatingPanel opens on the capture phase), so a second
297
+ // opener here would only be a place for the two to disagree.
298
+ const highlightedId = flatList[highlightedIndex]?.id;
299
+ const keyboardHighlight = listboxFocused && wasKeyboardFocus() ? highlightedId : undefined;
300
+
303
301
  const trigger = (
304
302
  <Button
305
303
  size="$3"
306
- variant="outlined"
304
+ compact
305
+ {...(activeChipCount > 0 ? { accent: true } : { variant: "outlined" as const })}
307
306
  aria-label={t("Filter")}
308
307
  icon={<FunnelIcon size={14} weight={activeChipCount > 0 ? "fill" : "regular"} />}
309
- {...(sheetMode ? { onPress: () => handleOpenChange(!open) } : {})}
310
308
  >
311
309
  {activeChipCount > 0 ? `${t("Filter")} (${activeChipCount})` : t("Filter")}
312
310
  </Button>
@@ -334,7 +332,7 @@ export function DataTableFilterButton() {
334
332
  }}
335
333
  icon={<BackCaretIcon size={14} />}
336
334
  />
337
- <Text fontSize={knobProps.sizeToken} fontWeight="600" color="$color11" flex={1}>
335
+ <Text fontSize="$3" fontWeight="600" color="$color11" flex={1}>
338
336
  {t("Filter: {{column}}", { column: activeField.label })}
339
337
  </Text>
340
338
  </XStack>
@@ -372,29 +370,48 @@ export function DataTableFilterButton() {
372
370
  aria-label={t("Search fields")}
373
371
  />
374
372
  <YStack
375
- role="list"
373
+ // role="listbox" is a valid ARIA role but outside RN's `Role`
374
+ // union; this web-only bag forwards it to the DOM node (house
375
+ // Record cast).
376
+ {...({ role: "listbox" } as Record<string, unknown>)}
376
377
  aria-label={t("Filterable fields")}
378
+ aria-activedescendant={highlightedId ? `filter-field-${highlightedId}` : undefined}
379
+ tabIndex={0}
377
380
  maxHeight={320}
378
381
  overflow="scroll"
382
+ outlineWidth={0}
383
+ focusStyle={{ outlineWidth: 0 }}
384
+ onFocus={() => setListboxFocused(true)}
385
+ onBlur={() => setListboxFocused(false)}
379
386
  >
380
- {columnFields.length > 0 && <GroupHeader>{t("Columns")}</GroupHeader>}
381
- {columnFields.map((field) => (
382
- <FieldRow
383
- key={field.id}
384
- field={field}
385
- highlighted={flatList[highlightedIndex]?.id === field.id}
386
- onSelect={handleSelectField}
387
- />
388
- ))}
389
- {moreFields.length > 0 && <GroupHeader>{t("More fields")}</GroupHeader>}
390
- {moreFields.map((field) => (
391
- <FieldRow
392
- key={field.id}
393
- field={field}
394
- highlighted={flatList[highlightedIndex]?.id === field.id}
395
- onSelect={handleSelectField}
396
- />
397
- ))}
387
+ {columnFields.length > 0 && (
388
+ <YStack role="group" aria-label={t("Columns")}>
389
+ <GroupHeader>{t("Columns")}</GroupHeader>
390
+ {columnFields.map((field) => (
391
+ <FieldRow
392
+ key={field.id}
393
+ field={field}
394
+ highlighted={highlightedId === field.id}
395
+ keyboardHighlight={keyboardHighlight === field.id}
396
+ onSelect={handleSelectField}
397
+ />
398
+ ))}
399
+ </YStack>
400
+ )}
401
+ {moreFields.length > 0 && (
402
+ <YStack role="group" aria-label={t("More fields")}>
403
+ <GroupHeader>{t("More fields")}</GroupHeader>
404
+ {moreFields.map((field) => (
405
+ <FieldRow
406
+ key={field.id}
407
+ field={field}
408
+ highlighted={highlightedId === field.id}
409
+ keyboardHighlight={keyboardHighlight === field.id}
410
+ onSelect={handleSelectField}
411
+ />
412
+ ))}
413
+ </YStack>
414
+ )}
398
415
  {flatList.length === 0 && (
399
416
  <Text fontSize="$2" color="$color10" padding="$2.5">
400
417
  {t("No fields match")}
@@ -128,6 +128,15 @@ describe("DataTableFilterChips", () => {
128
128
  renderTable([]);
129
129
  expect(screen.queryByLabelText("Active filters")).toBeNull();
130
130
  });
131
+
132
+ it("chip press and dismiss are two focusables (LC-71)", async () => {
133
+ renderTable([emailFilter("corp")]);
134
+ const edit = await screen.findByRole("button", { name: /Edit filter/ });
135
+ const remove = screen.getByRole("button", { name: "Remove" });
136
+ expect(edit.getAttribute("tabindex")).toBe("0");
137
+ expect(remove.getAttribute("tabindex")).toBe("0");
138
+ expect(remove.className).toMatch(/mp-chip-dismiss/);
139
+ });
131
140
  });
132
141
 
133
142
  describe("DataTableFilterButton", () => {
@@ -141,6 +150,19 @@ describe("DataTableFilterButton", () => {
141
150
  expect(await screen.findByText("Filter (1)")).toBeTruthy();
142
151
  });
143
152
 
153
+ it("field list is a single-tab-stop listbox (LC-49 / LC-71)", async () => {
154
+ const user = userEvent.setup();
155
+ renderTable([]);
156
+ await user.click(await screen.findByRole("button", { name: "Filter" }));
157
+ const listbox = await screen.findByRole("listbox", { name: "Filterable fields" });
158
+ expect(listbox.getAttribute("tabindex")).toBe("0");
159
+ const options = screen.getAllByRole("option");
160
+ expect(options.length).toBeGreaterThan(0);
161
+ for (const option of options) {
162
+ expect(option.getAttribute("tabindex")).toBe("-1");
163
+ }
164
+ });
165
+
144
166
  it("opens a searchable field list with visible columns grouped before hidden fields", async () => {
145
167
  const user = userEvent.setup();
146
168
  renderTable([]);
@@ -0,0 +1,122 @@
1
+ /**
2
+ * FilterChip — one active filter as a pill (Polaris Index Filters / Linear).
3
+ *
4
+ * LC-71 RING-ANATOMY: two focusables, two rings. Chip press (edit) rings the
5
+ * pill; dismiss rings the glyph, never the 44px hit box. Selected state is
6
+ * the chip fill; no extra border on the row of siblings.
7
+ */
8
+
9
+ import { XIcon } from "@phosphor-icons/react";
10
+ import { ChipFrame, ChipText, chipIconSize, type ChipSize } from "@multiplatform.one/forms";
11
+ import {
12
+ MIN_PRESS_TARGET,
13
+ ensureCompositeFocusRing,
14
+ ensureFocusVisibleRing,
15
+ pressTargetHitSlop,
16
+ pressTargetStyle,
17
+ useResolvedKnobs,
18
+ } from "@multiplatform.one/theme";
19
+ import { View, styled } from "tamagui";
20
+ import { t } from "../../shared/t";
21
+
22
+ export interface FilterChipProps {
23
+ label: string;
24
+ onRemove: () => void;
25
+ /** Chip press reopens the editor (Linear / Polaris tag click). */
26
+ onPress?: () => void;
27
+ }
28
+
29
+ const DismissButton = styled(View, {
30
+ name: "FilterChipDismiss",
31
+ cursor: "pointer",
32
+ opacity: 0.7,
33
+ alignItems: "center",
34
+ justifyContent: "center",
35
+ outlineWidth: 0,
36
+ hoverStyle: { opacity: 1 },
37
+ pressStyle: { opacity: 0.9 },
38
+ focusStyle: { outlineWidth: 0 },
39
+ focusVisibleStyle: { opacity: 1, outlineWidth: 0 },
40
+ });
41
+
42
+ const DismissRing = styled(View, {
43
+ name: "FilterChipDismissRing",
44
+ alignItems: "center",
45
+ justifyContent: "center",
46
+ padding: "$0.5",
47
+ hoverStyle: { backgroundColor: "$color5" },
48
+ });
49
+
50
+ export function FilterChip({ label, onRemove, onPress }: FilterChipProps) {
51
+ const { knobProps } = useResolvedKnobs();
52
+ if (typeof document !== "undefined") ensureCompositeFocusRing();
53
+
54
+ const resolvedSize = (knobProps.sizeToken as ChipSize) || "$3";
55
+ const iconSize = chipIconSize(resolvedSize);
56
+ const RING_INSET = 2;
57
+ const dismissVisual = iconSize + RING_INSET * 2;
58
+ const dismissOutset = Math.max(0, Math.ceil((MIN_PRESS_TARGET - dismissVisual) / 2));
59
+ const editable = typeof onPress === "function";
60
+
61
+ return (
62
+ <ChipFrame
63
+ size={resolvedSize}
64
+ variant="subtle"
65
+ backgroundColor="$color4"
66
+ {...knobProps.borderRadius}
67
+ overflow="visible"
68
+ data-filter-chip=""
69
+ cursor={editable ? "pointer" : "default"}
70
+ role={editable ? "button" : undefined}
71
+ tabIndex={editable ? 0 : undefined}
72
+ aria-label={editable ? t("Edit filter {{label}}", { label }) : undefined}
73
+ outlineWidth={0}
74
+ focusStyle={{ outlineWidth: 0 }}
75
+ focusVisibleStyle={editable ? ensureFocusVisibleRing() : undefined}
76
+ hoverStyle={editable ? { backgroundColor: "$color5" } : undefined}
77
+ onPress={onPress}
78
+ onKeyDown={
79
+ editable
80
+ ? (((e: KeyboardEvent) => {
81
+ if (e.key === "Enter" || e.key === " ") {
82
+ e.preventDefault();
83
+ onPress();
84
+ }
85
+ }) as unknown as () => void)
86
+ : undefined
87
+ }
88
+ >
89
+ <ChipText size={resolvedSize} color="$color12" {...knobProps.body}>
90
+ {label}
91
+ </ChipText>
92
+ <DismissButton
93
+ role="button"
94
+ aria-label={t("Remove")}
95
+ tabIndex={0}
96
+ className="mp-chip-dismiss"
97
+ borderRadius={knobProps.pointy ? 0 : 1000}
98
+ {...pressTargetStyle()}
99
+ marginVertical={-dismissOutset}
100
+ marginHorizontal={-dismissOutset}
101
+ hitSlop={pressTargetHitSlop(dismissVisual)}
102
+ onPress={(e) => {
103
+ e.stopPropagation?.();
104
+ onRemove();
105
+ }}
106
+ onKeyDown={
107
+ ((e: KeyboardEvent) => {
108
+ if (e.key === "Enter" || e.key === " ") {
109
+ e.preventDefault();
110
+ e.stopPropagation();
111
+ onRemove();
112
+ }
113
+ }) as unknown as () => void
114
+ }
115
+ >
116
+ <DismissRing className="mp-chip-dismiss-ring" borderRadius={knobProps.pointy ? 0 : 1000}>
117
+ <XIcon size={iconSize} color="$color12" />
118
+ </DismissRing>
119
+ </DismissButton>
120
+ </ChipFrame>
121
+ );
122
+ }
@@ -7,18 +7,23 @@
7
7
  *
8
8
  * Chip press reopens the shared editor pre-filled (filterUi channel), the X
9
9
  * removes (44px target via Chip), "Clear all" appears at 2+ chips.
10
+ *
11
+ * Anatomy follows Polaris Index Filters + Linear: wrapping pills, gray fill
12
+ * (not a hue border), Clear all as a text control — LC-71 selected = fill.
10
13
  */
11
14
 
12
15
  import { Button } from "@multiplatform.one/forms";
13
- import { Chip } from "@multiplatform.one/forms";
14
- import { useResolvedKnobs } from "@multiplatform.one/theme";
15
16
  import { useCallback, useMemo } from "react";
16
- import { View, XStack } from "tamagui";
17
+ import { XStack } from "tamagui";
17
18
  import { t } from "../../shared/t";
18
19
  import type { FilterValue, ResolvedFilterField } from "../../types";
19
20
  import { getFilterChipLabel, isFilterValueShape } from "../../utils/filterFields";
20
21
  import type { FilterEditTarget } from "../DataTable/DataTableStateContext";
21
22
  import { useDataTableState } from "../DataTable/DataTableStateContext";
23
+ import { FilterChip } from "./FilterChip";
24
+
25
+ export { FilterChip } from "./FilterChip";
26
+ export type { FilterChipProps } from "./FilterChip";
22
27
 
23
28
  interface FilterChipModel {
24
29
  key: string;
@@ -29,7 +34,6 @@ interface FilterChipModel {
29
34
 
30
35
  export function DataTableFilterChips() {
31
36
  const ctx = useDataTableState();
32
- const { knobProps } = useResolvedKnobs();
33
37
 
34
38
  const fields: ResolvedFilterField[] = ctx?.computed?.filterFields ?? [];
35
39
  const fieldFor = useCallback((id: string) => fields.find((f) => f.id === id), [fields]);
@@ -90,35 +94,15 @@ export function DataTableFilterChips() {
90
94
  aria-label={t("Active filters")}
91
95
  >
92
96
  {chips.map((chip) => (
93
- <View
97
+ <FilterChip
94
98
  key={chip.key}
95
- role="button"
96
- tabIndex={0}
97
- aria-label={t("Edit filter {{label}}", { label: chip.label })}
98
- cursor="pointer"
99
- {...knobProps.containerRadius}
100
- focusVisibleStyle={{
101
- outlineColor: "$outlineColor",
102
- outlineWidth: 2,
103
- outlineStyle: "solid",
104
- }}
99
+ label={chip.label}
100
+ onRemove={chip.onRemove}
105
101
  onPress={() => ctx.filterUi?.requestEdit(chip.target)}
106
- onKeyDown={
107
- ((e: KeyboardEvent) => {
108
- if (e.key === "Enter" || e.key === " ") {
109
- e.preventDefault();
110
- ctx.filterUi?.requestEdit(chip.target);
111
- }
112
- }) as unknown as () => void
113
- }
114
- >
115
- <Chip color="blue" onDismiss={chip.onRemove}>
116
- {chip.label}
117
- </Chip>
118
- </View>
102
+ />
119
103
  ))}
120
104
  {chips.length >= 2 && (
121
- <Button size="$2" chromeless onPress={handleClearAll}>
105
+ <Button size="$2" chromeless compact onPress={handleClearAll}>
122
106
  {t("Clear all")}
123
107
  </Button>
124
108
  )}
@@ -1,4 +1,6 @@
1
1
  import { renderWithProviders } from "@multiplatform.one/test-utils";
2
+ import { screen } from "@testing-library/react";
3
+ import userEvent from "@testing-library/user-event";
2
4
  import { describe, expect, it, vi } from "vitest";
3
5
  import type { DataTableColumnType, FacetedFilterOption, TableFilter } from "../../types";
4
6
  import { DataTableFilters, type DataTableFiltersProps } from "./index";
@@ -62,6 +64,60 @@ describe("DataTableFilters", () => {
62
64
  compact: false,
63
65
  };
64
66
 
67
+ describe("chip bar", () => {
68
+ it("empty state is a Filter trigger, not an empty-state panel", () => {
69
+ renderWithProviders(<DataTableFilters {...defaultProps} />);
70
+ expect(screen.getByRole("button", { name: "Filter" })).toBeTruthy();
71
+ expect(screen.queryByText("No filters applied")).toBeNull();
72
+ expect(screen.queryByLabelText("Filters")).toBeNull();
73
+ });
74
+
75
+ it("renders each active filter as a dismissible chip with the count on the trigger", () => {
76
+ renderWithProviders(<DataTableFilters {...defaultProps} filters={sampleFilters} />);
77
+ expect(screen.getByText("Filter (2)")).toBeTruthy();
78
+ expect(screen.getByText("Name: contains John")).toBeTruthy();
79
+ expect(screen.getByText("Age: greater than or equal 25")).toBeTruthy();
80
+ expect(screen.getByRole("button", { name: "Clear all" })).toBeTruthy();
81
+ });
82
+
83
+ it("chip dismiss calls onRemoveFilter with that filter id", async () => {
84
+ const user = userEvent.setup();
85
+ const onRemoveFilter = vi.fn();
86
+ renderWithProviders(
87
+ <DataTableFilters
88
+ {...defaultProps}
89
+ filters={sampleFilters}
90
+ onRemoveFilter={onRemoveFilter}
91
+ />,
92
+ );
93
+ await user.click(screen.getAllByRole("button", { name: "Remove" })[0]);
94
+ expect(onRemoveFilter).toHaveBeenCalledWith("filter1");
95
+ });
96
+
97
+ it("Clear all calls onClearFilters", async () => {
98
+ const user = userEvent.setup();
99
+ const onClearFilters = vi.fn();
100
+ renderWithProviders(
101
+ <DataTableFilters
102
+ {...defaultProps}
103
+ filters={sampleFilters}
104
+ onClearFilters={onClearFilters}
105
+ />,
106
+ );
107
+ await user.click(screen.getByRole("button", { name: "Clear all" }));
108
+ expect(onClearFilters).toHaveBeenCalledTimes(1);
109
+ });
110
+
111
+ it("hides the count on the trigger when showFilterCount is false", () => {
112
+ renderWithProviders(
113
+ <DataTableFilters {...defaultProps} filters={sampleFilters} showFilterCount={false} />,
114
+ );
115
+ expect(screen.queryByText("Filter (2)")).toBeNull();
116
+ expect(screen.getByRole("button", { name: "Filter" })).toBeTruthy();
117
+ expect(screen.getByText("Name: contains John")).toBeTruthy();
118
+ });
119
+ });
120
+
65
121
  describe("basic rendering", () => {
66
122
  it("should render filters component with no filters", () => {
67
123
  const { container } = renderWithProviders(<DataTableFilters {...defaultProps} />);