@multiplatform.one/table 7.11.0 → 7.16.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 (277) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/ChildTable/index.cjs +8 -2
  3. package/dist/cjs/components/ChildTable/index.native.js +8 -2
  4. package/dist/cjs/components/ChildTable/index.native.js.map +1 -1
  5. package/dist/cjs/components/ColumnHeaderFilter/index.cjs +77 -111
  6. package/dist/cjs/components/ColumnHeaderFilter/index.native.js +89 -129
  7. package/dist/cjs/components/ColumnHeaderFilter/index.native.js.map +1 -1
  8. package/dist/cjs/components/DataTable/DataTableRoot.cjs +17 -1
  9. package/dist/cjs/components/DataTable/DataTableRoot.native.js +25 -2
  10. package/dist/cjs/components/DataTable/DataTableRoot.native.js.map +1 -1
  11. package/dist/cjs/components/DataTableBulkActions/index.cjs +1 -1
  12. package/dist/cjs/components/DataTableBulkActions/index.native.js +1 -1
  13. package/dist/cjs/components/DataTableBulkActions/index.native.js.map +1 -1
  14. package/dist/cjs/components/DataTableCell/CellModalEditor.cjs +72 -70
  15. package/dist/cjs/components/DataTableCell/index.cjs +2 -2
  16. package/dist/cjs/components/DataTableCell/index.native.js +2 -11
  17. package/dist/cjs/components/DataTableCell/index.native.js.map +1 -1
  18. package/dist/cjs/components/DataTableDateFilter/index.cjs +135 -158
  19. package/dist/cjs/components/DataTableDateFilter/index.native.js +153 -183
  20. package/dist/cjs/components/DataTableDateFilter/index.native.js.map +1 -1
  21. package/dist/cjs/components/DataTableExport/index.cjs +122 -139
  22. package/dist/cjs/components/DataTableExport/index.native.js +135 -157
  23. package/dist/cjs/components/DataTableExport/index.native.js.map +1 -1
  24. package/dist/cjs/components/DataTableGrouping/index.cjs +192 -212
  25. package/dist/cjs/components/DataTableGrouping/index.native.js +209 -230
  26. package/dist/cjs/components/DataTableGrouping/index.native.js.map +1 -1
  27. package/dist/cjs/components/DataTableSearch/index.cjs +103 -115
  28. package/dist/cjs/components/DataTableSearch/index.native.js +111 -123
  29. package/dist/cjs/components/DataTableSearch/index.native.js.map +1 -1
  30. package/dist/cjs/components/DataTableToolbar/index.cjs +44 -61
  31. package/dist/cjs/components/DataTableToolbar/index.native.js +46 -65
  32. package/dist/cjs/components/DataTableToolbar/index.native.js.map +1 -1
  33. package/dist/cjs/components/DataTableViewOptions/index.cjs +38 -54
  34. package/dist/cjs/components/DataTableViewOptions/index.native.js +40 -56
  35. package/dist/cjs/components/DataTableViewOptions/index.native.js.map +1 -1
  36. package/dist/cjs/components/FilterOperatorValueEditor/index.cjs +3 -11
  37. package/dist/cjs/components/FilterOperatorValueEditor/index.native.js +3 -11
  38. package/dist/cjs/components/FilterOperatorValueEditor/index.native.js.map +1 -1
  39. package/dist/cjs/components/SimpleTable/index.cjs +2 -6
  40. package/dist/cjs/components/SimpleTable/index.native.js +2 -6
  41. package/dist/cjs/components/SimpleTable/index.native.js.map +1 -1
  42. package/dist/cjs/components/TableInput/RowDetailEditor.cjs +190 -0
  43. package/dist/cjs/components/TableInput/RowDetailEditor.native.js +172 -0
  44. package/dist/cjs/components/TableInput/RowDetailEditor.native.js.map +1 -0
  45. package/dist/cjs/components/TableInput/index.cjs +42 -5
  46. package/dist/cjs/components/TableInput/index.native.js +64 -1
  47. package/dist/cjs/components/TableInput/index.native.js.map +1 -1
  48. package/dist/cjs/components/TableInput/shared.cjs +8 -0
  49. package/dist/cjs/components/TableInput/shared.native.js +10 -0
  50. package/dist/cjs/components/TableInput/shared.native.js.map +1 -1
  51. package/dist/cjs/hooks/useDataTable.cjs +11 -1
  52. package/dist/cjs/hooks/useDataTable.native.js +12 -2
  53. package/dist/cjs/hooks/useDataTable.native.js.map +1 -1
  54. package/dist/cjs/index.native.js.map +1 -1
  55. package/dist/cjs/utils/rowPress.cjs +4 -1
  56. package/dist/cjs/utils/rowPress.native.js +4 -1
  57. package/dist/cjs/utils/rowPress.native.js.map +1 -1
  58. package/dist/esm/components/ChildTable/index.mjs +8 -2
  59. package/dist/esm/components/ChildTable/index.mjs.map +1 -1
  60. package/dist/esm/components/ChildTable/index.native.js +8 -2
  61. package/dist/esm/components/ChildTable/index.native.js.map +1 -1
  62. package/dist/esm/components/ColumnHeaderFilter/index.mjs +80 -114
  63. package/dist/esm/components/ColumnHeaderFilter/index.mjs.map +1 -1
  64. package/dist/esm/components/ColumnHeaderFilter/index.native.js +92 -132
  65. package/dist/esm/components/ColumnHeaderFilter/index.native.js.map +1 -1
  66. package/dist/esm/components/DataTable/DataTableRoot.mjs +17 -1
  67. package/dist/esm/components/DataTable/DataTableRoot.mjs.map +1 -1
  68. package/dist/esm/components/DataTable/DataTableRoot.native.js +25 -2
  69. package/dist/esm/components/DataTable/DataTableRoot.native.js.map +1 -1
  70. package/dist/esm/components/DataTableBulkActions/index.mjs +1 -1
  71. package/dist/esm/components/DataTableBulkActions/index.mjs.map +1 -1
  72. package/dist/esm/components/DataTableBulkActions/index.native.js +1 -1
  73. package/dist/esm/components/DataTableBulkActions/index.native.js.map +1 -1
  74. package/dist/esm/components/DataTableCell/CellModalEditor.mjs +76 -74
  75. package/dist/esm/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  76. package/dist/esm/components/DataTableCell/index.mjs +3 -3
  77. package/dist/esm/components/DataTableCell/index.mjs.map +1 -1
  78. package/dist/esm/components/DataTableCell/index.native.js +3 -12
  79. package/dist/esm/components/DataTableCell/index.native.js.map +1 -1
  80. package/dist/esm/components/DataTableDateFilter/index.mjs +137 -160
  81. package/dist/esm/components/DataTableDateFilter/index.mjs.map +1 -1
  82. package/dist/esm/components/DataTableDateFilter/index.native.js +155 -185
  83. package/dist/esm/components/DataTableDateFilter/index.native.js.map +1 -1
  84. package/dist/esm/components/DataTableExport/index.mjs +124 -141
  85. package/dist/esm/components/DataTableExport/index.mjs.map +1 -1
  86. package/dist/esm/components/DataTableExport/index.native.js +137 -159
  87. package/dist/esm/components/DataTableExport/index.native.js.map +1 -1
  88. package/dist/esm/components/DataTableGrouping/index.mjs +194 -214
  89. package/dist/esm/components/DataTableGrouping/index.mjs.map +1 -1
  90. package/dist/esm/components/DataTableGrouping/index.native.js +211 -232
  91. package/dist/esm/components/DataTableGrouping/index.native.js.map +1 -1
  92. package/dist/esm/components/DataTableSearch/index.mjs +105 -117
  93. package/dist/esm/components/DataTableSearch/index.mjs.map +1 -1
  94. package/dist/esm/components/DataTableSearch/index.native.js +113 -125
  95. package/dist/esm/components/DataTableSearch/index.native.js.map +1 -1
  96. package/dist/esm/components/DataTableToolbar/index.mjs +46 -63
  97. package/dist/esm/components/DataTableToolbar/index.mjs.map +1 -1
  98. package/dist/esm/components/DataTableToolbar/index.native.js +48 -67
  99. package/dist/esm/components/DataTableToolbar/index.native.js.map +1 -1
  100. package/dist/esm/components/DataTableViewOptions/index.mjs +40 -56
  101. package/dist/esm/components/DataTableViewOptions/index.mjs.map +1 -1
  102. package/dist/esm/components/DataTableViewOptions/index.native.js +42 -58
  103. package/dist/esm/components/DataTableViewOptions/index.native.js.map +1 -1
  104. package/dist/esm/components/FilterOperatorValueEditor/index.mjs +3 -11
  105. package/dist/esm/components/FilterOperatorValueEditor/index.mjs.map +1 -1
  106. package/dist/esm/components/FilterOperatorValueEditor/index.native.js +3 -11
  107. package/dist/esm/components/FilterOperatorValueEditor/index.native.js.map +1 -1
  108. package/dist/esm/components/SimpleTable/index.mjs +3 -7
  109. package/dist/esm/components/SimpleTable/index.mjs.map +1 -1
  110. package/dist/esm/components/SimpleTable/index.native.js +3 -7
  111. package/dist/esm/components/SimpleTable/index.native.js.map +1 -1
  112. package/dist/esm/components/TableInput/RowDetailEditor.mjs +165 -0
  113. package/dist/esm/components/TableInput/RowDetailEditor.mjs.map +1 -0
  114. package/dist/esm/components/TableInput/RowDetailEditor.native.js +144 -0
  115. package/dist/esm/components/TableInput/RowDetailEditor.native.js.map +1 -0
  116. package/dist/esm/components/TableInput/index.mjs +42 -5
  117. package/dist/esm/components/TableInput/index.mjs.map +1 -1
  118. package/dist/esm/components/TableInput/index.native.js +64 -1
  119. package/dist/esm/components/TableInput/index.native.js.map +1 -1
  120. package/dist/esm/components/TableInput/shared.mjs +7 -1
  121. package/dist/esm/components/TableInput/shared.mjs.map +1 -1
  122. package/dist/esm/components/TableInput/shared.native.js +9 -1
  123. package/dist/esm/components/TableInput/shared.native.js.map +1 -1
  124. package/dist/esm/hooks/useDataTable.mjs +11 -1
  125. package/dist/esm/hooks/useDataTable.mjs.map +1 -1
  126. package/dist/esm/hooks/useDataTable.native.js +12 -2
  127. package/dist/esm/hooks/useDataTable.native.js.map +1 -1
  128. package/dist/esm/index.mjs.map +1 -1
  129. package/dist/esm/index.native.js.map +1 -1
  130. package/dist/esm/utils/rowPress.mjs +4 -1
  131. package/dist/esm/utils/rowPress.mjs.map +1 -1
  132. package/dist/esm/utils/rowPress.native.js +4 -1
  133. package/dist/esm/utils/rowPress.native.js.map +1 -1
  134. package/dist/jsx/components/ChildTable/index.mjs +8 -2
  135. package/dist/jsx/components/ChildTable/index.mjs.map +1 -1
  136. package/dist/jsx/components/ChildTable/index.native.js +8 -2
  137. package/dist/jsx/components/ChildTable/index.native.js.map +1 -1
  138. package/dist/jsx/components/ColumnHeaderFilter/index.mjs +80 -114
  139. package/dist/jsx/components/ColumnHeaderFilter/index.mjs.map +1 -1
  140. package/dist/jsx/components/ColumnHeaderFilter/index.native.js +89 -129
  141. package/dist/jsx/components/ColumnHeaderFilter/index.native.js.map +1 -1
  142. package/dist/jsx/components/DataTable/DataTableRoot.mjs +17 -1
  143. package/dist/jsx/components/DataTable/DataTableRoot.mjs.map +1 -1
  144. package/dist/jsx/components/DataTable/DataTableRoot.native.js +25 -2
  145. package/dist/jsx/components/DataTable/DataTableRoot.native.js.map +1 -1
  146. package/dist/jsx/components/DataTableBulkActions/index.mjs +1 -1
  147. package/dist/jsx/components/DataTableBulkActions/index.mjs.map +1 -1
  148. package/dist/jsx/components/DataTableBulkActions/index.native.js +1 -1
  149. package/dist/jsx/components/DataTableBulkActions/index.native.js.map +1 -1
  150. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs +76 -74
  151. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  152. package/dist/jsx/components/DataTableCell/index.mjs +3 -3
  153. package/dist/jsx/components/DataTableCell/index.mjs.map +1 -1
  154. package/dist/jsx/components/DataTableCell/index.native.js +2 -11
  155. package/dist/jsx/components/DataTableCell/index.native.js.map +1 -1
  156. package/dist/jsx/components/DataTableDateFilter/index.mjs +137 -160
  157. package/dist/jsx/components/DataTableDateFilter/index.mjs.map +1 -1
  158. package/dist/jsx/components/DataTableDateFilter/index.native.js +153 -183
  159. package/dist/jsx/components/DataTableDateFilter/index.native.js.map +1 -1
  160. package/dist/jsx/components/DataTableExport/index.mjs +124 -141
  161. package/dist/jsx/components/DataTableExport/index.mjs.map +1 -1
  162. package/dist/jsx/components/DataTableExport/index.native.js +135 -157
  163. package/dist/jsx/components/DataTableExport/index.native.js.map +1 -1
  164. package/dist/jsx/components/DataTableGrouping/index.mjs +194 -214
  165. package/dist/jsx/components/DataTableGrouping/index.mjs.map +1 -1
  166. package/dist/jsx/components/DataTableGrouping/index.native.js +209 -230
  167. package/dist/jsx/components/DataTableGrouping/index.native.js.map +1 -1
  168. package/dist/jsx/components/DataTableSearch/index.mjs +105 -117
  169. package/dist/jsx/components/DataTableSearch/index.mjs.map +1 -1
  170. package/dist/jsx/components/DataTableSearch/index.native.js +111 -123
  171. package/dist/jsx/components/DataTableSearch/index.native.js.map +1 -1
  172. package/dist/jsx/components/DataTableToolbar/index.mjs +46 -63
  173. package/dist/jsx/components/DataTableToolbar/index.mjs.map +1 -1
  174. package/dist/jsx/components/DataTableToolbar/index.native.js +46 -65
  175. package/dist/jsx/components/DataTableToolbar/index.native.js.map +1 -1
  176. package/dist/jsx/components/DataTableViewOptions/index.mjs +40 -56
  177. package/dist/jsx/components/DataTableViewOptions/index.mjs.map +1 -1
  178. package/dist/jsx/components/DataTableViewOptions/index.native.js +40 -56
  179. package/dist/jsx/components/DataTableViewOptions/index.native.js.map +1 -1
  180. package/dist/jsx/components/FilterOperatorValueEditor/index.mjs +3 -11
  181. package/dist/jsx/components/FilterOperatorValueEditor/index.mjs.map +1 -1
  182. package/dist/jsx/components/FilterOperatorValueEditor/index.native.js +3 -11
  183. package/dist/jsx/components/FilterOperatorValueEditor/index.native.js.map +1 -1
  184. package/dist/jsx/components/SimpleTable/index.mjs +3 -7
  185. package/dist/jsx/components/SimpleTable/index.mjs.map +1 -1
  186. package/dist/jsx/components/SimpleTable/index.native.js +2 -6
  187. package/dist/jsx/components/SimpleTable/index.native.js.map +1 -1
  188. package/dist/jsx/components/TableInput/RowDetailEditor.mjs +165 -0
  189. package/dist/jsx/components/TableInput/RowDetailEditor.mjs.map +1 -0
  190. package/dist/jsx/components/TableInput/RowDetailEditor.native.js +172 -0
  191. package/dist/jsx/components/TableInput/RowDetailEditor.native.js.map +1 -0
  192. package/dist/jsx/components/TableInput/index.mjs +42 -5
  193. package/dist/jsx/components/TableInput/index.mjs.map +1 -1
  194. package/dist/jsx/components/TableInput/index.native.js +64 -1
  195. package/dist/jsx/components/TableInput/index.native.js.map +1 -1
  196. package/dist/jsx/components/TableInput/shared.mjs +7 -1
  197. package/dist/jsx/components/TableInput/shared.mjs.map +1 -1
  198. package/dist/jsx/components/TableInput/shared.native.js +10 -0
  199. package/dist/jsx/components/TableInput/shared.native.js.map +1 -1
  200. package/dist/jsx/hooks/useDataTable.mjs +11 -1
  201. package/dist/jsx/hooks/useDataTable.mjs.map +1 -1
  202. package/dist/jsx/hooks/useDataTable.native.js +12 -2
  203. package/dist/jsx/hooks/useDataTable.native.js.map +1 -1
  204. package/dist/jsx/index.js.map +1 -1
  205. package/dist/jsx/index.mjs.map +1 -1
  206. package/dist/jsx/index.native.js.map +1 -1
  207. package/dist/jsx/utils/rowPress.mjs +4 -1
  208. package/dist/jsx/utils/rowPress.mjs.map +1 -1
  209. package/dist/jsx/utils/rowPress.native.js +4 -1
  210. package/dist/jsx/utils/rowPress.native.js.map +1 -1
  211. package/package.json +14 -14
  212. package/src/components/ChildTable/childTable.cellHidden.spec.tsx +57 -0
  213. package/src/components/ChildTable/childTable.rowDetail.spec.tsx +120 -0
  214. package/src/components/ChildTable/index.tsx +16 -0
  215. package/src/components/ColumnHeaderFilter/index.tsx +89 -116
  216. package/src/components/DataTable/DataTable.stories.tsx +71 -6
  217. package/src/components/DataTable/DataTableRoot.tsx +27 -4
  218. package/src/components/DataTable/dataTableMobileCards.spec.tsx +1 -4
  219. package/src/components/DataTable/headerContainment.spec.tsx +91 -0
  220. package/src/components/DataTable/rowPress.spec.tsx +2 -6
  221. package/src/components/DataTableBulkActions/DataTableBulkActions.stories.tsx +5 -4
  222. package/src/components/DataTableBulkActions/index.tsx +1 -1
  223. package/src/components/DataTableCell/CellModalEditor.tsx +95 -75
  224. package/src/components/DataTableCell/cellDraftPolicy.spec.tsx +12 -2
  225. package/src/components/DataTableCell/cellModalEditor.spec.tsx +75 -49
  226. package/src/components/DataTableCell/dataTableCell.spec.tsx +31 -14
  227. package/src/components/DataTableCell/index.tsx +3 -2
  228. package/src/components/DataTableDateFilter/DataTableDateFilter.spec.tsx +6 -3
  229. package/src/components/DataTableDateFilter/index.tsx +151 -180
  230. package/src/components/DataTableExport/index.tsx +135 -142
  231. package/src/components/DataTableGrouping/index.tsx +193 -195
  232. package/src/components/DataTableSearch/index.tsx +111 -109
  233. package/src/components/DataTableToolbar/index.tsx +39 -46
  234. package/src/components/DataTableViewOptions/DataTableViewOptions.stories.tsx +52 -0
  235. package/src/components/DataTableViewOptions/index.tsx +32 -40
  236. package/src/components/FilterOperatorValueEditor/FilterOperatorValueEditor.spec.tsx +64 -2
  237. package/src/components/FilterOperatorValueEditor/index.tsx +0 -8
  238. package/src/components/SimpleTable/index.tsx +3 -2
  239. package/src/components/SimpleTable/simpleTable.spec.tsx +15 -0
  240. package/src/components/Table/accessibility.spec.tsx +7 -19
  241. package/src/components/TableInput/RowDetailEditor.native.tsx +134 -0
  242. package/src/components/TableInput/RowDetailEditor.tsx +173 -0
  243. package/src/components/TableInput/index.native.tsx +49 -1
  244. package/src/components/TableInput/index.tsx +65 -10
  245. package/src/components/TableInput/shared.ts +29 -0
  246. package/src/components/tableDropdowns.spec.tsx +172 -0
  247. package/src/hooks/useDataTable.spec.ts +39 -0
  248. package/src/hooks/useDataTable.ts +15 -1
  249. package/src/index.ts +1 -0
  250. package/src/utils/rowPress.ts +3 -0
  251. package/types/components/ChildTable/index.d.ts +10 -0
  252. package/types/components/ChildTable/index.d.ts.map +1 -1
  253. package/types/components/ColumnHeaderFilter/index.d.ts +1 -1
  254. package/types/components/ColumnHeaderFilter/index.d.ts.map +1 -1
  255. package/types/components/DataTable/DataTableRoot.d.ts.map +1 -1
  256. package/types/components/DataTableCell/CellModalEditor.d.ts +10 -7
  257. package/types/components/DataTableCell/CellModalEditor.d.ts.map +1 -1
  258. package/types/components/DataTableCell/index.d.ts.map +1 -1
  259. package/types/components/DataTableDateFilter/index.d.ts.map +1 -1
  260. package/types/components/DataTableGrouping/index.d.ts.map +1 -1
  261. package/types/components/DataTableSearch/index.d.ts.map +1 -1
  262. package/types/components/FilterOperatorValueEditor/index.d.ts.map +1 -1
  263. package/types/components/SimpleTable/index.d.ts.map +1 -1
  264. package/types/components/TableInput/RowDetailEditor.d.ts +24 -0
  265. package/types/components/TableInput/RowDetailEditor.d.ts.map +1 -0
  266. package/types/components/TableInput/RowDetailEditor.native.d.ts +11 -0
  267. package/types/components/TableInput/RowDetailEditor.native.d.ts.map +1 -0
  268. package/types/components/TableInput/index.d.ts +11 -2
  269. package/types/components/TableInput/index.d.ts.map +1 -1
  270. package/types/components/TableInput/index.native.d.ts +8 -1
  271. package/types/components/TableInput/index.native.d.ts.map +1 -1
  272. package/types/components/TableInput/shared.d.ts +11 -0
  273. package/types/components/TableInput/shared.d.ts.map +1 -1
  274. package/types/hooks/useDataTable.d.ts.map +1 -1
  275. package/types/index.d.ts +1 -0
  276. package/types/index.d.ts.map +1 -1
  277. package/types/utils/rowPress.d.ts.map +1 -1
@@ -24,8 +24,8 @@ import {
24
24
  type GroupPosition,
25
25
  } from "@multiplatform.one/theme";
26
26
  import { useCallback, useMemo, useState } from "react";
27
- import { Button, Select } from "@multiplatform.one/forms";
28
- import { Popover, Separator, Text, View, XStack, YStack, isWeb } from "tamagui";
27
+ import { Button, FloatingPanel, Select } from "@multiplatform.one/forms";
28
+ import { Separator, Text, View, XStack, YStack, isWeb } from "tamagui";
29
29
  import { getViewLeafRows } from "../../utils/viewData";
30
30
  import { iconSizeForToken } from "../../utils/chromeIcons";
31
31
  import { useDataTableState } from "../DataTable/DataTableStateContext";
@@ -629,211 +629,209 @@ export function DataTableGroupingConfig<T = any>(props: DataTableGroupingConfigP
629
629
  const iconSize = groupIconSize(String(sz));
630
630
  const radius = knobProps.borderRadius.borderRadius;
631
631
 
632
+ const trigger = (
633
+ <Button
634
+ size={knobProps.sizeToken}
635
+ icon={<GearIcon size={iconSize} />}
636
+ disabled={disabled}
637
+ aria-label="Grouping configuration"
638
+ >
639
+ <XStack alignItems="center" gap="$2">
640
+ <ChartBarIcon size={iconSize} />
641
+ <Text>Group & Aggregate</Text>
642
+ {(currentConfig.columns.length > 0 || currentConfig.aggregations.length > 0) && (
643
+ <View
644
+ backgroundColor="$color6"
645
+ borderRadius={1000}
646
+ paddingHorizontal="$1"
647
+ paddingVertical={2}
648
+ minWidth={20}
649
+ alignItems="center"
650
+ >
651
+ <Text {...knobProps.label} fontWeight="400" color="$color12">
652
+ {currentConfig.columns.length + currentConfig.aggregations.length}
653
+ </Text>
654
+ </View>
655
+ )}
656
+ </XStack>
657
+ </Button>
658
+ );
659
+
632
660
  return (
633
- // LC-06/LC-10: collision handling — the config list grows with every
634
- // group-by/aggregation added and must clamp + scroll inside the viewport
635
- // instead of painting rows past the fold (same fix as the export popover).
636
- <Popover open={isOpen} onOpenChange={setIsOpen} stayInFrame allowFlip resize>
637
- <Popover.Trigger asChild>
638
- <Button
639
- size={knobProps.sizeToken}
640
- icon={<GearIcon size={iconSize} />}
641
- disabled={disabled}
642
- aria-label="Grouping configuration"
643
- >
644
- <XStack alignItems="center" gap="$2">
645
- <ChartBarIcon size={iconSize} />
646
- <Text>Group & Aggregate</Text>
647
- {(currentConfig.columns.length > 0 || currentConfig.aggregations.length > 0) && (
648
- <View
649
- backgroundColor="$color6"
650
- borderRadius={1000}
651
- paddingHorizontal="$1"
652
- paddingVertical={2}
653
- minWidth={20}
654
- alignItems="center"
655
- >
656
- <Text {...knobProps.label} fontWeight="400" color="$color12">
657
- {currentConfig.columns.length + currentConfig.aggregations.length}
658
- </Text>
659
- </View>
660
- )}
661
- </XStack>
662
- </Button>
663
- </Popover.Trigger>
664
-
665
- <Popover.Content
666
- {...knobProps.elevatedSurface}
667
- // LC-24: enter/exit styles are dead code without a resolved token
668
- transition={knobProps.transition}
669
- enterStyle={{ x: 0, y: -10, opacity: 0 }}
670
- exitStyle={{ x: 0, y: -10, opacity: 0 }}
661
+ // LC-06/LC-10: the config list grows with every group-by/aggregation
662
+ // added. FloatingPanel clamps and scrolls it inside the viewport instead
663
+ // of painting rows past the fold.
664
+ <FloatingPanel
665
+ open={isOpen}
666
+ onOpenChange={setIsOpen}
667
+ trigger={trigger}
668
+ triggerSizing="content"
669
+ disabled={disabled}
670
+ scrollable
671
+ >
672
+ <YStack
673
+ gap="$4"
671
674
  minWidth={popoverMinWidth}
672
675
  maxWidth={popoverMaxWidth}
673
- padding={0}
674
- overflow="hidden"
676
+ data-dismiss-class="compose"
675
677
  >
676
- <Popover.ScrollView minHeight={0}>
677
- <YStack {...knobProps.panelPadding} gap="$4">
678
+ <Text {...knobProps.label} fontWeight="400">
679
+ Grouping & Aggregation
680
+ </Text>
681
+
682
+ {/* Group By Section */}
683
+ <YStack gap="$3">
684
+ <XStack justifyContent="space-between" alignItems="center">
678
685
  <Text {...knobProps.label} fontWeight="400">
679
- Grouping & Aggregation
686
+ Group By
687
+ </Text>
688
+ <Text fontSize="$2" color="$color10">
689
+ {currentConfig.columns.length} selected
680
690
  </Text>
691
+ </XStack>
681
692
 
682
- {/* Group By Section */}
683
- <YStack gap="$3">
684
- <XStack justifyContent="space-between" alignItems="center">
685
- <Text {...knobProps.label} fontWeight="400">
686
- Group By
687
- </Text>
688
- <Text fontSize="$2" color="$color10">
689
- {currentConfig.columns.length} selected
690
- </Text>
691
- </XStack>
693
+ {/* Current Group By Columns */}
694
+ <YStack>
695
+ {currentConfig.columns.map((columnKey, index) => {
696
+ const column = columns.find((col) => (col.accessorKey || col.id) === columnKey);
697
+ const position = getGroupPosition(index, currentConfig.columns.length);
698
+ const corners = stackRadiusProps(position, radius);
699
+ const label = String(column?.header || columnKey);
700
+ return (
701
+ <YStack key={columnKey}>
702
+ {index > 0 ? <View {...hairline.line} /> : null}
703
+ <XStack
704
+ alignItems="center"
705
+ gap="$2"
706
+ padding="$2"
707
+ overflow="hidden"
708
+ backgroundColor="$color2"
709
+ {...corners}
710
+ hoverStyle={{ backgroundColor: "$backgroundHover", ...corners }}
711
+ {...({ "data-group-position": position } as any)}
712
+ >
713
+ <Text fontSize="$3" flex={1} numberOfLines={1}>
714
+ {`${label} · ${index + 1}`}
715
+ </Text>
716
+ <Button
717
+ size={knobProps.sizeToken}
718
+ icon={<ArrowUpIcon size={iconSize} />}
719
+ disabled={disabled || index === 0}
720
+ onPress={() => handleMoveGroupBy(index, -1)}
721
+ aria-label={`Move ${label} up`}
722
+ />
723
+ <Button
724
+ size={knobProps.sizeToken}
725
+ icon={<ArrowDownIcon size={iconSize} />}
726
+ disabled={disabled || index === currentConfig.columns.length - 1}
727
+ onPress={() => handleMoveGroupBy(index, 1)}
728
+ aria-label={`Move ${label} down`}
729
+ />
730
+ <Button
731
+ size={knobProps.sizeToken}
732
+ icon={<MinusIcon size={iconSize} />}
733
+ disabled={disabled}
734
+ onPress={() => handleRemoveGroupBy(columnKey)}
735
+ aria-label={`Remove grouping by ${label}`}
736
+ />
737
+ </XStack>
738
+ </YStack>
739
+ );
740
+ })}
741
+ </YStack>
692
742
 
693
- {/* Current Group By Columns */}
694
- <YStack>
695
- {currentConfig.columns.map((columnKey, index) => {
696
- const column = columns.find((col) => (col.accessorKey || col.id) === columnKey);
697
- const position = getGroupPosition(index, currentConfig.columns.length);
698
- const corners = stackRadiusProps(position, radius);
699
- const label = String(column?.header || columnKey);
700
- return (
701
- <YStack key={columnKey}>
702
- {index > 0 ? <View {...hairline.line} /> : null}
703
- <XStack
704
- alignItems="center"
705
- gap="$2"
706
- padding="$2"
707
- overflow="hidden"
708
- backgroundColor="$color2"
709
- {...corners}
710
- hoverStyle={{ backgroundColor: "$backgroundHover", ...corners }}
711
- {...({ "data-group-position": position } as any)}
712
- >
713
- <Text fontSize="$3" flex={1} numberOfLines={1}>
714
- {`${label} · ${index + 1}`}
715
- </Text>
716
- <Button
717
- size={knobProps.sizeToken}
718
- icon={<ArrowUpIcon size={iconSize} />}
719
- disabled={disabled || index === 0}
720
- onPress={() => handleMoveGroupBy(index, -1)}
721
- aria-label={`Move ${label} up`}
722
- />
723
- <Button
724
- size={knobProps.sizeToken}
725
- icon={<ArrowDownIcon size={iconSize} />}
726
- disabled={disabled || index === currentConfig.columns.length - 1}
727
- onPress={() => handleMoveGroupBy(index, 1)}
728
- aria-label={`Move ${label} down`}
729
- />
730
- <Button
731
- size={knobProps.sizeToken}
732
- icon={<MinusIcon size={iconSize} />}
733
- disabled={disabled}
734
- onPress={() => handleRemoveGroupBy(columnKey)}
735
- aria-label={`Remove grouping by ${label}`}
736
- />
737
- </XStack>
738
- </YStack>
739
- );
740
- })}
741
- </YStack>
742
-
743
- {/* Add Group By Column */}
744
- {availableColumns.length > 0 && (
745
- <XStack gap="$2">
746
- <Text fontSize="$3" color="$color10">
747
- Add:
748
- </Text>
749
- {availableColumns.slice(0, 3).map((column) => {
750
- const key = column.accessorKey || column.id || "";
751
- return (
752
- <Button
753
- key={key}
754
- size={knobProps.sizeToken}
755
- onPress={() => handleAddGroupBy(key)}
756
- >
757
- {column.header || key}
758
- </Button>
759
- );
760
- })}
761
- </XStack>
762
- )}
763
- </YStack>
743
+ {/* Add Group By Column */}
744
+ {availableColumns.length > 0 && (
745
+ <XStack gap="$2">
746
+ <Text fontSize="$3" color="$color10">
747
+ Add:
748
+ </Text>
749
+ {availableColumns.slice(0, 3).map((column) => {
750
+ const key = column.accessorKey || column.id || "";
751
+ return (
752
+ <Button
753
+ key={key}
754
+ size={knobProps.sizeToken}
755
+ onPress={() => handleAddGroupBy(key)}
756
+ >
757
+ {column.header || key}
758
+ </Button>
759
+ );
760
+ })}
761
+ </XStack>
762
+ )}
763
+ </YStack>
764
764
 
765
- <Separator />
765
+ <Separator />
766
766
 
767
- {/* Aggregation Section */}
768
- <YStack gap="$3">
769
- <XStack justifyContent="space-between" alignItems="center">
770
- <Text {...knobProps.label} fontWeight="400">
771
- Aggregations
772
- </Text>
773
- <Text fontSize="$2" color="$color10">
774
- {currentConfig.aggregations.length} configured
775
- </Text>
776
- </XStack>
767
+ {/* Aggregation Section */}
768
+ <YStack gap="$3">
769
+ <XStack justifyContent="space-between" alignItems="center">
770
+ <Text {...knobProps.label} fontWeight="400">
771
+ Aggregations
772
+ </Text>
773
+ <Text fontSize="$2" color="$color10">
774
+ {currentConfig.aggregations.length} configured
775
+ </Text>
776
+ </XStack>
777
777
 
778
- {/* Current Aggregations */}
779
- <YStack>
780
- {currentConfig.aggregations.map((agg, index) => {
781
- const position = getGroupPosition(index, currentConfig.aggregations.length);
782
- const corners = stackRadiusProps(position, radius);
783
- return (
784
- <YStack key={`${agg.function}-${agg.column}-${index}`}>
785
- {index > 0 ? <View {...hairline.line} /> : null}
786
- <XStack
787
- alignItems="center"
788
- gap="$2"
789
- padding="$2"
790
- overflow="hidden"
791
- backgroundColor="$color2"
792
- {...corners}
793
- hoverStyle={{ backgroundColor: "$backgroundHover", ...corners }}
794
- {...({ "data-group-position": position } as any)}
795
- >
796
- <Text fontSize="$3" flex={1} numberOfLines={1}>
797
- {agg.function}({agg.column}){agg.label && ` as "${agg.label}"`}
798
- </Text>
799
- <Button
800
- size={knobProps.sizeToken}
801
- icon={<MinusIcon size={iconSize} />}
802
- disabled={disabled}
803
- onPress={() => handleRemoveAggregation(index)}
804
- aria-label={`Remove ${agg.function} aggregation on ${agg.column}`}
805
- />
806
- </XStack>
807
- </YStack>
808
- );
809
- })}
810
- </YStack>
811
-
812
- {/* Add Aggregation */}
813
- <AggregationSelector
814
- columns={aggregatableColumns}
815
- onAddAggregation={handleAddAggregation}
816
- />
817
- </YStack>
818
-
819
- {/* Clear All */}
820
- {(currentConfig.columns.length > 0 || currentConfig.aggregations.length > 0) && (
821
- <>
822
- <Separator />
823
- <Button
824
- size={knobProps.sizeToken}
825
- error
826
- onPress={() => onConfigChange({ columns: [], aggregations: [] })}
827
- aria-label="Clear all grouping and aggregation"
828
- >
829
- Clear All Grouping
830
- </Button>
831
- </>
832
- )}
778
+ {/* Current Aggregations */}
779
+ <YStack>
780
+ {currentConfig.aggregations.map((agg, index) => {
781
+ const position = getGroupPosition(index, currentConfig.aggregations.length);
782
+ const corners = stackRadiusProps(position, radius);
783
+ return (
784
+ <YStack key={`${agg.function}-${agg.column}-${index}`}>
785
+ {index > 0 ? <View {...hairline.line} /> : null}
786
+ <XStack
787
+ alignItems="center"
788
+ gap="$2"
789
+ padding="$2"
790
+ overflow="hidden"
791
+ backgroundColor="$color2"
792
+ {...corners}
793
+ hoverStyle={{ backgroundColor: "$backgroundHover", ...corners }}
794
+ {...({ "data-group-position": position } as any)}
795
+ >
796
+ <Text fontSize="$3" flex={1} numberOfLines={1}>
797
+ {agg.function}({agg.column}){agg.label && ` as "${agg.label}"`}
798
+ </Text>
799
+ <Button
800
+ size={knobProps.sizeToken}
801
+ icon={<MinusIcon size={iconSize} />}
802
+ disabled={disabled}
803
+ onPress={() => handleRemoveAggregation(index)}
804
+ aria-label={`Remove ${agg.function} aggregation on ${agg.column}`}
805
+ />
806
+ </XStack>
807
+ </YStack>
808
+ );
809
+ })}
833
810
  </YStack>
834
- </Popover.ScrollView>
835
- </Popover.Content>
836
- </Popover>
811
+
812
+ {/* Add Aggregation */}
813
+ <AggregationSelector
814
+ columns={aggregatableColumns}
815
+ onAddAggregation={handleAddAggregation}
816
+ />
817
+ </YStack>
818
+
819
+ {/* Clear All */}
820
+ {(currentConfig.columns.length > 0 || currentConfig.aggregations.length > 0) && (
821
+ <>
822
+ <Separator />
823
+ <Button
824
+ size={knobProps.sizeToken}
825
+ error
826
+ onPress={() => onConfigChange({ columns: [], aggregations: [] })}
827
+ aria-label="Clear all grouping and aggregation"
828
+ >
829
+ Clear All Grouping
830
+ </Button>
831
+ </>
832
+ )}
833
+ </YStack>
834
+ </FloatingPanel>
837
835
  );
838
836
  }
839
837