@multiplatform.one/table 7.11.0 → 7.15.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 (265) 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/DataTableCell/CellModalEditor.cjs +72 -70
  12. package/dist/cjs/components/DataTableCell/index.cjs +2 -2
  13. package/dist/cjs/components/DataTableCell/index.native.js +2 -11
  14. package/dist/cjs/components/DataTableCell/index.native.js.map +1 -1
  15. package/dist/cjs/components/DataTableDateFilter/index.cjs +135 -158
  16. package/dist/cjs/components/DataTableDateFilter/index.native.js +153 -183
  17. package/dist/cjs/components/DataTableDateFilter/index.native.js.map +1 -1
  18. package/dist/cjs/components/DataTableExport/index.cjs +122 -139
  19. package/dist/cjs/components/DataTableExport/index.native.js +135 -157
  20. package/dist/cjs/components/DataTableExport/index.native.js.map +1 -1
  21. package/dist/cjs/components/DataTableGrouping/index.cjs +192 -212
  22. package/dist/cjs/components/DataTableGrouping/index.native.js +209 -230
  23. package/dist/cjs/components/DataTableGrouping/index.native.js.map +1 -1
  24. package/dist/cjs/components/DataTableSearch/index.cjs +103 -115
  25. package/dist/cjs/components/DataTableSearch/index.native.js +111 -123
  26. package/dist/cjs/components/DataTableSearch/index.native.js.map +1 -1
  27. package/dist/cjs/components/DataTableToolbar/index.cjs +44 -61
  28. package/dist/cjs/components/DataTableToolbar/index.native.js +46 -65
  29. package/dist/cjs/components/DataTableToolbar/index.native.js.map +1 -1
  30. package/dist/cjs/components/DataTableViewOptions/index.cjs +38 -54
  31. package/dist/cjs/components/DataTableViewOptions/index.native.js +40 -56
  32. package/dist/cjs/components/DataTableViewOptions/index.native.js.map +1 -1
  33. package/dist/cjs/components/FilterOperatorValueEditor/index.cjs +3 -11
  34. package/dist/cjs/components/FilterOperatorValueEditor/index.native.js +3 -11
  35. package/dist/cjs/components/FilterOperatorValueEditor/index.native.js.map +1 -1
  36. package/dist/cjs/components/SimpleTable/index.cjs +2 -6
  37. package/dist/cjs/components/SimpleTable/index.native.js +2 -6
  38. package/dist/cjs/components/SimpleTable/index.native.js.map +1 -1
  39. package/dist/cjs/components/TableInput/RowDetailEditor.cjs +190 -0
  40. package/dist/cjs/components/TableInput/RowDetailEditor.native.js +172 -0
  41. package/dist/cjs/components/TableInput/RowDetailEditor.native.js.map +1 -0
  42. package/dist/cjs/components/TableInput/index.cjs +42 -5
  43. package/dist/cjs/components/TableInput/index.native.js +64 -1
  44. package/dist/cjs/components/TableInput/index.native.js.map +1 -1
  45. package/dist/cjs/components/TableInput/shared.cjs +8 -0
  46. package/dist/cjs/components/TableInput/shared.native.js +10 -0
  47. package/dist/cjs/components/TableInput/shared.native.js.map +1 -1
  48. package/dist/cjs/hooks/useDataTable.cjs +11 -1
  49. package/dist/cjs/hooks/useDataTable.native.js +12 -2
  50. package/dist/cjs/hooks/useDataTable.native.js.map +1 -1
  51. package/dist/cjs/index.native.js.map +1 -1
  52. package/dist/cjs/utils/rowPress.cjs +4 -1
  53. package/dist/cjs/utils/rowPress.native.js +4 -1
  54. package/dist/cjs/utils/rowPress.native.js.map +1 -1
  55. package/dist/esm/components/ChildTable/index.mjs +8 -2
  56. package/dist/esm/components/ChildTable/index.mjs.map +1 -1
  57. package/dist/esm/components/ChildTable/index.native.js +8 -2
  58. package/dist/esm/components/ChildTable/index.native.js.map +1 -1
  59. package/dist/esm/components/ColumnHeaderFilter/index.mjs +80 -114
  60. package/dist/esm/components/ColumnHeaderFilter/index.mjs.map +1 -1
  61. package/dist/esm/components/ColumnHeaderFilter/index.native.js +92 -132
  62. package/dist/esm/components/ColumnHeaderFilter/index.native.js.map +1 -1
  63. package/dist/esm/components/DataTable/DataTableRoot.mjs +17 -1
  64. package/dist/esm/components/DataTable/DataTableRoot.mjs.map +1 -1
  65. package/dist/esm/components/DataTable/DataTableRoot.native.js +25 -2
  66. package/dist/esm/components/DataTable/DataTableRoot.native.js.map +1 -1
  67. package/dist/esm/components/DataTableCell/CellModalEditor.mjs +76 -74
  68. package/dist/esm/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  69. package/dist/esm/components/DataTableCell/index.mjs +3 -3
  70. package/dist/esm/components/DataTableCell/index.mjs.map +1 -1
  71. package/dist/esm/components/DataTableCell/index.native.js +3 -12
  72. package/dist/esm/components/DataTableCell/index.native.js.map +1 -1
  73. package/dist/esm/components/DataTableDateFilter/index.mjs +137 -160
  74. package/dist/esm/components/DataTableDateFilter/index.mjs.map +1 -1
  75. package/dist/esm/components/DataTableDateFilter/index.native.js +155 -185
  76. package/dist/esm/components/DataTableDateFilter/index.native.js.map +1 -1
  77. package/dist/esm/components/DataTableExport/index.mjs +124 -141
  78. package/dist/esm/components/DataTableExport/index.mjs.map +1 -1
  79. package/dist/esm/components/DataTableExport/index.native.js +137 -159
  80. package/dist/esm/components/DataTableExport/index.native.js.map +1 -1
  81. package/dist/esm/components/DataTableGrouping/index.mjs +194 -214
  82. package/dist/esm/components/DataTableGrouping/index.mjs.map +1 -1
  83. package/dist/esm/components/DataTableGrouping/index.native.js +211 -232
  84. package/dist/esm/components/DataTableGrouping/index.native.js.map +1 -1
  85. package/dist/esm/components/DataTableSearch/index.mjs +105 -117
  86. package/dist/esm/components/DataTableSearch/index.mjs.map +1 -1
  87. package/dist/esm/components/DataTableSearch/index.native.js +113 -125
  88. package/dist/esm/components/DataTableSearch/index.native.js.map +1 -1
  89. package/dist/esm/components/DataTableToolbar/index.mjs +46 -63
  90. package/dist/esm/components/DataTableToolbar/index.mjs.map +1 -1
  91. package/dist/esm/components/DataTableToolbar/index.native.js +48 -67
  92. package/dist/esm/components/DataTableToolbar/index.native.js.map +1 -1
  93. package/dist/esm/components/DataTableViewOptions/index.mjs +40 -56
  94. package/dist/esm/components/DataTableViewOptions/index.mjs.map +1 -1
  95. package/dist/esm/components/DataTableViewOptions/index.native.js +42 -58
  96. package/dist/esm/components/DataTableViewOptions/index.native.js.map +1 -1
  97. package/dist/esm/components/FilterOperatorValueEditor/index.mjs +3 -11
  98. package/dist/esm/components/FilterOperatorValueEditor/index.mjs.map +1 -1
  99. package/dist/esm/components/FilterOperatorValueEditor/index.native.js +3 -11
  100. package/dist/esm/components/FilterOperatorValueEditor/index.native.js.map +1 -1
  101. package/dist/esm/components/SimpleTable/index.mjs +3 -7
  102. package/dist/esm/components/SimpleTable/index.mjs.map +1 -1
  103. package/dist/esm/components/SimpleTable/index.native.js +3 -7
  104. package/dist/esm/components/SimpleTable/index.native.js.map +1 -1
  105. package/dist/esm/components/TableInput/RowDetailEditor.mjs +165 -0
  106. package/dist/esm/components/TableInput/RowDetailEditor.mjs.map +1 -0
  107. package/dist/esm/components/TableInput/RowDetailEditor.native.js +144 -0
  108. package/dist/esm/components/TableInput/RowDetailEditor.native.js.map +1 -0
  109. package/dist/esm/components/TableInput/index.mjs +42 -5
  110. package/dist/esm/components/TableInput/index.mjs.map +1 -1
  111. package/dist/esm/components/TableInput/index.native.js +64 -1
  112. package/dist/esm/components/TableInput/index.native.js.map +1 -1
  113. package/dist/esm/components/TableInput/shared.mjs +7 -1
  114. package/dist/esm/components/TableInput/shared.mjs.map +1 -1
  115. package/dist/esm/components/TableInput/shared.native.js +9 -1
  116. package/dist/esm/components/TableInput/shared.native.js.map +1 -1
  117. package/dist/esm/hooks/useDataTable.mjs +11 -1
  118. package/dist/esm/hooks/useDataTable.mjs.map +1 -1
  119. package/dist/esm/hooks/useDataTable.native.js +12 -2
  120. package/dist/esm/hooks/useDataTable.native.js.map +1 -1
  121. package/dist/esm/index.mjs.map +1 -1
  122. package/dist/esm/index.native.js.map +1 -1
  123. package/dist/esm/utils/rowPress.mjs +4 -1
  124. package/dist/esm/utils/rowPress.mjs.map +1 -1
  125. package/dist/esm/utils/rowPress.native.js +4 -1
  126. package/dist/esm/utils/rowPress.native.js.map +1 -1
  127. package/dist/jsx/components/ChildTable/index.mjs +8 -2
  128. package/dist/jsx/components/ChildTable/index.mjs.map +1 -1
  129. package/dist/jsx/components/ChildTable/index.native.js +8 -2
  130. package/dist/jsx/components/ChildTable/index.native.js.map +1 -1
  131. package/dist/jsx/components/ColumnHeaderFilter/index.mjs +80 -114
  132. package/dist/jsx/components/ColumnHeaderFilter/index.mjs.map +1 -1
  133. package/dist/jsx/components/ColumnHeaderFilter/index.native.js +89 -129
  134. package/dist/jsx/components/ColumnHeaderFilter/index.native.js.map +1 -1
  135. package/dist/jsx/components/DataTable/DataTableRoot.mjs +17 -1
  136. package/dist/jsx/components/DataTable/DataTableRoot.mjs.map +1 -1
  137. package/dist/jsx/components/DataTable/DataTableRoot.native.js +25 -2
  138. package/dist/jsx/components/DataTable/DataTableRoot.native.js.map +1 -1
  139. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs +76 -74
  140. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  141. package/dist/jsx/components/DataTableCell/index.mjs +3 -3
  142. package/dist/jsx/components/DataTableCell/index.mjs.map +1 -1
  143. package/dist/jsx/components/DataTableCell/index.native.js +2 -11
  144. package/dist/jsx/components/DataTableCell/index.native.js.map +1 -1
  145. package/dist/jsx/components/DataTableDateFilter/index.mjs +137 -160
  146. package/dist/jsx/components/DataTableDateFilter/index.mjs.map +1 -1
  147. package/dist/jsx/components/DataTableDateFilter/index.native.js +153 -183
  148. package/dist/jsx/components/DataTableDateFilter/index.native.js.map +1 -1
  149. package/dist/jsx/components/DataTableExport/index.mjs +124 -141
  150. package/dist/jsx/components/DataTableExport/index.mjs.map +1 -1
  151. package/dist/jsx/components/DataTableExport/index.native.js +135 -157
  152. package/dist/jsx/components/DataTableExport/index.native.js.map +1 -1
  153. package/dist/jsx/components/DataTableGrouping/index.mjs +194 -214
  154. package/dist/jsx/components/DataTableGrouping/index.mjs.map +1 -1
  155. package/dist/jsx/components/DataTableGrouping/index.native.js +209 -230
  156. package/dist/jsx/components/DataTableGrouping/index.native.js.map +1 -1
  157. package/dist/jsx/components/DataTableSearch/index.mjs +105 -117
  158. package/dist/jsx/components/DataTableSearch/index.mjs.map +1 -1
  159. package/dist/jsx/components/DataTableSearch/index.native.js +111 -123
  160. package/dist/jsx/components/DataTableSearch/index.native.js.map +1 -1
  161. package/dist/jsx/components/DataTableToolbar/index.mjs +46 -63
  162. package/dist/jsx/components/DataTableToolbar/index.mjs.map +1 -1
  163. package/dist/jsx/components/DataTableToolbar/index.native.js +46 -65
  164. package/dist/jsx/components/DataTableToolbar/index.native.js.map +1 -1
  165. package/dist/jsx/components/DataTableViewOptions/index.mjs +40 -56
  166. package/dist/jsx/components/DataTableViewOptions/index.mjs.map +1 -1
  167. package/dist/jsx/components/DataTableViewOptions/index.native.js +40 -56
  168. package/dist/jsx/components/DataTableViewOptions/index.native.js.map +1 -1
  169. package/dist/jsx/components/FilterOperatorValueEditor/index.mjs +3 -11
  170. package/dist/jsx/components/FilterOperatorValueEditor/index.mjs.map +1 -1
  171. package/dist/jsx/components/FilterOperatorValueEditor/index.native.js +3 -11
  172. package/dist/jsx/components/FilterOperatorValueEditor/index.native.js.map +1 -1
  173. package/dist/jsx/components/SimpleTable/index.mjs +3 -7
  174. package/dist/jsx/components/SimpleTable/index.mjs.map +1 -1
  175. package/dist/jsx/components/SimpleTable/index.native.js +2 -6
  176. package/dist/jsx/components/SimpleTable/index.native.js.map +1 -1
  177. package/dist/jsx/components/TableInput/RowDetailEditor.mjs +165 -0
  178. package/dist/jsx/components/TableInput/RowDetailEditor.mjs.map +1 -0
  179. package/dist/jsx/components/TableInput/RowDetailEditor.native.js +172 -0
  180. package/dist/jsx/components/TableInput/RowDetailEditor.native.js.map +1 -0
  181. package/dist/jsx/components/TableInput/index.mjs +42 -5
  182. package/dist/jsx/components/TableInput/index.mjs.map +1 -1
  183. package/dist/jsx/components/TableInput/index.native.js +64 -1
  184. package/dist/jsx/components/TableInput/index.native.js.map +1 -1
  185. package/dist/jsx/components/TableInput/shared.mjs +7 -1
  186. package/dist/jsx/components/TableInput/shared.mjs.map +1 -1
  187. package/dist/jsx/components/TableInput/shared.native.js +10 -0
  188. package/dist/jsx/components/TableInput/shared.native.js.map +1 -1
  189. package/dist/jsx/hooks/useDataTable.mjs +11 -1
  190. package/dist/jsx/hooks/useDataTable.mjs.map +1 -1
  191. package/dist/jsx/hooks/useDataTable.native.js +12 -2
  192. package/dist/jsx/hooks/useDataTable.native.js.map +1 -1
  193. package/dist/jsx/index.js.map +1 -1
  194. package/dist/jsx/index.mjs.map +1 -1
  195. package/dist/jsx/index.native.js.map +1 -1
  196. package/dist/jsx/utils/rowPress.mjs +4 -1
  197. package/dist/jsx/utils/rowPress.mjs.map +1 -1
  198. package/dist/jsx/utils/rowPress.native.js +4 -1
  199. package/dist/jsx/utils/rowPress.native.js.map +1 -1
  200. package/package.json +14 -14
  201. package/src/components/ChildTable/childTable.cellHidden.spec.tsx +57 -0
  202. package/src/components/ChildTable/childTable.rowDetail.spec.tsx +120 -0
  203. package/src/components/ChildTable/index.tsx +16 -0
  204. package/src/components/ColumnHeaderFilter/index.tsx +89 -116
  205. package/src/components/DataTable/DataTable.stories.tsx +71 -6
  206. package/src/components/DataTable/DataTableRoot.tsx +27 -4
  207. package/src/components/DataTable/dataTableMobileCards.spec.tsx +1 -4
  208. package/src/components/DataTable/headerContainment.spec.tsx +91 -0
  209. package/src/components/DataTable/rowPress.spec.tsx +2 -6
  210. package/src/components/DataTableBulkActions/DataTableBulkActions.stories.tsx +5 -4
  211. package/src/components/DataTableCell/CellModalEditor.tsx +95 -75
  212. package/src/components/DataTableCell/cellDraftPolicy.spec.tsx +12 -2
  213. package/src/components/DataTableCell/cellModalEditor.spec.tsx +75 -49
  214. package/src/components/DataTableCell/dataTableCell.spec.tsx +31 -14
  215. package/src/components/DataTableCell/index.tsx +3 -2
  216. package/src/components/DataTableDateFilter/DataTableDateFilter.spec.tsx +6 -3
  217. package/src/components/DataTableDateFilter/index.tsx +151 -180
  218. package/src/components/DataTableExport/index.tsx +135 -142
  219. package/src/components/DataTableGrouping/index.tsx +193 -195
  220. package/src/components/DataTableSearch/index.tsx +111 -109
  221. package/src/components/DataTableToolbar/index.tsx +39 -46
  222. package/src/components/DataTableViewOptions/DataTableViewOptions.stories.tsx +52 -0
  223. package/src/components/DataTableViewOptions/index.tsx +32 -40
  224. package/src/components/FilterOperatorValueEditor/FilterOperatorValueEditor.spec.tsx +64 -2
  225. package/src/components/FilterOperatorValueEditor/index.tsx +0 -8
  226. package/src/components/SimpleTable/index.tsx +3 -2
  227. package/src/components/SimpleTable/simpleTable.spec.tsx +15 -0
  228. package/src/components/Table/accessibility.spec.tsx +7 -19
  229. package/src/components/TableInput/RowDetailEditor.native.tsx +134 -0
  230. package/src/components/TableInput/RowDetailEditor.tsx +173 -0
  231. package/src/components/TableInput/index.native.tsx +49 -1
  232. package/src/components/TableInput/index.tsx +65 -10
  233. package/src/components/TableInput/shared.ts +29 -0
  234. package/src/components/tableDropdowns.spec.tsx +172 -0
  235. package/src/hooks/useDataTable.spec.ts +39 -0
  236. package/src/hooks/useDataTable.ts +15 -1
  237. package/src/index.ts +1 -0
  238. package/src/utils/rowPress.ts +3 -0
  239. package/types/components/ChildTable/index.d.ts +10 -0
  240. package/types/components/ChildTable/index.d.ts.map +1 -1
  241. package/types/components/ColumnHeaderFilter/index.d.ts +1 -1
  242. package/types/components/ColumnHeaderFilter/index.d.ts.map +1 -1
  243. package/types/components/DataTable/DataTableRoot.d.ts.map +1 -1
  244. package/types/components/DataTableCell/CellModalEditor.d.ts +10 -7
  245. package/types/components/DataTableCell/CellModalEditor.d.ts.map +1 -1
  246. package/types/components/DataTableCell/index.d.ts.map +1 -1
  247. package/types/components/DataTableDateFilter/index.d.ts.map +1 -1
  248. package/types/components/DataTableGrouping/index.d.ts.map +1 -1
  249. package/types/components/DataTableSearch/index.d.ts.map +1 -1
  250. package/types/components/FilterOperatorValueEditor/index.d.ts.map +1 -1
  251. package/types/components/SimpleTable/index.d.ts.map +1 -1
  252. package/types/components/TableInput/RowDetailEditor.d.ts +24 -0
  253. package/types/components/TableInput/RowDetailEditor.d.ts.map +1 -0
  254. package/types/components/TableInput/RowDetailEditor.native.d.ts +11 -0
  255. package/types/components/TableInput/RowDetailEditor.native.d.ts.map +1 -0
  256. package/types/components/TableInput/index.d.ts +11 -2
  257. package/types/components/TableInput/index.d.ts.map +1 -1
  258. package/types/components/TableInput/index.native.d.ts +8 -1
  259. package/types/components/TableInput/index.native.d.ts.map +1 -1
  260. package/types/components/TableInput/shared.d.ts +11 -0
  261. package/types/components/TableInput/shared.d.ts.map +1 -1
  262. package/types/hooks/useDataTable.d.ts.map +1 -1
  263. package/types/index.d.ts +1 -0
  264. package/types/index.d.ts.map +1 -1
  265. package/types/utils/rowPress.d.ts.map +1 -1
@@ -8,8 +8,8 @@ import {
8
8
  import { downloadBlob } from "@multiplatform.one/platform";
9
9
  import { formatCalendarDate, useResolvedKnobs } from "@multiplatform.one/theme";
10
10
  import { useState } from "react";
11
- import { Button, Checkbox, Input } from "@multiplatform.one/forms";
12
- import { Popover, ScrollView, Separator, Text, XStack, YStack, isWeb } from "tamagui";
11
+ import { Button, Checkbox, FloatingPanel, Input } from "@multiplatform.one/forms";
12
+ import { ScrollView, Separator, Text, XStack, YStack, isWeb } from "tamagui";
13
13
  import type { DataTableField } from "../../types";
14
14
  import { iconSizeForToken } from "../../utils/chromeIcons";
15
15
  import { getViewLeafRows } from "../../utils/viewData";
@@ -213,7 +213,7 @@ export function DataTableExport<T = any>(props: DataTableExportProps<T>) {
213
213
  </Button>
214
214
 
215
215
  {/* Advanced Export Options */}
216
- <ExportOptionsPopover
216
+ <ExportOptionsPanel
217
217
  exportFormats={exportFormats}
218
218
  exportOptions={exportOptions}
219
219
  onOptionsChange={setExportOptions}
@@ -252,9 +252,9 @@ function extractColumnsFromTable(table: any): ExportColumn[] {
252
252
  }
253
253
  }
254
254
 
255
- // Export Options Popover
255
+ // Export Options Panel
256
256
 
257
- interface ExportOptionsPopoverProps {
257
+ interface ExportOptionsPanelProps {
258
258
  exportFormats: ExportFormat[];
259
259
  exportOptions: Partial<ExportOptions>;
260
260
  onOptionsChange: (options: Partial<ExportOptions>) => void;
@@ -265,7 +265,7 @@ interface ExportOptionsPopoverProps {
265
265
  columns: ExportColumn[];
266
266
  }
267
267
 
268
- function ExportOptionsPopover({
268
+ function ExportOptionsPanel({
269
269
  exportFormats,
270
270
  exportOptions,
271
271
  onOptionsChange,
@@ -274,11 +274,12 @@ function ExportOptionsPopover({
274
274
  disabled,
275
275
  isExporting,
276
276
  columns,
277
- }: ExportOptionsPopoverProps) {
277
+ }: ExportOptionsPanelProps) {
278
278
  const { knobProps } = useResolvedKnobs();
279
279
  const iconPx = iconSizeForToken(String(knobProps.sizeToken));
280
280
  const sz = knobProps.sizeToken;
281
281
  const popoverMinWidth = sz === "$3" ? 240 : sz === "$5" ? 360 : 300;
282
+ const [open, setOpen] = useState(false);
282
283
  const [selectedColumns, setSelectedColumns] = useState<Set<string>>(
283
284
  new Set(columns.map((col) => col.accessorKey || col.id || "")),
284
285
  );
@@ -288,157 +289,149 @@ function ExportOptionsPopover({
288
289
  header: col.header || col.accessorKey || col.id || "",
289
290
  }));
290
291
 
291
- return (
292
- // LC-06/LC-10: collision handling — without stayInFrame/resize the tall
293
- // option list painted past the viewport and the Export Formats / Print
294
- // rows below the fold were unreachable (no scroll, no clamp).
295
- <Popover stayInFrame allowFlip resize>
296
- <Popover.Trigger asChild>
297
- <Button
298
- size={knobProps.sizeToken}
299
- chromeless
300
- icon={<GearIcon size={iconPx} />}
301
- disabled={disabled}
302
- aria-label="Export options"
303
- >
304
- Options
305
- </Button>
306
- </Popover.Trigger>
307
-
308
- <Popover.Content
309
- {...knobProps.elevatedSurface}
310
- transition={knobProps.transition}
311
- enterStyle={{ x: 0, y: -10, opacity: 0 }}
312
- exitStyle={{ x: 0, y: -10, opacity: 0 }}
313
- minWidth={popoverMinWidth}
314
- padding={0}
315
- overflow="hidden"
316
- >
317
- {/* The popper resize middleware caps the height to the viewport; the
318
- ScrollView keeps every section reachable (same pattern as
319
- DataTableDateFilter). */}
320
- <Popover.ScrollView minHeight={0}>
321
- <YStack {...knobProps.panelPadding} gap="$4">
322
- <Text {...knobProps.label} fontWeight="400">
323
- Export Options
324
- </Text>
325
-
326
- {/* Filename */}
327
- <YStack gap="$2">
328
- <Text {...knobProps.label} fontWeight="400">
329
- Filename
330
- </Text>
331
- <Input
332
- value={exportOptions.filename || ""}
333
- onChangeText={(text) =>
334
- onOptionsChange({
335
- ...exportOptions,
336
- filename: text,
337
- })
338
- }
339
- placeholder="Enter filename"
340
- />
341
- </YStack>
292
+ const trigger = (
293
+ <Button
294
+ size={knobProps.sizeToken}
295
+ chromeless
296
+ icon={<GearIcon size={iconPx} />}
297
+ disabled={disabled}
298
+ aria-label="Export options"
299
+ >
300
+ Options
301
+ </Button>
302
+ );
342
303
 
343
- {/* Include Headers */}
344
- <Checkbox
345
- label="Include headers"
346
- checked={exportOptions.includeHeaders ?? true}
347
- onCheckedChange={(checked) =>
348
- onOptionsChange({
349
- ...exportOptions,
350
- includeHeaders: checked as boolean,
351
- })
352
- }
353
- />
354
-
355
- {/* Column Selection */}
356
- <YStack gap="$2">
357
- <Text {...knobProps.label} fontWeight="400">
358
- Select Columns ({selectedColumns.size} of {availableColumns.length})
359
- </Text>
360
- <ScrollView maxHeight={200}>
361
- <YStack gap="$1">
362
- {availableColumns.map((col) => (
363
- <Checkbox
364
- key={col.key}
365
- label={col.header}
366
- checked={selectedColumns.has(col.key)}
367
- onCheckedChange={(checked) => {
368
- const newSelected = new Set(selectedColumns);
369
- if (checked) {
370
- newSelected.add(col.key);
371
- } else {
372
- newSelected.delete(col.key);
373
- }
374
- setSelectedColumns(newSelected);
375
- onOptionsChange({
376
- ...exportOptions,
377
- selectedColumns: Array.from(newSelected),
378
- });
379
- }}
380
- />
381
- ))}
382
- </YStack>
383
- </ScrollView>
384
- </YStack>
304
+ return (
305
+ // LC-06/LC-10: the option list is taller than most viewports. FloatingPanel
306
+ // clamps it inside the viewport and scrolls, so the Export Formats and
307
+ // Print rows below the fold stay reachable.
308
+ <FloatingPanel
309
+ open={open}
310
+ onOpenChange={setOpen}
311
+ trigger={trigger}
312
+ triggerSizing="content"
313
+ disabled={disabled}
314
+ scrollable
315
+ >
316
+ <YStack gap="$4" minWidth={popoverMinWidth} data-dismiss-class="compose">
317
+ <Text {...knobProps.label} fontWeight="400">
318
+ Export Options
319
+ </Text>
385
320
 
386
- <Separator />
387
-
388
- {/* Export Formats */}
389
- <YStack gap="$2">
390
- <Text {...knobProps.label} fontWeight="400">
391
- Export Formats
392
- </Text>
393
- {exportFormats.map((format) => (
394
- <Button
395
- key={format.id}
396
- size={knobProps.sizeToken}
397
- chromeless
398
- justifyContent="flex-start"
399
- disabled={disabled || isExporting === format.id || !format.enabled}
400
- onPress={() => onExport(format)}
401
- icon={format.icon}
402
- >
403
- <YStack gap="$1">
404
- <Text {...knobProps.label} fontWeight="400">
405
- {format.label}
406
- </Text>
407
- <Text fontSize="$2" color="$color10">
408
- {format.description}
409
- </Text>
410
- </YStack>
411
- {isExporting === format.id && (
412
- <Text fontSize="$2" color="$accentColor" marginInlineStart="auto">
413
- ...
414
- </Text>
415
- )}
416
- </Button>
321
+ {/* Filename */}
322
+ <YStack gap="$2">
323
+ <Text {...knobProps.label} fontWeight="400">
324
+ Filename
325
+ </Text>
326
+ <Input
327
+ value={exportOptions.filename || ""}
328
+ onChangeText={(text) =>
329
+ onOptionsChange({
330
+ ...exportOptions,
331
+ filename: text,
332
+ })
333
+ }
334
+ placeholder="Enter filename"
335
+ />
336
+ </YStack>
337
+
338
+ {/* Include Headers */}
339
+ <Checkbox
340
+ label="Include headers"
341
+ checked={exportOptions.includeHeaders ?? true}
342
+ onCheckedChange={(checked) =>
343
+ onOptionsChange({
344
+ ...exportOptions,
345
+ includeHeaders: checked as boolean,
346
+ })
347
+ }
348
+ />
349
+
350
+ {/* Column Selection */}
351
+ <YStack gap="$2">
352
+ <Text {...knobProps.label} fontWeight="400">
353
+ Select Columns ({selectedColumns.size} of {availableColumns.length})
354
+ </Text>
355
+ <ScrollView maxHeight={200}>
356
+ <YStack gap="$1">
357
+ {availableColumns.map((col) => (
358
+ <Checkbox
359
+ key={col.key}
360
+ label={col.header}
361
+ checked={selectedColumns.has(col.key)}
362
+ onCheckedChange={(checked) => {
363
+ const newSelected = new Set(selectedColumns);
364
+ if (checked) {
365
+ newSelected.add(col.key);
366
+ } else {
367
+ newSelected.delete(col.key);
368
+ }
369
+ setSelectedColumns(newSelected);
370
+ onOptionsChange({
371
+ ...exportOptions,
372
+ selectedColumns: Array.from(newSelected),
373
+ });
374
+ }}
375
+ />
417
376
  ))}
418
377
  </YStack>
378
+ </ScrollView>
379
+ </YStack>
419
380
 
420
- <Separator />
381
+ <Separator />
421
382
 
422
- {/* Print */}
383
+ {/* Export Formats */}
384
+ <YStack gap="$2">
385
+ <Text {...knobProps.label} fontWeight="400">
386
+ Export Formats
387
+ </Text>
388
+ {exportFormats.map((format) => (
423
389
  <Button
390
+ key={format.id}
424
391
  size={knobProps.sizeToken}
425
392
  chromeless
426
393
  justifyContent="flex-start"
427
- disabled={disabled || isExporting === "print"}
428
- onPress={onPrint}
429
- icon={<PrinterIcon size={iconPx} />}
394
+ disabled={disabled || isExporting === format.id || !format.enabled}
395
+ onPress={() => onExport(format)}
396
+ icon={format.icon}
430
397
  >
431
- Print Table
432
- {isExporting === "print" && (
398
+ <YStack gap="$1">
399
+ <Text {...knobProps.label} fontWeight="400">
400
+ {format.label}
401
+ </Text>
402
+ <Text fontSize="$2" color="$color10">
403
+ {format.description}
404
+ </Text>
405
+ </YStack>
406
+ {isExporting === format.id && (
433
407
  <Text fontSize="$2" color="$accentColor" marginInlineStart="auto">
434
408
  ...
435
409
  </Text>
436
410
  )}
437
411
  </Button>
438
- </YStack>
439
- </Popover.ScrollView>
440
- </Popover.Content>
441
- </Popover>
412
+ ))}
413
+ </YStack>
414
+
415
+ <Separator />
416
+
417
+ {/* Print */}
418
+ <Button
419
+ size={knobProps.sizeToken}
420
+ chromeless
421
+ justifyContent="flex-start"
422
+ disabled={disabled || isExporting === "print"}
423
+ onPress={onPrint}
424
+ icon={<PrinterIcon size={iconPx} />}
425
+ >
426
+ Print Table
427
+ {isExporting === "print" && (
428
+ <Text fontSize="$2" color="$accentColor" marginInlineStart="auto">
429
+ ...
430
+ </Text>
431
+ )}
432
+ </Button>
433
+ </YStack>
434
+ </FloatingPanel>
442
435
  );
443
436
  }
444
437