@multiplatform.one/table 7.4.1 → 7.5.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 (353) hide show
  1. package/dist/cjs/components/ChildTable/index.cjs +12 -3
  2. package/dist/cjs/components/ChildTable/index.native.js +14 -3
  3. package/dist/cjs/components/ChildTable/index.native.js.map +1 -1
  4. package/dist/cjs/components/ColumnHeaderFilter/index.cjs +11 -13
  5. package/dist/cjs/components/ColumnHeaderFilter/index.native.js +11 -16
  6. package/dist/cjs/components/ColumnHeaderFilter/index.native.js.map +1 -1
  7. package/dist/cjs/components/DataTable/DataTableCardControls.cjs +7 -4
  8. package/dist/cjs/components/DataTable/DataTableCardControls.native.js +7 -4
  9. package/dist/cjs/components/DataTable/DataTableCardControls.native.js.map +1 -1
  10. package/dist/cjs/components/DataTable/DataTableDocumentList.cjs +10 -4
  11. package/dist/cjs/components/DataTable/DataTableDocumentList.native.js +10 -4
  12. package/dist/cjs/components/DataTable/DataTableDocumentList.native.js.map +1 -1
  13. package/dist/cjs/components/DataTable/DataTableMobileCards.cjs +6 -1
  14. package/dist/cjs/components/DataTable/DataTableMobileCards.native.js +6 -1
  15. package/dist/cjs/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  16. package/dist/cjs/components/DataTable/DataTableRoot.cjs +55 -42
  17. package/dist/cjs/components/DataTable/DataTableRoot.native.js +55 -42
  18. package/dist/cjs/components/DataTable/DataTableRoot.native.js.map +1 -1
  19. package/dist/cjs/components/DataTable/DataTableVirtualized.cjs +5 -2
  20. package/dist/cjs/components/DataTable/DataTableVirtualized.native.js +5 -2
  21. package/dist/cjs/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  22. package/dist/cjs/components/DataTable/dataTableChrome.cjs +59 -0
  23. package/dist/cjs/components/DataTable/dataTableChrome.native.js +62 -0
  24. package/dist/cjs/components/DataTable/dataTableChrome.native.js.map +1 -0
  25. package/dist/cjs/components/DataTable/index.native.js +34 -20
  26. package/dist/cjs/components/DataTable/index.native.js.map +1 -1
  27. package/dist/cjs/components/DataTableBulkActions/index.cjs +6 -4
  28. package/dist/cjs/components/DataTableBulkActions/index.native.js +6 -4
  29. package/dist/cjs/components/DataTableBulkActions/index.native.js.map +1 -1
  30. package/dist/cjs/components/DataTableCell/CellModalEditor.cjs +9 -31
  31. package/dist/cjs/components/DataTableCell/CellModalEditor.native.js +2 -5
  32. package/dist/cjs/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  33. package/dist/cjs/components/DataTableCell/CellOptionsEditor.cjs +0 -1
  34. package/dist/cjs/components/DataTableCell/CellOptionsEditor.native.js +0 -1
  35. package/dist/cjs/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  36. package/dist/cjs/components/DataTableColumnPinning/index.cjs +7 -4
  37. package/dist/cjs/components/DataTableColumnPinning/index.native.js +7 -4
  38. package/dist/cjs/components/DataTableColumnPinning/index.native.js.map +1 -1
  39. package/dist/cjs/components/DataTableDateFilter/index.cjs +24 -22
  40. package/dist/cjs/components/DataTableDateFilter/index.native.js +24 -22
  41. package/dist/cjs/components/DataTableDateFilter/index.native.js.map +1 -1
  42. package/dist/cjs/components/DataTableExport/index.cjs +42 -28
  43. package/dist/cjs/components/DataTableExport/index.native.js +42 -28
  44. package/dist/cjs/components/DataTableExport/index.native.js.map +1 -1
  45. package/dist/cjs/components/DataTableFacetMenu/index.cjs +10 -4
  46. package/dist/cjs/components/DataTableFacetMenu/index.native.js +10 -4
  47. package/dist/cjs/components/DataTableFacetMenu/index.native.js.map +1 -1
  48. package/dist/cjs/components/DataTableFilters/index.cjs +3 -3
  49. package/dist/cjs/components/DataTableFilters/index.native.js +3 -3
  50. package/dist/cjs/components/DataTableFilters/index.native.js.map +1 -1
  51. package/dist/cjs/components/DataTableGrouping/index.cjs +46 -41
  52. package/dist/cjs/components/DataTableGrouping/index.native.js +46 -41
  53. package/dist/cjs/components/DataTableGrouping/index.native.js.map +1 -1
  54. package/dist/cjs/components/DataTablePagination/index.cjs +4 -2
  55. package/dist/cjs/components/DataTablePagination/index.native.js +4 -2
  56. package/dist/cjs/components/DataTablePagination/index.native.js.map +1 -1
  57. package/dist/cjs/components/DataTableSearch/index.cjs +3 -3
  58. package/dist/cjs/components/DataTableSearch/index.native.js +3 -3
  59. package/dist/cjs/components/DataTableToolbar/index.cjs +19 -13
  60. package/dist/cjs/components/DataTableToolbar/index.native.js +19 -15
  61. package/dist/cjs/components/DataTableToolbar/index.native.js.map +1 -1
  62. package/dist/cjs/components/DataTableViewOptions/index.cjs +36 -35
  63. package/dist/cjs/components/DataTableViewOptions/index.native.js +36 -35
  64. package/dist/cjs/components/DataTableViewOptions/index.native.js.map +1 -1
  65. package/dist/cjs/components/KnobDialog.cjs +1 -3
  66. package/dist/cjs/components/KnobDialog.native.js +1 -3
  67. package/dist/cjs/components/KnobDialog.native.js.map +1 -1
  68. package/dist/cjs/components/SimpleTable/index.cjs +159 -117
  69. package/dist/cjs/components/SimpleTable/index.native.js +168 -128
  70. package/dist/cjs/components/SimpleTable/index.native.js.map +1 -1
  71. package/dist/cjs/components/TableInput/index.cjs +159 -90
  72. package/dist/cjs/components/TableInput/index.native.js +3 -3
  73. package/dist/cjs/components/TableInput/index.native.js.map +1 -1
  74. package/dist/cjs/utils/chromeIcons.cjs +31 -0
  75. package/dist/cjs/utils/chromeIcons.native.js +34 -0
  76. package/dist/cjs/utils/chromeIcons.native.js.map +1 -0
  77. package/dist/esm/components/ChildTable/index.mjs +12 -3
  78. package/dist/esm/components/ChildTable/index.mjs.map +1 -1
  79. package/dist/esm/components/ChildTable/index.native.js +14 -3
  80. package/dist/esm/components/ChildTable/index.native.js.map +1 -1
  81. package/dist/esm/components/ColumnHeaderFilter/index.mjs +11 -13
  82. package/dist/esm/components/ColumnHeaderFilter/index.mjs.map +1 -1
  83. package/dist/esm/components/ColumnHeaderFilter/index.native.js +11 -16
  84. package/dist/esm/components/ColumnHeaderFilter/index.native.js.map +1 -1
  85. package/dist/esm/components/DataTable/DataTableCardControls.mjs +7 -4
  86. package/dist/esm/components/DataTable/DataTableCardControls.mjs.map +1 -1
  87. package/dist/esm/components/DataTable/DataTableCardControls.native.js +7 -4
  88. package/dist/esm/components/DataTable/DataTableCardControls.native.js.map +1 -1
  89. package/dist/esm/components/DataTable/DataTableDocumentList.mjs +10 -4
  90. package/dist/esm/components/DataTable/DataTableDocumentList.mjs.map +1 -1
  91. package/dist/esm/components/DataTable/DataTableDocumentList.native.js +10 -4
  92. package/dist/esm/components/DataTable/DataTableDocumentList.native.js.map +1 -1
  93. package/dist/esm/components/DataTable/DataTableMobileCards.mjs +6 -1
  94. package/dist/esm/components/DataTable/DataTableMobileCards.mjs.map +1 -1
  95. package/dist/esm/components/DataTable/DataTableMobileCards.native.js +6 -1
  96. package/dist/esm/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  97. package/dist/esm/components/DataTable/DataTableRoot.mjs +55 -42
  98. package/dist/esm/components/DataTable/DataTableRoot.mjs.map +1 -1
  99. package/dist/esm/components/DataTable/DataTableRoot.native.js +55 -42
  100. package/dist/esm/components/DataTable/DataTableRoot.native.js.map +1 -1
  101. package/dist/esm/components/DataTable/DataTableVirtualized.mjs +5 -2
  102. package/dist/esm/components/DataTable/DataTableVirtualized.mjs.map +1 -1
  103. package/dist/esm/components/DataTable/DataTableVirtualized.native.js +5 -2
  104. package/dist/esm/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  105. package/dist/esm/components/DataTable/dataTableChrome.mjs +32 -0
  106. package/dist/esm/components/DataTable/dataTableChrome.mjs.map +1 -0
  107. package/dist/esm/components/DataTable/dataTableChrome.native.js +32 -0
  108. package/dist/esm/components/DataTable/dataTableChrome.native.js.map +1 -0
  109. package/dist/esm/components/DataTable/index.native.js +34 -20
  110. package/dist/esm/components/DataTable/index.native.js.map +1 -1
  111. package/dist/esm/components/DataTableBulkActions/index.mjs +6 -4
  112. package/dist/esm/components/DataTableBulkActions/index.mjs.map +1 -1
  113. package/dist/esm/components/DataTableBulkActions/index.native.js +6 -4
  114. package/dist/esm/components/DataTableBulkActions/index.native.js.map +1 -1
  115. package/dist/esm/components/DataTableCell/CellModalEditor.mjs +11 -33
  116. package/dist/esm/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  117. package/dist/esm/components/DataTableCell/CellModalEditor.native.js +2 -5
  118. package/dist/esm/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  119. package/dist/esm/components/DataTableCell/CellOptionsEditor.mjs +0 -1
  120. package/dist/esm/components/DataTableCell/CellOptionsEditor.mjs.map +1 -1
  121. package/dist/esm/components/DataTableCell/CellOptionsEditor.native.js +0 -1
  122. package/dist/esm/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  123. package/dist/esm/components/DataTableColumnPinning/index.mjs +7 -4
  124. package/dist/esm/components/DataTableColumnPinning/index.mjs.map +1 -1
  125. package/dist/esm/components/DataTableColumnPinning/index.native.js +7 -4
  126. package/dist/esm/components/DataTableColumnPinning/index.native.js.map +1 -1
  127. package/dist/esm/components/DataTableDateFilter/index.mjs +24 -22
  128. package/dist/esm/components/DataTableDateFilter/index.mjs.map +1 -1
  129. package/dist/esm/components/DataTableDateFilter/index.native.js +24 -22
  130. package/dist/esm/components/DataTableDateFilter/index.native.js.map +1 -1
  131. package/dist/esm/components/DataTableExport/index.mjs +43 -29
  132. package/dist/esm/components/DataTableExport/index.mjs.map +1 -1
  133. package/dist/esm/components/DataTableExport/index.native.js +43 -29
  134. package/dist/esm/components/DataTableExport/index.native.js.map +1 -1
  135. package/dist/esm/components/DataTableFacetMenu/index.mjs +10 -4
  136. package/dist/esm/components/DataTableFacetMenu/index.mjs.map +1 -1
  137. package/dist/esm/components/DataTableFacetMenu/index.native.js +10 -4
  138. package/dist/esm/components/DataTableFacetMenu/index.native.js.map +1 -1
  139. package/dist/esm/components/DataTableFilters/index.mjs +3 -3
  140. package/dist/esm/components/DataTableFilters/index.mjs.map +1 -1
  141. package/dist/esm/components/DataTableFilters/index.native.js +3 -3
  142. package/dist/esm/components/DataTableFilters/index.native.js.map +1 -1
  143. package/dist/esm/components/DataTableGrouping/index.mjs +47 -42
  144. package/dist/esm/components/DataTableGrouping/index.mjs.map +1 -1
  145. package/dist/esm/components/DataTableGrouping/index.native.js +47 -42
  146. package/dist/esm/components/DataTableGrouping/index.native.js.map +1 -1
  147. package/dist/esm/components/DataTablePagination/index.mjs +4 -2
  148. package/dist/esm/components/DataTablePagination/index.mjs.map +1 -1
  149. package/dist/esm/components/DataTablePagination/index.native.js +4 -2
  150. package/dist/esm/components/DataTablePagination/index.native.js.map +1 -1
  151. package/dist/esm/components/DataTableSearch/index.mjs +3 -3
  152. package/dist/esm/components/DataTableSearch/index.native.js +3 -3
  153. package/dist/esm/components/DataTableToolbar/index.mjs +19 -13
  154. package/dist/esm/components/DataTableToolbar/index.mjs.map +1 -1
  155. package/dist/esm/components/DataTableToolbar/index.native.js +19 -15
  156. package/dist/esm/components/DataTableToolbar/index.native.js.map +1 -1
  157. package/dist/esm/components/DataTableViewOptions/index.mjs +36 -35
  158. package/dist/esm/components/DataTableViewOptions/index.mjs.map +1 -1
  159. package/dist/esm/components/DataTableViewOptions/index.native.js +36 -35
  160. package/dist/esm/components/DataTableViewOptions/index.native.js.map +1 -1
  161. package/dist/esm/components/KnobDialog.mjs +1 -3
  162. package/dist/esm/components/KnobDialog.mjs.map +1 -1
  163. package/dist/esm/components/KnobDialog.native.js +1 -3
  164. package/dist/esm/components/KnobDialog.native.js.map +1 -1
  165. package/dist/esm/components/SimpleTable/index.mjs +160 -118
  166. package/dist/esm/components/SimpleTable/index.mjs.map +1 -1
  167. package/dist/esm/components/SimpleTable/index.native.js +169 -129
  168. package/dist/esm/components/SimpleTable/index.native.js.map +1 -1
  169. package/dist/esm/components/TableInput/index.mjs +160 -91
  170. package/dist/esm/components/TableInput/index.mjs.map +1 -1
  171. package/dist/esm/components/TableInput/index.native.js +3 -3
  172. package/dist/esm/components/TableInput/index.native.js.map +1 -1
  173. package/dist/esm/utils/chromeIcons.mjs +6 -0
  174. package/dist/esm/utils/chromeIcons.mjs.map +1 -0
  175. package/dist/esm/utils/chromeIcons.native.js +6 -0
  176. package/dist/esm/utils/chromeIcons.native.js.map +1 -0
  177. package/dist/jsx/components/ChildTable/index.mjs +12 -3
  178. package/dist/jsx/components/ChildTable/index.mjs.map +1 -1
  179. package/dist/jsx/components/ChildTable/index.native.js +14 -3
  180. package/dist/jsx/components/ChildTable/index.native.js.map +1 -1
  181. package/dist/jsx/components/ColumnHeaderFilter/index.mjs +11 -13
  182. package/dist/jsx/components/ColumnHeaderFilter/index.mjs.map +1 -1
  183. package/dist/jsx/components/ColumnHeaderFilter/index.native.js +11 -16
  184. package/dist/jsx/components/ColumnHeaderFilter/index.native.js.map +1 -1
  185. package/dist/jsx/components/DataTable/DataTableCardControls.mjs +7 -4
  186. package/dist/jsx/components/DataTable/DataTableCardControls.mjs.map +1 -1
  187. package/dist/jsx/components/DataTable/DataTableCardControls.native.js +7 -4
  188. package/dist/jsx/components/DataTable/DataTableCardControls.native.js.map +1 -1
  189. package/dist/jsx/components/DataTable/DataTableDocumentList.mjs +10 -4
  190. package/dist/jsx/components/DataTable/DataTableDocumentList.mjs.map +1 -1
  191. package/dist/jsx/components/DataTable/DataTableDocumentList.native.js +10 -4
  192. package/dist/jsx/components/DataTable/DataTableDocumentList.native.js.map +1 -1
  193. package/dist/jsx/components/DataTable/DataTableMobileCards.mjs +6 -1
  194. package/dist/jsx/components/DataTable/DataTableMobileCards.mjs.map +1 -1
  195. package/dist/jsx/components/DataTable/DataTableMobileCards.native.js +6 -1
  196. package/dist/jsx/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  197. package/dist/jsx/components/DataTable/DataTableRoot.mjs +55 -42
  198. package/dist/jsx/components/DataTable/DataTableRoot.mjs.map +1 -1
  199. package/dist/jsx/components/DataTable/DataTableRoot.native.js +55 -42
  200. package/dist/jsx/components/DataTable/DataTableRoot.native.js.map +1 -1
  201. package/dist/jsx/components/DataTable/DataTableVirtualized.mjs +5 -2
  202. package/dist/jsx/components/DataTable/DataTableVirtualized.mjs.map +1 -1
  203. package/dist/jsx/components/DataTable/DataTableVirtualized.native.js +5 -2
  204. package/dist/jsx/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  205. package/dist/jsx/components/DataTable/dataTableChrome.mjs +32 -0
  206. package/dist/jsx/components/DataTable/dataTableChrome.mjs.map +1 -0
  207. package/dist/jsx/components/DataTable/dataTableChrome.native.js +62 -0
  208. package/dist/jsx/components/DataTable/dataTableChrome.native.js.map +1 -0
  209. package/dist/jsx/components/DataTable/index.native.js +34 -20
  210. package/dist/jsx/components/DataTable/index.native.js.map +1 -1
  211. package/dist/jsx/components/DataTableBulkActions/index.mjs +6 -4
  212. package/dist/jsx/components/DataTableBulkActions/index.mjs.map +1 -1
  213. package/dist/jsx/components/DataTableBulkActions/index.native.js +6 -4
  214. package/dist/jsx/components/DataTableBulkActions/index.native.js.map +1 -1
  215. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs +11 -33
  216. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  217. package/dist/jsx/components/DataTableCell/CellModalEditor.native.js +2 -5
  218. package/dist/jsx/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  219. package/dist/jsx/components/DataTableCell/CellOptionsEditor.mjs +0 -1
  220. package/dist/jsx/components/DataTableCell/CellOptionsEditor.mjs.map +1 -1
  221. package/dist/jsx/components/DataTableCell/CellOptionsEditor.native.js +0 -1
  222. package/dist/jsx/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  223. package/dist/jsx/components/DataTableColumnPinning/index.mjs +7 -4
  224. package/dist/jsx/components/DataTableColumnPinning/index.mjs.map +1 -1
  225. package/dist/jsx/components/DataTableColumnPinning/index.native.js +7 -4
  226. package/dist/jsx/components/DataTableColumnPinning/index.native.js.map +1 -1
  227. package/dist/jsx/components/DataTableDateFilter/index.mjs +24 -22
  228. package/dist/jsx/components/DataTableDateFilter/index.mjs.map +1 -1
  229. package/dist/jsx/components/DataTableDateFilter/index.native.js +24 -22
  230. package/dist/jsx/components/DataTableDateFilter/index.native.js.map +1 -1
  231. package/dist/jsx/components/DataTableExport/index.mjs +43 -29
  232. package/dist/jsx/components/DataTableExport/index.mjs.map +1 -1
  233. package/dist/jsx/components/DataTableExport/index.native.js +42 -28
  234. package/dist/jsx/components/DataTableExport/index.native.js.map +1 -1
  235. package/dist/jsx/components/DataTableFacetMenu/index.mjs +10 -4
  236. package/dist/jsx/components/DataTableFacetMenu/index.mjs.map +1 -1
  237. package/dist/jsx/components/DataTableFacetMenu/index.native.js +10 -4
  238. package/dist/jsx/components/DataTableFacetMenu/index.native.js.map +1 -1
  239. package/dist/jsx/components/DataTableFilters/index.mjs +3 -3
  240. package/dist/jsx/components/DataTableFilters/index.mjs.map +1 -1
  241. package/dist/jsx/components/DataTableFilters/index.native.js +3 -3
  242. package/dist/jsx/components/DataTableFilters/index.native.js.map +1 -1
  243. package/dist/jsx/components/DataTableGrouping/index.mjs +47 -42
  244. package/dist/jsx/components/DataTableGrouping/index.mjs.map +1 -1
  245. package/dist/jsx/components/DataTableGrouping/index.native.js +46 -41
  246. package/dist/jsx/components/DataTableGrouping/index.native.js.map +1 -1
  247. package/dist/jsx/components/DataTablePagination/index.mjs +4 -2
  248. package/dist/jsx/components/DataTablePagination/index.mjs.map +1 -1
  249. package/dist/jsx/components/DataTablePagination/index.native.js +4 -2
  250. package/dist/jsx/components/DataTablePagination/index.native.js.map +1 -1
  251. package/dist/jsx/components/DataTableSearch/index.mjs +3 -3
  252. package/dist/jsx/components/DataTableSearch/index.native.js +3 -3
  253. package/dist/jsx/components/DataTableToolbar/index.mjs +19 -13
  254. package/dist/jsx/components/DataTableToolbar/index.mjs.map +1 -1
  255. package/dist/jsx/components/DataTableToolbar/index.native.js +19 -15
  256. package/dist/jsx/components/DataTableToolbar/index.native.js.map +1 -1
  257. package/dist/jsx/components/DataTableViewOptions/index.mjs +36 -35
  258. package/dist/jsx/components/DataTableViewOptions/index.mjs.map +1 -1
  259. package/dist/jsx/components/DataTableViewOptions/index.native.js +36 -35
  260. package/dist/jsx/components/DataTableViewOptions/index.native.js.map +1 -1
  261. package/dist/jsx/components/KnobDialog.mjs +1 -3
  262. package/dist/jsx/components/KnobDialog.mjs.map +1 -1
  263. package/dist/jsx/components/KnobDialog.native.js +1 -3
  264. package/dist/jsx/components/KnobDialog.native.js.map +1 -1
  265. package/dist/jsx/components/SimpleTable/index.mjs +160 -118
  266. package/dist/jsx/components/SimpleTable/index.mjs.map +1 -1
  267. package/dist/jsx/components/SimpleTable/index.native.js +168 -128
  268. package/dist/jsx/components/SimpleTable/index.native.js.map +1 -1
  269. package/dist/jsx/components/TableInput/index.mjs +160 -91
  270. package/dist/jsx/components/TableInput/index.mjs.map +1 -1
  271. package/dist/jsx/components/TableInput/index.native.js +3 -3
  272. package/dist/jsx/components/TableInput/index.native.js.map +1 -1
  273. package/dist/jsx/utils/chromeIcons.mjs +6 -0
  274. package/dist/jsx/utils/chromeIcons.mjs.map +1 -0
  275. package/dist/jsx/utils/chromeIcons.native.js +34 -0
  276. package/dist/jsx/utils/chromeIcons.native.js.map +1 -0
  277. package/package.json +12 -12
  278. package/src/components/ChildTable/ChildTable.stories.tsx +144 -0
  279. package/src/components/ChildTable/childTable.reorder.spec.tsx +65 -0
  280. package/src/components/ChildTable/childTable.spec.tsx +108 -0
  281. package/src/components/ChildTable/index.tsx +21 -2
  282. package/src/components/ColumnHeaderFilter/index.tsx +9 -14
  283. package/src/components/DataTable/DataTableCardControls.tsx +19 -16
  284. package/src/components/DataTable/DataTableDocumentList.tsx +7 -4
  285. package/src/components/DataTable/DataTableMobileCards.tsx +3 -1
  286. package/src/components/DataTable/DataTableRoot.tsx +52 -41
  287. package/src/components/DataTable/DataTableVirtualized.tsx +6 -2
  288. package/src/components/DataTable/FieldsInCells.stories.tsx +10 -5
  289. package/src/components/DataTable/dataTableChrome.ts +48 -0
  290. package/src/components/DataTable/designLaw.spec.tsx +114 -0
  291. package/src/components/DataTable/index.native.tsx +46 -20
  292. package/src/components/DataTableBulkActions/index.tsx +5 -3
  293. package/src/components/DataTableCell/CellModalEditor.native.tsx +3 -6
  294. package/src/components/DataTableCell/CellModalEditor.tsx +11 -22
  295. package/src/components/DataTableCell/CellOptionsEditor.tsx +0 -1
  296. package/src/components/DataTableCell/cellDraftPolicy.spec.tsx +8 -1
  297. package/src/components/DataTableCell/cellModalEditor.spec.tsx +82 -0
  298. package/src/components/DataTableCell/dataTableCell.spec.tsx +8 -1
  299. package/src/components/DataTableColumnPinning/index.tsx +6 -4
  300. package/src/components/DataTableDateFilter/index.tsx +19 -17
  301. package/src/components/DataTableExport/DataTableExport.spec.tsx +29 -0
  302. package/src/components/DataTableExport/index.tsx +47 -23
  303. package/src/components/DataTableFacetMenu/index.tsx +13 -4
  304. package/src/components/DataTableFilters/index.tsx +3 -3
  305. package/src/components/DataTableGrouping/index.tsx +42 -35
  306. package/src/components/DataTablePagination/index.tsx +2 -2
  307. package/src/components/DataTableSearch/index.tsx +3 -3
  308. package/src/components/DataTableToolbar/DataTableToolbar.spec.tsx +20 -0
  309. package/src/components/DataTableToolbar/DataTableToolbar.stories.tsx +1 -9
  310. package/src/components/DataTableToolbar/index.tsx +19 -14
  311. package/src/components/DataTableViewOptions/index.tsx +30 -30
  312. package/src/components/KnobDialog.tsx +1 -3
  313. package/src/components/SimpleTable/SimpleTable.stories.tsx +13 -0
  314. package/src/components/SimpleTable/index.tsx +171 -149
  315. package/src/components/SimpleTable/simpleTable.spec.tsx +120 -0
  316. package/src/components/TableInput/index.native.tsx +5 -3
  317. package/src/components/TableInput/index.tsx +207 -113
  318. package/src/components/chromeDesignLaw.spec.tsx +97 -0
  319. package/src/utils/chromeIcons.ts +6 -0
  320. package/types/components/ChildTable/index.d.ts +6 -1
  321. package/types/components/ChildTable/index.d.ts.map +1 -1
  322. package/types/components/ColumnHeaderFilter/index.d.ts.map +1 -1
  323. package/types/components/DataTable/DataTableCardControls.d.ts.map +1 -1
  324. package/types/components/DataTable/DataTableDocumentList.d.ts.map +1 -1
  325. package/types/components/DataTable/DataTableMobileCards.d.ts.map +1 -1
  326. package/types/components/DataTable/DataTableRoot.d.ts +6 -1
  327. package/types/components/DataTable/DataTableRoot.d.ts.map +1 -1
  328. package/types/components/DataTable/DataTableVirtualized.d.ts +3 -1
  329. package/types/components/DataTable/DataTableVirtualized.d.ts.map +1 -1
  330. package/types/components/DataTable/dataTableChrome.d.ts +27 -0
  331. package/types/components/DataTable/dataTableChrome.d.ts.map +1 -0
  332. package/types/components/DataTable/index.native.d.ts +1 -1
  333. package/types/components/DataTable/index.native.d.ts.map +1 -1
  334. package/types/components/DataTableBulkActions/index.d.ts.map +1 -1
  335. package/types/components/DataTableCell/CellModalEditor.d.ts.map +1 -1
  336. package/types/components/DataTableCell/CellModalEditor.native.d.ts.map +1 -1
  337. package/types/components/DataTableCell/CellOptionsEditor.d.ts.map +1 -1
  338. package/types/components/DataTableColumnPinning/index.d.ts.map +1 -1
  339. package/types/components/DataTableDateFilter/index.d.ts.map +1 -1
  340. package/types/components/DataTableExport/index.d.ts.map +1 -1
  341. package/types/components/DataTableFacetMenu/index.d.ts.map +1 -1
  342. package/types/components/DataTableGrouping/index.d.ts.map +1 -1
  343. package/types/components/DataTableToolbar/index.d.ts +2 -0
  344. package/types/components/DataTableToolbar/index.d.ts.map +1 -1
  345. package/types/components/DataTableViewOptions/index.d.ts.map +1 -1
  346. package/types/components/KnobDialog.d.ts.map +1 -1
  347. package/types/components/SimpleTable/index.d.ts.map +1 -1
  348. package/types/components/TableInput/index.d.ts +8 -4
  349. package/types/components/TableInput/index.d.ts.map +1 -1
  350. package/types/components/TableInput/index.native.d.ts +2 -0
  351. package/types/components/TableInput/index.native.d.ts.map +1 -1
  352. package/types/utils/chromeIcons.d.ts +3 -0
  353. package/types/utils/chromeIcons.d.ts.map +1 -0
@@ -612,4 +612,33 @@ describe("DataTableExport", () => {
612
612
  expect(mockOnExport).toHaveBeenCalledTimes(1);
613
613
  });
614
614
  });
615
+
616
+ it("surfaces an inline error when Blob URLs are unavailable", async () => {
617
+ const previous = Object.getOwnPropertyDescriptor(window.URL, "createObjectURL");
618
+ Object.defineProperty(window.URL, "createObjectURL", {
619
+ configurable: true,
620
+ writable: true,
621
+ value: undefined,
622
+ });
623
+ try {
624
+ renderWithProviders(<DataTableExport data={mockData} columns={mockColumns} />);
625
+ fireEvent.click(screen.getByRole("button", { name: /Export as CSV/i }));
626
+ await waitFor(() => {
627
+ expect(screen.getByRole("alert").textContent).toMatch(
628
+ /not available on this platform/i,
629
+ );
630
+ });
631
+ expect(mockCreateObjectURL).not.toHaveBeenCalled();
632
+ } finally {
633
+ if (previous) {
634
+ Object.defineProperty(window.URL, "createObjectURL", previous);
635
+ } else {
636
+ Object.defineProperty(window.URL, "createObjectURL", {
637
+ configurable: true,
638
+ writable: true,
639
+ value: mockCreateObjectURL,
640
+ });
641
+ }
642
+ }
643
+ });
615
644
  });
@@ -9,8 +9,9 @@ import { downloadBlob } from "@multiplatform.one/platform";
9
9
  import { formatCalendarDate, useResolvedKnobs } from "@multiplatform.one/theme";
10
10
  import { useState } from "react";
11
11
  import { Button, Checkbox, Input } from "@multiplatform.one/forms";
12
- import { Popover, ScrollView, Separator, Text, XStack, YStack } from "tamagui";
12
+ import { Popover, ScrollView, Separator, Text, XStack, YStack, isWeb } from "tamagui";
13
13
  import type { DataTableField } from "../../types";
14
+ import { iconSizeForToken } from "../../utils/chromeIcons";
14
15
  import { getViewLeafRows } from "../../utils/viewData";
15
16
  import { useDataTableState } from "../DataTable/DataTableStateContext";
16
17
 
@@ -74,13 +75,16 @@ export function DataTableExport<T = any>(props: DataTableExportProps<T>) {
74
75
  const data = props.data ?? (ctx ? getViewLeafRows<T>(ctx.table) : []);
75
76
  const columns = props.columns ?? (ctx ? extractColumnsFromTable(ctx.table) : []);
76
77
 
78
+ const { knobProps } = useResolvedKnobs();
79
+ const iconPx = iconSizeForToken(String(knobProps.sizeToken));
80
+
77
81
  const {
78
82
  filename = "export",
79
83
  exportFormats = [
80
84
  {
81
85
  id: "csv",
82
86
  label: "CSV",
83
- icon: <FileTextIcon size={16} />,
87
+ icon: <FileTextIcon size={iconPx} />,
84
88
  extension: "csv",
85
89
  mimeType: "text/csv",
86
90
  description: "Comma-separated values",
@@ -89,7 +93,7 @@ export function DataTableExport<T = any>(props: DataTableExportProps<T>) {
89
93
  {
90
94
  id: "excel",
91
95
  label: "Excel",
92
- icon: <FileXlsIcon size={16} />,
96
+ icon: <FileXlsIcon size={iconPx} />,
93
97
  extension: "xlsx",
94
98
  mimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
95
99
  description: "Microsoft Excel format",
@@ -98,7 +102,7 @@ export function DataTableExport<T = any>(props: DataTableExportProps<T>) {
98
102
  {
99
103
  id: "pdf",
100
104
  label: "PDF",
101
- icon: <FileTextIcon size={16} />,
105
+ icon: <FileTextIcon size={iconPx} />,
102
106
  extension: "pdf",
103
107
  mimeType: "application/pdf",
104
108
  description: "Portable document format",
@@ -107,7 +111,7 @@ export function DataTableExport<T = any>(props: DataTableExportProps<T>) {
107
111
  {
108
112
  id: "json",
109
113
  label: "JSON",
110
- icon: <FileJsIcon size={16} />,
114
+ icon: <FileJsIcon size={iconPx} />,
111
115
  extension: "json",
112
116
  mimeType: "application/json",
113
117
  description: "JavaScript object notation",
@@ -118,7 +122,6 @@ export function DataTableExport<T = any>(props: DataTableExportProps<T>) {
118
122
  disabled = false,
119
123
  } = props;
120
124
 
121
- const { knobProps } = useResolvedKnobs();
122
125
  const [isExporting, setIsExporting] = useState<string | null>(null);
123
126
  const [exportError, setExportError] = useState<string | null>(null);
124
127
  const [exportOptions, setExportOptions] = useState<Partial<ExportOptions>>({
@@ -201,7 +204,7 @@ export function DataTableExport<T = any>(props: DataTableExportProps<T>) {
201
204
  <Button
202
205
  size={knobProps.sizeToken}
203
206
  chromeless
204
- icon={<PrinterIcon size={16} />}
207
+ icon={<PrinterIcon size={iconPx} />}
205
208
  disabled={disabled || isExporting === "print"}
206
209
  onPress={handlePrint}
207
210
  aria-label="Print table"
@@ -273,6 +276,7 @@ function ExportOptionsPopover({
273
276
  columns,
274
277
  }: ExportOptionsPopoverProps) {
275
278
  const { knobProps } = useResolvedKnobs();
279
+ const iconPx = iconSizeForToken(String(knobProps.sizeToken));
276
280
  const sz = knobProps.sizeToken;
277
281
  const popoverMinWidth = sz === "$3" ? 240 : sz === "$5" ? 360 : 300;
278
282
  const [selectedColumns, setSelectedColumns] = useState<Set<string>>(
@@ -293,7 +297,7 @@ function ExportOptionsPopover({
293
297
  <Button
294
298
  size={knobProps.sizeToken}
295
299
  chromeless
296
- icon={<GearIcon size={16} />}
300
+ icon={<GearIcon size={iconPx} />}
297
301
  disabled={disabled}
298
302
  aria-label="Export options"
299
303
  >
@@ -302,9 +306,7 @@ function ExportOptionsPopover({
302
306
  </Popover.Trigger>
303
307
 
304
308
  <Popover.Content
305
- {...knobProps.borderRadius}
306
- borderWidth={1}
307
- borderColor="$borderColor"
309
+ {...knobProps.elevatedSurface}
308
310
  transition={knobProps.transition}
309
311
  enterStyle={{ x: 0, y: -10, opacity: 0 }}
310
312
  exitStyle={{ x: 0, y: -10, opacity: 0 }}
@@ -317,13 +319,13 @@ function ExportOptionsPopover({
317
319
  DataTableDateFilter). */}
318
320
  <Popover.ScrollView minHeight={0}>
319
321
  <YStack {...knobProps.panelPadding} gap="$4">
320
- <Text fontSize="$5" fontWeight="600">
322
+ <Text {...knobProps.label} fontWeight="400">
321
323
  Export Options
322
324
  </Text>
323
325
 
324
326
  {/* Filename */}
325
327
  <YStack gap="$2">
326
- <Text fontSize="$3" fontWeight="500">
328
+ <Text {...knobProps.label} fontWeight="400">
327
329
  Filename
328
330
  </Text>
329
331
  <Input
@@ -352,7 +354,7 @@ function ExportOptionsPopover({
352
354
 
353
355
  {/* Column Selection */}
354
356
  <YStack gap="$2">
355
- <Text fontSize="$3" fontWeight="500">
357
+ <Text {...knobProps.label} fontWeight="400">
356
358
  Select Columns ({selectedColumns.size} of {availableColumns.length})
357
359
  </Text>
358
360
  <ScrollView maxHeight={200}>
@@ -385,7 +387,7 @@ function ExportOptionsPopover({
385
387
 
386
388
  {/* Export Formats */}
387
389
  <YStack gap="$2">
388
- <Text fontSize="$4" fontWeight="500">
390
+ <Text {...knobProps.label} fontWeight="400">
389
391
  Export Formats
390
392
  </Text>
391
393
  {exportFormats.map((format) => (
@@ -399,7 +401,7 @@ function ExportOptionsPopover({
399
401
  icon={format.icon}
400
402
  >
401
403
  <YStack gap="$1">
402
- <Text fontSize="$3" fontWeight="500">
404
+ <Text {...knobProps.label} fontWeight="400">
403
405
  {format.label}
404
406
  </Text>
405
407
  <Text fontSize="$2" color="$color10">
@@ -424,7 +426,7 @@ function ExportOptionsPopover({
424
426
  justifyContent="flex-start"
425
427
  disabled={disabled || isExporting === "print"}
426
428
  onPress={onPrint}
427
- icon={<PrinterIcon size={16} />}
429
+ icon={<PrinterIcon size={iconPx} />}
428
430
  >
429
431
  Print Table
430
432
  {isExporting === "print" && (
@@ -671,6 +673,9 @@ async function exportAsPDF<T>(
671
673
  // interpolation) so cell values containing markup cannot inject into the
672
674
  // print document (XSS via `<img onerror>`-style data).
673
675
  async function printTable<T>(data: T[], columns: ExportColumn[]): Promise<void> {
676
+ if (!isWeb || typeof window.open !== "function") {
677
+ throw new Error("Print is not available on this platform.");
678
+ }
674
679
  const printWindow = window.open("", "_blank");
675
680
  if (!printWindow) {
676
681
  throw new Error("Print window was blocked. Allow popups for this site and try again.");
@@ -681,12 +686,16 @@ async function printTable<T>(data: T[], columns: ExportColumn[]): Promise<void>
681
686
 
682
687
  const style = doc.createElement("style");
683
688
  style.textContent = `
684
- body { font-family: Arial, sans-serif; margin: 20px; }
689
+ /* Explicit print theme (Part 3 DataTableExport): scheme-safe paper palette,
690
+ not page chrome. Headers use the 400/700 weight ladder — never 500/600. */
691
+ body { color: CanvasText; background: Canvas; font-family: system-ui, sans-serif; margin: 20px; }
685
692
  table { width: 100%; border-collapse: collapse; }
686
- th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
687
- th { background-color: #f2f2f2; font-weight: bold; }
688
- tr:nth-child(even) { background-color: #f9f9f9; }
689
- @media print { body { margin: 0; } }
693
+ th, td { border: 1px solid CanvasText; padding: 8px; text-align: left; }
694
+ th { font-weight: 700; }
695
+ @media print {
696
+ body { color: #111; background: #fff; margin: 0; }
697
+ th, td { border-color: #111; }
698
+ }
690
699
  `;
691
700
  doc.head.appendChild(style);
692
701
 
@@ -724,8 +733,23 @@ async function printTable<T>(data: T[], columns: ExportColumn[]): Promise<void>
724
733
  printWindow.print();
725
734
  }
726
735
 
727
- // Utility function
736
+ // Web-only download. Native/GTK have no Blob-URL download path (MPO-22);
737
+ // throw so the inline alert fires instead of a silent console.warn no-op.
738
+ function assertWebFileDownload(): void {
739
+ if (
740
+ !isWeb ||
741
+ typeof document === "undefined" ||
742
+ typeof URL === "undefined" ||
743
+ typeof URL.createObjectURL !== "function"
744
+ ) {
745
+ throw new Error(
746
+ "File download is not available on this platform. Provide an onExport handler.",
747
+ );
748
+ }
749
+ }
750
+
728
751
  function downloadFile(content: string, filename: string, mimeType: string): void {
752
+ assertWebFileDownload();
729
753
  const blob = new Blob([content], { type: mimeType });
730
754
  downloadBlob(blob, filename);
731
755
  }
@@ -24,10 +24,12 @@
24
24
  import { CaretDownIcon } from "@phosphor-icons/react";
25
25
  import { DropdownMenu, type DropdownMenuPlacement } from "@multiplatform.one/components";
26
26
  import { Button, Spinner } from "@multiplatform.one/forms";
27
+ import { useResolvedKnobs } from "@multiplatform.one/theme";
27
28
  import type { ReactNode } from "react";
28
29
  import { useCallback } from "react";
29
30
  import { Text, XStack, withStaticProperties } from "tamagui";
30
31
  import { t } from "../../shared/t";
32
+ import { iconSizeForToken } from "../../utils/chromeIcons";
31
33
 
32
34
  export interface DataTableFacetOption {
33
35
  /** Raw facet value (user id, tag, status value, …). */
@@ -120,6 +122,8 @@ function DataTableFacetMenuComponent({
120
122
  placement = "bottom-start",
121
123
  children,
122
124
  }: DataTableFacetMenuProps) {
125
+ const { knobProps } = useResolvedKnobs();
126
+ const iconPx = iconSizeForToken(String(knobProps.sizeToken));
123
127
  const active = activeValues ?? [];
124
128
  const activeCount = active.length;
125
129
 
@@ -154,7 +158,13 @@ function DataTableFacetMenuComponent({
154
158
  />
155
159
  ))}
156
160
  {(options?.length ?? 0) === 0 && !loading && (
157
- <Text fontSize="$2" color="$color10" paddingHorizontal="$3" paddingVertical="$2">
161
+ <Text
162
+ {...knobProps.label}
163
+ fontWeight="400"
164
+ color="$color10"
165
+ paddingHorizontal="$3"
166
+ paddingVertical="$2"
167
+ >
158
168
  {t("No options")}
159
169
  </Text>
160
170
  )}
@@ -165,12 +175,11 @@ function DataTableFacetMenuComponent({
165
175
  <DropdownMenu placement={placement}>
166
176
  <DropdownMenu.Trigger asChild>
167
177
  <Button
168
- size="$3"
169
- compact
178
+ size={knobProps.sizeToken}
170
179
  // Active facet = accent trigger with count — the same active
171
180
  // anatomy as DataTableFilterButton ("Filter (n)").
172
181
  {...(activeCount > 0 ? { accent: true } : { variant: "outlined" as const })}
173
- iconAfter={<CaretDownIcon size={14} />}
182
+ iconAfter={<CaretDownIcon size={iconPx} />}
174
183
  aria-haspopup="menu"
175
184
  aria-label={label}
176
185
  {...(disabled ? { disabled } : {})}
@@ -60,11 +60,11 @@ export function DataTableFilters(props: DataTableFiltersProps) {
60
60
  const onClearFilters = props.onClearFilters ?? ctx?.actions.clearFilters ?? (() => {});
61
61
  const availableColumns = props.availableColumns ?? [];
62
62
 
63
- const { maxFilters = 10, showFilterCount = true, compact = false } = props;
63
+ const { maxFilters = 10, showFilterCount = true, compact } = props;
64
64
 
65
65
  const [builderOpen, setBuilderOpen] = useState(false);
66
66
  const [editingId, setEditingId] = useState<string | null>(null);
67
- const { knobProps } = useResolvedKnobs({ compact });
67
+ const { knobProps } = useResolvedKnobs(compact === undefined ? undefined : { compact });
68
68
 
69
69
  const canAddMoreFilters = filters.length < maxFilters;
70
70
  const editingFilter = editingId ? (filters.find((f) => f.id === editingId) ?? null) : null;
@@ -223,7 +223,7 @@ function FilterBuilder({
223
223
 
224
224
  return (
225
225
  <YStack {...knobProps.panelPadding} gap="$3" minWidth={280} maxWidth={360}>
226
- <Text fontSize="$3" fontWeight="600" color="$color12">
226
+ <Text fontSize="$3" fontWeight="400" color="$color12">
227
227
  {editingFilter ? t("Edit filter") : t("Add filter")}
228
228
  </Text>
229
229
 
@@ -18,7 +18,6 @@ import {
18
18
  formatNumber,
19
19
  getGroupPosition,
20
20
  hairline,
21
- sizeRecipeForToken,
22
21
  stackEdgeRadius,
23
22
  stackRadiusProps,
24
23
  useResolvedKnobs,
@@ -28,6 +27,7 @@ import { useCallback, useMemo, useState } from "react";
28
27
  import { Button, Select } from "@multiplatform.one/forms";
29
28
  import { Popover, Separator, Text, View, XStack, YStack, isWeb } from "tamagui";
30
29
  import { getViewLeafRows } from "../../utils/viewData";
30
+ import { iconSizeForToken } from "../../utils/chromeIcons";
31
31
  import { useDataTableState } from "../DataTable/DataTableStateContext";
32
32
 
33
33
  export type AggregationFunction = "count" | "sum" | "avg" | "min" | "max" | "custom";
@@ -111,15 +111,18 @@ const groupMetaSizeMap: Record<string, string> = {
111
111
 
112
112
  // Chevron/tree glyphs are control-internal icons (LC-75/LC-79): the
113
113
  // generated recipe's icon channel (lossless vs the old $3/$4/$5 map).
114
- const groupIconSize = (token: string): number => sizeRecipeForToken(token).iconSize;
115
-
116
- const startRail = isWeb
117
- ? {
118
- borderInlineStartWidth: 4,
119
- borderInlineStartStyle: "solid" as const,
120
- borderInlineStartColor: "$color6",
121
- }
122
- : { borderStartWidth: 4, borderStartColor: "$color6" };
114
+ const groupIconSize = (token: string): number => iconSizeForToken(token);
115
+
116
+ function groupStartRail(borderWidth: number) {
117
+ const width = borderWidth === 0 ? 0 : borderWidth * 4;
118
+ return isWeb
119
+ ? {
120
+ borderInlineStartWidth: width,
121
+ borderInlineStartStyle: "solid" as const,
122
+ borderInlineStartColor: "$color6",
123
+ }
124
+ : { borderStartWidth: width, borderStartColor: "$color6" };
125
+ }
123
126
 
124
127
  function groupIndent(space: string | undefined, level: number): number {
125
128
  return (groupIndentStepMap[space ?? "medium"] ?? 16) * Math.max(0, level);
@@ -390,7 +393,7 @@ function GroupHeader<T = any>({
390
393
  return (
391
394
  <XStack
392
395
  {...corners}
393
- {...startRail}
396
+ {...groupStartRail(Number(knobProps.borderRadius.borderWidth) || 0)}
394
397
  alignItems="center"
395
398
  gap="$2"
396
399
  minHeight={44}
@@ -428,7 +431,7 @@ function GroupHeader<T = any>({
428
431
 
429
432
  <XStack flex={1} alignItems="center" justifyContent="space-between" gap="$3" flexWrap="wrap">
430
433
  <XStack alignItems="center" gap="$2" flexShrink={1} minWidth={0}>
431
- <Text fontSize={knobProps.sizeToken} fontWeight="600" numberOfLines={1}>
434
+ <Text {...knobProps.label} fontWeight="400" numberOfLines={1}>
432
435
  {label}
433
436
  </Text>
434
437
  <Text fontSize={metaSize} color="$color10">
@@ -443,7 +446,7 @@ function GroupHeader<T = any>({
443
446
  <Text fontSize={metaSize} color="$color10">
444
447
  {`${agg.label || `${agg.function}(${agg.column})`}:`}
445
448
  </Text>
446
- <Text fontSize={metaSize} fontWeight="600">
449
+ <Text {...knobProps.label} fontWeight="400">
447
450
  {formatAggregateValue(group.aggregations[agg.column]?.[agg.function], agg)}
448
451
  </Text>
449
452
  </XStack>
@@ -470,6 +473,7 @@ function GroupItems<T = any>({ items, columns = [], level, stackEnd }: GroupItem
470
473
  const { knobProps } = useResolvedKnobs();
471
474
  const metaSize = groupMetaSizeMap[knobProps.sizeToken] ?? "$3";
472
475
  const indent = groupIndent(knobProps.space, level);
476
+ const iconSize = groupIconSize(String(knobProps.sizeToken));
473
477
  return (
474
478
  <YStack>
475
479
  {items.map((item, index) => {
@@ -485,7 +489,7 @@ function GroupItems<T = any>({ items, columns = [], level, stackEnd }: GroupItem
485
489
  <XStack
486
490
  {...corners}
487
491
  padding={groupItemPaddingMap[knobProps.space] ?? "$2"}
488
- paddingInlineStart={indent + 12}
492
+ paddingInlineStart={indent + iconSize}
489
493
  overflow="hidden"
490
494
  backgroundColor={index % 2 === 0 ? "$background" : "$color2"}
491
495
  hoverStyle={{ backgroundColor: "$backgroundHover", ...corners }}
@@ -650,7 +654,7 @@ export function DataTableGroupingConfig<T = any>(props: DataTableGroupingConfigP
650
654
  minWidth={20}
651
655
  alignItems="center"
652
656
  >
653
- <Text fontSize="$2" color="$color12" fontWeight="600">
657
+ <Text {...knobProps.label} fontWeight="400" color="$color12">
654
658
  {currentConfig.columns.length + currentConfig.aggregations.length}
655
659
  </Text>
656
660
  </View>
@@ -660,9 +664,7 @@ export function DataTableGroupingConfig<T = any>(props: DataTableGroupingConfigP
660
664
  </Popover.Trigger>
661
665
 
662
666
  <Popover.Content
663
- {...knobProps.borderRadius}
664
- borderWidth={1}
665
- borderColor="$borderColor"
667
+ {...knobProps.elevatedSurface}
666
668
  // LC-24: enter/exit styles are dead code without a resolved token
667
669
  transition={knobProps.transition}
668
670
  enterStyle={{ x: 0, y: -10, opacity: 0 }}
@@ -674,14 +676,14 @@ export function DataTableGroupingConfig<T = any>(props: DataTableGroupingConfigP
674
676
  >
675
677
  <Popover.ScrollView minHeight={0}>
676
678
  <YStack {...knobProps.panelPadding} gap="$4">
677
- <Text fontSize="$5" fontWeight="600">
679
+ <Text {...knobProps.label} fontWeight="400">
678
680
  Grouping & Aggregation
679
681
  </Text>
680
682
 
681
683
  {/* Group By Section */}
682
684
  <YStack gap="$3">
683
685
  <XStack justifyContent="space-between" alignItems="center">
684
- <Text fontSize="$4" fontWeight="500">
686
+ <Text {...knobProps.label} fontWeight="400">
685
687
  Group By
686
688
  </Text>
687
689
  <Text fontSize="$2" color="$color10">
@@ -713,7 +715,7 @@ export function DataTableGroupingConfig<T = any>(props: DataTableGroupingConfigP
713
715
  {`${label} · ${index + 1}`}
714
716
  </Text>
715
717
  <Button
716
- size="$2"
718
+ size={knobProps.sizeToken}
717
719
  variant="outlined"
718
720
  icon={<ArrowUpIcon size={iconSize} />}
719
721
  disabled={disabled || index === 0}
@@ -721,7 +723,7 @@ export function DataTableGroupingConfig<T = any>(props: DataTableGroupingConfigP
721
723
  aria-label={`Move ${label} up`}
722
724
  />
723
725
  <Button
724
- size="$2"
726
+ size={knobProps.sizeToken}
725
727
  variant="outlined"
726
728
  icon={<ArrowDownIcon size={iconSize} />}
727
729
  disabled={disabled || index === currentConfig.columns.length - 1}
@@ -729,7 +731,7 @@ export function DataTableGroupingConfig<T = any>(props: DataTableGroupingConfigP
729
731
  aria-label={`Move ${label} down`}
730
732
  />
731
733
  <Button
732
- size="$2"
734
+ size={knobProps.sizeToken}
733
735
  variant="outlined"
734
736
  icon={<MinusIcon size={iconSize} />}
735
737
  disabled={disabled}
@@ -753,7 +755,7 @@ export function DataTableGroupingConfig<T = any>(props: DataTableGroupingConfigP
753
755
  return (
754
756
  <Button
755
757
  key={key}
756
- size="$2"
758
+ size={knobProps.sizeToken}
757
759
  variant="outlined"
758
760
  onPress={() => handleAddGroupBy(key)}
759
761
  >
@@ -770,7 +772,7 @@ export function DataTableGroupingConfig<T = any>(props: DataTableGroupingConfigP
770
772
  {/* Aggregation Section */}
771
773
  <YStack gap="$3">
772
774
  <XStack justifyContent="space-between" alignItems="center">
773
- <Text fontSize="$4" fontWeight="500">
775
+ <Text {...knobProps.label} fontWeight="400">
774
776
  Aggregations
775
777
  </Text>
776
778
  <Text fontSize="$2" color="$color10">
@@ -800,7 +802,7 @@ export function DataTableGroupingConfig<T = any>(props: DataTableGroupingConfigP
800
802
  {agg.function}({agg.column}){agg.label && ` as "${agg.label}"`}
801
803
  </Text>
802
804
  <Button
803
- size="$2"
805
+ size={knobProps.sizeToken}
804
806
  variant="outlined"
805
807
  icon={<MinusIcon size={iconSize} />}
806
808
  disabled={disabled}
@@ -855,6 +857,8 @@ interface AggregationSelectorProps<_T = any> {
855
857
  }
856
858
 
857
859
  function AggregationSelector<T = any>({ columns, onAddAggregation }: AggregationSelectorProps<T>) {
860
+ const { knobProps } = useResolvedKnobs();
861
+ const iconPx = groupIconSize(String(knobProps.sizeToken));
858
862
  const [selectedColumn, setSelectedColumn] = useState<string>("");
859
863
  const [selectedFunction, setSelectedFunction] = useState<AggregationFunction>("count");
860
864
 
@@ -863,11 +867,11 @@ function AggregationSelector<T = any>({ columns, onAddAggregation }: Aggregation
863
867
  label: string;
864
868
  icon: React.ReactNode;
865
869
  }> = [
866
- { value: "count", label: "Count", icon: <HashIcon size={16} /> },
867
- { value: "sum", label: "Sum", icon: <PlusIcon size={16} /> },
868
- { value: "avg", label: "Average", icon: <CalculatorIcon size={16} /> },
869
- { value: "min", label: "Minimum", icon: <MinusIcon size={16} /> },
870
- { value: "max", label: "Maximum", icon: <CaretUpIcon size={16} /> },
870
+ { value: "count", label: "Count", icon: <HashIcon size={iconPx} /> },
871
+ { value: "sum", label: "Sum", icon: <PlusIcon size={iconPx} /> },
872
+ { value: "avg", label: "Average", icon: <CalculatorIcon size={iconPx} /> },
873
+ { value: "min", label: "Minimum", icon: <MinusIcon size={iconPx} /> },
874
+ { value: "max", label: "Maximum", icon: <CaretUpIcon size={iconPx} /> },
871
875
  ];
872
876
 
873
877
  // Convert columns to forms Select options
@@ -910,7 +914,7 @@ function AggregationSelector<T = any>({ columns, onAddAggregation }: Aggregation
910
914
 
911
915
  return (
912
916
  <YStack gap="$2">
913
- <Text fontSize="$3" fontWeight="500">
917
+ <Text {...knobProps.label} fontWeight="400">
914
918
  Add Aggregation
915
919
  </Text>
916
920
 
@@ -925,7 +929,6 @@ function AggregationSelector<T = any>({ columns, onAddAggregation }: Aggregation
925
929
  }}
926
930
  options={columnOptions}
927
931
  placeholder="Select column..."
928
- compact
929
932
  aria-label="Aggregation column"
930
933
  />
931
934
  </View>
@@ -939,12 +942,16 @@ function AggregationSelector<T = any>({ columns, onAddAggregation }: Aggregation
939
942
  }
940
943
  }}
941
944
  options={functionOptions}
942
- compact
943
945
  aria-label="Aggregation function"
944
946
  />
945
947
  </View>
946
948
 
947
- <Button size="$2" variant="outlined" disabled={!selectedColumn} onPress={handleAdd}>
949
+ <Button
950
+ size={knobProps.sizeToken}
951
+ variant="outlined"
952
+ disabled={!selectedColumn}
953
+ onPress={handleAdd}
954
+ >
948
955
  Add
949
956
  </Button>
950
957
  </XStack>
@@ -78,11 +78,11 @@ export function DataTablePagination(props: DataTablePaginationProps) {
78
78
  showPageSizeSelector = true,
79
79
  showPageJump = true,
80
80
  showPagerWhenSinglePage = false,
81
- compact = false,
81
+ compact,
82
82
  } = props;
83
83
 
84
84
  const { sm } = useMedia();
85
- const { knobProps } = useResolvedKnobs();
85
+ const { knobProps } = useResolvedKnobs(compact === undefined ? undefined : { compact });
86
86
  const isMobile = !sm;
87
87
  // LC-71: mount the composite-boundary ring sheet before Select/Input paint.
88
88
  ensureCompositeFocusRing();
@@ -266,12 +266,12 @@ function SearchOptionsPopover({
266
266
  <PopoverContent padding={0} overflow="hidden" alignItems="stretch" minWidth={280}>
267
267
  <ScrollView flexShrink={1} maxHeight={panelMaxHeight}>
268
268
  <YStack {...knobProps.panelPadding} {...knobProps.gapLg}>
269
- <Text {...knobProps.heading} {...knobProps.label} fontWeight="600">
269
+ <Text {...knobProps.heading} {...knobProps.label} fontWeight="400">
270
270
  {t("Search Options")}
271
271
  </Text>
272
272
 
273
273
  <YStack {...knobProps.gap}>
274
- <Text {...knobProps.label} fontWeight="500">
274
+ <Text {...knobProps.label} fontWeight="400">
275
275
  {t("Search Settings")}
276
276
  </Text>
277
277
 
@@ -312,7 +312,7 @@ function SearchOptionsPopover({
312
312
 
313
313
  <YStack {...knobProps.gap}>
314
314
  <XStack justifyContent="space-between" alignItems="center">
315
- <Text {...knobProps.label} fontWeight="500">
315
+ <Text {...knobProps.label} fontWeight="400">
316
316
  {t("Search Columns")}
317
317
  </Text>
318
318
  <Text {...knobProps.label} color={formCommonColors.muted}>
@@ -45,6 +45,26 @@ describe("DataTableToolbar", () => {
45
45
  expect(container).toBeDefined();
46
46
  });
47
47
 
48
+ it("exposes role=toolbar with an accessible name", () => {
49
+ const { getByRole } = renderWithProviders(<DataTableToolbar {...defaultProps} />);
50
+
51
+ expect(getByRole("toolbar", { name: "Table toolbar" })).toBeDefined();
52
+ });
53
+
54
+ it("does not mount export chrome unless enableExport is set", () => {
55
+ const { queryByRole } = renderWithProviders(<DataTableToolbar {...defaultProps} />);
56
+
57
+ expect(queryByRole("button", { name: /Export as CSV/i })).toBeNull();
58
+ });
59
+
60
+ it("mounts DataTableExport when enableExport is true", () => {
61
+ const { getByRole } = renderWithProviders(
62
+ <DataTableToolbar {...defaultProps} enableExport />,
63
+ );
64
+
65
+ expect(getByRole("button", { name: /Export as CSV/i })).toBeDefined();
66
+ });
67
+
48
68
  it("should render search input when enableGlobalSearch is true", () => {
49
69
  const { getByRole } = renderWithProviders(
50
70
  <DataTableToolbar {...defaultProps} enableGlobalSearch={true} />,
@@ -72,15 +72,7 @@ const MainStory = () => {
72
72
  enableViews
73
73
  initialState={{ pagination: { pageIndex: 1, pageSize: 3 } }}
74
74
  renderToolbar={(props) => (
75
- <DataTableToolbar
76
- {...props}
77
- enableViews
78
- customActions={
79
- <Button size="$2" variant="outlined" onPress={() => action("export-csv")()}>
80
- Export CSV
81
- </Button>
82
- }
83
- />
75
+ <DataTableToolbar {...props} enableViews enableExport />
84
76
  )}
85
77
  aria-label="Employee table with toolbar"
86
78
  />