@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
@@ -1,10 +1,10 @@
1
- import { CaretDownIcon, GearIcon } from "@phosphor-icons/react";
2
- import { useResolvedKnobs } from "@multiplatform.one/theme";
1
+ import { SlidersHorizontalIcon } from "@phosphor-icons/react";
2
+ import { sizeRecipeForToken, useResolvedKnobs } from "@multiplatform.one/theme";
3
3
  import type React from "react";
4
- import { useCallback, useEffect, useMemo, useState } from "react";
4
+ import { useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
5
5
  import { PopoverContent } from "@multiplatform.one/components";
6
- import { Button, Checkbox, SearchInput } from "@multiplatform.one/forms";
7
- import { Popover, ScrollView, Separator, Text, View, XStack, YStack } from "tamagui";
6
+ import { Button, Checkbox, SearchInput, formCommonColors } from "@multiplatform.one/forms";
7
+ import { Popover, ScrollView, Separator, Text, View, XStack, YStack, isWeb } from "tamagui";
8
8
  import { useDataTableState } from "../DataTable/DataTableStateContext";
9
9
  import { t } from "../../shared/t";
10
10
  import { bidiIsolate } from "../../utils/withInterp";
@@ -35,16 +35,19 @@ export interface DataTableSearchProps<T = any> {
35
35
  disabled?: boolean;
36
36
  }
37
37
 
38
+ // Search glyphs are control-internal icons (LC-75/LC-79): the generated
39
+ // recipe's icon channel — no handwritten per-token px map.
40
+ const iconSizeForToken = (token: string): number => sizeRecipeForToken(token).iconSize;
41
+
38
42
  export function DataTableSearch<T = any>(props: DataTableSearchProps<T>) {
39
- // Try to consume from DataTableStateContext (compound component pattern)
40
43
  const ctx = useDataTableState();
41
44
 
42
- // Resolve values: explicit props override context values
43
45
  const data = props.data ?? (ctx?.computed.filteredData as T[]) ?? [];
44
46
  const columns = props.columns ?? [];
45
47
 
46
48
  const {
47
49
  onSearchResults,
50
+ onHighlightText,
48
51
  placeholder = t("Search across all columns..."),
49
52
  debounceMs = 300,
50
53
  showAdvancedOptions = true,
@@ -55,6 +58,10 @@ export function DataTableSearch<T = any>(props: DataTableSearchProps<T>) {
55
58
  const { knobProps } = useResolvedKnobs();
56
59
  const sz = knobProps.sizeToken;
57
60
  const searchMaxWidth = sz === "$3" ? 320 : sz === "$5" ? 480 : 400;
61
+ const iconPx = iconSizeForToken(String(sz));
62
+ const resultsId = useId();
63
+ const rootRef = useRef<HTMLElement | null>(null);
64
+
58
65
  const [searchTerm, setSearchTerm] = useState("");
59
66
  const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
60
67
  const [searchOptions, setSearchOptions] = useState<SearchOptions>({
@@ -66,25 +73,46 @@ export function DataTableSearch<T = any>(props: DataTableSearchProps<T>) {
66
73
  highlightResults: true,
67
74
  });
68
75
 
69
- // Perform search when debounced term changes
76
+ const compiled = useMemo(
77
+ () => compileSearchPattern({ ...searchOptions, searchTerm: debouncedSearchTerm }),
78
+ [searchOptions, debouncedSearchTerm],
79
+ );
80
+
81
+ const results = useMemo(() => {
82
+ if (!debouncedSearchTerm.trim()) return data;
83
+ if (compiled.invalid || !compiled.regex) return [];
84
+ return matchRows(data, searchOptions.columns, compiled.regex);
85
+ }, [data, debouncedSearchTerm, compiled, searchOptions.columns]);
86
+
70
87
  useEffect(() => {
71
- if (debouncedSearchTerm.trim()) {
72
- const results = performSearch(data, {
73
- ...searchOptions,
74
- searchTerm: debouncedSearchTerm,
75
- });
76
- onSearchResults?.(results, {
77
- ...searchOptions,
78
- searchTerm: debouncedSearchTerm,
79
- });
88
+ onSearchResults?.(results, {
89
+ ...searchOptions,
90
+ searchTerm: debouncedSearchTerm,
91
+ });
92
+ }, [results, data, searchOptions, debouncedSearchTerm, onSearchResults]);
93
+
94
+ useEffect(() => {
95
+ if (!onHighlightText) return;
96
+ if (searchOptions.highlightResults && debouncedSearchTerm.trim() && !compiled.invalid) {
97
+ onHighlightText(debouncedSearchTerm);
80
98
  } else {
81
- // Return all data when search is cleared
82
- onSearchResults?.(data, {
83
- ...searchOptions,
84
- searchTerm: "",
85
- });
99
+ onHighlightText("");
86
100
  }
87
- }, [debouncedSearchTerm, data, searchOptions, onSearchResults]);
101
+ }, [debouncedSearchTerm, searchOptions.highlightResults, compiled.invalid, onHighlightText]);
102
+
103
+ useEffect(() => {
104
+ if (!isWeb || disabled) return;
105
+ const onKey = (e: KeyboardEvent) => {
106
+ if (e.key !== "/" || e.metaKey || e.ctrlKey || e.altKey || e.isComposing) return;
107
+ const target = e.target as HTMLElement | null;
108
+ if (target?.closest("input, textarea, select, [contenteditable=true]")) return;
109
+ e.preventDefault();
110
+ const field = rootRef.current?.querySelector?.("[role='searchbox']") as HTMLElement | null;
111
+ field?.focus();
112
+ };
113
+ window.addEventListener("keydown", onKey);
114
+ return () => window.removeEventListener("keydown", onKey);
115
+ }, [disabled]);
88
116
 
89
117
  const handleOptionsChange = (newOptions: Partial<SearchOptions>) => {
90
118
  setSearchOptions((prev) => ({ ...prev, ...newOptions }));
@@ -93,12 +121,32 @@ export function DataTableSearch<T = any>(props: DataTableSearchProps<T>) {
93
121
  const searchableColumns = columns.filter((col) => col.searchable !== false);
94
122
  const selectedColumnCount = searchOptions.columns.length;
95
123
  const totalColumnCount = searchableColumns.length;
124
+ const optionsActive =
125
+ searchOptions.caseSensitive ||
126
+ searchOptions.wholeWord ||
127
+ searchOptions.regex ||
128
+ !searchOptions.highlightResults ||
129
+ selectedColumnCount !== totalColumnCount;
130
+ const isSearching = searchTerm !== debouncedSearchTerm;
131
+ const showStatus = Boolean(debouncedSearchTerm.trim());
96
132
 
97
133
  return (
98
- <XStack gap="$2" alignItems="center" flex={1} maxWidth={searchMaxWidth}>
99
- <View flex={1}>
100
- {/* Catalog SearchInput (census item 6): owns the debounce and the
101
- icon + field + clear anatomy this file used to re-compose. */}
134
+ <XStack
135
+ ref={rootRef as never}
136
+ // role="search" is a valid ARIA landmark role but outside RN's `Role`
137
+ // union; this web-only bag forwards it to the DOM node (house Record
138
+ // cast).
139
+ {...({ role: "search" } as Record<string, unknown>)}
140
+ aria-busy={isSearching || undefined}
141
+ {...knobProps.gap}
142
+ alignItems="center"
143
+ flex={1}
144
+ maxWidth={searchMaxWidth}
145
+ >
146
+ {/* LC-71: SearchInput is the whole search box — ring lives on its
147
+ Input.Box (magnifier + field + clear). Do not fork or wrap the
148
+ field in extra chrome that would split that boundary. */}
149
+ <View flex={1} minWidth={0}>
102
150
  <SearchInput
103
151
  value={searchTerm}
104
152
  onChange={setSearchTerm}
@@ -106,6 +154,13 @@ export function DataTableSearch<T = any>(props: DataTableSearchProps<T>) {
106
154
  debounceMs={debounceMs}
107
155
  placeholder={placeholder}
108
156
  disabled={disabled}
157
+ size={sz}
158
+ aria-label={t("Search table")}
159
+ inputProps={{
160
+ "aria-describedby": showStatus ? resultsId : undefined,
161
+ "aria-keyshortcuts": "/",
162
+ "aria-invalid": compiled.invalid || undefined,
163
+ }}
109
164
  />
110
165
  </View>
111
166
 
@@ -117,27 +172,35 @@ export function DataTableSearch<T = any>(props: DataTableSearchProps<T>) {
117
172
  selectedColumnCount={selectedColumnCount}
118
173
  totalColumnCount={totalColumnCount}
119
174
  disabled={disabled}
175
+ iconPx={iconPx}
176
+ optionsActive={optionsActive}
120
177
  />
121
178
  )}
122
179
 
123
- {debouncedSearchTerm ? (
124
- <View paddingHorizontal="$2">
125
- <Text fontSize="$2" color="$color10">
126
- {t("{{count}} results", {
127
- count: performSearch(data, {
128
- ...searchOptions,
129
- searchTerm: debouncedSearchTerm,
130
- }).length,
131
- })}
132
- </Text>
133
- </View>
180
+ {showStatus ? (
181
+ <Text
182
+ id={resultsId}
183
+ role="status"
184
+ aria-live="polite"
185
+ aria-atomic="true"
186
+ {...knobProps.label}
187
+ color={compiled.invalid ? formCommonColors.error : formCommonColors.muted}
188
+ flexShrink={0}
189
+ >
190
+ {compiled.invalid
191
+ ? t("Invalid regex")
192
+ : bidiIsolate(
193
+ t("{{shown}} of {{total}}", {
194
+ shown: results.length,
195
+ total: data.length,
196
+ }),
197
+ )}
198
+ </Text>
134
199
  ) : null}
135
200
  </XStack>
136
201
  );
137
202
  }
138
203
 
139
- // Search Options Popover
140
-
141
204
  interface SearchOptionsPopoverProps {
142
205
  searchOptions: SearchOptions;
143
206
  onOptionsChange: (options: Partial<SearchOptions>) => void;
@@ -150,6 +213,8 @@ interface SearchOptionsPopoverProps {
150
213
  selectedColumnCount: number;
151
214
  totalColumnCount: number;
152
215
  disabled: boolean;
216
+ iconPx: number;
217
+ optionsActive: boolean;
153
218
  }
154
219
 
155
220
  function SearchOptionsPopover({
@@ -159,82 +224,59 @@ function SearchOptionsPopover({
159
224
  selectedColumnCount,
160
225
  totalColumnCount,
161
226
  disabled,
227
+ iconPx,
228
+ optionsActive,
162
229
  }: SearchOptionsPopoverProps) {
163
230
  const { knobProps } = useResolvedKnobs();
164
- const [columnVisibility, setColumnVisibility] = useState<Record<string, boolean>>(() => {
165
- const visibility: Record<string, boolean> = {};
166
- columns.forEach((col) => {
167
- const key = col.accessorKey || col.id || "";
168
- visibility[key] = searchOptions.columns.includes(key);
169
- });
170
- return visibility;
171
- });
231
+ const [open, setOpen] = useState(false);
172
232
 
173
233
  const handleColumnToggle = (columnKey: string, checked: boolean) => {
174
- const newVisibility = { ...columnVisibility, [columnKey]: checked };
175
- setColumnVisibility(newVisibility);
176
-
177
- const selectedColumns = Object.entries(newVisibility)
178
- .filter(([_, isVisible]) => isVisible)
179
- .map(([key]) => key);
180
-
181
- onOptionsChange({ columns: selectedColumns });
234
+ const next = checked
235
+ ? Array.from(new Set([...searchOptions.columns, columnKey]))
236
+ : searchOptions.columns.filter((key) => key !== columnKey);
237
+ onOptionsChange({ columns: next });
182
238
  };
183
239
 
184
240
  const handleSelectAllColumns = () => {
185
- const allColumns = columns.map((col) => col.accessorKey || col.id || "");
186
- setColumnVisibility(Object.fromEntries(allColumns.map((key) => [key, true])));
187
- onOptionsChange({ columns: allColumns });
241
+ onOptionsChange({ columns: columns.map((col) => col.accessorKey || col.id || "") });
188
242
  };
189
243
 
190
244
  const handleSelectNoColumns = () => {
191
- setColumnVisibility(
192
- Object.fromEntries(columns.map((col) => [col.accessorKey || col.id || "", false])),
193
- );
194
245
  onOptionsChange({ columns: [] });
195
246
  };
196
247
 
197
- // Same size-derived cap as DataTableViewOptions; `resize` shrinks the
198
- // panel further whenever the viewport offers less room than the cap.
199
248
  const sz = knobProps.sizeToken;
200
249
  const panelMaxHeight = sz === "$3" ? 320 : sz === "$5" ? 480 : 400;
201
250
 
202
251
  return (
203
- // LC-06: anchored popover with collision handling — flip, shift, and
204
- // clamp inside the viewport (`resize` is a no-op on native).
205
- <Popover stayInFrame allowFlip resize>
252
+ <Popover open={open} onOpenChange={setOpen} stayInFrame allowFlip resize>
206
253
  <Popover.Trigger asChild>
207
254
  <Button
208
255
  size={knobProps.sizeToken}
209
256
  variant="outlined"
210
- icon={<GearIcon size={16} />}
257
+ accent={optionsActive}
258
+ icon={<SlidersHorizontalIcon size={iconPx} weight={optionsActive ? "fill" : "regular"} />}
211
259
  disabled={disabled}
212
260
  aria-label={t("Search options")}
213
- >
214
- <CaretDownIcon size={16} />
215
- </Button>
261
+ aria-expanded={open}
262
+ aria-haspopup="dialog"
263
+ />
216
264
  </Popover.Trigger>
217
265
 
218
- {/* SF-OVERLAY/E-OVERLAY: canonical elevated overlay (complete
219
- elevatedSurface knob fragment + transition). The frame owns only
220
- its border (inset lives on the panel YStack below); overflow
221
- hidden clips the scroll region to the radius knob. */}
222
266
  <PopoverContent padding={0} overflow="hidden" alignItems="stretch" minWidth={280}>
223
- {/* LC-10: when clamped below content height the body scrolls
224
- internally — rows are never sliced at the frame edge. */}
225
267
  <ScrollView flexShrink={1} maxHeight={panelMaxHeight}>
226
268
  <YStack {...knobProps.panelPadding} {...knobProps.gapLg}>
227
- <Text fontSize="$5" fontWeight="600">
269
+ <Text {...knobProps.heading} {...knobProps.label} fontWeight="600">
228
270
  {t("Search Options")}
229
271
  </Text>
230
272
 
231
- {/* Search Settings */}
232
273
  <YStack {...knobProps.gap}>
233
- <Text fontSize="$4" fontWeight="500">
274
+ <Text {...knobProps.label} fontWeight="500">
234
275
  {t("Search Settings")}
235
276
  </Text>
236
277
 
237
278
  <Checkbox
279
+ compact
238
280
  label={t("Case sensitive")}
239
281
  checked={searchOptions.caseSensitive}
240
282
  onCheckedChange={(checked) =>
@@ -243,18 +285,21 @@ function SearchOptionsPopover({
243
285
  />
244
286
 
245
287
  <Checkbox
288
+ compact
246
289
  label={t("Whole word only")}
247
290
  checked={searchOptions.wholeWord}
248
291
  onCheckedChange={(checked) => onOptionsChange({ wholeWord: checked as boolean })}
249
292
  />
250
293
 
251
294
  <Checkbox
295
+ compact
252
296
  label={t("Use regex")}
253
297
  checked={searchOptions.regex}
254
298
  onCheckedChange={(checked) => onOptionsChange({ regex: checked as boolean })}
255
299
  />
256
300
 
257
301
  <Checkbox
302
+ compact
258
303
  label={t("Highlight results")}
259
304
  checked={searchOptions.highlightResults}
260
305
  onCheckedChange={(checked) =>
@@ -265,14 +310,12 @@ function SearchOptionsPopover({
265
310
 
266
311
  <Separator />
267
312
 
268
- {/* Column Selection */}
269
313
  <YStack {...knobProps.gap}>
270
314
  <XStack justifyContent="space-between" alignItems="center">
271
- <Text fontSize="$4" fontWeight="500">
315
+ <Text {...knobProps.label} fontWeight="500">
272
316
  {t("Search Columns")}
273
317
  </Text>
274
- <Text fontSize="$2" color="$color10">
275
- {/* Bidi-isolated so RTL contexts can't reorder the count run */}
318
+ <Text {...knobProps.label} color={formCommonColors.muted}>
276
319
  {bidiIsolate(
277
320
  t("{{selected}} of {{total}}", {
278
321
  selected: selectedColumnCount,
@@ -282,25 +325,24 @@ function SearchOptionsPopover({
282
325
  </Text>
283
326
  </XStack>
284
327
 
285
- <XStack gap="$2">
286
- <Button size="$2" variant="outlined" onPress={handleSelectAllColumns}>
328
+ <XStack {...knobProps.gap}>
329
+ <Button size="$2" compact variant="outlined" onPress={handleSelectAllColumns}>
287
330
  {t("All")}
288
331
  </Button>
289
- <Button size="$2" variant="outlined" onPress={handleSelectNoColumns}>
332
+ <Button size="$2" compact variant="outlined" onPress={handleSelectNoColumns}>
290
333
  {t("None")}
291
334
  </Button>
292
335
  </XStack>
293
336
 
294
- {/* One scroll region for the whole panel body (above); a nested
295
- column scroller would trap wheel/drag inside 200px. */}
296
337
  <YStack gap="$1">
297
338
  {columns.map((col) => {
298
339
  const key = col.accessorKey || col.id || "";
299
340
  return (
300
341
  <Checkbox
301
342
  key={key}
343
+ compact
302
344
  label={col.header || key}
303
- checked={columnVisibility[key] || false}
345
+ checked={searchOptions.columns.includes(key)}
304
346
  onCheckedChange={(checked) => handleColumnToggle(key, checked as boolean)}
305
347
  />
306
348
  );
@@ -314,46 +356,53 @@ function SearchOptionsPopover({
314
356
  );
315
357
  }
316
358
 
317
- // Search Utilities
318
-
319
- function performSearch<T>(data: T[], options: SearchOptions): T[] {
320
- const { searchTerm, columns, caseSensitive, wholeWord, regex } = options;
359
+ interface CompiledPattern {
360
+ regex: RegExp | null;
361
+ invalid: boolean;
362
+ }
321
363
 
364
+ function compileSearchPattern(
365
+ options: Pick<SearchOptions, "searchTerm" | "caseSensitive" | "wholeWord" | "regex">,
366
+ ): CompiledPattern {
367
+ const { searchTerm, caseSensitive, wholeWord, regex } = options;
322
368
  if (!searchTerm.trim()) {
323
- return data;
369
+ return { regex: null, invalid: false };
324
370
  }
325
371
 
326
- let searchPattern: RegExp;
327
-
372
+ const flags = caseSensitive ? "" : "i";
328
373
  try {
329
374
  if (regex) {
330
- searchPattern = new RegExp(searchTerm, caseSensitive ? "g" : "gi");
331
- } else {
332
- const pattern = wholeWord ? `\\b${escapeRegex(searchTerm)}\\b` : escapeRegex(searchTerm);
333
- searchPattern = new RegExp(pattern, caseSensitive ? "g" : "gi");
375
+ return { regex: new RegExp(searchTerm, flags), invalid: false };
334
376
  }
377
+ const pattern = wholeWord ? `\\b${escapeRegex(searchTerm)}\\b` : escapeRegex(searchTerm);
378
+ return { regex: new RegExp(pattern, flags), invalid: false };
335
379
  } catch {
336
- // Invalid regex, return empty results
337
- return [];
380
+ return { regex: null, invalid: true };
338
381
  }
382
+ }
339
383
 
340
- return data.filter((item) => {
341
- return columns.some((columnKey) => {
342
- const value = (item as any)[columnKey];
384
+ function matchRows<T>(data: T[], columns: string[], searchPattern: RegExp): T[] {
385
+ return data.filter((item) =>
386
+ columns.some((columnKey) => {
387
+ const value = (item as Record<string, unknown>)[columnKey];
343
388
  if (value == null) return false;
389
+ searchPattern.lastIndex = 0;
390
+ return searchPattern.test(String(value));
391
+ }),
392
+ );
393
+ }
344
394
 
345
- const stringValue = String(value);
346
- return searchPattern.test(stringValue);
347
- });
348
- });
395
+ function performSearch<T>(data: T[], options: SearchOptions): T[] {
396
+ const compiled = compileSearchPattern(options);
397
+ if (!options.searchTerm.trim()) return data;
398
+ if (compiled.invalid || !compiled.regex) return [];
399
+ return matchRows(data, options.columns, compiled.regex);
349
400
  }
350
401
 
351
402
  function escapeRegex(string: string): string {
352
403
  return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
353
404
  }
354
405
 
355
- // Text Highlighting Utility
356
-
357
406
  export interface HighlightOptions {
358
407
  searchTerm: string;
359
408
  caseSensitive?: boolean;
@@ -370,64 +419,46 @@ function highlightText(text: string, options: HighlightOptions): React.ReactNode
370
419
  wholeWord = false,
371
420
  regex = false,
372
421
  highlightClassName = "search-highlight",
373
- highlightStyle: _highlightStyle = {
374
- backgroundColor: "var(--color-yellow3)",
375
- padding: "2px 4px",
376
- borderRadius: "3px",
377
- fontWeight: "bold",
378
- },
379
422
  } = options;
380
423
 
381
424
  if (!searchTerm.trim() || !text) {
382
425
  return text;
383
426
  }
384
427
 
385
- let searchPattern: RegExp;
386
-
387
- try {
388
- if (regex) {
389
- searchPattern = new RegExp(searchTerm, caseSensitive ? "g" : "gi");
390
- } else {
391
- const pattern = wholeWord ? `\\b${escapeRegex(searchTerm)}\\b` : escapeRegex(searchTerm);
392
- searchPattern = new RegExp(pattern, caseSensitive ? "g" : "gi");
393
- }
394
- } catch {
395
- return text;
396
- }
397
-
398
- const parts = text.split(searchPattern);
399
-
400
- if (parts.length === 1) {
401
- return text;
402
- }
403
-
404
- const matches = text.match(searchPattern) || [];
405
- const result: React.ReactNode[] = [];
406
-
407
- parts.forEach((part, index) => {
408
- result.push(part);
409
-
410
- if (index < parts.length - 1 && matches[index]) {
411
- result.push(
412
- <Text
413
- key={`highlight-${index}`}
414
- className={highlightClassName}
415
- backgroundColor="$yellow3"
416
- paddingHorizontal="$1"
417
- borderRadius="$1"
418
- fontWeight="bold"
419
- >
420
- {matches[index]}
421
- </Text>,
422
- );
423
- }
428
+ const compiled = compileSearchPattern({
429
+ searchTerm,
430
+ caseSensitive,
431
+ wholeWord,
432
+ regex,
424
433
  });
425
-
426
- return result;
434
+ if (!compiled.regex) return text;
435
+
436
+ const global = new RegExp(compiled.regex.source, compiled.regex.flags.includes("i") ? "gi" : "g");
437
+ const parts: React.ReactNode[] = [];
438
+ let last = 0;
439
+ let index = 0;
440
+ for (const match of text.matchAll(global)) {
441
+ const start = match.index ?? 0;
442
+ if (start > last) parts.push(text.slice(last, start));
443
+ parts.push(
444
+ <Text
445
+ key={`highlight-${index}`}
446
+ className={highlightClassName}
447
+ backgroundColor="$yellow3"
448
+ paddingHorizontal="$1"
449
+ borderRadius="$1"
450
+ fontWeight="bold"
451
+ >
452
+ {match[0]}
453
+ </Text>,
454
+ );
455
+ last = start + match[0].length;
456
+ index += 1;
457
+ }
458
+ if (last < text.length) parts.push(text.slice(last));
459
+ return parts.length ? parts : text;
427
460
  }
428
461
 
429
- // Hook for Full-Text Search
430
-
431
462
  export interface UseFullTextSearchOptions<T = any> {
432
463
  data: T[];
433
464
  columns: Array<{
@@ -468,7 +499,6 @@ export function useFullTextSearch<T = any>({
468
499
  highlightResults: true,
469
500
  });
470
501
 
471
- // Debounce search term
472
502
  useEffect(() => {
473
503
  const timer = setTimeout(() => {
474
504
  setDebouncedSearchTerm(searchTerm);
@@ -477,7 +507,6 @@ export function useFullTextSearch<T = any>({
477
507
  return () => clearTimeout(timer);
478
508
  }, [searchTerm, debounceMs]);
479
509
 
480
- // Perform search
481
510
  const searchResults = useMemo(() => {
482
511
  if (!debouncedSearchTerm.trim()) {
483
512
  return data;